Merge pull request #2018 from MoritzBrueckner/driver-api
Add per-material UI support for driver API
This commit is contained in:
commit
29297513cf
|
@ -1,16 +1,32 @@
|
|||
from typing import Callable, Dict, Optional
|
||||
|
||||
drivers = dict()
|
||||
from bpy.types import Material, UILayout
|
||||
|
||||
def add_driver(driver_name, draw_props, make_rpass, make_rpath):
|
||||
global drivers
|
||||
from arm.material.shader import ShaderContext
|
||||
|
||||
if driver_name in drivers:
|
||||
return
|
||||
drivers: Dict[str, Dict] = dict()
|
||||
|
||||
d = {}
|
||||
d['driver_name'] = driver_name
|
||||
d['draw_props'] = draw_props
|
||||
d['make_rpass'] = make_rpass
|
||||
d['make_rpath'] = make_rpath
|
||||
|
||||
drivers[driver_name] = d
|
||||
def add_driver(driver_name: str,
|
||||
make_rpass: Callable[[str], Optional[ShaderContext]], make_rpath: Callable[[], None],
|
||||
draw_props: Optional[Callable[[UILayout], None]], draw_mat_props: Optional[Callable[[UILayout, Material], None]]) -> None:
|
||||
"""Register a new driver. If there already exists a driver with the given name, nothing happens.
|
||||
|
||||
@param driver_name Unique name for the new driver that will be displayed in the UI.
|
||||
@param make_rpass Function to create render passes. Takes the rpass name as a parameter and may return `None`.
|
||||
@param make_rpath Function to setup the render path.
|
||||
@param draw_props Function to draw global driver properties inside the render path panel, may be `None`.
|
||||
@param draw_mat_props Function to draw per-material driver properties in the material tab, may be `None`.
|
||||
"""
|
||||
global drivers
|
||||
|
||||
if driver_name in drivers:
|
||||
return
|
||||
|
||||
drivers[driver_name] = {
|
||||
'driver_name': driver_name,
|
||||
'make_rpass': make_rpass,
|
||||
'make_rpath': make_rpath,
|
||||
'draw_props': draw_props,
|
||||
'draw_mat_props': draw_mat_props
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@ class ShaderData:
|
|||
self.sd['name'] = self.matname + '_data'
|
||||
self.sd['contexts'] = []
|
||||
|
||||
def add_context(self, props):
|
||||
def add_context(self, props) -> 'ShaderContext':
|
||||
con = ShaderContext(self.material, self.sd, props)
|
||||
if con not in self.sd['contexts']:
|
||||
for elem in self.global_elems:
|
||||
|
|
|
@ -267,7 +267,7 @@ class ARM_PT_MaterialPropsPanel(bpy.types.Panel):
|
|||
layout.use_property_split = True
|
||||
layout.use_property_decorate = False
|
||||
mat = bpy.context.material
|
||||
if mat == None:
|
||||
if mat is None:
|
||||
return
|
||||
|
||||
layout.prop(mat, 'arm_cast_shadow')
|
||||
|
@ -294,6 +294,40 @@ class ARM_PT_MaterialPropsPanel(bpy.types.Panel):
|
|||
|
||||
layout.operator("arm.invalidate_material_cache")
|
||||
|
||||
|
||||
class ARM_PT_MaterialDriverPropsPanel(bpy.types.Panel):
|
||||
"""Per-material properties for custom render path drivers"""
|
||||
bl_label = "Armory Driver Properties"
|
||||
bl_space_type = "PROPERTIES"
|
||||
bl_region_type = "WINDOW"
|
||||
bl_context = "material"
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
mat = context.material
|
||||
if mat is None:
|
||||
return False
|
||||
|
||||
wrd = bpy.data.worlds['Arm']
|
||||
if wrd.arm_rplist_index < 0 or len(wrd.arm_rplist) == 0:
|
||||
return False
|
||||
|
||||
if len(arm.api.drivers) == 0:
|
||||
return False
|
||||
|
||||
rpdat = wrd.arm_rplist[wrd.arm_rplist_index]
|
||||
return rpdat.rp_driver != 'Armory' and arm.api.drivers[rpdat.rp_driver]['draw_mat_props'] is not None
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
layout.use_property_split = True
|
||||
layout.use_property_decorate = False
|
||||
|
||||
wrd = bpy.data.worlds['Arm']
|
||||
rpdat = wrd.arm_rplist[wrd.arm_rplist_index]
|
||||
arm.api.drivers[rpdat.rp_driver]['draw_mat_props'](layout, context.material)
|
||||
|
||||
|
||||
class ARM_PT_MaterialBlendingPropsPanel(bpy.types.Panel):
|
||||
bl_label = "Blending"
|
||||
bl_space_type = "PROPERTIES"
|
||||
|
@ -2224,6 +2258,7 @@ def register():
|
|||
bpy.utils.register_class(InvalidateMaterialCacheButton)
|
||||
bpy.utils.register_class(ARM_PT_MaterialPropsPanel)
|
||||
bpy.utils.register_class(ARM_PT_MaterialBlendingPropsPanel)
|
||||
bpy.utils.register_class(ARM_PT_MaterialDriverPropsPanel)
|
||||
bpy.utils.register_class(ARM_PT_ArmoryPlayerPanel)
|
||||
bpy.utils.register_class(ARM_PT_ArmoryExporterPanel)
|
||||
bpy.utils.register_class(ARM_PT_ArmoryExporterAndroidSettingsPanel)
|
||||
|
@ -2296,8 +2331,9 @@ def unregister():
|
|||
bpy.utils.unregister_class(ARM_PT_ScenePropsPanel)
|
||||
bpy.utils.unregister_class(InvalidateCacheButton)
|
||||
bpy.utils.unregister_class(InvalidateMaterialCacheButton)
|
||||
bpy.utils.unregister_class(ARM_PT_MaterialPropsPanel)
|
||||
bpy.utils.unregister_class(ARM_PT_MaterialDriverPropsPanel)
|
||||
bpy.utils.unregister_class(ARM_PT_MaterialBlendingPropsPanel)
|
||||
bpy.utils.unregister_class(ARM_PT_MaterialPropsPanel)
|
||||
bpy.utils.unregister_class(ARM_PT_ArmoryPlayerPanel)
|
||||
bpy.utils.unregister_class(ARM_PT_ArmoryExporterHTML5SettingsPanel)
|
||||
bpy.utils.unregister_class(ARM_PT_ArmoryExporterAndroidBuildAPKPanel)
|
||||
|
|
Loading…
Reference in a new issue