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 MspGLWorldProperties(bpy.types.Panel):
152 bl_idname = "WORLD_PT_mspgl_properties"
153 bl_label = "MspGL properties"
154 bl_space_type = "PROPERTIES"
155 bl_region_type = "WINDOW"
158 def draw(self, context):
159 world = context.scene.world
160 self.layout.prop(world, "use_hdr")
162 class MspGLUniform(bpy.types.PropertyGroup):
163 name: bpy.props.StringProperty(name="Name", description="Name of the uniform variable")
164 size: bpy.props.IntProperty(name="Size", description="Number of elements in the uniform", min=1, max=4, default=4)
165 values: bpy.props.FloatVectorProperty(name="Values", description="Values stored in the uniform", size=4)
167 class MspGLUniformList(bpy.types.UIList):
168 bl_idname = "MATERIAL_UL_mspgl_uniforms"
170 def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
172 if self.layout_type=="GRID":
173 layout.label(text="", icon_value=icon)
175 layout.prop(uniform, "name", text="", emboss=False, icon_value=icon)
176 layout.label(text="({})".format(", ".join("{:.3f}".format(v) for v in uniform.values[:uniform.size])))
178 classes = [MspGLSceneProperties, MspGLMeshProperties, MspGLObjectProperties, MspGLMaterialProperties,
179 MspGLTextureNodeProperties, MspGLLightProperties, MspGLWorldProperties, MspGLUniform, MspGLUniformList]
181 def register_properties():
183 bpy.utils.register_class(c)
185 bpy.types.Scene.scene_type = bpy.props.EnumProperty(name="Scene type", description="Type of scene to use for exporting", default="SIMPLE",
186 items=(("SIMPLE", "Simple", "Objects are rendered in no specific order"),
187 ("ORDERED", "Ordered", "Objects are rendered in order by their name"),
188 ("ZSORTED", "Z-sorted", "Objects are rendered in order by their distance from the camera")))
189 bpy.types.Scene.export_disposition = bpy.props.EnumProperty(name="Export disposition", description="What to do with this scene during project export", default="IGNORE",
190 items=(("IGNORE", "Ignore", "The scene won't be exported"),
191 ("CONTENTS", "Contents only", "Objects in the scene will be exported, but not the scene itself"),
192 ("SCENE", "Scene", "The scene will be exported"),
193 ("SEQUENCE", "Sequence", "The scene will be exported along with a rendering sequence")))
195 bpy.types.World.use_hdr = bpy.props.BoolProperty(name="High dynamic range", description="Use a range render target with a floating point format", default=False)
197 bpy.types.Mesh.winding_test = bpy.props.BoolProperty(name="Winding test", description="Perform winding test to skip back faces")
198 bpy.types.Mesh.smoothing = bpy.props.EnumProperty(name="Smoothing", description="Smoothing method to use", default="MSPGL",
199 items=(("NONE", "None", "No smoothing"),
200 ("BLENDER", "Blender", "Use Blender's vertex normals"),
201 ("MSPGL", "MspGL", "Compute vertex normals internally")))
202 bpy.types.Mesh.use_lines = bpy.props.BoolProperty(name="Include lines", description="Include edges without faces as lines", default=False)
203 bpy.types.Mesh.use_strips = bpy.props.BoolProperty(name="Use strips", description="Combine the mesh's triangles into triangle strips", default=True)
204 bpy.types.Mesh.vertex_groups = bpy.props.BoolProperty(name="Vertex groups", description="Include vertex groups and weights", default=False)
205 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)
206 bpy.types.Mesh.use_uv = bpy.props.EnumProperty(name="Use UV", description="Use UV coordinates", default="UNIT0",
207 items=(("NONE", "None", "Ignore all UV coordinates"),
208 ("UNIT0", "Unit 0", "Use UV coordinates for unit 0"),
209 ("ALL", "All", "Use all UV coordinates")))
210 bpy.types.Mesh.tangent_vecs = bpy.props.EnumProperty(name="Tangent vectors", description="Compute tangent vectors for vertices", default="AUTO",
211 items=(("NO", "No", "Do not export tangent vectors"),
212 ("AUTO", "Auto", "Automatically determine the need for tangent vectors"),
213 ("YES", "Yes", "Always export tangent vectors")))
214 bpy.types.Mesh.tangent_uvtex = bpy.props.StringProperty(name="Tangent UV layer", description="UV layer to use as basis for tangent vectors", default="")
216 bpy.types.Object.compound = bpy.props.BoolProperty(name="Compound with parent", description="Join this object to its parent when exporting")
217 bpy.types.Object.lod_for_parent = bpy.props.BoolProperty(name="LoD for parent", description="This object is a level of detail for its parent")
218 bpy.types.Object.lod_index = bpy.props.IntProperty(name="LoD index", description="Index of the level of detail", min=1, max=16, default=1)
220 bpy.types.Material.render_mode = bpy.props.EnumProperty(name="Render mode", description="How this material should be rendered", default="BUILTIN",
221 items=(("BUILTIN", "Built-in", "Use built-in shaders"),
222 ("CUSTOM", "Custom shader", "Use a custom shader"),
223 ("EXTERNAL", "External technique", "Use an externally defined technique")))
224 bpy.types.Material.technique = bpy.props.StringProperty(name="Custom technique", description="Name of an external technique to use for rendering")
225 bpy.types.Material.shader = bpy.props.StringProperty(name="Custom shader", description="Name of an external technique to use for rendering")
226 bpy.types.Material.array_atlas = bpy.props.BoolProperty(name="Texture array atlas", description="The material is stored in a texture array")
227 bpy.types.Material.array_layer = bpy.props.IntProperty("Texture array layer", description="Layer of the texture array atlas to use")
228 bpy.types.Material.material_atlas = bpy.props.BoolProperty(name="Material atlas", description="Make this material part of a material atlas")
229 bpy.types.Material.uniforms = bpy.props.CollectionProperty(type=MspGLUniform, name="Uniform", description="Uniform variables to add to the technique")
230 bpy.types.Material.active_uniform_index = bpy.props.IntProperty("Active uniform index")
232 bpy.types.ShaderNodeTexImage.default_filter = bpy.props.BoolProperty(name="Default filter", description="Let the loading program determine filtering options")
233 bpy.types.ShaderNodeTexImage.use_mipmap = bpy.props.BoolProperty(name="Use mipmaps", description="Use mipmaps (automatically generated) for the texture", default=True)
234 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)
236 def unregister_properties():
238 bpy.utils.unregister_class(c)