Skip to content

Instantly share code, notes, and snippets.

@furby-tm
Created November 15, 2018 19:44
Show Gist options
  • Save furby-tm/2e89a3645e464a09e8f241a00c7e755d to your computer and use it in GitHub Desktop.
Save furby-tm/2e89a3645e464a09e8f241a00c7e755d to your computer and use it in GitHub Desktop.
def render(engine, scene):
try:
session = engine._session
xoff, yoff = session["offset"]
_htiles = {} # highlighted tiles
session["peak"] = 0 # memory peak usage
def display_callback(x, y, width, height, buffer, data):
_x = x - xoff
_y = y - yoff
if buffer:
try:
result = _htiles.pop((_x, _y), None)
if result is None:
result = engine.begin_result(_x, _y, width, height)
_buffer = ctypes.cast(buffer, ctypes.POINTER(ctypes.c_uint16))
rect = numpy.ctypeslib.as_array(_buffer, shape=(width * height, 4))
# TODO: gamma correction. need??? kick is darker
# set 1/2.2 the driver_display node by default
#rect **= 2.2
result.layers[0].passes[0].rect = rect
engine.end_result(result)
finally:
arnold.AiFree(buffer)
else:
result = engine.begin_result(_x, _y, width, height)
# TODO: sometimes highlighted tiles become empty
#engine.update_result(result)
_htiles[(_x, _y)] = result
if engine.test_break():
arnold.AiRenderAbort()
while _htiles:
(_x, _y), result = _htiles.popitem()
engine.end_result(result, True)
mem = session["mem"] = arnold.AiMsgUtilGetUsedMemory() / 1048576 # 1024*1024
peak = session["peak"] = max(session["peak"], mem)
engine.update_memory_stats(mem, peak)
# display callback must be a variable
cb = arnold.AtDisplayCallBack(display_callback)
arnold.AiNodeSetPtr(session['display'], "callback", cb)
res = arnold.AiRender(arnold.AI_RENDER_MODE_CAMERA)
if res != arnold.AI_SUCCESS:
ipr = session.get("ipr")
if ipr:
options = arnold.AiUniverseGetOptions()
for sl in range(*ipr):
arnold.AiNodeSetInt(options, "AA_samples", sl)
res = arnold.AiRender(arnold.AI_RENDER_MODE_CAMERA)
if res == arnold.AI_SUCCESS:
break
engine.update_stats("", "Mem: %.2fMb, SL: %d" % (session.get("mem", "NA"), sl))
if res != arnold.AI_SUCCESS:
engine.error_set("Render status: %d" % res)
except:
# cancel render on error
engine.end_result(None, True)
finally:
del engine._session
arnold.AiEnd()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment