PDA

Voir la version complète : Vonc Matière UV



César Vonc
22/05/2016, 17h05
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.


http://code.vonc.fr/details/70/image_01a.png (http://code.vonc.fr/details/70/image_01a.png)

clemz
22/05/2016, 17h55
merci César :) .

(marche pas avec R15/R16 ? )

César Vonc
22/05/2016, 18h11
J'ai fait le ménage et j'ai pas encore réinstallé mes anciennes versions de C4D, bientôt. : p

Floc
22/05/2016, 18h49
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:icon_prie:

César Vonc
22/05/2016, 21h49
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.

gr4ph0s
22/05/2016, 21h57
En C++ à ce que je comprend faut compiler pour chaque version?

En tout cas c'est cool des truc open source ! Énorme merci à toi.

César Vonc
22/05/2016, 22h06
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 !

Aurety
22/05/2016, 23h55
C'est indispensable !! J'espère la version Mac :icon_bave:
Merci les amis, vous êtes beaux, forts.. et généreux. :icon_love:

shtl
23/05/2016, 00h09
Vitale! Une fois n'est pas coutume, merci et bravo :icon_prie:

edit:
PS:
en espérant qu'une version mac se décante. ;)

Rudy
23/05/2016, 14h24
Bonjour César,

Y aura t’il une version R 14 ?

atome451
23/05/2016, 19h28
Vérikoul ! :icon_smile:

Ce serait top si les UV supplémentaires pouvaient être identifiés comme UV 2 ou UV 3 par le plugin Octane... :whistling:

user4D
23/05/2016, 20h10
C'est nul :icon_mrgreen:

:thumbup1:

César Vonc
23/05/2016, 23h21
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

yayaprod
24/05/2016, 09h35
:kiss::icon_clap:

Luc
24/05/2016, 19h32
:icon_love: C'est top César, mais moi aussi j'attends la version Mac :icon_mrgreen:

gr4ph0s
24/05/2016, 21h03
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 ^^.

César Vonc
28/05/2016, 14h54
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. :whistling:


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.

valkaari
29/05/2016, 02h57
Pour répondre à la question "pourquoi la r15" (puisque certains doivent s'interroger)

La r15 a apporté beaucoup de modification dans le SDK (https://developers.maxon.net/docs/Cinema4DCPPSDK/html/page_transition_to_r15_api.html) notamment sur le changement de nom de type de données (https://developers.maxon.net/docs/Cinema4DCPPSDK/html/page_list_of_name_changes_in_r15_api.html)

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.

César Vonc
30/05/2016, 19h12
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) ?

atome451
30/05/2016, 20h43
Au fait, quelqu'un pourrait-il me confirmer que le module fonctionne avec Octane (version intégrée à c4d) ?

J'arrive à le faire fonctionner sans problème avec le moteur de C4D mais avec Octane, rien à faire... du moins avec la version 3 et le Live viewer. Je ne dois pas m'y prendre comme il faut. :blush:

César Vonc
30/05/2016, 20h49
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.

Floc
30/05/2016, 21h32
Ç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é :whistling: 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.

César Vonc
30/05/2016, 23h33
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 ?


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.

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.


In Cinema 4D you can assign multiple UVW tags to an object. But the data you get from the VolumeData object is only the data relevant for rendering.So you can add multiple UVW tags but using VolumeData and RayObject you can only access the UVW data that is actually used by a material; UVW data not used by a material is ignored.
http://www.plugincafe.com/forum/forum_posts.asp?TID=11351&PID=44895#44895


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. :P

gr4ph0s
30/05/2016, 23h54
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 :/

Floc
31/05/2016, 01h46
Est-ce que, par exemple, les effets de transformation / distorsion de la matière Calques fonctionne dans Octane ?

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.

gr4ph0s
31/05/2016, 02h10
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.

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).


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()


D'où ma question dans mon post d'avant ça éviterais de faire ces checks un peu fastidieux :p ! ;)