PDA

Voir la version complète : Plugins :"PoseMirror" | "MultiParent" | "Home" , en COFFEE



Floby
28/07/2008, 16h26
Bonjour la compagnie :odile:
Maintenant que, grâce à mes études, je suis sensé savoir un peu mieux coder :nono: je me suis dit que j'allais me recoller à COFFEE pour faire un petit Plug.
Je voulais juste faire une automatisation d'un truc qu'on voit souvent fait en Xpresso sur les rigs de personnages. En gros c'est un plug avec deux fonctions :

"Set home" qui ajoute un tag fait maison à/aux objets sélectionnés qui stocke les coordonnées (locales) de l'objet.
"Get Back Home" qui fait rentrer le/les objets sélectionnés à la maison grâce aux infos du tag.


J'ai donc lu pas mal de SDK Coffee :) et commencé, mais j'ai tout de même quelques problèmes pour que ça fonctionne, et je demande avec toute mon humilité si des pros (ou moins pros vu que je suis tout en bas de l'échelle) pourraient m'aider. :calim:

---> Le fichier source. (http://www.deltazone.org/~fc4d/autres/floby_HomeTag.cof)<--- [EDIT : LIEN MORT]

Dans un premier temps, j'ai des problèmes de rafraichissement, il faut cliquer dans le vide pour voir les effets de ce qu'on vient de faire. Dans un second temps, quand j'essaye de faire "Set Home" sur un objet qui a déjà un tag ça fia tplanter C4D, ce qui est plutôt embêtant...
Je pense que le gros de mes problème vient du fait que j'ai stocké les données du tag dans des champs de la classe (publiques avec ça). Je pense que je devrais utiliser un Container mais même à la lecture de la doc, son fonctionnement m'est complètement ésotérique.


Merci d'avance à ceux qui pourront m'aider :poucehaut:



Ps : ne faites pas attention à mon code :mrgreen: c'est moche et en franglais mais il faut bien s'amuser un peu

Floby
28/07/2008, 17h22
Hum, après relecture attentive de mon code, j'ai corrigé beaucoup de bêtises dues à la correction à chaud :art:
c'est surtout dans les execute.


MyHomeTagMenu::Execute(doc)
{
doc->StartUndo();

var op=doc->GetActiveObject();
var ntag=op->GetFirstTag();
while((ntag!=NULL) && !instanceof(ntag,HomeTag)) {
ntag=ntag->GetNext();
}
if(ntag==NULL) {
ntag=AllocTag(1000001);
doc->AddUndo(UNDO_TAG_NEW,ntag);
op->InsertTag(ntag);
}

doc->AddUndo(UNDO_TAG_DATA,ntag);
ntag->P=op->GetPosition();
ntag->E=op->GetScale();
ntag->R=op->GetRotation();


doc->EndUndo();
}


HomeTagBackHome::Execute(doc)
{
doc->StartUndo();

var op=doc->GetActiveObject();
var tagtmp=op->GetFirstTag();
while(tagtmp!=NULL) {
if(instanceof(tagtmp,HomeTag)) {
doc->AddUndo(UNDO_OBJECT_BASEDATA,op);
op->SetPosition(tagtmp->P);
op->SetScale(tagtmp->E);
op->SetRotation(tagtmp->R);
break;
}
tagtmp=tagtmp->GetNext();
}

doc->EndUndo();
}

Voilà, les problèmes qui subsistent sont les problèmes de rafraichissement


Maintenant que ça commence à marcher, je me suis dit que ce serait bien que ça marche avec des selections multiples et d'avoir un minimum d'options dans le Tag (ne serait-ce que Activer/Désactiver).

paspas
28/07/2008, 18h32
salut floby

une petite idée comme ça en passant , le plus simple je pense ,

comme ton tag est attache a un objet , peut etre serrait t il plus simple de lier les valeur que tu veut stoker au container de cette objet

vas voir la (http://www.frenchcinema4d.fr/forum/index.php?topic=20991.0) pour savoir comment faire



paspas

Floby
28/07/2008, 18h49
Ah oui pas bête :) merci du tuyau. j'ai vu qu'on pouvait faire ça dans le SDK mais ils disaient qu'il faut avoir un ID unique de PluginCafé ou chépakoi. Ca m'a fait peur, je me suis dit que c'était pas pour moi ^^.
Cela dit, ça ne me semble pas réalisable de cette manière parce que ce tag doit pouvoir être applicable sur n'importe quel type d'objet. Or les IDs et le nombre d'IDs par container change d'un objet à l'autre. Puis en plus, à l'école on m'a appris que je devais pas aller toucher les données d'une classe que j'avais pas faite :P .

J'ai essayé d'ajouter un container à mon tag, et ça n'a pas raté, ça ne fonctionne pas. il dit :
"Incompatible values... NIL / OBJECT"
Dans ma fonction GetContainer sur l'instruction :

return SV_->GetClone();
SV_ étant le container de mon tag.

Et je n'ai toujours pas résolu les problèmes de rafraichissement, et je sens que c'est tout simple en plus, genre doc->Refresh() ou un truc comme ça ^^

paspas
28/07/2008, 19h01
pour les rafraîchissement vas voir du cote de "MESSAGE "


Cela dit, ça ne me semble pas réalisable de cette manière parce que ce tag doit pouvoir être applicable sur n'importe quel type d'objet.

je comprends pas : si tu u crée X nouvelle valeur au container de l' objet ,le plus dont tu a besoin , et si il y en a moin que prevus tu ne met pas de valeur

ce qui ferra a la lecture un "nil" pour cette valeur -> pas prit en compte par l' autre tag

de plus de cette manière tu sait pas in FindObjet trouver un objet et recupéré tes datas dans n' importe quelle cofee ;)

paspas

Floby
28/07/2008, 19h47
hum... Je comprends pas bien ce que tu veux dire :?

shtl
28/07/2008, 21h06
Personne ne comprend jamais de toute façon. :mrgreen:

Floby
28/07/2008, 22h28
Oui mais là il a du écrire super vite quand même, ou alors il faut lui dire que le "." de sont clavier ne fonctionne plus :mrgreen:

Floby
28/07/2008, 23h13
Je me prends vraiment la tête avec les sélections multiples, c'est le seul truc qu'il me manque (avec un jolie icône). Est-ce que ça n'est tout simplement pas géré en COFFEE ? C'est pas que ça me gène de le recoder en C++, mais ça fait quand même pas mal d'autres trucs à installer :mrgreen:

paspas
29/07/2008, 09h52
je ne dirais plus rien na !! :mrgreen:

paspas

Floby
29/07/2008, 13h09
Oh si, s'il te plait :calim:

Voila, mon plug est opérationnel ormis le fait que je n'ai toujours pas réussi à utiliser de container, je crois que j'ai des problèmes à la construction de celui-ci. Je crois que pour la multiselection c'est définitivement mort en COFFEE. J'ai vu comment faire en C++, peut-être que je reprendrais ce plug quand j'aurais eu le courage d'installer la SDK.

Il me faudrait aussi une image d'E.T. pour l'icône :mrgreen:

kiteman
30/07/2008, 01h18
super initiative Floby ! :odile:

merci à toi ..et à super Paspas pour son aide :wink:

oli_d
30/07/2008, 08h01
Super Floby,

Un de plus dans le monde mystérieux et obscur du COFFE.

Je vais essayer de t'aider dans la mesure de mes moyens.


qu'il faut avoir un ID unique de PluginCafé ou chépakoi. Ca m'a fait peur...

cela ne concerne pas les containers mais le numéro de référence de tes plugins, pour l'instant tu as travaillé avec 3 nombres (1000001 à 1000003). Mais si tu commences à avoir plusieurs plugs et que par malheur 2 ont le même nombre de reférence C4D va planter, C'est pour cela qu'il faut obtenir un numéro unique chez Maxon, un fois que tu es inscrit cela prend 1 minute.


return SV_->GetClone();

la fonction GetClone() ne fonctionne pas sur un container, elle fonctionne uniquement sur un objet type "BaseObject", c'est pour cela que tu as le message d'erreur.


Je crois que pour la multiselection c'est définitivement mort en COFFEE

effectivement il n'y a pas à ma connaissance une fonction qui te renvoie automatiquement tous les objets sélectionnés, mais tu peux toujours essayer de parcourir tous les objets de ton doc et de vérifier avec la fonction objet->GetBit(BIT_AOBJ) si l'objet est sélectionné (renvoie true) ou non (renvoie false).

Bon courage et bravo !

Edit : Encore une chose pour récupérer la position, l'échelle et la rotation tu peux utiliser une matrice tu auras tout cela en une opération. Regarde dans la doc sous "Tutorials", "Using matrix"

Floby
30/07/2008, 13h28
Merci de tes explications :)
Oui pour les IDs de container, il disait en fait qu'il en fallait pas utiliser les IDs déjà utilisés, et donc par extension d'avoir un ID unique si d'autre developpeurs avaient eu l'idée d'utiliser le container de ces objets.
Par contre ça me chagrine un peu que l'on ne puisse pas avoir de clone de container, ne de le copier vers un autre. D'autant plus que ces fonctions sont présente dans le SDK de "BaseContainer" :? de la version 9.5 certes, mais j'avais esperé qu'une méthode aussi utiles et basiques puisse être gardée. Tout cela ne me dit rien de bon, comme dirait Tintin.

J'aurais un question aussi, ça veut dire quoi "NIL" ? Je suppose que le N veut dire Not, le I veut dire In, mais le L...

Tu as raison pour l'utilisation de matrices, je n'y avais pas pensé. Et pour l'utilisiation de GetBit, je vais voir si ça fonctionne :poucehaut: Merci

Floby
30/07/2008, 14h06
Merci pour les sélections multiples ça marche du tonnerre !!! :poucehaut:

oli_d
30/07/2008, 15h48
D'autant plus que ces fonctions sont présente dans le SDK de "BaseContainer"

Autamps pour moi (néologisme pour mettre enfin tout le monde d'accord entre "Autant pour moi" et "Au temps pour moi"). C'est vrai que je n'avais pas vu qu'il y avait aussi cette fonction dans la classe BaseContainer, il doit donc y avoir une autre explication à ton problème que j'ignore ...

Mais en fait je ne comprend pas très bien pourquoi tu veux dupliquer ce container.Ce qui t'intéresse si j'ai bien compris c'est la matrice, non ?


J'aurais un question aussi, ça veut dire quoi "NIL" ? Je suppose que le N veut dire Not, le I veut dire In, mais le L...

Je n'en sais rien, mais je pencherai plus pour un truc du genre nothing in L???. En tous cas c'est pour différencier un cas ou il n'y a rien (NIL) d'un cas valeur 0 (NULL).

Floby
30/07/2008, 16h19
Ouah c'est pire que NULL ! :shock:

Le container, c'était du temps ou je stockais pas la matrice mais la position, la rotation et l'échelle. Je voulais un container pour que ça ressemble plus à un objet C4D, vu qu'ils stockent tous leurs données comme ça. je voulais faire comme les grand quoi :calim: Dupliquer le container c'était dans la Fonction GetContainer de ma classe tout simplement. Je pense que le problème vient du fait que j'utilisais SetData() sur mon container, sans jamais avoir fait de InsData() donc il avait du mal/ Il faudra que je re-teste ça même si maintenant que je stocke qu'une matrice ça risque de devenir moins intéressant.

Et pour trancher entre "au temps pour moi" et "autant pour moi" il y a un institution dont c'est le boulot :wink: ->http://www.academie-francaise.fr/langue/questions.html#au_temps

Floby
31/07/2008, 15h43
Bon je pense avoir fini de débugger. l'enregistrement, l'undo et le redo sont opérationnels, et le reste marche aussi :mrgreen:
J'ai mis que le plug marchait pour 9.5 et plus. mais je n'ai pas les moyen de tester pour les versions inférieures.
C'est un fichier .cob donc si vous voulez voir le code, envoyez moi un MP et je me ferai un plaisir de vous envoyer une copie :)

Par contre j'ai été obligé d'enregistrer mes icônes (je me suis bien amusé ^^) en PSD, parce que en tif la transparence ne fonctionnait pas. bizarre :?

C'est mon premier plug alors j'ai tout suivi ce qu'ils disaient dans le SDK :nono:, ne soyez pas surpris de voir pleins de fichiers différents pour un si petit plug.

--> le fichier <-- (http://www.deltazone.org/~fc4d/autres/floby_HomeTag.rar)

N'hésitez pas à me rapporter tout bug/dysfonctionnement/amélioration :odile: Et merci à tous ceux qui m'ont aidé :love:

oli_d
01/08/2008, 10h33
Bravo Floby :efface:,

Pour ton problème de tif est-ce que tu as bien enregistré le fichier avec une couche alpha, parce que normalement cela fonctionne très bien.

Vivement ton prochain plug ! :poucehaut:

Floby
01/08/2008, 15h16
Ah oui :oops: c'était ça.
Seulement, les demies transparences ne marchent pas, enfin pas pareil en tout cas, j'éviterai la prochaine fois.

Floby
01/08/2008, 16h43
Allez c'est reparti !! :nono:

J'ai une autre idée de plug, toujours pour le rig et l'animation. J'ai eu l'idée, et surtout entrevue comment faire, en lisant le chapitre qui traite des matrices dans le SDK. Je vais mettre à un plat un peu ce que je veux faire, c'est bien de savoir exactement ce qu'il faut avant de se lancer. :)

L'idée serait de permettre à un objet (neutre, contrôleur de commissures de lèvres (de bouche) par exemple) de se comporter comme un point d'un maillage influencé par des os. Tout ceci indépendamment de la hiérarchie. Mais je voudrais qu'il soit tout de même possible de bouger à la main cet objet (puisque ce serait un contrôleur) quand on le souhaite et que lorsque l'on a fini, il continue de suivre les mouvements de autres, à sa nouvelle position (ça à l'air pas clair quand je le dit, mais je vais essayer de montrer un exemple rapidement).

J'ai commencé à coder un COFFEE à mettre sur l'objet qui nous interesse. il faut avoir dans sa scène un objet P1 et un objet P2 (dans ma scène c'était des pyramides). Vloià le code ->


GetFinalMatrix(a,b) {
var res=new(Matrix);
res->SetV0((a->GetV0() + b->GetV0())/2);
res->SetV1((a->GetV1() + b->GetV1())/2);
res->SetV2((a->GetV2() + b->GetV2())/2);
res->SetV3((a->GetV3() + b->GetV3())/2);
return res;
}

main(doc,op){
var P1=doc->FindObject("P1"); //controlleur 1
var MP1=P1->GetMg();
var P2=doc->FindObject("P2"); //controlleur 2
var MP2=P2->GetMg();
//on initialise une matrice qui définit un objet en coordonnées 0 et
//rotation 0 par rapport à son parent (ici pour les deux)
var OM=new(Matrix);
OM->SetV0(vector(0,0,0));
OM->SetV0(vector(1,0,0));
OM->SetV0(vector(0,1,0));
OM->SetV0(vector(0,0,1));

//on simule la matrice globale de l'objet s'il se trouvait
//enfant du controlleur
var MR1=MP1->GetMulM(OM); //<- matrice globale de l'objet
var MR2=MP2->GetMulM(OM); //<-aussi mais "enfant" de l'autre

var MRF=GetFinalMatrix(MR1,MR2);
op->SetMg(MRF);
}

Un petit exemple de ce que ce code fait :D A l'evidence je suis pas aussi doué que Base80 pour faire de jolis GIF :art:
http://www.deltazone.org/~fc4d/images/floby_exp1.gif
dans ce fichier, la sphère est le parent du cube.

Je pense qu'il faudra que je code le plug en C++ car j'aurais besoin de stocker dynamiquement dans un tag, et surtout d'avoir une interface pour ce tag, mais surtout en particulier parce qu'il me faudra surement des liens vers les objets (vu que le nom c'est pas génial).

Aurety
02/08/2008, 12h32
N'hésitez pas à me rapporter tout bug/dysfonctionnement/amélioration :odile: Et merci à tous ceux qui m'ont aidé :love:


Super Floby ! Merci...
Ce qui serait bien d'ajouter...

- Un bouton "update tag" ( mettre à jour le tag ) plutôt qu'à devoir le supprimer pour le mettre à jour en le recréant.
- Un mode "absolute"/"relative" pour travailler en home tag objet ou monde.
- Une boite liste pour glisser plusieurs objets et faire un home tag sur une liste d'objets. Un peu comme le faisait pose2pose dans Mocca.
- La possibilité de stocker différentes valeurs de home tag sur un objet ( ou une liste ) et de pouvoir switcher entre 2 homes via un slider ( avec toutes les interpolations de l'animation ( ease-in, ease-out, acceleration,etc... ) : L'idée serait de passer d'un home tag 1 d'un, à un home tag 2 ( 50% du slider ) pour finir à un home tag 3 ( 100% du slider ). L'ideal serait qu'on pourrait jouer sur l'ordre des homes tag si nécessaire.

voilà pour quelques idées. :bounce:

Floby
02/08/2008, 13h18
Merci d'avoir essayé Aurety :)

Pour tes propositions je vais te répondre dans l'ordre :

- Pas besoin de bouton update tag, ni de le supprimer d'ailleurs ! il suffit de repasser par la commande "Emménager" qui remet à jour le tag s'il en existe déjà un.
- C'est une bonne idée, mais on ne peut pas toucher au gestionnaire de propriétés pour les tag en COFFEE malheureusement. Je peux ajouter ça au niveau de la commande emménager, mais ça rajoute du dialogue pour la manip. Ou alors juste faire une seconde commande Globale. Mais encore le seul moyen que j'aurais d'indiquer si le tag est en mode Global ou Local serait dans le nom de celui-ci, ce qui n'est tout de même pas pratique :?
- Je ne suis pas sûr de comprendre. Si c'est juste pour en définir plusieurs à la fois, il faut juste en avoir sélectionné plusieurs quand on lance la commande. Si c'est pour stocker la position d'un ensemble d'objet c'est un peu plus compliqué.
- Là c'est carrément de l'anim' c'est effectivement possible, voire facile, si je recode le plug en C++, ce qui va sûrement bientôt arriver puisque il y a plein d'amélioration à faire qui le nécessite. Cela dit, le plug n'avait pas pour vocation à servir pour l'animation :oops: mais plutôt d'être un moyen rapide de faire un truc minime mais très utile pour un rig.

Encore merci pour les suggestions ! Et moi je vais commencer à me pencher sur la compilation du SDK :art:

kiteman
03/08/2008, 13h19
salut Flobby :)

tient comme tu es dans les plugins pour l'anim , j'en avais commencé un ( enfin un expresso )
-> un outil de mirroir de pose ( on drag and drop ses controlleurs et en 1 clic on mirroir tout ça suivant un pivot et un plan mirroir choisi ( donc le pivot c'est biensur un controlleur dans le perso , mais pas forcement le master .. et donc faudrait pouvoir choisir un mode mirroir local pur ou tout calculer en mode "parent" , c'est à dire chaque controlleur du rig , par rapport au pivot choisi ( par exemple les mains par rapport au master , et non pas par rapport à leur parent 1er qui pourrait être le pelvis par ex .. car le résultat ne sera pas la même chose si le pelvis est tourné dans l'espace ).

http://www.frenchcinema4d.fr/forum/index.php?topic=22340.0

mais faute de temps j'ai mis ça en stand by pour le moment :cry2: , donc si tu veux t'y coller pour mettre ça en coffee :mrgreen:

Paspas , avait fillé une partie excellente :art: :prie: , où il faisait en coffée la transformation mirroir ( juste les positions ) entre 2 objets et un 3ème servant de pivot , et tout ça sans relation parent-enfants dans la hiérarchie :)

donc voila si ça te dit :odile:

Floby
03/08/2008, 15h04
Ah oui c'est déjà un petit niveau au dessus oui :nono:
mais je viens d'essayer 2-3 trucs en COFFEE et ça à l'air pas trop compliqué mathématiquement parlant. Ce qui va poser problème c'est :
- Trouver les contrôleurs à symétriser, je ne sais pas comment tu fais dans ton Xpresso, c'est sûr que s'ils sont bien nommés ça ne doit pas poser de problèmes, après c'est possible de trouver par la hiérarchie si celle-ci est bien rangée.
- savoir quel axe inverser au final, mais ça j'en fait une affaire personnelle ^^. C'est surtout que j'essaye de limiter au maximum les paramètres compliqués (parce que c'est sûr je pourrais demander au mec "ton contrôleur, tu l'as placé comment ? non je dis ça parce que j'en ai besoin pour faire un truc avec le bidule pour que ça soit tictactictac comme il faut..." :mrgreen: )
- L'interface, parce qu'en COFFEE on est limité, mais je compte explorer le C++, mais le COFFEE c'est quand meme mieux pour explorer parce que plus facile à débugger.

Mais sinon je suis partant :D ( :coup: d'avance)

Floby
03/08/2008, 17h13
un truc comme ça ?

http://www.deltazone.org/~fc4d/images/floby_exp2.gif

kiteman
03/08/2008, 17h27
Ah oui c'est déjà un petit niveau au dessus oui :nono:
mais je viens d'essayer 2-3 trucs en COFFEE et ça à l'air pas trop compliqué mathématiquement parlant. Ce qui va poser problème c'est :
- Trouver les contrôleurs à symétriser, je ne sais pas comment tu fais dans ton Xpresso, c'est sûr que s'ils sont bien nommés ça ne doit pas poser de problèmes, après c'est possible de trouver par la hiérarchie si celle-ci est bien rangée.
- savoir quel axe inverser au final, mais ça j'en fait une affaire personnelle ^^. C'est surtout que j'essaye de limiter au maximum les paramètres compliqués (parce que c'est sûr je pourrais demander au mec "ton contrôleur, tu l'as placé comment ? non je dis ça parce que j'en ai besoin pour faire un truc avec le bidule pour que ça soit tictactictac comme il faut..." :mrgreen: )
- L'interface, parce qu'en COFFEE on est limité, mais je compte explorer le C++, mais le COFFEE c'est quand meme mieux pour explorer parce que plus facile à débugger.

Mais sinon je suis partant :D ( :coup: d'avance)


ha super !! :)

donc pour trouver les controlleurs a symétriser , en fait moi j'étais partis sur le fait que pied D et G , main D et G , solvers genou D et G , et solvers coudes D et G fonctionnent par paires ... tous les autres controlleurs ajoutés fonctionneraient en solo ( mirroir sur "eux mêmes" )
donc avec ce principe on match tout biped et quadriped standard. ( après pourquoi pas permettre à l'utilisateur de définir par lui même son type de perso , avec combien de controlleur par 'paires' ? de controlleur seul ? etc ..)

Après si tu arrives à trouver une solution pour qu'il lise en auto la hiérarchie et trouve par lui même les controlleurs par paire ? :) ( genre il cherche une racine commune comme Rfoot .. Lfoot il en déduit que ce sont 2 controlleurs fonctionnant par paire ? etc .. je sais pas trop en fait ce qui est faisable. Ou alors mieux , on définit de rajouter une certaine syntaxe sur les controlleurs genre ' Ctr_master .. Ctr_pelvis .. Ctr_Rfoot ..etc ' , donc la racine "Ctr_" définirait quoi prendre comme controlleur ? enfin libre à toi :art:


Pour ton probleme d'axe a choisir , bein en fait , je voyais bien ceci dans le principe :

on drag and drop l'object servant d'origine au mirroir ( donc par exemple le controlleur master du perso ) , ensuite , on coche une checkbox ' X Y ou Z' , qui correspond aux axes de l'objet origine choisi ( donc si le master à son YZ formant le plan mirroir , on va donc cocher 'X' :) ..etc )

et donc après tu mirrorises tout via cette objet origine (donc en utilisant le code de super Paspas par ex :boss: + le transfert de rotations)

Pour ce qui est de savoir comment il va savoir qu'est-ce qui est controlleur ou pas , bein peut-être faire un drag and drop de tous les controlleurs ou alors un systeme de liste ? enfin je sais pas trop ce qui existe niveau codes :? .. comme ça on le fait une fois et apres c'est bon il garde en mémoire sur le fichier du perso la liste ?

J'ai vu que sur le site de Maxon , il y a des plugins de création de plugins ^^ .. te permettant de créer rapidement une boite de dialogue , des boutons etc .. mais bon c'est du chinois pour moi :calim: .. on rentre dans l'univers de XSYann, Paspas et JeanLaurent ^^

bein merci beaucoup si tu peux faire quelque chose :odile:

bon cuuurage ! :poucehaut:

kiteman
03/08/2008, 17h28
un truc comme ça ?

http://www.deltazone.org/~fc4d/images/floby_exp2.gif



:lol: Haha même pas le temps de raconter ma vie , t'as deja finis ! ^^

bien joué , ouep voila c'est ça :)

:odile:

kiteman
03/08/2008, 17h35
ha oui et donc si tu peux rajouter une option de stockage de pose ? ( j'avais fais ça dans mon expresso et j'avoue que c'est assez pratique .. comme ça en dehors de l'outil mirroir on peut aussi aller copier une pose dans une anim et la coller plus loin :) .. si tu arrives à rajouter une option de 'add keyframes' quand on collerait la pose ? ça serait top :) )
et des checkbox devant les controlleurs dans la liste si tu peux , pour éventuellement ne travailler que les pieds et donc ne pas copier coller avec clés , les autres controlleurs ;) ..

Floby
03/08/2008, 19h28
:lol: Haha même pas le temps de raconter ma vie , t'as deja finis ! ^^


Ben c'est les vacances tu sais ^^.

Pour les histoires de contrôleurs à symétriser, je pense que le plus simple est un genre de liste avec un lien vers l'objet gauche et son miroir, plus quelques autres trucs si besoin, et dont on rajoute des lignes avec un bouton "ajouter" au quelque chose comme ça. Éventuellement par dessus ça, on peut rajouter une fonction de recherche automatique. Mais tout ça c'est du fignolage d'interface. Mais j'aimerais bien, si ça ne pose pas de problème bien sûr que tu me montre un fichier avec un rig histoire de voir comment travailler sur un rig complet (et je te fais confiance pour avoir un rig de pro). Mais c'est vraiment si ça ne pose pas de problème, je n'ai pas besoin du modèle ni d'animation, juste les contrôleurs pour voir comment ça réagit en "Grandeur Nature" quoi :)



J'ai vu que sur le site de Maxon , il y a des plugins de création de plugins ^^ .. te permettant de créer rapidement une boite de dialogue , des boutons etc ..

Ca m'interesse. Mais je viens de passer sur le site et je n'ai pas vu trace de ce dont tu parles, c'est dans quelle section ?


ha oui et donc si tu peux rajouter une option de stockage de pose ?

C'est sûrement possible, mais pour être honnête je n'ai jamais manipulé de données aussi importantes en COFFEE, je vais essayer de voir comment stocker ça quelque part, peut-être dans un tag (j'aime les tag :nono:).

--- MISE A PLAT --- eh ouais je travaille serieusement ^^ ...
_________________________________________________
Mon idée pour mettre ça sous forme de plug :
Un tag à poser sur la racine de l'arborescence de contrôleurs.
Dans les options, on précise l'objet qui sert de miroir et quel plan de cet objet choisir (prendre un objet différent du master du perso offre plus de possibilités, mais ça c'est selon les goûts). On précise aussi la différentiation Gauche/Droite se fait par suffixe ou préfixe et on précise lesquels.
Ensuite (dans un autre onglet surement), la liste des contrôleurs et de leur miroir (vide ou identique si le contrôleur marche en solo) sous la forme:
Ctrl. Gauche { } Ctrl. Droit { } [Trouver]
[Ajouter un contrôleur] [Auto.]
Ensuite, un onglet d'utilisation avec des boutons tels que "Miroiter", "Copier la pose", "Coller la pose" et autres truc marrants. Sachant que je n'ai aucune idée de comment présenter le choix de la pose à copier ; je vois bien un truc comme le tag Morphing, mais à mon avis c'est plus compliqué que ça.
_________________________________________________

Bon de toute manière, tout ça nécessite de passer au C++ :art: :coup: :cry2: :arg: (et autres smileys)

kiteman
03/08/2008, 21h55
Pour les histoires de contrôleurs à symétriser, je pense que le plus simple est un genre de liste avec un lien vers l'objet gauche et son miroir, plus quelques autres trucs si besoin, et dont on rajoute des lignes avec un bouton "ajouter" au quelque chose comme ça. Éventuellement par dessus ça, on peut rajouter une fonction de recherche automatique. Mais tout ça c'est du fignolage d'interface. Mais j'aimerais bien, si ça ne pose pas de problème bien sûr que tu me montre un fichier avec un rig histoire de voir comment travailler sur un rig complet (et je te fais confiance pour avoir un rig de pro). Mais c'est vraiment si ça ne pose pas de problème, je n'ai pas besoin du modèle ni d'animation, juste les contrôleurs pour voir comment ça réagit en "Grandeur Nature" quoi :)



:) ok je vais te trouver ça demain au bureau , j'ai surement un rig tout pret pour ça ;)

kiteman
03/08/2008, 21h58
J'ai vu que sur le site de Maxon , il y a des plugins de création de plugins ^^ .. te permettant de créer rapidement une boite de dialogue , des boutons etc ..

Ca m'interesse. Mais je viens de passer sur le site et je n'ai pas vu trace de ce dont tu parles, c'est dans quelle section ?



http://www.maxon.net/pages/support/plugincafe_downloads_d.html ( en fait tu vas dans maxon.net / download et dans la rubrique SDK , puis tu choisis le type de c4d ( ici 10.5 ) et tu arrives sur la page de liens-ci ) :)

kiteman
03/08/2008, 22h02
ha oui et donc si tu peux rajouter une option de stockage de pose ?

C'est sûrement possible, mais pour être honnête je n'ai jamais manipulé de données aussi importantes en COFFEE, je vais essayer de voir comment stocker ça quelque part, peut-être dans un tag (j'aime les tag :nono:).

--- MISE A PLAT --- eh ouais je travaille serieusement ^^ ...
_________________________________________________
Mon idée pour mettre ça sous forme de plug :
Un tag à poser sur la racine de l'arborescence de contrôleurs.
Dans les options, on précise l'objet qui sert de miroir et quel plan de cet objet choisir (prendre un objet différent du master du perso offre plus de possibilités, mais ça c'est selon les goûts). On précise aussi la différentiation Gauche/Droite se fait par suffixe ou préfixe et on précise lesquels.
Ensuite (dans un autre onglet surement), la liste des contrôleurs et de leur miroir (vide ou identique si le contrôleur marche en solo) sous la forme:
Ctrl. Gauche { } Ctrl. Droit { } [Trouver]
[Ajouter un contrôleur] [Auto.]
Ensuite, un onglet d'utilisation avec des boutons tels que "Miroiter", "Copier la pose", "Coller la pose" et autres truc marrants. Sachant que je n'ai aucune idée de comment présenter le choix de la pose à copier ; je vois bien un truc comme le tag Morphing, mais à mon avis c'est plus compliqué que ça.
_________________________________________________

Bon de toute manière, tout ça nécessite de passer au C++ :art: :coup: :cry2: :arg: (et autres smileys)


ouep ça m'a l'air bien tout ça :) . on va voir à l'usage déja comment ça va se passer dans un 1er temps ;) on corrigera le tir dans une 2ème passe si besoin :mrgreen:

N'hésitez les autres as du C++ à venir aider Floby si ce projet vous tente :)

merchiii

:odile:

Floby
04/08/2008, 01h52
Je sais pas comment faire un petit gif pour présenter ça mais... Ca marche ! :bounce: (pas trop tôt, 1h51 tout de même ^^).
J'ai fait quelque chose qui marche en COFFEE+Xpresso, ça donne la marche à suivre pour faire un truc bien complet.

A vrai dire j'ai encore deux truc qui ne marche pas tout à fait comme il faut :roll:
- Des rotations exotiques, supérieures à +/- 360. Mais ça c'est 2-3 lignes de code j'espère.
- Plus de lignes de code :mrgreen: : ma fonction pour trouver automatiquement les contrôleurs de l'autre côté ne fonctionne pas. Le tout fonctionne, mais une fois sur deux le pied gauche se trouve à droite. Bon c'est pas très grave parce que c'est juste que je l'ai désactivée cette fonction, elle faisait planter le script.
Je pense pourvoir descendre en dessous de la centaine de ligne de code :boss:


En tout cas COFFEE/Xpresso ça dépote !

Floby
04/08/2008, 02h01
Allez je ne résiste pas ^^ je vous mets le fichier (fichier joint). Le système est sur la DU de l'Xpresso bougez tout ce que vous voudrez :)

kiteman
04/08/2008, 14h26
Ha super Floby :) , je zieute de suite ton fichier !! ;)

