Salut,
Suite à une petite discussion dans le forum programmation quant à la possibilité d'utiliser des UV différents dans un matériau, j'ai finalement décidé d'en faire un mini module gratuit, avec le code ouvert.
Voici Matière UV / UV Shader, une matière qui permet d'utiliser la projection UV d'une propriété Texture définie, et donc avoir un matériau utilisant plusieurs UV.
Il suffit de définir le nom de la propriété dans le champ Propriété Texture, et le module cherchera ses UV correspondants pour l'appliquer à la texture de la matière.
Disponible pour C4D R15+, Windows et OSX.
Télécharger : http://code.vonc.fr/?a=70
Je pense que ça servira surtout dans le cadre de la modélisation pour jeux vidéo où il est fréquent d'avoir une multitude d'UV qui se superposent, comme les plaquages d'illumination.
Dernière modification par César Vonc ; 28/05/2016 à 14h10.
merci César .
(marche pas avec R15/R16 ? )
J'ai fait le ménage et j'ai pas encore réinstallé mes anciennes versions de C4D, bientôt. : p
Woaaa Genial !
Ca c'est un truc qui manquait vraiment. Surtout quand tu t'y est habitué (c'est depuis toujours dans maya et max).
Merci oh Cesar
Oui, franchement je suis étonné que Maxon n'ait rien fait à ce sujet, depuis le temps. : /
Maintenant compatible R15, R16 et R17, pour Windows.
La version Mac arrivera un peu plus tard.
En C++ à ce que je comprend faut compiler pour chaque version?
En tout cas c'est cool des truc open source ! Énorme merci à toi.
SDK Specialist
MAXON Computer GmbH
Pas forcément, y a des chances qu'un module compilé sur une version antérieure fonctionne sur des versions plus récentes, ça dépend des fonctionnalités utilisées.
Dans ce cas là, j'aurais pu compiler en R15 uniquement, car le module compilé R15 fonctionne en R16 et R17, mais perso je pense qu'il vaut mieux coder sur les dernières version, histoire de ne pas être largué plus tard et pour que le module ait plus de chances de marcher dans les versions futures, puis éventuellement faire des versions antérieures si le code le permet et qu'il n'y ait pas trop de modifs à faire.
Pour ce module, j'ai compilé en R17, pour la R17, et en R15, pour la R15 et R16.
Opensource, certes, même si 50 % du code provient de l'exemple du BitmapShader du SDK, étant donné que le principe est similaire et que ma partie à moi est très brève en terme de lignes de code. : p
En tout cas j'espère que tu te lanceras dans le C++, les possibilités sont bien plsu grandes, même si c'est très chiant de jongler entre les versions et les plateformes !
Dernière modification par César Vonc ; 22/05/2016 à 21h18.
C'est indispensable !! J'espère la version Mac
Merci les amis, vous êtes beaux, forts.. et généreux.
kenavo !! // Pinterest KAMIGAZ®
Vitale! Une fois n'est pas coutume, merci et bravo
edit:
PS:
en espérant qu'une version mac se décante.
Dernière modification par shtl ; 24/05/2016 à 08h33.
2x6coreXéon2.66(24T);64Gram; GTX 1080; OSX10.13.6 ////
Mac Studio 128 Ram ; OSX 12.3.1 ; papiercrayoncerveau;S22Studio;Redshift;Zbrush2022; CS2022
///SHTL 2011 DEMO HERE : http://demo.shtl.org/ /// NEW! 2014 WIP
Bonjour César,
Y aura t’il une version R 14 ?
My Blog □ Accepter une possibilité, c'est lui permettre de se réaliser ...
Vérikoul !
Ce serait top si les UV supplémentaires pouvaient être identifiés comme UV 2 ou UV 3 par le plugin Octane...
"One cross each." (Monty Python, The life of Brian)
C4D 21 - Octane C4D plug - 3 x GTX980, 2 x RTX2070 - Intel i7 6850
Content que ça aide. ^^
Pas de version R14 prévue, désolé, mais le code source étant dispo, si quelqu'un a une R14 et veut tenter de le compiler, pourquoi pas. Je ferai une annonce générale sur CGSociety quand j'aurai fait les versions Mac, peut-être samedi prochain.
J'ai pas le module Octane sous la main mais y a pas de raison que ça ne marche pas dedans, à priori. : o
Dernière modification par César Vonc ; 23/05/2016 à 22h28.
Les détails font la perfection, et la perfection n'est pas un détail.http://yayaprodtm.cgsociety.org/
LdV.
C'est top César, mais moi aussi j'attends la version Mac
MacPro 12 cores - C4D R16 Studio - VrayForC4D - ZBrush4.
L'urgent est déjà parti, l'impossible est en train de se faire, pour les miracles nous demandons 24 heures.
A l'an qué vein.
J'ai une R13 qui traîne, ton code est compatible r13?
Je préfère demander plutôt que de me lancer dans un truc qui va me mettre 10h ^^
Si oui alors ça me dérange pas de la compiler pour la R13
Pour le C++ je m'y mettrais quand j'en aurais vraiment l'utilité actuellement je suis plus un bidouilleur qu'autre chose, ça se saurais si je faisais des choses sérieuses voyons ^^.
SDK Specialist
MAXON Computer GmbH
Version Mac disponible pour R15 à R17 !
Aucune idée pour la compatibilité, mais si t'as jamais fait de C ni de C++, alors tu risques peut-être de galérer un moment si jamais le code n'est pas compatible. ^^
Enfin, la première fois que j'ai compilé sur la R13 j'ai eu une quantité incroyable de problèmes, heureusement que Val était là pour m'aider.
T'embête pas, c'est déjà pas mal d'avoir une version aussi vieille que la R15.
On pourrait peut-être s'organiser pour se partager des machines virtuelles Windows et OSX prêtes à compiler pour toutes versions de C4D, mais ce serait moyennement légal sur un forum, je pense.
Dernière modification par César Vonc ; 28/05/2016 à 13h56.
Pour répondre à la question "pourquoi la r15" (puisque certains doivent s'interroger)
La r15 a apporté beaucoup de modification dans le SDK notamment sur le changement de nom de type de données
Sachant qu'il y a régulièrement des modifications dans le SDK, il n'est pas rare de devoir écrire des parties de code en double suivant la version. (voir triple)
C'est déjà beaucoup de boulot, donc pour réduire on limite la compatibilité.
Pour ce qui est de la machine virtuelle c'est surtout au niveau de l'OS que la légalité vas poser problème. Pour cinema4D il me semble que la version démo suffit pour compiler un plugin.
Oui d'ailleurs j'ai remarqué une légère différence entre la R17 et la R15 au niveau du RayObject :
Dans la R17 cd->vd->op est un const RayObject*, or dans la R15, c'est un RayObject*, c'est pas grand chose, certes !
Au fait, quelqu'un pourrait-il me confirmer que le module fonctionne avec Octane (version intégrée à c4d) ?
"One cross each." (Monty Python, The life of Brian)
C4D 21 - Octane C4D plug - 3 x GTX980, 2 x RTX2070 - Intel i7 6850
Pas impossible que ça ne fonctionne pas, je n'ai pas essayé de mon côté car je n'ai pas le module Octane, donc si tu me dis que ça ne marche pas, je te crois. ^^
Dommage, ceci dit, j'ai bien peur de ne rien pouvoir y faire.
Ça ne fonctionne pas de mon coté non plus avec Octane 2.25 et R15.
Mais ca parait plutôt normal vu que même les shaders standard de c4d ne fonctionnent pas tous.
Il faudrait peut être faire une petite requête à Aoktar, histoire que si des fois ça serait pas trop compliqué il fasse qu'octane voit le plug, parce que là pour le coup c'est vraiment dommage.
Sinon une question au passage. Ça serait pas plus logique de renseigner directement les tag UVW dans le champ du tag ?
Bon, mais je suppose que si t'as fait comme ça, il y a une bonne raison.
Faut voir, faudrait que les matériaux du module Octane soit plus compatible avec plus d'effets de C4D. Est-ce que, par exemple, les effets de transformation / distorsion de la matière Calques fonctionne dans Octane ?
C'est ce que j'avais fait au début, oui, mais ça posait problème car lors du rendu, les propriétés UVW non utilisées par une propriété Texture sont tout simplement ignorées et donc inaccessibles si on veut les récupérer ses coordonnées UV dans un matériau.Sinon une question au passage. Ça serait pas plus logique de renseigner directement les tag UVW dans le champ du tag ?
Bon, mais je suppose que si t'as fait comme ça, il y a une bonne raison.
http://www.plugincafe.com/forum/foru...ID=44895#44895Envoyé par S. Bach, un dev de C4D
Donc pour que la propriété UVW ne soit pas ignorée, il faut forcément la lier à une propriété Texture. Et pour rendre ça obligatoire de mon côté, j'ai donc utilisé la propriété Texture comme moyen de renseigner l'UV à choisir.
Remarque, on peut comme ça utiliser ses propriétés, comme la répétition, la taille, et même d'autres modes de projection que UVW (même si ce dernier point était déjà possible avec la matière Projection).
Voilà pour la petite histoire.
Dernière modification par César Vonc ; 30/05/2016 à 22h45.
Petite question offTopic y'a t'il moyen de récupérer le link du BaseMaterial quand on à un BaseShader(je sais qu'avec un getMain() on obtient le material mais pas le link)
Quand je dis link je veux dire par exemple [c4d.MATERIAL_COLOR_SHADER]?
Effectivement j'avais oublié le changement de la R15 héhé faut dire que je suis un tout nouveau moi :p
Pour ce qui est de windows je sais qu'un moment on pouvais téléchargé windows gratuitement, mais bien sur celui-ci n'étais pas activé. Ceci pourrais être une solution? A voir si cela existe toujours, je crosi que depuis win 8.1 même pour télécharger un .iso il faut une clé CD :/
Dernière modification par gr4ph0s ; 31/05/2016 à 00h14.
SDK Specialist
MAXON Computer GmbH
Oui. A condition d'utiliser un shader "imageTexture" d'octane et pas le shader bitmap de c4d. Mais de toute façon les layers ne fonctionnes avec des images qu'a cette condition.
Du coup j'ai quand même tenté matiereUV uniquement avec Matériau et shader Octane mais pas concluant non plus.
L'effet projector ne fonctionne pas non plus, mais ce n'est pas très étonnant vu qu'il a fait un module équivalent.
Sa tombe bien j'ai justement fait un script pour convertir tout les bitmap C4D en imageTexture des materiaux selectionné!
Bon pour le moment ça fonctionne que si les noeud d'image est connecté directement au material (par exemple un bitmap => color correction => material ne fonctionnera pas).
D'où ma question dans mon post d'avant ça éviterais de faire ces checks un peu fastidieux :p !Code:import c4d #-- Gr4ph0s # visit graphos.fr def getEntry(mat): buffer = [] try : diffuse = mat[c4d.OCT_MATERIAL_DIFFUSE_LINK] if diffuse.CheckType(5833): buffer.append([1,diffuse[c4d.BITMAPSHADER_FILENAME]]) except: pass try : roughness = mat[c4d.OCT_MATERIAL_ROUGHNESS_LINK] if roughness.CheckType(5833): buffer.append([2,roughness[c4d.BITMAPSHADER_FILENAME]]) except: pass try : bump = mat[c4d.OCT_MATERIAL_BUMP_LINK] if bump.CheckType(5833): buffer.append([3,bump[c4d.BITMAPSHADER_FILENAME]]) except: pass try : normal = mat[c4d.OCT_MATERIAL_NORMAL_LINK] if normal.CheckType(5833): buffer.append([4,normal[c4d.BITMAPSHADER_FILENAME]]) except: pass try : displace = mat[c4d.OCT_MATERIAL_DISPLACEMENT_LINK] if displace.CheckType(5833): buffer.append([5,displace[c4d.BITMAPSHADER_FILENAME]]) except: pass try : opacity = mat[c4d.OCT_MATERIAL_OPACITY_LINK] if opacity.CheckType(5833): buffer.append([6,opacity[c4d.BITMAPSHADER_FILENAME]]) except: pass try : transmission = mat[c4d.OCT_MATERIAL_TRANSMISSION_LINK] if transmission.CheckType(5833): buffer.append([7,transmission[c4d.BITMAPSHADER_FILENAME]]) except: pass try : emission = mat[c4d.OCT_MATERIAL_EMISSION] if emission.CheckType(5833): buffer.append([8,emission[c4d.BITMAPSHADER_FILENAME]]) except: pass try : medium = mat[c4d.OCT_MATERIAL_MEDIUM] if medium.CheckType(5833): buffer.append([9,medium[c4d.BITMAPSHADER_FILENAME]]) except: pass try : specular = mat[c4d.OCT_MATERIAL_SPECULAR_LINK] if medium.CheckType(5833): buffer.append([10,specular[c4d.BITMAPSHADER_FILENAME]]) except: pass try : filmwidth = mat[c4d.OCT_MATERIAL_FILMWIDTH_LINK] if filmwidth.CheckType(5833): buffer.append([11,filmwidth[c4d.BITMAPSHADER_FILENAME]]) except: pass try : reflection = mat[c4d.OCT_MATERIAL_REFLECTION_LINK] if reflection.CheckType(5833): buffer.append([12,reflection[c4d.BITMAPSHADER_FILENAME]]) except: pass return buffer def remplaceEntry(mat,data): for i in xrange(0,len(data)): id = data[i][0] imageTexture = c4d.BaseShader(1029508) if id == 1: path = mat[c4d.OCT_MATERIAL_DIFFUSE_LINK][c4d.BITMAPSHADER_FILENAME] imageTexture[c4d.IMAGETEXTURE_FILE] = path mat[c4d.OCT_MATERIAL_DIFFUSE_LINK] = imageTexture if id == 2: path = mat[c4d.OCT_MATERIAL_ROUGHNESS_LINK][c4d.BITMAPSHADER_FILENAME] imageTexture[c4d.IMAGETEXTURE_FILE] = path mat[c4d.OCT_MATERIAL_ROUGHNESS_LINK] = imageTexture if id == 3: path = mat[c4d.OCT_MATERIAL_BUMP_LINK][c4d.BITMAPSHADER_FILENAME] imageTexture[c4d.IMAGETEXTURE_FILE] = path mat[c4d.OCT_MATERIAL_BUMP_LINK] = imageTexture if id == 4: path = mat[c4d.OCT_MATERIAL_NORMAL_LINK][c4d.BITMAPSHADER_FILENAME] imageTexture[c4d.IMAGETEXTURE_FILE] = path mat[c4d.OCT_MATERIAL_NORMAL_LINK] = imageTexture if id == 5: path = mat[c4d.OCT_MATERIAL_DISPLACEMENT_LINK][c4d.BITMAPSHADER_FILENAME] imageTexture[c4d.IMAGETEXTURE_FILE] = path mat[c4d.OCT_MATERIAL_DISPLACEMENT_LINK] = imageTexture if id == 6: path = mat[c4d.OCT_MATERIAL_OPACITY_LINK][c4d.BITMAPSHADER_FILENAME] imageTexture[c4d.IMAGETEXTURE_FILE] = path mat[c4d.OCT_MATERIAL_OPACITY_LINK] = imageTexture if id == 7: path = mat[c4d.OCT_MATERIAL_TRANSMISSION_LINK][c4d.BITMAPSHADER_FILENAME] imageTexture[c4d.IMAGETEXTURE_FILE] = path mat[c4d.OCT_MATERIAL_TRANSMISSION_LINK] = imageTexture if id == 8: path = mat[c4d.OCT_MATERIAL_EMISSION][c4d.BITMAPSHADER_FILENAME] imageTexture[c4d.IMAGETEXTURE_FILE] = path mat[c4d.OCT_MATERIAL_EMISSION] = imageTexture if id == 9: path = mat[c4d.OCT_MATERIAL_MEDIUM][c4d.BITMAPSHADER_FILENAME] imageTexture[c4d.IMAGETEXTURE_FILE] = path mat[c4d.OCT_MATERIAL_MEDIUM] = imageTexture if id == 10: path = mat[c4d.OCT_MATERIAL_SPECULAR_LINK][c4d.BITMAPSHADER_FILENAME] imageTexture[c4d.IMAGETEXTURE_FILE] = path mat[c4d.OCT_MATERIAL_SPECULAR_LINK] = imageTexture if id == 11: path = mat[c4d.OCT_MATERIAL_FILMWIDTH_LINK][c4d.BITMAPSHADER_FILENAME] imageTexture[c4d.IMAGETEXTURE_FILE] = path mat[c4d.OCT_MATERIAL_FILMWIDTH_LINK] = imageTexture if id == 12: path = mat[c4d.OCT_MATERIAL_REFLECTION_LINK][c4d.BITMAPSHADER_FILENAME] imageTexture[c4d.IMAGETEXTURE_FILE] = path mat[c4d.OCT_MATERIAL_REFLECTION_LINK] = imageTexture mat.InsertShader(imageTexture ) mat.Message(c4d.MSG_UPDATE) mat.Update(True, True) def main(): allMat = doc.GetActiveMaterials() for mat in allMat: data = getEntry(mat) remplaceEntry(mat,data) mat = mat.GetNext() c4d.EventAdd() if __name__=='__main__': main()
Dernière modification par gr4ph0s ; 31/05/2016 à 01h17.
SDK Specialist
MAXON Computer GmbH