meltygui 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- meltygui/__init__.py +107 -0
- meltygui/accounts/__init__.py +0 -0
- meltygui/accounts/internet_accounts.py +1355 -0
- meltygui/chat/__init__.py +91 -0
- meltygui/chat/activity.py +75 -0
- meltygui/chat/backends.py +36 -0
- meltygui/chat/chat_interface.py +732 -0
- meltygui/chat/chat_proxy.py +352 -0
- meltygui/chat/codex_proxy.py +592 -0
- meltygui/chat/codex_settings.py +100 -0
- meltygui/chat/codex_transport.py +60 -0
- meltygui/chat/command_parser.py +204 -0
- meltygui/chat/images.py +227 -0
- meltygui/chat/messages.py +417 -0
- meltygui/chat/metadata.py +139 -0
- meltygui/chat/writer_locks.py +64 -0
- meltygui/code/__init__.py +0 -0
- meltygui/code/basic_converters.py +533 -0
- meltygui/code/chain_converters.py +2111 -0
- meltygui/code/code_checks.py +2209 -0
- meltygui/code/core_syntax.py +1430 -0
- meltygui/code/file_converters.py +1933 -0
- meltygui/code/fileref.py +702 -0
- meltygui/code/hotswap_guard.py +144 -0
- meltygui/code/libcst_conversion.py +9724 -0
- meltygui/code/live_instrument.py +392 -0
- meltygui/code/live_view.py +2490 -0
- meltygui/code/melty_scan.py +2684 -0
- meltygui/code/new_codecs.py +1255 -0
- meltygui/code/new_converters.py +3017 -0
- meltygui/code/project_code.py +278 -0
- meltygui/code/source_context.py +63 -0
- meltygui/code/symbol_roster.py +1588 -0
- meltygui/code/syntax_check.py +34 -0
- meltygui/code/syntax_check_worker.py +114 -0
- meltygui/completion/__init__.py +0 -0
- meltygui/completion/fim.py +1232 -0
- meltygui/completion/fim_context.py +481 -0
- meltygui/completion/providers/__init__.py +0 -0
- meltygui/completion/providers/anthropic_oauth.py +446 -0
- meltygui/completion/providers/anthropic_requests.py +69 -0
- meltygui/completion/providers/claude.py +203 -0
- meltygui/completion/providers/claude_usage.py +499 -0
- meltygui/completion/providers/codex_accounts.py +180 -0
- meltygui/completion/providers/copilot.py +617 -0
- meltygui/completion/providers/oauth_popup.py +220 -0
- meltygui/completion/providers/ollama.py +320 -0
- meltygui/completion/providers/profiles.py +23 -0
- meltygui/core/README.md +88 -0
- meltygui/core/__init__.py +1 -0
- meltygui/core/automation/__init__.py +1 -0
- meltygui/core/automation/action_core.py +153 -0
- meltygui/core/automation/collection_action.py +45 -0
- meltygui/core/automation/mcp_eval.py +167 -0
- meltygui/core/automation/mcp_hotswap.py +107 -0
- meltygui/core/automation/mcp_query.py +552 -0
- meltygui/core/automation/mcp_server.py +657 -0
- meltygui/core/automation/orchestration_core.py +2636 -0
- meltygui/core/automation/query_core.py +124 -0
- meltygui/core/automation/search_core.py +26 -0
- meltygui/core/automation/selector_core.py +340 -0
- meltygui/core/automation/value_core.py +1752 -0
- meltygui/core/cache/__init__.py +1 -0
- meltygui/core/cache/cache_diagnostics.py +0 -0
- meltygui/core/cache/invalidation_decoration.py +153 -0
- meltygui/core/cache/invalidation_tracker.py +43 -0
- meltygui/core/cache/tile_cache.py +5968 -0
- meltygui/core/conversion/__init__.py +1 -0
- meltygui/core/conversion/bubbling.py +599 -0
- meltygui/core/conversion/cache_tree.py +188 -0
- meltygui/core/conversion/chain.py +113 -0
- meltygui/core/conversion/converter_register.py +145 -0
- meltygui/core/conversion/data_decoration.py +67 -0
- meltygui/core/conversion/dict_conversion.py +1815 -0
- meltygui/core/conversion/dict_conversion_util.py +177 -0
- meltygui/core/conversion/dynamic_obj.py +89 -0
- meltygui/core/conversion/graph_compare.py +183 -0
- meltygui/core/conversion/load_save_v2.py +1032 -0
- meltygui/core/conversion/missing_saved_class.py +39 -0
- meltygui/core/conversion/path_finder.py +606 -0
- meltygui/core/conversion/render_host.py +1083 -0
- meltygui/core/core_render.py +6537 -0
- meltygui/core/definition_hotswap.py +231 -0
- meltygui/core/diagnostics/__init__.py +1 -0
- meltygui/core/diagnostics/attribute_churn.py +38 -0
- meltygui/core/diagnostics/fps_counter.py +39 -0
- meltygui/core/diagnostics/gpu_frame_timer.py +103 -0
- meltygui/core/diagnostics/inspection_core.py +169 -0
- meltygui/core/diagnostics/monitor_core.py +105 -0
- meltygui/core/diagnostics/notifications.py +706 -0
- meltygui/core/diagnostics/perf_trace.py +281 -0
- meltygui/core/diagnostics/profile_decoration.py +88 -0
- meltygui/core/diagnostics/resize_trace.py +62 -0
- meltygui/core/diagnostics/screenshot_core.py +247 -0
- meltygui/core/diagnostics/session_status.py +98 -0
- meltygui/core/diagnostics/trace_core.py +445 -0
- meltygui/core/files/__init__.py +1 -0
- meltygui/core/files/file_core.py +208 -0
- meltygui/core/files/file_explorer_core.py +104 -0
- meltygui/core/files/file_tree_core.py +198 -0
- meltygui/core/files/file_watch_core.py +43 -0
- meltygui/core/files/import_graph_core.py +43 -0
- meltygui/core/files/metadata_core.py +51 -0
- meltygui/core/graphics/__init__.py +1 -0
- meltygui/core/graphics/cuda_context_core.py +166 -0
- meltygui/core/graphics/cuda_interop_core.py +136 -0
- meltygui/core/graphics/cuda_kernel_core.py +91 -0
- meltygui/core/graphics/framebuffer_recorder.py +337 -0
- meltygui/core/graphics/gl_state.py +658 -0
- meltygui/core/graphics/lut_core.py +52 -0
- meltygui/core/graphics/overlay_renderer.py +984 -0
- meltygui/core/graphics/scene_target.py +180 -0
- meltygui/core/graphics/screenshot.py +439 -0
- meltygui/core/graphics/shader_func.py +478 -0
- meltygui/core/graphics/tensor_core.py +45 -0
- meltygui/core/graphics/text_texture.py +329 -0
- meltygui/core/graphics/wayland_color.py +635 -0
- meltygui/core/input/__init__.py +1 -0
- meltygui/core/input/collision.py +165 -0
- meltygui/core/input/drag_drop_core.py +1525 -0
- meltygui/core/input/hypr_left_drag.py +323 -0
- meltygui/core/input/input_core.py +245 -0
- meltygui/core/input/input_handler.py +1101 -0
- meltygui/core/input/mouse_cursor.py +355 -0
- meltygui/core/input/pynput_backend.py +1054 -0
- meltygui/core/input/space_mouse.py +338 -0
- meltygui/core/input/touchpad_backend.py +393 -0
- meltygui/core/input/view_selection.py +177 -0
- meltygui/core/layout/__init__.py +1 -0
- meltygui/core/layout/column_core.py +2153 -0
- meltygui/core/layout/cursor_core.py +161 -0
- meltygui/core/layout/dropdown_core.py +278 -0
- meltygui/core/layout/edge_constraints.py +155 -0
- meltygui/core/layout/grid_core.py +117 -0
- meltygui/core/layout/header_core.py +23 -0
- meltygui/core/layout/header_runtime.py +67 -0
- meltygui/core/layout/layout_core.py +87 -0
- meltygui/core/layout/tile_manager_core.py +591 -0
- meltygui/core/melty.py +6726 -0
- meltygui/core/module_map.json +896 -0
- meltygui/core/module_names.py +19 -0
- meltygui/core/rendering/__init__.py +1 -0
- meltygui/core/rendering/core_decoration.py +431 -0
- meltygui/core/rendering/core_render_helpers.py +328 -0
- meltygui/core/rendering/func_metadata.py +398 -0
- meltygui/core/rendering/mode.py +818 -0
- meltygui/core/rendering/mode_defaults.py +41 -0
- meltygui/core/rendering/modes.py +136 -0
- meltygui/core/rendering/parameter_core.py +1665 -0
- meltygui/core/rendering/render_dispatch.py +1891 -0
- meltygui/core/rendering/render_funcs.py +273 -0
- meltygui/core/rendering/shaped.py +312 -0
- meltygui/core/rendering/window_decoration.py +25 -0
- meltygui/core/runtime/__init__.py +1 -0
- meltygui/core/runtime/app.py +735 -0
- meltygui/core/runtime/app_session.py +140 -0
- meltygui/core/runtime/background.py +564 -0
- meltygui/core/runtime/extensions.py +53 -0
- meltygui/core/runtime/gc_manager.py +1163 -0
- meltygui/core/runtime/lifecycle.py +21 -0
- meltygui/core/runtime/paths.py +27 -0
- meltygui/core/runtime/settings.py +14 -0
- meltygui/core/runtime/singleton.py +16 -0
- meltygui/core/runtime/thread_safe_bool.py +24 -0
- meltygui/core/runtime/thread_signal.py +30 -0
- meltygui/core/runtime/toggles.py +3115 -0
- meltygui/core/services/__init__.py +1 -0
- meltygui/core/services/account_core.py +10 -0
- meltygui/core/services/chat_core.py +19 -0
- meltygui/core/services/claude_terminal_core.py +346 -0
- meltygui/core/services/terminal_core.py +458 -0
- meltygui/core/services/terminal_runtime.py +78 -0
- meltygui/core/styling/__init__.py +1 -0
- meltygui/core/styling/color_core.py +46 -0
- meltygui/core/styling/fonts.py +639 -0
- meltygui/core/styling/global_style.py +338 -0
- meltygui/core/styling/style.py +198 -0
- meltygui/core/styling/style_core.py +522 -0
- meltygui/core/styling/warm_start.py +149 -0
- meltygui/core/windowing/__init__.py +1 -0
- meltygui/core/windowing/backends/PYIMGUI_LICENSE +28 -0
- meltygui/core/windowing/backends/__init__.py +1 -0
- meltygui/core/windowing/backends/imgui_renderer.py +138 -0
- meltygui/core/windowing/backends/native_wayland.py +850 -0
- meltygui/core/windowing/backends/protocols/xdg-decoration-unstable-v1.xml +156 -0
- meltygui/core/windowing/backends/protocols/xdg-shell.xml +1420 -0
- meltygui/core/windowing/backends/wayland_protocol.py +101 -0
- meltygui/core/windowing/dock_core.py +182 -0
- meltygui/core/windowing/frame_geometry.py +42 -0
- meltygui/core/windowing/geometry_feed.py +864 -0
- meltygui/core/windowing/glfw_utils.py +1343 -0
- meltygui/core/windowing/os_frame.py +1552 -0
- meltygui/core/windowing/surface.py +643 -0
- meltygui/core/windowing/titlebar.py +1560 -0
- meltygui/core/windowing/titlebar_buttons.py +281 -0
- meltygui/core/windowing/wayland_move.py +932 -0
- meltygui/core/windowing/window_api.py +62 -0
- meltygui/core/windowing/window_constants.py +339 -0
- meltygui/core/windowing/window_visibility.py +162 -0
- meltygui/debug/__init__.py +0 -0
- meltygui/debug/app_view_utils.py +9 -0
- meltygui/editor/__init__.py +0 -0
- meltygui/editor/bash_syntax.py +30 -0
- meltygui/editor/code_line_fast.py +152 -0
- meltygui/editor/diff.py +139 -0
- meltygui/editor/external_changes.py +159 -0
- meltygui/editor/file_header.py +41 -0
- meltygui/editor/live_usage.py +169 -0
- meltygui/editor/live_view_views.py +1803 -0
- meltygui/editor/pending_save.py +1351 -0
- meltygui/editor/roster_tints.py +547 -0
- meltygui/editor/source_preview.py +16 -0
- meltygui/editor/source_tools.py +10 -0
- meltygui/editor/source_ui.py +70 -0
- meltygui/editor/spell_check.py +77 -0
- meltygui/editor/text_editor.py +9076 -0
- meltygui/editor/usage_picker.py +538 -0
- meltygui/events/__init__.py +0 -0
- meltygui/events/example.py +118 -0
- meltygui/examples/__init__.py +0 -0
- meltygui/examples/columns_demo.py +33 -0
- meltygui/examples/columns_window_demo.py +60 -0
- meltygui/examples/context_menu_demo.py +24 -0
- meltygui/examples/context_menu_window_demo.py +49 -0
- meltygui/examples/gui_playground.py +127 -0
- meltygui/examples/live_view_playground.py +256 -0
- meltygui/examples/lora.py +43 -0
- meltygui/examples/lora_data.py +59 -0
- meltygui/examples/lora_policies.py +67 -0
- meltygui/examples/mode_demo.py +49 -0
- meltygui/examples/modifies_demo.py +119 -0
- meltygui/examples/scalar_policies.py +60 -0
- meltygui/examples/style_layouts.py +149 -0
- meltygui/examples/tile_manager_demo.py +74 -0
- meltygui/examples/tint_demo.py +160 -0
- meltygui/examples/tint_functions.py +56 -0
- meltygui/examples/trace_demo.py +88 -0
- meltygui/examples/two_windows.py +36 -0
- meltygui/files/__init__.py +0 -0
- meltygui/files/fast_file_explorer.py +439 -0
- meltygui/gnome_extension/lsd-window-geometry@latent-descent/extension.js +237 -0
- meltygui/gnome_extension/lsd-window-geometry@latent-descent/lsd-window-geometry@latent-descent.iml +9 -0
- meltygui/gnome_extension/lsd-window-geometry@latent-descent/metadata.json +7 -0
- meltygui/graphics/__init__.py +6 -0
- meltygui/graphics/base.py +85 -0
- meltygui/graphics/examples.py +507 -0
- meltygui/graphics/executor.py +520 -0
- meltygui/graphics/filter.py +667 -0
- meltygui/graphics/filter.pyi +856 -0
- meltygui/graphics/generate_stubs.py +22 -0
- meltygui/graphics/registry.py +203 -0
- meltygui/graphics/shader_compiler.py +155 -0
- meltygui/graphics/shaders.py +1302 -0
- meltygui/graphics/stub_generator.py +250 -0
- meltygui/graphics/texture_manager.py +170 -0
- meltygui/graphics/texture_min_max.py +295 -0
- meltygui/hdr_color.py +757 -0
- meltygui/image_load.py +308 -0
- meltygui/model/__init__.py +1 -0
- meltygui/model/account_model.py +142 -0
- meltygui/model/camera_model.py +159 -0
- meltygui/model/chat_model.py +86 -0
- meltygui/model/code_model.py +62 -0
- meltygui/model/code_proxy_model.py +876 -0
- meltygui/model/collection_model.py +41 -0
- meltygui/model/color_model.py +127 -0
- meltygui/model/cuda_tensor_model.py +36 -0
- meltygui/model/cuda_texture_model.py +149 -0
- meltygui/model/dropdown_model.py +137 -0
- meltygui/model/file_metadata_model.py +73 -0
- meltygui/model/file_model.py +289 -0
- meltygui/model/format_model.py +390 -0
- meltygui/model/graph_model.py +98 -0
- meltygui/model/icon_model.py +1024 -0
- meltygui/model/import_graph_model.py +468 -0
- meltygui/model/layout_model.py +15 -0
- meltygui/model/lut_model.py +266 -0
- meltygui/model/search_model.py +173 -0
- meltygui/model/tensor_model.py +402 -0
- meltygui/model/terminal_model.py +329 -0
- meltygui/model/texture_model.py +146 -0
- meltygui/model/tile_model.py +24 -0
- meltygui/model/trace_model.py +198 -0
- meltygui/model/trace_report_model.py +146 -0
- meltygui/models/__init__.py +0 -0
- meltygui/models/file_meta.py +613 -0
- meltygui/models/function_console.py +184 -0
- meltygui/models/orchestration.py +48 -0
- meltygui/pbr.py +1576 -0
- meltygui/png_unfilter.c +49 -0
- meltygui/resources/JetBrainsMono-Regular.ttf +0 -0
- meltygui/resources/THIRD_PARTY_NOTICES.md +21 -0
- meltygui/resources/dejavu/DejaVuSans-Bold.ttf +0 -0
- meltygui/resources/dejavu/DejaVuSans-ExtraLight.ttf +0 -0
- meltygui/resources/dejavu/DejaVuSans.ttf +0 -0
- meltygui/resources/dejavu/LICENSE.txt +78 -0
- meltygui/resources/fontawesome-LICENSE.txt +121 -0
- meltygui/resources/fontawesome-webfont.ttf +0 -0
- meltygui/resources/hdri/studio_small_09_1k.hdr +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-Bold.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-ExtraBold.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-ExtraLight.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-Light.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-Medium.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-SemiBold.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-Thin.ttf +0 -0
- meltygui/resources/jetbrains-weights/OFL.txt +93 -0
- meltygui/resources/jetbrains-weights/README.md +2 -0
- meltygui/state/__init__.py +0 -0
- meltygui/state/account_state.py +22 -0
- meltygui/state/animation_state.py +97 -0
- meltygui/state/annotation_state.py +22 -0
- meltygui/state/chat_state.py +36 -0
- meltygui/state/code_state.py +10 -0
- meltygui/state/core_enums.py +59 -0
- meltygui/state/core_markers.py +115 -0
- meltygui/state/core_undo.py +1075 -0
- meltygui/state/file_state.py +75 -0
- meltygui/state/graph_state.py +26 -0
- meltygui/state/inspection_state.py +47 -0
- meltygui/state/menu_state.py +10 -0
- meltygui/state/model_enums.py +11 -0
- meltygui/state/new_core_model.py +2394 -0
- meltygui/state/orchestration_state.py +14 -0
- meltygui/state/query_state.py +24 -0
- meltygui/state/tensor_state.py +10 -0
- meltygui/state/terminal_state.py +23 -0
- meltygui/state/trace_state.py +32 -0
- meltygui/state/voxel_state.py +12 -0
- meltygui/text_index.py +816 -0
- meltygui/utils/__init__.py +0 -0
- meltygui/utils/jump_to_code.py +344 -0
- meltygui/utils/pkl_inspect.py +90 -0
- meltygui/utils/render_utils.py +1419 -0
- meltygui/view/__init__.py +1 -0
- meltygui/view/account_view.py +524 -0
- meltygui/view/action_view.py +73 -0
- meltygui/view/chat_decoration_view.py +112 -0
- meltygui/view/chat_view.py +1703 -0
- meltygui/view/code_view.py +2677 -0
- meltygui/view/collection_view.py +1185 -0
- meltygui/view/color_view.py +824 -0
- meltygui/view/control_view.py +559 -0
- meltygui/view/decoration_view.py +439 -0
- meltygui/view/diagnostic_view.py +177 -0
- meltygui/view/dropdown_view.py +1082 -0
- meltygui/view/file_view.py +1599 -0
- meltygui/view/graph_cuda_view.py +105 -0
- meltygui/view/graph_view.py +882 -0
- meltygui/view/header_view.py +848 -0
- meltygui/view/input_view.py +238 -0
- meltygui/view/inspection_view.py +1783 -0
- meltygui/view/layout_view.py +596 -0
- meltygui/view/lut_view.py +45 -0
- meltygui/view/menu_view.py +212 -0
- meltygui/view/orchestration_view.py +658 -0
- meltygui/view/query_view.py +118 -0
- meltygui/view/search_view.py +342 -0
- meltygui/view/tab_view.py +258 -0
- meltygui/view/tensor_view.py +430 -0
- meltygui/view/terminal_view.py +355 -0
- meltygui/view/text_view.py +8031 -0
- meltygui/view/texture_view.py +480 -0
- meltygui/view/tile_view.py +38 -0
- meltygui/view/trace_view.py +923 -0
- meltygui/view/voxel_cuda_view.py +824 -0
- meltygui/view/voxel_view.py +1860 -0
- meltygui/view/window_view.py +111 -0
- meltygui-0.1.0.dist-info/METADATA +143 -0
- meltygui-0.1.0.dist-info/RECORD +372 -0
- meltygui-0.1.0.dist-info/WHEEL +4 -0
- meltygui-0.1.0.dist-info/licenses/LICENSE +202 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
"""Input view functions and supporting definitions."""
|
|
2
|
+
from meltygui.core.graphics.gl_state import GLState
|
|
3
|
+
from meltygui.core.melty import Melty
|
|
4
|
+
from meltygui.core.core_render import render_func
|
|
5
|
+
from meltygui.core.runtime.toggles import Toggles
|
|
6
|
+
from meltygui.view.header_view import draw_header
|
|
7
|
+
import math
|
|
8
|
+
import numpy as np
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def render_puck(gl_state, key, width, height, axes, tilt, spin, cam_zoom,
|
|
12
|
+
travel=0.3, twist=0.3, environment_preset="studio", view_tint=None):
|
|
13
|
+
"""The SpaceMouse Wireless through the PBR renderer: the black rubber
|
|
14
|
+
cap with its waisted profile, the glossy inset disc and a front marker
|
|
15
|
+
(the moving piece — translated by the reading and leaned / twisted about
|
|
16
|
+
its own centre) seated in the STATIC base: black collar, blue ring, blue
|
|
17
|
+
LED dot at the front, brushed-steel skirt. Returns the FBO.
|
|
18
|
+
|
|
19
|
+
Frame: the scene is MIRRORED in z (the cap's z travel, the pitch / yaw
|
|
20
|
+
signs) and the orbit runs at -spin — the exact picture the first
|
|
21
|
+
raymarched version drew (its camera basis was left-handed), which is
|
|
22
|
+
what the axis signs and the orbit direction were calibrated against."""
|
|
23
|
+
from meltygui.pbr import Light
|
|
24
|
+
from meltygui.pbr import begin_scene
|
|
25
|
+
from meltygui.pbr import draw_cylinder
|
|
26
|
+
from meltygui.pbr import draw_mesh
|
|
27
|
+
from meltygui.pbr import draw_plane
|
|
28
|
+
from meltygui.pbr import draw_prism
|
|
29
|
+
from meltygui.pbr import end_scene
|
|
30
|
+
from meltygui.pbr import environment
|
|
31
|
+
from meltygui.pbr import model_matrix
|
|
32
|
+
from meltygui.pbr import orbit_camera
|
|
33
|
+
from meltygui.pbr import rotation_matrix
|
|
34
|
+
from meltygui.core.input.input_core import BASE_HEIGHT
|
|
35
|
+
from meltygui.core.input.input_core import CAP_HEIGHT
|
|
36
|
+
from meltygui.core.input.input_core import HOVER_GAP
|
|
37
|
+
from meltygui.core.input.input_core import _CAP_MESHES
|
|
38
|
+
from meltygui.core.input.input_core import _cap_meshes
|
|
39
|
+
from meltygui.core.input.input_core import _device_model
|
|
40
|
+
from meltygui.core.input.input_core import _environment_tint
|
|
41
|
+
from meltygui.core.input.input_core import inset_depth_of_cap
|
|
42
|
+
|
|
43
|
+
# [tint=(0.9, 0.6, 0.2)]
|
|
44
|
+
rubber_color, rubber_roughness = (0.008, 0.008, 0.01), 0.58 # satin: catches a rim
|
|
45
|
+
# [tint=(0.9, 0.6, 0.2)]
|
|
46
|
+
gloss_color, gloss_roughness = (0.003, 0.003, 0.004), 0.12
|
|
47
|
+
# [tint=(0.9, 0.6, 0.2)]
|
|
48
|
+
ring_glow = (0.015, 0.16, 0.55)
|
|
49
|
+
# [tint=(0.9, 0.6, 0.2)]
|
|
50
|
+
base_color, base_roughness = (0.17, 0.17, 0.18), 0.48 # brushed gunmetal
|
|
51
|
+
# [tint=(0.9, 0.6, 0.2)]
|
|
52
|
+
bezel_color, bezel_roughness = (0.55, 0.55, 0.56), 0.5
|
|
53
|
+
tx, ty, tz, rx, ry, rz = (float(a) for a in axes)
|
|
54
|
+
tz, rx, ry = -tz, -rx, -ry # the z mirror (see the docstring)
|
|
55
|
+
|
|
56
|
+
# cached per (height, the builder's code): a hotswapped profile rebuilds
|
|
57
|
+
# instead of serving the meshes of the previous version
|
|
58
|
+
mesh_key = (CAP_HEIGHT, _cap_meshes.__code__.co_code)
|
|
59
|
+
meshes = _CAP_MESHES.get(mesh_key)
|
|
60
|
+
if meshes is None:
|
|
61
|
+
_CAP_MESHES.clear()
|
|
62
|
+
meshes = _CAP_MESHES[mesh_key] = _cap_meshes()
|
|
63
|
+
|
|
64
|
+
scene = begin_scene(
|
|
65
|
+
gl_state, key, width, height,
|
|
66
|
+
camera=orbit_camera(tilt, -spin, cam_zoom, target=(0.0, 0.15, 0.0)),
|
|
67
|
+
# main light placed for the camera's direction at the default orbit
|
|
68
|
+
# (set by rendering candidates - the mirrored frame makes reasoning
|
|
69
|
+
# about it error-prone); a dim cool fill light
|
|
70
|
+
lights=[Light((-1.7, 5.0, 1.9), (1.0, 0.98, 0.95), 42.0),
|
|
71
|
+
Light((2.5, 2.0, -1.5), (0.8, 0.85, 1.0), 4.0)],
|
|
72
|
+
environment=environment(gl_state, environment_preset, strength=0.45),
|
|
73
|
+
environment_tint=_environment_tint(view_tint),
|
|
74
|
+
shadow_softness=3.0, shadow_opacity=0.65)
|
|
75
|
+
# the cap's transform: hover above the shelf, slide by the reading,
|
|
76
|
+
# then pitch about X, roll about Z, yaw about Y about its FOOT centre
|
|
77
|
+
centre_y = HOVER_GAP
|
|
78
|
+
rot = (rotation_matrix((rx * twist, 0.0, 0.0)) @ rotation_matrix((0.0, 0.0, rz * twist))
|
|
79
|
+
@ rotation_matrix((0.0, ry * twist, 0.0)))
|
|
80
|
+
cap = np.eye(4)
|
|
81
|
+
cap[:3, :3] = rot
|
|
82
|
+
# push DOWN bottoms out on the base: a full push (ty = -1) lands the
|
|
83
|
+
# foot on the shelf (the hover gap is the whole downward travel); that
|
|
84
|
+
# and the lateral axes use `travel`
|
|
85
|
+
y_down = min(ty, 0.0) * (HOVER_GAP + 0.03)
|
|
86
|
+
cap[:3, 3] = np.array([tx * travel, centre_y + max(ty, 0.0) * travel + y_down, tz * travel])
|
|
87
|
+
|
|
88
|
+
# ── a real model, when Toggles.SpaceMouse.model_path names one: fitted
|
|
89
|
+
# to the procedural device's footprint, the cap-named parts get the
|
|
90
|
+
# cap transform about its own centre, the rest static ──
|
|
91
|
+
model = _device_model()
|
|
92
|
+
if model is not None:
|
|
93
|
+
fit = model.fit_transform(height=0.9, floor=True, up=Toggles.SpaceMouse.model_up)
|
|
94
|
+
for name, part in model.parts.items():
|
|
95
|
+
is_cap = any(word in name.lower() for word in ("cap", "knob", "puck"))
|
|
96
|
+
if is_cap:
|
|
97
|
+
centre = fit @ np.array([*((part.positions.min(0) + part.positions.max(0)) * 0.5), 1.0])
|
|
98
|
+
shift = np.eye(4); shift[:3, 3] = -centre[:3]
|
|
99
|
+
lift = np.eye(4); lift[:3, 3] = centre[:3] - (0.0, centre_y, 0.0)
|
|
100
|
+
transform = lift @ cap @ shift @ fit
|
|
101
|
+
draw_mesh(scene, part, key=(model.path, name), transform=transform,
|
|
102
|
+
color=rubber_color, roughness=rubber_roughness)
|
|
103
|
+
else:
|
|
104
|
+
draw_mesh(scene, part, key=(model.path, name), transform=fit,
|
|
105
|
+
color=(0.6, 0.6, 0.62), roughness=0.4, metallic=0.9)
|
|
106
|
+
return end_scene(scene)
|
|
107
|
+
|
|
108
|
+
draw_mesh(scene, meshes["body"], key=("cap_body", CAP_HEIGHT, id(meshes["body"])), transform=cap,
|
|
109
|
+
color=rubber_color, roughness=rubber_roughness)
|
|
110
|
+
draw_mesh(scene, meshes["top"], key=("cap_top", CAP_HEIGHT, id(meshes["top"])), transform=cap,
|
|
111
|
+
color=gloss_color, roughness=gloss_roughness)
|
|
112
|
+
# the marker: a metal arrow on the disc pointing at the front (-z, the
|
|
113
|
+
# mirrored front) - the twist indicator. Shaft + head, two convex prisms.
|
|
114
|
+
arrow_y = CAP_HEIGHT - inset_depth_of_cap() + 0.012
|
|
115
|
+
arrow = dict(color=(0.85, 0.85, 0.88), roughness=0.4, metallic=0.9, emissive=(0.08, 0.08, 0.09))
|
|
116
|
+
draw_prism(scene, transform=cap @ model_matrix(position=(0.0, arrow_y, 0.0)),
|
|
117
|
+
points=((-0.03, -0.18), (-0.03, -0.42), (0.03, -0.42), (0.03, -0.18)), height=0.012, **arrow)
|
|
118
|
+
draw_prism(scene, transform=cap @ model_matrix(position=(0.0, arrow_y, 0.0)),
|
|
119
|
+
points=((-0.09, -0.42), (0.0, -0.58), (0.09, -0.42)), height=0.012, **arrow)
|
|
120
|
+
draw_mesh(scene, meshes["bezel"], key=("cap_bezel", CAP_HEIGHT, id(meshes["bezel"])), transform=cap,
|
|
121
|
+
color=bezel_color, roughness=bezel_roughness, metallic=1.0)
|
|
122
|
+
# ── the base: static ──
|
|
123
|
+
draw_mesh(scene, meshes["base"], key=("base", CAP_HEIGHT, id(meshes["base"])), color=base_color,
|
|
124
|
+
roughness=base_roughness, metallic=1.0)
|
|
125
|
+
draw_mesh(scene, meshes["ring"], key=("base_ring", CAP_HEIGHT, id(meshes["ring"])),
|
|
126
|
+
color=(0.02, 0.1, 0.3), roughness=0.4, emissive=ring_glow)
|
|
127
|
+
# the desk: invisible, shows only the shadows the device casts
|
|
128
|
+
draw_plane(scene, position=(0.0, -0.05 - BASE_HEIGHT - 0.05, 0.0), scale=(20.0, 1.0, 20.0),
|
|
129
|
+
shadow_catcher=True)
|
|
130
|
+
# the LED dot on the base's front
|
|
131
|
+
draw_cylinder(scene, position=(0.0, -0.2, -1.18), rotation=(math.pi / 2, 0.0, 0.0),
|
|
132
|
+
scale=(0.04, 0.03, 0.04), edge_radius=0.4, color=(0.02, 0.1, 0.3),
|
|
133
|
+
roughness=0.3, emissive=ring_glow)
|
|
134
|
+
return end_scene(scene)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
@render_func(show_bg=True, auto_resize=False, min_width=300, min_height=420,
|
|
138
|
+
with_header=draw_header, bg_offset=0, disable_scroll=True,
|
|
139
|
+
use_cache=True, tint=(0.181, 0.119, 0.294))
|
|
140
|
+
def draw_space_mouse(input_value=None, gl_state: GLState = None, draw_state=None,
|
|
141
|
+
# ── camera (auto params: orbit persists per view) ──
|
|
142
|
+
tilt=0.45, spin=0.9, cam_zoom=4.2,
|
|
143
|
+
# ── exaggeration of the cap's motion: world units of
|
|
144
|
+
# travel per full push, radians of lean per full twist ──
|
|
145
|
+
travel=0.3, twist=0.3,
|
|
146
|
+
# ── the readout under the image, and the settings in
|
|
147
|
+
# a second column (column_edges: the divider persists) ──
|
|
148
|
+
show_readout=True, show_settings=True,
|
|
149
|
+
column_edges=None, column_widths=None,
|
|
150
|
+
middle_mouse_drag=None, scroll_y_changed=None, **kwargs):
|
|
151
|
+
"""A 3-D SpaceMouse that mirrors the real one, with its live reading."""
|
|
152
|
+
from meltygui.code.new_converters import code_hosts_for
|
|
153
|
+
from meltygui.view.tensor_view import _view_size
|
|
154
|
+
from meltygui.view.collection_view import draw_collection
|
|
155
|
+
from meltygui.core.layout.column_core import ColumnLayout
|
|
156
|
+
from meltygui.core.input.input_core import _draw_puck
|
|
157
|
+
from meltygui.core.input.input_core import _draw_readout
|
|
158
|
+
import meltygui.core.input.space_mouse as space_mouse
|
|
159
|
+
|
|
160
|
+
# [tint=(0.9, 0.6, 0.2)]
|
|
161
|
+
bar_width = 120
|
|
162
|
+
# [tint=(0.9, 0.6, 0.2)]
|
|
163
|
+
row_height = 18
|
|
164
|
+
axis_tint = (0.35, 0.75, 1.0)
|
|
165
|
+
axis_tint_negative = (1.0, 0.55, 0.35)
|
|
166
|
+
|
|
167
|
+
space_mouse.watch(draw_state)
|
|
168
|
+
|
|
169
|
+
# ── gestures → auto params, the voxel box's orbit: tilt is UNRESTRICTED
|
|
170
|
+
# (over the poles and on, re-wrapped), and the spin direction is latched
|
|
171
|
+
# per GESTURE from which way it pointed at the press - upside down a
|
|
172
|
+
# rightward drag must spin the other way to keep tracking the cursor -
|
|
173
|
+
# so crossing a pole mid-drag never reverses the drag; the latch clears
|
|
174
|
+
# on release, the NEXT drag re-reads the orientation. Right-side up a
|
|
175
|
+
# rightward drag DECREASES spin (the box turns with the cursor; the
|
|
176
|
+
# negative sign does it backwards, 09-04). ──
|
|
177
|
+
if middle_mouse_drag is not None:
|
|
178
|
+
spin_sign = getattr(draw_state, "_orbit_spin_sign", None)
|
|
179
|
+
if spin_sign is None:
|
|
180
|
+
spin_sign = 1.0 if math.cos(tilt) < 0.0 else -1.0
|
|
181
|
+
draw_state._orbit_spin_sign = spin_sign
|
|
182
|
+
spin += middle_mouse_drag.dx * 0.008 * spin_sign
|
|
183
|
+
tilt = math.remainder(tilt + middle_mouse_drag.dy * 0.008, math.tau)
|
|
184
|
+
draw_state.locate_spin = spin
|
|
185
|
+
draw_state.locate_tilt = tilt
|
|
186
|
+
else:
|
|
187
|
+
draw_state._orbit_spin_sign = None
|
|
188
|
+
if scroll_y_changed is not None:
|
|
189
|
+
cam_zoom = min(20.0, max(1.5, cam_zoom * math.exp(-0.23 * scroll_y_changed.value)))
|
|
190
|
+
draw_state.locate_cam_zoom = cam_zoom
|
|
191
|
+
|
|
192
|
+
# ── the reading: level state straight off the pump ──
|
|
193
|
+
reader = space_mouse.reader()
|
|
194
|
+
with reader.lock:
|
|
195
|
+
raw = reader.raw
|
|
196
|
+
axes = space_mouse.normalize(raw)
|
|
197
|
+
status = space_mouse.status()
|
|
198
|
+
|
|
199
|
+
# ── two columns: the image + readout │ the settings. ColumnLayout owns
|
|
200
|
+
# the divider (drag it; column_edges persists it), the cells clip. ──
|
|
201
|
+
_, height = _view_size(draw_state)
|
|
202
|
+
if show_readout:
|
|
203
|
+
height -= row_height * (len(space_mouse.AXES) + 1) + 8
|
|
204
|
+
height = max(120, height)
|
|
205
|
+
n_cols = 2 if show_settings else 1
|
|
206
|
+
columns = ColumnLayout(draw_state, n_cols, column_edges=column_edges,
|
|
207
|
+
column_widths=column_widths or [None, Melty.px(340)][:n_cols],
|
|
208
|
+
padding=4.0, border_color=None,
|
|
209
|
+
column_mins=[Melty.px(220), Melty.px(240)][:n_cols])
|
|
210
|
+
settings_changed = False
|
|
211
|
+
with columns.cell(0) as cell_width:
|
|
212
|
+
width = max(64, int(cell_width))
|
|
213
|
+
_draw_puck(gl_state, axes, width, height, tilt, spin, cam_zoom, travel, twist,
|
|
214
|
+
view_tint=draw_state._kwargs.get("tint", None))
|
|
215
|
+
if show_readout:
|
|
216
|
+
_draw_readout(draw_state, raw, axes, status, bar_width, row_height,
|
|
217
|
+
axis_tint, axis_tint_negative)
|
|
218
|
+
if show_settings:
|
|
219
|
+
with columns.cell(1) as cell_width:
|
|
220
|
+
# Toggles.SpaceMouse's shared code hosts (the same pair the
|
|
221
|
+
# Toggles window and the setting windows edit - one parse),
|
|
222
|
+
# rendered straight as a collection. Every edit round-trips into
|
|
223
|
+
# toggles.py through the host's instance, and the reader picks
|
|
224
|
+
# the new values up live.
|
|
225
|
+
settings_host = code_hosts_for(Toggles.SpaceMouse)
|
|
226
|
+
settings_changed, _ = draw_collection(settings_host, name="Toggles.SpaceMouse",
|
|
227
|
+
width=cell_width,
|
|
228
|
+
initial={"expanded": True})
|
|
229
|
+
if settings_changed:
|
|
230
|
+
settings_host[1].notify_on_change(draw_state)
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
columns.finish()
|
|
234
|
+
|
|
235
|
+
# The reading is the pump's business (it invalidates watchers as the cap
|
|
236
|
+
# moves), the camera gestures and the settings edits are ours.
|
|
237
|
+
return (middle_mouse_drag is not None or scroll_y_changed is not None
|
|
238
|
+
or settings_changed), input_value
|