voici en attendant un exemple de structure de rig si tu veux :

http://kiteclem35.free.fr/3D/C4D/rig%20de%20base.c4d

(là tous les controlleurs sont orienté "pareil" mais ça peut ne pas être le cas des fois bien sur ( genre un flip de 90° sur un axe pour certains etc .. )

kiteman
04/08/2008, 14h29
T'es un chef Floby , le principe est parfait ! :) :love:

prochaine étape : l'interface pour ton plug 8)

merci beaucoup :odile:

edit : ha juste un truc , je vois que la fonction mirroir là ne transfert pas de la main gauche à la main droite par ex , la rotation , mais bouge la main gauche a la place de la main droite et vice versa ;) . donc là faudrait transferer les infos de pos + rotation mais sans changer de plan les mains :)

Floby
04/08/2008, 15h13
Oui il y avait ce problème sur le fichier, mais finalement ce n'est qu'une histoire d'attribuer les bonnes coordonnées au bon objet :mrgreen: en tout cas c'est reglé, j'ai fait une fonction qui recherche par le suffixe (je compte l'étoffer pour plus d'options), mais je compte mettre plus de souplesse grâce à une interface.
Je crois avoir tout débroussaillé en COFFEE, j'ai commencé à m'attaquer au C++. :o déjà il faut que je comprenne comment tout installer. Si des gens peuvent m'aider, j'utilise Visual Studio 8. :odile:

