PDA

Voir la version complète : Rendu de la couleur des calques



shtl
14/09/2010, 17h20
Hello.
C'est possible? J'y arrive pas... :blushing:

valkaari
15/09/2010, 09h18
C'est une bonne question, merci de l'avoir posée.

shtl
15/09/2010, 09h41
:(

Seb-bbl
15/09/2010, 09h56
Même pas compris la question.

Huv
15/09/2010, 10h03
Même pas compris la question.

C'est une bonne reponse, merci de l'avoir soumise :biggrin:
Tout pareil :blushing:

Orbi
15/09/2010, 10h20
Je pense que shtl veut savoir si on peut avoir les couleurs de calques appliqués sur les modèles au rendu.

shtl
15/09/2010, 10h50
OK pardon, il s'agit d'une nouveauté en effet :mrgreen:
Alors, dans c4d on peut, depuis la version 10, utiliser des calques pour gérer les projets, et on peut leur attribuer des couleurs. Cela permet entre autre de visualiser dans le viewport les groupes d'objets par couleur de calque, indépendamment de leur couleur de texture, ce qui est fort pratique. Cela permet d'avoir un set full texture, et un set type schématique, switchable en un clic dans le viewport.
Du coup je me demandais s'il était possible de profitter de cette merveille combiné à un rendu plus sofistiqué, genre GI par exemple.

Si c'est pas possible (je pense que ça ne l'est pas), il suffit de faire une copie du doc, supprimer tout les matériaux, et créer de nouveaux matériaux aux couleurs des calques, et les attribuer à chaque objets/groupe d'objet correspondant... c'est ballot quand même d'avoir à refaire manuellement ce que la machine à déjà fait, car après tout, c'est pas à ça que sert un ordinateur?

Plus clair ?



EDIT:

Je pense que shtl veut savoir si on peut avoir les couleurs de calques appliqués sur les modèles au rendu.
ah bah voilà, c'est ça en bien expliqué, merci Orbi je commençais à douter :)

valkaari
15/09/2010, 12h14
J'avais compris moi \o/


Peut être en faisant un rendu normal pour avoir la luminosité et un rendu openGL pour avoir les couleurs et faire de la post prod (effectivement super pratique)

Si tu choisis couleur de calque dans la couleur de l'objet et que tu désactives les textures dans les options de rendu ça fonctionne pas -_-

shtl
15/09/2010, 12h41
J'avais compris moi \o/


Peut être en faisant un rendu normal pour avoir la luminosité et un rendu openGL pour avoir les couleurs et faire de la post prod (effectivement super pratique)

Si tu choisis couleur de calque dans la couleur de l'objet et que tu désactives les textures dans les options de rendu ça fonctionne pas -_-

Si effectivement, mais ça demande de supprimer tout les matériaux, idéalement j'aurai préféré éviter de faire 10 versions du même projet.
Mmm avec Mr Vue sur la r11.5 ça pourrai marcher, reste à avoir Mr Vue en r12 :crying: (je voulais faire ça sur un doc que j'ai créé en r12, je peux donc pas l'ouvrir en r11.5).

Ya pas un gars intelligent qui voudrait nous faire un plugin style "colorchanger", mais qui tienne compte des calques? :D


Mmmm zut, non, en plus, il ne tiens pas compte des sous calques. Donc ça marche pas. J'ai quand même essayé en supprimant toute les textures, et les hiérarchies avec calques ne marchent pas et rendent en couleur par défault, les instances ne marchent pas non plus.

Bon je vais chercher sur cgtalk, et sinon le poster dans la wishlist.


EDIT:
alors, en fait, si, on peut utiliser ta méthode Vaalkiri, :001_tt1:
…à condition de supprimer tout les tags textures, :sweatdrop: :crying:
mais je ne voit pas d'autre solution.
Je n'y étais pas parvenu tout à l'heure car j'avais attribué l'option "utiliser la couleur des calques" même aux objets (parents) n'étant pas sur les calques. Donc, pour y parvenir: gestionnaire de calques, mode solo sur tout les calques, puis unfold all dans l'OM, puis sélectionner tout les objets, puis "use color = Layer". Coller un parent globale si ce n'est pas déjà le cas, lui mettre un tag texture; déséléctionner les objets dans l'OM, puis reséléctionner le tag texture du parent global, "select identical child tag", puis DEL. Avant d'effacer les tags enfants, déséléctionner tout les tag textures qui doivent rester en l'état (comme les pyrocluster sur les particules, les objets avec alphas et les objets en verre s'il faut les garder au rendu.
Recommencer cette manipe à chaque correction du document :biggrin:

Mais ça marche!

Je me demande si c'est quand même pas plus simple de coller un shader "color" dans un layer sur chaque matériaux, avec les couleurs qui vont bien, et des les activer désactiver via xpresso....

xs_yann
15/09/2010, 15h25
Je vais essayer de me pencher sur la question mais je ne pourrais pas grand chose avant ce week-end (a moins qu'il y ai des spécifications exactes, genre un plug qui permet de désactiver toute les textures puis de mettre la combo-box couleur de chaque objet sur 'use layer color' mais apparemment ça a l'air un peu plus complexe que ça).
;)

shtl
15/09/2010, 17h32
Je vais essayer de me pencher sur la question mais je ne pourrais pas grand chose avant ce week-end (a moins qu'il y ai des spécifications exactes, genre un plug qui permet de désactiver toute les textures puis de mettre la combo-box couleur de chaque objet sur 'use layer color' mais apparemment ça a l'air un peu plus complexe que ça).
;)

Super-Yann à la rescousse !:001_tt1:
Les deux mon colonel! :whistling:
Oui, en ce qui me concerne, idéalement, avoir un plug en shader me serait plus pratique je crois. Non, j'en suis sûr je crois. Car ça permettrai de conserver certaines propriétés de texture (comme l'alpha, transparence etc). Et ça, ça serai top !
Peut être qu'une version qui désactiverai temporairement tout les tags texture et activerai le "use color layer" sur les objets ayant un calque serai aussi pratique pour des versions de travail ou pour vraiment visualiser rapidement, car le shader demande un peu de prépa sur les materiaux quand même... bosser avec des shader layer en canal couleur, et les activer / désactiver, perso ça me dérange pas trop, c'est pas le cas pour tout le monde, et je suis sûr que beaucoup aimeraient profiter d'une tel fonction. Je l'ai déjà lu sur un forum, je crois même avoir répondu que ça se faisait pas automatiquement et qu'il suffisait de bosser un peu - je suis vraiment un sale c*n moi parfois :P .
Donc oui pour la deuxième option aussi, surtout si c'est plus simple à faire.

En tout cas ce week-end me conviendra très bien :mrgreen: . Ce serai déjà fabuleux si tu y parvenais.:thumbup: :001_tt1:
Merci !

tabou
16/09/2010, 13h19
Question subsidiaire : comment afficher les couleurs des calques quand la symétrie est activée ?

http://tabou.free.fr/tabou/2010/calque_symetrie.jpg

Seb-bbl
16/09/2010, 13h28
Ben disons qu'il l'affiche : c'est la couleur par défaut de ta symétrie. Il faudrait pouvoir dire à C4D d'afficher la couleur des calques des objets enfants, mais là, ça devient indémerdable. Quid si ta symétrie est enfant d'un null avec un calque rose, lui-même enfant d'un HN avec un calque marron ?

shtl
16/09/2010, 13h57
Tu fais trois symétries, une par calque ! :mrgreen:

tabou
16/09/2010, 13h57
Je viens de tester, dans ce cas tous les objets prennent la même couleur, celle du HN, mais ça ne m'intéresse pas, je cherche à garder une couleur différente pour chacun des sous objets.
La seule solution que j'ai trouvée consiste à créer une symétrie par objet et attribuer le calque à la symétrie et non pas à l'objet, pas vraiment pratique quand il y a plusieurs dizaines d'objets :mellow:

oli_d
17/09/2010, 18h28
Je viens de tester un truc qui a l'air de marcher en python (donc uniquement avec la version 12, ou éventuellement la 11.5 avec Py4D installé, mais j'ai pas testé)

Le principe est assez simple : on parcourt tous les tags et on supprime ceux de texture. Avant de supprimer on ajoute un "Undo"
On lance le rendu par un CallCommand
Et on lance un Undo par CallCommand, ce qui remet toutes les textures

Le code à copier et à coller dans Python/Gestionnaire de script (Python) puis bouton Créer script, un p'tit nom et vous l'aurez après redémarrage de C4D dans Python/Scripts personalisés. Si vous voulez l'utiliser qu'une fois appuyez plutôt sur le bouton Exécuter



import c4d
from c4d import gui
#Welcome to the world of Python

