PDA

Voir la version complète : Exploration du SDK C++



oli_d
06/05/2008, 22h37
Je me permets d'ouvrir un autre fil pour vous présenter mes explorations du c++.

J'ai commencé le COFFEE en essayant de faire une maison paramétrique que je n'ai jamais vraiment terminée, et j'ai décidé de remettre ça mais en C++ cette fois (mais cette fois je terminerai !).

J'ai testé surtout l'interaction avec les poignées, et la mise en place de l'interface dans les attributs d'objet.

Un grand merci à xs-yann qui m'a conseillé le site du zéro pour apprendre le c++ (http://www.siteduzero.com/) qui est vraiment exceptionnellement clair et bien fait, et pour le tuto de astrofish (http://www.astrofish.com/tutorials/c4dtagplugin/index.html) qui apprend à se retrouver dans la jungle des fichiers de l'exemple du sdk. Et surtout merci pour ses premières explorations sur ce site qui m'ont aidé à déchiffrer mes premières lignes de code sur c++.

C'est vrai que le C++ est plus compliqué que le COFFEE, mais les possibilités de développement sont beaucoup plus vastes. De plus la documentation est vraiment mieux faite et surtout régulièrement mise à jour.

Voici donc mon premier essai de maison paramétrique :Télécharger le fichier (http://campus.hesge.ch/eil/e-eil/od/maison.zip)
(à mettre dans le dossier plugin une fois dézippé, je pense que cela doit marcher que sur windows, je n'ai malheureusement pas de mac pour tester)

Je mets à disposition le code source : Télécharger le fichier (http://campus.hesge.ch/eil/e-eil/od/Maison_source.zip) (attention près de 7Mo !) si un c++ man que je ne citerai pas mais dont le nom commence par" xs" et fini par" yann" pouvait tester de compiler pour mac, cela m'intéresserait de savoir si cela peut fonctionner.

Je n'ai pas vraiment commenté le code et j'ai surtout laissé plein de reste du code original du SDK, c'est donc un peu le bordel.

Ne tentez pas d'utiliser les champs sous l'onglet "lucarnes" ils ne servent encore à rien (cela viendra)

edit : attention les dimensions de la maison par défaut sont assez importantes (je travaille souvent en cm) , voilà ce que cela devrait donner en zoomant en arrière

http://campus.hesge.ch/eil/e-eil/od/maison.jpg

oli_d
13/06/2008, 12h39
Je continue mes explorations du SDK en essayant de réaliser ce qu'avait déjà commencé xs_yann, un outil pour "peindre" des objets sur un terrain, à l'image de ce que l'on trouve dans Vue ou dans Maya.

http://campus.hesge.ch/eil/e-eil/od/landpaint.jpg

Le principe c'est que l'outil peint des instances sur un terrain et choisi de façon aléatoire la référence dans le contenu d'un null source.

Ca commence à très bien marcher, j'ai utilisé la librairie "Collider library" pour plaquer les objets sur le terrain, qui calcule les collisions entre un rayon et un objet polygonal (class GeRayCollider) de façon extrêmement rapide.

Par contre je butte sur un problème, c'est que je n'arrive pas à récupérer les données de l'interface de mon outil dans la classe qui génère les objets :coup:. J'ai regardé sur plugin café, mais en vain.

En fait je m'adresse surtout à xs-yann (à moins qu'il y ait d'autres adeptes du SDK C++) si par hasard il avait une réponse ou un début de piste.

Dès que j'aurai réglé ces derniers détails je mettrai à disposition l'outil et le code.

xs_yann
13/06/2008, 13h03
Super Oli_D :prie:



Par contre je butte sur un problème, c'est que je n'arrive pas à récupérer les données de l'interface de mon outil dans la classe qui génère les objets :coup:. J'ai regardé sur plugin café, mais en vain.

En fait je m'adresse surtout à xs-yann (à moins qu'il y ait d'autres adeptes du SDK C++) si par hasard il avait une réponse ou un début de piste.

Dès que j'aurai réglé ces derniers détails je mettrai à disposition l'outil et le code.


J'ai eu le même problème, j'ai adopté une solution provisoire peu propre (je crois que c'était en variables globales). On doit pouvoir réussir à faire quelque chose en gardant un pointeur sur la classe de l'interface dans la classe du corps du plug, à voir...

Je ne connaissais pas GeRayCollider, il va falloir que je regarde. :prie:

En revanche pour compiler ta maison j'ai plein d'erreurs (une quinzaine) notamment au niveau des GetPoint() et des GetPolygon() qui sont des fonctions qui n'existent pas en C++ (c'est soit GetPointR soit GetPointW).

En tout cas merci, je crois que je vais apprendre plein de trucs. :love:

oli_d
13/06/2008, 15h14
J'ai eu le même problème, j'ai adopté une solution provisoire peu propre (je crois que c'était en variables globales)

J'étais près aussi à céder aux variables globales, mais on m'a dit que c'était vraiment très mal !


On doit pouvoir réussir à faire quelque chose en gardant un pointeur sur la classe de l'interface dans la classe du corps du plug, à voir...

J'ai essayé par cette voie, mais je ne suis de loin pas encore le roi du pointeur, par contre faire planter C4D ça j'arrive bien ! :nono: Je vais continuer mes essais.


En revanche pour compiler ta maison j'ai plein d'erreurs (une quinzaine) .

C'est bizarre, j'ai réessayé chez moi avec VC++ et cela fonctionne.


au niveau des GetPoint() et des GetPolygon() qui sont des fonctions qui n'existent pas en C++ (c'est soit GetPointR soit GetPointW)

c'est vrai que GetPoint n'est pas dans la doc, mais dans la fonction existe bien dans la classe PointObject du fichier c4d_baseobject.h (Vector *GetPoint(void) { return (Vector*)GetTagData(Tpoint); ) En fait je crois que ces GetPoint viennent directement du code du RoundedTube.

EDIT : en fait j'étais dans la R.9 c'est vrai que GetPoint a disparu dans la R10.5 !!!! C'est un peu bizarre et pas top pour les programmeurs qu'ils se permettent de supprimer des fonctions d'une classe d'une version à l'autre !

En tous cas merci d'avoir répondu aussi vite, je continue ma torture mentale et je te tiens au courant

Steph3D ::.
14/06/2008, 17h53
Ouaip, j'avais fini par remarquer au bout de 3 jours que c'était surtout ton code qui était incompatible avec la 10.5, et non pas le SDK :twisted: Par ce que maintenant, j'arrive très bien à compiler le SDK de la 10.5 avec le dernier VC++ :poucehaut:
S'il y en a qui ont encore des problèmes ? ce n’est pas sorcier à compiler... une fois qu'on avance avec le C++ :roll:

Enfin, pour le moment je me fais les dents à faire des interfaces windaube avec le génial frameworks Qt :bave: avant d'attaquer le sdk de C4D :coup:

xs_yann
14/06/2008, 19h46
Enfin, pour le moment je me fais les dents à faire des interfaces windaube avec le génial frameworks Qt :bave: avant d'attaquer le sdk de C4D :coup:


Miam, très bon Qt... :bave:

oli_d
17/06/2008, 14h09
j'avais fini par remarquer au bout de 3 jours que c'était surtout ton code qui était incompatible avec la 10.5, et non pas le SDK Twisted Evil

:oops: :oops: :oops: désolé pour le temps perdu mais j'ai quand-même fini par découvrir mon erreur, en fait j'ai d'abord bidouillé en r9 puis j'ai écrasé le cinema4DSDK de la r10 . C'est pour cela que cela ne marchait pas, il faudra que je réessaye avec le bon projet après réinstallation (j'ai pas les disques sous la main pour l'instant).

Mais content de voir qu'on est plusieurs à se lancer dans ce SDK, ça motive et une fois que l'on comprend les principes cela ouvre des possibilités vertigineuses.

Pour l'application "LandPaint", je suis en train de résoudre mon problème en passant par "GetToolData" que j'initialise dans la classe du dialogue et je récupère dans la classe de l'outil. Je me bat encore un peu avec les "link" mais je suis en train de gagner!

J'ai quelques jours de convalescence devant moi (j'ai eu une opération de l'appendicite ce week-end) je vais enfin avoir un peu de temps pour coder !

oli_d
18/06/2008, 10h29
Voici donc comme promis la version 0 de "LandPaint"

Télécharger le plugin (http://campus.hesge.ch/eil/e-eil/od/landpaint/landpaint.zip) (dossier à insérer une fois dézippé dans le dossier plugin de C4D).

Utilisation :


Préparez une scène avec un terrain converti en objet polygonal et un null avec des sous-objets à duppliquer

http://campus.hesge.ch/eil/e-eil/od/landpaint/prepa.jpg

Sélectionnez l'outil Landpaint dans le menu Plugins
Dragandroppez le terrain dans "Objet polygonal cible"
Sélectionnez le dossier contenant les objet à "peindre"
Peignez dans la vue de dessus (dans les autres vues l'outils ne fonctionne pas encore)


http://campus.hesge.ch/eil/e-eil/od/landpaint/parametres.jpg

et hop !

http://campus.hesge.ch/eil/e-eil/od/landpaint/resultat.jpg


Paramètres :

http://campus.hesge.ch/eil/e-eil/od/landpaint/parametres.jpg


Enfant aléatoire : si coché prend au hasard un enfant du premier niveau de l'objet sélectionné comme source des instances, sinon prend l'objet sélectionné
Objet polygonal cible : objet sur leque seront "peints" les objets (ATTENTION doit être un objet polygonal!)
Y-Rotation : pour tourner aléatoirement selon l'angle choisi les objet sur l'axe y (0 = pas de rotation)
Echelles : mise à l'échelle des instances aléatoirement entre min et max si conserver les proportions est coché l'échelle dans les trois axes est la même sinon elle peut être différente


Retours, propositions d'amélioration, bienvenus...

xs_yann
18/06/2008, 11h10
:prie: :prie: :prie:

Tu devrais pouvoir contourner le fait qu'il faille un objet polygonal avec une fonction dans ce style :



PointObject *CurrentStateToObject(BaseDocument *doc, BaseObject *op) {
BaseObject *clone = static_cast<BaseObject*>(op->GetClone(COPY_NO_BITS,NULL));
ModelingCommandData cd;
cd.doc = GetActiveDocument();
cd.op = clone;
cd.mode = MODIFY_ALL;
if (!SendModelingCommand(MCOMMAND_CURRENTSTATETOOBJEC T, cd)) return FALSE;
PointObject *ret = static_cast<PointObject*>((BaseObject*)((cd.result)->GetIndex(0)));
ret->SetMg(op->GetMg());
return ret;
}


Bon courage :bounce:

(oublie pas de faire une belle icone :bave:)

Rink
18/06/2008, 20h20
:prie: :prie:
OOoo j'attendais ça avec impatience,
beau boulot Oli_D

merci merci

Ps ZUT uniquement pour la v9
En 10,5 ça passe pas, il manque un .dylib.....

lenogre
18/06/2008, 22h05
Pas encore essayé mais ça a l'air fameux !

GaazMaster
18/06/2008, 22h32
Je viens d'essayer et c'est plus que fameux !! :shock: :prie:
Et surtout plein d'applications possibles.

Chapeau bas Oli_D

Adopté.

bob leponge
19/06/2008, 00h01
Je viens d'essayer et c'est plus que fameux !! :shock: :prie:
Et surtout plein d'applications possibles.

Chapeau bas Oli_D

Adopté.


Pareil :wink:

oli_d
19/06/2008, 08h33
Merci à tous pour les encouragements et surtout merci particulièrement à xs-yann qui m'a permis de faire le grand saut dans le SDK,


Tu devrais pouvoir contourner le fait qu'il faille un objet polygonal avec une fonction dans ce style :

J'avais déjà essayé dans cette voie sans trop de réussite, je m'y remets dès que possible

Je te joins les codes sources qui ne doivent pas passer sur la 10.5 mais tu pourras regarder la partie GeRayCollider si ça peut t'aider et surtout si tu t'y retrouves dans mon code un peu bordélique ! ( Code source (http://campus.hesge.ch/eil/e-eil/od/landpaint/landpaint_source.zip))


oublie pas de faire une belle icone

Dès la version 1.0... (j'ai simplement pour l'instant l'icone du liquid paint tool du SDK outil sur lequel j'ai basé tout mon code)


ZUT uniquement pour la v9
En 10,5 ça passe pas, il manque un .dylib.....

J'ai testé su PC normalement ça passe, sur Mac je ne pense pas. En fait j'ai compilé via la r9, parce que j'ai encore des petits problèmes depuis la r10.5, mais il tourne sur la 10.5 (ne pas oublier de sélectionner un objet à peindre et de mettre un objet polygonal en cible)

Dès que j'aurai remis de l'ordre je tenterai d'adapter le code pour la 10.5 et peut-être que xs-yann pourra le compiler pour Mac. (ou sinon je demande à ma femme un Mac pour mon anniversaire, mais là j'ai un peu peur que cela soit un plan foireux !)

N'hésitez pas à proposer des améliorations, pour ma part je vais déjà faire que l'on puisse peindre des instances qui pointent vers la caméra pour créer facilement des bilboards d'arbres ou de végétation et que l'on puisse peindre également sur des objets paramétriques.

xander
01/10/2008, 22h11
merci pour ce plug :D

vesale
01/10/2008, 22h59
joli, je pense que cela va plair a pas mal de monde... çà marche avec tout les types d'objets ou seulement des terrains? je demande au cas ou si je pense par exemple a un sol plat composé d'un seul plan... :calim:

oli_d
07/10/2008, 20h49
Oups j'ai loupé la question. En fait cela ne marche pas (encore) sur un terrain mais seulement sur un objet polygonal (donc non paramétrique) et seulement en vue dessus (pour l'instant !).

J'ai un peu laché le C++ depuis les vacances par manque de temps, mais je me suis remis au Coffee ce week-end, je posterai mes avancées dans la modélisation du territoire prochainement.