xs_yann
05/08/2008, 10h33
Etant parti une semaine, je n'ai pas pu suivre, ni aider pour le début de ce WIP. :(
Pour le SDK C++ tu as, normalement, presque toute les infos sur ce topic : http://www.frenchcinema4d.fr/forum/index.php?topic=21175.msg398469#msg398469

Si tu n'y arrive toujours pas à l'installer, dis où tu bloques. :wink:

Aussi, si tu as besoin d'exemples de code pour des structures de base (genre un plugin tag ou autre)...

Bon courage.

Floby
05/08/2008, 12h30
Ah cool xs_yann est enfin dans la place :D
Oui j'ai déjà regardé ce topic (ne serait-ce que pour le code) qui explique bien tout pour compiler le SDK quand ça ne fonctionne pas comme prévu ^^. Comme j'ai la dernière version de VC++ (ils disent dans le sdk que les projet seront maintenant pour cette version), je pense ne pas rencontrer trop de problèmes.
J'ai déjà fait certains truc qui ont eu l'air de marcher mais je sais pas de tout. J'aurais besoin d'indications. ce qu'il faut ouvrir c'est bien le projet VC++ du dossier cinema4dsdk dans le dossier plugins ? En tout cas si c'est ça, ça ne semble pas avoir de problèmes pour compiler.
Ah oui et pour prévoir, je ne sais pas du tout comment compiler le *.cdl final du plugin. Normalement je comprends plutôt bien les trucs de compilation, mais je dois dire que quand c'est 25000 trucs, et que c'est expliqué en anglais et bah :cry:

