Viewport build

This commit is contained in:
2026-07-18 21:33:47 -07:00
parent 50ad462318
commit 160f6bdadf
3 changed files with 29 additions and 231 deletions

View File

@ -101,70 +101,9 @@ MOUSE_BUTTON_LEFT = 0
MOUSE_BUTTON_RIGHT = 1
MOUSE_BUTTON_MIDDLE = 2
_rendered_mode_pending = False
_rendered_mode_retries = 0
_msgbus_owner = object()
_make_module = None
@bpy.app.handlers.persistent
def _on_depsgraph_update(scene, depsgraph):
"""Called on depsgraph update - check if render engine changed to Krom."""
try:
if scene.render.engine == 'KROM_VIEWPORT':
for window in bpy.context.window_manager.windows:
for area in window.screen.areas:
if area.type == 'VIEW_3D':
for space in area.spaces:
if space.type == 'VIEW_3D':
if space.shading.type != 'RENDERED':
space.shading.type = 'RENDERED'
area.tag_redraw()
return
except:
pass
def _deferred_set_rendered_mode():
"""Module-level timer callback to set rendered mode."""
global _rendered_mode_pending, _rendered_mode_retries
try:
current_engine = bpy.context.scene.render.engine
for window in bpy.context.window_manager.windows:
screen = window.screen
for area in screen.areas:
if area.type == 'VIEW_3D':
for space in area.spaces:
if space.type == 'VIEW_3D':
current_shading = space.shading.type
if current_shading == 'RENDERED':
_rendered_mode_pending = False
_rendered_mode_retries = 0
return None
space.shading.type = 'RENDERED'
area.tag_redraw()
_rendered_mode_pending = False
_rendered_mode_retries = 0
return None
_rendered_mode_retries += 1
if _rendered_mode_retries < 10:
print(f"Viewport VIEW_3D not found, retrying... ({_rendered_mode_retries})")
return 0.2
except Exception as e:
print(f"Could not set rendered mode: {e}")
import traceback
traceback.print_exc()
_rendered_mode_retries += 1
if _rendered_mode_retries < 10:
return 0.2
_rendered_mode_pending = False
_rendered_mode_retries = 0
return None
class KromViewportEngine(bpy.types.RenderEngine):
"""Leenkx render engine that displays Krom runtime output in viewport."""
@ -190,12 +129,12 @@ class KromViewportEngine(bpy.types.RenderEngine):
self._batch = None
self._batch_dims = None
self._viewport_init_done = True
self._rendered_mode_set = False
self._last_shading_mode = None
self._viewport_id = None
self._shmem_name = None
self._krom_proc = None
self._krom_launch_attempted = False
self._viewport_stopped = False
self._pending_camera_sync = False
self._input_enabled_state = None
self._last_region_dims = None
@ -203,24 +142,6 @@ class KromViewportEngine(bpy.types.RenderEngine):
self._engine_id = id(self)
# print(f"New engine instance created: {self._engine_id}")
def _set_rendered_mode(self, context):
if self._rendered_mode_set:
return
try:
space = context.space_data
if space and hasattr(space, 'shading'):
current = space.shading.type
if current != 'RENDERED':
space.shading.type = 'RENDERED'
self._rendered_mode_set = True
# Disable viewport overlay so Krom output is unobstructed
if space and hasattr(space, 'overlay'):
if not hasattr(self, '_overlay_saved'):
self._overlay_saved = space.overlay.show_overlays
space.overlay.show_overlays = False
except Exception as e:
print(f"Failed to set rendered mode: {e}")
def _restore_overlay(self, context=None):
try:
if not hasattr(self, '_overlay_saved'):
@ -252,15 +173,15 @@ class KromViewportEngine(bpy.types.RenderEngine):
current_mode = space.shading.type
if self._last_shading_mode == 'SOLID' and current_mode == 'RENDERED':
self._viewport_stopped = False
self._initialized = False
self._rendered_mode_set = False
self._krom_launch_attempted = False
self._cleanup_shared_memory()
self._pending_camera_sync = True
if self._last_shading_mode == 'RENDERED' and current_mode != 'RENDERED':
self._rendered_mode_set = False
# keep krom running in solid mode for switching back ti rendered
# keep krom running in solid mode for switching back to rendered
pass
self._last_shading_mode = current_mode
except Exception as e:
@ -337,13 +258,13 @@ class KromViewportEngine(bpy.types.RenderEngine):
return True
def _stop_krom_process(self):
if self._krom_proc:
import lnx.make as make
if self._viewport_id and self._viewport_id in make._viewport_processes:
try:
import lnx.make as make
make.stop_viewport_runtime(self._viewport_id)
except:
pass
self._krom_proc = None
self._krom_proc = None
self._krom_launch_attempted = False
self._initialized = False
self._cleanup_shared_memory()
@ -946,6 +867,10 @@ class KromViewportEngine(bpy.types.RenderEngine):
if state.is_exporting:
return
if self._viewport_stopped:
self._draw_placeholder(context)
return
self._ensure_initialized()
self._handle_mode_switch(context)
@ -984,8 +909,6 @@ class KromViewportEngine(bpy.types.RenderEngine):
if self._viewport_id in _active_krom_engines:
del _active_krom_engines[self._viewport_id]
self._set_rendered_mode(context)
# TODO: input forwarding when viewport is active
_active_krom_engine = self # legacy single-engine reference
@ -1375,6 +1298,7 @@ class KROM_OT_stop_viewport(bpy.types.Operator):
if viewport_id in _active_krom_engines:
engine = _active_krom_engines[viewport_id]
try:
engine._viewport_stopped = True
engine._stop_krom_process()
engine._restore_overlay(context)
except:
@ -1422,8 +1346,6 @@ def register():
for panel in get_panels():
panel.COMPAT_ENGINES.add('KROM_VIEWPORT')
if _on_depsgraph_update not in bpy.app.handlers.depsgraph_update_post:
bpy.app.handlers.depsgraph_update_post.append(_on_depsgraph_update)
atexit.register(_cleanup_krom_on_exit)
@ -1435,9 +1357,6 @@ def unregister():
_active_viewport_id = None
_input_operator_running = False
if _on_depsgraph_update in bpy.app.handlers.depsgraph_update_post:
bpy.app.handlers.depsgraph_update_post.remove(_on_depsgraph_update)
_cleanup_krom_on_exit()
try: