]> git.tdb.fi Git - libs/gl.git/blob - blender/io_mspgl/properties.py
7fad772bb4fc96669dbba5facef15df16037b1c5
[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 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"
156         bl_context = "world"
157
158         def draw(self, context):
159                 world = context.scene.world
160                 self.layout.prop(world, "use_hdr")
161
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)
166
167 class MspGLUniformList(bpy.types.UIList):
168         bl_idname = "MATERIAL_UL_mspgl_uniforms"
169
170         def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
171                 uniform = item
172                 if self.layout_type=="GRID":
173                         layout.label(text="", icon_value=icon)
174                 else:
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])))
177
178 classes = [MspGLSceneProperties, MspGLMeshProperties, MspGLObjectProperties, MspGLMaterialProperties,
179         MspGLTextureNodeProperties, MspGLLightProperties, MspGLWorldProperties, MspGLUniform, MspGLUniformList]
180
181 def register_properties():
182         for c in classes:
183                 bpy.utils.register_class(c)
184
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")))
194
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)
196
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="")
215
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)
219
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")
231
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)
235
236 def unregister_properties():
237         for c in classes:
238                 bpy.utils.unregister_class(c)