Pour les structures de classes du plugin, comme ça ressemble assez à celle du COFFEE je ne suis pas trop déstabilisé :) mais un fichier d'exemple n'est jamais de refus.

Merci

xs_yann
05/08/2008, 13h15
Le projet cinema4dsdk VC++ (cinema4dsdk.vcproj dans le dossier CINEMA 4D/plugins/cinema4dsdk) est déjà tout préreglé, le .cdl sera généré automatiquement quand tu le compileras. Si VC++ est correctement installé, la compilation se fera toute seule sans que tu ne touches à rien (sauf au bouton build :roll:). Bien sur il faut que tu es compilé l'api avant (resource/_api_lib/_api.vcproj) pour obtenir les fichiers _api_Win32.lib.

Après pour tes propres plugins, il faudra que tu modifies les fichiers sources. Personnellement, j'inclue le _api_Win32.lib directement dans le projet, avec le code source. La compilation génère toujours plein de warning que j'ignore. Pour plus de précision il faudrait voir avec quelqu'un qui travail sur PC (J-L, Oli_D?), moi je connais beaucoup mieux Xcode que VC++.

Si tu as d'autres questions ou si ça n'est pas clair... :wink:

Floby
05/08/2008, 13h25
Si, c'est clair :) merci. En fait sans le savoir c'est ce que j'ai fait, il faut que je vérifie qu'il m'a bien compilé le _api_win32.lib .

