]> git.tdb.fi Git - libs/gl.git/blobdiff - blender/io_mspgl/properties.py
Support defining uniform values for materials in Blender
[libs/gl.git] / blender / io_mspgl / properties.py
index df18d444be9819e7d89c3c5446cfc00401fa1a18..baf9ac95c6105c5252e796f326f4d0beccf353fa 100644 (file)
@@ -74,6 +74,22 @@ class MspGLMaterialProperties(bpy.types.Panel):
                        self.layout.prop(mat, "array_layer")
                if mat.render_mode!='EXTERNAL':
                        self.layout.prop(mat, "material_atlas")
+               if mat.render_mode=='CUSTOM':
+                       self.layout.separator()
+                       self.layout.label(text="Uniform values")
+                       self.layout.template_list("MATERIAL_UL_mspgl_uniforms", "", mat, "uniforms", mat, "active_uniform_index")
+                       row = self.layout.row()
+                       row.operator("material.add_uniform")
+                       row.operator("material.remove_uniform")
+
+                       if mat.active_uniform_index<len(mat.uniforms):
+                               uniform = mat.uniforms[mat.active_uniform_index]
+                               self.layout.prop(uniform, "name")
+                               self.layout.prop(uniform, "size")
+                               row = self.layout.row(align=True)
+                               row.label(text="Values")
+                               for i in range(uniform.size):
+                                       row.prop(uniform, "values", text="", index=i)
 
 class MspGLTextureNodeProperties(bpy.types.Panel):
        bl_idname = "NODE_PT_mspgl_properties"
@@ -97,9 +113,28 @@ class MspGLTextureNodeProperties(bpy.types.Panel):
                        self.layout.prop(node, "use_mipmap")
                        self.layout.prop(node, "max_anisotropy")
 
-classes = [MspGLMeshProperties, MspGLObjectProperties, MspGLMaterialProperties, MspGLTextureNodeProperties]
+class MspGLUniform(bpy.types.PropertyGroup):
+       name: bpy.props.StringProperty(name="Name", description="Name of the uniform variable")
+       size: bpy.props.IntProperty(name="Size", description="Number of elements in the uniform", min=1, max=4, default=4)
+       values: bpy.props.FloatVectorProperty(name="Values", description="Values stored in the uniform", size=4)
+
+class MspGLUniformList(bpy.types.UIList):
+       bl_idname = "MATERIAL_UL_mspgl_uniforms"
+
+       def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
+               uniform = item
+               if self.layout_type=="GRID":
+                       layout.label(text="", icon_value=icon)
+               else:
+                       layout.prop(uniform, "name", text="", emboss=False, icon_value=icon)
+                       layout.label(text="({})".format(", ".join("{:.3f}".format(v) for v in uniform.values[:uniform.size])))
+
+classes = [MspGLMeshProperties, MspGLObjectProperties, MspGLMaterialProperties, MspGLTextureNodeProperties, MspGLUniform, MspGLUniformList]
 
 def register_properties():
+       for c in classes:
+               bpy.utils.register_class(c)
+
        bpy.types.Mesh.winding_test = bpy.props.BoolProperty(name="Winding test", description="Perform winding test to skip back faces")
        bpy.types.Mesh.smoothing = bpy.props.EnumProperty(name="Smoothing", description="Smoothing method to use", default="MSPGL",
                items=(("NONE", "None", "No smoothing"),
@@ -128,14 +163,13 @@ def register_properties():
        bpy.types.Material.array_atlas = bpy.props.BoolProperty(name="Texture array atlas", description="The material is stored in a texture array")
        bpy.types.Material.array_layer = bpy.props.IntProperty("Texture array layer", description="Layer of the texture array atlas to use")
        bpy.types.Material.material_atlas = bpy.props.BoolProperty(name="Material atlas", description="Make this material part of a material atlas")
+       bpy.types.Material.uniforms = bpy.props.CollectionProperty(type=MspGLUniform, name="Uniform", description="Uniform variables to add to the technique")
+       bpy.types.Material.active_uniform_index = bpy.props.IntProperty("Active uniform index")
 
        bpy.types.ShaderNodeTexImage.default_filter = bpy.props.BoolProperty(name="Default filter", description="Let the loading program determine filtering options")
        bpy.types.ShaderNodeTexImage.use_mipmap = bpy.props.BoolProperty(name="Use mipmaps", description="Use mipmaps (automatically generated) for the texture", default=True)
        bpy.types.ShaderNodeTexImage.max_anisotropy = bpy.props.FloatProperty(name="Maximum anisotropy", description="Maximum anisotropy to use in texture filtering", min=1, max=16, default=1)
 
-       for c in classes:
-               bpy.utils.register_class(c)
-
 def unregister_properties():
        for c in classes:
                bpy.utils.unregister_class(c)