def remove_tag_tex(obj):
while obj :
for t in obj.GetTags():
if t.GetType()==5616 :
doc.AddUndo(c4d.UNDOTYPE_DELETE,t)
t.Remove()
remove_tag_tex(obj.GetDown())
if not obj: return
obj = obj.GetNext()

def main():
obj = doc.GetFirstObject()
doc.StartUndo()
remove_tag_tex(obj)
doc.EndUndo()

c4d.CallCommand(12099)#rendu
c4d.CallCommand(12105)#undo

if __name__=='__main__':
main()


Je sais pas si ça répond complètement à la question (de shtl parce que de tabou vraiment pas), mais ça dépanne.

Si on veut utiliser la couleur des calques on sélectionne avant tous les objets et on met la couleur d'affichage sur calque

Fluffy
17/09/2010, 19h39
Je viens de tester, dans ce cas tous les objets prennent la même couleur, celle du HN, mais ça ne m'intéresse pas, je cherche à garder une couleur différente pour chacun des sous objets.
La seule solution que j'ai trouvée consiste à créer une symétrie par objet et attribuer le calque à la symétrie et non pas à l'objet, pas vraiment pratique quand il y a plusieurs dizaines d'objets :mellow:

Pas possible malheureusement, tout ce qui est générateur créé une nouvelle géométrie, qui a ses attributs propres (dont la texture).

oli_d
18/09/2010, 09h20
Peut être qu'une version qui désactiverai temporairement tout les tags texture et activerai le "use color layer" sur les objets ayant un calque

même chose que code ci-dessus mais active "use color layer" en plus, toujours uniquement pour le rendu et reviens à la situation initiale après



import c4d
from c4d import gui
#Welcome to the world of Python

def remove_tag_tex(obj):
while obj :
doc.AddUndo(c4d.UNDOTYPE_CHANGE_SMALL,obj)
obj[c4d.ID_BASEOBJECT_USECOLOR]=3 #couleur d'affichage = calque

for t in obj.GetTags():
if t.GetType()==5616 :
doc.AddUndo(c4d.UNDOTYPE_DELETE,t)
t.Remove()
remove_tag_tex(obj.GetDown())
if not obj: return
obj = obj.GetNext()

def main():
obj = doc.GetFirstObject()
doc.StartUndo()
remove_tag_tex(obj)
doc.EndUndo()

c4d.CallCommand(12099)#rendu
c4d.CallCommand(12105)#undo

if __name__=='__main__':
main()

xs_yann
22/09/2010, 16h32
Une autre façon de faire (qui permet de masquer les texture tags) consiste a mettre du texte dans le champ "Selection" du tag de texture ; la sélection n'existant pas, la texture n'est pas appliquée.

Le code pour mettre la combo-box 'Use Color'de tous les objets sur 'Layer' et masquer tous les tags texture :

import c4d

def GetNextHierarchyObject(op):
if op is None:
return None
down = op.GetDown()
if down:
return down
next = op.GetNext()
if next:
return next
prev = op.GetUp()
while prev:
next = prev.GetNext()
if next:
return next
prev = prev.GetUp()
return None

def SetTextureTagsVisibility(op, visible):
for tag in op.GetTags():
if tag.GetType() == c4d.Ttexture:
sel = tag[c4d.TEXTURETAG_RESTRICTION]
if visible:
tag[c4d.TEXTURETAG_RESTRICTION] = sel.replace("^hidden^", "");
else:
tag[c4d.TEXTURETAG_RESTRICTION] = "^hidden^" + sel;
op = op.GetNext()

def main():
op = doc.GetFirstObject()
while op:
op[c4d.ID_BASEOBJECT_USECOLOR] = c4d.ID_BASEOBJECT_USECOLOR_LAYER
SetTextureTagsVisibility(op, False)
op = GetNextHierarchyObject(op)
c4d.EventAdd()

if __name__=='__main__':
main()

Le code qui fait l'inverse :


import c4d

def GetNextHierarchyObject(op):
if op is None:
return None
down = op.GetDown()
if down:
return down
next = op.GetNext()
if next:
return next
prev = op.GetUp()
while prev:
next = prev.GetNext()
if next:
return next
prev = prev.GetUp()
return None

def SetTextureTagsVisibility(op, visible):
for tag in op.GetTags():
if tag.GetType() == c4d.Ttexture:
sel = tag[c4d.TEXTURETAG_RESTRICTION]
if visible:
tag[c4d.TEXTURETAG_RESTRICTION] = sel.replace("^hidden^", "");
else:
tag[c4d.TEXTURETAG_RESTRICTION] = "^hidden^" + sel;
op = op.GetNext()

def main():
op = doc.GetFirstObject()
while op:
op[c4d.ID_BASEOBJECT_USECOLOR] = c4d.ID_BASEOBJECT_USECOLOR_OFF
SetTextureTagsVisibility(op, True)
op = GetNextHierarchyObject(op)
c4d.EventAdd()

if __name__=='__main__':
main()

EDIT : Ca ne fonctionnerais pas d'associer un materiau a chaque Layer et d'avoir un plug pour switcher ? :
Tag texture de l'objet visible sans le matériau associé <---> Tag texture masqué avec le matériau associé appliqué

"MonObjet | O O O O" <---> "MonObjet | X X X X O"

En revanche cela risque d'être un plug C++ parce qu'en COFFEE c'est impossible de gérer les Layers et en Python la methode GetLayerData n'a pas l'air d'être définie (il reste GetLayerObject tout de même) et en plus on dirait que c'est impossible d'allouer un material : "StandardError: The plugin 'c4d.BaseMaterial' (ID 5702) is missing. Could not allocate instance."

oli_d
23/09/2010, 10h41
Une autre façon de faire (qui permet de masquer les texture tags) consiste a mettre du texte dans le champ "Selection" du tag de texture ; la sélection n'existant pas, la texture n'est pas appliquée.


C'est bien vu, mais si on a des textures qui utilisent une sélection on les perd ! Si le champ n'est pas vide, il faudrait le stocker dans le container pour pouvoir le remettre ensuite.

xs_yann
23/09/2010, 10h51
C'est bien vu, mais si on a des textures qui utilisent une sélection on les perd ! Si le champ n'est pas vide, il faudrait le stocker dans le container pour pouvoir le remettre ensuite.

Non, on ne les perd pas :
Avant : 'Selection = MaSel'
Apres : 'Selection = ^hidden^MaSel'
Re-Apres : 'Selection = MaSel'

Regarde le code. ;)

xs_yann
23/09/2010, 13h05
Voila ou j'en suis :

Une scene :
http://www.xsyann.com/fc4d/xslayercolor1.jpg

xsLayerColor actuel :
http://www.xsyann.com/fc4d/xslayercolor2.jpg

Un clic sur SetLayerColors :
http://www.xsyann.com/fc4d/xslayercolor3.jpg

Voilà ce que fait le plug :

SetLayerColors :
Pour chaque objet
- Il masque les textures existantes.
- Il regarde si un matériau est associé au calque.
-- Si non il en créé un (avec le nom du calque et sa couleur).
- Il applique un texture tag avec ce matériau (tag nommé "xsLayerColor")

En vérité, il n'y aurait même pas besoin de masquer les textures, étant donne que le tag est inséré en dernière position...

RemoveLayerColors :
Pour chaque objet
- Il démasque les textures existantes
- Il supprime tous les texture tags nommés "xsLayerColor"

Précision : Pour stocker les matériaux, j'utilise une map<LayerObject*, BaseMaterial*> statique, c'est a dire que lors du deuxième appel du plug les matériaux utilisés seront ceux qui ont déjà été crées (il est donc possible de les modifier entre temps) car RemoveLayerColors ne supprime pas les matériaux.

Ca a l'air de répondre au problème de base (celui de tabou y compris).

En revanche pour l'interface je ne sais pas si il est préférable de présenter un Menu ou alors juste une commande qui permet de switcher (cela permettrais même d'avoir un shortcut pour switcher layer/textures).
L'avantage d'un menu c'est que je peux rajouter des paramètres (genre la possibilité de choisir quel mat va avec quel layer, une checkbox qui permet de choisir si un objet sans layer doit garder ses tex ou non, etc). Une préférence ?

Le plug est en C++ et a donc besoin d'être compilé, pour l'instant je peux fournir qu'une version Mac R12.

oli_d
23/09/2010, 14h17
Non, on ne les perd pas :
Avant : 'Selection = MaSel'
Apres : 'Selection = ^hidden^MaSel'
Re-Apres : 'Selection = MaSel'

Regarde le code. ;)

Autant pour, moi .... j'ai encore perdu une occasion de me taire.

Tu es encore en train de nous pondre un incontournable ....