Floby
06/08/2008, 00h51
Hourra, ça fonctionne ! :bounce: C'est beau la technologie quand même :love:
Enfin quand je dis "ça fonctionne", je parle de l'installation du SDK hein ^^. Maintenant il faut que je me tape tout le code. Par contre je perçois déjà le problème pour tout ce qui sera GUI, c'est que j'y pige rien comment qu'il font :nono:. déjà en COFFEE j'avais évité parce que je pigais pas tout, mais là je suis vraiment mal barré... Aller, je me forcerai :wip:

xs_yann
06/08/2008, 10h56
Tu as fais le plus dur, le reste c'est que du plaisir. :nono:

Pour la GUI dans la plupart des cas tu ne seras pas confronté aux CreateLayout() et autres. La GUI se définie dans des fichiers externe : un header (.h) où tu défini tes ID d'éléments du style :

FIRST_ELEMENT = 1000,
SECOND_ELEMENT,
THIRD_ELEMENT,
THIRD_ELEMENT_CHILD1 = 1, // Pour une combo box par exemple
THIRD_ELEMENT_CHILD2 = 2,
...

J'ai pour habitude de nommer mes éléments avec le nom du plug qui précède genre : XSSTAIRS_STEPOFFSET ou XSPRS_URL par exemple.

Ensuite tu as le fichier ressource (.res) où tu définie les propriétés et le type des éléments :

