Event Reference#
All omni.kit.renderer events are based on an omni::kit::IAppWindow instance. The event names are composed as follows:
omni.kit.renderer:renderer:<IAppWindow pointer>:<event name>
The <IAppWindow pointer> is composed as by the %p printf format specifier. Event names are case sensitive.
Events with an empty <IAppWindow pointer> are aliased to the default window.
For ease of generating the event names for use with carb::eventdispatcher::IEventDispatcher, there exists
an enum omni::kit::renderer::RendererEventType in C++ and omni.kit.renderer.bind.RendererEventType in Python.
These enums can be used with helper functions omni::kit::renderer::getRendererEventName() and
omni.kit.renderer.bind.get_renderer_event_name() to generate the event name. Conversely, the event name
can be passed to helper functions omni::kit::renderer::getRendererEventType() and
omni.kit.renderer.bind.get_renderer_event_type() to convert back to the event type enum and optionally
retrieve the omni::kit::IAppWindow instance as well.
Renderer Events#
As listed below, the String Event Name corresponds to the <event name> above.
Pre Begin Frame#
Sent on the main thread when rendering is about to start.
C++ Enum:
RendererEventType::ePreBeginFramePython Enum:
RendererEventType.PRE_BEGIN_FRAMEString event name:
pre_begin_frame
Arguments:
dt(float) - Time since last frame in seconds.commandListHandle(int64) - The handle for the frame’s command list.saveDrawData(bool) - Iftrue, the frame won’t be displayed due to prepare failure (i.e. swap-chain being resized or not ready, window minimized, etc.).falsefor a normal frame.draw_frozen(bool) - (optional) Iftrue, the window’s drawing is frozen.
Pre Begin Render Pass#
Sent on the main thread or present thread after Pre Begin Frame but immediately before the Begin Render Pass command is executed.
C++ Enum:
RendererEventType::ePreBeginRenderPassPython Enum:
RendererEventType.PRE_BEGIN_RENDER_PASSString event name:
pre_begin_render_pass
Arguments:
commandListHandle(int64) - The handle for the frame’s command list.saveDrawData(bool) - Alwaysfalse.
Render Frame#
Sent on the main thread immediately after clear and before the render pass ends.
C++ Enum:
RendererEventType::eRenderFramePython Enum:
RendererEventType.RENDER_FRAMEString event name:
render_frame
Arguments:
dt(float) - Time since last frame in seconds.commandListHandle(int64) - The handle for the frame’s command list.saveDrawData(bool) - Iftrue, the frame won’t be displayed due to prepare failure (i.e. swap-chain being resized or not ready, window minimized, etc.).falsefor a normal frame.draw_frozen(bool) - (optional) Iftrue, the window’s drawing is frozen.
Post End Render Pass#
Sent on the main thread or present thread after the render pass ends.
C++ Enum:
RendererEventType::ePostEndRenderPassPython Enum:
RendererEventType.POST_END_RENDER_PASSString event name:
post_end_render_pass
Arguments:
commandListHandle(int64) - The handle for the frame’s command list.saveDrawData(bool) - Alwaysfalse.
Post End Render Frame#
Sent on the main thread following Post Present Frame Buffer.
C++ Enum:
RendererEventType::ePostEndRenderFramePython Enum:
RendererEventType.POST_END_RENDER_FRAMEString event name:
post_end_render_frame
Arguments:
dt(float) - Time since last frame in seconds.saveDrawData(bool) - Iftrue, the frame won’t be displayed due to prepare failure (i.e. swap-chain being resized or not ready, window minimized, etc.).falsefor a normal frame.draw_frozen(bool) - (optional) Iftrue, the window’s drawing is frozen.
Post Present Frame Buffer#
Sent on the main thread or present thread at the end of rendering.
C++ Enum:
RendererEventType::ePostPresentFrameBufferPython Enum:
RendererEventType.POST_PRESENT_FRAME_BUFFERString event name:
post_present_frame_buffer
Arguments:
dt(float) - Time since last frame in seconds.
Present Render Frame#
Sent on the present thread to update the viewport. Sent before Post End Render Pass.
C++ Enum:
RendererEventType::ePresentRenderFramePython Enum:
RendererEventType.PRESENT_RENDER_FRAMEString event name:
present_render_frame
Arguments:
dt(float) - Time since last frame in seconds.commandListHandle(int64) - The handle for the frame’s command list.viewportDataCount(size_t) - The number of entries in theviewportDataPtrarray.viewportDataPtr(uintptr_t) - A value that can be casted toomni::kit::renderer::IRendererHydraViewportData*, an array of lengthviewportDataCount.
Warning
The viewportDataPtr argument may only be safely accessed in the event handler function and must not be stored anywhere.
Legacy Events#
Previously, each event type was sent through a separate Event Stream. While still currently supported, this is now deprecated.
Converting C++#
Old:
using namespace omni::kit::renderer;
IRenderer* renderer = carb::getCachedInterface<IRenderer>();
if (renderer)
{
carb::events::IEventStream* preBeginFrameEventStream = renderer->getPreBeginFrameEventStream(appWindow);
m_subscription = carb::events::createSubscriptionToPop(
preBeginFrameEventStream,
[this](carb::events::IEvents* event) { this->onPreBeginFrame(event); },
carb::events::kDefaultOrder,
"My subscription name"
);
}
New:
using namespace omni::kit::renderer;
auto dispatcher = carb::getCachedInterface<carb::eventdispatcher::IEventDispatcher>();
m_subscription = dispatcher->observeEvent(
carb::RStringKey("My observer name"),
carb::eventdispatcher::kDefaultOrder,
getRendererEventName(RendererEventType::ePreBeginFrame, appWindow),
[this](const carb::eventdispatcher::Event& event) { this->onPreBeginFrame(event); }
);
Reading arguments from the event is easier with Events 2.0 as generally Event::getValueOr<>() can be used
instead of reading dictionary values.
Converting Python#
Old:
import omni.kit.renderer
import carb.events
renderer = omni.kit.renderer.bind.acquire_renderer_interface()
stream = renderer.get_pre_begin_frame_event_stream(app_window)
self.subscription = stream.create_subscription_to_pop(
on_event,
carb.events.DEFAULT_ORDER, # optional
"My subscription name"
)
New:
from omni.kit.renderer import bind as okr
import carb.eventdispatcher
self.subscription = carb.eventdispatcher.get_eventdispatcher().observe_event(
observer_name="My observer name",
event_name=okr.get_renderer_event_name(okr.RendererEventType.PRE_BEGIN_FRAME, app_window),
order=carb.eventdispatcher.DEFAULT_ORDER, # optional
on_event=on_event
)