Skip to content

Commit

Permalink
Merge branch 'dev_24_3' into 'main'
Browse files Browse the repository at this point in the history
Merge dev_24_3 to main

See merge request renderman/projects/RenderManForBlender!10
  • Loading branch information
Ian Hsieh committed Jan 6, 2022
2 parents 252cd3a + eb88a08 commit 7f773b6
Show file tree
Hide file tree
Showing 40 changed files with 1,424 additions and 593 deletions.
8 changes: 6 additions & 2 deletions __init__.py
Expand Up @@ -35,7 +35,7 @@
bl_info = {
"name": "RenderMan For Blender",
"author": "Pixar",
"version": (24, 2, 0),
"version": (24, 3, 0),
"blender": (2, 83, 0),
"location": "Info Header, render engine menu",
"description": "RenderMan 24 integration",
Expand Down Expand Up @@ -68,7 +68,11 @@ def __init__(self):
return

def __del__(self):
from . import rman_render
try:
from . import rman_render
except ModuleNotFoundError:
return

rr = rman_render.RmanRender.get_rman_render()
try:
if self.is_preview:
Expand Down
53 changes: 52 additions & 1 deletion display_driver/d_blender.cpp
Expand Up @@ -40,6 +40,11 @@
#include "BlenderOptiXDenoiser.h"
#endif

#include <atomic>

typedef bool (*FuncPtr)();
FuncPtr tag_redraw_func;

struct BlenderImage
{
BlenderImage()
Expand Down Expand Up @@ -82,6 +87,7 @@ struct BlenderImage
const uint8_t* surface;
display::RenderOutput::DataType type;
size_t noutputs;
std::atomic<bool> bufferUpdated;

// These two aren't currently used
// but are needed if we decide to use a
Expand Down Expand Up @@ -340,7 +346,7 @@ void DrawBufferToBlender(int viewWidth, int viewHeight)

if (blenderImage == nullptr)
{
//fprintf(stderr, "d_blender: cannot find first image\n");
fprintf(stderr, "d_blender: cannot find first image\n");
return;
}

Expand All @@ -360,6 +366,7 @@ void DrawBufferToBlender(int viewWidth, int viewHeight)
{
if (!blenderImage->framebuffer)
{
fprintf(stderr, "Framebuffer not ready\n");
return;
}

Expand Down Expand Up @@ -429,6 +436,36 @@ void DrawBufferToBlender(int viewWidth, int viewHeight)

glDeleteTextures(1, &blenderImage->texture_id);
}

PRMANEXPORT
void SetRedrawCallback(bool(*pyfuncobj)())
{
tag_redraw_func = pyfuncobj;
}

PRMANEXPORT
bool HasBufferUpdated()
{
if (s_blenderImages.empty())
{
return false;
}
BlenderImage* blenderImage = s_blenderImages[0];
return blenderImage->bufferUpdated;
}

PRMANEXPORT
void ResetBufferUpdated()
{
if (s_blenderImages.empty())
{
return;
}

BlenderImage* blenderImage = s_blenderImages[0];
blenderImage->bufferUpdated = false;
}

} // extern "C"


Expand Down Expand Up @@ -640,6 +677,14 @@ DspyImageData(
} else {
blenderImage->useActiveRegion = false;
}

if (tag_redraw_func)
{
if (!tag_redraw_func())
{
tag_redraw_func = NULL;
}
}

return PkDspyErrorNone;
}
Expand Down Expand Up @@ -799,12 +844,18 @@ void DisplayBlender::Close()
{
std::free(m_image->denoiseFrameBuffer);
}
tag_redraw_func = NULL;
}

void DisplayBlender::Notify(const uint32_t iteration, const uint32_t totaliterations,
const NotifyFlags flags, const pxrcore::ParamList& /*metadata*/)
{
if (flags != k_notifyIteration && flags != k_notifyRender)
{
return;
}
CopyXpuBuffer(m_image);
m_image->bufferUpdated = true;
}

static void closeBlenderImages()
Expand Down
11 changes: 10 additions & 1 deletion rfb_utils/color_manager_blender.py
Expand Up @@ -8,6 +8,7 @@
ColorManager = None

__clrmgr__ = None
__has_warned__ = False

class ColorManagerBlender(ColorManager):
def __init__(self, config_path, **kwargs):
Expand Down Expand Up @@ -38,8 +39,16 @@ def init():
def get_env_config_path():
"""return ocio config path from the environment
"""
global __has_warned__
blender_config_path = envconfig().get_blender_ocio_config()
ociopath = envconfig().getenv('OCIO', blender_config_path)
envconfig_path = envconfig().getenv('OCIO', None)
ociopath = blender_config_path
if envconfig_path:
if os.path.exists(envconfig_path):
ociopath = envconfig_path
elif not __has_warned__:
bpy.ops.renderman.printer('INVOKE_DEFAULT', level='WARNING', message='OCIO environment value (%s) is invalid.' % envconfig_path)
__has_warned__ = True
return ociopath