REAL FIRST_ELEMENT {UNIT METER; MINEX; MIN 1.0; }
BOOL SECOND_ELEMENT { }
LONG THIRD_ELEMENT
{
CYCLE
{
THIRD_ELEMENT_CHILD1;
THIRD_ELEMENT_CHILD2;
}
}
...

Puis vient le fichier str pour associer du texte aux éléments (leur nom) :

FIRST_ELEMENT "Un nombre";
SECOND_ELEMENT "Une checkbox";
THIRD_ELEMENT "Une combobox";
THIRD_ELEMENT_CHILD1 "Premier item";
THIRD_ELEMENT_CHILD2 "Second item";

Ce sont les trois fichiers les plus important, après pour les includes, les sécurités de doubles inclusions et les en-têtes de fichiers et autres, tu trouveras tout dans les exemples du sdk qui sont assez complet.

Tu verras, ça roule tout seul. :wink:

Floby
10/08/2008, 01h49
Coucou à tous !
Pour ceux qui s'inquiéteraient, ça avance, j'ai plutôt du mal avec les descriptions parce que je voudrais faire un bouton ajouter qui rajoute des lignes (et bien sûr des boutons remove). mais ça ne fonctionne pas trop pour la simple et bonne raison que je n'arrive pas à créer de bouton en dehors du fichier de description (directement dans le code quoi) j'ai ça :


