Material Advanced Override

Modérateurs : frez, Yadoob, stilobique, Matpi, ModSquad

Material Advanced Override

Message par lapineige » 18 Nov 2014, 01:57

edit: un article qui décrit le fonctionnement de l'add-on: http://le-terrier-de-lapineige.over-blo ... ement.html

Suite à une demande sur ce topic provenant de bjo et jemian, j'ouvre ce topic.
La demande ? Modifier l'option material overide des renderlayers pour ne pas affecter les matériaux émettant la lumière.
En gros se rapprocher de l'option de l'internal:
Image
En affectant que les autres objets (en excluant ces lights).


Bon j'ai déjà un script (à lancer manuellement) fonctionnel: edit: téléchargez l'add-on.
Code : Tout sélectionner
import bpy

bpy.types.Scene.OW_only_selected = bpy.props.BoolProperty(name='Only Selected',default=True)
bpy.types.Scene.OW_exclude_type = bpy.props.EnumProperty(items=[('index','Material Index','',0),('group','Group','',1)])
bpy.types.Scene.OW_pass_index = bpy.props.IntProperty(name='Pass Index',default=1)

class OverwriteSetup(bpy.types.Operator):
    """Tooltip"""
    bl_idname = "scene.overwrite_setup"
    bl_label = "Overwrite Setup"
   
    l_m = []

    @classmethod
    def poll(cls, context):
        return True
   
    def execute(self, context):
        for obj in bpy.data.objects:
            if (obj.select == True)*context.scene.OW_only_selected or not context.scene.OW_only_selected:
                if len(obj.material_slots):
                    if context.scene.OW_exclude_type == 'index':
                        if not obj.material_slots[0].material.pass_index == context.scene.OW_pass_index:
                            self.l_m.append((obj,obj.material_slots[0].material))
                            obj.material_slots[0].material = bpy.data.materials['Material.001'] ### <=== Le matériau à modifier, entre '' !
                    elif context.scene.OW_exclude_type == 'group':
                        pass
        print(self.l_m)
        return {'FINISHED'}

class OverwriteRestore(bpy.types.Operator):
    """Tooltip"""
    bl_idname = "scene.overwrite_restore"
    bl_label = "Overwrite Restore"
   
    l_m = []

    @classmethod
    def poll(cls, context):
        return True
   
    def execute(self, context):
        for obj_mat in bpy.types.SCENE_OT_overwrite_setup.l_m:
            obj_mat[0].material_slots[0].material = obj_mat[1]
        bpy.types.SCENE_OT_overwrite_setup.l_m = []
        return {'FINISHED'}

def draw_buttons(self, context):
    layout = self.layout
    row = layout.row()
    row.label('Exclude by:')
    row.prop(context.scene, 'OW_exclude_type', expand=True)
    if context.scene.OW_exclude_type == 'index':
        layout.prop(context.scene, 'OW_pass_index')
    elif context.scene.OW_exclude_type == 'group':
        pass
        #layout.template_ID(bpy.data.groups,'active')
    layout.prop(context.scene, 'OW_only_selected')
    if bpy.types.SCENE_OT_overwrite_setup.l_m:
        layout.operator('scene.overwrite_restore')
    else:
        layout.operator('scene.overwrite_setup')
def register():
    bpy.utils.register_class(OverwriteSetup)
    bpy.utils.register_class(OverwriteRestore)
    bpy.types.CyclesRender_PT_layer_options.append(draw_buttons)


def unregister():
    bpy.utils.unregister_class(OverwriteSetup)
    bpy.utils.unregister_class(OverwriteRestore)
    bpy.types.CyclesRender_PT_layer_options.remove(draw_buttons)


if __name__ == "__main__":
    register()

Bon l'utilisation est pour le moment assez restreinte et restrictive, mais je vous le mets au cas ou vous en auriez besoin actuellement:
- le script ne fonctionne que si vos objets ne contiennent pas plus d'un matériau.
- pour choisir votre matériau, il vous faut modifier le script (la ligne est indiquée ;-)).
- il marche sur la sélection ou sur tout. L'exclusion ne marche pour le moment qu'en choisissant le pass index de votre matériau.
Dernière édition par lapineige le 14 Mai 2015, 11:51, édité 2 fois.
Mon terrier/blog: https://lapineige.fr/wp (l'ancien: le-terrier-de-lapineige.over-blog.com) | Mon GitHub: https://github.com/lapineige/Blender_add-ons | Lapineige's Tools: http://cgcookiemarkets.com/blender/all- ... ompilation
Avatar de l’utilisateur
lapineige
 
