forked from LeenkxTeam/LNXSDK
Viewport build
This commit is contained in:
@ -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:
|
||||
|
||||
Reference in New Issue
Block a user