def get_config_path():
Expand Down
5 changes: 0 additions & 5 deletions rfb_utils/display_utils.py
Expand Up @@ -633,11 +633,6 @@ def get_dspy_dict(rman_scene, expandTokens=True):
display_driver = rm.render_into
do_optix_denoise = rm.blender_optix_denoiser

# FIXME: remove these lines once we are able to get some kind of progress
# when rendering to XPU
if rm.render_into == 'blender' and scene_utils.get_render_variant(rman_scene.bl_scene) != 'prman':
display_driver = 'openexr'

if rm.render_rman_stylized:
_add_stylized_channels(dspys_dict, display_driver, rman_scene, expandTokens)

Expand Down
146 changes: 93 additions & 53 deletions rfb_utils/draw_utils.py
Expand Up @@ -62,7 +62,97 @@ def draw_dsypmeta_item(layout, node, prop_name):
layout.prop(item, 'name')
layout.prop(item, 'type')
layout.prop(item, 'value_%s' % item.type, slider=True)


def draw_array_elem(layout, node, prop_name, bl_prop_info, nt, context, level):
row = layout.row(align=True)
row.enabled = not bl_prop_info.prop_disabled

ui_prop = prop_name + "_uio"
ui_open = getattr(node, ui_prop)
icon = get_open_close_icon(ui_open)

split = layout.split(factor=NODE_LAYOUT_SPLIT)
row = split.row()
row.enabled = not bl_prop_info.prop_disabled
draw_indented_label(row, None, level)

row.context_pointer_set("node", node)
op = row.operator('node.rman_open_close_page', text='', icon=icon, emboss=False)
op.prop_name = ui_prop

sub_prop_names = list(bl_prop_info.prop)

prop_label = bl_prop_info.label
coll_nm = '%s_collection' % prop_name
collection = getattr(node, coll_nm)
array_len = len(collection)
array_label = prop_label + ' [%d]:' % array_len
row.label(text=array_label)
if ui_open:
level += 1
row = layout.row(align=True)
col = row.column()
row = col.row()
draw_indented_label(row, None, level)
coll_idx_nm = '%s_collection_index' % prop_name
row.template_list("RENDERMAN_UL_Array_List", "", node, coll_nm, node, coll_idx_nm, rows=5)
col = row.column(align=True)
row = col.row()
row.context_pointer_set("node", node)
op = row.operator('renderman.add_remove_array_elem', icon="ADD", text="")
op.collection = coll_nm
op.collection_index = coll_idx_nm
op.param_name = prop_name
op.action = 'ADD'
op.elem_type = bl_prop_info.renderman_array_type
row = col.row()
row.context_pointer_set("node", node)
op = row.operator('renderman.add_remove_array_elem', icon="REMOVE", text="")
op.collection = coll_nm
op.collection_index = coll_idx_nm
op.param_name = prop_name
op.action = 'REMOVE'
op.elem_type = bl_prop_info.renderman_array_type

coll_index = getattr(node, coll_idx_nm, None)
if coll_idx_nm is None:
return

if coll_index > -1 and coll_index < len(collection):
item = collection[coll_index]
row = layout.row(align=True)
socket_name = '%s[%d]' % (prop_name, coll_index)
socket = node.inputs.get(socket_name, None)
if socket and socket.is_linked:
input_node = shadergraph_utils.socket_node_input(nt, socket)
icon = get_open_close_icon(socket.ui_open)

split = layout.split()
row = split.row()
draw_indented_label(row, None, level)
row.context_pointer_set("socket", socket)
row.operator('node.rman_open_close_link', text='', icon=icon, emboss=False)
rman_icon = rfb_icons.get_node_icon(input_node.bl_label)
row.label(text='Value (%s):' % input_node.name)

row.context_pointer_set("socket", socket)
row.context_pointer_set("node", node)
row.context_pointer_set("nodetree", nt)
row.menu('NODE_MT_renderman_connection_menu', text='', icon_value=rman_icon.icon_id)

if socket.ui_open:
draw_node_properties_recursive(layout, context, nt,
input_node, level=level + 1)

return

row.prop(item, 'value_%s' % item.type, slider=True)
if socket:
row.context_pointer_set("socket", socket)
row.context_pointer_set("node", node)
row.context_pointer_set("nodetree", nt)
rman_icon = rfb_icons.get_icon('rman_connection_menu')
row.menu('NODE_MT_renderman_connection_menu', text='', icon_value=rman_icon.icon_id)

def _draw_ui_from_rman_config(config_name, panel, context, layout, parent):
row_dict = dict()
Expand Down Expand Up @@ -273,58 +363,8 @@ def draw_prop(node, prop_name, layout, level=0, nt=None, context=None, sticky=Fa
return

elif bl_prop_info.renderman_type == 'array':
row = layout.row(align=True)
row.enabled = not bl_prop_info.prop_disabled

ui_prop = prop_name + "_uio"
ui_open = getattr(node, ui_prop)
icon = get_open_close_icon(ui_open)

split = layout.split(factor=NODE_LAYOUT_SPLIT)
row = split.row()
row.enabled = not bl_prop_info.prop_disabled
draw_indented_label(row, None, level)

row.context_pointer_set("node", node)
op = row.operator('node.rman_open_close_page', text='', icon=icon, emboss=False)
op.prop_name = ui_prop

sub_prop_names = list(bl_prop_info.prop)
arraylen = getattr(node, '%s_arraylen' % prop_name)
prop_label = bl_prop_info.label
row.label(text=prop_label + ' [%d]:' % arraylen)

if ui_open:
level += 1
row = layout.row(align=True)
col = row.column()
row = col.row()
draw_indented_label(row, None, level)
row.prop(node, '%s_arraylen' % prop_name, text='Size')
for i in range(0, arraylen):
row = layout.row(align=True)
col = row.column()
row = col.row()
array_elem_nm = '%s[%d]' % (prop_name, i)
draw_indented_label(row, None, level)
if array_elem_nm in node.inputs:
op_text = ''
socket = node.inputs[array_elem_nm]
row.context_pointer_set("socket", socket)
row.context_pointer_set("node", node)
row.context_pointer_set("nodetree", nt)

if socket.is_linked:
input_node = shadergraph_utils.socket_node_input(nt, socket)
rman_icon = rfb_icons.get_node_icon(input_node.bl_label)
row.label(text='%s[%d] (%s):' % (prop_label, i, input_node.name))
row.menu('NODE_MT_renderman_connection_menu', text='', icon_value=rman_icon.icon_id)
draw_node_properties_recursive(layout, context, nt, input_node, level=level + 1)
else:
row.prop(node, '%s[%d]' % (prop_name, i), slider=True)
rman_icon = rfb_icons.get_icon('rman_connection_menu')
row.menu('NODE_MT_renderman_connection_menu', text='', icon_value=rman_icon.icon_id)
return
draw_array_elem(layout, node, prop_name, bl_prop_info, nt, context, level)
return

elif bl_prop_info.widget == 'colorramp':
node_group = node.rman_fake_node_group_ptr
Expand Down
10 changes: 8 additions & 2 deletions rfb_utils/envconfig_utils.py
Expand Up @@ -371,12 +371,18 @@ def _guess_rmantree():
__RMAN_ENV_CONFIG__ = None
return None

# check if this version of RenderMan is supported
# check if the major version of RenderMan is supported
if buildinfo._version_major < rman_constants.RMAN_SUPPORTED_VERSION_MAJOR:
rfb_log().error("Error loading addon using RMANTREE=%s. RMANTREE must be version %s or greater. Correct RMANTREE setting in addon preferences." % (rmantree, rman_constants.RMAN_SUPPORTED_VERSION_STRING))
rfb_log().error("Error loading addon using RMANTREE=%s. The major version found (%d) is not supported. Minimum version supported is %s." % (rmantree, buildinfo._version_major, rman_constants.RMAN_SUPPORTED_VERSION_STRING))
__RMAN_ENV_CONFIG__ = None
return None

# check if the minor version of RenderMan is supported
if buildinfo._version_major == rman_constants.RMAN_SUPPORTED_VERSION_MAJOR and buildinfo._version_minor < rman_constants.RMAN_SUPPORTED_VERSION_MINOR:
rfb_log().error("Error loading addon using RMANTREE=%s. The minor version found (%s) is not supported. Minimum version supported is %s." % (rmantree, buildinfo._version_minor, rman_constants.RMAN_SUPPORTED_VERSION_STRING))
__RMAN_ENV_CONFIG__ = None
return None

rfb_log().debug("Guessed RMANTREE: %s" % rmantree)

# Create an RmanEnvConfig object
Expand Down
1 change: 1 addition & 0 deletions rfb_utils/filepath_utils.py
Expand Up @@ -36,6 +36,7 @@ def view_file(file_path):
try:
command = opener + " " + file_path
os.system(command)
return
except Exception as e:
rfb_log().error("Open file command failed: %s" % command)
pass
Expand Down

0 comments on commit 7f773b6

Please sign in to comment.