PDA

Voir la version complète : Insérer un matériau avec texture par Py4d



miro
07/10/2010, 09h52
Re-bonjour à tous,

Je proposer de continuer le fil de la question que j'avais posée dans le bac à sable ici, si les modos n'y voyent pas d'inconvénient.
Il s'agit de créer un matériau avec une texture chargée à partir d'un fichier en utilisant Py4D.
Valkaari a proposé le code coffee suivant comme point de départ:


myShader = AllocMaterial(Mmaterial);
doc->InsertMaterial(myShader,firstMaterial);

// Set the transparency to on

myShader->SetChannelState(CHANNEL_COLOR,FALSE);
myShader->SetChannelState(CHANNEL_TRANSPARENCY,TRUE);
myShader->SetChannelState(CHANNEL_SPECULAR,FALSE);

// set the texture to it

var trans = myShader->GetChannel(CHANNEL_TRANSPARENCY);
var transBC = trans->GetContainer();
var pathtofile = op#ID_USERDATA:8->GetFullString();
transBC->SetData(CH_TEXTURE,pathtofile);
trans->SetContainer(transBC);


Or, il m'est impossible de récupérer un objet de type Channel en python, la fonction GetChannel est bien présente dans le header de BaseMaterial, mais elle ne semble pas avoir été transposée de Coffee en python. Je précise que la création d'un nouveau matériau, ainsi que le linkage avec un objet joue, je n'arrive "simplement" pas à accéder au chemin d'accès pour charger une texture en code python :(
Merci d'avance si quelqu'un a une idée ou une solution,

Bonne journée
Miro

xs_yann
07/10/2010, 11h47
Or, il m'est impossible de récupérer un objet de type Channel en python
Pas besoin de récupérer un Channel, il faut créer un shader (BaseList2D), puis l'insérer dans ton mat avec la méthode InsertShader.


la fonction GetChannel est bien présente dans le header de BaseMaterial
?


mais elle ne semble pas avoir été transposée de Coffee en python
Py4D n'est pas transcris du COFFEE (COFFEE est bien moins complet), base toi sur le SDK C++ plutôt.


Le tag Texture semble être de type BaseList2D, mais de ce côté là, je n'ai rien trouvé de concluant. Je pencherai pour croire qu'il s'agisse enfaite d'une classe fille
Bien vu, le tag texture est de type TextureTag qui hérite de BaseTag qui, lui-même, hérite directement de BaseList2D.


apparemment, py4d a parfois de petits problèmes à reconnaitre la hiérarchie d'héritage dans ses classes
Peux-tu développer ?

Voici le code pour créer un matériau avec un shader bitmap dans la couleur :


mat = c4d.BaseMaterial(c4d.Mmaterial)
doc.InsertMaterial(mat)
shd = c4d.BaseList2D(c4d.Xbitmap)
shd[c4d.BITMAPSHADER_FILENAME] = "/Users/xsyann/Desktop/myimage.tif"
mat[c4d.MATERIAL_COLOR_SHADER] = shd
mat.InsertShader(shd)
mat.Message(c4d.MSG_UPDATE)
mat.Update(True, True)


Pour insérer un texture tag :


tag = c4d.BaseTag(c4d.Ttexture)
tag[c4d.TEXTURETAG_MATERIAL] = mat
op.InsertTag(tag)


ou mieux :



tag = c4d.TextureTag()
tag.SetMaterial(doc.GetFirstMaterial())
op.InsertTag(tag)


Bienvenue a toi. ;)

miro
07/10/2010, 12h03
Pour les headers, je parlais de ceux présents dans la lib de Py4d, mais ce sont des .h du C, donc probablement plus indicatifs.
Pour la question d'héritage, je suis moins au jours avec Python qu'en C++ notamment en ce qui concerne le polymorphisme, mais je reçoit régulièrement des erreur disant qu'il s'attend à un argument de type de la classe mère alors qu'il reçoit une fille en param.
Le côté stricte et un peu chiant du C/C++ à parfois du bon avec un typage fort :cursing:
Sinon j'ai oublié de préciser que j'étais encore sous C4D 11.5, et la fonction InsertShader n'est malheuresement pas encore présente...
Ceci dit, j'aurais cru qu'elle avait une utilité semblable à


mat[c4d.MATERIAL_COLOR_SHADER] = shd

Mais apparemment, sans cette ligne, le matériau se crée, mais n'arrive pas à charger la texture :(
En tout cas merci beaucoup pour l'aide et pour l'accueil.
Bon appétit à tous,
Miro

miro
08/10/2010, 11h44
Des petites nouvelles,

J'en suis au point suivant:
Le matériau est crée, le shader contenant la texture est bien ajouté au matériau, en checkant avec des print, je peux confirmer qu'il contient bien le chemin d'accès au fichier de la texture dans le XBitmap (c4d.BaseList2D(c4d.XBitmap).
Le seul hic (hic hoc:D) c'est que apparemment, le joyeux matériau s'en contre-fiche et continue sa vie tout gris.
En effet, la fonction InsertShader() agirait donc comme un update du matériau, qu'un simple c4d.EventAdd() ne peut apeller.
Si quelqu'un a une idée un peu plus précise sur le comment agit cette fonction, il y aurait peut être moyen de la bidouiller à la main en R11.5.
Je me doute bien que vous me direz de simplement de passer à la R12, mais la boîte où je suis ne l'a pas prévu pour tout de suite^^.

Amicalement,

Miro