PDA

Voir la version complète : [WIP] xs Array



xs_yann
12/01/2008, 15h04
Bonjour,

Ce topic m'as donné une idée : http://www.frenchcinema4d.fr/forum/index.php?topic=21150.0

Je me suis rendu compte que l'array (répartition) n'était pas très pratique.
Pour faire une rotation de l'objet dans l'array, il est indispensable de modifié ses axes, il serait plus facile que l'array prenne en compte la rotation en mode "Objet".
Le but de ce wip serait donc d'ajouter cette fonction sous forme d'un plugin en C++.
Je vais donc commencer par essayer de re-programmer l'array de base de c4d puis d'ajouter ma fonction.
Je vais, pour l'instant, omettre les paramètres Amplitude, Frequency et Array Frequency, car je ne m'en suis jamais servi (et de toutes façon je ne sais pas comment les utiliser :roll:)

Le début :

Voilà l'objet, avec les paramètres qui vont bien :
http://ykoeth.free.fr/fc4d/xsArray/2.jpg

(l'icone n'est pas bon, c'est celui de mon dernier plug, je verrais ça à la fin...)

L'objet édité :
http://ykoeth.free.fr/fc4d/xsArray/1.jpg

Le code :


// xsArray.cpp

#include "c4d.h"
#include "c4d_symbols.h"
#include "oxsarray.h"

class xsArray : public ObjectData
{
public:
virtual Bool Init (GeListNode *node);

virtual BaseObject* GetVirtualObjects(BaseObject* op, HierarchyHelp* hh);
virtual Bool Message(GeListNode *node, LONG type, void *t_data);

static NodeData *Alloc(void) { return gNew xsArray; }
};

Bool xsArray::Message(GeListNode *node, LONG type, void *t_data) // On ne devrait pas en avoir besoin
{
return TRUE;
}

Bool xsArray::Init(GeListNode *node) // Les valeures par défaut des paramètres
{
return TRUE;
}


BaseObject* xsArray::GetVirtualObjects(PluginObject* op, HierarchyHelp* hh) // C'est le gros du plug, c'est là qu'on va afficher les copies
{
BaseObject *ret = BaseObject::Alloc(Onull);

return ret;
}

// be sure to use a unique ID obtained from www.plugincafe.com
#define ID_XSARRAY 1022108

Bool RegisterxsArray(void)
{
// decide by name if the plugin shall be registered - just for user convenience
String name=GeLoadString(IDS_XSARRAY); if (!name.Content()) return TRUE;
return RegisterObjectPlugin(ID_XSARRAY,name,OBJECT_GENERA TOR,xsArray::Alloc,"Oxsarray","xsarray.tif",0);
}


Peut-être qu'il y a une raison pour que l'array fonctionne qu'en mode axe, peut-être que ce que je vais faire n'est pas très utile, mais au moins c'est un bon exercice. :roll:

La suite bientôt :odile:

nikolas
12/01/2008, 15h15
j'applaudis des deux main et te félicite de cette initiative. L'array C4d est pas très pratique et la contrainte d'orientation est pénible.

On peut passer commande plugin ? :mrgreen:

refreshers
12/01/2008, 15h31
Y en a qui re-programme C4D...D'autres comme moi qui essaye de texturer des objets... :cry2:
:prie: :prie: :prie: excess_yann

xs_yann
12/01/2008, 16h16
Merci nikolas



On peut passer commande plugin ? :mrgreen:


Si tu veux mais pour l'instant mes plugins ne fonctionnent que sur mac, qu'un seul à la fois (sinon il y a des collisions d'ID :?) :roll:



Y en a qui re-programme C4D...D'autres comme moi qui essaye de texturer des objets...

Oui, enfin on a pas tous ce niveau là... :

http://img99.imageshack.us/img99/7207/prev3wd2.jpg
http://img152.imageshack.us/img152/9471/prev1mn7.jpg

Merci à vous de suivre :P

La suite (petite avancée) :

Avec un cube enfant :
http://ykoeth.free.fr/fc4d/xsArray/4.jpg

Une fois édité :
http://ykoeth.free.fr/fc4d/xsArray/3.jpg

Le code :


#include "c4d.h"
#include "c4d_symbols.h"
#include "oxsarray.h"

class xsArray : public ObjectData
{
public:
virtual Bool Init (GeListNode *node);

virtual BaseObject* GetVirtualObjects(BaseObject* op, HierarchyHelp* hh);
virtual Bool Message(GeListNode *node, LONG type, void *t_data);

static NodeData *Alloc(void) { return gNew xsArray; }
};

Bool xsArray::Message(GeListNode *node, LONG type, void *t_data)
{
return TRUE;
}

Bool xsArray::Init(GeListNode *node)
{

BaseObject *op = (BaseObject*)node;
BaseContainer *data = op->GetDataInstance();
data->SetReal(XSARRAY_RADIUS,250); // Valeur par défaut du rayon = 250
data->SetReal(XSARRAY_COPIES,7); // Valeur par défaut du nombre de copies = 7
data->SetLong(XSARRAY_MODE,0);


return TRUE;
}

BaseObject* xsArray::GetVirtualObjects(PluginObject* op, HierarchyHelp* hh)
{
BaseObject *ret = BaseObject::Alloc(Onull);

BaseContainer *data = op->GetDataInstance();

Real copies = data->GetReal(XSARRAY_COPIES);
if(copies<2) return FALSE;

LONG i;
for(i=0;i<copies;i++) {
if(!op->GetDown()) return FALSE;
BaseObject *child = op->GetDown();

BaseObject *clone = static_cast<BaseObject*>(child->GetClone(NULL,NULL)); // Les objets sont des clones de l'objet enfant
clone->InsertUnder(ret);

}

return ret;
}

// be sure to use a unique ID obtained from www.plugincafe.com
#define ID_XSARRAY 1022108

Bool RegisterxsArray(void)
{
// decide by name if the plugin shall be registered - just for user convenience
String name=GeLoadString(IDS_XSARRAY); if (!name.Content()) return TRUE;
return RegisterObjectPlugin(ID_XSARRAY,name,OBJECT_GENERA TOR,xsArray::Alloc,"Oxsarray","xsarray.tif",0);
}


Ici les cubes clonés sont affichés mais il sont superposés avec le cube enfant donc invisibles.

Prochaine étape : positionner les objets sous forme d'hexagone, d'octogone, etc (suivant le nombre de copies)
Il va y avoir un peu de maths (j'ai déjà un bout du code vu que j'ai re-programmé en partie la primitive N-side).
:odile:

nikolas
12/01/2008, 16h18
tiens c'est une idée ça. La possibilité de cloner l'outil cloner de mograph :bave:
toutes formes possible et orientation à dispo?

ethylen
12/01/2008, 16h49
cloner l'outil cloner de Mograph ? je crois que c'est déjà possible, tu clique glisse ton "cloner" dans un autre "cloner"...
j'ai peux être pas tout compris.. en tout cas bonne initiative xs-yann :poucehaut:

nikolas
12/01/2008, 19h06
cloner l'outil cloner de Mograph ? je crois que c'est déjà possible, tu clique glisse ton "cloner" dans un autre "cloner"...
j'ai peux être pas tout compris.. en tout cas bonne initiative xs-yann :poucehaut:


ou je me suis mal exprimé aussi. Je voulais dire faire du XS-Array un truc similaire au cloner de Mograph. Je suis clair là? je suis pas sur... :mrgreen:

Jean-Laurent
13/01/2008, 10h53
Très belle initiative. :poucehaut:



Si tu veux mais pour l'instant mes plugins ne fonctionnent que sur mac, qu'un seul à la fois (sinon il y a des collisions d'ID :?) :roll:


Je ne comprends pas bien. Tu as mis des ID identiques sur tous tes plug IN en attendant d'en demander une définitive à plugincafe ?
Ou il y a un autre problème ?




Prochaine étape : positionner les objets sous forme d'hexagone, d'octogone, etc (suivant le nombre de copies)
Il va y avoir un peu de maths (j'ai déjà un bout du code vu que j'ai re-programmé en partie la primitive N-side).
:odile:



Après avoir codé tout ça je ne pense pas que la division de 360° et l'utilisation de sin et cos te pose un problème. :wink:

Pourrais-tu également nous préciser les avantages à coder en C++.
On accède à quelles fonctions en plus par rapport au coffee de base ?

xs_yann
13/01/2008, 12h01
Si tu veux mais pour l'instant mes plugins ne fonctionnent que sur mac, qu'un seul à la fois (sinon il y a des collisions d'ID :?) :roll:

Je ne comprends pas bien. Tu as mis des ID identiques sur tous tes plug IN en attendant d'en demander une définitive à plugincafe ?
Ou il y a un autre problème ?


Non non, mes ID sont différents mais il y a collision quand même :coup:

Pour les avantages à codé en C++, il y en a plusieurs.
Le premier c'est qu'en coffee tu ne peux pas faire des plugins objet comme celui-là, pour un tag tu ne peux pas toucher au gestionnaire d'attributs...
Les outils de C4d ont été programmés en C++, le SDK est beaucoup plus riche.

Le C++ est plus intéressant que le coffee : tu dois typer tes variables, il y a des pointeurs, des références, tu peux surcharger tes fonctions...

Bon maintenant avec le C++ tu dois compiler à chaque fois et tu dois avoir plusieurs versions pour mac et pc (après ça dépend si tu développe pour toi ou pour distribuer).

lenogre
13/01/2008, 12h18
Le plug gratuit Duplicate de l'excellent Michael Welter (http://www.welter-4d.de/fplugs/freeplugins_en.html) fait déjà ça :
Duplication par rapport à un axe ou duplication linéaire.

J'ai l'impression que tu vas perdre ton temps là-dessus. Pa contre, si tu pouvais refaire Align Assistant, nous serions plusieurs à te vouer une reconnaissance éternelle !

xs_yann
13/01/2008, 12h38
Peut-être que ce que je vais faire n'est pas très utile, mais au moins c'est un bon exercice. :roll:


En plus le plug ne fonctionne plus en R10.

Je n'ai jamais utilisé Align Assistant mais je vais regarder. :wink:

edit : miam, align assistant à l'air cool. :P

xs_yann
13/01/2008, 12h50
Voilà la suite :
http://ykoeth.free.fr/fc4d/xsArray/5.jpg

Le code :


#include "c4d.h"
#include "c4d_symbols.h"
#include "oxsarray.h"

class xsArray : public ObjectData
{
public:
virtual Bool Init (GeListNode *node);

virtual BaseObject* GetVirtualObjects(BaseObject* op, HierarchyHelp* hh);
virtual Bool Message(GeListNode *node, LONG type, void *t_data);

static NodeData *Alloc(void) { return gNew xsArray; }
};

Bool xsArray::Message(GeListNode *node, LONG type, void *t_data)
{
return TRUE;
}

Bool xsArray::Init(GeListNode *node)
{

BaseObject *op = (BaseObject*)node;
BaseContainer *data = op->GetDataInstance();
data->SetReal(XSARRAY_RADIUS,250);
data->SetReal(XSARRAY_COPIES,7);
data->SetLong(XSARRAY_MODE,0);


return TRUE;
}

Vector* GetNSidePointCoord(int radius, int subdiv)
{
#define RAD pi/180

Vector *coord = NULL;
coord = new Vector[subdiv];
float angle = ((subdiv-2)*180.0)/subdiv; // S=(n-2)*180

coord[0] = Vector(radius,0,0); // Coordonnées du premier point
coord[1] = Vector(-cos(RAD*angle)*radius,0,sin(RAD*angle)*radius); // Coordonnées du deuxième point
float a1 = Deg(acos((-cos(RAD*angle)*radius)/radius));
float a2 = -(90-a1); // Angles utiles pour la suite
LONG i;
float a = a2;

for(i=2; i<subdiv;i++) {
a = (180-angle)+a;
coord[i] = Vector(-sin(RAD*a)*radius,0,cos(RAD*a)*radius); // Boucle for avec la formule pour tous les autres angles
}

return coord;
}


BaseObject* xsArray::GetVirtualObjects(PluginObject* op, HierarchyHelp* hh)
{
BaseObject *ret = BaseObject::Alloc(Onull);

BaseContainer *data = op->GetDataInstance();

Real copies = data->GetReal(XSARRAY_COPIES)+1;
Real radius = data->GetReal(XSARRAY_RADIUS);
if(copies<2)return FALSE;

Vector* coord = GetNSidePointCoord(radius,copies); // Appel de la fonction

LONG i;
for(i=0;i<copies;i++) {
if(!op->GetDown()) return FALSE;
BaseObject *child = op->GetDown();

BaseObject *clone = static_cast<BaseObject*>(child->GetClone(NULL,NULL));
clone->SetPos(coord[i]);
clone->InsertUnder(ret);

}

return ret;
}

// be sure to use a unique ID obtained from www.plugincafe.com
#define ID_XSARRAY 1022108

Bool RegisterxsArray(void)
{
// decide by name if the plugin shall be registered - just for user convenience
String name=GeLoadString(IDS_XSARRAY); if (!name.Content()) return TRUE;
return RegisterObjectPlugin(ID_XSARRAY,name,OBJECT_GENERA TOR,xsArray::Alloc,"Oxsarray","xsarray.tif",0);
}


Ici j'utilise la fonction Vector* GetNSidePointCoord(int radius, int subdiv) qui va me renvoyer un tableau de vecteur avec toutes les positions des points.

La suite c'est la rotation des objets. :odile:

Jean-Laurent
13/01/2008, 13h49
Merci beaucoup pour ta réponse xs_yann.



Non non, mes ID sont différents mais il y a collision quand même :coup:


C'est bien ce que je craignais.

[/quote]




Le C++ est plus intéressant que le coffee : tu dois typer tes variables, il y a des pointeurs, des références, tu peux surcharger tes fonctions...



:bave: Tu me donnes envie de m'y remettre.

Une autre petite question au passage. Sais-tu si il est possible de compiler avec devC++ ou microsoft est incontournable ?

Tant que tu y es comme tu as l'air bien parti tu nous fais le clone objet de Mograph demandé par nikolas dans la foulée.
Apparemment le plug de Lenogre en est une variante simplifiée.

xs_yann
13/01/2008, 14h07
Une autre petite question au passage. Sais-tu si il est possible de compiler avec devC++ ou microsoft est incontournable ?


Moi je compile avec Xcode. Tu peux compiler avec devC++, CodeBlocks, Xcode, le terminal...

Pour le cloner MoGraph je ne pense pas mais je vais voir pour le plug de Lenogre, je le ferais sûrement après ça.

xs_yann
13/01/2008, 15h10
C'est ça que tu veux lenogre ?

http://ykoeth.free.fr/fc4d/xsArray/AlignAssistant.jpg

En revanche en cochant "scale" c'est la scale qui est prise en compte (logique), ce ne serait pas mieux que ce soit la "Size"?

xs_yann
13/01/2008, 15h44
La suite :

http://ykoeth.free.fr/fc4d/xsArray/6.jpg

http://ykoeth.free.fr/fc4d/xsArray/7.jpg



#include "c4d.h"
#include "c4d_symbols.h"
#include "oxsarray.h"

class xsArray : public ObjectData
{
public:
virtual Bool Init (GeListNode *node);

virtual BaseObject* GetVirtualObjects(BaseObject* op, HierarchyHelp* hh);
virtual Bool Message(GeListNode *node, LONG type, void *t_data);

static NodeData *Alloc(void) { return gNew xsArray; }
};

Bool xsArray::Message(GeListNode *node, LONG type, void *t_data)
{
return TRUE;
}

Bool xsArray::Init(GeListNode *node)
{

BaseObject *op = (BaseObject*)node;
BaseContainer *data = op->GetDataInstance();
data->SetReal(XSARRAY_RADIUS,250);
data->SetReal(XSARRAY_COPIES,7);
data->SetLong(XSARRAY_MODE,0);


return TRUE;
}

Vector* GetNSidePointCoord(int radius, int subdiv)
{
#define RAD pi/180

Vector *coord = NULL;
coord = new Vector[subdiv];
float angle = ((subdiv-2)*180.0)/subdiv; // S=(n-2)*180

coord[0] = Vector(radius,0,0);
coord[1] = Vector(-cos(RAD*angle)*radius,0,sin(RAD*angle)*radius);
float a1 = Deg(acos((-cos(RAD*angle)*radius)/radius));
float a2 = -(90-a1);
LONG i;
float a = a2;

for(i=2; i<subdiv;i++) {
a = (180-angle)+a;
coord[i] = Vector(-sin(RAD*a)*radius,0,cos(RAD*a)*radius);
}

return coord;
}


BaseObject* xsArray::GetVirtualObjects(PluginObject* op, HierarchyHelp* hh)
{
BaseObject *ret = BaseObject::Alloc(Onull);

BaseContainer *data = op->GetDataInstance();

int mode = data->GetLong(XSARRAY_MODE);
Real copies = data->GetReal(XSARRAY_COPIES)+1;
Real radius = data->GetReal(XSARRAY_RADIUS);
if(copies<2)return FALSE;

Vector* coord = GetNSidePointCoord(radius,copies);

LONG i;
for(i=0;i<copies;i++) {
if(!op->GetDown()) return FALSE;
BaseObject *child = op->GetDown();

BaseObject *clone = static_cast<BaseObject*>(child->GetClone(NULL,NULL));

clone->SetPos(coord[i]);

// Ici la rotation suivant le Mode Objet ou Axe
if(mode==0) {
if(coord[i].z>=0)clone->SetRot(Vector(-atan(coord[i].x/coord[i].z)+child->GetRot().x,child->GetRot().y,+child->GetRot().z));
if(coord[i].z<0)clone->SetRot(Vector(-atan(coord[i].x/coord[i].z)-pi+child->GetRot().x,child->GetRot().y,+child->GetRot().z));
} else {
if(coord[i].z>=0)clone->SetRot(Vector(-atan(coord[i].x/coord[i].z),0,0));
if(coord[i].z<0)clone->SetRot(Vector(-atan(coord[i].x/coord[i].z)-pi,0,0));
}


clone->InsertUnder(ret);

}

// Pour rendre l'objet enfant invisible
op->NewDependenceList();
op->AddDependence(hh, op->GetDown());
op->TouchDependenceList();


return ret;
}

// be sure to use a unique ID obtained from www.plugincafe.com
#define ID_XSARRAY 1022108

Bool RegisterxsArray(void)
{
// decide by name if the plugin shall be registered - just for user convenience
String name=GeLoadString(IDS_XSARRAY); if (!name.Content()) return TRUE;
return RegisterObjectPlugin(ID_XSARRAY,name,OBJECT_GENERA TOR,xsArray::Alloc,"Oxsarray","xsarray.tif",0);
}

Jean-Laurent
13/01/2008, 17h09
C'est ça que tu veux lenogre ?


En tout cas ça y ressemble beaucoup. :efface:

Tu fais un mix de ton xsArray avec le deuxième et tu as presque le cloneur de Mograph. :wink:
Avec possibilité de cloner en ligne, en cercle etc ...
En changeant la taille, la rotation des objets etc ...

C'est facile, y'a plus qu'à. :mrgreen:

xs_yann
13/01/2008, 17h15
Cool, j'ai de quoi m'occuper... :art:
Il faudrait quand même que je résolve ce problème d'ID que je puisse mettre à dispo des fichiers. :roll:

nikolas
13/01/2008, 19h10
ça prend forme :poucehaut:

lenogre
13/01/2008, 19h59
Bravo ! Tu nous enterreras tous !

edj kodiak
13/01/2008, 20h03
Bravo ! Tu nous enterreras tous !


il est plus jeune ça lui laisse une chance de plus :mrgreen:


:arrow:

shtl
13/01/2008, 20h14
Oui, ça s'annonce énnorme, merci XS_Yann. :bounce:


Euh Lenogre, pourquoi refaire Align_Assistant, il marche très bien....?!?

lenogre
13/01/2008, 23h02
Align assistant ne marche plus en v10. En 9.6UB aussi si mes souvenirs sont exacts. Mais si tu en as un qui marche, tu peux me l'envoyer ?

xs_yann
15/01/2008, 15h33
Voilà où j'en suis avec le cloner MoGraph :
http://ykoeth.free.fr/fc4d/xsArray/8.jpg

SHTL : ta version de Align Assistant se présente comment?
Tag?
Paramètres dans le gestionnaire d'attribut?
Paramètres dans une fenêtre modale? non modale?
.cob? .dylib, .cdl, .xdl....?

lenogre
15/01/2008, 16h11
version 9.6 PPC

[Fichier joint supprimé par l'administrateur]

xs_yann
15/01/2008, 16h16
Oui celui-ci c'est le même que le mien (celui dont je me suis servi de base pour re-programmer), mais il ne fonctionne plus en R10, non?

nikolas
15/01/2008, 16h25
lenogre a décidé de saper le moral. :mrgreen:
laisse dond xs yann bosser si tu ne trouves pas le thread intéressant ;)

lenogre
15/01/2008, 17h10
Je sape le moral de personne !
AlignAssistant ne marche plus en v10, ni en 9.6UB.
Au contraire, je suis ça de très près car n'ayant pas Mograph, tous les plugs de duplication sont les bienvenus !

nikolas
15/01/2008, 17h28
Je sape le moral de personne !
AlignAssistant ne marche plus en v10, ni en 9.6UB.
Au contraire, je suis ça de très près car n'ayant pas Mograph, tous les plugs de duplication sont les bienvenus !


au temps pour moi. j'avais mal compris. je croyais que tu officiais pour maintenir ta position de leader aux fc4d d'or. :mrgreen:

Jean-Laurent
15/01/2008, 18h30
Voilà où j'en suis avec le cloner MoGraph :


Excellent! Si tu continues à cette vitesse tu vas nous le finir avant la fin de semaine. :wink:

xs_yann
15/01/2008, 18h36
Voilà où j'en suis avec le cloner MoGraph :


Excellent! Si tu continues à cette vitesse tu vas nous le finir avant la fin de semaine. :wink:



Euh... il y a quand même 23 pages dessus dans le Manuel, je n'aurais pas le courage ni les capacités de le finir de mon vivant. :mrgreen:

xs_yann
15/01/2008, 19h27
On peut changer de mode :

http://ykoeth.free.fr/fc4d/xsArray/9.jpg

http://ykoeth.free.fr/fc4d/xsArray/10.jpg

On masque/affiche les paramètres grâce à GetDDescription(GeListNode *node, Description *description,LONG &flags)

Je ne programme pas tous dans l'ordre, je fais ce qui me semble plus facile d'abord. :art:

Jean-Laurent
15/01/2008, 20h22
C'est beau. :bave:

N'hésite pas à détailler le code comme tu le fais. Comme ressource pour se plonger dans le SDK C++ ça sera super.



Euh... il y a quand même 23 pages dessus dans le Manuel, je n'aurais pas le courage ni les capacités de le finir de mon vivant. :mrgreen:


Avec une page par jour, ça ne fait même pas un mois. :mrgreen:

xs_yann
15/01/2008, 21h09
Ca c'est fait :
http://ykoeth.free.fr/fc4d/xsArray/11.jpg

Bon là le code c'est à peu près le même que celui du tout début.
J'en ai juste rajouté un peu pour le plan.
La fonction pour les coordonnées :


Vector* GetNSidePointCoord(int radius, int subdiv, int plane)
{
#define RAD pi/180

Vector *coord = NULL;
coord = new Vector[subdiv];
float angle = ((subdiv-2)*180.0)/subdiv; // S=(n-2)*180

if(plane == 0) { // XY
coord[0] = Vector(0,radius,0);
coord[1] = Vector(sin(RAD*angle)*radius,-cos(RAD*angle)*radius,0);
}
if(plane == 1) { // ZY
coord[0] = Vector(0,radius,0);
coord[1] = Vector(0,-cos(RAD*angle)*radius,sin(RAD*angle)*radius);
}
if(plane == 2) { // XZ
coord[0] = Vector(0,0,radius);
coord[1] = Vector(sin(RAD*angle)*radius,0,-cos(RAD*angle)*radius);
}

float a1 = Deg(acos((-cos(RAD*angle)*radius)/radius));
float a2 = -(90-a1);
LONG i;
float a = a2;

for(i=2; i<subdiv;i++) {
a = (180-angle)+a;
if(plane == 0) coord[i] = Vector(cos(RAD*a)*radius,-sin(RAD*a)*radius,0); // XY
if(plane == 1) coord[i] = Vector(0,-sin(RAD*a)*radius,cos(RAD*a)*radius); // ZY
if(plane == 2) coord[i] = Vector(cos(RAD*a)*radius,0,-sin(RAD*a)*radius); // XZ
}

return coord;
}



Utilisation de la fonction + rotation :


for(i=0;i<rcount;i++) {
if(!op->GetDown()) return FALSE;
BaseObject *child = op->GetDown();

BaseObject *clone = static_cast<BaseObject*>(child->GetClone(NULL,NULL));

clone->SetPos(rcoord[i]);

if(ralign==1) {
if(rplane==0) { // XY
if(rcoord[i].z>=0)clone->SetRot(Vector(0,0,atan(rcoord[i].x/rcoord[i].y)));
if(rcoord[i].z<0)clone->SetRot(Vector(0,0,atan(rcoord[i].x/rcoord[i].y)-pi));
}
if(rplane==1) { // ZY
if(rcoord[i].z>=0)clone->SetRot(Vector(0,-atan(rcoord[i].z/rcoord[i].y),0));
if(rcoord[i].z<0)clone->SetRot(Vector(0,-atan(rcoord[i].z/rcoord[i].y)-pi,0));
}
if(rplane==2) { // XZ
if(rcoord[i].z>=0)clone->SetRot(Vector(-atan(rcoord[i].x/rcoord[i].z),0,0));
if(rcoord[i].z<0)clone->SetRot(Vector(-atan(rcoord[i].x/rcoord[i].z)-pi,0,0));
}
}
clone->InsertUnder(ret);
}




A mon avis ça va être un bon exercice d'organisation car le code risque d'être très chargé. Pour l'instant 353 lignes mais cela ne cesse d'augmenter.

Il faudrait que je rajoute la checkbox "Fix clones" pour rester dans l'esprit de départ. :roll:

shtl
16/01/2008, 10h57
Je sape le moral de personne !
AlignAssistant ne marche plus en v10, ni en 9.6UB.



T'as pas reçu mon mail ?

lenogre
16/01/2008, 15h16
Tu m'as envoyé un mail sur lenogre(at)yahoo.fr ? Rien reçu !

Jean-Laurent
16/01/2008, 20h03
Tu peux compiler avec devC++, CodeBlocks, Xcode, le terminal...


J'ai essayé avec devC++ et CodeBlocks mais rien à faire. :coup:
Le SDK est visiblement fait exclusivement pour Visual C++ de microsoft. :poucebas:

xs_yann
17/01/2008, 17h02
Regardeça : http://www.siteduzero.com/tuto-3-156-1-ayez-les-bons-outils.html#ss_part_1
et eventuellement ça : http://www.siteduzero.com/tuto-3-12879-1-premier-programme-c-avec-cout-et-cin.html#ss_part_1

Jean-Laurent
17/01/2008, 22h01
Merci beaucoup pour les liens xs-yann. :poucehaut:
J'avais l'habitude de coder avec dev C++ qui a l'avantage d'être gratuit. Alors que Visual C++ de microsoft coute quand même 800 euros. Même si c'est de loin le meilleur et le plus utilisé.
Sous mac tout est plus simple.

Mais j'avais oublié que j'avais téléchargé la version express du temps où elle était gratuite.
Du coup j'ai réussi à compiler avec le SDK de C4D 9.6 mais pas celui de la R 10.5. Curieux.
Je retenterai plus tard.

Bref, j'ai tout ce qu'il me faut pour décortiquer les exemples. Dont le tien.
Je ne pollue pas plus ton thread et j'attends juste la suite. :bave:

tarlack
17/01/2008, 22h04
visual C++ n'est pas le meilleur IDE pour C++ qui existe. Il est bien, mais y a mieux. Et globalement, de toute maniere, ca depend des gouts. et le compilo C++ de microsoft est pas le meilleur qui existe, je me souviens de certains trucs de la norme C++ qu'il ne gerait pas quand je l'utilisais (d'ailleurs pour ca que je suis passé à un autre logiciel après, et que je suis passé à mingw pour le compilo)....
sous linux, c'est plus simple, tout est intégré, le compilo est fourni avec le systeme. hein maxon, c'est vachement plus simple sous linux ! hein quoi, c'est pas discret ma demande d'une version linux ? :mrgreen:

moebius
18/01/2008, 15h32
sous linux, c'est plus simple, tout est intégré, le compilo est fourni avec le systeme. hein maxon, c'est vachement plus simple sous linux !


+12.101232 :mrgreen:
une version linux ... j'en rêverais la nuit tiens... :cry2:

Steph3D ::.
09/03/2008, 09h43
Juste comme ça, si vous voulez faire des plugs, toute la suite de dev de MS, et notamment Visual C++ 2008 est bel et bien gratuit, on peu le télécharger la :o http://www.clubic.com/telecharger-fiche210336-visual-c-express-edition.html Plus on est de fou... :mrgreen:

Mais perso, si j'ai jamais tenté de faire un plug-in C++sur C4D, c'est surtout par se que je n'ai jamais réussi à compiler le SDK. Pourtant, j'ai fait mumuse avec des SDK de moteurs 3D comme Irrlicht ou Dark GDK, et je n'ai eu aucun problème à compiler mes essais, mais C4D, rien à faire :(

Quand je lance le fichier C++ du dossier SDK, à la compilation il ne trouve pas C4D.h, j'ai même essayer de l'ajouter à la main, mais rien.

Quand j'essaye les fichiers de projet C++ du dossier _API, j'ai d'autres problèmes assez similaires.

Par la force des choses, auprès de nombreux tests et une bonne apres midi de perdus, j'en suis venu à déclarer à VC++ à la main pour les includes tout les dossiers contenus dans _API, soit 6 liens. Puis comme j'avais encor de problèmes, j'ai aussi déclaré WIN32 ;__PC;_DEBUG;_WINDOWS au préprocesseur. Tout ça doit certainement être un vrai travail de cochon, mais bon, maintenant ça semble à 1re vue compiler, mais la compilation en reste au format obj brut et ne me sort pas un beau *. cdl pour mettre dans le dossier plug-in :cry:

Dommage qu'il n'y et pas de modèles de projets VC++ 9 pour C4D :? certains SDK sont aussi simple à mettre en place que de cliquer sur installe. Mais avec C4D sur VC++, je désespère vraiment d'y arriver un jour :coup: :arg: :cry2: :cry2:... :cry:

Jean-Laurent
09/03/2008, 10h14
Salut Steph3D. :odile:

Avec yann on a eu exactement le même problème que toi pour compiler le SDK avec Visual C++. :lol:

Visual C++ n'est pas tout à fait gratuit. :wink:
C'est la version express. Qui certes est très bien mais reste limitée.
Ce qui est regrettable c'est qu'on ne puisse pas compiler le SDK avec un logiciel gratuit. Genre CodeBlocks ou dezvC++. :?

J'ai essayé comme toi d'arranger à la main mais c'est impossible.


Par contre pour compiler sous PC avec Visual C++ on a trouvé la solution.

Il ne suffit pas de télécharger Visual C++, il faut également télécharger le "plattftorm SDK" un truc comme ça.
Et ensuite ça compile. :odile:

xs_yann
09/03/2008, 12h35
Visual express est largement suffisant pour coder des plugs pour C4D. En tant qu'étudiant, je crois que je pourrais disposer de la version complète mais, personnellement je préfère programmer avec Xcode.

Pour compiler le SDK, comme l'as dit Jean-Laurent, il ne faut pas oublier de télécharger le "platform SDK". Ensuite dans C4D > resource > _api_lib il faut compiler les ".a" (lib_api_debug.a et lib_api_release.a), grâce au projet" _api.vcproj". Et enfin, quand tu veux compiler un projet, il faut que un des deux ".a" soit inclus dedans. :wink:

Bon courage :art:

Floby
09/03/2008, 13h38
Ah cool, j'ai Visual Studio en tant qu'etudiant :D je vais peut-être faire mumuse un de ces jours (quand j'aurais une idée :roll: )

Sinon les trucs nécéssaires pour developper un plugin, ce serait cool que quelqu'un qui s'y connait (je vise personne Yann) puisse mettre ça dans le Wiki (http://wiki.frenchcinema4d.fr) de la french ?

Steph3D ::.
13/03/2008, 16h56
Je pouvais chercher, pas si simple à compiler ce SDK alors. Merci pour l'info :poucehaut: je retenterais le coup dès que j'ai le temps, suis à cheval sur plusieurs domaines et logiciels, alors j'ai un peu de mal à tous suivre, y compris tous les forums :arg: :mrgreen:

Steph3D ::.
27/05/2008, 18h45
Hello :odile:

Heu... cela ne marche toujours pas pour moi se foutu SDK pour C4D :oops: bon ok, cela ne fait que deux ans que j'essaye, dans 10ans j'y arriverais peut etre :mrgreen:
Mais c'est le seul SDK que j'ai pas réussi à exploiter sur ma version gratuite de Visual C++ 2008 express, ceux des moteurs 3D sont pourtant très simples à installer.

Et c'est bien la 1re fois que j'arrive vraiment pas à résoudre un truc en infos, et je suis pas le seul, puisque j'ai demandais à d'autres personnes (car suis noob en c++ :oops:) et ils ont tous eu le même problème, alors je sèche :|

Que cela soit avec VC++ express ou l'originale en version complète, sur XP32 ou Vista 32 et 64, toujours pareil.


En gros on fait ça

1- On installe les différents SDK de Microsoft avec VC++ 2008 express ( le VC gratuit ), et on lance le projet _api.vcproj du dossier C4D>resource>_api_lib

http://www.zbrush.fr/SMF/data/sdk/1.jpg

2- VC++ dit qu'il faut mettre à jour les fichiers, bon ok

http://www.zbrush.fr/SMF/data/sdk/2.jpg

3- Nous voilà dans VC++ avec le SDK ouvert dans VC++, jusque-là ça semble ok

http://www.zbrush.fr/SMF/data/sdk/4.jpg

4- On lance la compile (flèche verte)
Et la, il sort que le bidule est obsolète, mais bon, même pas peur on continue... 8)

http://www.zbrush.fr/SMF/data/sdk/5.jpg

5- ça compile jusqu'au bout. Pas d'erreur signalée, à part le warning de variables d'environnement.

http://www.zbrush.fr/SMF/data/sdk/6.jpg

6- Visiblement cela à compilé, mais si on va voir les fichiers créés, on n'y trouve que des obj bruts, rien d'exploitable pour la suite, pas de fichiers lib_api_debug.a et lib_api_release.a dans le dossier comme disait Yann.

http://www.zbrush.fr/SMF/data/sdk/7.jpg

Par contre, en cherchant un peu la, j'ai trouvé _api_Win32_Debug.lib & _api_Win32_Release.lib dans le dossier. Le nom des Lib sont peu être différente pour les *. a de la version Mac ?

Mais bon, après si je compile les exemples, c'est toujours la cata :oops:

http://www.zbrush.fr/SMF/data/sdk/test01.jpg

:cry2:

xs_yann
27/05/2008, 19h31
C'est vrai que VC++ n'est pas aussi pratique qu'Xcode...

Je crois que les .lib sont bons, c'est ce que je doit avoir sur PC. Donc le dernier problème reste la compilation finale. Je crois que la solution que j'ai adoptée, c'est d'inclure le .lib (debug ou release comme tu veux) à la solution. Si ça ne marche pas cherche du côté des préférence au nom de "Headers path" ou "Headers search path" pour y mettre la destination du folder contenant tout les headers (c4d.h,etc).
J'essaierai de voir ça dès que je peux accéder à un PC. :wink:

edit: ce sont bien des .lib, si tu les ajoutes au projet, ça compile mais il doit y avoir un moyen de les inclures dans les préférences. :roll:

Jean-Laurent
27/05/2008, 20h33
Rien à rajouter de bien constructif en dehors du fait que je partage ta frustration.

J'ai réussi à compiler le SDK sans problème sur la version 9.5 mais impossible de répéter la même procédure sur la version 10.5. :o
En dehors de la compilation du SDK lui-même je ne parviens pas sous PC à compiler quoi que ce soit.

Je poursuis mes essais de temps en temps mais ça m'ennuie très vite de voir que je perds autant de temps ... :roll:

Pourtant comme toi ce n'est pas le premier SDK que je compile. Certainement quelque chose à revoir à ce niveau. :evil:

Je garde un œil sur ce post si jamais on trouve la solution.

Steph3D ::.
27/05/2008, 20h43
Ben ouais, c'est d'autan plus pénible que certains SDK s'installent tous seul sur VC++ sans rien avoir à faire. Tu vas direct à l'essentiel du code. Quand on débute sur le C++ et qu'on se tape sa d'entrée, c'est pas glop :( moi aussi j'ai perdu beaucoup de temps à chercher sans succès :cry:

Bon, j'ai regardé sur un site, les fichiers Lib, c'est bien avec VC++ et pour d'autre c'est des a. Oki

après, je pose juste ma Lib bêtement et simplement à la base du dossier cinema4dsdk ? Faut déclarer quelques parts non ?

J'ai essayé de glisser-déposer le c4d.h dans l'explorateur de solutions sur _api, mais ça ne le trouve toujours pas à la compile :evil: Sinon j'ai pas encore trouvé ou son les Headers path à déclarer :oops:

xs_yann
27/05/2008, 21h34
Normalement tu ouvre le .vcproj, tu ajoute le .lib avec le code source tu compile et puis ça roule. Enfin ça fonctionne avec la compil d'un plugin, pour le sdk je ne me souviens plus comment j'ai fait. :?

oli_d
27/05/2008, 22h37
Pour moi ça marche avec le 2005 et le 2008 express mais pour l'instant que sur la r9 de C4D (j'ai pas vraiment encore regardé sur la r10 mais cela ne marchait pas). En gros je pars toujours du projet cinema4dsdk que je copie et où j'enlève les fichiers inutiles (voir tutorial http://www.astrofish.com/tutorials/c4dtagplugin/index.html sur les précieux conseils de xs-yann)

Ce qu'il ne faut pas oublier c'est que la partie de ton projet doit être dépendant du projet _api_v8 (insérer donc ce projet si ce n'est pas le cas + clic droit sur ton projet "dépendance du projet" cocher "_api_v8" et normalement ça roule.

J'ai également installé "Plugins for Visual Studio 2005.NET" sur http://www.maxon.net/pages/support/plugincafe_downloads_e.html, j'ai aucune idée si c'était vraiment nécessaire mais en tout cas maintenant cela marche en r9. Après j'envoie le plug sur la 10 et pour ce que fais ça passe.

Je ne sais pas si j'ai été très clair mais dès que je comprendrai mieux ce que je fais je ferai un petit tut'minute avec des images.

Steph3D ::.
27/05/2008, 22h43
Moi j'ai du neuf, dans outils > options, j'ai déclarer à la main tous les dossiers de l'API, du coup ça compile sans erreurs
http://www.zbrush.fr/SMF/data/sdk/setup01.jpg

Voilà le rapport >>
http://www.zbrush.fr/SMF/data/sdk/sdk01.htm

Par contre, j'ai posé bêtement les Lib dans le cinema4dsdk :oops:

Et là je n’obtiens rien d'autre que les plugs au format Obj :?
http://www.zbrush.fr/SMF/data/sdk/camp01.jpg


Edit : Au fait, pour infos, le SDK marche et reste dispos aussi avec la demo de C4D 10.5, tous les plugs fonctionne avec la demo aussi ftp://ftp.maxon.net/pub/r105/cinema4d_10_5_demo.zip

oli_d
27/05/2008, 22h54
Tu dois avoir un fichier "mon_projet.cdl" c'est celui-ci qui est important. Je laisse les librairies où elle sont il faut juste ajouter le projet existant _api_v8 situé dans maxon/resource/_api_lib/_api_v8.vcproj dans ton projet et que ton projet soit dépendant de cet autre projet. Je t'enverrai demain matin un exemple au format vc++ express 2008 pour tester.

Steph3D ::.
27/05/2008, 23h19
Visiblement il y a plus v8 mais _api.vcproj tous court dans la V10

Pour le CDL, oui c'est l'(exécutable) du plug, mais justement, comme il y a beaucoup d'exemples, je m’attends à beaucoup de CDL pour le test du SDK, et la j'ai qu'un obscur cinema4dsdk.cdl :?

La dépendance semble être déjà réglé d'origine, mais c'est vrais que je ne sais pas configurer vc++ :oops:

oli_d
28/05/2008, 08h44
Après essai ça marche chez moi aussi avec VC++ 2008 sur la r.10.5

Je joins mon projet de maison paramétrique pour les essais (en vc++2005 sur r.9.0)
Télécharger le fichier (http://campus.hesge.ch/eil/e-eil/od/Maison_source.zip)
Marche à suivre :

Installer le dossier dézippé dans le dossier plugins

Ouvrir le vcproj dans VC++2008 express et suivre l'assistant de conversion (sans copie)

Supprimer le projet _api_v8 (clic droit "supprimer")

Fichier/ajouter/projet existant...

sélectionner le fichier "...\MAXON\CINEMA 4D R10\resource\_api_lib\_api.vcproj"

ensuite sélectionner le projet "cinema4dsdk" puis clic-droit "dépendance du projet"

cocher la case "_api"

->générer la solution et toucher du bois ou une bosse de bossu avec un fer à cheval dans la poche un soir de pleine lune en prenant garde de ne pas passer sous une échelle (je sais c'est difficile avec la souris dans la main droite)

Ouvrir C4D et essayer la fabuleuse maison paramétrique d'Oli_D (à consommer sans modération)

Chez moi ça fonctionne parfaitement !

J'ai l'impression d'être moniteur de ski alors que je ne sais pas même pas comment marche les fixations !

Edit : comme déjà dit précédemment j'ai installé les dll pour visualstudio 2005 (disponible sur le site de Maxon) également sur la 2008, je n'ai aucune idée si cela eu une influence sur le fait que cela fonctionne, mais ça mange pas de pain

EDIT II : attention de bien fermer Cinema4D lors de la compilation, sinon cela ne marche pas

EDIT III : (à 20 j'arrête) j'ai modifié le lien qui pointait sur un dossier sans le projet source.

Steph3D ::.
28/05/2008, 12h16
hum... en fait, quand on compile nos plugs s'appel toujours cinema4dsdk.cdl, vu qu'on reprend bêtement une copie du sdk comme ta maison, je savais pas trop d'où venait ce cinema4dsdk.cdl.

En fait, sans m'en rende compte j'avais déjà réussis à compiler le SDK vus que visiblement ça marche, j'ai bien les objets du sdk dans ma liste des plug-ins une fois c4d lancé.

En réalité, tout le SDK tiens dans le cinema4dsdk.cdl, ensuite on peu virer tous les autres fichiers, sauf bien sur le dossier Res. Donc *. cdl +Res, c'est ça qu'il faut redistribuer. Il n'y a pas non plus besoin de lier les *.lib, elles se compiles dans _api avec le reste des sources toutes seules.

Bon, en fait j'ai testé avec la démo, et il y a un truc très important à savoir quand on est en 64bits comme moi.
Si on compile les plug-ins en 32bits (par défaut), ça ne marchera pas en 64bits, les plug-ins 32bits ne sont pas compatible avec C4D64 ! aucun message d'erreur, ils s'afficheront pas dans C4D, c'est tout. Du coup, ben on peut toujours chercher. Pour le moment, je me contente de la démo en 32bits, histoire de ne pas m'embrouiller et pas niqué tous les fichiers d'origine.

Donc Plug-in 32, pas compatible avec 64, faut compiler 2 fois :(

Bon, maintenant faut que j'essaye aussi de compiler ta maison :? et revoir la manipe depuis le début pour comprendre ce que j'ai fait pour installer le bordel :coup:

Steph3D ::.
28/05/2008, 14h57
Bon, le sdk lui même, je l'ai compilé plusieurs fois, ça roule ! même sans le dossier _api.

Une fois compilée la 1er fois, il suffit après de glisser le fichier _api_Win32_Debug.lib dans le dossier (cinema4dsdk), enfin le même que le projet source dans l'explorateur de solutions de vc++, et c'est bon.

Par contre, la maison, j'arrive toujours pas :oops:


1>Compilation en cours...
1>maison.cpp
1>c:\users\steph\desktop\sdk\cinema 4d r10.5 demo\plugins\cinema4dsdk\source\object\maison.cpp( 228) : error C2039: 'GetPoint' : n'est pas membre de 'PointObject'
1> c:\users\steph\desktop\sdk\cinema 4d r10.5 demo\resource\_api\c4d_baseobject.h(188) : voir la déclaration de 'PointObject'
1>c:\users\steph\desktop\sdk\cinema 4d r10.5 demo\plugins\cinema4dsdk\source\object\maison.cpp( 313) : error C2039: 'GetPoint' : n'est pas membre de 'PolygonObject'
1> c:\users\steph\desktop\sdk\cinema 4d r10.5 demo\resource\_api\c4d_baseobject.h(233) : voir la déclaration de 'PolygonObject'

etc...

...

Steph3D ::.
28/05/2008, 15h33
Pareil en essayant un exemple de Yann :coup:


1>------ Début de la génération : Projet : cinema4dsdk, Configuration : Debug Win32 ------
1>Compilation en cours...
1>roundedtube.cpp
1>c:\users\steph\desktop\sdk\cinema 4d r10.5 demo\plugins\cinema4dsdk\source\object\roundedtube .cpp(34) : error C2065: 'CUBE_LEN' : identificateur non déclaré
1>c:\users\steph\desktop\sdk\cinema 4d r10.5 demo\plugins\cinema4dsdk\source\object\roundedtube .cpp(45) : error C2065: 'CUBE_LEN' : identificateur non déclaré
1>c:\users\steph\desktop\sdk\cinema 4d r10.5 demo\plugins\cinema4dsdk\source\object\roundedtube .cpp(55) : error C2065: 'CUBE_LEN' : identificateur non déclaré
1>Projet : warning PRJ0018 : Les variables d'environnement suivantes sont introuvables :
1>$(WebDeployPath)
1>Le journal de génération a été enregistré à l'emplacement "file://C:\Users\Steph\Desktop\sdk\CINEMA 4D R10.5 Demo\plugins\cinema4dsdk\obj\cinema4dsdk\Win32_Deb ug\BuildLog.htm"
1>cinema4dsdk - 3 erreur(s), 0 avertissement(s)
========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========

oli_d
29/05/2008, 09h04
c:\users\steph\desktop\sdk\cinema 4d r10.5 demo\plugins\cinema4dsdk\source\object\maison.cpp( 228)

apparemment tu as mis le fichier cpp dans le dossier cinema4dsdk, il faut placer le dossier "maison" directement dans "plugins" et bien ouvrir le projet vcproj du dossier maison.

Ou bien alors il y a effectivement un réglage qui fait qu'il va chercher le fichier au mauvais endroit

EDIT : Houllalala je m'aperçois que j'ai fait une grosse boulette sur le fichier que je t'ai mis à télécharger, j'ai mis le lien sur le dossier sans le vcproj, j'ai corrigé maintenant tu peux avoir le projet complet (7Mo) : Télécharger le fichier (http://campus.hesge.ch/eil/e-eil/od/Maison_source.zip)

Toutes mes excuses pour le temps que tu as perdu. :oops:

oli_d
29/05/2008, 09h51
Bon en fait c'est pas gagné, sur vc++2008, j'arrive à compiler sans problème quand je fais la démarche expliquée ci-dessus, mais dès que je ferme et je rouvre le projet plus possible !!!!! :coup:

Je renonce et je reste sur la r9 pour les plugs.

Steph3D ::.
29/05/2008, 10h23
Il faut peut être faire comme moi et exploité la Lib, puisque une fois _api compilée, ta plus besoin de le refaire.

Donc pour moi, les exemples du SDK et la Lib se compile très bien, j'ai tenté plusieurs fois le coup, par contre, ta maison ou les exemples de Yann, j'arrive pas, pourtant je mets bien les RES qui manque.

Mais bon, comme un exemple vaut plus qu'un long discourt, je passe une vidéo complète de mes manipes :roll:

http://stephlx.free.fr/sdk01.swf ( 8 mo, mais free est lent se matin :roll: )

Je me suis cassé les dents toute la journée dessus hier, c'est désespérant :cry2:

Steph3D ::.
29/05/2008, 12h59
Bon j'ai essayé ton nouveau fichier, ben c'est toujours pareil, avec _api compilé ou non :arg: :coup: :coup: :coup:

C'est fou ça, le compilateur réagis comme si ton code et faut, pareil pour un exemple de Yann :?

Jean-Laurent
29/05/2008, 13h01
En ce moment je n'ai pas le temps de voir si ça marche chez moi en vous accompagnant mais j'applaudis des deux mains à vos essais. :efface:

Dès que je peux je suis vos procédures à la lettre pour voir de mon côté où sa coince.
Encore merci à vous deux de détailler tout ça. :prie: