Storm Hydra render addon #104597
@ -20,16 +20,18 @@ bl_info = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
from . import engine, properties, ui
|
from . import engine, properties, ui, preferences
|
||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
engine.register()
|
engine.register()
|
||||||
properties.register()
|
properties.register()
|
||||||
ui.register()
|
ui.register()
|
||||||
|
preferences.register()
|
||||||
|
|
||||||
|
|
||||||
def unregister():
|
def unregister():
|
||||||
|
preferences.unregister()
|
||||||
ui.unregister()
|
ui.unregister()
|
||||||
properties.unregister()
|
properties.unregister()
|
||||||
engine.unregister()
|
engine.unregister()
|
||||||
|
@ -3,10 +3,13 @@
|
|||||||
|
|
||||||
# <pep8 compliant>
|
# <pep8 compliant>
|
||||||
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
import bpy
|
import bpy
|
||||||
import bpy_hydra
|
import bpy_hydra
|
||||||
|
import _bpy_hydra
|
||||||
|
|
||||||
|
from pxr import Usd
|
||||||
|
|
||||||
|
from .preferences import addon_preferences
|
||||||
|
|
||||||
|
|
||||||
class StormHydraRenderEngine(bpy_hydra.HydraRenderEngine):
|
class StormHydraRenderEngine(bpy_hydra.HydraRenderEngine):
|
||||||
@ -19,6 +22,17 @@ class StormHydraRenderEngine(bpy_hydra.HydraRenderEngine):
|
|||||||
|
|
||||||
delegate_id = 'HdStormRendererPlugin'
|
delegate_id = 'HdStormRendererPlugin'
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self._usd_stage = None
|
||||||
|
|
||||||
|
def _sync_usd_stage(self):
|
||||||
|
preferences = addon_preferences()
|
||||||
|
dev = bpy.context.scene.hydra_storm.dev
|
||||||
|
if preferences.dev_tools and not self._usd_stage and dev.render_usd and dev.usd_file:
|
||||||
|
self._usd_stage = Usd.Stage.Open(dev.usd_file)
|
||||||
|
if self._usd_stage:
|
||||||
|
_bpy_hydra.engine_sync_usd(self.engine_ptr, self._usd_stage)
|
||||||
|
|
||||||
def get_render_settings(self, engine_type):
|
def get_render_settings(self, engine_type):
|
||||||
settings = bpy.context.scene.hydra_storm.viewport if engine_type == 'VIEWPORT' else \
|
settings = bpy.context.scene.hydra_storm.viewport if engine_type == 'VIEWPORT' else \
|
||||||
bpy.context.scene.hydra_storm.final
|
bpy.context.scene.hydra_storm.final
|
||||||
@ -30,6 +44,14 @@ class StormHydraRenderEngine(bpy_hydra.HydraRenderEngine):
|
|||||||
'maxLights': settings.max_lights,
|
'maxLights': settings.max_lights,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def update(self, data, depsgraph):
|
||||||
|
super().update(data, depsgraph)
|
||||||
|
self._sync_usd_stage()
|
||||||
|
|
||||||
|
def view_update(self, context, depsgraph):
|
||||||
|
super().view_update(context, depsgraph)
|
||||||
|
self._sync_usd_stage()
|
||||||
|
|
||||||
|
|
||||||
register, unregister = bpy.utils.register_classes_factory((
|
register, unregister = bpy.utils.register_classes_factory((
|
||||||
StormHydraRenderEngine,
|
StormHydraRenderEngine,
|
||||||
|
27
hydra_storm/preferences.py
Normal file
27
hydra_storm/preferences.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
# Copyright 2022, AMD
|
||||||
|
|
||||||
|
import bpy
|
||||||
|
|
||||||
|
|
||||||
|
class AddonPreferences(bpy.types.AddonPreferences):
|
||||||
|
bl_idname = 'hydra_storm'
|
||||||
|
|
||||||
|
dev_tools: bpy.props.BoolProperty(
|
||||||
|
name="Developer Tools",
|
||||||
|
description="Enable developer tools",
|
||||||
|
default=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
def draw(self, context):
|
||||||
|
layout = self.layout
|
||||||
|
layout.prop(self, "dev_tools")
|
||||||
|
|
||||||
|
|
||||||
|
def addon_preferences():
|
||||||
|
return bpy.context.preferences.addons['hydra_storm'].preferences
|
||||||
|
|
||||||
|
|
||||||
|
register, unregister = bpy.utils.register_classes_factory([
|
||||||
|
AddonPreferences,
|
||||||
|
])
|
@ -50,14 +50,29 @@ class RenderProperties(bpy.types.PropertyGroup):
|
|||||||
)
|
)
|
||||||
brecht marked this conversation as resolved
|
|||||||
|
|
||||||
|
|
||||||
|
class DevProperties(bpy.types.PropertyGroup):
|
||||||
|
render_usd: bpy.props.BoolProperty(
|
||||||
|
name="Render USD",
|
||||||
|
description="Render USD file with Blender scene",
|
||||||
|
default=False,
|
||||||
|
)
|
||||||
|
usd_file: bpy.props.StringProperty(
|
||||||
|
name="USD File",
|
||||||
|
description="Select USD file to render",
|
||||||
|
subtype='FILE_PATH',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class SceneProperties(Properties):
|
class SceneProperties(Properties):
|
||||||
type = bpy.types.Scene
|
type = bpy.types.Scene
|
||||||
|
|
||||||
final: bpy.props.PointerProperty(type=RenderProperties)
|
final: bpy.props.PointerProperty(type=RenderProperties)
|
||||||
viewport: bpy.props.PointerProperty(type=RenderProperties)
|
viewport: bpy.props.PointerProperty(type=RenderProperties)
|
||||||
|
dev: bpy.props.PointerProperty(type=DevProperties)
|
||||||
|
|
||||||
|
|
||||||
register, unregister = bpy.utils.register_classes_factory((
|
register, unregister = bpy.utils.register_classes_factory((
|
||||||
RenderProperties,
|
RenderProperties,
|
||||||
|
DevProperties,
|
||||||
SceneProperties,
|
SceneProperties,
|
||||||
))
|
))
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
import bpy
|
import bpy
|
||||||
|
|
||||||
from .engine import StormHydraRenderEngine
|
from .engine import StormHydraRenderEngine
|
||||||
|
from .preferences import addon_preferences
|
||||||
|
|
||||||
|
|
||||||
class Panel(bpy.types.Panel):
|
class Panel(bpy.types.Panel):
|
||||||
@ -25,7 +26,7 @@ class Panel(bpy.types.Panel):
|
|||||||
class STORM_HYDRA_RENDER_PT_final(Panel):
|
class STORM_HYDRA_RENDER_PT_final(Panel):
|
||||||
"""Final render delegate and settings"""
|
"""Final render delegate and settings"""
|
||||||
bl_idname = 'STORM_HYDRA_RENDER_PT_final'
|
bl_idname = 'STORM_HYDRA_RENDER_PT_final'
|
||||||
bl_label = "Storm Final Settings"
|
bl_label = "Final Render Settings"
|
||||||
|
|
||||||
def draw(self, context):
|
def draw(self, context):
|
||||||
layout = self.layout
|
layout = self.layout
|
||||||
@ -37,25 +38,19 @@ class STORM_HYDRA_RENDER_PT_final(Panel):
|
|||||||
layout.prop(settings, 'max_lights')
|
layout.prop(settings, 'max_lights')
|
||||||
|
|
||||||
|
|
||||||
class FinalPanel(bpy.types.Panel):
|
class STORM_HYDRA_RENDER_PT_volume_final(bpy.types.Panel):
|
||||||
bl_parent_id = STORM_HYDRA_RENDER_PT_final.bl_idname
|
bl_parent_id = STORM_HYDRA_RENDER_PT_final.bl_idname
|
||||||
|
bl_label = "Volume Raymarching"
|
||||||
bl_space_type = 'PROPERTIES'
|
bl_space_type = 'PROPERTIES'
|
||||||
bl_region_type = 'WINDOW'
|
bl_region_type = 'WINDOW'
|
||||||
bl_options = {'DEFAULT_CLOSED'}
|
bl_options = {'DEFAULT_CLOSED'}
|
||||||
|
|
||||||
def settings(self, context):
|
|
||||||
return context.scene.hydra_storm.final
|
|
||||||
|
|
||||||
|
|
||||||
class STORM_HYDRA_RENDER_PT_volume_final(FinalPanel):
|
|
||||||
bl_label = "Volume Raymarching"
|
|
||||||
|
|
||||||
def draw(self, context):
|
def draw(self, context):
|
||||||
layout = self.layout
|
layout = self.layout
|
||||||
layout.use_property_split = True
|
layout.use_property_split = True
|
||||||
layout.use_property_decorate = False
|
layout.use_property_decorate = False
|
||||||
|
|
||||||
settings = self.settings(context)
|
settings = context.scene.hydra_storm.final
|
||||||
|
|
||||||
col = layout.column(align=True)
|
col = layout.column(align=True)
|
||||||
col.prop(settings, "volume_raymarching_step_size", text="Step Size")
|
col.prop(settings, "volume_raymarching_step_size", text="Step Size")
|
||||||
@ -69,7 +64,7 @@ class STORM_HYDRA_RENDER_PT_volume_final(FinalPanel):
|
|||||||
class STORM_HYDRA_RENDER_PT_viewport(Panel):
|
class STORM_HYDRA_RENDER_PT_viewport(Panel):
|
||||||
"""Viewport render delegate and settings"""
|
"""Viewport render delegate and settings"""
|
||||||
bl_idname = 'STORM_HYDRA_RENDER_PT_viewport'
|
bl_idname = 'STORM_HYDRA_RENDER_PT_viewport'
|
||||||
bl_label = "Storm Viewport Settings"
|
bl_label = "Viewport Render Settings"
|
||||||
|
|
||||||
def draw(self, context):
|
def draw(self, context):
|
||||||
layout = self.layout
|
layout = self.layout
|
||||||
@ -81,25 +76,19 @@ class STORM_HYDRA_RENDER_PT_viewport(Panel):
|
|||||||
layout.prop(settings, 'max_lights')
|
layout.prop(settings, 'max_lights')
|
||||||
|
|
||||||
|
|
||||||
class ViewportPanel(bpy.types.Panel):
|
class STORM_HYDRA_RENDER_PT_volume_viewport(bpy.types.Panel):
|
||||||
bl_parent_id = STORM_HYDRA_RENDER_PT_viewport.bl_idname
|
bl_parent_id = STORM_HYDRA_RENDER_PT_viewport.bl_idname
|
||||||
|
bl_label = "Volume Raymarching"
|
||||||
bl_space_type = 'PROPERTIES'
|
bl_space_type = 'PROPERTIES'
|
||||||
bl_region_type = 'WINDOW'
|
bl_region_type = 'WINDOW'
|
||||||
bl_options = {'DEFAULT_CLOSED'}
|
bl_options = {'DEFAULT_CLOSED'}
|
||||||
|
|
||||||
def settings(self, context):
|
|
||||||
return context.scene.hydra_storm.viewport
|
|
||||||
|
|
||||||
|
|
||||||
class STORM_HYDRA_RENDER_PT_volume_viewport(ViewportPanel):
|
|
||||||
bl_label = "Volume Raymarching"
|
|
||||||
|
|
||||||
def draw(self, context):
|
def draw(self, context):
|
||||||
layout = self.layout
|
layout = self.layout
|
||||||
layout.use_property_split = True
|
layout.use_property_split = True
|
||||||
layout.use_property_decorate = False
|
layout.use_property_decorate = False
|
||||||
|
|
||||||
settings = self.settings(context)
|
settings = context.scene.hydra_storm.viewport
|
||||||
|
|
||||||
col = layout.column(align=True)
|
col = layout.column(align=True)
|
||||||
col.prop(settings, "volume_raymarching_step_size", text="Step Size")
|
col.prop(settings, "volume_raymarching_step_size", text="Step Size")
|
||||||
@ -108,9 +97,7 @@ class STORM_HYDRA_RENDER_PT_volume_viewport(ViewportPanel):
|
|||||||
|
|
||||||
|
|
||||||
class STORM_HYDRA_LIGHT_PT_light(Panel):
|
class STORM_HYDRA_LIGHT_PT_light(Panel):
|
||||||
"""
|
"""Physical light sources"""
|
||||||
Physical light sources
|
|
||||||
"""
|
|
||||||
bl_label = "Light"
|
bl_label = "Light"
|
||||||
bl_context = 'data'
|
bl_context = 'data'
|
||||||
|
|
||||||
@ -162,11 +149,33 @@ class STORM_HYDRA_LIGHT_PT_light(Panel):
|
|||||||
main_col.prop(light, 'size')
|
main_col.prop(light, 'size')
|
||||||
|
|
||||||
|
|
||||||
|
class STORM_HYDRA_RENDER_PT_dev(Panel):
|
||||||
|
"""Final render delegate and settings"""
|
||||||
|
bl_label = "Dev"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def poll(cls, context):
|
||||||
|
return super().poll(context) and addon_preferences().dev_tools
|
||||||
|
|
||||||
|
def draw(self, context):
|
||||||
|
layout = self.layout
|
||||||
|
layout.use_property_split = True
|
||||||
|
layout.use_property_decorate = False
|
||||||
|
|
||||||
|
dev = context.scene.hydra_storm.dev
|
||||||
|
col = layout.column()
|
||||||
|
col.prop(dev, 'render_usd')
|
||||||
|
row = col.row()
|
||||||
|
row.enabled = dev.render_usd
|
||||||
|
row.prop(dev, 'usd_file')
|
||||||
|
|
||||||
|
|
||||||
register_classes, unregister_classes = bpy.utils.register_classes_factory((
|
register_classes, unregister_classes = bpy.utils.register_classes_factory((
|
||||||
STORM_HYDRA_RENDER_PT_final,
|
STORM_HYDRA_RENDER_PT_final,
|
||||||
STORM_HYDRA_RENDER_PT_volume_final,
|
STORM_HYDRA_RENDER_PT_volume_final,
|
||||||
STORM_HYDRA_RENDER_PT_viewport,
|
STORM_HYDRA_RENDER_PT_viewport,
|
||||||
STORM_HYDRA_RENDER_PT_volume_viewport,
|
STORM_HYDRA_RENDER_PT_volume_viewport,
|
||||||
|
STORM_HYDRA_RENDER_PT_dev,
|
||||||
|
|
||||||
STORM_HYDRA_LIGHT_PT_light,
|
STORM_HYDRA_LIGHT_PT_light,
|
||||||
))
|
))
|
||||||
|
Loading…
Reference in New Issue
Block a user
What happens when the maximum is reach? Why is the default only 16? This needs a better explanation in the description.
It comes from source code https://github.com/PixarAnimationStudios/USD/blob/release/pxr/imaging/hdSt/renderDelegate.cpp#L70
Can you figure out what it does so it can be explained in the description for users?