BaseContainer ButtonAdd = GetCustomDataTypeDefault(DTYPE_BUTTON);
ButtonAdd.SetString(DESC_NAME, "Ajouter");
if(!description->SetParameter(DescLevel(PM_BUTTONADD), ButtonAdd, DescLevel(PM_GROUPCTRL_LIST))) return TRUE;


Mais ça ne fonctionne pas :cry:

sinon je vous poste une petit vidéo juste pour voir à quoi ressemble l'interface (juste l'interface, ya pas grand' chose d'autre qui marche ^^)

---- > C'est ici <---- (http://www.deltazone.org/~fc4d/autres/floby_DemoPoseMirror1.swf)

oli_d
10/08/2008, 09h00
Tu progresses à vitesse grand V, à la fin des vacances je suis sûr que c'est moi qui te demanderai des conseils !

Pour ma part j'ai déconnecté du C++ pendant les vacances, j'ai donc déjà beaucoup oublié !

Pour l'outil "Landpaint" j'avais tâtonné avec pas mal de peine les dialogues directement via le code sans fichier ".res". Je te mets à disposition le code qui fonctionne en 10.5 cette fois : http://campus.hesge.ch/eil/e-eil/od/landpaint/landpaint_r10.zip. Il y a deux classes une pour l'outil dérivée de la classe "ToolData" et l'autre pour le dialogue dérivée de la classe "SubDialog". Essaie déjà de regarder si tu comprends quelque chose, je verrai si je trouve un moment pour me replonger dans cet univers impitoyable pour te fournir des explications un peu plus claires et détaillées.