xs_yann
23/09/2010, 16h29
Il y a un soucis : Si un enfant possède un texture tag avec une selection bidon, la texture de l'objet parent n'est pas prise en compte sur cet objet...

Voila le plug pour tester : http://www.xsyann.com/fc4d/xsLayerColor.dylib

edit : Je ne sais pas quel doit être le comportement exact du plug, donc shtl si tu peux tester et me dire ce qui va pas. ;)

Gyom
23/09/2010, 21h26
Bonsoir Yann ... Et encore bravo pour tes talents !

Je me permets d'intervenir car je verrais une option a ton plug qui serait utile dans mon workflow : pouvoir exclure de la manip un calque en particulier qui aurait un nom donne par exemple et dont les objets lui appartenant conserveraient leur texture alors que tous les autres calques eux transmettraient leur couleur a leurs objets
.... Meme en y réfléchissant, utiliser plutôt une racine au début du nom du calque comme "_" par exemple pour que ces calques ne soient pas pris en compte par le script et donc pouvoir activer ou désactiver plus d'un calque...

Sais pas si je suis clair :-/

Edit : ce serait du coup une version Menu avec options

xs_yann
24/09/2010, 16h42
Merci Gyom.



Je me permets d'intervenir car je verrais une option a ton plug qui serait utile dans mon workflow : pouvoir exclure de la manip un calque en particulier qui aurait un nom donne par exemple et dont les objets lui appartenant conserveraient leur texture alors que tous les autres calques eux transmettraient leur couleur a leurs objets
.... Meme en y réfléchissant, utiliser plutôt une racine au début du nom du calque comme "_" par exemple pour que ces calques ne soient pas pris en compte par le script et donc pouvoir activer ou désactiver plus d'un calque...

Sais pas si je suis clair :-/

Edit : ce serait du coup une version Menu avec options

Suite a ta suggestion voila ce vers quoi je me suis orienté :
http://www.xsyann.com/fc4d/xslayercolor4.png

Le close button est useless j'ai juste oublie de l'enlever...

La liste des calques est dans un scroll group et est mis a jour dynamiquement (c'est super classe ça a pas l'air lent mais je pense qu'il vaut mieux éviter de docker la fenetre... :sweatdrop:)

Gyom
24/09/2010, 17h02
Niiiiice :)
Du coup il assigne la texture qu'on veut dynamiquement a tous les membres du calque en 1 clic... Et juste un autre clic pour que tout le monde reprenne ses couleurs d'origine
Moi ça me plait a fond !
.... Je ne sais pas si va répondre aux besoins de chacun (?)
En tous les cas c'est bô ;)

xs_yann
24/09/2010, 17h07
;)



.... Je ne sais pas si va répondre aux besoins de chacun (?)


Libre a eux de se manifester.
Je pense rajouter un champ 'No layer' pour affecter un mat aux objets qui n'ont pas de layer et après le plug sera dispo R12 Mac puis normalement R11.5 et > Mac dans pas longtemps. ;)

shtl
24/09/2010, 17h15
Il y a un soucis : Si un enfant possède un texture tag avec une selection bidon, la texture de l'objet parent n'est pas prise en compte sur cet objet...

Voila le plug pour tester : http://www.xsyann.com/fc4d/xsLayerColor.dylib

edit : Je ne sais pas quel doit être le comportement exact du plug, donc shtl si tu peux tester et me dire ce qui va pas. ;)

Scouzy j'avais loupé.
Je test asap, merci beaucoup ! :thumbup:

Gyom
24/09/2010, 17h19
Je pense rajouter un champ 'No layer' pour affecter un mat aux objets qui n'ont pas de layer

Ça borde le tout ;)



après le plug sera dispo R12 Mac puis normalement R11.5 et > Mac dans pas longtemps. ;)

Cool !
Parce que je ne sais pas quand j'aurai les sous pour la R12... Surtout qu'il faudra que les plugs que j'utilise suivent aussi le mouvement :-/

Merci pour ta générosité de temps et de compétence
... Et encore bravo !

xs_yann
25/09/2010, 14h34
Une petite video (peut-etre un peu lourde et faite un peu a l'arrache) :

(click me)
http://www.xsyann.com/fc4d/xslayercolor/xslayercolor1.jpg (http://www.xsyann.com/fc4d/xslayercolor/xslayercolor1.html)

shtl
25/09/2010, 14h54
Ça à l'air parfait!
Je suis sur un autre taf mais je testerai asap.

Encore merci Yann :001_tt1: