Created
November 15, 2018 19:44
-
-
Save furby-tm/2e89a3645e464a09e8f241a00c7e755d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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