3 class MspGLSceneProperties(bpy.types.Panel):
4 bl_idname = "SCENE_PT_mspgl_properties"
5 bl_label = "MspGL properties"
6 bl_space_type = "PROPERTIES"
7 bl_region_type = "WINDOW"
10 def draw(self, context):
13 self.layout.prop(scene, "scene_type")
14 self.layout.prop(scene, "export_disposition")
16 class MspGLMeshProperties(bpy.types.Panel):
17 bl_idname = "MESH_PT_mspgl_properties"
18 bl_label = "MspGL properties"
19 bl_space_type = "PROPERTIES"
20 bl_region_type = "WINDOW"
24 def poll(cls, context):
25 return context.active_object.type=="MESH"
27 def draw(self, context):
28 mesh = context.active_object.data
30 self.layout.prop(mesh, "winding_test")
31 self.layout.prop(mesh, "smoothing")
32 self.layout.prop(mesh, "use_strips")
34 self.layout.separator()
36 col = self.layout.column()
37 col.label(text="Data selection")
38 col.prop(mesh, "use_lines")
39 col.prop(mesh, "vertex_groups")
40 col.prop(mesh, "max_groups_per_vertex")
42 self.layout.separator()
44 col = self.layout.column()
45 col.label(text="Texturing")
46 col.prop(mesh, "use_uv")
47 col.prop(mesh, "tangent_vecs")
48 col.prop(mesh, "tangent_uvtex")
50 class MspGLObjectProperties(bpy.types.Panel):
51 bl_idname = "OBJECT_PT_mspgl_properties"
52 bl_label = "MspGL properties"
53 bl_space_type = "PROPERTIES"
54 bl_region_type = "WINDOW"
58 def poll(cls, context):
59 return context.active_object.type=="MESH"
61 def draw(self, context):
62 obj = context.active_object
64 self.layout.prop(obj, "compound")
65 self.layout.prop(obj, "lod_for_parent")
66 if obj.lod_for_parent:
67 self.layout.prop(obj, "lod_index")
69 class MspGLMaterialProperties(bpy.types.Panel):
70 bl_idname = "MATERIAL_PT_mspgl_properties"
71 bl_label = "MspGL properties"
72 bl_space_type = "PROPERTIES"
73 bl_region_type = "WINDOW"
74 bl_context = "material"
77 def poll(cls, context):
78 return context.active_object.active_material is not None
80 def draw(self, context):
81 mat = context.active_object.active_material
85 self.layout.prop(mat, "render_mode")
86 if mat.render_mode=='CUSTOM':
87 self.layout.prop(mat, "shader")
88 elif mat.render_mode=='EXTERNAL':
89 self.layout.prop(mat, "technique")
90 self.layout.prop(mat, "array_atlas")
92 self.layout.prop(mat, "array_layer")
93 if mat.render_mode!='EXTERNAL':
94 self.layout.prop(mat, "material_atlas")
95 if mat.render_mode=='CUSTOM':
96 self.layout.separator()
97 self.layout.label(text="Uniform values")
98 self.layout.template_list("MATERIAL_UL_mspgl_uniforms", "", mat, "uniforms", mat, "active_uniform_index")
99 row = self.layout.row()
100 row.operator("material.add_uniform")
101 row.operator("material.remove_uniform")
103 if mat.active_uniform_index<len(mat.uniforms):
104 uniform = mat.uniforms[mat.active_uniform_index]
105 self.layout.prop(uniform, "name")
106 self.layout.prop(uniform, "size")
107 row = self.layout.row(align=True)
108 row.label(text="Values")
109 for i in range(uniform.size):
110 row.prop(uniform, "values", text="", index=i)
112 class MspGLTextureNodeProperties(bpy.types.Panel):
113 bl_idname = "NODE_PT_mspgl_properties"
114 bl_label = "MspGL properties"
115 bl_space_type = "NODE_EDITOR"
116 bl_region_type = "UI"
120 def poll(cls, context):
121 node = context.active_node
122 return node and node.type=='TEX_IMAGE'
124 def draw(self, context):
125 node = context.active_node
129 self.layout.prop(node, "default_filter")
130 if not node.default_filter:
131 self.layout.prop(node, "use_mipmap")
132 self.layout.prop(node, "max_anisotropy")
134 class MspGLLightProperties(bpy.types.Panel):
135 bl_idname = "LIGHT_PT_mspgl_properties"
136 bl_label = "MspGL properties"
137 bl_space_type = "PROPERTIES"
138 bl_region_type = "WINDOW"
142 def poll(cls, context):
143 return context.active_object.type=="LIGHT"
145 def draw(self, context):
146 light = context.active_object.data
149 self.layout.prop(light, "shadow_map_size")
151 class MspGLUniform(bpy.types.PropertyGroup):
152 name: bpy.props.StringProperty(name="Name", description="Name of the uniform variable")
153 size: bpy.props.IntProperty(name="Size", description="Number of elements in the uniform", min=1, max=4, default=4)
154 values: bpy.props.FloatVectorProperty(name="Values", description="Values stored in the uniform", size=4)
156 class MspGLUniformList(bpy.types.UIList):
157 bl_idname = "MATERIAL_UL_mspgl_uniforms"
159 def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
161 if self.layout_type=="GRID":
162 layout.label(text="", icon_value=icon)
164 layout.prop(uniform, "name", text="", emboss=False, icon_value=icon)
165 layout.label(text="({})".format(", ".join("{:.3f}".format(v) for v in uniform.values[:uniform.size])))
167 classes = [MspGLSceneProperties, MspGLMeshProperties, MspGLObjectProperties, MspGLMaterialProperties, MspGLTextureNodeProperties, MspGLLightProperties, MspGLUniform, MspGLUniformList]
169 def register_properties():
171 bpy.utils.register_class(c)
173 bpy.types.Scene.scene_type = bpy.props.EnumProperty(name="Scene type", description="Type of scene to use for exporting", default="SIMPLE",
174 items=(("SIMPLE", "Simple", "Objects are rendered in no specific order"),
175 ("ORDERED", "Ordered", "Objects are rendered in order by their name"),
176 ("ZSORTED", "Z-sorted", "Objects are rendered in order by their distance from the camera")))
177 bpy.types.Scene.export_disposition = bpy.props.EnumProperty(name="Export disposition", description="What to do with this scene during project export", default="IGNORE",
178 items=(("IGNORE", "Ignore", "The scene won't be exported"),
179 ("CONTENTS", "Contents only", "Objects in the scene will be exported, but not the scene itself"),
180 ("SCENE", "Scene", "The scene will be exported"),
181 ("SEQUENCE", "Sequence", "The scene will be exported along with a rendering sequence")))
183 bpy.types.Mesh.winding_test = bpy.props.BoolProperty(name="Winding test", description="Perform winding test to skip back faces")
184 bpy.types.Mesh.smoothing = bpy.props.EnumProperty(name="Smoothing", description="Smoothing method to use", default="MSPGL",
185 items=(("NONE", "None", "No smoothing"),
186 ("BLENDER", "Blender", "Use Blender's vertex normals"),
187 ("MSPGL", "MspGL", "Compute vertex normals internally")))
188 bpy.types.Mesh.use_lines = bpy.props.BoolProperty(name="Include lines", description="Include edges without faces as lines", default=False)
189 bpy.types.Mesh.use_strips = bpy.props.BoolProperty(name="Use strips", description="Combine the mesh's triangles into triangle strips", default=True)
190 bpy.types.Mesh.vertex_groups = bpy.props.BoolProperty(name="Vertex groups", description="Include vertex groups and weights", default=False)
191 bpy.types.Mesh.max_groups_per_vertex = bpy.props.IntProperty(name="Max groups", description="Maximum amount of groups per vertex", min=1, max=4, default=2)
192 bpy.types.Mesh.use_uv = bpy.props.EnumProperty(name="Use UV", description="Use UV coordinates", default="UNIT0",
193 items=(("NONE", "None", "Ignore all UV coordinates"),
194 ("UNIT0", "Unit 0", "Use UV coordinates for unit 0"),
195 ("ALL", "All", "Use all UV coordinates")))
196 bpy.types.Mesh.tangent_vecs = bpy.props.EnumProperty(name="Tangent vectors", description="Compute tangent vectors for vertices", default="AUTO",
197 items=(("NO", "No", "Do not export tangent vectors"),
198 ("AUTO", "Auto", "Automatically determine the need for tangent vectors"),
199 ("YES", "Yes", "Always export tangent vectors")))
200 bpy.types.Mesh.tangent_uvtex = bpy.props.StringProperty(name="Tangent UV layer", description="UV layer to use as basis for tangent vectors", default="")
202 bpy.types.Object.compound = bpy.props.BoolProperty(name="Compound with parent", description="Join this object to its parent when exporting")
203 bpy.types.Object.lod_for_parent = bpy.props.BoolProperty(name="LoD for parent", description="This object is a level of detail for its parent")
204 bpy.types.Object.lod_index = bpy.props.IntProperty(name="LoD index", description="Index of the level of detail", min=1, max=16, default=1)
206 bpy.types.Material.render_mode = bpy.props.EnumProperty(name="Render mode", description="How this material should be rendered", default="BUILTIN",
207 items=(("BUILTIN", "Built-in", "Use built-in shaders"),
208 ("CUSTOM", "Custom shader", "Use a custom shader"),
209 ("EXTERNAL", "External technique", "Use an externally defined technique")))
210 bpy.types.Material.technique = bpy.props.StringProperty(name="Custom technique", description="Name of an external technique to use for rendering")
211 bpy.types.Material.shader = bpy.props.StringProperty(name="Custom shader", description="Name of an external technique to use for rendering")
212 bpy.types.Material.array_atlas = bpy.props.BoolProperty(name="Texture array atlas", description="The material is stored in a texture array")
213 bpy.types.Material.array_layer = bpy.props.IntProperty("Texture array layer", description="Layer of the texture array atlas to use")
214 bpy.types.Material.material_atlas = bpy.props.BoolProperty(name="Material atlas", description="Make this material part of a material atlas")
215 bpy.types.Material.uniforms = bpy.props.CollectionProperty(type=MspGLUniform, name="Uniform", description="Uniform variables to add to the technique")
216 bpy.types.Material.active_uniform_index = bpy.props.IntProperty("Active uniform index")
218 bpy.types.ShaderNodeTexImage.default_filter = bpy.props.BoolProperty(name="Default filter", description="Let the loading program determine filtering options")
219 bpy.types.ShaderNodeTexImage.use_mipmap = bpy.props.BoolProperty(name="Use mipmaps", description="Use mipmaps (automatically generated) for the texture", default=True)
220 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)
222 def unregister_properties():
224 bpy.utils.unregister_class(c)