armory/blender/props.py

146 lines
6.4 KiB
Python
Raw Normal View History

2015-12-02 00:05:20 +01:00
import shutil
import bpy
import os
import json
2016-01-28 14:47:46 +01:00
import nodes_pipeline
2015-12-02 00:05:20 +01:00
from bpy.types import Menu, Panel, UIList
from bpy.props import *
def cb_scene_update(context):
edit_obj = bpy.context.edit_object
if edit_obj is not None and edit_obj.is_updated_data is True:
edit_obj.geometry_cached = False
2016-01-11 21:10:33 +01:00
def initProperties():
# For object
2016-01-25 20:43:11 +01:00
bpy.types.Object.geometry_cached = bpy.props.BoolProperty(name="Geometry Cached", default=False) # TODO: move to mesh type
bpy.types.Object.instanced_children = bpy.props.BoolProperty(name="Instanced Children", default=False)
bpy.types.Object.custom_material = bpy.props.BoolProperty(name="Custom Material", default=False)
2016-01-11 16:03:55 +01:00
bpy.types.Object.custom_material_name = bpy.props.StringProperty(name="Name", default="")
2016-05-18 01:34:21 +02:00
bpy.types.Object.game_export = bpy.props.BoolProperty(name="Game Export", default=True)
2016-01-11 21:10:33 +01:00
# For geometry
2016-01-25 20:43:11 +01:00
bpy.types.Mesh.static_usage = bpy.props.BoolProperty(name="Static Usage", default=True)
2016-01-11 16:03:55 +01:00
# For camera
bpy.types.Camera.frustum_culling = bpy.props.BoolProperty(name="Frustum Culling", default=False)
2016-01-25 20:43:11 +01:00
bpy.types.Camera.sort_front_to_back = bpy.props.BoolProperty(name="Sort Front to Back", default=False)
2016-05-06 19:46:56 +02:00
bpy.types.Camera.pipeline_path = bpy.props.StringProperty(name="Pipeline Path", default="deferred_pipeline")
bpy.types.Camera.pipeline_id = bpy.props.StringProperty(name="Pipeline ID", default="deferred")
# TODO: Specify multiple material ids, merge ids from multiple cameras
2016-05-27 01:12:21 +02:00
bpy.types.Camera.geometry_context = bpy.props.StringProperty(name="Geometry", default="deferred")
bpy.types.Camera.shadows_context = bpy.props.StringProperty(name="Shadows", default="shadowmap")
bpy.types.Camera.translucent_context = bpy.props.StringProperty(name="Translucent", default="translucent")
2016-06-07 09:38:49 +02:00
bpy.types.Camera.is_probe = bpy.props.BoolProperty(name="Probe", default=False)
bpy.types.Camera.probe_texture = bpy.props.StringProperty(name="Texture", default="")
bpy.types.Camera.probe_num_mips = bpy.props.IntProperty(name="Number of mips", default=0)
bpy.types.Camera.probe_volume = bpy.props.StringProperty(name="Volume", default="")
bpy.types.Camera.probe_strength = bpy.props.FloatProperty(name="Strength", default=1.0)
bpy.types.Camera.probe_blending = bpy.props.FloatProperty(name="Blending", default=0.0)
2016-04-08 16:17:57 +02:00
# TODO: move to world
bpy.types.Camera.world_envtex_name = bpy.props.StringProperty(name="Environment Texture", default='')
bpy.types.Camera.world_envtex_num_mips = bpy.props.IntProperty(name="Number of mips", default=0)
bpy.types.Camera.world_envtex_strength = bpy.props.FloatProperty(name="Environment Strength", default=1.0)
2016-05-18 01:34:21 +02:00
bpy.types.Camera.last_decal_context = bpy.props.StringProperty(name="Decal Context", default='')
2016-06-03 17:18:38 +02:00
bpy.types.World.world_defs = bpy.props.StringProperty(name="World Shader Defs", default='')
2016-01-11 16:03:55 +01:00
# For material
2016-01-25 20:43:11 +01:00
bpy.types.Material.receive_shadow = bpy.props.BoolProperty(name="Receive Shadow", default=True)
bpy.types.Material.custom_shader = bpy.props.BoolProperty(name="Custom Shader", default=False)
2016-05-16 13:02:16 +02:00
bpy.types.Material.custom_shader_name = bpy.props.StringProperty(name="Name", default='')
2016-04-02 18:19:52 +02:00
bpy.types.Material.stencil_mask = bpy.props.IntProperty(name="Stencil Mask", default=0)
2016-01-25 20:43:11 +01:00
bpy.types.Material.export_tangents = bpy.props.BoolProperty(name="Export Tangents", default=False)
2016-05-16 13:02:16 +02:00
bpy.types.Material.skip_context = bpy.props.StringProperty(name="Skip Context", default='')
2015-12-02 00:05:20 +01:00
2015-12-03 14:38:33 +01:00
# Menu in object region
2016-01-11 16:03:55 +01:00
class ObjectPropsPanel(bpy.types.Panel):
2015-12-02 00:05:20 +01:00
bl_label = "Cycles Props"
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "object"
def draw(self, context):
layout = self.layout
obj = bpy.context.object
2016-05-18 01:34:21 +02:00
layout.prop(obj, 'game_export')
2015-12-02 00:05:20 +01:00
if obj.type == 'MESH':
layout.prop(obj, 'instanced_children')
2016-01-11 16:03:55 +01:00
layout.prop(obj, 'custom_material')
if obj.custom_material:
layout.prop(obj, 'custom_material_name')
2016-01-11 21:10:33 +01:00
# Menu in data region
2016-01-11 16:03:55 +01:00
class DataPropsPanel(bpy.types.Panel):
bl_label = "Cycles Props"
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "data"
def draw(self, context):
layout = self.layout
obj = bpy.context.object
if obj.type == 'CAMERA':
2016-06-07 09:38:49 +02:00
layout.prop(obj.data, 'is_probe')
if obj.data.is_probe == True:
layout.prop(obj.data, 'probe_texture')
layout.prop_search(obj.data, "probe_volume", bpy.data, "objects")
layout.prop(obj.data, 'probe_strength')
layout.prop(obj.data, 'probe_blending')
2016-01-11 16:03:55 +01:00
layout.prop(obj.data, 'frustum_culling')
2016-01-25 20:43:11 +01:00
layout.prop(obj.data, 'sort_front_to_back')
2016-01-26 14:36:55 +01:00
layout.prop_search(obj.data, "pipeline_path", bpy.data, "node_groups")
2016-02-08 17:28:05 +01:00
layout.prop(obj.data, 'pipeline_id')
2016-05-27 01:12:21 +02:00
layout.prop(obj.data, 'geometry_context')
layout.prop(obj.data, 'shadows_context')
layout.prop(obj.data, 'translucent_context')
2016-01-27 23:40:33 +01:00
layout.operator("cg.reset_pipelines")
2016-01-11 21:10:33 +01:00
elif obj.type == 'MESH':
layout.prop(obj.data, 'static_usage')
2016-06-21 13:29:27 +02:00
layout.operator("cg.invalidate_cache")
2015-12-02 00:05:20 +01:00
2016-01-27 23:40:33 +01:00
class OBJECT_OT_RESETPIPELINESButton(bpy.types.Operator):
bl_idname = "cg.reset_pipelines"
bl_label = "Reset Pipelines"
def execute(self, context):
2016-01-28 14:47:46 +01:00
nodes_pipeline.reset_pipelines()
2016-01-27 23:40:33 +01:00
return{'FINISHED'}
2016-06-21 13:29:27 +02:00
class OBJECT_OT_INVALIDATECACHEButton(bpy.types.Operator):
bl_idname = "cg.invalidate_cache"
bl_label = "Invalidate Cache"
def execute(self, context):
context.object.geometry_cached = False
return{'FINISHED'}
2015-12-03 14:38:33 +01:00
# Menu in materials region
class MatsPropsPanel(bpy.types.Panel):
bl_label = "Cycles Props"
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "material"
def draw(self, context):
layout = self.layout
mat = bpy.context.material
layout.prop(mat, 'receive_shadow')
2015-12-07 21:05:27 +01:00
layout.prop(mat, 'custom_shader')
if mat.custom_shader:
layout.prop(mat, 'custom_shader_name')
2016-04-02 18:19:52 +02:00
layout.prop(mat, 'stencil_mask')
2016-05-16 13:02:16 +02:00
layout.prop(mat, 'skip_context')
2015-12-03 14:38:33 +01:00
2016-01-27 23:40:33 +01:00
2015-12-02 00:05:20 +01:00
# Registration
2015-12-07 20:04:23 +01:00
def register():
bpy.utils.register_module(__name__)
2016-01-11 21:10:33 +01:00
initProperties()
2015-12-07 21:05:27 +01:00
bpy.app.handlers.scene_update_post.append(cb_scene_update)
2015-12-07 20:04:23 +01:00
def unregister():
2015-12-07 21:05:27 +01:00
bpy.app.handlers.scene_update_post.remove(cb_scene_update)
2015-12-07 20:04:23 +01:00
bpy.utils.unregister_module(__name__)