]> git.tdb.fi Git - libs/gl.git/blob - blender/io_mspgl/properties.py
Add a Blender operator to export the entire project at once
[libs/gl.git] / blender / io_mspgl / properties.py
1 import bpy
2
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"
8         bl_context = "scene"
9
10         def draw(self, context):
11                 scene = context.scene
12
13                 self.layout.prop(scene, "scene_type")
14                 self.layout.prop(scene, "export_disposition")
15
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"
21         bl_context = "data"
22
23         @classmethod
24         def poll(cls, context):
25                 return context.active_object.type=="MESH"
26
27         def draw(self, context):
28                 mesh = context.active_object.data
29
30                 self.layout.prop(mesh, "winding_test")
31                 self.layout.prop(mesh, "smoothing")
32                 self.layout.prop(mesh, "use_strips")
33
34                 self.layout.separator()
35
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")
41
42                 self.layout.separator()
43
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")
49
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"
55         bl_context = "object"
56
57         @classmethod
58         def poll(cls, context):
59                 return context.active_object.type=="MESH"
60
61         def draw(self, context):
62                 obj = context.active_object
63
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")
68
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"
75
76         @classmethod
77         def poll(cls, context):
78                 return context.active_object.active_material is not None
79
80         def draw(self, context):
81                 mat = context.active_object.active_material
82                 if not mat:
83                         return
84
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")
91                 if 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")
102
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)
111
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"
117         bl_category = "Item"
118
119         @classmethod
120         def poll(cls, context):
121                 node = context.active_node
122                 return node and node.type=='TEX_IMAGE'
123
124         def draw(self, context):
125                 node = context.active_node
126                 if not node:
127                         return
128
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")
133
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"
139         bl_context = "data"
140
141         @classmethod
142         def poll(cls, context):
143                 return context.active_object.type=="LIGHT"
144
145         def draw(self, context):
146                 light = context.active_object.data
147
148                 if light.use_shadow:
149                         self.layout.prop(light, "shadow_map_size")
150
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)
155
156 class MspGLUniformList(bpy.types.UIList):
157         bl_idname = "MATERIAL_UL_mspgl_uniforms"
158
159         def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
160                 uniform = item
161                 if self.layout_type=="GRID":
162                         layout.label(text="", icon_value=icon)
163                 else:
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])))
166
167 classes = [MspGLSceneProperties, MspGLMeshProperties, MspGLObjectProperties, MspGLMaterialProperties, MspGLTextureNodeProperties, MspGLLightProperties, MspGLUniform, MspGLUniformList]
168
169 def register_properties():
170         for c in classes:
171                 bpy.utils.register_class(c)
172
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")))
182
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="")
201
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)
205
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")
217
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)
221
222 def unregister_properties():
223         for c in classes:
224                 bpy.utils.unregister_class(c)