This uses a normalized version of blackbody radiation, so the colors still vary but the brightness doesn't vary nearly as wildly as with genuine blackbody radiation.
291 lines
9.3 KiB
Python
291 lines
9.3 KiB
Python
import bpy
|
|
|
|
# Use some of the existing buttons.
|
|
from bl_ui import properties_render
|
|
properties_render.RENDER_PT_render.COMPAT_ENGINES.add('PSYCHOPATH_RENDER')
|
|
properties_render.RENDER_PT_dimensions.COMPAT_ENGINES.add('PSYCHOPATH_RENDER')
|
|
properties_render.RENDER_PT_output.COMPAT_ENGINES.add('PSYCHOPATH_RENDER')
|
|
del properties_render
|
|
|
|
from bl_ui import properties_data_camera
|
|
properties_data_camera.DATA_PT_lens.COMPAT_ENGINES.add('PSYCHOPATH_RENDER')
|
|
properties_data_camera.DATA_PT_camera.COMPAT_ENGINES.add('PSYCHOPATH_RENDER')
|
|
properties_data_camera.DATA_PT_camera_display.COMPAT_ENGINES.add('PSYCHOPATH_RENDER')
|
|
properties_data_camera.DATA_PT_custom_props_camera.COMPAT_ENGINES.add('PSYCHOPATH_RENDER')
|
|
del properties_data_camera
|
|
|
|
class PsychopathPanel():
|
|
COMPAT_ENGINES = {'PSYCHOPATH_RENDER'}
|
|
|
|
@classmethod
|
|
def poll(cls, context):
|
|
rd = context.scene.render
|
|
return (rd.use_game_engine is False) and (rd.engine in cls.COMPAT_ENGINES)
|
|
|
|
|
|
class RENDER_PT_psychopath_render_settings(PsychopathPanel, bpy.types.Panel):
|
|
bl_label = "Render Settings"
|
|
bl_space_type = 'PROPERTIES'
|
|
bl_region_type = 'WINDOW'
|
|
bl_context = "render"
|
|
|
|
def draw(self, context):
|
|
scene = context.scene
|
|
layout = self.layout
|
|
|
|
col = layout.column()
|
|
|
|
col.label(text="Sampling")
|
|
col.prop(scene.psychopath, "spp")
|
|
|
|
col.label(text="Dicing")
|
|
col.prop(scene.psychopath, "dicing_rate")
|
|
|
|
col.label(text="Motion Blur")
|
|
col.prop(scene.psychopath, "motion_blur_segments")
|
|
col.prop(scene.psychopath, "shutter_start")
|
|
col.prop(scene.psychopath, "shutter_end")
|
|
|
|
col.label(text="Performance")
|
|
col.prop(scene.psychopath, "max_samples_per_bucket")
|
|
|
|
|
|
class RENDER_PT_psychopath_export_settings(PsychopathPanel, bpy.types.Panel):
|
|
bl_label = "Export Settings"
|
|
bl_space_type = 'PROPERTIES'
|
|
bl_region_type = 'WINDOW'
|
|
bl_context = "render"
|
|
|
|
def draw(self, context):
|
|
scene = context.scene
|
|
layout = self.layout
|
|
|
|
col = layout.column()
|
|
col.prop(scene.psychopath, "export_path")
|
|
|
|
|
|
class WORLD_PT_psychopath_background(PsychopathPanel, bpy.types.Panel):
|
|
bl_label = "Background"
|
|
bl_space_type = 'PROPERTIES'
|
|
bl_region_type = 'WINDOW'
|
|
bl_context = "world"
|
|
|
|
@classmethod
|
|
def poll(cls, context):
|
|
return context.world and PsychopathPanel.poll(context)
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
world = context.world
|
|
layout.prop(world, "horizon_color", text="Color")
|
|
|
|
|
|
class DATA_PT_psychopath_camera_dof(PsychopathPanel, bpy.types.Panel):
|
|
bl_label = "Depth of Field"
|
|
bl_space_type = 'PROPERTIES'
|
|
bl_region_type = 'WINDOW'
|
|
bl_context = "data"
|
|
|
|
@classmethod
|
|
def poll(cls, context):
|
|
engine = context.scene.render.engine
|
|
return context.camera and PsychopathPanel.poll(context)
|
|
|
|
def draw(self, context):
|
|
ob = context.active_object
|
|
layout = self.layout
|
|
|
|
col = layout.column()
|
|
|
|
col.prop(ob.data, "dof_object")
|
|
col.prop(ob.data, "dof_distance")
|
|
col.prop(ob.data.psychopath, "aperture_radius")
|
|
|
|
|
|
class DATA_PT_psychopath_lamp(PsychopathPanel, bpy.types.Panel):
|
|
bl_label = "Lamp"
|
|
bl_space_type = 'PROPERTIES'
|
|
bl_region_type = 'WINDOW'
|
|
bl_context = "data"
|
|
|
|
@classmethod
|
|
def poll(cls, context):
|
|
engine = context.scene.render.engine
|
|
return context.lamp and PsychopathPanel.poll(context)
|
|
|
|
def draw(self, context):
|
|
ob = context.active_object
|
|
layout = self.layout
|
|
|
|
col = layout.column()
|
|
|
|
row = col.row()
|
|
row.prop(ob.data, "type", expand=True)
|
|
|
|
if ob.data.type != 'HEMI' and ob.data.type != 'AREA':
|
|
col.prop(ob.data, "shadow_soft_size")
|
|
|
|
col.prop(ob.data.psychopath, "color_type")
|
|
|
|
if ob.data.psychopath.color_type == 'Rec709':
|
|
col.prop(ob.data, "color")
|
|
elif ob.data.psychopath.color_type == 'Blackbody' or ob.data.psychopath.color_type == 'ColorTemperature':
|
|
col.prop(ob.data.psychopath, "color_blackbody_temp")
|
|
|
|
col.prop(ob.data, "energy")
|
|
|
|
|
|
class DATA_PT_psychopath_area_lamp(PsychopathPanel, bpy.types.Panel):
|
|
bl_label = "Area Shape"
|
|
bl_space_type = 'PROPERTIES'
|
|
bl_region_type = 'WINDOW'
|
|
bl_context = "data"
|
|
|
|
@classmethod
|
|
def poll(cls, context):
|
|
lamp = context.lamp
|
|
engine = context.scene.render.engine
|
|
return (lamp and lamp.type == 'AREA') and (engine in cls.COMPAT_ENGINES)
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
lamp = context.lamp
|
|
|
|
col = layout.column()
|
|
col.row().prop(lamp, "shape", expand=True)
|
|
sub = col.row(align=True)
|
|
|
|
if lamp.shape == 'SQUARE':
|
|
sub.prop(lamp, "size")
|
|
elif lamp.shape == 'RECTANGLE':
|
|
sub.prop(lamp, "size", text="Size X")
|
|
sub.prop(lamp, "size_y", text="Size Y")
|
|
|
|
|
|
class DATA_PT_psychopath_mesh(PsychopathPanel, bpy.types.Panel):
|
|
bl_label = "Psychopath Mesh Properties"
|
|
bl_space_type = 'PROPERTIES'
|
|
bl_region_type = 'WINDOW'
|
|
bl_context = "data"
|
|
|
|
@classmethod
|
|
def poll(cls, context):
|
|
engine = context.scene.render.engine
|
|
return context.mesh and (engine in cls.COMPAT_ENGINES)
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
mesh = context.mesh
|
|
|
|
layout.row().prop(mesh.psychopath, "is_subdivision_surface")
|
|
|
|
|
|
class MATERIAL_PT_psychopath_context_material(PsychopathPanel, bpy.types.Panel):
|
|
bl_label = ""
|
|
bl_space_type = "PROPERTIES"
|
|
bl_region_type = "WINDOW"
|
|
bl_context = "material"
|
|
bl_options = {'HIDE_HEADER'}
|
|
|
|
@classmethod
|
|
def poll(cls, context):
|
|
return (context.material or context.object) and PsychopathPanel.poll(context)
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
mat = context.material
|
|
ob = context.object
|
|
slot = context.material_slot
|
|
space = context.space_data
|
|
|
|
if ob:
|
|
row = layout.row()
|
|
|
|
row.template_list("MATERIAL_UL_matslots", "", ob, "material_slots", ob, "active_material_index", rows=1)
|
|
|
|
col = row.column(align=True)
|
|
col.operator("object.material_slot_add", icon='ZOOMIN', text="")
|
|
col.operator("object.material_slot_remove", icon='ZOOMOUT', text="")
|
|
|
|
col.menu("MATERIAL_MT_specials", icon='DOWNARROW_HLT', text="")
|
|
|
|
if ob.mode == 'EDIT':
|
|
row = layout.row(align=True)
|
|
row.operator("object.material_slot_assign", text="Assign")
|
|
row.operator("object.material_slot_select", text="Select")
|
|
row.operator("object.material_slot_deselect", text="Deselect")
|
|
|
|
split = layout.split(percentage=0.65)
|
|
|
|
if ob:
|
|
split.template_ID(ob, "active_material", new="material.new")
|
|
row = split.row()
|
|
|
|
if slot:
|
|
row.prop(slot, "link", text="")
|
|
else:
|
|
row.label()
|
|
elif mat:
|
|
split.template_ID(space, "pin_id")
|
|
split.separator()
|
|
|
|
|
|
class MATERIAL_PT_psychopath_surface(PsychopathPanel, bpy.types.Panel):
|
|
bl_label = "Surface"
|
|
bl_space_type = "PROPERTIES"
|
|
bl_region_type = "WINDOW"
|
|
bl_context = "material"
|
|
|
|
@classmethod
|
|
def poll(cls, context):
|
|
return context.material and PsychopathPanel.poll(context)
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
col = layout.column()
|
|
|
|
mat = context.material
|
|
col.prop(mat.psychopath, "surface_shader_type")
|
|
|
|
col.prop(mat.psychopath, "color_type")
|
|
if mat.psychopath.color_type == 'Rec709':
|
|
col.prop(mat.psychopath, "color")
|
|
elif mat.psychopath.color_type == 'Blackbody' or mat.psychopath.color_type == 'ColorTemperature':
|
|
col.prop(mat.psychopath, "color_blackbody_temp")
|
|
|
|
if mat.psychopath.surface_shader_type == 'GTR':
|
|
layout.prop(mat.psychopath, "roughness")
|
|
layout.prop(mat.psychopath, "tail_shape")
|
|
layout.prop(mat.psychopath, "fresnel")
|
|
|
|
if mat.psychopath.surface_shader_type == 'GGX':
|
|
layout.prop(mat.psychopath, "roughness")
|
|
layout.prop(mat.psychopath, "fresnel")
|
|
|
|
|
|
def register():
|
|
bpy.utils.register_class(RENDER_PT_psychopath_render_settings)
|
|
bpy.utils.register_class(RENDER_PT_psychopath_export_settings)
|
|
bpy.utils.register_class(WORLD_PT_psychopath_background)
|
|
bpy.utils.register_class(DATA_PT_psychopath_camera_dof)
|
|
bpy.utils.register_class(DATA_PT_psychopath_mesh)
|
|
bpy.utils.register_class(DATA_PT_psychopath_lamp)
|
|
bpy.utils.register_class(DATA_PT_psychopath_area_lamp)
|
|
bpy.utils.register_class(MATERIAL_PT_psychopath_context_material)
|
|
bpy.utils.register_class(MATERIAL_PT_psychopath_surface)
|
|
|
|
def unregister():
|
|
bpy.utils.unregister_class(RENDER_PT_psychopath_render_settings)
|
|
bpy.utils.unregister_class(RENDER_PT_psychopath_export_settings)
|
|
bpy.utils.unregister_class(WORLD_PT_psychopath_background)
|
|
bpy.utils.unregister_class(DATA_PT_psychopath_camera_dof)
|
|
bpy.utils.register_class(DATA_PT_psychopath_mesh)
|
|
bpy.utils.unregister_class(DATA_PT_psychopath_lamp)
|
|
bpy.utils.unregister_class(DATA_PT_psychopath_area_lamp)
|
|
bpy.utils.unregister_class(MATERIAL_PT_psychopath_context_material)
|
|
bpy.utils.unregister_class(MATERIAL_PT_psychopath_surface)
|