Bon courage !

kiteman
10/08/2008, 09h05
Coucou à tous !
Pour ceux qui s'inquiéteraient, ça avance, j'ai plutôt du mal avec les descriptions parce que je voudrais faire un bouton ajouter qui rajoute des lignes (et bien sûr des boutons remove). mais ça ne fonctionne pas trop pour la simple et bonne raison que je n'arrive pas à créer de bouton en dehors du fichier de description (directement dans le code quoi) j'ai ça :


BaseContainer ButtonAdd = GetCustomDataTypeDefault(DTYPE_BUTTON);
ButtonAdd.SetString(DESC_NAME, "Ajouter");
if(!description->SetParameter(DescLevel(PM_BUTTONADD), ButtonAdd, DescLevel(PM_GROUPCTRL_LIST))) return TRUE;


Mais ça ne fonctionne pas :cry:

sinon je vous poste une petit vidéo juste pour voir à quoi ressemble l'interface (juste l'interface, ya pas grand' chose d'autre qui marche ^^)

---- > C'est ici <---- (http://www.deltazone.org/~fc4d/autres/floby_DemoPoseMirror1.swf)


salut Floby :) , dis ? tu n'aurais pas un autre format de vidéo stp car j'arrive pas à voir ton .swf :(

kiteman
10/08/2008, 09h06
Pour l'outil "Landpaint" j'avais tâtonné avec pas mal de peine les dialogues directement via le code sans fichier ".res". Je te mets à disposition le code qui fonctionne en 10.5 cette fois : http://campus.hesge.ch/eil/e-eil/od/landpaint/landpaint_r10.zip. .



salut Oli_D , c'est quoi ton plugin exactement ? c'est un espèce de 'paint on surface' ?
:odile:

Floby
10/08/2008, 12h59
AH désolé Kiteman, j'ai fait ça avec Jing qui est un truc avec très peu de paramètres donc je sais pas quel version de flash il utilise, essaye une mise à jour du plugin, mais personnellement je n'y comprend pas grand chose à ces trucs, désolé.

Oli_D, Merci :poucehaut: je regarde ça tout de suite

oli_d
11/08/2008, 10h17
salut Oli_D , c'est quoi ton plugin exactement ? c'est un espèce de 'paint on surface' ?

Toutes les explications sont dans ce sujet au 8ème post : http://www.frenchcinema4d.fr/forum/index.php?topic=21966.0

Floby
11/08/2008, 15h33
Oyez Oyez, ça marche :bounce: ! ---> PETITE DEMO (http://www.deltazone.org/~fc4d/autres/floby_DemoPoseMirror2.swf)

Bon l'interface ne ressemble pas tout à fait à ce que je voulais ; mois de souplesse sur l'édition des liens vers les contrôleurs, surtout la suppression et le bouton de recherche auto par contrôleur que je voulais faire. Si seulement je savais comment créer les boutons avec le code, ou du moins pourquoi ça ne marche pas ^^ .

Ce qu'il reste à faire :

Prendre en compte le plan de réflexion, pour l'instant c'est seulement ZY.
Prendre en compte le bouton "gérer les couples de contrôleurs"
Faire la recherche auto :mrgreen:
Vérifier que le Copier/Coller fonctionne bien


@Kiteman : j'ai fait la vidéo avec Jing toujours, donc je pense que tu auras la même problème. Sinon indique moi avec quoi tu fais tes vidéos, gratuit si possible :)

kiteman
12/08/2008, 23h32
Oyez Oyez, ça marche :bounce: ! ---> PETITE DEMO (http://www.deltazone.org/~fc4d/autres/floby_DemoPoseMirror2.swf)


@Kiteman : j'ai fait la vidéo avec Jing toujours, donc je pense que tu auras la même problème. Sinon indique moi avec quoi tu fais tes vidéos, gratuit si possible :)


:cry2: :cry2: :cry2: ouep peux toujours pas voir ta vid :cry:

moi j'utilise Camtasia , mais c'est payant .

xs_yann
25/08/2008, 13h01
Salut,

Pour ajouter des éléments de GUI dynamiquement dans un plugin tag cela se fais dans la fonction GetDDescription();

Un petit exemple :



Bool FlobyPlugin::GetDDescription(GeListNode* node, Description* description, LONG& flags)
{
if (!description->LoadDescription(ID_FLOBYPLUGIN)) return FALSE;

BaseContainer descbc;

String name = "My button";
descbc.SetString(DESC_NAME, name);
descbc.SetString(DESC_SHORT_NAME, name);
descbc.SetLong(DESC_CUSTOMGUI, CUSTOMGUI_BUTTON);

DescID descid(DescLevel(5000, NULL, ID_FLOBYPLUGIN)); // Un id au pif
if (!description->SetParameter(descid, descbc, DescLevel(ID_TAGPROPERTIES)))return FALSE;
flags |= DESCFLAGS_DESC_LOADED;

return TRUE;
}



Va faire un tour dans le SDK à "Description", "DescID" et "DescLevel". Tu peux aussi tenter une recherche sur plugin cafe avec comme mot clé "GetDDescription", tu devrais trouver des infos.
Bon courage. :poucehaut:

Aurety
25/08/2008, 13h59
Excellent Floby ! :poucehaut:

kiteman
25/08/2008, 22h34
haa ayé j'ai enfin vu ton swf ! :) ouep excellent Floby :prie:

tu tient un bon truc là honnetement ! .. pauffine-le et tu vends ça 30 $ sur cgtalk et hop :wink: