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.
Files changed (372) hide show
  1. meltygui/__init__.py +107 -0
  2. meltygui/accounts/__init__.py +0 -0
  3. meltygui/accounts/internet_accounts.py +1355 -0
  4. meltygui/chat/__init__.py +91 -0
  5. meltygui/chat/activity.py +75 -0
  6. meltygui/chat/backends.py +36 -0
  7. meltygui/chat/chat_interface.py +732 -0
  8. meltygui/chat/chat_proxy.py +352 -0
  9. meltygui/chat/codex_proxy.py +592 -0
  10. meltygui/chat/codex_settings.py +100 -0
  11. meltygui/chat/codex_transport.py +60 -0
  12. meltygui/chat/command_parser.py +204 -0
  13. meltygui/chat/images.py +227 -0
  14. meltygui/chat/messages.py +417 -0
  15. meltygui/chat/metadata.py +139 -0
  16. meltygui/chat/writer_locks.py +64 -0
  17. meltygui/code/__init__.py +0 -0
  18. meltygui/code/basic_converters.py +533 -0
  19. meltygui/code/chain_converters.py +2111 -0
  20. meltygui/code/code_checks.py +2209 -0
  21. meltygui/code/core_syntax.py +1430 -0
  22. meltygui/code/file_converters.py +1933 -0
  23. meltygui/code/fileref.py +702 -0
  24. meltygui/code/hotswap_guard.py +144 -0
  25. meltygui/code/libcst_conversion.py +9724 -0
  26. meltygui/code/live_instrument.py +392 -0
  27. meltygui/code/live_view.py +2490 -0
  28. meltygui/code/melty_scan.py +2684 -0
  29. meltygui/code/new_codecs.py +1255 -0
  30. meltygui/code/new_converters.py +3017 -0
  31. meltygui/code/project_code.py +278 -0
  32. meltygui/code/source_context.py +63 -0
  33. meltygui/code/symbol_roster.py +1588 -0
  34. meltygui/code/syntax_check.py +34 -0
  35. meltygui/code/syntax_check_worker.py +114 -0
  36. meltygui/completion/__init__.py +0 -0
  37. meltygui/completion/fim.py +1232 -0
  38. meltygui/completion/fim_context.py +481 -0
  39. meltygui/completion/providers/__init__.py +0 -0
  40. meltygui/completion/providers/anthropic_oauth.py +446 -0
  41. meltygui/completion/providers/anthropic_requests.py +69 -0
  42. meltygui/completion/providers/claude.py +203 -0
  43. meltygui/completion/providers/claude_usage.py +499 -0
  44. meltygui/completion/providers/codex_accounts.py +180 -0
  45. meltygui/completion/providers/copilot.py +617 -0
  46. meltygui/completion/providers/oauth_popup.py +220 -0
  47. meltygui/completion/providers/ollama.py +320 -0
  48. meltygui/completion/providers/profiles.py +23 -0
  49. meltygui/core/README.md +88 -0
  50. meltygui/core/__init__.py +1 -0
  51. meltygui/core/automation/__init__.py +1 -0
  52. meltygui/core/automation/action_core.py +153 -0
  53. meltygui/core/automation/collection_action.py +45 -0
  54. meltygui/core/automation/mcp_eval.py +167 -0
  55. meltygui/core/automation/mcp_hotswap.py +107 -0
  56. meltygui/core/automation/mcp_query.py +552 -0
  57. meltygui/core/automation/mcp_server.py +657 -0
  58. meltygui/core/automation/orchestration_core.py +2636 -0
  59. meltygui/core/automation/query_core.py +124 -0
  60. meltygui/core/automation/search_core.py +26 -0
  61. meltygui/core/automation/selector_core.py +340 -0
  62. meltygui/core/automation/value_core.py +1752 -0
  63. meltygui/core/cache/__init__.py +1 -0
  64. meltygui/core/cache/cache_diagnostics.py +0 -0
  65. meltygui/core/cache/invalidation_decoration.py +153 -0
  66. meltygui/core/cache/invalidation_tracker.py +43 -0
  67. meltygui/core/cache/tile_cache.py +5968 -0
  68. meltygui/core/conversion/__init__.py +1 -0
  69. meltygui/core/conversion/bubbling.py +599 -0
  70. meltygui/core/conversion/cache_tree.py +188 -0
  71. meltygui/core/conversion/chain.py +113 -0
  72. meltygui/core/conversion/converter_register.py +145 -0
  73. meltygui/core/conversion/data_decoration.py +67 -0
  74. meltygui/core/conversion/dict_conversion.py +1815 -0
  75. meltygui/core/conversion/dict_conversion_util.py +177 -0
  76. meltygui/core/conversion/dynamic_obj.py +89 -0
  77. meltygui/core/conversion/graph_compare.py +183 -0
  78. meltygui/core/conversion/load_save_v2.py +1032 -0
  79. meltygui/core/conversion/missing_saved_class.py +39 -0
  80. meltygui/core/conversion/path_finder.py +606 -0
  81. meltygui/core/conversion/render_host.py +1083 -0
  82. meltygui/core/core_render.py +6537 -0
  83. meltygui/core/definition_hotswap.py +231 -0
  84. meltygui/core/diagnostics/__init__.py +1 -0
  85. meltygui/core/diagnostics/attribute_churn.py +38 -0
  86. meltygui/core/diagnostics/fps_counter.py +39 -0
  87. meltygui/core/diagnostics/gpu_frame_timer.py +103 -0
  88. meltygui/core/diagnostics/inspection_core.py +169 -0
  89. meltygui/core/diagnostics/monitor_core.py +105 -0
  90. meltygui/core/diagnostics/notifications.py +706 -0
  91. meltygui/core/diagnostics/perf_trace.py +281 -0
  92. meltygui/core/diagnostics/profile_decoration.py +88 -0
  93. meltygui/core/diagnostics/resize_trace.py +62 -0
  94. meltygui/core/diagnostics/screenshot_core.py +247 -0
  95. meltygui/core/diagnostics/session_status.py +98 -0
  96. meltygui/core/diagnostics/trace_core.py +445 -0
  97. meltygui/core/files/__init__.py +1 -0
  98. meltygui/core/files/file_core.py +208 -0
  99. meltygui/core/files/file_explorer_core.py +104 -0
  100. meltygui/core/files/file_tree_core.py +198 -0
  101. meltygui/core/files/file_watch_core.py +43 -0
  102. meltygui/core/files/import_graph_core.py +43 -0
  103. meltygui/core/files/metadata_core.py +51 -0
  104. meltygui/core/graphics/__init__.py +1 -0
  105. meltygui/core/graphics/cuda_context_core.py +166 -0
  106. meltygui/core/graphics/cuda_interop_core.py +136 -0
  107. meltygui/core/graphics/cuda_kernel_core.py +91 -0
  108. meltygui/core/graphics/framebuffer_recorder.py +337 -0
  109. meltygui/core/graphics/gl_state.py +658 -0
  110. meltygui/core/graphics/lut_core.py +52 -0
  111. meltygui/core/graphics/overlay_renderer.py +984 -0
  112. meltygui/core/graphics/scene_target.py +180 -0
  113. meltygui/core/graphics/screenshot.py +439 -0
  114. meltygui/core/graphics/shader_func.py +478 -0
  115. meltygui/core/graphics/tensor_core.py +45 -0
  116. meltygui/core/graphics/text_texture.py +329 -0
  117. meltygui/core/graphics/wayland_color.py +635 -0
  118. meltygui/core/input/__init__.py +1 -0
  119. meltygui/core/input/collision.py +165 -0
  120. meltygui/core/input/drag_drop_core.py +1525 -0
  121. meltygui/core/input/hypr_left_drag.py +323 -0
  122. meltygui/core/input/input_core.py +245 -0
  123. meltygui/core/input/input_handler.py +1101 -0
  124. meltygui/core/input/mouse_cursor.py +355 -0
  125. meltygui/core/input/pynput_backend.py +1054 -0
  126. meltygui/core/input/space_mouse.py +338 -0
  127. meltygui/core/input/touchpad_backend.py +393 -0
  128. meltygui/core/input/view_selection.py +177 -0
  129. meltygui/core/layout/__init__.py +1 -0
  130. meltygui/core/layout/column_core.py +2153 -0
  131. meltygui/core/layout/cursor_core.py +161 -0
  132. meltygui/core/layout/dropdown_core.py +278 -0
  133. meltygui/core/layout/edge_constraints.py +155 -0
  134. meltygui/core/layout/grid_core.py +117 -0
  135. meltygui/core/layout/header_core.py +23 -0
  136. meltygui/core/layout/header_runtime.py +67 -0
  137. meltygui/core/layout/layout_core.py +87 -0
  138. meltygui/core/layout/tile_manager_core.py +591 -0
  139. meltygui/core/melty.py +6726 -0
  140. meltygui/core/module_map.json +896 -0
  141. meltygui/core/module_names.py +19 -0
  142. meltygui/core/rendering/__init__.py +1 -0
  143. meltygui/core/rendering/core_decoration.py +431 -0
  144. meltygui/core/rendering/core_render_helpers.py +328 -0
  145. meltygui/core/rendering/func_metadata.py +398 -0
  146. meltygui/core/rendering/mode.py +818 -0
  147. meltygui/core/rendering/mode_defaults.py +41 -0
  148. meltygui/core/rendering/modes.py +136 -0
  149. meltygui/core/rendering/parameter_core.py +1665 -0
  150. meltygui/core/rendering/render_dispatch.py +1891 -0
  151. meltygui/core/rendering/render_funcs.py +273 -0
  152. meltygui/core/rendering/shaped.py +312 -0
  153. meltygui/core/rendering/window_decoration.py +25 -0
  154. meltygui/core/runtime/__init__.py +1 -0
  155. meltygui/core/runtime/app.py +735 -0
  156. meltygui/core/runtime/app_session.py +140 -0
  157. meltygui/core/runtime/background.py +564 -0
  158. meltygui/core/runtime/extensions.py +53 -0
  159. meltygui/core/runtime/gc_manager.py +1163 -0
  160. meltygui/core/runtime/lifecycle.py +21 -0
  161. meltygui/core/runtime/paths.py +27 -0
  162. meltygui/core/runtime/settings.py +14 -0
  163. meltygui/core/runtime/singleton.py +16 -0
  164. meltygui/core/runtime/thread_safe_bool.py +24 -0
  165. meltygui/core/runtime/thread_signal.py +30 -0
  166. meltygui/core/runtime/toggles.py +3115 -0
  167. meltygui/core/services/__init__.py +1 -0
  168. meltygui/core/services/account_core.py +10 -0
  169. meltygui/core/services/chat_core.py +19 -0
  170. meltygui/core/services/claude_terminal_core.py +346 -0
  171. meltygui/core/services/terminal_core.py +458 -0
  172. meltygui/core/services/terminal_runtime.py +78 -0
  173. meltygui/core/styling/__init__.py +1 -0
  174. meltygui/core/styling/color_core.py +46 -0
  175. meltygui/core/styling/fonts.py +639 -0
  176. meltygui/core/styling/global_style.py +338 -0
  177. meltygui/core/styling/style.py +198 -0
  178. meltygui/core/styling/style_core.py +522 -0
  179. meltygui/core/styling/warm_start.py +149 -0
  180. meltygui/core/windowing/__init__.py +1 -0
  181. meltygui/core/windowing/backends/PYIMGUI_LICENSE +28 -0
  182. meltygui/core/windowing/backends/__init__.py +1 -0
  183. meltygui/core/windowing/backends/imgui_renderer.py +138 -0
  184. meltygui/core/windowing/backends/native_wayland.py +850 -0
  185. meltygui/core/windowing/backends/protocols/xdg-decoration-unstable-v1.xml +156 -0
  186. meltygui/core/windowing/backends/protocols/xdg-shell.xml +1420 -0
  187. meltygui/core/windowing/backends/wayland_protocol.py +101 -0
  188. meltygui/core/windowing/dock_core.py +182 -0
  189. meltygui/core/windowing/frame_geometry.py +42 -0
  190. meltygui/core/windowing/geometry_feed.py +864 -0
  191. meltygui/core/windowing/glfw_utils.py +1343 -0
  192. meltygui/core/windowing/os_frame.py +1552 -0
  193. meltygui/core/windowing/surface.py +643 -0
  194. meltygui/core/windowing/titlebar.py +1560 -0
  195. meltygui/core/windowing/titlebar_buttons.py +281 -0
  196. meltygui/core/windowing/wayland_move.py +932 -0
  197. meltygui/core/windowing/window_api.py +62 -0
  198. meltygui/core/windowing/window_constants.py +339 -0
  199. meltygui/core/windowing/window_visibility.py +162 -0
  200. meltygui/debug/__init__.py +0 -0
  201. meltygui/debug/app_view_utils.py +9 -0
  202. meltygui/editor/__init__.py +0 -0
  203. meltygui/editor/bash_syntax.py +30 -0
  204. meltygui/editor/code_line_fast.py +152 -0
  205. meltygui/editor/diff.py +139 -0
  206. meltygui/editor/external_changes.py +159 -0
  207. meltygui/editor/file_header.py +41 -0
  208. meltygui/editor/live_usage.py +169 -0
  209. meltygui/editor/live_view_views.py +1803 -0
  210. meltygui/editor/pending_save.py +1351 -0
  211. meltygui/editor/roster_tints.py +547 -0
  212. meltygui/editor/source_preview.py +16 -0
  213. meltygui/editor/source_tools.py +10 -0
  214. meltygui/editor/source_ui.py +70 -0
  215. meltygui/editor/spell_check.py +77 -0
  216. meltygui/editor/text_editor.py +9076 -0
  217. meltygui/editor/usage_picker.py +538 -0
  218. meltygui/events/__init__.py +0 -0
  219. meltygui/events/example.py +118 -0
  220. meltygui/examples/__init__.py +0 -0
  221. meltygui/examples/columns_demo.py +33 -0
  222. meltygui/examples/columns_window_demo.py +60 -0
  223. meltygui/examples/context_menu_demo.py +24 -0
  224. meltygui/examples/context_menu_window_demo.py +49 -0
  225. meltygui/examples/gui_playground.py +127 -0
  226. meltygui/examples/live_view_playground.py +256 -0
  227. meltygui/examples/lora.py +43 -0
  228. meltygui/examples/lora_data.py +59 -0
  229. meltygui/examples/lora_policies.py +67 -0
  230. meltygui/examples/mode_demo.py +49 -0
  231. meltygui/examples/modifies_demo.py +119 -0
  232. meltygui/examples/scalar_policies.py +60 -0
  233. meltygui/examples/style_layouts.py +149 -0
  234. meltygui/examples/tile_manager_demo.py +74 -0
  235. meltygui/examples/tint_demo.py +160 -0
  236. meltygui/examples/tint_functions.py +56 -0
  237. meltygui/examples/trace_demo.py +88 -0
  238. meltygui/examples/two_windows.py +36 -0
  239. meltygui/files/__init__.py +0 -0
  240. meltygui/files/fast_file_explorer.py +439 -0
  241. meltygui/gnome_extension/lsd-window-geometry@latent-descent/extension.js +237 -0
  242. meltygui/gnome_extension/lsd-window-geometry@latent-descent/lsd-window-geometry@latent-descent.iml +9 -0
  243. meltygui/gnome_extension/lsd-window-geometry@latent-descent/metadata.json +7 -0
  244. meltygui/graphics/__init__.py +6 -0
  245. meltygui/graphics/base.py +85 -0
  246. meltygui/graphics/examples.py +507 -0
  247. meltygui/graphics/executor.py +520 -0
  248. meltygui/graphics/filter.py +667 -0
  249. meltygui/graphics/filter.pyi +856 -0
  250. meltygui/graphics/generate_stubs.py +22 -0
  251. meltygui/graphics/registry.py +203 -0
  252. meltygui/graphics/shader_compiler.py +155 -0
  253. meltygui/graphics/shaders.py +1302 -0
  254. meltygui/graphics/stub_generator.py +250 -0
  255. meltygui/graphics/texture_manager.py +170 -0
  256. meltygui/graphics/texture_min_max.py +295 -0
  257. meltygui/hdr_color.py +757 -0
  258. meltygui/image_load.py +308 -0
  259. meltygui/model/__init__.py +1 -0
  260. meltygui/model/account_model.py +142 -0
  261. meltygui/model/camera_model.py +159 -0
  262. meltygui/model/chat_model.py +86 -0
  263. meltygui/model/code_model.py +62 -0
  264. meltygui/model/code_proxy_model.py +876 -0
  265. meltygui/model/collection_model.py +41 -0
  266. meltygui/model/color_model.py +127 -0
  267. meltygui/model/cuda_tensor_model.py +36 -0
  268. meltygui/model/cuda_texture_model.py +149 -0
  269. meltygui/model/dropdown_model.py +137 -0
  270. meltygui/model/file_metadata_model.py +73 -0
  271. meltygui/model/file_model.py +289 -0
  272. meltygui/model/format_model.py +390 -0
  273. meltygui/model/graph_model.py +98 -0
  274. meltygui/model/icon_model.py +1024 -0
  275. meltygui/model/import_graph_model.py +468 -0
  276. meltygui/model/layout_model.py +15 -0
  277. meltygui/model/lut_model.py +266 -0
  278. meltygui/model/search_model.py +173 -0
  279. meltygui/model/tensor_model.py +402 -0
  280. meltygui/model/terminal_model.py +329 -0
  281. meltygui/model/texture_model.py +146 -0
  282. meltygui/model/tile_model.py +24 -0
  283. meltygui/model/trace_model.py +198 -0
  284. meltygui/model/trace_report_model.py +146 -0
  285. meltygui/models/__init__.py +0 -0
  286. meltygui/models/file_meta.py +613 -0
  287. meltygui/models/function_console.py +184 -0
  288. meltygui/models/orchestration.py +48 -0
  289. meltygui/pbr.py +1576 -0
  290. meltygui/png_unfilter.c +49 -0
  291. meltygui/resources/JetBrainsMono-Regular.ttf +0 -0
  292. meltygui/resources/THIRD_PARTY_NOTICES.md +21 -0
  293. meltygui/resources/dejavu/DejaVuSans-Bold.ttf +0 -0
  294. meltygui/resources/dejavu/DejaVuSans-ExtraLight.ttf +0 -0
  295. meltygui/resources/dejavu/DejaVuSans.ttf +0 -0
  296. meltygui/resources/dejavu/LICENSE.txt +78 -0
  297. meltygui/resources/fontawesome-LICENSE.txt +121 -0
  298. meltygui/resources/fontawesome-webfont.ttf +0 -0
  299. meltygui/resources/hdri/studio_small_09_1k.hdr +0 -0
  300. meltygui/resources/jetbrains-weights/JetBrainsMono-Bold.ttf +0 -0
  301. meltygui/resources/jetbrains-weights/JetBrainsMono-ExtraBold.ttf +0 -0
  302. meltygui/resources/jetbrains-weights/JetBrainsMono-ExtraLight.ttf +0 -0
  303. meltygui/resources/jetbrains-weights/JetBrainsMono-Light.ttf +0 -0
  304. meltygui/resources/jetbrains-weights/JetBrainsMono-Medium.ttf +0 -0
  305. meltygui/resources/jetbrains-weights/JetBrainsMono-SemiBold.ttf +0 -0
  306. meltygui/resources/jetbrains-weights/JetBrainsMono-Thin.ttf +0 -0
  307. meltygui/resources/jetbrains-weights/OFL.txt +93 -0
  308. meltygui/resources/jetbrains-weights/README.md +2 -0
  309. meltygui/state/__init__.py +0 -0
  310. meltygui/state/account_state.py +22 -0
  311. meltygui/state/animation_state.py +97 -0
  312. meltygui/state/annotation_state.py +22 -0
  313. meltygui/state/chat_state.py +36 -0
  314. meltygui/state/code_state.py +10 -0
  315. meltygui/state/core_enums.py +59 -0
  316. meltygui/state/core_markers.py +115 -0
  317. meltygui/state/core_undo.py +1075 -0
  318. meltygui/state/file_state.py +75 -0
  319. meltygui/state/graph_state.py +26 -0
  320. meltygui/state/inspection_state.py +47 -0
  321. meltygui/state/menu_state.py +10 -0
  322. meltygui/state/model_enums.py +11 -0
  323. meltygui/state/new_core_model.py +2394 -0
  324. meltygui/state/orchestration_state.py +14 -0
  325. meltygui/state/query_state.py +24 -0
  326. meltygui/state/tensor_state.py +10 -0
  327. meltygui/state/terminal_state.py +23 -0
  328. meltygui/state/trace_state.py +32 -0
  329. meltygui/state/voxel_state.py +12 -0
  330. meltygui/text_index.py +816 -0
  331. meltygui/utils/__init__.py +0 -0
  332. meltygui/utils/jump_to_code.py +344 -0
  333. meltygui/utils/pkl_inspect.py +90 -0
  334. meltygui/utils/render_utils.py +1419 -0
  335. meltygui/view/__init__.py +1 -0
  336. meltygui/view/account_view.py +524 -0
  337. meltygui/view/action_view.py +73 -0
  338. meltygui/view/chat_decoration_view.py +112 -0
  339. meltygui/view/chat_view.py +1703 -0
  340. meltygui/view/code_view.py +2677 -0
  341. meltygui/view/collection_view.py +1185 -0
  342. meltygui/view/color_view.py +824 -0
  343. meltygui/view/control_view.py +559 -0
  344. meltygui/view/decoration_view.py +439 -0
  345. meltygui/view/diagnostic_view.py +177 -0
  346. meltygui/view/dropdown_view.py +1082 -0
  347. meltygui/view/file_view.py +1599 -0
  348. meltygui/view/graph_cuda_view.py +105 -0
  349. meltygui/view/graph_view.py +882 -0
  350. meltygui/view/header_view.py +848 -0
  351. meltygui/view/input_view.py +238 -0
  352. meltygui/view/inspection_view.py +1783 -0
  353. meltygui/view/layout_view.py +596 -0
  354. meltygui/view/lut_view.py +45 -0
  355. meltygui/view/menu_view.py +212 -0
  356. meltygui/view/orchestration_view.py +658 -0
  357. meltygui/view/query_view.py +118 -0
  358. meltygui/view/search_view.py +342 -0
  359. meltygui/view/tab_view.py +258 -0
  360. meltygui/view/tensor_view.py +430 -0
  361. meltygui/view/terminal_view.py +355 -0
  362. meltygui/view/text_view.py +8031 -0
  363. meltygui/view/texture_view.py +480 -0
  364. meltygui/view/tile_view.py +38 -0
  365. meltygui/view/trace_view.py +923 -0
  366. meltygui/view/voxel_cuda_view.py +824 -0
  367. meltygui/view/voxel_view.py +1860 -0
  368. meltygui/view/window_view.py +111 -0
  369. meltygui-0.1.0.dist-info/METADATA +143 -0
  370. meltygui-0.1.0.dist-info/RECORD +372 -0
  371. meltygui-0.1.0.dist-info/WHEEL +4 -0
  372. 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