Message(s) : 3717
Inscription : 25 Juin 2014, 07:06

Re: Material Overwrite - amélioration de l'option du renderl

Message par jemian » 18 Nov 2014, 16:49

Ah merci :)
Tu avais dit que c'était pas faisable.
Je pensais que tu avais abandonné l'idée.
ça va bien me servir j'ai un mal fou à faire mon éclairage
Avatar de l’utilisateur
jemian
 
Message(s) : 2797
Inscription : 03 Fév 2014, 01:52
Localisation : Brest

Re: Material Overwrite - amélioration de l'option du renderl

Message par lapineige » 18 Nov 2014, 19:45

C'est pas possible.
Je fais juste une bidouille qui au final fait pareil, mais elle a l'inconvénient de toucher à tes matériaux que le renderlayer soit activé ou non.
Mon terrier/blog: https://lapineige.fr/wp (l'ancien: le-terrier-de-lapineige.over-blog.com) | Mon GitHub: https://github.com/lapineige/Blender_add-ons | Lapineige's Tools: http://cgcookiemarkets.com/blender/all- ... ompilation
Avatar de l’utilisateur
lapineige
 
Message(s) : 3717
Inscription : 25 Juin 2014, 07:06

Re: Material Overwrite - amélioration de l'option du renderl

Message par bjo » 19 Nov 2014, 14:03

J'ai pensé à un truc sinon,
L'idée serait, tu groupes tous les objets dont tu veux garder le mat
Tu cliques sur un bouton " Clay render" ça remplace les mats de tous les objets (hors du groupe) par un mat Clay
Ça lance le rendu
Ça remet les mat comme c'était (hum... avec un Undo ? ou une scène temporaire enregistrée avant de faire les modifs)

Donc il suffit d'avoir un champ "Exclude group" et un bouton Clay render

(c'est bête mais si j'y avais réfléchi un peu plus tot, on aurait pu en parler de vive voix)
Tu rajoutes un champ
Avatar de l’utilisateur
bjo
 
Message(s) : 524
Inscription : 11 Août 2013, 22:30

Re: Material Overwrite - amélioration de l'option du renderl

Message par lapineige » 19 Nov 2014, 14:19

C'est exactement ce qu'il fait ;-)
Sauf que pour le groupe je l'ai pas encore ajouté, ça bug :-(
Mon terrier/blog: https://lapineige.fr/wp (l'ancien: le-terrier-de-lapineige.over-blog.com) | Mon GitHub: https://github.com/lapineige/Blender_add-ons | Lapineige's Tools: http://cgcookiemarkets.com/blender/all- ... ompilation
Avatar de l’utilisateur
lapineige
 
Message(s) : 3717
Inscription : 25 Juin 2014, 07:06

Re: Material Overwrite - amélioration de l'option du renderl

Message par lapineige » 20 Nov 2014, 00:46

Ok c'est bon j'ai ajouté l'utilisation d'un groupe comme critère.
Ça ne marche toujours que pour un seul matériau.
Pour l'instant c'est toujours un script, mais beaucoup plus user-friendly. Testez-le (hein bjo :-P), vous verez la différence (retours fortement appréciés ;-))


Prochaine étape, le passage en add-on, la gestion de plusieurs groupes et pass index, après les multi matériaux.

Le code:
Code : Tout sélectionner
import bpy
bpy.types.Scene.OW_only_selected = bpy.props.BoolProperty(name='Affect Only Selected',default=True)
bpy.types.Scene.OW_exclude_type = bpy.props.EnumProperty(items=[('index','Material Index','',0),('group','Group','',1)])
bpy.types.Scene.OW_pass_index = bpy.props.IntProperty(name='Pass Index',default=1)
bpy.types.Scene.OW_material = bpy.props.StringProperty(name='Material',maxlen=63)
bpy.types.Scene.OW_group = bpy.props.StringProperty(name='Group',maxlen=63)

class OverwriteSetup(bpy.types.Operator):
    """Tooltip"""
    bl_idname = "scene.overwrite_setup"
    bl_label = "Overwrite Setup"
   
    l_m = []

    @classmethod
    def poll(cls, context):
        return context.scene.OW_material
   
    def execute(self, context):
        for obj in bpy.data.objects:
            if (obj.select == True)*context.scene.OW_only_selected or not context.scene.OW_only_selected:
                if len(obj.material_slots):
                    if context.scene.OW_exclude_type == 'index':
                        if not obj.material_slots[0].material.pass_index == context.scene.OW_pass_index:
                            self.l_m.append((obj,obj.material_slots[0].material))
                            obj.material_slots[0].material = bpy.data.materials[context.scene.OW_material]
                    elif context.scene.OW_exclude_type == 'group' and context.scene.OW_group:
                        if obj.name in [g_obj.name for g_obj in bpy.data.groups[context.scene.OW_group].objects]:
                            self.l_m.append((obj,obj.material_slots[0].material))
                            obj.material_slots[0].material = bpy.data.materials[context.scene.OW_material]                 
        print(self.l_m)
        return {'FINISHED'}

class OverwriteRestore(bpy.types.Operator):
    """Tooltip"""
    bl_idname = "scene.overwrite_restore"
    bl_label = "Overwrite Restore"
   
    l_m = []

    @classmethod
    def poll(cls, context):
        return True
   
    def execute(self, context):
        for obj_mat in bpy.types.SCENE_OT_overwrite_setup.l_m:
            obj_mat[0].material_slots[0].material = obj_mat[1]
        bpy.types.SCENE_OT_overwrite_setup.l_m = []
        return {'FINISHED'}


class MaterialOverrideTools(bpy.types.Panel):
    """  """
    bl_label = "Material Override Tools"
    bl_idname = "material_override_tools"
    bl_space_type = 'PROPERTIES'
    bl_region_type = 'WINDOW'
    bl_context = "render_layer"

    def draw(self, context):
        layout = self.layout
       
        if bpy.types.SCENE_OT_overwrite_setup.l_m:
            layout.operator('scene.overwrite_restore')
        else:
            layout.operator('scene.overwrite_setup')
       
        layout.prop_search(context.scene, "OW_material", bpy.data, "materials", icon='MATERIAL_DATA')
        layout.prop(context.scene, 'OW_only_selected',toggle=True, icon='BORDER_RECT')
       
        box = layout.box()
        box.label('Exclude from effect:')
        row = box.row()
        row.prop(context.scene, 'OW_exclude_type', expand=True)
        if context.scene.OW_exclude_type == 'index':
            box.prop(context.scene, 'OW_pass_index')
        elif context.scene.OW_exclude_type == 'group':
            box.prop_search(context.scene, "OW_group", bpy.data, "groups", icon='GROUP')
       
   
def register():
    bpy.utils.register_class(OverwriteSetup)
    bpy.utils.register_class(OverwriteRestore)
    bpy.utils.register_class(MaterialOverrideTools)


def unregister():
    bpy.utils.unregister_class(OverwriteSetup)
    bpy.utils.unregister_class(OverwriteRestore)
    bpy.utils.unregister_class(MaterialOverrideTools)


if __name__ == "__main__":
    register()


Bon blend à tous ! :)
Mon terrier/blog: https://lapineige.fr/wp (l'ancien: le-terrier-de-lapineige.over-blog.com) | Mon GitHub: https://github.com/lapineige/Blender_add-ons | Lapineige's Tools: http://cgcookiemarkets.com/blender/all- ... ompilation
Avatar de l’utilisateur
lapineige
 
Message(s) : 3717
Inscription : 25 Juin 2014, 07:06

Re: Material Overwrite - amélioration de l'option du renderl

Message par VincentG » 20 Nov 2014, 15:59

Très bonne idée de script, simple et efficace. J'aime beaucoup :)

C'est GPL? On peut s'en servir ou le modifier?
J'avais l'idée de faire à peu près la même chose mais que tout soit stocké sur une nouvelle scène à la manière des renderlayers de Maya.
http://www.vincentgires.com
Belgian Blender User Group : http://bbug.be/
Avatar de l’utilisateur
VincentG
 
Message(s) : 223
Inscription : 13 Fév 2014, 21:35

Re: Material Overwrite - amélioration de l'option du renderl

Message par lapineige » 20 Nov 2014, 18:33

J'avais l'idée de faire à peu près la même chose mais que tout soit stocké sur une nouvelle scène à la manière des renderlayers de Maya.

C'est vachement lourd et pas pratique comme système, même s'il a l'avantage d'être simple.


Très bonne idée de script, simple et efficace. J'aime beaucoup :)

;)


C'est GPL? On peut s'en servir ou le modifier?

Comme tu peux le voir, je n'ai rien précisé. Donc de base (selon le droit français 8-)), la propriété intellectuelle s'applique :-P

Mais bon je suis gentil, alors oui c'est du GPL ;-)

On peut s'en servir

Nan, je le garde pour moi :mrgreen:
Fait toi plaisir ;-)

le modifier?

Oui, mais je vais en faire un add-on en GPL. Donc si c'est pour réutiliser des bouts te prive pas, par contre si c'est pour améliorer ce script, j'aimerai bien (sans obligation;-)) que tu me fasse des retours ici (voire que tu demande des fonctionnalités, si t'as la flemme ^^).
Mon terrier/blog: https://lapineige.fr/wp (l'ancien: le-terrier-de-lapineige.over-blog.com) | Mon GitHub: https://github.com/lapineige/Blender_add-ons | Lapineige's Tools: http://cgcookiemarkets.com/blender/all- ... ompilation
Avatar de l’utilisateur
lapineige
 
Message(s) : 3717
Inscription : 25 Juin 2014, 07:06

Re: Material Overwrite - amélioration de l'option du renderl

Message par VincentG » 20 Nov 2014, 20:39

lapineige a écrit :
J'avais l'idée de faire à peu près la même chose mais que tout soit stocké sur une nouvelle scène à la manière des renderlayers de Maya.

C'est vachement lourd et pas pratique comme système, même s'il a l'avantage d'être simple.

Tu trouves que les scenes de Blender ou les Render Layers de Maya ne sont pas pratiques?
Les deux ont des avantages et des défauts pour moi. Les render layers de Blender sont très limités, mais il y a les scenes pour compenser donc ça va encore pour se débrouiller sur de gros trucs.

Je te posais la question de la licence car tu as fait d'autres scripts GPL il me semble, c'est pour ça ;)
Quand je dis que je pourrais le modifier, c'est pas du tout pour en faire un script en mon nom et le redistribuer!! mais plutôt que te demande des fonctionnalité bien précise qui ne sont peu-être pas possible ou en dehors de ton intension initiale, l'idée étais de chipoter un peu avec ta base, même si je ne suis pas un codeur, et voir ce qu'il est possible de faire en plus et puis si ça marche le repartager. Rien de plus ;)

Pour être plus précis, j'ai commencé deux scripts pour gérer les passes de rendu. Un qui sépare les lights en groupes et en fait des rendus séparé, et un qui découpe les différents "layers" de la scene (character1, character2, background, etc). Pour ça j'ai utilisé les scenes en combinant différemment les 20 layers que Blender possède par scene. Je n'ai pas encore fini mais c'est bien parti, et l'override était aussi un objectif 8-)

Ton script ici marche très bien mais il ne garde pas en mémoire après sauvegarde et réouverture du fichier les anciens settings (à moins que je me trompe? c'est fort possible!). Et puis, il n'est pas non plus possible de faire se genre d'assignation différemment sur différents render layers puisque les matériaux sont directement assignés aux objects. Là, c'est Blender qui a ses limites. C'est pourquoi je pensais aux scenes où alors ça devient possible de le faire.
http://www.vincentgires.com
Belgian Blender User Group : http://bbug.be/
Avatar de l’utilisateur
VincentG
 
Message(s) : 223
Inscription : 13 Fév 2014, 21:35

Re: Material Overwrite - amélioration de l'option du renderl

Message par jemian » 20 Nov 2014, 21:17

Bon je vois pas comment ça marche mais c'est sans doute moi :oops:
j'ai mis le materiaux de mon panneau en emission dans le script
je run le script depuis le text editor et je fais render en overwrite.
ça n'exclu pas mon materiaux

Le plus simple je crois c'est exclure un index ou un layer de l'overwrite
car on peut avoir plusieurs materiaux emission mais group c'est bien aussi
Avatar de l’utilisateur
jemian
 
Message(s) : 2797
Inscription : 03 Fév 2014, 01:52
Localisation : Brest

Re: Material Overwrite - amélioration de l'option du renderl

Message par lapineige » 20 Nov 2014, 21:50

(réponse depuis un téléphone)
Je ne dis pas que les renderlayers ne sont pas pratiques, au contraire. Je parlais de la méthode python dont tu parlais ;-)


Bon mon ton un brin moqueur est une fois de plus mal passé, désolé. Je corrige ça:
Pour la modification du script, tu a le droit d'y mettre ton nom et de le modifier. Je disais juste que si tu dois le prendre tel quel et l'améliorer, ce serait cool (mais pas obligatoire) que tu repartage sur ce topic, pour que tout le monde en profite (et je te citerai dans la liste des auteurs).

l'override était aussi un objectif 8-)

La c'est le cas dont je parlais avant, si c'est pour reprendre le code pour autre chose tu as le droit aussi.

Ton script ici marche très bien mais il ne garde pas en mémoire après sauvegarde et réouverture du fichier les anciens settings (à moins que je me trompe? c'est fort possible!). Et puis, il n'est pas non plus possible de faire se genre d'assignation différemment sur différents render layers puisque les matériaux sont directement assignés aux objects. Là, c'est Blender qui a ses limites. C'est pourquoi je pensais aux scenes où alors ça devient possible de le faire.

C'est normal qu'il ne sauvegarde rien, et il ne le fera que sur ton fichier courant.
Ce ne sont pas les limites de Blender, mais celles de l'API python. En C c'est parfaitement faisable, ça exist même sur l'internal.



@jemian: regarde la dernière version, pas l'ancienne ;-)
Exclure un layer j'y avais pas pensé, très bonne idée.
Mon terrier/blog: https://lapineige.fr/wp (l'ancien: le-terrier-de-lapineige.over-blog.com) | Mon GitHub: https://github.com/lapineige/Blender_add-ons | Lapineige's Tools: http://cgcookiemarkets.com/blender/all- ... ompilation
Avatar de l’utilisateur
lapineige
 
Message(s) : 3717
Inscription : 25 Juin 2014, 07:06

Re: Material Overwrite - amélioration de l'option du renderl

Message par jemian » 21 Nov 2014, 01:18

ah wai géant

ça le fait dans le viewport direct
Excellent outil pour régler ses ligths
Avatar de l’utilisateur
jemian
 
Message(s) : 2797
Inscription : 03 Fév 2014, 01:52
Localisation : Brest

Re: Material Overwrite - amélioration de l'option du renderl

Message par lapineige » 21 Nov 2014, 01:35

ah wai géant

ça le fait dans le viewport direct

Ben c'est bien le but non ? :-P
Il remplace directement les matériaux, et l'option restore remets tout comme c'était. Ça ne marche qu'avec un seul matérial/objet pour le moment.


Excellent outil pour régler ses ligths

:?:
Tu veux dire qu'il est excellent pour régler tes lights, ou tu parle d'un outil spécifique ? (auquel cas, lequel ??)
Si c'est le premier cas, je suis content :-)
Hésite pas à demander des améliorations ;-)
Mon terrier/blog: https://lapineige.fr/wp (l'ancien: le-terrier-de-lapineige.over-blog.com) | Mon GitHub: https://github.com/lapineige/Blender_add-ons | Lapineige's Tools: http://cgcookiemarkets.com/blender/all- ... ompilation
Avatar de l’utilisateur
lapineige
 
Message(s) : 3717
Inscription : 25 Juin 2014, 07:06

Re: Material Overwrite - amélioration de l'option du renderl

Message par jemian » 21 Nov 2014, 02:09

Vi il est excellent pour régler mes lights
Pour les calques à exclures j'ai déjà demandé
C'est plus simple que les indexes. je mets souvent mes light sur un calque.
Je vois pas d'autres trucs
L'environnement faut pas y toucher je pense.
Avatar de l’utilisateur
jemian
 
Message(s) : 2797
Inscription : 03 Fév 2014, 01:52
Localisation : Brest

Re: Material Overwrite - amélioration de l'option du renderl

Message par lapineige » 21 Nov 2014, 02:15

L’environnement est déjà préservé.
Pour la gestion des layers, je vais faire ça ;-)
Mon terrier/blog: https://lapineige.fr/wp (l'ancien: le-terrier-de-lapineige.over-blog.com) | Mon GitHub: https://github.com/lapineige/Blender_add-ons | Lapineige's Tools: http://cgcookiemarkets.com/blender/all- ... ompilation
Avatar de l’utilisateur
lapineige
 
Message(s) : 3717
Inscription : 25 Juin 2014, 07:06

Suivant

Retour vers Addons

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 1 invité