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, "export_disposition")
15 class MspGLWorldProperties(bpy.types.Panel):
16 bl_idname = "WORLD_PT_mspgl_properties"
17 bl_label = "MspGL properties"
18 bl_space_type = "PROPERTIES"
19 bl_region_type = "WINDOW"
22 def draw(self, context):
23 world = context.scene.world
27 self.layout.prop(world, "use_sky")
29 self.layout.prop(world, "sun_light")
31 class MspGLMeshProperties(bpy.types.Panel):
32 bl_idname = "MESH_PT_mspgl_properties"
33 bl_label = "MspGL properties"
34 bl_space_type = "PROPERTIES"
35 bl_region_type = "WINDOW"
39 def poll(cls, context):
40 return context.active_object.type=="MESH"
42 def draw(self, context):
43 mesh = context.active_object.data
45 self.layout.prop(mesh, "smoothing")
46 self.layout.prop(mesh, "use_strips")
48 self.layout.separator()
50 col = self.layout.column()
51 col.label(text="Data selection")
52 col.prop(mesh, "use_lines")
53 col.prop(mesh, "vertex_groups")
54 col.prop(mesh, "max_groups_per_vertex")
56 self.layout.separator()
58 col = self.layout.column()
59 col.label(text="Texturing")
60 col.prop(mesh, "use_uv")
61 col.prop(mesh, "tangent_vecs")
62 col.prop(mesh, "tangent_uvtex")
64 class MspGLObjectProperties(bpy.types.Panel):
65 bl_idname = "OBJECT_PT_mspgl_properties"
66 bl_label = "MspGL properties"
67 bl_space_type = "PROPERTIES"
68 bl_region_type = "WINDOW"
72 def poll(cls, context):
73 return context.active_object.type=="MESH"
75 def draw(self, context):
76 obj = context.active_object
78 self.layout.prop(obj, "compound")
79 self.layout.prop(obj, "lod_for_parent")
80 if obj.lod_for_parent:
81 self.layout.prop(obj, "lod_index")
83 class MspGLMaterialProperties(bpy.types.Panel):
84 bl_idname = "MATERIAL_PT_mspgl_properties"
85 bl_label = "MspGL properties"
86 bl_space_type = "PROPERTIES"
87 bl_region_type = "WINDOW"
88 bl_context = "material"
91 def poll(cls, context):
92 return context.active_object.active_material is not None
94 def draw(self, context):
95 mat = context.active_object.active_material
99 self.layout.prop(mat, "render_mode")
100 if mat.render_mode=='CUSTOM':
101 self.layout.label(text="Render methods")
102 self.layout.template_list("MATERIAL_UL_mspgl_render_methods", "", mat, "render_methods", mat, "active_render_method_index")
103 row = self.layout.row()
104 row.operator("material.add_render_method")
105 row.operator("material.remove_render_method")
107 if mat.active_render_method_index<len(mat.render_methods):
108 method = mat.render_methods[mat.active_render_method_index]
109 self.layout.prop(method, "tag")
110 self.layout.prop(method, "shader")
111 self.layout.prop(method, "use_material")
113 self.layout.separator()
114 elif mat.render_mode=='EXTERNAL':
115 self.layout.prop(mat, "technique")
116 if mat.render_mode=='BUILTIN':
117 self.layout.prop(mat, "receive_shadows")
118 self.layout.prop(mat, "image_based_lighting")
119 self.layout.prop(mat, "instancing")
120 self.layout.prop(mat, "array_atlas")
122 self.layout.prop(mat, "array_layer")
123 if mat.render_mode=='CUSTOM':
124 self.layout.separator()
125 self.layout.label(text="Uniform values")
126 self.layout.template_list("MATERIAL_UL_mspgl_uniforms", "", mat, "uniforms", mat, "active_uniform_index")
127 row = self.layout.row()
128 row.operator("material.add_uniform")
129 row.operator("material.remove_uniform")
131 if mat.active_uniform_index<len(mat.uniforms):
132 uniform = mat.uniforms[mat.active_uniform_index]
133 self.layout.prop(uniform, "name")
134 self.layout.prop(uniform, "size")
135 row = self.layout.row(align=True)
136 row.label(text="Values")
137 for i in range(uniform.size):
138 row.prop(uniform, "values", text="", index=i)
140 class MspGLTextureNodeProperties(bpy.types.Panel):
141 bl_idname = "NODE_PT_mspgl_properties"
142 bl_label = "MspGL properties"
143 bl_space_type = "NODE_EDITOR"
144 bl_region_type = "UI"
148 def poll(cls, context):
149 node = context.active_node
150 return node and node.type=='TEX_IMAGE'
152 def draw(self, context):
153 node = context.active_node
157 self.layout.prop(node, "use_mipmap")
158 self.layout.prop(node, "max_anisotropy")
160 class MspGLLightProperties(bpy.types.Panel):
161 bl_idname = "LIGHT_PT_mspgl_properties"
162 bl_label = "MspGL properties"
163 bl_space_type = "PROPERTIES"
164 bl_region_type = "WINDOW"
168 def poll(cls, context):
169 return context.active_object.type=="LIGHT"
171 def draw(self, context):
172 light = context.active_object.data
175 self.layout.prop(light, "shadow_map_size")
177 class MspGLRenderProperties(bpy.types.Panel):
178 bl_idname = "RENDER_PT_mspgl_properties"
179 bl_label = "MspGL properties"
180 bl_space_type = "PROPERTIES"
181 bl_region_type = "WINDOW"
182 bl_context = "render"
184 def draw(self, context):
185 scene = context.scene
186 self.layout.prop(scene, "use_hdr")
187 if scene.eevee.use_gtao:
188 self.layout.prop(scene, "ao_samples")
190 class MspGLRenderMethod(bpy.types.PropertyGroup):
191 tag: bpy.props.StringProperty(name="Tag", description="Tag of the render method")
192 shader: bpy.props.StringProperty(name="Shader", description="Shader to use")
193 use_material: bpy.props.BoolProperty(name="Use material", description="Use material properties in this render method")
195 class MspGLRenderMethodList(bpy.types.UIList):
196 bl_idname = "MATERIAL_UL_mspgl_render_methods"
198 def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
200 if self.layout_type=="GRID":
201 layout.label(text="", icon_value=icon)
203 layout.prop(method, "tag", text="", emboss=False, icon_value=icon)
204 layout.label(text=(method.shader or "(no shader)"))
206 class MspGLUniform(bpy.types.PropertyGroup):
207 name: bpy.props.StringProperty(name="Name", description="Name of the uniform variable")
208 size: bpy.props.IntProperty(name="Size", description="Number of elements in the uniform", min=1, max=4, default=4)
209 values: bpy.props.FloatVectorProperty(name="Values", description="Values stored in the uniform", size=4)
211 class MspGLUniformList(bpy.types.UIList):
212 bl_idname = "MATERIAL_UL_mspgl_uniforms"
214 def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
216 if self.layout_type=="GRID":
217 layout.label(text="", icon_value=icon)
219 layout.prop(uniform, "name", text="", emboss=False, icon_value=icon)
220 layout.label(text="({})".format(", ".join("{:.3f}".format(v) for v in uniform.values[:uniform.size])))
222 classes = [MspGLSceneProperties, MspGLWorldProperties, MspGLMeshProperties, MspGLObjectProperties, MspGLMaterialProperties,
223 MspGLTextureNodeProperties, MspGLLightProperties, MspGLRenderProperties, MspGLRenderMethod,
224 MspGLRenderMethodList, MspGLUniform, MspGLUniformList]
226 def register_properties():
228 bpy.utils.register_class(c)
230 bpy.types.Scene.export_disposition = bpy.props.EnumProperty(name="Export disposition", description="What to do with this scene during project export", default="IGNORE",
231 items=(("IGNORE", "Ignore", "The scene won't be exported"),
232 ("CONTENTS", "Contents only", "Objects in the scene will be exported, but not the scene itself"),
233 ("SCENE", "Scene", "The scene will be exported"),
234 ("SEQUENCE", "Sequence", "The scene will be exported along with a rendering sequence")))
235 bpy.types.Scene.use_hdr = bpy.props.BoolProperty(name="High dynamic range", description="Use a range render target with a floating point format", default=False)
236 bpy.types.Scene.ao_samples = bpy.props.IntProperty(name="Ambient occlusion samples", description="Number of samples to use for ambient occlusion", min=8, max=128, default=32)
238 bpy.types.World.use_sky = bpy.props.BoolProperty(name="Realtime sky", description="Use a realtime rendered sky background", default=False)
239 bpy.types.World.sun_light = bpy.props.PointerProperty(type=bpy.types.Light, name="Sun", description="Light to use as sun for the sky")
241 bpy.types.Mesh.smoothing = bpy.props.EnumProperty(name="Smoothing", description="Smoothing method to use", default="MSPGL",
242 items=(("NONE", "None", "No smoothing"),
243 ("BLENDER", "Blender", "Use Blender's vertex normals"),
244 ("MSPGL", "MspGL", "Compute vertex normals internally")))
245 bpy.types.Mesh.use_lines = bpy.props.BoolProperty(name="Include lines", description="Include edges without faces as lines", default=False)
246 bpy.types.Mesh.use_strips = bpy.props.BoolProperty(name="Use strips", description="Combine the mesh's triangles into triangle strips", default=True)
247 bpy.types.Mesh.vertex_groups = bpy.props.BoolProperty(name="Vertex groups", description="Include vertex groups and weights", default=False)
248 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)
249 bpy.types.Mesh.use_uv = bpy.props.EnumProperty(name="Use UV", description="Use UV coordinates", default="UNIT0",
250 items=(("NONE", "None", "Ignore all UV coordinates"),
251 ("UNIT0", "Unit 0", "Use UV coordinates for unit 0"),
252 ("ALL", "All", "Use all UV coordinates")))
253 bpy.types.Mesh.tangent_vecs = bpy.props.EnumProperty(name="Tangent vectors", description="Compute tangent vectors for vertices", default="AUTO",
254 items=(("NO", "No", "Do not export tangent vectors"),
255 ("AUTO", "Auto", "Automatically determine the need for tangent vectors"),
256 ("YES", "Yes", "Always export tangent vectors")))
257 bpy.types.Mesh.tangent_uvtex = bpy.props.StringProperty(name="Tangent UV layer", description="UV layer to use as basis for tangent vectors", default="")
259 bpy.types.Object.compound = bpy.props.BoolProperty(name="Compound with parent", description="Join this object to its parent when exporting")
260 bpy.types.Object.lod_for_parent = bpy.props.BoolProperty(name="LoD for parent", description="This object is a level of detail for its parent")
261 bpy.types.Object.lod_index = bpy.props.IntProperty(name="LoD index", description="Index of the level of detail", min=1, max=16, default=1)
263 bpy.types.Material.render_mode = bpy.props.EnumProperty(name="Render mode", description="How this material should be rendered", default="BUILTIN",
264 items=(("BUILTIN", "Built-in", "Use built-in shaders"),
265 ("CUSTOM", "Custom shaders", "Use custom shaders"),
266 ("EXTERNAL", "External technique", "Use an externally defined technique")))
267 bpy.types.Material.technique = bpy.props.StringProperty(name="Custom technique", description="Name of an external technique to use for rendering")
268 bpy.types.Material.render_methods = bpy.props.CollectionProperty(type=MspGLRenderMethod, name="Render methods", description="Custom render methods to use for rendering")
269 bpy.types.Material.active_render_method_index = bpy.props.IntProperty("Active render method index")
270 bpy.types.Material.receive_shadows = bpy.props.BoolProperty(name="Receive shadows", description="Receive shadows from a shadow map", default=True)
271 bpy.types.Material.image_based_lighting = bpy.props.BoolProperty(name="Image based lighting", description="Use an environment map for ambient lighting", default=False)
272 bpy.types.Material.instancing = bpy.props.BoolProperty(name="Instanced rendering", description="Use instanced draw calls for objects with this material", default=False)
273 bpy.types.Material.array_atlas = bpy.props.BoolProperty(name="Texture array atlas", description="The material is stored in a texture array")
274 bpy.types.Material.array_layer = bpy.props.IntProperty("Texture array layer", description="Layer of the texture array atlas to use")
275 bpy.types.Material.uniforms = bpy.props.CollectionProperty(type=MspGLUniform, name="Uniforms", description="Uniform variables to add to the technique")
276 bpy.types.Material.active_uniform_index = bpy.props.IntProperty("Active uniform index")
278 bpy.types.ShaderNodeTexImage.use_mipmap = bpy.props.BoolProperty(name="Use mipmaps", description="Use mipmaps (automatically generated) for the texture", default=True)
279 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)
281 bpy.types.Light.shadow_map_size = bpy.props.EnumProperty(name="Shadow map size", description="Size of shadow map to use for rendering shadows", default="4096",
282 items=(("256", "256", ""),
284 ("1024", "1024", ""),
285 ("2048", "2048", ""),
286 ("4096", "4096", ""),
287 ("8192", "8192", ""),
288 ("16384", "16384", "")))
290 def unregister_properties():
292 bpy.utils.unregister_class(c)