commit f74937bb6a08504238a04426267d0817ae037ae3 Author: Slendi Date: Sun Jun 29 15:57:38 2025 +0300 Initial commit Signed-off-by: Slendi diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..7899a42 --- /dev/null +++ b/.clang-format @@ -0,0 +1,26 @@ +UseTab: ForIndentation +TabWidth: 4 +IndentWidth: 4 +ColumnLimit: 80 + +AlignEscapedNewlines: DontAlign +AlignTrailingComments: + Kind: Always + OverEmptyLines: 0 +BasedOnStyle: WebKit +BraceWrapping: + AfterFunction: true +BreakBeforeBraces: Custom +BreakBeforeInheritanceComma: true +BreakConstructorInitializers: BeforeComma +IndentPPDirectives: AfterHash +IndentRequiresClause: false +InsertNewlineAtEOF: true +LineEnding: LF +NamespaceIndentation: None +PointerAlignment: Right # east pointer +QualifierAlignment: Right # east const +RemoveSemicolon: true +RequiresClausePosition: WithFollowing +RequiresExpressionIndentation: OuterScope +SpaceAfterTemplateKeyword: false diff --git a/.clangd b/.clangd new file mode 100644 index 0000000..e69de29 diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..e3fecb3 --- /dev/null +++ b/.envrc @@ -0,0 +1,2 @@ +use flake + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c22852f --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.cache +[Bb]uild* +/target +.direnv +log diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..b38b56e --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "wlroots-lunar"] + path = wlroots-lunar + url = git@github.com:slendidev/wlroots-lunar diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..5af4a2f --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,127 @@ +cmake_minimum_required(VERSION 3.31) + +project(LunarWM LANGUAGES C) + +set(CMAKE_C_STANDARD 23) +set(CMAKE_C_STANDARD_REQUIRED 23) +set(CMAKE_CXX_STANDARD 23) + +add_compile_options( + -fstack-protector-strong + -fwrapv +) +add_compile_definitions( + WLR_USE_UNSTABLE + XR_USE_PLATFORM_EGL + XR_USE_GRAPHICS_API_OPENGL_ES +) + +find_package(PkgConfig REQUIRED) + +pkg_check_modules(WAYLAND REQUIRED IMPORTED_TARGET GLOBAL wayland-server) +pkg_check_modules(EGL REQUIRED IMPORTED_TARGET egl) +pkg_check_modules(GLES2 REQUIRED IMPORTED_TARGET glesv2) +pkg_check_modules(WLROOTS REQUIRED IMPORTED_TARGET wlroots-0.20) +pkg_check_modules(XKBCOMMON REQUIRED IMPORTED_TARGET xkbcommon) +pkg_check_modules(OPENXR REQUIRED IMPORTED_TARGET openxr) +pkg_check_modules(LUA REQUIRED IMPORTED_TARGET lua) +pkg_check_modules(PIXMAN REQUIRED IMPORTED_TARGET pixman-1) + +find_program(WAYLAND_SCANNER_EXECUTABLE wayland-scanner REQUIRED) +message(STATUS "Found wayland-scanner at ${WAYLAND_SCANNER_EXECUTABLE}") +pkg_get_variable(WAYLAND_PROTOCOLS_DIR wayland-protocols pkgdatadir) +message(STATUS "Found wayland-protocols at ${WAYLAND_PROTOCOLS_DIR}") +pkg_get_variable(WAYLAND_SCANNER_PKGDATA_DIR wayland-scanner pkgdatadir) +message( + STATUS "Found wayland-scanner pkgdatadir at ${WAYLAND_SCANNER_PKGDATA_DIR}") + +include(FetchContent) + +FetchContent_Declare( + raylib + GIT_REPOSITORY https://github.com/slendidev/raylib.git + GIT_TAG "lunar" + GIT_SHALLOW 1 +) +set(OPENGL_VERSION "ES 3.0") +set(PLATFORM DRM) +set(BUILD_EXAMPLES OFF) +FetchContent_MakeAvailable(raylib) + +add_executable(${PROJECT_NAME}) +target_sources(${PROJECT_NAME} PUBLIC + src/vec.c + + src/RayExt.c + src/Config.c + src/LunarWM_core.c + src/LunarWM_wayland.c + src/LunarWM_xr.c + src/LunarWM_render.c + src/main.c +) +target_link_libraries(${PROJECT_NAME} PUBLIC + PkgConfig::XKBCOMMON + PkgConfig::WAYLAND + PkgConfig::EGL + PkgConfig::GLES2 + PkgConfig::WLROOTS + PkgConfig::OPENXR + PkgConfig::LUA + PkgConfig::PIXMAN + + raylib +) + +# Wayland protocol codegen +set(XDG_SHELL_XML + ${WAYLAND_PROTOCOLS_DIR}/stable/xdg-shell/xdg-shell.xml +) + +set(XDG_SHELL_HEADER + ${CMAKE_BINARY_DIR}/xdg-shell-protocol.h +) + +set(XDG_SHELL_C + ${CMAKE_BINARY_DIR}/xdg-shell-protocol.c +) + +add_custom_command( + OUTPUT ${XDG_SHELL_HEADER} + COMMAND ${WAYLAND_SCANNER_EXECUTABLE} server-header + ${XDG_SHELL_XML} ${XDG_SHELL_HEADER} + DEPENDS ${XDG_SHELL_XML} + COMMENT "Generating xdg-shell-protocol.h (server header)" + VERBATIM +) + +add_custom_command( + OUTPUT ${XDG_SHELL_C} + COMMAND ${WAYLAND_SCANNER_EXECUTABLE} private-code + ${XDG_SHELL_XML} ${XDG_SHELL_C} + DEPENDS ${XDG_SHELL_XML} + COMMENT "Generating xdg-shell-protocol.c" + VERBATIM +) + +add_custom_target(xdg_shell_protocol + DEPENDS ${XDG_SHELL_HEADER} ${XDG_SHELL_C} +) + +add_library(xdg_shell STATIC + ${XDG_SHELL_C} +) + +add_dependencies(xdg_shell xdg_shell_protocol) + +target_include_directories(xdg_shell PUBLIC + ${CMAKE_BINARY_DIR} +) + +add_dependencies(${PROJECT_NAME} xdg_shell_protocol) + +target_link_libraries(${PROJECT_NAME} PRIVATE xdg_shell) + +target_include_directories(${PROJECT_NAME} PRIVATE + ${CMAKE_BINARY_DIR} +) diff --git a/assets/hand_l.gltf b/assets/hand_l.gltf new file mode 100644 index 0000000..65da8e5 --- /dev/null +++ b/assets/hand_l.gltf @@ -0,0 +1,722 @@ +{ + "asset" : { + "copyright" : "CC0 Public Domain", + "generator" : "Khronos glTF Blender I/O v3.2.43", + "version" : "2.0" + }, + "scene" : 0, + "scenes" : [ + { + "name" : "Scene", + "nodes" : [ + 27 + ] + } + ], + "nodes" : [ + { + "name" : "Thumb_Tip_L", + "rotation" : [ + -0.07576872408390045, + -0.019257033243775368, + -0.03371242433786392, + 0.9963693618774414 + ], + "scale" : [ + 1.0000001192092896, + 1.000000238418579, + 1.0000001192092896 + ], + "translation" : [ + -2.7939677238464355e-09, + 0.030749469995498657, + -3.14321368932724e-09 + ] + }, + { + "children" : [ + 0 + ], + "name" : "Thumb_Distal_L", + "rotation" : [ + 0.05564067140221596, + 0.010326135903596878, + 0.013984743505716324, + 0.9982995390892029 + ], + "scale" : [ + 0.9999999403953552, + 0.9999999403953552, + 1.0000001192092896 + ], + "translation" : [ + -2.3283064365386963e-09, + 0.04214789345860481, + 1.5133991837501526e-09 + ] + }, + { + "children" : [ + 1 + ], + "name" : "Thumb_Proximal_L", + "rotation" : [ + -0.04595031589269638, + -0.027135659009218216, + -0.07525718957185745, + 0.9957352876663208 + ], + "scale" : [ + 1, + 1.0000001192092896, + 1 + ], + "translation" : [ + 2.3283064365386963e-10, + 0.044916488230228424, + -2.473825588822365e-10 + ] + }, + { + "children" : [ + 2 + ], + "name" : "Thumb_Metacarpal_L", + "rotation" : [ + 0.3235369920730591, + -2.565749491623137e-05, + -0.027220426127314568, + 0.9458239078521729 + ], + "scale" : [ + 1, + 0.9999998211860657, + 0.9999998807907104 + ], + "translation" : [ + 0.009999999776482582, + 0.02717285417020321, + 0.019999971613287926 + ] + }, + { + "name" : "Index_Tip_L", + "rotation" : [ + -0.052288394421339035, + -0.0005572127993218601, + 0.10362062603235245, + 0.9932413697242737 + ], + "scale" : [ + 0.9999999403953552, + 0.9999999403953552, + 1 + ], + "translation" : [ + 8.149072527885437e-09, + 0.027394980192184448, + 1.367880031466484e-09 + ] + }, + { + "children" : [ + 4 + ], + "name" : "Index_Distal_L", + "rotation" : [ + 0.014225997030735016, + -0.011990753002464771, + -0.13454149663448334, + 0.9907333254814148 + ], + "scale" : [ + 1, + 1.0000001192092896, + 1 + ], + "translation" : [ + 5.529727786779404e-09, + 0.0313456691801548, + 1.775333657860756e-09 + ] + }, + { + "children" : [ + 5 + ], + "name" : "Index_Intermediate_L", + "rotation" : [ + -0.013683199882507324, + -0.024668212980031967, + -0.23507100343704224, + 0.9715688824653625 + ], + "scale" : [ + 1, + 0.9999999403953552, + 1 + ], + "translation" : [ + 0, + 0.03811633586883545, + -3.3178366720676422e-09 + ] + }, + { + "children" : [ + 6 + ], + "name" : "Index_Proximal_L", + "rotation" : [ + 0.11122288554906845, + -0.0027781203389167786, + 0.11757423728704453, + 0.9868121147155762 + ], + "scale" : [ + 1, + 1.0000001192092896, + 1 + ], + "translation" : [ + 5.336175945558352e-10, + 0.08036758005619049, + 2.584926050985814e-09 + ] + }, + { + "children" : [ + 7 + ], + "name" : "Index_Metacarpal_L", + "rotation" : [ + -0.0005887771840207279, + 2.10358793992782e-05, + 0.0252196304500103, + 0.9996817708015442 + ], + "scale" : [ + 0.9999999403953552, + 0.9999999403953552, + 0.9999999403953552 + ], + "translation" : [ + -0.009999999776482582, + 0.0271772351115942, + 0.022405147552490234 + ] + }, + { + "name" : "Middle_Tip_L", + "rotation" : [ + 0.013688242062926292, + 7.99239132902585e-05, + 0.1684110462665558, + 0.9856218695640564 + ], + "scale" : [ + 1.0000001192092896, + 0.9999999403953552, + 1 + ], + "translation" : [ + -2.0736479200422764e-09, + 0.023346584290266037, + 6.548361852765083e-11 + ] + }, + { + "children" : [ + 9 + ], + "name" : "Middle_Distal_L", + "rotation" : [ + -0.013931511901319027, + -0.00014242221368476748, + -0.16861224174499512, + 0.985584020614624 + ], + "scale" : [ + 1, + 1.0000001192092896, + 0.9999999403953552 + ], + "translation" : [ + 5.973561201244593e-09, + 0.0324166864156723, + -5.820766091346741e-11 + ] + }, + { + "children" : [ + 10 + ], + "name" : "Middle_Intermediate_L", + "rotation" : [ + 0.03945539891719818, + 0.004928736016154289, + -0.13782717287540436, + 0.9896578788757324 + ], + "translation" : [ + 1.1295924196019769e-09, + 0.04500335454940796, + 6.621121428906918e-10 + ] + }, + { + "children" : [ + 11 + ], + "name" : "Middle_Proximal_L", + "rotation" : [ + -0.01194659061729908, + 0.000966736872214824, + -0.010500849224627018, + 0.9998730421066284 + ], + "translation" : [ + -7.057678885757923e-10, + 0.0804632380604744, + 3.4924596548080444e-10 + ] + }, + { + "children" : [ + 12 + ], + "name" : "Middle_Metacarpal_L", + "rotation" : [ + -0.03585463762283325, + 4.2005005525425076e-05, + 0.0499776192009449, + 0.9981066584587097 + ], + "scale" : [ + 1, + 0.9999999403953552, + 1 + ], + "translation" : [ + -0.009999999776482582, + 0.02714575082063675, + 0.0035275884438306093 + ] + }, + { + "name" : "Ring_Tip_L", + "rotation" : [ + 0.03305169194936752, + -0.006719753611832857, + 0.12635111808776855, + 0.9914120435714722 + ], + "scale" : [ + 1, + 1, + 0.9999998211860657 + ], + "translation" : [ + 5.326000973582268e-09, + 0.027049388736486435, + 3.969034878537059e-09 + ] + }, + { + "children" : [ + 14 + ], + "name" : "Ring_Distal_L", + "rotation" : [ + -0.011351789347827435, + 0.012621401809155941, + -0.13198409974575043, + 0.9911065101623535 + ], + "scale" : [ + 0.9999999403953552, + 1, + 1 + ], + "translation" : [ + -2.3865140974521637e-09, + 0.027797557413578033, + 9.604264050722122e-10 + ] + }, + { + "children" : [ + 15 + ], + "name" : "Ring_Intermediate_L", + "rotation" : [ + 0.01732625439763069, + 0.01860846020281315, + -0.16082890331745148, + 0.9866547584533691 + ], + "scale" : [ + 1.0000001192092896, + 0.9999999403953552, + 1 + ], + "translation" : [ + 8.731149137020111e-11, + 0.04013120010495186, + 9.604264050722122e-10 + ] + }, + { + "children" : [ + 16 + ], + "name" : "Ring_Proximal_L", + "rotation" : [ + -0.05105672776699066, + -0.002022986998781562, + 0.0418044812977314, + 0.9978184103965759 + ], + "scale" : [ + 0.9999999403953552, + 0.9999999403953552, + 0.9999999403953552 + ], + "translation" : [ + 6.075424607843161e-10, + 0.0739438384771347, + 1.331500243395567e-09 + ] + }, + { + "children" : [ + 17 + ], + "name" : "Ring_Metacarpal_L", + "rotation" : [ + -0.07119493186473846, + 1.573348527017515e-05, + 0.018085604533553123, + 0.9972984790802002 + ], + "scale" : [ + 1, + 0.9999999403953552, + 0.9999999403953552 + ], + "translation" : [ + -0.009999999776482582, + 0.027118019759655, + -0.01309998705983162 + ] + }, + { + "name" : "Little_Tip_L", + "rotation" : [ + 0.015836291015148163, + -0.01933973841369152, + 0.15377695858478546, + 0.9877893924713135 + ], + "scale" : [ + 1, + 1.0000001192092896, + 1 + ], + "translation" : [ + -3.725290298461914e-09, + 0.019765090197324753, + 4.6566128730773926e-09 + ] + }, + { + "children" : [ + 19 + ], + "name" : "Little_Distal_L", + "rotation" : [ + -0.018054774031043053, + 0.011455277912318707, + -0.10707500576972961, + 0.9940209984779358 + ], + "scale" : [ + 0.9999999403953552, + 0.9999998807907104, + 1 + ], + "translation" : [ + 2.6775524020195007e-09, + 0.01802438497543335, + 7.894414011389017e-10 + ] + }, + { + "children" : [ + 20 + ], + "name" : "Little_Intermediate_L", + "rotation" : [ + 0.044925764203071594, + 0.03280799090862274, + -0.18505947291851044, + 0.9811516404151917 + ], + "scale" : [ + 0.9999999403953552, + 0.9999998807907104, + 1.0000001192092896 + ], + "translation" : [ + -4.0745362639427185e-10, + 0.03312354534864426, + 2.6921043172478676e-10 + ] + }, + { + "children" : [ + 21 + ], + "name" : "Little_Proximal_L", + "rotation" : [ + -0.08928601443767548, + 0.003168066032230854, + -0.006739117205142975, + 0.9959782958030701 + ], + "scale" : [ + 1, + 0.9999999403953552, + 1 + ], + "translation" : [ + 3.4924596548080444e-10, + 0.06571118533611298, + -2.2009771782904863e-10 + ] + }, + { + "children" : [ + 22 + ], + "name" : "Little_Metacarpal_L", + "rotation" : [ + -0.09176954627037048, + 2.456200854794588e-05, + 0.02844771184027195, + 0.9953738451004028 + ], + "scale" : [ + 1, + 0.9999999403953552, + 1 + ], + "translation" : [ + -4.4605644178297155e-10, + 0.02708965167403221, + -0.029999956488609314 + ] + }, + { + "name" : "Palm_L", + "rotation" : [ + 0.7065238952636719, + -6.479929197666934e-06, + -8.686721230333205e-06, + 0.7076891660690308 + ], + "translation" : [ + 0.030781937763094902, + 0.06705548614263535, + -0.04206528514623642 + ] + }, + { + "children" : [ + 3, + 8, + 13, + 18, + 23, + 24 + ], + "name" : "Wrist_L", + "rotation" : [ + -0.7065169215202332, + 6.472751010733191e-06, + 6.472751465480542e-06, + 0.7076961994171143 + ], + "scale" : [ + 1, + 0.9999999403953552, + 1 + ], + "translation" : [ + 3.8642522071086205e-08, + -1.8697472114581615e-05, + 0.027175573632121086 + ] + }, + { + "mesh" : 0, + "name" : "mesh_Hand_L", + "skin" : 0 + }, + { + "children" : [ + 26, + 25 + ], + "name" : "Armature" + } + ], + "meshes" : [ + { + "name" : "mesh_Hand_L", + "primitives" : [ + { + "attributes" : { + "POSITION" : 0, + "NORMAL" : 1, + "TEXCOORD_0" : 2, + "JOINTS_0" : 3, + "WEIGHTS_0" : 4 + }, + "indices" : 5 + } + ] + } + ], + "skins" : [ + { + "inverseBindMatrices" : 6, + "joints" : [ + 25, + 3, + 2, + 1, + 0, + 8, + 7, + 6, + 5, + 4, + 13, + 12, + 11, + 10, + 9, + 18, + 17, + 16, + 15, + 14, + 23, + 22, + 21, + 20, + 19, + 24 + ], + "name" : "Armature" + } + ], + "accessors" : [ + { + "bufferView" : 0, + "componentType" : 5126, + "count" : 1764, + "max" : [ + 0.03656641021370888, + 0.09001174569129944, + 0.02576880156993866 + ], + "min" : [ + -0.03117927722632885, + -0.06858222931623459, + -0.18575307726860046 + ], + "type" : "VEC3" + }, + { + "bufferView" : 1, + "componentType" : 5126, + "count" : 1764, + "type" : "VEC3" + }, + { + "bufferView" : 2, + "componentType" : 5126, + "count" : 1764, + "type" : "VEC2" + }, + { + "bufferView" : 3, + "componentType" : 5121, + "count" : 1764, + "type" : "VEC4" + }, + { + "bufferView" : 4, + "componentType" : 5126, + "count" : 1764, + "type" : "VEC4" + }, + { + "bufferView" : 5, + "componentType" : 5123, + "count" : 9156, + "type" : "SCALAR" + }, + { + "bufferView" : 6, + "componentType" : 5126, + "count" : 26, + "type" : "MAT4" + } + ], + "bufferViews" : [ + { + "buffer" : 0, + "byteLength" : 21168, + "byteOffset" : 0 + }, + { + "buffer" : 0, + "byteLength" : 21168, + "byteOffset" : 21168 + }, + { + "buffer" : 0, + "byteLength" : 14112, + "byteOffset" : 42336 + }, + { + "buffer" : 0, + "byteLength" : 7056, + "byteOffset" : 56448 + }, + { + "buffer" : 0, + "byteLength" : 28224, + "byteOffset" : 63504 + }, + { + "buffer" : 0, + "byteLength" : 18312, + "byteOffset" : 91728 + }, + { + "buffer" : 0, + "byteLength" : 1664, + "byteOffset" : 110040 + } + ], + "buffers" : [ + { + "byteLength" : 111704, + "uri" : "data:application/octet-stream;base64,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CAcAAAgHAAAIBwAACAcAAAgHAAAIBwAACAcAAAgHAAAGBwAABgcAAAYHAAAGBwAABgcAAAYHAAAGBwAABgcAAAYHAAAGBwAABwYAAAcGAAAHBgAABwYAAAcGAAAHBgAABwYAAAcGAAAHBgAABwYAAAcGAAAHCAAACAcAAAcIAAAHCAAACAcAAAgHAAAIBwAACAcAAAcIAAAIBwAABwYIAAcGCAAHBggABwYAAAcGCAAHBgAABwYAAAcGAAAHBgAABwYAAAcGAAAHAAAABwYAAAcGAAAGBwAABgcAAAYHAAAGBwAABgcAAAcGAAAHBgAABwYAAAcGAAAHBgAABgcAAAYHAAAGBwAABgcAAAYHAAAHCAAABwgAAAcIAAAHCAAABwgAAAcIAAAHCAAABwgAAAcIAAAHCAAABwgAAAcIAAAHCAAABwgAAAcIAAAHCAAABwgAAAcIAAAHCAAABwgAAAgAAAAIBwAACAcAAAgHAAAIBwAACAcAAAgHAAAIBwAACAcAAAgHAAAHCAYABwYAAAYFAAAGBwAACAAAAAgAAAAIAAAACAcAAAYHAAAHBgAABwYIAAgHAAAGBwAABwYAAAcIAAAHCAAACAAAAAcIAAAHCAAABwYAAAYHAAAIAAAABgcAAAgAAAAIAAAACAAAAAYHCwAIBwAABwYAAAgHAAAHBggABgsFAAcGAAAHCAYACAAAAAgAAAAIBwAACAcAAAgHAAAIBwAACAcAAAgHAAAIBwAACAcAAAgHAAAIBwAACAcAAAgHAAAMDQAADA0AAAwAAAAMDQAADAsAAAwLAAAMCwAADAsAAAsGDAALDBAACwAAAAsGAAALEAAACxAAAAsGAAALAAAADAsAAAwLAAAMDQAADA0AAAsQAAALEAAACwwQAAsMEAAMCwAADAsAAAwNAAAMDQAACwYFAAsGBQALBgwACwYMAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAAMAAAADAsAAAsAAAALAAAADQAAAAwNAAAMCwAACxAGCgsMBhANDAAADQAAAA0AAAANDAAADQAAAA0AAAANAAAADQAAAA0MAAANAAAADQAAAA0MAAANDAAADQwAAA0MAAANDAAADQwAAA0MAAANDAAADQwAAAsMAAALAAAACwwAAAsMAAALDAAACwwGAAsMBgALDAYACwwAAAsMAAAMCwAADAsAAAwLAAAMCwAADAsAAAwLAAAMAAAADAsAAAwLAAAMCwAADAsAAA0MAAANDAAADQwAAA0MAAANDAAADQwAAA0MAAANDAAADQwAAA0MAAAMCw0ADAsNAAwLDQAMAAAADAsNAAwAAAAMCwAADAsAAAwLAAAMCwAADAAAAAwAAAAMCw0ADAsNAAsMAAALDAAACwwAAAsMAAALDAAADAsAAAwLAAAMCwAADAsAAAwLAAALDAAACwwAAAsMAAALDAAACwwAAAwNAAAMDQAADA0AAAwNAAAMDQAADQwAAAwNAAAMDQAADA0AAAwNAAAMDQAADQwAAA0MAAANDAAADA0AAA0MAAANDAAADA0AAA0MAAANDAAADQAAAA0MAAANDAAADQwAAA0AAAANAAAADQAAAA0MAAANDAAADQwAAAwNAAAMCwAACwYFCgsMBgANAAAADQAAAA0AAAANDAAACwwGAAwLAAAMCw0ADQwAAAsMAAAMCwAADA0AAA0MAAANAAAADQwAAAwNAAAMCwAACwwAAA0AAAALDAAADQAAAA0AAAANAAAACwwQAA0MAAAMCwAADQAAAAwLDQALEAoADAsAAAwNAAANAAAADQAAAA0MAAANDAAADQwAAA0MAAANDAAADQwAAA0MAAANDAAADQwAAA0MAAANDAAADQwAABESAAAREgAAEQAAABESAAAQEQAAEBEAABEQAAAREAAAEAsRABAVEQAQAAAAEAsAABAVAAAQFQAAEAsAABALAAAREAAAERAAABESEAAREhAAEBUAABAVAAAQERUAEBEVABEQAAAREAAAERIAABESAAAQCwAAEAsAABALEQAQCxEAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABEAAAAQEQAAEAsAABAAAAASAAAAERIQABARAAAQCxUPEBELFRIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEhEAABIRAAASEQAAEgAAABIAAAASAAAAEgAAABIRAAASEQAAEBEAABARAAAQEQAAEBEAABARAAAQEQsAEBELABARCwAQEQAAEBELABEQAAAREAAAERAAABEQAAAREAAAERAAABEQAAAREAAAERAAABEQAAAREAAAEhEAABIRAAASEQAAEhEAABIRAAASEQAAEhEAABIRAAASEQAAEhEAABEQEgAREBIAERASABEQAAAREAAAERAAABEQAAAREAAAERAAABEQAAAREAAAEQAAABEQEgAREBIAEBEAABARAAAQEQAAEBEAABARAAAREAAAERAAABEQAAAREAAAERAAABARAAAQEQAAEBEAABARAAAQEQAAERIAABIRAAASEQAAEhEAABESAAAREgAAEhEAABESAAASEQAAEhEAABIRAAASEQAAEhEAABIRAAASEQAAEhEAABIRAAASEQAAEhEAABIRAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAERIQABARAAAQCw8AEAsRABIAAAASAAAAEgAAABIAAAAQEQsAERAAABEQEgASEQAAEBEAABEQAAAREgAAEhEAABIAAAASEQAAEhEAABEQAAAQEQAAEgAAABARFQASAAAAEgAAABIAAAAQERUAEhEAABEQAAASAAAAERASABAVDxQQEQAAERIQABIAAAASAAAAEhEAABIRAAASEQAAEhEAABIRAAASEQAAEhEAABIRAAASEQAAEhEAABIRAAASEQAAFhcVABYXFQAWFwAAFgAAABUWAAAVFgAAFRYAABUWAAAVEBYAFRYAABUAAAAVEBQPFRQAABUUAAAVEAAAFRAAABUWAAAVFgAAFhcVABYXFQAVFAAAFRYAABUWAAAWFxUAFRAAABUQAAAVEBYAFRAWABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAWAAAAFRYAABUQFAAVAAAAFwAAABYXFQAVFgAAFRAUABUWAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXFgAAFxYAABcWAAAXFgAAFxYAABcWAAAXFgAAFxYAABcWAAAVFgAAFRYAABUAAAAVFgAAFRAWABUQFgAVEBYAFQAAABUWAAAVFgAAFhUAABYVAAAWFQAAFhUXABYVAAAWFRcAFhUXABYVFwAWFwAAFxYAABcWAAAWFwAAFxYAABcWAAAXFgAAFhcAABcWAAAWFRcAFhUXABYVFwAWFQAAFhUXABYVAAAWFQAAFhUAABYVAAAWFRcAFhUAABYVAAAWFRcAFRYAABUWAAAVFgAAFRYAABUWAAAWFRcAFhUAABYVAAAWFQAAFRYAABUWAAAVFgAAFRYAABUWAAAWFwAAFhcAABYXAAAWFwAAFhcVABYXAAAWFwAAFhcAABYXAAAWFwAAFhcAABcWAAAWFwAAFxYAABYXAAAWFwAAFhcAABYXAAAXAAAAFwAAABcAAAAXFgAAFwAAABcAAAAXFgAAFxYAABcWAAAWFxUAFRYAABUQFA8VEBYAFwAAABcAAAAXFgAAFRYQABYVFwAWFRcAFxYAABUWAAAWFRcAFhcVABcWAAAXAAAAFxYAABYXFQAWFRcAFRYAABcAAAAVFgAAFwAAABcAAAAVFgAAFxYAABYVFwAXFgAAFhUXABUUAAAVFgAAFhcVABcAAAAXAAAAFxYAABcWAAAXFgAAFxYAABcWAAAXFgAAFxYAABcWAAAXFgAAFxYAABcWAAACAwAAAgMAAAIDAAACAwAAAgMAAAIDAAACAwAAAgMAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAgMAAAMAAAACAwAAAwIAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAgAAAwAAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAgMAAAIDAAACAwAAAgMAAAIDAAACAwAAAgMAAAIDAAACAwAAAgMAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAwAAAAMAAAADAAAAAwIAAAMAAAADAAAAAwIAAAMCAAADAgAAAwIAAAIDAAADAAAAAwAAAAMAAAADAAAAAwIAAAIDAAADAgAAAwIAAAMCAAADAAAAAwIAAAMCAAADAAAAAwAAAAMAAAADAAAAAwIAAAMCAAACAwAAAgMAAAMAAAADAAAAAwAAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAcIBgAHCAAABwYAAAcGAAAGCwAABgUAAAYHAAAGAAAACAAAAAgAAAAIBwAACAcAAAYHAAAGBwAABwYAAAcGAAAIBwAABwgAAAgHAAAHBgAABwYAAAgHAAAHBgAABwYAAAYHAAAGBwAABwgAAAcIAAAHCAAABwgAAAgHAAAIBwAACAAAAAgHAAAIBwAADA0AAAwNAAAMCwAADAsAAAsQAAALBgAACwYMAAsAAAANAAAADQAAAA0AAAANDAAACwwAAAsMAAAMCwAADAsAAA0MAAANDAAADQwAAAwAAAAMCw0ADQwAAAwLAAAMCwAACwwAAAsMAAAMDQAADA0AAA0MAAAMDQAADQwAAA0MAAANAAAADQwAAA0MAAAREgAAERIAABEQAAAREAAAEBUPABALAAAQCxEAEAAAABIAAAASAAAAEgAAABIAAAAQEQsAEBEAABEQAAAREAAAEhEAABIRAAASEQAAERAAABEQAAASAAAAERAAABEQAAAQEQAAEBEAABESAAAREgAAEhEAABIRAAASAAAAEgAAABIAAAASEQAAEhEAABYXAAAWFxUAFRYAABUWAAAVFAAAFRAPABUQAAAVAAAAFwAAABcAAAAXAAAAFwAAABUQFgAVFgAAFhUAABYVAAAXFgAAFxYAABcWAAAWFQAAFhUAABcWAAAWFQAAFRYAABUWAAAVFgAAFhcAABYXAAAWFwAAFhcAABcAAAAXFgAAFwAAABcWAAAXFgAABwgGAAcGAAAGBQAABgcAAAgAAAAIAAAABwgGAAcGAAAGCwUABgsHAAgAAAAIBwAABgcAAAcGAAAHBggACAcAAAYHAAAHBgAABwgAAAcIAAAIAAAACAcAAAcIAAAHBgAABgcAAAcIAAAGBwAACAAAAAgAAAAIAAAACAcAAAgHAAAHBgAABwYAAAgAAAAIBwAACAcAAAwNAAAMCwAACwYFAAsGDAANAAAADQAAAAwNAAAMCwAACxAAAAsMEAANAAAADQwAAAsMBgAMCwAADAsNAA0MAAALDAAADAsAAAwNAAANDAAADQAAAA0AAAANDAAADAsAAAsMAAAMDQAACwwAAA0AAAANAAAADQAAAA0MAAANDAAADAsNAAwLAAANAAAADQwAAA0MAAAREhAAEBEAABALAAAQCxEAEgAAABIAAAAREhAAERAAABAVDwAQERUAEgAAABIRAAAQEQsAERAAABEQEgASEQAAEBEAABEQAAASEQAAEhEAABIAAAASAAAAEhEAABEQAAAQEQAAEhEAABARFQASAAAAEgAAABIAAAASEQAAEgAAABEQAAAREAAAEgAAABIRAAASEQAAFhcVABUWAAAVEAAAFRAWABcAAAAWFxUAFRYAABUUAAAVFgAAFwAAABcWAAAVFhAAFhUXABYVFwAXFgAAFRYAABYVAAAWFxUAFxYAABcAAAAXAAAAFxYAABYVFwAVFgAAFhcVABUWAAAXAAAAFwAAABcWAAAXFgAAFhUXABYVFwAXAAAAFxYAABcWAAAGBQAABgsFAAYFAAAGBQAABgUAAAYFCwAGBQsABgUAAAYFCwALBgoACxAKAAsKAAALChAFCwYFCgsQCg8QCw8AEA8VABAPCwAQFQ8LEAsPChAVDxQVEBQPFRQAABUUAAAVFAAAFRQQDxUUEAAVEBQPFRQQAAYFAAAVFAAABgUAABUUAAAGBQAABgULAAYFAAAGBQsABQYAAAYFAAAFBgsKCwoGAAsKEAALChAGCgsFDwULCgYKDwsQEA8LChAPFQAQDwsKDxAUFQ8QCgsUFQ8QFRQPEBUUDwAVFAAAFRQPEBUUAAAVFA8QBgUAABQVAAAUFQ8QBQYAAAYFCwoFBgAABQYAAAUGCgsKCxAFCgULDwUKCwYKDwULDwoQFBQAAAABAgUAAQIAABALDwoGCwUKCg8FAAUGAAAFBgIBFA8VAAUCAQYFCgEGCgUPCwUKDwEKDwUUDxQKEA8KFAUUDxUADxQVEBQVAAAUFQAAFBUAABQPFQABAgAAAQIAAAECBQAQCw8KBQoBABQVAAAKBQ8LBQoGAA8UAAABAgUAAQIAAAECAAABAgAAAQUCAAUBAgoFCgYAFA8VABQAAAAUFQAAFA8AAAECBQAFAgEADxAVFAoPAAAKBQsADwoUAAEFAgABBQIAFA8AABQPAAAPFBAVCwoQDwUKAAAPChAADwoQCw8QChQPFAoACg8FAAoFDwAPFAoADwoUAAUBCgAUDwAAFAAAABQAAAAUAA8AFAAPABQPAAABAgUACxAKAAoPBQAPChQAFAAAABQAAAAUAAAACgULBgoLDxAPFBAVDwoUAAoFDwAKDwUABQoGCwoLBQ8FBgoADxQKAAUKAAALBgoFEBUPFAYHBQAGAAAABgAAAAYLAAAGCwAABgsAAAYHBQAGBwUABgAAAAYHBQAGBwUABgsFAAYHAAAGCwAABgcFAAYLAAALEAYACwAAAAsGDAALBgwACxAAAAsQAAALEAAACwYAAAsQAAALBhAFFQAAABUAAAALEAAACwYMABALEQAQFREAEBUAABAVAAAQCxEAEAsRABALEQAQCwAAEAsRABAVEQAQCwAAEBUAABUQAAAVEAAAEAAAABALERUQAAAAEBUAABUWAAAVEBYAFRYQABUQAAAVAAAAFRAAAAsQAAALAAAACwYAAAsGAAAVFgAAFRAWABUQFgAVFgAAFRAWAAoFDwAKBQ8ABQEKAAUBCgAKBQ8BCgUPAQ8UCgAPFAoADwoUAA8KFAAFCgAABQEAAAEFAAAFAQoADwoUAAoPBQAKDwUACgUPAA8UCgAUDwAACwYKBQYLBQAPEAoLFRAPFBQPFRAUFQ8ADxQKAAIAAAACAwAAAgMAAAIDAAACAwAAAgMAAAIDAAACAwAAAgMAAAIDAAACAwAAAgMAAAIAAAACAwAAAgMAAAIDAAACAwAAAgMFAAIDAAACAwAAAgUBAAIFAQACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgUBAAIBAAACAQAAAgUBAAIFAQACAAAAAgUBAAIBAAACAQAAAgEAAAIBAAACAQAAAgUBAAIBBQACAQAAAgUBAAIFAQACAAAAAgUBAAIBBQACAQAAAgEAAAIBAAACAQAAAgUBAAIBBQACAQUAAgUBAAIFAQACAQAAAgUBAAIBBQACAQAAAgEAAAIBAAACAQAABQIBAAIBBQACAQUABQIBBgUCAQYCAQAAAgUBAAEAAAABAAAAAQAAAAEFAAIFAQoPAQAFDwUKAQ8AAQ8FCg8FAQEAFAAAAQ8UDwoUBQABFAAPFAABDxQKAAAUAQAUDwABFA8AABQAAQAUFQ8ADxQKAA8KFAAUAAAAFA8AAAoFDwAKDwUADwoUAAAUAQ8UDwAACg8FAAUKAQAUDwAAAQIFAAUKAAAUAAAAFBUPAAUBAAABAAAAFAABAAAUAQAUAAAAFAAAAAABFAABAAUAAQAUBQUBAAABBQAAFA8AAAsFBgoQDxUUEA8LCgYFCwALCgUQCgsQDxUUEA8VFAAABgUAAAYFAAAFBgsKEBUPFAUCAQYFAgEGBQIGAQUGAgEFBgIBBQIBBgUBAgAFBgIABQECAAEFAAAUAAEPFAAPARQADwEAFAEPABQBDwABFAAAARQP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KgACAHAAKgBwAHEAGwBzAG8AGwBvAAEAVwRTBGIAVwRiAJUAzQDOAF0AzQBdAGMAxgNtAFUAxgNVAM4DWQBoAGoAWQBqAG4AUQRSBGcAUQRnAFgAAwAqAHEAAwBxAGkAGQCCAH4AGQB+AAYAUARUBHQAUAR0AEwATwB3AH8ATwB/AEgAwQC0AHkAwQB5ADAAEQB7AHwAEQB8AAcAxQPRA34AxQN+AEcABwB2AHUABwB1ABEAtwC1AHgAtwB4AFAARQRVBHoARQR6ABAAxwNsAH0AxwN9AM8DbABXAFEAbABRAH0AWwBTAFUAWwBVAG0A1AONAIMA1AODANID1QOOAIQA1QOEANMDkQCUAIoAkQCKAIcAkACGAIQAkACEAI4AjQCRAIcAjQCHAIMAEwCMAIkAEwCJAAAAwgCzAIgAwgCIAC8ARARWBIsARASLABIAjACWAJMAjACTAIkAswCyAJIAswCSAIgAVgRXBJUAVgSVAIsAygNcAI0AygONANQDyQNeAI4AyQOOANUDZABfAJQAZACUAJEAYQCQAI4AYQCOAF4AXABkAJEAXACRAI0AQgBEAJ0AQgCdAJwAuAA8AJcAuACXALYAOgA0AKAAOgCgAJkAZgAvAKEAZgChAKsAeAAwAKIAeACiAK0AgAUyAKQAgAWkAIEFPACnALEAPACxAJcAIAA8ALgAIAC4ALkAlwCxAKgAlwCoAD0AMgBQAKkAMgCpAKQAyADPAKwAyACsAGUAeQBWAKoAeQCqAK4AkgBlAKwAkgCsALAAVgBmAKsAVgCrAKoAUAB4AK0AUACtAKkAMAB5AK4AMACuAKIALwCIAK8ALwCvAKEAiACSALAAiACwAK8AXgRcBLUAXgS1ALcAhgVNBLsAhgW7AIIFTQReBLcATQS3ALsAWgRiBLwAWgS8ALIAIwA5AE4EIwBOBEgESwRbBLQASwS0AMEASgRdBLMASgSzAMIAWAS2AL4AWAS+AGMEZARKBMIAZATCAL8AXARLBMEAXATBALUAZQRkBL8AZQS/AL0AYQS4ALYAYQS2AFgEXQRaBLIAXQSyALMAaATQALwAaAS8AGIEWwRlBL0AWwS9ALQAZgTEACQAZgQkAEkELgDAA9gDLgDYAyIAZgQhALoAZgS6AGAEKQA0ADoAKQA6ACQAJgDEAGYEJgBmBGAE2APBAycA2AMnACIAxAAmACgAxAAoAMMAJADEAMMAJADDACkAyQNfAMoAyQPKANkDZABcAMkAZADJAMsAvgA9AMgAvgDIANAAYQBeAMcAYQDHAMYATwQ/AMwATwTMAGcEygNdAM4AygPOANoDXwBkAMsAXwDLAMoAQABFAM4AQADOAM0APQCoAM8APQDPAMgAYwS+ANAAYwTQAGgE8gNOAdUA8gPVAN4D8QMmAdcA8QPXAN0DIgElAdYAIgHWAPwAiAWuBd0AiAXdAP0AjgWvBdwAjgXcAOADjQWtBd4AjQXeAN8D9QNUAdQA9QPUANsD9gNVAdIA9gPSANwDWAFbAdMAWAHTAPsAdwRpBOMAdwTjADgBSAH8ANYASAHWAFABeQRqBOEAeQThAEUBlAVsBO8AlAXvAIkFHAHoANoAHAHaABgBVwHsANIAVwHSAFUBjAXlAN4AjAXeAK0FJAHqANcAJAHXACYBOQHkANEAOQHRADsBigXwANkAigXZALAFHwHZAPAAHwHwAB4B8wPeA9UA8wPVAFEB9APdA9cA9APXAE8B8AMUAWsB8ANrAfkDDwEXAXABDwFwAW8BcwQKAWkBcwRpAX4E6wMWAXEB6wNxAfoDFAEPAW8BFAFvAWsB/wDzAAwB/wAMAQQB+gDjA+YD+gDmAwUB9gCEBIYE9gCGBAgB5AP5AAYB5AMGAeUD8wD4AAcB8wAHAQwB+ADkA+UD+ADlAwcB5gPjA/8A5gP/AAQBZQLKAQcEZQIHBB4ETgEiAfwATgH8ANUArwWIBf0ArwX9ANwAVAFYAfsAVAH7ANQAkAGTAQABkAEAATcBUQHVAPwAUQH8AEgBhgGSAQEBhgEBAUkBjwWMAQMBjwUDAYcFhwFoAQ4BhwEOAY8BagFxARYBagEWAREB+QNrAQcB+QMHAeUDfgRpARABfgQQAXQEawFvAQwBawEMAQcBbQFuAQYBbQEGAQkBbwFwAQQBbwEEAQwB+gNxAQUB+gMFAeYD/AObARQB/AMUAfADnAGaARcBnAEXAQ8BoQGZATYBoQE2AY0B/gAgARkB/gAZAdsAbAR1BB0BbAQdAe8AUwEcARgBUwEYAU8BRwEfAR4BRwEeAUYB4QPnAxoB4QMaAeAA4gPoAxgB4gMYAdoA4AAaASAB4AAgAf4AjAGIASEBjAEhAQMBQgFBATwBQgE8ASgBlwGYARUBlwEVARMB7gNAAT4B7gM+AekDjASdATMBjAQzAXgEZwE0AS4BZwEuAWQBegR2BCkBegQpAUsBhQGOAScBhQEnAUoB3APSAEAB3ANAAe4DOgFCASgBOgEoAT0B7wM6AT0B7wM9AeoDGgFRAUgBGgFIASABRAEsAT4BRAE+AUABjgGQATcBjgE3AScBTAEqAT8BTAE/AU0B/QOfARYB/QMWAesD5wPzA1EB5wNRARoBmwGcAQ8BmwEPARQBKAE8ASUBKAElASIBgwGNATYBgwE2AWMB2wPUADoB2wM6Ae8D+wDTAEEB+wBBAUIB7ABEAUAB7ABAAdIAfAR4BDMBfAQzAWYBngGfAS4BngEuATQB6QM+ASYB6QMmAfEDKgE5ATsBKgE7AT8BdgR3BDgBdgQ4ASkB1AD7AEIB1ABCAToB6gBTAU8B6gBPAdcAdQR5BEUBdQRFAR0BIAFIAVABIAFQARkBkgGFAUoBkgFKAQEB4gBMAU0B4gBNAdgA6AP0A08B6ANPARgB2ABHAUYB2ABGAeIAiAGGAUkBiAFJASEBagR6BEsBagRLAeEA6gM9AU4B6gNOAfIDPQEoASIBPQEiAU4BLAEkASYBLAEmAT4B9wNeAVQB9wNUAfUD+ANfAVUB+ANVAfYDYgFlAVsBYgFbAVgBYQFXAVUBYQFVAV8BXgFiAVgBXgFYAVQB5ABdAVoB5ABaAdEAkwGEAVkBkwFZAQABaQR7BFwBaQRcAeMAXQFnAWQBXQFkAVoBhAGDAWMBhAFjAVkBewR8BGYBewRmAVwB7QMtAV4B7QNeAfcD7AMvAV8B7ANfAfgDNQEwAWUBNQFlAWIBMgFhAV8BMgFfAS8BLQE1AWIBLQFiAV4BEwEVAW4BEwFuAW0BiQENAWgBiQFoAYcBCwEFAXEBCwFxAWoBNwEAAXIBNwFyAXwBSQEBAXMBSQFzAX4BhwUDAXUBhwV1AZAFDQF4AYIBDQGCAWgBDQGJAYoBDQGKAfEAaAGCAXkBaAF5AQ4BAwEhAXoBAwF6AXUBmQGgAX0BmQF9ATYBSgEnAXsBSgF7AX8BYwE2AX0BYwF9AYEBJwE3AXwBJwF8AXsBIQFJAX4BIQF+AXoBAQFKAX8BAQF/AXMBAAFZAYABAAGAAXIBWQFjAYEBWQGBAYABgwSBBIYBgwSGAYgBkwVyBIwBkwWMAY8FcgSDBIgBcgSIAYwBfwSHBI0BfwSNAYMB9AAKAXME9ABzBG0EcASABIUBcASFAZIBbwSCBIQBbwSEAZMBfQSHAY8BfQSPAYgEiQRvBJMBiQSTAZABgQRwBJIBgQSSAYYBigSJBJABigSQAY4BhgSJAYcBhgSHAX0EggR/BIMBggSDAYQBjQShAY0BjQSNAYcEgASKBI4BgASOAYUBiwSVAfUAiwT1AG4E/wDjA/sD/wD7A/MAiwTyAIsBiwSLAYUE+gAFAQsB+gALAfUA9wCVAYsE9wCLBIUE+wPkA/gA+wP4APMAlQH3APkAlQH5AJQB9QCVAZQB9QCUAfoA7AMwAZsB7AObAfwDNQEtAZoBNQGaAZwBjwEOAZkBjwGZAaEBMgEvAZgBMgGYAZcBdAQQAZ0BdASdAYwE7QMuAZ8B7QOfAf0DMAE1AZwBMAGcAZsBEQEWAZ8BEQGfAZ4BDgF5AaABDgGgAZkBiASPAaEBiAShAY0EFQQfAqYBFQSmAQEEFAT3AagBFASoAQAE8wH2AacB8wGnAc0BowWlBa4BowWuAc4BnwWcBa0BnwWtAQMEoAWmBa8BoAWvAQIEGAQlAqUBGASlAf4DGQQmAqMBGQSjAf8DKQIsAqQBKQKkAcwBnASOBLQBnAS0AQkCGQLNAacBGQKnASECngSPBLIBngSyARYClQWRBMABlQXAAZkF7QG4AasB7QGrAekBKAK9AaMBKAKjASYClwW2Aa8BlwWvAaYF9QG7AagB9QGoAfcBCgK1AaIBCgKiAQwCmgXBAaoBmgWqAZsF8AGqAcEB8AHBAe8BFgQBBKYBFgSmASICFwQABKgBFwSoASACEwTlATwCEwQ8AhwE4AHoAUEC4AFBAkACmATbAToCmAQ6AqMEDgTnAUICDgRCAh0E5QHgAUAC5QFAAjwCywHWAdwBywHcAcYB0AHEAd0B0AHdAdUBxwGpBKsExwGrBNkBBwTKAdcBBwTXAQgExAHJAdgBxAHYAd0ByQEHBAgEyQEIBNgBBgTQAdUBBgTVAQkEIgOUAioEIgMqBEEEHwLzAc0BHwLNAaYBnAWjBc4BnAXOAa0BJQIpAswBJQLMAaUBYQJkAtEBYQLRAQgCIgKmAc0BIgLNARkCVwJjAtIBVwLSARoCngVdAtQBngXUAaQFWAI5At8BWALfAWACOwJCAucBOwLnAeIBHAQ8AtgBHATYAQgEowQ6AuEBowThAZkEPAJAAt0BPALdAdgBPgI/AtcBPgLXAdoBQAJBAtUBQALVAd0BHQRCAtYBHQTWAQkEHwRsAuUBHwTlARMEbQJrAugBbQLoAeABcgJqAgcCcgIHAl4CzwHxAeoBzwHqAawBkQSaBO4BkQTuAcABJALtAekBJALpASACGALwAe8BGALvARcCBAQKBOsBBATrAbEBBQQLBOkBBQTpAasBsQHrAfEBsQHxAc8BXQJZAvIBXQLyAdQBEwISAg0CEwINAvkBaAJpAuYBaALmAeQBEQQRAg8CEQQPAgwEsQRuAgQCsQQEAp0EOAIFAv8BOAL/ATUCnwSbBPoBnwT6ARwCVgJfAvgBVgL4ARsC/wOjAREC/wMRAhEECwITAvkBCwL5AQ4CEgQLAg4CEgQOAg0E6wEiAhkC6wEZAvEBFQL9AQ8CFQIPAhECXwJhAggCXwIIAvgBHQL7ARACHQIQAh4CIARwAucBIATnAQ4ECgQWBCICCgQiAusBbAJtAuABbALgAeUB+QENAvYB+QH2AfMBVAJeAgcCVAIHAjQC/gOlAQsC/gMLAhIEzAGkARICzAESAhMCvQEVAhECvQERAqMBoQSdBAQCoQQEAjcCbwJwAv8BbwL/AQUCDAQPAvcBDAT3ARQE+wEKAgwC+wEMAhACmwScBAkCmwQJAvoBpQHMARMCpQETAgsCuwEkAiACuwEgAqgBmgSeBBYCmgQWAu4B8QEZAiEC8QEhAuoBYwJWAhsCYwIbAtIBswEdAh4CswEeAqkBCwQXBCACCwQgAukBqQEYAhcCqQEXArMBWQJXAhoCWQIaAvIBjwSfBBwCjwQcArIBDQQOAh8CDQQfAhUEDgL5AfMBDgLzAR8C/QH1AfcB/QH3AQ8CGgQvAiUCGgQlAhgEGwQwAiYCGwQmAhkEMwI2AiwCMwIsAikCMgIoAiYCMgImAjACLwIzAikCLwIpAiUCtQEuAisCtQErAqIBZAJVAioCZAIqAtEBjgSgBC0CjgQtArQBLgI4AjUCLgI1AisCVQJUAjQCVQI0AioCoAShBDcCoAQ3Ai0CEAT+AS8CEAQvAhoEDwQAAjACDwQwAhsEBgIBAjYCBgI2AjMCAwIyAjACAwIwAgAC/gEGAjMC/gEzAi8C5AHmAT8C5AE/Aj4CWgLeATkCWgI5AlgC3AHWAUIC3AFCAjsCCALRAUMCCAJDAk0CGgLSAUQCGgJEAk8CpAXUAUYCpAVGAp0F3gFJAlMC3gFTAjkCwgHeAVoCwgFaAlsCOQJTAkoCOQJKAt8B1AHyAUsC1AFLAkYCagJxAk4CagJOAgcCGwL4AUwCGwJMAlACNAIHAk4CNAJOAlIC+AEIAk0C+AFNAkwC8gEaAk8C8gFPAksC0gEbAlAC0gFQAkQC0QEqAlEC0QFRAkMCKgI0AlICKgJSAlECqASmBFcCqARXAlkClgWXBF0ClgVdAp4FlwSoBFkClwRZAl0CpASsBF4CpAReAlQCxQHbAZgExQGYBJIElQSlBFYClQRWAmMClASnBFUClARVAmQCogRYAmACogRgAq0ErgSUBGQCrgRkAmECpgSVBGMCpgRjAlcCrwSuBGECrwRhAl8CqwRaAlgCqwRYAqIEpwSkBFQCpwRUAlUCsgRyAl4CsgReAqwEpQSvBF8CpQRfAlYCwwGwBJMEwwGTBEgC0AEGBB4E0AEeBMQBkwSwBGYCkwRmAsYBywEGBAkEywEJBNYByAFmArAEyAGwBKoEHgQHBMkBHgTJAcQBZgLIAcoBZgLKAWUCxgFmAmUCxgFlAssBDwQBAmwCDwRsAh8EBgL+AWsCBgJrAm0CYALfAWoCYAJqAnICAwIAAmkCAwJpAmgCmQThAW4CmQRuArEEEAT/AXACEARwAiAEAQIGAm0CAQJtAmwC4gHnAXAC4gFwAm8C3wFKAnEC3wFxAmoCrQRgAnICrQRyArIEOATiAncCOAR3AiQENwS9AnkCNwR5AiMEugK8AngCugJ4ApcCqgWSBX8CqgV/ApgCrAWhBX4CrAV+AiYEqwWRBYACqwWAAiUEOwTnAnYCOwR2AiEEPAToAnQCPAR0AiIE6gLtAnUC6gJ1ApYCwASzBIYCwASGAs4C3AKXAngC3AJ4AuQCwgS0BIQCwgSEAtoCqAW2BI4CqAWOArMFtAKIAnwCtAJ8ArEC6QKKAnQC6QJ0AugCsQWHAoACsQWAApEFuwKJAnkCuwJ5Ar0CzQKFAnMCzQJzAtACsgWNAnsCsgV7AqIFtwJ7Ao0CtwKNArUCOQQkBHcCOQR3AuUCOgQjBHkCOgR5AuMCNgStAvwCNgT8Aj8EqQKwAgADqQIAA/8CvASlAvsCvAT7AscEMQSvAgEDMQQBA0AErQKpAv8CrQL/AvwCmgKQAqYCmgKmAp8ClQIpBCwElQIsBKACkgLNBM4EkgLOBKMCKgSUAqECKgShAisEkAKTAqICkAKiAqYCkwIqBCsEkwIrBKICKQSaAp8CKQSfAiwEqwNHA0kDqwNJA6oD4gK6ApcC4gKXAncCoQWqBZgCoQWYAn4C5wLqApYC5wKWAnYCHgMhA5sCHgObAswC5QJ3ApcC5QKXAtwCFQMgA5wCFQOcAt0CtAUaA54CtAWeAqkFFgP5AqgCFgOoAh0D+gIBA68C+gKvAqoCPwT8AqICPwSiAisExwT7AqsCxwSrAr0E/AL/AqYC/AKmAqIC/QL+AqEC/QKhAqMC/wIAA58C/wKfAqYCQAQBA6ACQASgAiwEQgQoA60CQgStAjYEKQMnA7ACKQOwAqkCLgMmA8sCLgPLAhsDmQK4ArICmQKyAn0CtgS+BLYCtgS2Ao4C5gK0ArEC5gKxAuMC2wK3ArUC2wK1AtkCJwQtBLMCJwSzAoICKAQuBLECKASxAnwCggKzArgCggK4ApkCGgMXA7kCGgO5Ap4C1wLWAtEC1wLRAr8CJAMlA64CJAOuAqwCNATVAtMCNATTAi8E1AQrA8kC1ATJAsEE9wLIAsQC9wLEAvUCwwS/BMECwwTBAuACFAMcA74CFAO+At4CIgR0AtUCIgTVAjQEzwLXAr8CzwK/AtICNQTPAtICNQTSAjAEswLlAtwCswLcArgC2ALCAtMC2ALTAtUCHAMeA8wCHAPMAr4C3wLAAtQC3wLUAuECQwQsA68CQwSvAjEELQQ5BOUCLQTlArMCKAMpA6kCKAOpAq0CvwLRArwCvwK8AroCEgMbA8sCEgPLAvQCIQR2As8CIQTPAjUElgJ1AtYClgLWAtcCigLYAtUCigLVAnQCxQTBBMkCxQTJAvgCKgMsA8QCKgPEAsgCLwTTAr0CLwS9AjcEwALNAtACwALQAtQCvwTABM4CvwTOAsECdgKWAtcCdgLXAs8CiQLmAuMCiQLjAnkCvgTCBNoCvgTaArYCuALcAuQCuALkArICIAMUA94CIAPeApwCgwLfAuECgwLhAnoCLgQ6BOMCLgTjArECegLbAtkCegLZAoMCFwMVA90CFwPdArkCtATDBOACtATgAoQCMATSAuICMATiAjgE0gK/AroC0gK6AuICwgK7Ar0CwgK9AtMCPQTwAucCPQTnAjsEPgTxAugCPgToAjwE8wL2Au0C8wLtAuoC8gLpAugC8gLoAvEC8ALzAuoC8ALqAucChQLuAuwChQLsAnMCIQMTA+sCIQPrApsCswTEBO8CswTvAoYC7gL3AvUC7gL1AuwCEwMSA/QCEwP0AusCxATFBPgCxAT4Au8CMwTDAvACMwTwAj0EMgTFAvECMgTxAj4EygLGAvYCygL2AvMCxwLyAvECxwLxAsUCwwLKAvMCwwLzAvACrAKuAv4CrAL+Av0CGAOnAvkCGAP5AhYDpAKgAgEDpAIBA/oCzAKbAgIDzAICAwsD3QKcAgMD3QIDAw0DqQWeAgUDqQUFA7UFpwIHAxEDpwIRA/kCjwKnAhgDjwIYAxkD+QIRAwgD+QIIA6gCngK5AgkDngIJAwUDJgMtAwwDJgMMA8sC3gK+AgoD3gIKAw4D9ALLAgwD9AIMAxADvgLMAgsDvgILAwoDuQLdAg0DuQINAwkDnALeAg4DnAIOAwMDmwLrAg8DmwIPAwID6wL0AhAD6wIQAw8DzATKBBUDzAQVAxcDpwW7BBoDpwUaA7QFuwTMBBcDuwQXAxoDyATPBBsDyAQbAxIDkQKlArwEkQK8BLcEuQTJBBQDuQQUAyADuATLBBMDuAQTAyEDxgQWAx0DxgQdA9AE0QS4BCED0QQhAx4DygS5BCADygQgAxUD0gTRBB4D0gQeAxwDzgQYAxYDzgQWA8YEywTIBBIDywQSAxMD1QQuAxsD1QQbA88EyQTSBBwDyQQcAxQDtwTTBCMDtwQjA5ECmgIpBEEEmgJBBJACzQTTBI8CzQSPAhkDlQKgAqQClQKkApECkgIjA9MEkgLTBM0EQQQqBJMCQQSTApACIwOSApQCIwOUAiIDkQIjAyIDkQIiA5UCMgTGAigDMgQoA0IEygLDAicDygInAykDHQOoAiYDHQMmAy4DxwLFAiUDxwIlAyQDvQSrAisDvQQrA9QEMwTEAiwDMwQsA0MExgLKAikDxgIpAygDqgKvAiwDqgIsAyoDqAIIAy0DqAItAyYD0AQdAy4D0AQuA9UEfAN2AzIDfAMyAy8DfQN3AzADfQMwAzEDegN9AzEDegMxA0sDmgOUAzMDmgMzA20DeQM2AzADeQMwA3cDbgM0Ay8DbgMvA3ADXwNeA40DXwONA5ADWQNhA5IDWQOSA5EDmANUA4sDmAOLA54DYQNgA5MDYQOTA5IDXgNZA5EDXgORA40DTgNPAzcDTgM3AzgDRQNKAzcDRQM3AzoDUwNQAzsDUwM7Az0DlgNEAzkDlgM5A5UDUANRAz8DUAM/AzsDowNBAz4DowM+A6kDVgNOAzgDVgM4A0ADUQNWA0ADUQNAAz8DPwNAA0MDPwNDA0gDQAM4A0wDQANMA0MDdgN6A0sDdgNLAzIDpwOoA00DpwNNA2wDqQM+A1cDqQNXA6IDOwM/A0gDOwNIA0kDlQM5A1QDlQNUA5gDPQM7A0kDPQNJA0cDOgM3A08DOgNPA1UDOAM3A0oDOANKA0wDoQOKA1gDoQNYA6YDjAOTA2ADjANgA1sDkAONA1EDkANRA1ADngOLA1oDngNaA5kDjQORA1YDjQNWA1EDjwOQA1ADjwNQA1MDkQOSA04DkQNOA1YDkgOTA08DkgNPA04DrgOxA14DrgNeA18DsgOwA2EDsgNhA1kDtwOvA2sDtwNrA6UDrQOuA18DrQNfA10DtgOzA2gDtgNoA5sDiQNpA2MDiQNjA4YDMQMwA3EDMQNxA3IDsAO1A2ADsANgA2EDsQOyA1kDsQNZA14DnwOlA2sDnwNrA4UDLwMyA28DLwNvA3ADSwMxA3IDSwNyA3MDNgN1A3EDNgNxAzADnQObA2gDnQNoA4gDtAO1A2MDtANjA2kDMgNLA3MDMgNzA28DhgOAA3YDhgN2A3wDhwOBA3cDhwN3A30DhAOHA30DhAN9A3oDgwN5A3cDgwN3A4EDgAOEA3oDgAN6A3YDNAN/A3wDNAN8Ay8DqAOgA3sDqAN7A00DlAOcA34DlAN+AzMDfwOJA4YDfwOGA3wDoAOfA4UDoAOFA3sDnAOdA4gDnAOIA34DYwNiA4ADYwOAA4YDZQNkA4EDZQOBA4cDagNlA4cDagOHA4QDZwODA4EDZwOBA2QDYgNqA4QDYgOEA4ADXQNfA5ADXQOQA48DogNXA4oDogOKA6EDVQNPA5MDVQOTA4wDbANNA5QDbAOUA5oDVwOYA54DVwOeA4oDQQOWA5UDQQOVAz4DPgOVA5gDPgOYA1cDigOeA5kDigOZA1gDrwO2A5sDrwObA2sDhQNrA5sDhQObA50DTQN7A5wDTQOcA5QDewOFA50DewOdA5wDggNmA6UDggOlA58DPAOpA6IDPAOiA1IDNQN4A6ADNQOgA6gDjgOhA6YDjgOmA1wDdAM1A6gDdAOoA6cDUgOiA6EDUgOhA44DRgOjA6kDRgOpAzwDeAOCA58DeAOfA6ADrAO3A6UDrAOlA2YDRQOrA6oDRQOqA0oDTANKA6oDTAOqA0MDqwNCA6QDqwOkA0cDqwNFA5cDqwOXA0IDqgNJA0gDqgNIA0MDZANlA7EDZAOxA64DagNiA7ADagOwA7IDpgNYA68DpgOvA7cDZwNkA64DZwOuA60DmQNaA7MDmQOzA7YDYgNjA7UDYgO1A7ADZQNqA7IDZQOyA7EDWwNgA7UDWwO1A7QDWAOZA7YDWAO2A68DXAOmA7cDXAO3A6wDfADPA7sDfAC7AwcAVADOA7oDVAC6AwUAdwWDBb0DdwW9Aw4AeQWEBbwDeQW8AwwAiQDSA7gDiQC4AwAAigDTA7kDigC5AwIAdgAHALsDdgC7A9ADfwAFALoDfwC6A9EDRADNA9YDRADWA50ARgDIA9cDRgDXA58AXwS5ALgAXwS4AGEEKAAmADgAKAA4ADUAnQDWA8IDnQDCAzUAnwDXA8MDnwDDAzMAxwDZA80DxwDNA0QACABOAMQDCADEA74DCgBIAMUDCgDFA78DcADLA8YDcADGA2sAAgC5A8sDAgDLA3AAagDMA8cDagDHA24AyQDaA8gDyQDIA0YATgB2ANADTgDQA8QDAAC4A8wDAADMA2oAawDGA84DawDOA1QASAB/ANEDSADRA8UDbgDHA88DbgDPA3wAkwDUA9IDkwDSA4kAlADVA9MDlADTA4oAXQDKA9QDXQDUA5MAXwDJA9UDXwDVA5QA2APAAykA2AMpAMMAXgDJA9kDXgDZA8cAXADKA9oDXADaA8kATQHyA94DTQHeA9gAJQHxA90DJQHdA9YAsAWOBeADsAXgA98ArgWNBd8DrgXfA90AWgH1A9sDWgHbA9EAWwH2A9wDWwHcA9MARwHYAN4DRwHeA/MDUAHWAN0DUAHdA/QDFQHwA/kDFQH5A24BFwHrA/oDFwH6A3ABhASKAYkBhASJAYYE+QD3AAkB+QAJAQYBbgH5A+UDbgHlAwYBcAH6A+YDcAHmAwQBmAH8A/ADmAHwAxUB2QAfAecD2QDnA+ED2wAZAegD2wDoA+IDQQHuA+kDQQHpAzwB0wDcA+4D0wDuA0EBOwHvA+oDOwHqAz8BmgH9A+sDmgHrAxcBHwFHAfMDHwHzA+cD0QDbA+8D0QDvAzsBPAHpA/EDPAHxAyUBGQFQAfQDGQH0A+gDPwHqA/IDPwHyA00BZAH3A/UDZAH1A1oBZQH4A/YDZQH2A1sBLgHtA/cDLgH3A2QBMAHsA/gDMAH4A2UB+wPjA/oA+wP6AJQBLwHsA/wDLwH8A5gBLQHtA/0DLQH9A5oBHgIVBAEEHgIBBKkB9gEUBAAE9gEABKcBmwWfBQMEmwUDBLABpQWgBQIEpQUCBK4BKwIYBP4DKwL+A6IBLAIZBP8DLAL/A6QBGAKpAQEEGAIBBBYEIQKnAQAEIQIABBcE5gETBBwE5gEcBD8C6AEOBB0E6AEdBEECqQRbAloCqQRaAqsEygHIAdoBygHaAdcBPwIcBAgEPwIIBNcBQQIdBAkEQQIJBNUBaQIfBBMEaQITBOYBqgHwAQoEqgEKBAQErAHqAQsErAELBAUEEgIRBAwEEgIMBA0CpAH/AxEEpAERBBICDAISBA0EDAINBBACawIgBA4EawIOBOgB8AEYAhYE8AEWBAoEogH+AxIEogESBAwCDQIMBBQEDQIUBPYB6gEhAhcE6gEXBAsEEAINBBUEEAIVBB4CNQIaBBgENQIYBCsCNgIbBBkENgIZBCwC/wEQBBoE/wEaBDUCAQIPBBsEAQIbBDYCHgQGBMsBHgTLAWUCAAIPBB8EAAIfBGkC/gEQBCAE/gEgBGsC4QI4BCQE4QIkBHoCvAI3BCMEvAIjBHgCogWsBSYEogUmBIECkgWrBSUEkgUlBH8C7AI7BCEE7AIhBHMC7QI8BCIE7QIiBHUC2wJ6AiQE2wIkBDkE5AJ4AiME5AIjBDoErgI2BD8ErgI/BP4CsAIxBEAEsAJABAADzQQZAxgDzQQYA84EoQKUApICoQKSAqMC/gI/BCsE/gIrBKECAANABCwEAAMsBJ8CJQNCBDYEJQM2BK4CewK3Ai0EewItBCcEfQKyAi4EfQIuBCgE1gI0BC8E1gIvBNECdQIiBDQEdQI0BNYC0AI1BDAE0AIwBNQCJwNDBDEEJwMxBLACtwLbAjkEtwI5BC0EcwIhBDUEcwI1BNAC0QIvBDcE0QI3BLwCsgLkAjoEsgI6BC4E1AIwBDgE1AI4BOEC9QI9BDsE9QI7BOwC9gI+BDwE9gI8BO0CxAIzBD0ExAI9BPUCxgIyBD4ExgI+BPYCQQQpBJUCQQSVAiIDxQIyBEIExQJCBCUDwwIzBEMEwwJDBCcDqwChAEQEqwBEBFIErQCiAEUErQBFBFQEgQWkAEcEgQVHBIUFpwBOBFkEpwBZBLEApQCnADwApQA8ACAAsQBZBE8EsQBPBKgApACpAFAEpABQBEcEzwBnBFMEzwBTBKwArgCqAFEErgBRBFUEsACsAFMEsABTBFcEqgCrAFIEqgBSBFEEqQCtAFQEqQBUBFAEogCuAFUEogBVBEUEoQCvAFYEoQBWBEQErwCwAFcErwBXBFYESgCBAFwESgBcBF4EewUWAE0EewVNBIYFFgBKAF4EFgBeBE0EjwBgAGIEjwBiBFoETgSnAKUATgSlAEgEGABSAFsEGABbBEsEGgCFAF0EGgBdBEoEmwBYBGMEmwBjBEEAcgAaAEoEcgBKBGQEgQAYAEsEgQBLBFwEWgByAGQEWgBkBGUENwBhBFgENwBYBJsAhQCPAFoEhQBaBF0ExQBoBGIExQBiBGAAUgBaAGUEUgBlBFsEIQBmBEkEIQBJBKYAqABPBGcEqABnBM8AQQBjBGgEQQBoBMUAfAFyAWkEfAFpBHcEfgFzAWoEfgFqBHkEkAV1AWwEkAVsBJQFeAFzBH4EeAF+BIIBdgF4AQ0BdgENAfEAggF+BHQEggF0BHkBdQF6AXUEdQF1BGwEoAGMBHgEoAF4BH0BfwF7AXYEfwF2BHoEgQF9AXgEgQF4BHwEewF8AXcEewF3BHYEegF+AXkEegF5BHUEcwF/AXoEcwF6BGoEcgGAAXsEcgF7BGkEgAGBAXwEgAF8BHsEGwFSAYEEGwGBBIMEiwXnAHIEiwVyBJMF5wAbAYME5wCDBHIEYAExAYcEYAGHBH8EcwR4AXYBcwR2AW0E6QAjAYAE6QCABHAE6wBWAYIE6wCCBG8EbAF9BIgEbAGIBBIBQwHrAG8EQwFvBIkEUgHpAHAEUgFwBIEEKwFDAYkEKwGJBIoECAGGBH0ECAF9BGwBVgFgAX8EVgF/BIIElgGNBIcElgGHBDEBIwErAYoEIwGKBIAE8gCLBG4E8gBuBHcBeQF0BIwEeQGMBKABEgGIBI0EEgGNBJYBTQJDAo4ETQKOBJwETwJEAo8ETwKPBJ4EnQVGApEEnQWRBJUFSQKYBKMESQKjBFMCRwJJAt4BRwLeAcIBUwKjBJkEUwKZBEoCRgJLApoERgKaBJEEcQKxBJ0EcQKdBE4CUAJMApsEUAKbBJ8EUgJOAp0EUgKdBKEETAJNApwETAKcBJsESwJPAp4ESwKeBJoERAJQAp8ERAKfBI8EQwJRAqAEQwKgBI4EUQJSAqEEUQKhBKAE7AEjAqYE7AGmBKgEmAW5AZcEmAWXBJYFuQHsAagEuQGoBJcEMQICAqwEMQKsBKQEkgSYBEkCkgRJAkcCugH0AaUEugGlBJUEvAEnAqcEvAGnBJQEPQKiBK0EPQKtBOMBFAK8AZQEFAKUBK4EIwK6AZUEIwKVBKYE/AEUAq4E/AGuBK8E2QGrBKIE2QGiBD0CJwIxAqQEJwKkBKcEZwKyBKwEZwKsBAIC9AH8Aa8E9AGvBKUEsATDAVwCsARcAqoESgKZBLEESgKxBHEC4wGtBLIE4wGyBGcCCwMCA7MECwOzBMAEDQMDA7QEDQO0BMIEtQUFA7YEtQW2BKgFBwO8BMcEBwPHBBEDBgMHA6cCBgOnAo8CEQPHBL0EEQO9BAgDBQMJA74EBQO+BLYELQPUBMEELQPBBAwDDgMKA78EDgO/BMMEEAMMA8EEEAPBBMUECgMLA8AECgPABL8ECQMNA8IECQPCBL4EAwMOA8MEAwPDBLQEAgMPA8QEAgPEBLMEDwMQA8UEDwPFBMQEtALmAsoEtALKBMwEsQWIArsEsQW7BKcFiAK0AswEiALMBLsE8gLHAs8E8gLPBMgEtwS8BAcDtwQHAwYDiQK7AskEiQLJBLkEigLpAssEigLLBLgE/QLGBNAE/QLQBKwC2AKKArgE2AK4BNEE5gKJArkE5gK5BMoEwgLYAtEEwgLRBNIEowLOBMYEowLGBP0C6QLyAsgE6QLIBMsEJAPVBM8EJAPPBMcCuwLCAtIEuwLSBMkEjwLTBLcEjwK3BAYDCAO9BNQECAPUBC0DrALQBNUErALVBCQDzgGuAeYEzgHmBOcEkQECAeIEkQHiBOQE7wTrBH4C7wR+ApgC9gTuBIcC9gSHAroEvQMLANYEvQPWBPME9QTdBKMA9QSjAEYEmAJ/AuwEmALsBO8E9ATsBH8C9AR/AiUEHwOdAvAEHwPwBPIEugQfA/IEugTyBPYEYgLTAegEYgLoBOoE8wTYBA4A8wQOAL0D4wTiBAIB4wQCAXQB4QTfBNwA4QTcAP0A3QTcBDEA3QQxAKMA8QTwBJ0C8QSdAgQDRgQcANkERgTZBPUE6QToBNMB6QTTAUUC/QDdAOAE/QDgBOEE2wTWBAsA2wQLACwA2ATaBB0A2AQdAA4A7gTtBIAC7gSAAocCJQSAAu0EJQTtBPQEwAAxANwEwADcBN4E5wTlBK0B5wStAc4BLAAMANcELADXBNsESwZKBugESwboBOkETgZNBgEFTgYBBQMFTwZQBvAETwbwBPEEDAUOBTEFDAUxBUUFSQZNBuIESQbiBOMEVAZKBgcFVAYHBQkFUwZMBvsEUwb7BP0EFwUaBQIFFwUCBf0ECQUSBSwGCQUsBg8FAgR2BeYEAgTmBK4BFwX9BPsEFwX7BBYFFwUWBSQFFwUkBScFAwUBBRkFAwUZBRsFIwUTBfkEIwX5BBAFGgUZBQEFGgUBBQIFNgUDBK0BNgWtAeUELQUSBVEFLQVRBSsFKQUoBRkFKQUZBRoFEgUJBQcFEgUHBVEFGwUZBSgFGwUoBSoFRgVDBS4FRgUuBTIFcQVrBUoFcQVKBTkFMgUvBUQFMgVEBUYFawVVBVQFawVUBUoFTAVUBVUFTAVVBVYFcAZvBmIFcAZiBTAGOwVMBVYFOwVWBWwFMAZiBV0FMAZdBTgGOQVLBWoFOQVqBXEFMQY6BnQFMQZ0BW4FMgY2BlgFMgZYBWUFMwYuBmYFMwZmBW0FOgY3BjcFOgY3BXQFagVwBSEFagUhBXUF3wNkBeAE3wPgBN0ANgYuBlsFNgZbBVgFLQYzBm0FLQZtBXMFMgYxBm4FMgZuBSIFUgUgBVUFUgVVBWsFcAVyBRQFcAUUBSEFzwUyBS4FzwUuBc4FSwU6BXAFSwVwBWoFLgVsBUkFLgVJBc4FLQAKAHkFLQB5BX8FvgMPAHgFvgN4BYMFvwMJAHoFvwN6BYQFRgSFBX0FRgR9BRwAFwB8BXoFFwB6BQkAHQB+BXcFHQB3BQ4ADwAtAH8FDwB/BXgFwACCBYAFwACABTEAMQCABYEFMQCBBaMATASGBYIFTASCBcAACAC+A4MFCACDBXcFCgC/A4QFCgCEBXkFowCBBYUFowCFBUYEFAB7BYYFFACGBUwEcQSTBY8FcQSPBZEB4QPgAK8F4QOvBY4F4gPaAK0F4gOtBY0F6ACMBa0F6ACtBdoAuAGXBaYFuAGmBasBawSUBYkFawSJBe0AlgSWBZ4FlgSeBWIC0wGkBZ0F0wGdBUUCkQGPBYcFkQGHBQIBsQHPAaMFsQGjBZwFdAGQBZQFdAGUBWsE2wDiA40F2wCNBa4FBQSrAaYFBQSmBaAF2QDhA44F2QCOBbAFBASxAZwFBAScBZ8F5gCLBZMF5gCTBXEEAgGHBZAFAgGQBXQBnQKpBbUFnQK1BQQD4AD+AIgF4ACIBa8F7gCKBbAF7gCwBd8ARQKdBZUFRQKVBZAE/gDbAK4F/gCuBYgFtwGYBZYFtwGWBZYEHwO0BakFHwOpBZ0CkASVBZkFkASZBb4BmQJ9ApIFmQKSBaoFtQSoBbMFtQSzBYwCJwSCAqEFJwShBawFrAEFBKAFrAGgBaUFvwGaBZsFvwGbBbABzwGsAaUFzwGlBaMFqgEEBJ8FqgGfBZsFYgKeBaQFYgKkBdMBfQIoBKsFfQKrBZIFggKZAqoFggKqBaEFBAO1BagFBAOoBbUEugSnBbQFugS0BR8DewInBKwFewKsBaIFhwKxBacFhwKnBboEiwKyBaIFiwKiBYECKAR8ApEFKASRBasFiAKxBZEFiAKRBXwCbAVWBcwFbAXMBUkFcQVqBXUFcQV1BRgFEAUUBXIFEAVyBSMFGAVSBWsFGAVrBXEFBgXMBSAFBgUgBQQFAAUYBXUFAAV1Bf4EVgVVBSAFVgUgBcwFDQXvBOwEDQXsBAsFygXgA9wAygXcAN8EvAPLBdcEvAPXBAwA4AO8Aw0A4AMNAN8AvAPgA8oFvAPKBcsF7wQNBQoF7wQKBesEzgXNBesEzgXrBAoFAwTfA94AAwTeALABzAUGBQUFzAUFBUkF3wMDBDYF3wM2BWQFSQV2Bc0FSQXNBc4FzwUNBQsFzwULBREFMgXPBREFMgURBS8FzQUmBH4CzQV+AusEAgQmBM0FAgTNBXYFJgQCBK8BJgSvAYECDQXPBc4FDQXOBQoFHAUsBSsFHAUrBVEFfgaIBrgFfga4BX8GfQa6BYgGfQaIBn4GbgNwA9UFbgPVBdMF2gXWBXED2gVxA3UD2wXRBWwD2wVsA5oDpwNsA9EFpwPRBdwF1wXYBXMD1wVzA3ID1gXXBXID1gVyA3ED3AXZBXQD3AV0A6cD2AXUBW8D2AVvA3MDmgNtA9IFmgPSBdsF1AXVBXAD1AVwA28D5AXgBdQF5AXUBdgF4AXhBdUF4AXVBdQF2wXSBd4F2wXeBecF5gXiBdYF5gXWBdoF0wXVBeEF0wXhBd8F5wXdBdEF5wXRBdsF3AXRBd0F3AXdBegF6AXlBdkF6AXZBdwF4wXkBdgF4wXYBdcF4gXjBdcF4gXXBdYF7wXwBeQF7wXkBeMF7gXvBeMF7gXjBeIF8AXsBeAF8AXgBeQF7AXtBeEF7AXhBeAF5wXeBeoF5wXqBfMF8gXuBeIF8gXiBeYF3wXhBe0F3wXtBesF8wXpBd0F8wXdBecF6AXdBekF6AXpBfQF9AXxBeUF9AXlBegF/wX1BekF/wXpBfMF9AXpBfUF9AX1BQAGAAb9BfEFAAbxBfQF+wX8BfAF+wXwBe8F+gX7Be8F+gXvBe4F/AX4BewF/AXsBfAF+AX5Be0F+AXtBewF8wXqBfYF8wX2Bf8F/gX6Be4F/gXuBfIF6wXtBfkF6wX5BfcF/wX2BQIG/wUCBgsGCgYGBvoFCgb6Bf4F9wX5BQUG9wUFBgMGCwYBBvUFCwb1Bf8FAAb1BQEGAAYBBgwGDAYJBv0FDAb9BQAGBwYIBvwFBwb8BfsFBgYHBvsFBgb7BfoFCAYEBvgFCAb4BfwFBAYFBvkFBAb5BfgFFAYQBgQGFAYEBggGEAYRBgUGEAYFBgQGCwYCBg4GCwYOBhcGFgYSBgYGFgYGBgoGAwYFBhEGAwYRBg8GFwYNBgEGFwYBBgsGDAYBBg0GDAYNBhgGGAYVBgkGGAYJBgwGEwYUBggGEwYIBgcGEgYTBgcGEgYHBgYGHwURBhAGHwUQBh4FNAUPBhEGNAURBh8FQQVABRwGQQUcBh0GQAU+BRoGQAUaBhwGPwU9BRkGPwUZBhsGHQYcBh4GHQYeBh8GHwYeBiAGHwYgBiEGIQYgBiMGIQYjBiQGTQVdBj0GTQU9Bl4GJAYjBiYGJAYmBicGJwYmBikGJwYpBioGNQYpBmAGNQZgBmAFJQUqBikGJQUpBjUGFQDuAN8AFQDfAA0A5QC/AbAB5QCwAd4ATARrBO0ATATtABQAawRMBMAAawTAAHQBdAHAAN4EdAHeBOMEUwZJBuMEUwbjBN4EJAVaBkEFJAVBBScFGgUXBScFGgUnBSkFNQUXBg4GNQUOBjMFcQSQBL4BcQS+AeYAkARxBJEBkASRAUUCtgGLAoECtgGBAq8BlgS1BIwClgSMArcBtQSWBGICtQRiAgQDBANiAuoEBAPqBPEEVAZPBvEEVAbxBOoEHAUIBQMFHAUDBRsFLAUcBRsFLAUbBSoFUQUHBQgFUQUIBRwFSwZOBgMFSwYDBQgF5ATpBEUC5ARFApEBDwUsBjEFDwUxBQ4FLQY4Bl0FLQZdBVcFbAUuBUMFbAVDBTsFFAX6BPgEFAX4BCEFFAUQBfcEFAX3BPoEGAUABf8EGAX/BFIFLwURBQwFLwUMBUUFRwUNBhcGRwUXBjUFUAUwBjgGUAU4Bk8FWQVTBToGWQU6BjEGcwVPBTgGcwU4Bi0GVwVaBTMGVwUzBi0GUwVcBTcGUwU3BjoGIgVvBTYGIgU2BjIGWgVbBS4GWgUuBjMGZQVZBTEGZQUxBjIGbwVmBS4GbwUuBjYGMQUsBjwGMQU8BjAFJgZiBmAGJgZgBikGEgUtBTwGEgU8BiwGIwZlBmIGIwZiBiYGSAUYBg0GSAUNBkcFGAZIBVUGGAZVBhUGJgUSBhYGJgUWBlYGYwUTBhIGYwUSBiYFEwZjBTkGEwY5BhQGNwZcBT0GNwY9Bl0GLwY7BmcFLwZnBV4FOwYvBmkFOwZpBR0FRAUvBUUFRAVFBTgFPAVNBV4GPAVeBsIFfQbHBcYFfQbGBXwGfAbGBcUFfAbFBXsGewbFBcQFewbEBXoGegbEBcgFegbIBXkGeQbIBdAFeQbQBXgGeAbQBckFeAbJBXcGdwbJBUgGdwZIBnYGWQXHBcAFWQXABVMFZQXGBccFZQXHBVkFxgVlBVgFxgVYBcUFxQVYBVsFxQVbBcQFWgXIBcQFWgXEBVsFVwXQBcgFVwXIBVoF0AVXBV0F0AVdBckFdQamBp8GdQafBnYGcwaXBqYGcwamBnUGYgVIBskFYgXJBV0FBQXmBHYFBQV2BUkFCAUHBUoGCAVKBksG/AT7BEwG/ARMBvUEBgXnBOYEBgXmBAUF5wQGBQQF5wQEBeUE5ATiBE0G5ARNBk4GIAU2BeUEIAXlBAQFDwUOBVAGDwVQBk8G9QRMBtwE9QTcBN0ENgUgBVIFNgVSBWQF/wTgBGQF/wRkBVIFAAXhBOAEAAXgBP8E4QQABf4E4QT+BN8EAgUBBU0GAgVNBkkG6gToBEoG6gRKBlQG9gRQBg4F9gQOBe4EdQXKBd8EdQXfBP4E3gTcBEwG3gRMBlMGygV1BSEFygUhBcsF+ATXBMsF+ATLBSEF+gTbBNcE+gTXBPgE9gTyBPAE9gTwBFAG2wT6BPcE2wT3BNYEEAXzBNYEEAXWBPcE8wQQBfkE8wT5BNgEEwVuBlIGEwVSBvkE/ARRBm0G/ARtBhUF7gQOBQwF7gQMBe0EEQX0BO0EEQXtBAwF9AQRBQsF9AQLBewE2AT5BFIG2ARSBtoE/QQCBUkG/QRJBlMGCQUPBU8GCQVPBlQG6QTkBE4G6QROBksGFAY5Bh4FFAYeBRAGVwYmBVYGVwZWBlkGTgVjBSYFTgUmBVcGcgVwBToFcgU6BUIFXQZbBjcFXQY3BTcGbwZxBkgGbwZIBmIFTQU5BmMFTQVjBU4FbwZeBUEGbwZBBnEGXAYjBXIFXAZyBUIFQgU3BVsGQgVbBlwGWwZOBVcGWwZXBlwGIwVcBlcGIwVXBhMFOgV0BTcFOgU3BUIFSwVuBXQFSwV0BToFNQY7Bh0FNQYdBSUFOwY1BmAFOwZgBWcFKwY/BkIGKwZCBl8FKAZABj8GKAY/BisGJQZDBkAGJQZABigGIgZFBkMGIgZDBiUGPgZEBkUGPgZFBiIGwgVHBkQGwgVEBj4GXgZGBkcGXgZHBsIFPQbBBUYGPQZGBl4GKwZfBWgFKwZoBV8GGQY9BTwFGQY8BcIFKAYrBl8GKAZfBjQGaAVhBWEGaAVhBl8GIAZoBmUGIAZlBiMGaAYgBh4GaAYeBmsGYwY0Bl8GYwZfBmEGNAZjBmYGNAZmBmQGZAZmBmkGZAZpBmcGZwZpBmwGZwZsBmoGJQYoBjQGJQY0BmQGZwYiBiUGZwYlBmQGIgZnBmoGIgZqBj4GHgYcBhoGHgYaBmsGbAYbBhkGbAYZBmoGGQbCBT4GGQY+BmoGRQUxBTAFRQUwBTgFOQUiBW4FOQVuBUsFIgU5BUoFIgVKBW8FbwVKBVQFbwVUBWYFTAVtBWYFTAVmBVQFOwVzBW0FOwVtBUwFQwVPBXMFQwVzBTsFRgVQBU8FRgVPBUMFMAUdBWkFMAVpBTgFHQUwBTwGHQU8BiUFLQUqBiUFLQUlBTwGKgYtBSsFKgYrBScGLAUkBicGLAUnBisFJAYsBSoFJAYqBSEGIQYqBSgFIQYoBR8GKQUdBh8GKQUfBigFHQYpBScFHQYnBUEF/AT1BNkE/ATZBFEGFgUVBW0GFgVtBiQF/AQVBRYF/AQWBfsEEwVXBlkGEwVZBm4GLwZeBW8GLwZvBnAGXAXDBcEFXAXBBT0GUwXABcMFUwXDBVwFOAVpBXIGOAVyBkQFLwZwBnIGLwZyBmkFUAVGBUQFUAVEBXIGcAYwBlAFcAZQBXIGTgVbBl0GTgVdBk0FSAVaBlgGSAVYBlUGWgZIBUcFWgZHBUEFQQVHBTUFQQU1BUAFQAU1BTMFQAUzBT4FPwU0BR8FPwUfBT0FPQUfBR4FPQUeBTwFPAUeBTkGPAU5Bk0FhwaMBpoGhwaaBoYGhgaaBosGhgaLBoUGhQaLBpwGhQacBoQGgwZFBkQGgwZEBoQGggZDBkUGggZFBoMGgQZABkMGgQZDBoIGgAY/BkAGgAZABoEGgAaPBpgGgAaYBnQGfwa4BYwGfwaMBocGQQZzBnUGQQZ1BnEGugV9BnwGugV8BrYFpAaCBoMGpAaDBpUGxwV9Bn4GxwV+BsAFRwaFBoQGRwaEBkQGwAV+Bn8GwAV/BsMFkgZ3BnYGkgZ2Bp8GwwV/BocGwwWHBsEFvgV6BnkGvgV5BpAGvAV4BncGvAV3BpIGRgaGBoUGRgaFBkcGjwaABoEGjwaBBqIGnQZ7BnoGnQZ6Br4FkAZ5BngGkAZ4BrwFPwaABnQGPwZ0BkIGlQaDBoQGlQaEBpwGtgV8BnsGtgV7Bp0GcQZ1BnYGcQZ2BkgGogaBBoIGogaCBqQGwQWHBoYGwQWGBkYGbQZYBloGbQZaBiQFwwAoAMEDwwDBA9gDrQa5BqwGrAa5BuEGswa5BrIGrgarBrkGsAa5Bq0Gtwa5BqcGpwa5BqgGqAa5BrgGuAa5BqoGqga5BqkGuQbeBqkGuQazBrUGrwauBrkGsQavBrkGtQaxBrkGsga5BrQGtAa5BrYGtga5BrAG1wabBooG1waKBsEGxgaeBr8Fxga/BcQGzga7BbcFzga3Bb4G0QahBqMG0QajBs0GvAaJBrsFvAa7Bc4Gvga3BZ4GvgaeBsYG0waOBqEG0wahBtEG3wa5BYkG3waJBrwG2QalBpYG2QaWBtUGywaUBpsGywabBtcGyAaTBqAGyAagBtoG1QaWBo4G1QaOBtMGwQaKBpkGwQaZBt0GzQajBpQGzQaUBssG3QaZBo0G3QaNBroG4ga9BZMG4gaTBsgG2gagBqUG2galBtkGxAa/BZEGxAaRBsIGpwbFBsMGpwbDBrcGrQbbBtgGrQbYBrAG4QbjBskG4QbJBqwG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" + } + ] +} diff --git a/assets/hand_r.gltf b/assets/hand_r.gltf new file mode 100644 index 0000000..4b98f9f --- /dev/null +++ b/assets/hand_r.gltf @@ -0,0 +1,722 @@ +{ + "asset" : { + "copyright" : "CC0 Public Domain", + "generator" : "Khronos glTF Blender I/O v3.2.43", + "version" : "2.0" + }, + "scene" : 0, + "scenes" : [ + { + "name" : "Scene", + "nodes" : [ + 27 + ] + } + ], + "nodes" : [ + { + "name" : "Thumb_Tip_R", + "rotation" : [ + -0.07576872408390045, + 0.019257033243775368, + 0.03371242433786392, + 0.9963693618774414 + ], + "scale" : [ + 1.0000001192092896, + 1.000000238418579, + 1.0000001192092896 + ], + "translation" : [ + 2.7939677238464355e-09, + 0.030749469995498657, + -3.14321368932724e-09 + ] + }, + { + "children" : [ + 0 + ], + "name" : "Thumb_Distal_R", + "rotation" : [ + 0.05564067140221596, + -0.010326135903596878, + -0.013984743505716324, + 0.9982995390892029 + ], + "scale" : [ + 0.9999999403953552, + 0.9999999403953552, + 1.0000001192092896 + ], + "translation" : [ + 2.3283064365386963e-09, + 0.04214789345860481, + 1.5133991837501526e-09 + ] + }, + { + "children" : [ + 1 + ], + "name" : "Thumb_Proximal_R", + "rotation" : [ + -0.04595031589269638, + 0.027135659009218216, + 0.07525718957185745, + 0.9957352876663208 + ], + "scale" : [ + 1, + 1.0000001192092896, + 1 + ], + "translation" : [ + -2.3283064365386963e-10, + 0.044916488230228424, + -2.473825588822365e-10 + ] + }, + { + "children" : [ + 2 + ], + "name" : "Thumb_Metacarpal_R", + "rotation" : [ + 0.3235369920730591, + 2.565749491623137e-05, + 0.027220426127314568, + 0.9458239078521729 + ], + "scale" : [ + 1, + 0.9999998211860657, + 0.9999998807907104 + ], + "translation" : [ + -0.009999999776482582, + 0.02717285417020321, + 0.019999971613287926 + ] + }, + { + "name" : "Index_Tip_R", + "rotation" : [ + -0.052288394421339035, + 0.0005572127993218601, + -0.10362062603235245, + 0.9932413697242737 + ], + "scale" : [ + 0.9999999403953552, + 0.9999999403953552, + 1 + ], + "translation" : [ + -8.149072527885437e-09, + 0.027394980192184448, + 1.367880031466484e-09 + ] + }, + { + "children" : [ + 4 + ], + "name" : "Index_Distal_R", + "rotation" : [ + 0.014225997030735016, + 0.011990753002464771, + 0.13454149663448334, + 0.9907333254814148 + ], + "scale" : [ + 1, + 1.0000001192092896, + 1 + ], + "translation" : [ + -5.529727786779404e-09, + 0.0313456691801548, + 1.775333657860756e-09 + ] + }, + { + "children" : [ + 5 + ], + "name" : "Index_Intermediate_R", + "rotation" : [ + -0.013683199882507324, + 0.024668212980031967, + 0.23507100343704224, + 0.9715688824653625 + ], + "scale" : [ + 1, + 0.9999999403953552, + 1 + ], + "translation" : [ + 0, + 0.03811633586883545, + -3.3178366720676422e-09 + ] + }, + { + "children" : [ + 6 + ], + "name" : "Index_Proximal_R", + "rotation" : [ + 0.11122288554906845, + 0.0027781203389167786, + -0.11757423728704453, + 0.9868121147155762 + ], + "scale" : [ + 1, + 1.0000001192092896, + 1 + ], + "translation" : [ + -5.336175945558352e-10, + 0.08036758005619049, + 2.584926050985814e-09 + ] + }, + { + "children" : [ + 7 + ], + "name" : "Index_Metacarpal_R", + "rotation" : [ + -0.0005887771840207279, + -2.10358793992782e-05, + -0.0252196304500103, + 0.9996817708015442 + ], + "scale" : [ + 0.9999999403953552, + 0.9999999403953552, + 0.9999999403953552 + ], + "translation" : [ + 0.009999999776482582, + 0.0271772351115942, + 0.022405147552490234 + ] + }, + { + "name" : "Middle_Tip_R", + "rotation" : [ + 0.013688242062926292, + -7.99239132902585e-05, + -0.1684110462665558, + 0.9856218695640564 + ], + "scale" : [ + 1.0000001192092896, + 0.9999999403953552, + 1 + ], + "translation" : [ + 2.0736479200422764e-09, + 0.023346584290266037, + 6.548361852765083e-11 + ] + }, + { + "children" : [ + 9 + ], + "name" : "Middle_Distal_R", + "rotation" : [ + -0.013931511901319027, + 0.00014242221368476748, + 0.16861224174499512, + 0.985584020614624 + ], + "scale" : [ + 1, + 1.0000001192092896, + 0.9999999403953552 + ], + "translation" : [ + -5.973561201244593e-09, + 0.0324166864156723, + -5.820766091346741e-11 + ] + }, + { + "children" : [ + 10 + ], + "name" : "Middle_Intermediate_R", + "rotation" : [ + 0.03945539891719818, + -0.004928736016154289, + 0.13782717287540436, + 0.9896578788757324 + ], + "translation" : [ + -1.1295924196019769e-09, + 0.04500335454940796, + 6.621121428906918e-10 + ] + }, + { + "children" : [ + 11 + ], + "name" : "Middle_Proximal_R", + "rotation" : [ + -0.01194659061729908, + -0.000966736872214824, + 0.010500849224627018, + 0.9998730421066284 + ], + "translation" : [ + 7.057678885757923e-10, + 0.0804632380604744, + 3.4924596548080444e-10 + ] + }, + { + "children" : [ + 12 + ], + "name" : "Middle_Metacarpal_R", + "rotation" : [ + -0.03585463762283325, + -4.2005005525425076e-05, + -0.0499776192009449, + 0.9981066584587097 + ], + "scale" : [ + 1, + 0.9999999403953552, + 1 + ], + "translation" : [ + 0.009999999776482582, + 0.02714575082063675, + 0.0035275884438306093 + ] + }, + { + "name" : "Ring_Tip_R", + "rotation" : [ + 0.03305169194936752, + 0.006719753611832857, + -0.12635111808776855, + 0.9914120435714722 + ], + "scale" : [ + 1, + 1, + 0.9999998211860657 + ], + "translation" : [ + -5.326000973582268e-09, + 0.027049388736486435, + 3.969034878537059e-09 + ] + }, + { + "children" : [ + 14 + ], + "name" : "Ring_Distal_R", + "rotation" : [ + -0.011351789347827435, + -0.012621401809155941, + 0.13198409974575043, + 0.9911065101623535 + ], + "scale" : [ + 0.9999999403953552, + 1, + 1 + ], + "translation" : [ + 2.3865140974521637e-09, + 0.027797557413578033, + 9.604264050722122e-10 + ] + }, + { + "children" : [ + 15 + ], + "name" : "Ring_Intermediate_R", + "rotation" : [ + 0.01732625439763069, + -0.01860846020281315, + 0.16082890331745148, + 0.9866547584533691 + ], + "scale" : [ + 1.0000001192092896, + 0.9999999403953552, + 1 + ], + "translation" : [ + -8.731149137020111e-11, + 0.04013120010495186, + 9.604264050722122e-10 + ] + }, + { + "children" : [ + 16 + ], + "name" : "Ring_Proximal_R", + "rotation" : [ + -0.05105672776699066, + 0.002022986998781562, + -0.0418044812977314, + 0.9978184103965759 + ], + "scale" : [ + 0.9999999403953552, + 0.9999999403953552, + 0.9999999403953552 + ], + "translation" : [ + -6.075424607843161e-10, + 0.0739438384771347, + 1.331500243395567e-09 + ] + }, + { + "children" : [ + 17 + ], + "name" : "Ring_Metacarpal_R", + "rotation" : [ + -0.07119493186473846, + -1.573348527017515e-05, + -0.018085604533553123, + 0.9972984790802002 + ], + "scale" : [ + 1, + 0.9999999403953552, + 0.9999999403953552 + ], + "translation" : [ + 0.009999999776482582, + 0.027118019759655, + -0.01309998705983162 + ] + }, + { + "name" : "Little_Tip_R", + "rotation" : [ + 0.015836291015148163, + 0.01933973841369152, + -0.15377695858478546, + 0.9877893924713135 + ], + "scale" : [ + 1, + 1.0000001192092896, + 1 + ], + "translation" : [ + 3.725290298461914e-09, + 0.019765090197324753, + 4.6566128730773926e-09 + ] + }, + { + "children" : [ + 19 + ], + "name" : "Little_Distal_R", + "rotation" : [ + -0.018054774031043053, + -0.011455277912318707, + 0.10707500576972961, + 0.9940209984779358 + ], + "scale" : [ + 0.9999999403953552, + 0.9999998807907104, + 1 + ], + "translation" : [ + -2.6775524020195007e-09, + 0.01802438497543335, + 7.894414011389017e-10 + ] + }, + { + "children" : [ + 20 + ], + "name" : "Little_Intermediate_R", + "rotation" : [ + 0.044925764203071594, + -0.03280799090862274, + 0.18505947291851044, + 0.9811516404151917 + ], + "scale" : [ + 0.9999999403953552, + 0.9999998807907104, + 1.0000001192092896 + ], + "translation" : [ + 4.0745362639427185e-10, + 0.03312354534864426, + 2.6921043172478676e-10 + ] + }, + { + "children" : [ + 21 + ], + "name" : "Little_Proximal_R", + "rotation" : [ + -0.08928601443767548, + -0.003168066032230854, + 0.006739117205142975, + 0.9959782958030701 + ], + "scale" : [ + 1, + 0.9999999403953552, + 1 + ], + "translation" : [ + -3.4924596548080444e-10, + 0.06571118533611298, + -2.2009771782904863e-10 + ] + }, + { + "children" : [ + 22 + ], + "name" : "Little_Metacarpal_R", + "rotation" : [ + -0.09176954627037048, + -2.456200854794588e-05, + -0.02844771184027195, + 0.9953738451004028 + ], + "scale" : [ + 1, + 0.9999999403953552, + 1 + ], + "translation" : [ + 4.4605644178297155e-10, + 0.02708965167403221, + -0.029999956488609314 + ] + }, + { + "name" : "Palm_R", + "rotation" : [ + 0.7065238952636719, + 6.479929197666934e-06, + 8.686721230333205e-06, + 0.7076891660690308 + ], + "translation" : [ + -0.030781937763094902, + 0.06705548614263535, + -0.04206528514623642 + ] + }, + { + "children" : [ + 3, + 8, + 13, + 18, + 23, + 24 + ], + "name" : "Wrist_R", + "rotation" : [ + -0.7065169215202332, + -6.472751010733191e-06, + -6.472751465480542e-06, + 0.7076961994171143 + ], + "scale" : [ + 1, + 0.9999999403953552, + 1 + ], + "translation" : [ + -3.8642522071086205e-08, + -1.8697472114581615e-05, + 0.027175573632121086 + ] + }, + { + "mesh" : 0, + "name" : "mesh_Hand_R", + "skin" : 0 + }, + { + "children" : [ + 26, + 25 + ], + "name" : "Armature" + } + ], + "meshes" : [ + { + "name" : "mesh_Hand_R", + "primitives" : [ + { + "attributes" : { + "POSITION" : 0, + "NORMAL" : 1, + "TEXCOORD_0" : 2, + "JOINTS_0" : 3, + "WEIGHTS_0" : 4 + }, + "indices" : 5 + } + ] + } + ], + "skins" : [ + { + "inverseBindMatrices" : 6, + "joints" : [ + 25, + 3, + 2, + 1, + 0, + 8, + 7, + 6, + 5, + 4, + 13, + 12, + 11, + 10, + 9, + 18, + 17, + 16, + 15, + 14, + 23, + 22, + 21, + 20, + 19, + 24 + ], + "name" : "Armature" + } + ], + "accessors" : [ + { + "bufferView" : 0, + "componentType" : 5126, + "count" : 1764, + "max" : [ + 0.030590161681175232, + 0.09001174569129944, + 0.025806419551372528 + ], + "min" : [ + -0.03715551644563675, + -0.06858228147029877, + -0.18571554124355316 + ], + "type" : "VEC3" + }, + { + "bufferView" : 1, + "componentType" : 5126, + "count" : 1764, + "type" : "VEC3" + }, + { + "bufferView" : 2, + "componentType" : 5126, + "count" : 1764, + "type" : "VEC2" + }, + { + "bufferView" : 3, + "componentType" : 5121, + "count" : 1764, + "type" : "VEC4" + }, + { + "bufferView" : 4, + "componentType" : 5126, + "count" : 1764, + "type" : "VEC4" + }, + { + "bufferView" : 5, + "componentType" : 5123, + "count" : 9156, + "type" : "SCALAR" + }, + { + "bufferView" : 6, + "componentType" : 5126, + "count" : 26, + "type" : "MAT4" + } + ], + "bufferViews" : [ + { + "buffer" : 0, + "byteLength" : 21168, + "byteOffset" : 0 + }, + { + "buffer" : 0, + "byteLength" : 21168, + "byteOffset" : 21168 + }, + { + "buffer" : 0, + "byteLength" : 14112, + "byteOffset" : 42336 + }, + { + "buffer" : 0, + "byteLength" : 7056, + "byteOffset" : 56448 + }, + { + "buffer" : 0, + "byteLength" : 28224, + "byteOffset" : 63504 + }, + { + "buffer" : 0, + "byteLength" : 18312, + "byteOffset" : 91728 + }, + { + "buffer" : 0, + "byteLength" : 1664, + "byteOffset" : 110040 + } + ], + "buffers" : [ + { + "byteLength" : 111704, + "uri" : "data:application/octet-stream;base64,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CAcAAAgHAAAIBwAACAcAAAgHAAAIBwAACAcAAAgHAAAGBwAABgcAAAYHAAAGBwAABgcAAAYHAAAGBwAABgcAAAYHAAAGBwAABwYAAAcGAAAHBgAABwYAAAcGAAAHBggABwYAAAcGAAAHBgAABwYAAAcGAAAHCAAACAcAAAgHAAAHCAAACAcAAAgHAAAIBwAACAcAAAcIAAAIBwAABwYIAAcGCAAHBggABwYAAAcGCAAHBgAABwYAAAcGAAAHBgAABwYAAAcGAAAHAAAABwYAAAcGAAAGBwAABgcAAAYHAAAGBwAABgcAAAcGAAAHBgAABwYAAAcGAAAHBgAABgcAAAYHAAAGBwAABgcAAAYHAAAHCAAABwgAAAcIAAAHCAAABwgAAAcIAAAHCAAABwgAAAcIAAAHCAAABwgAAAcIAAAHCAAABwgAAAcIAAAHCAAABwgAAAcIAAAHCAAABwgAAAgAAAAIBwAACAcAAAgHAAAIBwAACAcAAAgHAAAIBwAACAcAAAgHAAAHCAYABwYAAAYFAAAGBwAACAAAAAgAAAAIAAAACAcAAAYHAAAHBggABwYIAAgHAAAGBwAABwYAAAcIAAAHCAAACAAAAAcIAAAHCAAABwYAAAYHAAAIAAAABgcAAAgAAAAIAAAACAAAAAYHCwAIBwAABwYAAAgHAAAHBggABgsFAAcGAAAHCAYACAAAAAgAAAAIBwAACAcAAAgHAAAIBwAACAcAAAgHAAAIBwAACAcAAAgHAAAIBwAACAcAAAgHAAAMDQAADA0AAAwAAAAMDQAADAsAAAwLAAAMCwAADAsAAAsGDAALDBAACwAAAAsGAAALEAAACxAAAAsGAAALAAAADAsAAAwLAAAMDQAADA0AAAsQAAALEAAACwwQAAsMEAAMCwAADAsAAAwNAAAMDQAACwYFAAsGBQALBgwACwYMAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAAMAAAADAsAAAsAAAALAAAADQAAAAwNCwAMCwAACxAGCgsMBhANDAAADQAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0MAAANAAAADQwAAA0MAAANDAAADQwAAA0MAAANDAAADQwAAA0MAAANDAAADQwAAAsMAAALAAAACwwAAAsMAAALDAAACwwGAAsMBgALDAYACwwAAAsMAAAMCwAADAsAAAwLAAAMCwAADAsAAAwLAAAMAAAADAsAAAwLAAAMCwAADAsAAA0MAAANDAAADQwAAA0MAAANDAAADQwAAA0MAAANDAAADQwAAA0MAAAMCw0ADAsNAAwLDQAMAAAADAsNAAwAAAAMCwAADAsAAAwLAAAMCwAADAAAAAwAAAAMCw0ADAsNAAsMAAALDAAACwwAAAsMAAALDAAADAsAAAwLAAAMCwAADAsAAAwLAAALDAAACwwAAAsMAAALDAAACwwAAAwNAAAMDQAADA0AAAwNAAAMDQAADQwAAAwNAAAMDQAADA0AAAwNAAANDAAADQwAAA0MAAANDAAADA0AAA0MAAANDAAADA0AAA0MAAANDAAADQAAAA0AAAANAAAADQwAAA0AAAANAAAADQAAAA0MAAANDAAADQwAAAwNAAAMCwAACwYFCgsMBgANAAAADQAAAA0AAAANDAAACwwGAAwLAAAMCw0ADQwAAAsMAAAMCwAADA0AAA0MAAANAAAADQwAAAwNAAAMCwAACwwAAA0AAAALDAAADQAAAA0AAAANAAAACwwQAA0MAAAMCwAADQwAAAwLDQALEAoADAsAAAwNCwANAAAADQAAAA0MAAANDAAADQwAAA0MAAANDAAADQwAAA0MAAANDAAADQwAAA0MAAANDAAADQwAABESAAAREgAAEQAAABESAAAQEQAAEBEAABEQAAAREAAAEAsRABAVEQAQAAAAEAsAABAVAAAQFQAAEAsAABALAAAREAAAERAAABESEAAREhAAEBUAABAVAAAQERUAEBEVABEQAAAREAAAERIAABESAAAQCwAAEAsAABALEQAQCxEAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABEAAAAQEQAAEAsAABAAAAASAAAAERIQABARAAAQCxUPEBELFRIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIRAAASEQAAEgAAABIAAAASAAAAEgAAABIRAAASEQAAEBEAABAAAAAQEQAAEBEAABARAAAQEQsAEBELABARCwAQAAAAEBELABEQAAAREAAAERAAABEQAAAREAAAERAAABEQAAAREAAAERAAABEQAAAREAAAEhEAABIRAAASEQAAEhEAABIRAAASEQAAEhEAABIRAAASEQAAEhEAABEQEgAREBIAERASABEQAAAREAAAERAAABEQAAAREAAAERAAABEQAAAREAAAEQAAABEQEgAREBIAEBEAABARAAAQEQAAEBEAABARAAAREAAAERAAABEQAAAREAAAERAAABARAAAQEQAAEBEAABARAAAQEQAAERIAABIRAAASEQAAEhEAABESAAAREgAAEhEAABESAAASEQAAEhEAABIRAAASEQAAEhEAABIRAAASEQAAEhEAABIRAAASEQAAEhEAABIRAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAERIQABARAAAQCw8KEAsRABIAAAASAAAAEgAAABIAAAAQEQsAERAAABEQEgASEQAAEBEAABEQAAAREgAAEhEAABIAAAASEQAAEhEAABEQAAAQEQAAEgAAABARFQASAAAAEgAAABIAAAAQERUAEhEAABEQAAASAAAAERASABAVDxQQEQAAERIQABIAAAASAAAAEhEAABIRAAASEQAAEhEAABIRAAASEQAAEhEAABIRAAASEQAAEhEAABIRAAASEQAAFhcVABYXFQAWFwAAFgAAABUWAAAVFgAAFRYAABUWAAAVEAAAFRYAABUAAAAVEBQPFRQAABUUAAAVEAAAFRAAABUWAAAVFgAAFhcVABYXFQAVFAAAFRYAABUWAAAWFxUAFRAAABUQAAAVEBYAFRAWABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAWAAAAFRYAABUUEAAVAAAAFwAAABYXFQAVFgAAFRAUABUWEAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXFgAAFxYAABcWAAAXFgAAFxYAABcWAAAXFgAAFxYAABcWAAAVFgAAFRYAABUAAAAVFgAAFRAWABUQFgAVEBYAFQAAABUWAAAVFgAAFhUXABYVAAAWFQAAFhUXABYVAAAWFRcAFhUXABYVFwAWFwAAFxYAABcWAAAWFwAAFxYAABcWAAAXFgAAFhcAABcWAAAWFRcAFhUXABYVFwAWFQAAFhUXABYVAAAWFQAAFhUAABYVAAAWFRcAFhUAABYVAAAWFRcAFRYAABUWAAAVFgAAFRYAABUWAAAWFRcAFhUAABYVAAAWFQAAFRYAABUWAAAVFgAAFRYAABUWAAAWFwAAFhcAABYXAAAWFwAAFhcVABYXAAAWFwAAFhcAABYXAAAWFwAAFhcAABcWAAAWFwAAFxYAABYXAAAWFwAAFhcAABYXAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFxYAABcWAAAWFxUAFRYAABUQFA8VFhAAFwAAABcAAAAXFgAAFRYQABYVFwAWFRcAFxYAABUWAAAWFRcAFhcVABcWAAAXAAAAFxYAABYXFQAWFRcAFRYAABcAAAAVFgAAFwAAABcAAAAVFgAAFxYAABYVFwAXFgAAFhUXABUUFgAVFgAAFhcVABcAAAAXAAAAFxYAABcWAAAXFgAAFxYAABcWAAAXFgAAFxYAABcWAAAXFgAAFxYAABcWAAACAwAAAgMAAAIDAAACAwAAAgMAAAIDAAACAwAAAgMAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAgMAAAMAAAACAwAAAwIAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAgAAAwAAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAgMAAAIDAAACAwAAAgMAAAIDAAACAwAAAgMAAAIDAAACAwAAAgMAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAwAAAAMAAAADAAAAAwIAAAMAAAADAAAAAwIAAAMCAAADAgAAAwIAAAIDAAADAAAAAwAAAAMAAAADAAAAAwIAAAIDAAADAgAAAwIAAAMCAAADAAAAAwIAAAMCAAADAAAAAwAAAAMAAAADAAAAAwIAAAMCAAACAwAAAgMAAAMAAAADAAAAAwAAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAMCAAADAgAAAwIAAAcIBgAHCAAABgcAAAcGAAAGCwAABgUAAAYHAAAGAAAACAAAAAgAAAAIBwAACAcAAAYHAAAGBwAABwYAAAcGAAAIBwAABwgAAAgHAAAHBgAABwYAAAgHAAAHBgAABwYAAAYHAAAGBwAABwgAAAcIAAAHCAAABwgAAAgHAAAIBwAACAAAAAgHAAAIBwAADA0AAAwNAAAMCwAADAsAAAsQAAALBgAACwYMAAsAAAANAAAADQAAAA0AAAANDAAACwwAAAsMAAAMCwAADAsAAA0MAAANDAAADQwAAAwAAAAMCw0ADQwAAAwLAAAMCwAACwwAAAsMAAAMDQAADA0AAA0MAAANDAAADQAAAA0MAAANAAAADQwAAA0MAAAREgAAERIAABEQAAAREAAAEBUPABALAAAQCxEAEAAAABIAAAASAAAAEgAAABIAAAAQEQsAEBEAABEQAAAREAAAEhEAABIRAAASEQAAERAAABEQAAASAAAAERAAABEQAAAQEQAAEBEAABESAAAREgAAEhEAABIRAAASAAAAEgAAABIAAAASEQAAEhEAABYXAAAWFxUAFRYAABUWAAAVFAAAFRAPABUQAAAVAAAAFwAAABcAAAAXAAAAFwAAABUQFgAVFgAAFhUAABYVAAAXFgAAFxYAABcWAAAWFQAAFhUAABcWAAAWFQAAFRYAABUWAAAVFgAAFhcAABYXAAAWFwAAFhcAABcAAAAXFgAAFwAAABcWAAAXFgAABwgGAAcGAAAGBQAABgcAAAgAAAAIAAAABwgGAAcGAAAGCwUABgsHAAgAAAAIBwAABgcAAAcGAAAHBggACAcAAAYHAAAHBgAABwgAAAcIAAAIAAAACAcAAAcIAAAHBgAABgcAAAcIAAAGBwAACAAAAAgAAAAIAAAACAcAAAgHAAAHBggABwYAAAgAAAAIBwAACAcAAAwNAAAMCwAACwYFCgsGDAANAAAADQAAAAwNAAAMCwAACxAAAAsMEAANAAAADQwAAAsMBgAMCwAADAsNAA0MAAALDAAADAsAAAwNAAANDAAADQAAAA0AAAANDAAADAsAAAsMAAAMDQAACwwAAA0AAAANAAAADQAAAA0MAAANDAAADAsNAAwLAAANAAAADQwAAA0MAAAREhAAEBEAABALAAAQCxEAEgAAABIAAAAREhAAERAAABAVDwAQERUAEgAAABIRAAAQEQsAERAAABEQEgASEQAAEBEAABEQAAASEQAAEhEAABIAAAASAAAAEhEAABEQAAAQEQAAEhEAABARFQASAAAAEgAAABIAAAASEQAAEgAAABEQEgAREAAAEgAAABIRAAASEQAAFhcVABUWAAAVEA8UFRAWABcAAAAWFxUAFRYAABUUAAAVFgAAFwAAABcWAAAVFhAAFhUXABYVFwAXFgAAFRYAABYVFwAWFxUAFxYAABcAAAAXAAAAFxYAABYVFwAVFgAAFhcVABUWAAAXAAAAFwAAABcWAAAXFgAAFhUXABYVFwAXAAAAFxYAABcWAAAGBQAABgsFAAYFAAAGBQAABgUAAAYFAAAGBQsABgUAAAYFCwoLBgoACxAKAAsKAAALChAFCwYFCgsQCg8QCw8AEA8VABAPCwAQDxULEAsPChAVDxQVEBQPFRQAABUUAAAVFAAAFRQQDxUUEAAVEBQPFRQQAAYFAAAVFAAABgUAABUUAAAGBQAABgULAAYFAAAGBQsABQYAAAYFAAAFBgsKCwoGAAsKEAALChAGCgULDwUKCwYKDwsQEA8LChAPFQAQDwsVDxAUFQ8QCgsUFQ8QFRQPEBUUDwAVFAAAFRQPABUUAAAVFA8QBgUAABQVAAAUFQ8QBQYAAAYFCwoFBgAABQYAAAUGCgsKCxAFCgULDwUKCwYKDwULDwoQFBQAAAABAgUAAQIAABALDwoGCwUKCg8FAAUGAAAFBgIBFA8VAAUCAQYFCgEGCgUPCwUKDwEKDwUUDxQKFQ8KFAUUDxUADxQVABQVAAAUFQAAFBUAABQPFQABAgAAAQIAAAECBQAQCw8KBQoBABQVAAAKBQ8ABQoGAA8UAAABAgUAAQIAAAECAAABAgAAAQUCAAUBAgoFCgYAFA8VABQAAAAUFQAAFA8AAAECBQAFAgEADxAVFAoPAAAKBQsADwoUAAEFAgABBQIAFA8AABQPAAAPFBUQCwoQDwUKAAAPChAADwoQCw8KEBQPFAoACg8FAAoFDwAPFAoADwoUAAUBCgAUDwAAFAAAABQAAAAUAA8AFAAPABQPAAABAgUACxAKAAoPBQAPChQAFAAAABQAAAAUAAAACgULBgoLDxAPFBAVDwoUAAoFDwAKDwUABQoGCwoLBQ8FBgoADxQKAAUKAAALBgoFEBUPFAYHBQAGAAAABgAAAAYLAAAGCwAABgsAAAYHBQAGBwUABgAAAAYHBQAGBwUABgsFAAYHAAAGCwAABgcFAAYLAAALEAYKCwAAAAsGDAALBgwACxAAAAsQAAALEAAACwYAAAsQAAALBhAFFQAAABUAAAALEAAACwYMABALEQAQFREAEBUAABAVAAAQCxEAEAsRABALEQAQCwAAEAsRABAVEQAQCwAAEBUAABUQAAAVEAAAEAAAABALERUQAAAAEBUAABUWAAAVEBYAFRYQABUQAAAVAAAAFRAAAAsQAAALAAAACwYAAAsGAAAVFgAAFRAWABUQFgAVFgAAFRAWAAoFDwAKBQ8ABQoBAAUKAQABAAUUAQAFFAoPBQAKDwUAAQAUBQEAFAUFCgAABQEAAAEFAAAFAQoADwoUAAoPBQAKDwUACgUPAA8UCgAUDwAACwYKBQYLBQAPEAoLFRAPFBQPFRAUFQ8ADxQKAAIAAAACAwAAAgMAAAIDAAACAwAAAgMAAAIDAAACAwAAAgMAAAIDAAACAwAAAgMAAAIAAAACAwAAAgMAAAIDAAACAwAAAgMAAAIDAAACAwAAAgUAAAIFAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgUBAAIBAAACAQAAAgUBAAIFAQACAAAAAgUBAAIBAAACAQAAAgEAAAIBAAACAQAAAgUBAAIBBQACAQAAAgUBAAIFAQACAQAAAgEFAAIBBQACAQAAAgEAAAIBAAACAQAAAgUBAAIBBQACAQUAAgUBAAIFAQACAQAAAgEFAAIBBQACAQAAAgEAAAIBAAACAQAABQIBAAIBBQACAQUAAgUBBgIFAQYCAQAAAgUBAAEAAAABAAAAAQAAAAEFAAIFAQoPAQAFDwUKAQ8AAQ8FCg8FAQEAFAAAAQ8UDwoUBQABFAAPFAABDxQKAAAUAQAUDwABFA8AABQAAQAUFQ8ADxQKAA8KFAAUAAAAFA8AAAoFDwAKDwUADwoUAAAUAQ8UDwAACg8FAAUBCgAUDwAAAQIFAAUKAAAUAAAAFBUPAAUBAAABAAAAFAABAAAUAQAUAAAAFAAAAAABFAABAAUAAQAUAAEFAAABBQAAFAABDxQAAQ8UAAEPFA8AAAsFCgYQDxUUEA8KCwYFCwALCgUQCgsQDxUUEA8VFAAABgUAAAYFAAAFBgsKFRAPFAUCAQYFAgEGBQIGAQUGAgEFBgIBBQIBBgUBAgAFBgIABQECAAEFAAAUAAEPFAAPARQADwEAFAEP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KgBxAHAAKgBwAAIAGgABAG8AGgBvAHIAVwSWAGMAVwRjAFMEzABiAF0AzABdAM4AxgPOA1UAxgNVAG0AWABuAGoAWABqAGcAUQRZAGgAUQRoAFIEAwBpAHEAAwBxACoAGQAGAH4AGQB+AIIAUARNAHUAUAR1AFQETwBIAH8ATwB/AHcAwQAwAHkAwQB5ALQAEAAHAHwAEAB8AHoAxQNHAH4AxQN+ANEDBwAQAHQABwB0AHYAtwBQAHgAtwB4ALUARQQRAHsARQR7AFUExwPPA30AxwN9AGwAbAB9AFEAbABRAFcAWgBtAFUAWgBVAFIA1APSA4MA1AODAI0A1QPTA4QA1QOEAI4AkQCHAIoAkQCKAJQAjwCOAIQAjwCEAIUAjQCDAIcAjQCHAJEAEgAAAIkAEgCJAIsAwgAvAIgAwgCIALMARAQTAIwARASMAFYEiwCJAJMAiwCTAJUAswCIAJIAswCSALIAVgSMAJYAVgSWAFcEygPUA40AygONAFwAyQPVA44AyQOOAF4AZACRAJQAZACUAF8AYABeAI4AYACOAI8AXACNAJEAXACRAGQAQQCbAJ0AQQCdAEQAuAC2AJcAuACXADwAOQCYAKAAOQCgADQAZgCrAKEAZgChAC8AeACtAKIAeACiADAAgAWBBaQAgAWkADIAPACXALEAPACxAKcAlwA9AKgAlwCoALEAMgCkAKkAMgCpAFAAyABlAKwAyACsAM8AeQCuAKoAeQCqAFYAkgCwAKwAkgCsAGUAVgCqAKsAVgCrAGYAUACpAK0AUACtAHgAMACiAK4AMACuAHkALwChAK8ALwCvAIgAiACvALAAiACwAJIAXgS3ALUAXgS1AFwEhgWCBbsAhgW7AE0ETQS7ALcATQS3AF4EWgSyALwAWgS8AGIEOwAiAC4AOwAuADMASwTBALQASwS0AFsESgTCALMASgSzAF0EWARjBL4AWAS+ALYAZAS/AMIAZATCAEoEXAS1AMEAXATBAEsEZQS9AL8AZQS/AGQEYQRYBLYAYQS2ALgAXQSzALIAXQSyAFoEaARiBLwAaAS8ANAAWwS0AL0AWwS9AGUEIABmBF8EIABfBLkAIgDYA8ADIgDAAy4AwwDYA8EDwwDBAygAZgTEACUAZgQlAF8EwQMnADYAwQM2AMIDxADDACgAxAAoACUAKQDDAMQAKQDEACMAyQPZA8oAyQPKAF8AZADLAMkAZADJAFwAvgDQAMgAvgDIAD0AYADFAMcAYADHAF4ATwRnBM0ATwTNAEAAygPaA84AygPOAF0AXwDKAMsAXwDLAGQAPwDMAM4APwDOAEUAPQDIAM8APQDPAKgAYwRoBNAAYwTQAL4A8gPeA9UA8gPVAE4B8QPdA9cA8QPXACYBIgH8ANYAIgHWACUBiAX9AN0AiAXdAK4FjgXgA9wAjgXcAK8FjQXfA94AjQXeAK0F9QPbA9QA9QPUAFQB9gPcA9IA9gPSAFUBWAH7ANMAWAHTAFsBdwQ4AeMAdwTjAGkESAFQAdYASAHWAPwAeQRFAeEAeQThAGoElAWJBe8AlAXvAGwEHAEYAdoAHAHaAOgAVwFVAdIAVwHSAOwAjAWtBd4AjAXeAOYAJAEmAdcAJAHXAOoAOQE7AdEAOQHRAOQAigWwBdkAigXZAPAAHwEeAfAAHwHwANkA8wNRAdUA8wPVAN4D9ANPAdcA9APXAN0D8AP5A2sB8ANrARQBDwFvAXABDwFwARcBcwR+BGkBcwRpAQoB6wP6A3EB6wNxARYBFAFrAW8BFAFvAQ8BhASGBIkBhASJAYoB4wP6AAUB4wMFAeYDdgF4AXMEdgFzBG0E+QDkA+UD+QDlAwYB+ADzAAwB+AAMAQcB/wDjA+YD/wDmAwQB9QALAQUB9QAFAfoATgHVAPwATgH8ACIBrwXcAP0ArwX9AIgFVAHUAPsAVAH7AFgBkAE3AQABkAEAAZMBUQFIAfwAUQH8ANUAhgFJAQEBhgEBAZIBjwWHBQMBjwUDAYwBhwGPAQ4BhwEOAWgBagERARYBagEWAXEB+QPlAwcB+QMHAWsBfgR0BBABfgQQAWkBawEHAQwBawEMAW8BbQEJAQYBbQEGAW4BbwEMAQQBbwEEAXAB+gPmAwUB+gMFAXEB/APwAxQB/AMUAZsBnAEPARcBnAEXAZoBoQGNATYBoQE2AZkB/gDbABkB/gAZASABbATvAB0BbAQdAXUEUwFPARgBUwEYARwBRwFGAR4BRwEeAR8B4QPgABoB4QMaAecD4gPaABgB4gMYAegD4AD+ACAB4AAgARoBjAEDASEBjAEhAYgBQgEoATwBQgE8AUEBlwETARUBlwEVAZgB7gPpAz4B7gM+AUABjAR4BDMBjAQzAZ0BZwFkAS4BZwEuATQBegRLASkBegQpAXYEhQFKAScBhQEnAY4B3APuA0AB3ANAAdIAOgE9ASgBOgEoAUIB7wPqAz0B7wM9AToBGgEgAUgBGgFIAVEBRAFAAT4BRAE+ASwBjgEnATcBjgE3AZABTAFNAT8BTAE/ASoB/QPrAxYB/QMWAZ8B5wMaAVEB5wNRAfMDmwEUAQ8BmwEPAZwBKAEiASUBKAElATwBgwFjATYBgwE2AY0B2wPvAzoB2wM6AdQA+wBCAUEB+wBBAdMA7ADSAEAB7ABAAUQBfARmATMBfAQzAXgEngE0AS4BngEuAZ8B6QPxAyYB6QMmAT4BKgE/ATsBKgE7ATkBdgQpATgBdgQ4AXcE1AA6AUIB1ABCAfsA6gDXAE8B6gBPAVMBdQQdAUUBdQRFAXkEIAEZAVABIAFQAUgBkgEBAUoBkgFKAYUB4gDYAE0B4gBNAUwB6AMYAU8B6ANPAfQD2ADiAEYB2ABGAUcBiAEhAUkBiAFJAYYBagThAEsBagRLAXoE6gPyA04B6gNOAT0BPQFOASIBPQEiASgBLAE+ASYBLAEmASQB9wP1A1QB9wNUAV4B+AP2A1UB+ANVAV8BYgFYAVsBYgFbAWUBYQFfAVUBYQFVAVcBXgFUAVgBXgFYAWIB5ADRAFoB5ABaAV0BkwEAAVkBkwFZAYQBaQTjAFwBaQRcAXsEXQFaAWQBXQFkAWcBhAFZAWMBhAFjAYMBewRcAWYBewRmAXwE7QP3A14B7QNeAS0B7AP4A18B7ANfAS8BNQFiAWUBNQFlATABMgEvAV8BMgFfAWEBLQFeAWIBLQFiATUBEwFtAW4BEwFuARUBiQGHAWgBiQFoAQ0BCwFqAXEBCwFxAQUBNwF8AXIBNwFyAQABSQF+AXMBSQFzAQEBhwWQBXUBhwV1AQMBDQFoAYIBDQGCAXgBiQENAfEAiQHxAIoBaAEOAXkBaAF5AYIBAwF1AXoBAwF6ASEBmQE2AX0BmQF9AaABSgF/AXsBSgF7AScBYwGBAX0BYwF9ATYBJwF7AXwBJwF8ATcBIQF6AX4BIQF+AUkBAQFzAX8BAQF/AUoBAAFyAYABAAGAAVkBWQGAAYEBWQGBAWMBgwSIAYYBgwSGAYEEkwWPBYwBkwWMAXIEcgSMAYgBcgSIAYMEfwSDAY0BfwSNAYcE8wD/AAQB8wAEAQwBcASSAYUBcASFAYAEbwSTAYQBbwSEAYIEfQSIBI8BfQSPAYcBiQSQAZMBiQSTAW8EgQSGAZIBgQSSAXAEigSOAZABigSQAYkEhgR9BIcBhgSHAYkBggSEAYMBggSDAX8EjQSHBI0BjQSNAaEBgASFAY4BgASOAYoE8gCLBIUE8gCFBIsB8wD7A+MD8wDjA/8AlAH7A+QDlAHkA/kA9QCVAYsE9QCLBG4EiwSVAfcAiwT3AIUE5QPkA/gA5QP4AAcBlQGUAfkAlQH5APcA7AP8A5sB7AObATABNQGcAZoBNQGaAS0BjwGhAZkBjwGZAQ4BMgGXAZgBMgGYAS8BdASMBJ0BdASdARAB7QP9A58B7QOfAS4BMAGbAZwBMAGcATUBEQGeAZ8BEQGfARYBDgGZAaABDgGgAXkBiASNBKEBiAShAY8BFQQBBKYBFQSmAR8CFAQABKgBFASoAfcB8wHNAacB8wGnAfYBowXOAa4BowWuAaUFnwUDBK0BnwWtAZwFoAUCBK8BoAWvAaYFGAT+A6UBGASlASUCGQT/A6MBGQSjASYCKQLMAaQBKQKkASwCnAQJArQBnAS0AY4EGQIhAqcBGQKnAc0BngQWArIBngSyAY8ElQWZBcABlQXAAZEE7QHpAasB7QGrAbkBKAImAqMBKAKjAb0BmAWmBa8BmAWvAbcB9QH3AagB9QGoAbsBCgIMAqIBCgKiAbUBmgWbBaoBmgWqAcEB8AHvAcEB8AHBAaoBFgQiAqYBFgSmAQEEFwQgAqgBFwSoAQAEEwQcBDwCEwQ8AuUB4AFAAkEC4AFBAugBmASjBDoCmAQ6AtsBDgQdBEICDgRCAucB5QE8AkAC5QFAAuABqQSrBFoCqQRaAlsCBgTLAdYBBgTWAQkEygEHBAgEygEIBNcByAHKAdcByAHXAdoByQHEAd0ByQHdAdgBmATbAcUBmATFAZIExgHcAdYBxgHWAcsBHwKmAc0BHwLNAfMBnAWtAc4BnAXOAaMFJQKlAcwBJQLMASkCYQIIAtEBYQLRAWQCIgIZAs0BIgLNAaYBVwIaAtIBVwLSAWMCngWkBdQBngXUAV0CWAJgAt8BWALfATkCOwLiAecBOwLnAUICHAQIBNgBHATYATwCowSZBOEBowThAToCPALYAd0BPALdAUACPgLaAdcBPgLXAT8CQALdAdUBQALVAUECHQQJBNYBHQTWAUICHwQTBOUBHwTlAWwCbQLgAegBbQLoAWsCcgJeAgcCcgIHAmoCzwGsAeoBzwHqAfEBkQTAAe4BkQTuAZoEJAIgAukBJALpAe0BGAIXAu8BGALvAfABBASxAesBBATrAQoEBQSrAekBBQTpAQsEsQHPAfEBsQHxAesBXQLUAfIBXQLyAVkCEwL5AQ0CEwINAhICaALkAeYBaALmAWkCEQQMBA8CEQQPAhECsQSdBAQCsQQEAm4COAI1Av8BOAL/AQUCnwQcAvoBnwT6AZsEVgIbAvgBVgL4AV8C/wMRBBEC/wMRAqMBCwIOAvkBCwL5ARMCEgQNBA4CEgQOAgsC6wHxARkC6wEZAiICFQIRAg8CFQIPAv0BXwL4AQgCXwIIAmECHQIeAhACHQIQAvsBIAQOBOcBIATnAXACCgTrASICCgQiAhYEbALlAeABbALgAW0C+QHzAfYB+QH2AQ0CVAI0AgcCVAIHAl4C/gMSBAsC/gMLAqUBzAETAhICzAESAqQBvQGjARECvQERAhUCoQQ3AgQCoQQEAp0EbwIFAv8BbwL/AXACDAQUBPcBDAT3AQ8C+wEQAgwC+wEMAgoCmwT6AQkCmwQJApwEpQELAhMCpQETAswBuwGoASACuwEgAiQCmgTuARYCmgQWAp4E8QHqASEC8QEhAhkCYwLSARsCYwIbAlYCswGpAR4CswEeAh0CCwTpASACCwQgAhcEqQGzARcCqQEXAhgCWQLyARoCWQIaAlcCjwSyARwCjwQcAp8EDQQVBB8CDQQfAg4CDgIfAvMBDgLzAfkB/QEPAvcB/QH3AfUBGgQYBCUCGgQlAi8CGwQZBCYCGwQmAjACMwIpAiwCMwIsAjYCMgIwAiYCMgImAigCLwIlAikCLwIpAjMCtQGiASsCtQErAi4CZALRASoCZAIqAlUCjgS0AS0CjgQtAqAELgIrAjUCLgI1AjgCVQIqAjQCVQI0AlQCoAQtAjcCoAQ3AqEEEAQaBC8CEAQvAv4BDwQbBDACDwQwAgACBgIzAjYCBgI2AgECAwIAAjACAwIwAjIC/gEvAjMC/gEzAgYC5AE+Aj8C5AE/AuYBWgJYAjkCWgI5At4B3AE7AkIC3AFCAtYBCAJNAkMCCAJDAtEBGgJPAkQCGgJEAtIBpAWdBUYCpAVGAtQB3gE5AlMC3gFTAkkCWgLeAcIBWgLCAVsCOQLfAUoCOQJKAlMC1AFGAksC1AFLAvIBagIHAk4CagJOAnECGwJQAkwCGwJMAvgBNAJSAk4CNAJOAgcC+AFMAk0C+AFNAggC8gFLAk8C8gFPAhoC0gFEAlAC0gFQAhsC0QFDAlEC0QFRAioCKgJRAlICKgJSAjQCqARZAlcCqARXAqYElgWeBV0ClgVdApcElwRdAlkClwRZAqgEpARUAl4CpAReAqwE0AEGBAkE0AEJBNUBlQRjAlYClQRWAqUElARkAlUClARVAqcEogStBGACogRgAlgCrgRhAmQCrgRkApQEpgRXAmMCpgRjApUErwRfAmECrwRhAq4EqwSiBFgCqwRYAloCpwRVAlQCpwRUAqQEsgSsBF4CsgReAnICpQRWAl8CpQRfAq8EwwGwBKoEwwGqBFwCxAEeBAYExAEGBNABZQIeBAcEZQIHBMoBsARmAsgBsATIAaoEBwTJAdgBBwTYAQgEZgJlAsoBZgLKAcgBywFlAmYCywFmAsYBDwQfBGwCDwRsAgECBgJtAmsCBgJrAv4BYAJyAmoCYAJqAt8BAwJoAmkCAwJpAgACmQSxBG4CmQRuAuEBEAQgBHACEARwAv8BAQJsAm0CAQJtAgYC4gFvAnAC4gFwAucB3wFqAnEC3wFxAkoCrQSyBHICrQRyAmACOAQkBHcCOAR3AuICNwQjBHkCNwR5Ar0CugKXAngCugJ4ArwCqgWYAn8CqgV/ApIFrAUmBH4CrAV+AqEFqwUlBIACqwWAApEFOwQhBHYCOwR2AucCPAQiBHQCPAR0AugC6gKWAnUC6gJ1Au0CwATNAoUCwASFArME3ALkAngC3AJ4ApcCwgTZAoMCwgSDArQEqAWyBY0CqAWNArYEtAKxAnwCtAJ8AogC6QLoAnQC6QJ0AooCsQWRBYACsQWAAocCuwK9AnkCuwJ5AokCzgLQAnMCzgJzAoYCswWiBXsCswV7Ao4CtwK2Ao4CtwKOAnsCOQTlAncCOQR3AiQEOgTjAnkCOgR5AiMENgQ/BPwCNgT8Aq0CqQL/AgADqQIAA7ACvATHBPoCvAT6AqQCMQRABAEDMQQBA68CrQL8Av8CrQL/AqkCkQKlAqACkQKgApUCzQTOBBgDzQQYAxkDoQKUAioEoQIqBCsEkgKUAqECkgKhAqMCkwKQAqYCkwKmAqICtwS8BKQCtwSkApECKQSVAqACKQSgAiwE4gJ3ApcC4gKXAroCoQV+ApgCoQWYAqoF5wJ2ApYC5wKWAuoCHgPMApsCHgObAiED5QLcApcC5QKXAncCFQPdApwCFQOcAiADtAWpBZ4CtAWeAhoDFgMdA6gCFgOoAvkC+wKrAq8C+wKvAgEDPwQrBKICPwSiAvwCxwS9BKoCxwSqAvoC/AKiAqYC/AKmAv8C/QKjAqEC/QKhAv4C/wKmAp8C/wKfAgADQAQsBKACQASgAgEDQgQ2BK0CQgStAigDKQOpArACKQOwAicDLgMbA8sCLgPLAiYDmQJ9ArICmQKyArgCtgSNArUCtgS1Ar4E5gLjArEC5gKxArQC2wLaArYC2wK2ArcCJwSCArMCJwSzAi0EKAR8ArECKASxAi4EggKZArgCggK4ArMCGgOeArkCGgO5AhcD1wK/AtEC1wLRAtYCJAOsAq4CJAOuAiUDNAQvBNMCNATTAtUC1ATBBMgC1ATIAioD+AL1AsQC+ALEAskCwwTfAsACwwTAAr8EFAPeAr4CFAO+AhwDIgQ0BNUCIgTVAnQCzwLSAr8CzwK/AtcCNQQwBNICNQTSAs8CswK4AtwCswLcAuUC2ALVAtMC2ALTAsICHAO+AswCHAPMAh4D4ALhAtQC4ALUAsECQwQxBK8CQwSvAiwDLQSzAuUCLQTlAjkEKAOtAqkCKAOpAikDvwK6ArwCvwK8AtECEgP0AssCEgPLAhsDIQQ1BM8CIQTPAnYClgLXAtYClgLWAnUCigJ0AtUCigLVAtgCxQT3AsgCxQTIAsEEKwPJAsQCKwPEAiwDLwQ3BL0CLwS9AtMCwQLUAtACwQLQAs4CvwTAAs0CvwTNAsAEdgLPAtcCdgLXApYCiQJ5AuMCiQLjAuYCvgS1AtkCvgTZAsIEuAKyAuQCuALkAtwCIAOcAt4CIAPeAhQDhAJ6AuEChALhAuACLgSxAuMCLgTjAjoEegKEAtoCegLaAtsCFwO5At0CFwPdAhUDtASDAt8CtATfAsMEMAQ4BOICMATiAtIC0gLiAroC0gK6Ar8CwgLTAr0CwgK9ArsCPQQ7BOcCPQTnAvACPgQ8BOgCPgToAvEC8wLqAu0C8wLtAvYC8gLxAugC8gLoAukC8ALnAuoC8ALqAvMChgJzAuwChgLsAu8CIQObAusCIQPrAhMDswSFAu4CswTuAsQE7wLsAvUC7wL1AvgCEwPrAvQCEwP0AhIDxATuAvcCxAT3AsUEMwQ9BPACMwTwAsMCMgQ+BPECMgTxAsUCygLzAvYCygL2AsYCxwLFAvECxwLxAvICwwLwAvMCwwLzAsoCrAL9Av4CrAL+Aq4CGAMWA/kCGAP5AqcCpQL7AgEDpQIBA6ACzAILAwIDzAICA5sC3QINAwMD3QIDA5wCqQW1BQUDqQUFA54CpwL5AhEDpwIRAwcDGAOnAo8CGAOPAhkD+QKoAggD+QIIAxEDngIFAwkDngIJA7kCJgPLAgwDJgMMAy0D3gIOAwoD3gIKA74C9AIQAwwD9AIMA8sCvgIKAwsDvgILA8wCuQIJAw0DuQINA90CnAIDAw4DnAIOA94CmwICAw8DmwIPA+sC6wIPAxAD6wIQA/QCzAQXAxUDzAQVA8oEpwW0BRoDpwUaA7sEuwQaAxcDuwQXA8wEyAQSAxsDyAQbA88EnwKaAikEnwIpBCwEuQQgAxQDuQQUA8kEuAQhAxMDuAQTA8sExgTQBB0DxgQdAxYD0QQeAyED0QQhA7gEygQVAyADygQgA7kE0gQcAx4D0gQeA9EEzgTGBBYDzgQWAxgDywQTAxIDywQSA8gE1QTPBBsD1QQbAy4DyQQUAxwDyQQcA9IEkQIjA9MEkQLTBLcEkAJBBCkEkAIpBJoCjwLTBM0EjwLNBBkDIgNBBCoEIgMqBJQC0wQjA5IC0wSSAs0EKgSTAqICKgSiAisEIwMiA5QCIwOUApIClQIiAyMDlQIjA5ECMgRCBCgDMgQoA8YCygIpAycDygInA8MCHQMuAyYDHQMmA6gCxwIkAyUDxwIlA8UCvQTUBCoDvQQqA6oCMwRDBCwDMwQsA8QCxgIoAykDxgIpA8oCqwIrAywDqwIsA68CqAImAy0DqAItAwgD0ATVBC4D0AQuAx0DfAMvAzIDfAMyA3YDfQMxAzADfQMwA3cDegNLAzEDegMxA30DmgNuAzQDmgM0A5QDeAN3AzADeAMwAzUDbQNwAy8DbQMvAzMDXwOQA40DXwONA14DWQORA5IDWQOSA2EDmAOeA4wDmAOMA1UDYQOSA5MDYQOTA2ADXgONA5EDXgORA1kDTgM4AzcDTgM3A08DRAM5AzcDRAM3A0oDUgM8AzsDUgM7A1ADlwOVAzoDlwM6A0UDUAM7Az8DUAM/A1EDpAOpAz4DpAM+A0IDVgNAAzgDVgM4A04DUQM/A0ADUQNAA1YDPwNIA0MDPwNDA0ADQANDA0wDQANMAzgDdgMyA0sDdgNLA3oDpwNsA00DpwNNA6gDqQOiA1cDqQNXAz4DOwNJA0gDOwNIAz8DlQOYA1UDlQNVAzoDPANGA0kDPANJAzsDOQNUA08DOQNPAzcDOANMA0oDOANKAzcDoQOmA1gDoQNYA4oDiwNaA2ADiwNgA5MDkANQA1EDkANRA40DngOZA1sDngNbA4wDjQNRA1YDjQNWA5EDjgNSA1ADjgNQA5ADkQNWA04DkQNOA5IDkgNOA08DkgNPA5MDrgNfA14DrgNeA7EDsgNZA2EDsgNhA7ADtwOlA2sDtwNrA68DrANcA18DrANfA64DtgObA2kDtgNpA7QDiAOGA2MDiANjA2gDMQNyA3EDMQNxAzADsANhA2ADsANgA7UDsQNeA1kDsQNZA7IDnwOFA2sDnwNrA6UDLwNwA28DLwNvAzIDSwNzA3IDSwNyAzEDNQMwA3EDNQNxA3QDnQOJA2kDnQNpA5sDswNoA2MDswNjA7UDMgNvA3MDMgNzA0sDhgN8A3YDhgN2A4ADhwN9A3cDhwN3A4EDhAN6A30DhAN9A4cDggOBA3cDggN3A3gDgAN2A3oDgAN6A4QDMwMvA3wDMwN8A34DqANNA3sDqAN7A6ADlAM0A38DlAN/A5wDfgN8A4YDfgOGA4gDoAN7A4UDoAOFA58DnAN/A4kDnAOJA50DYwOGA4ADYwOAA2IDZQOHA4EDZQOBA2QDagOEA4cDagOHA2UDZgNkA4EDZgOBA4IDYgOAA4QDYgOEA2oDXAOOA5ADXAOQA18DogOhA4oDogOKA1cDVAOLA5MDVAOTA08DbAOaA5QDbAOUA00DVwOKA54DVwOeA5gDQgM+A5UDQgOVA5cDPgNXA5gDPgOYA5UDigNYA5kDigOZA54DrwNrA5sDrwObA7YDhQOdA5sDhQObA2sDTQOUA5wDTQOcA3sDewOcA50DewOdA4UDgwOfA6UDgwOlA2cDPQNTA6IDPQOiA6kDNgOoA6ADNgOgA3kDjwNdA6YDjwOmA6EDdQOnA6gDdQOoAzYDUwOPA6EDUwOhA6IDRwM9A6kDRwOpA6QDeQOgA58DeQOfA4MDrQNnA6UDrQOlA7cDQwOqA0oDQwNKA0wDQQOrA0YDQQNGA6MDqgNDA0gDqgNIA0kDqwOqA0kDqwNJA0YDqwNBA5YDqwOWA0QDZAOuA7EDZAOxA2UDagOyA7ADagOwA2IDpgO3A68DpgOvA1gDZgOsA64DZgOuA2QDmQO2A7QDmQO0A1sDYgOwA7UDYgO1A2MDZQOxA7IDZQOyA2oDWgOzA7UDWgO1A2ADWAOvA7YDWAO2A5kDXQOtA7cDXQO3A6YDfAAHALsDfAC7A88DVAAFALoDVAC6A84DdwUOAL0DdwW9A4MFeQUMALwDeQW8A4QFiQAAALgDiQC4A9IDigACALkDigC5A9MDdgDQA7sDdgC7AwcAfwDRA7oDfwC6AwUARACdANYDRADWA80DRgCfANcDRgDXA8gDTgQ6ACQATgQkAEkEJQAoADUAJQA1ADcAnQA1AMIDnQDCA9YDnwAzAMMDnwDDA9cDxwBEAM0DxwDNA9kDCAC+A8QDCADEA04ACgC/A8UDCgDFA0gAcABrAMYDcADGA8sDAgBwAMsDAgDLA7kDagBuAMcDagDHA8wDyQBGAMgDyQDIA9oDTgDEA9ADTgDQA3YAAABqAMwDAADMA7gDawBUAM4DawDOA8YDSADFA9EDSADRA38AbgB8AM8DbgDPA8cDkwCJANIDkwDSA9QDlACKANMDlADTA9UDXQCTANQDXQDUA8oDXwCUANUDXwDVA8kD2APDACkA2AMpAMAD2AMiACcA2AMnAMEDXgDHANkDXgDZA8kDXADJANoDXADaA8oDTQHYAN4DTQHeA/IDJQHWAN0DJQHdA/EDsAXfAOADsAXgA44FrgXdAN8DrgXfA40FWgHRANsDWgHbA/UDWwHTANwDWwHcA/YDRwHzA94DRwHeA9gAUAH0A90DUAHdA9YAFQFuAfkDFQH5A/ADFwFwAfoDFwH6A+sDcwQKAfQAcwT0AG0E9wD5AAYB9wAGAQkBbgEGAeUDbgHlA/kDcAEEAeYDcAHmA/oDmAEVAfADmAHwA/wD2QDhA+cD2QDnAx8B2wDiA+gD2wDoAxkBQQE8AekDQQHpA+4D0wBBAe4D0wDuA9wDOwE/AeoDOwHqA+8DmgEXAesDmgHrA/0DHwHnA/MDHwHzA0cB0QA7Ae8D0QDvA9sDPAElAfEDPAHxA+kDGQHoA/QDGQH0A1ABPwFNAfIDPwHyA+oDZAFaAfUDZAH1A/cDZQFbAfYDZQH2A/gDLgFkAfcDLgH3A+0DMAFlAfgDMAH4A+wD+wOUAfoA+wP6AOMD+wPzAPgA+wP4AOQDLwGYAfwDLwH8A+wDLQGaAf0DLQH9A+0DHgKpAQEEHgIBBBUE9gGnAQAE9gEABBQEmwWwAQMEmwUDBJ8FpQWuAQIEpQUCBKAFKwKiAf4DKwL+AxgELAKkAf8DLAL/AxkEGAIWBAEEGAIBBKkBIQIXBAAEIQIABKcB5gE/AhwE5gEcBBME6AFBAh0E6AEdBA4ExAHQAdUBxAHVAd0BRwJJApgERwKYBJIEPwLXAQgEPwIIBBwEQQLVAQkEQQIJBB0EaQLmARMEaQITBB8EqgEEBAoEqgEKBPABrAEFBAsErAELBOoBEgINAgwEEgIMBBEEpAESAhEEpAERBP8DDAIQAg0EDAINBBIEawLoAQ4EawIOBCAE8AEKBBYE8AEWBBgCogEMAhIEogESBP4DDQL2ARQEDQIUBAwE6gELBBcE6gEXBCECEAIeAhUEEAIVBA0ENQIrAhgENQIYBBoENgIsAhkENgIZBBsE/wE1AhoE/wEaBBAEAQI2AhsEAQIbBA8EHgRlAssBHgTLAQYEHgTEAckBHgTJAQcEAAJpAh8EAAIfBA8E/gFrAiAE/gEgBBAE4QJ6AiQE4QIkBDgEvAJ4AiMEvAIjBDcEogWBAiYEogUmBKwFkgV/AiUEkgUlBKsF7AJzAiEE7AIhBDsE7QJ1AiIE7QIiBDwE2wI5BCQE2wIkBHoC5AI6BCME5AIjBHgCrgL+Aj8ErgI/BDYEsAIAA0AEsAJABDEEkAKaAp8CkAKfAqYCBgMHA7wEBgO8BLcE/gKhAisE/gIrBD8EAAOfAiwEAAMsBEAEJQOuAjYEJQM2BEIEewInBC0EewItBLcCfQIoBC4EfQIuBLIC1gLRAi8E1gIvBDQEdQLWAjQEdQI0BCIE0ALUAjAE0AIwBDUEJwOwAjEEJwMxBEMEtwItBDkEtwI5BNsCcwLQAjUEcwI1BCEE0QK8AjcE0QI3BC8EsgIuBDoEsgI6BOQC1ALhAjgE1AI4BDAE9QLsAjsE9QI7BD0E9gLtAjwE9gI8BD4ExAL1Aj0ExAI9BDMExgL2Aj4ExgI+BDIEQQQiA5UCQQSVAikEQQSQApMCQQSTAioExQIlA0IExQJCBDIEwwInA0MEwwJDBDMEqwBSBEQEqwBEBKEArQBUBEUErQBFBKIAgQWFBUcEgQVHBKQApwCxAFkEpwBZBE4EJgA4AGEEJgBhBGAEsQCoAE8EsQBPBFkEpABHBFAEpABQBKkAzwCsAFMEzwBTBGcErgBVBFEErgBRBKoAsABXBFMEsABTBKwAqgBRBFIEqgBSBKsAqQBQBFQEqQBUBK0AogBFBFUEogBVBK4AoQBEBFYEoQBWBK8ArwBWBFcErwBXBLAASgBeBFwESgBcBIEAewWGBU0EewVNBBYAFgBNBF4EFgBeBEoAkABaBGIEkABiBGEAuAA8ACEAuAAhALoAGABLBFsEGABbBFMAGwBKBF0EGwBdBIYAnABCAGMEnABjBFgEcwBkBEoEcwBKBBsAgQBcBEsEgQBLBBgAWwBlBGQEWwBkBHMAOACcAFgEOABYBGEEhgBdBFoEhgBaBJAAxgBhAGIExgBiBGgEUwBbBGUEUwBlBFsAIwDEAGYEIwBmBEgEZgQgAKUAZgSlAEgEqADPAGcEqABnBE8EQgDGAGgEQgBoBGMEfAF3BGkEfAFpBHIBfgF5BGoEfgFqBHMBkAWUBWwEkAVsBHUBeAGCAX4EeAF+BHME9gAIAYYE9gCGBIQEggF5AXQEggF0BH4EdQFsBHUEdQF1BHoBoAF9AXgEoAF4BIwEfwF6BHYEfwF2BHsBgQF8BHgEgQF4BH0BewF2BHcEewF3BHwBegF1BHkEegF5BH4BcwFqBHoEcwF6BH8BcgFpBHsEcgF7BIABgAF7BHwEgAF8BIEBGwGDBIEEGwGBBFIBiwWTBXIEiwVyBOcA5wByBIME5wCDBBsBYAF/BIcEYAGHBDEB8QANAXgB8QB4AXYB6QBwBIAE6QCABCMB6wBvBIIE6wCCBFYBbAESAYgEbAGIBH0EQwGJBG8EQwFvBOsAUgGBBHAEUgFwBOkAKwGKBIkEKwGJBEMBCAFsAX0ECAF9BIYEVgGCBH8EVgF/BGABlgExAYcElgGHBI0EIwGABIoEIwGKBCsB+gCUAZUB+gCVAfUAiwTyAHcBiwR3AW4EeQGgAYwEeQGMBHQEEgGWAY0EEgGNBIgETQKcBI4ETQKOBEMCTwKeBI8ETwKPBEQCnQWVBZEEnQWRBEYCSQJTAqMESQKjBJgExwHZAasExwGrBKkEUwJKApkEUwKZBKMERgKRBJoERgKaBEsCcQJOAp0EcQKdBLEEUAKfBJsEUAKbBEwCUgKhBJ0EUgKdBE4CTAKbBJwETAKcBE0CSwKaBJ4ESwKeBE8CRAKPBJ8ERAKfBFACQwKOBKAEQwKgBFECUQKgBKEEUQKhBFIC7AGoBKYE7AGmBCMClwWWBZcElwWXBLgBuAGXBKgEuAGoBOwBMQKkBKwEMQKsBAICwgHeAUkCwgFJAkcCugGVBKUEugGlBPQBvAGUBKcEvAGnBCcCPQLjAa0EPQKtBKIEFAKuBJQEFAKUBLwBIwKmBJUEIwKVBLoB/AGvBK4E/AGuBBQC2QE9AqIE2QGiBKsEJwKnBKQEJwKkBDECZwICAqwEZwKsBLIE9AGlBK8E9AGvBPwBxgFmArAExgGwBJMEsATDAUgCsARIApMESgJxArEESgKxBJkE4wFnArIE4wGyBK0ECwPABLMECwOzBAIDDQPCBLQEDQO0BAMDtQWoBbYEtQW2BAUDBwMRA8cEBwPHBLwEkgKjAs4EkgLOBM0EEQMIA70EEQO9BMcEBQO2BL4EBQO+BAkDLQMMA8EELQPBBNQEDgPDBL8EDgO/BAoDEAPFBMEEEAPBBAwDCgO/BMAECgPABAsDCQO+BMIECQPCBA0DAwO0BMMEAwPDBA4DAgOzBMQEAgPEBA8DDwPEBMUEDwPFBBADtALMBMoEtALKBOYCsQWnBbsEsQW7BIgCiAK7BMwEiALMBLQC8gLIBM8E8gLPBMcCpwIHAwYDpwIGA48CiQK5BMkEiQLJBLsCigK4BMsEigLLBOkC/QKsAtAE/QLQBMYE2ALRBLgE2AK4BIoC5gLKBLkE5gK5BIkCwgLSBNEEwgLRBNgCowL9AsYEowLGBM4E6QLLBMgE6QLIBPICJAPHAs8EJAPPBNUEuwLJBNIEuwLSBMICtwTTBI8CtwSPAgYDCAMtA9QECAPUBL0ErAIkA9UErALVBNAEzgHnBOYEzgHmBK4BkQHkBOIEkQHiBAIB7wSYAn4C7wR+AusE9gS6BIcC9gSHAu4EvQPzBNYEvQPWBAsA9QRGBKMA9QSjAN0EmALvBOwEmALsBH8C9AQlBH8C9AR/AuwEHwPyBPAEHwPwBJ0CugT2BPIEugTyBB8DYgLqBOgEYgLoBNMB8wS9Aw4A8wQOANgE4wR0AQIB4wQCAeIE4QT9ANwA4QTcAN8E3QSjADEA3QQxANwE8QQEA50C8QSdAvAERgT1BNoERgTaBB0A6QRFAtMB6QTTAegE/QDhBOAE/QDgBN0A2wQsAAsA2wQLANYE2AQOABwA2AQcANkE7gSHAoAC7gSAAu0EJQT0BO0EJQTtBIACwADeBNwEwADcBDEA5wTOAa0B5wStAeUELADbBNcELADXBAwATgbpBOgETgboBE0GUQYDBQEFUQYBBVAGUgbxBPAEUgbwBFMGDAVFBTEFDAUxBQ4FTAbjBOIETAbiBFAGVwYJBQcFVwYHBU0GVgb9BPsEVgb7BE8GFwX9BAIFFwUCBRoFCQUPBSwGCQUsBhIFAgSuAeYEAgTmBHYFFwUWBfsEFwX7BP0EFwUnBSQFFwUkBRYFAwUbBRkFAwUZBQEFIwUQBfkEIwX5BBMFGgUCBQEFGgUBBRkFNgXlBK0BNgWtAQMELQUrBVEFLQVRBRIFKQUaBRkFKQUZBSgFEgVRBQcFEgUHBQkFGwUqBSgFGwUoBRkFRgUyBS4FRgUuBUMFcQU5BUoFcQVKBWsFMgVGBUQFMgVEBS8FawVKBVQFawVUBVUFTAVWBVUFTAVVBVQFdQYwBmIFdQZiBXIGOwVsBVYFOwVWBUwFMAY4Bl0FMAZdBWIFOQVxBWoFOQVqBUsFMQZuBXQFMQZ0BToGMgZlBVgFMgZYBTYGMwZtBWYFMwZmBS4GOgZ0BTcFOgY3BTcGagV1BSEFagUhBXAF3wPdAOAE3wPgBGQFNgZYBVsFNgZbBS4GLQZzBW0FLQZtBTMGMgYiBW4FMgZuBTEGUgVrBVUFUgVVBSAFcAUhBRQFcAUUBXIFzwXOBS4FzwUuBTIFSwVqBXAFSwVwBToFLgXOBUkFLgVJBWwFLQB/BXkFLQB5BQoAvgODBXgFvgN4BQ8AvwOEBXoFvwN6BQkARgQdAH4FRgR+BYUFFwAJAHoFFwB6BXwFHAAOAHcFHAB3BX0FDwB4BX8FDwB/BS0AwAAxAIAFwACABYIFMQCjAIEFMQCBBYAFTATAAIIFTASCBYYFCAB3BYMFCACDBb4DCgB5BYQFCgCEBb8DowBGBIUFowCFBYEFFABMBIYFFACGBXsFcQSRAY8FcQSPBZMF4QOOBa8F4QOvBeAA4gONBa0F4gOtBdoA6ADaAK0F6ACtBYwFuQGrAaYFuQGmBZgFawTtAIkFawSJBZQFlgRiAp4FlgSeBZYF0wFFAp0F0wGdBaQFkQECAYcFkQGHBY8FsQGcBaMFsQGjBc8BdAFrBJQFdAGUBZAF2wCuBY0F2wCNBeIDBQSgBaYFBQSmBasB2QCwBY4F2QCOBeEDBASfBZwFBAScBbEB5QBxBJMF5QCTBYsFAgF0AZAFAgGQBYcFnQIEA7UFnQK1BakF4ACvBYgF4ACIBf4A7gDfALAF7gCwBYoFRQKQBJUFRQKVBZ0F/gCIBa4F/gCuBdsAtgGWBJYFtgGWBZcFHwOdAqkFHwOpBbQFkAS+AZkFkASZBZUFmQKqBZIFmQKSBX0CtQSLArIFtQSyBagFJwSsBaEFJwShBYICrAGlBaAFrAGgBQUEvwGwAZsFvwGbBZoFzwGjBaUFzwGlBawBqgGbBZ8FqgGfBQQEYgLTAaQFYgKkBZ4FfQKSBasFfQKrBSgEggKhBaoFggKqBZkCBAO1BKgFBAOoBbUFugQfA7QFugS0BacFewKiBawFewKsBScEhwK6BKcFhwKnBbEFjAKBAqIFjAKiBbMFKASrBZEFKASRBXwCiAJ8ApEFiAKRBbEFbAVJBcwFbAXMBVYFcQUYBXUFcQV1BWoFEAUjBXIFEAVyBRQFGAVxBWsFGAVrBVIFBgUEBSAFBgUgBcwFAAX+BHUFAAV1BRgFVgXMBSAFVgUgBVUFDQULBewEDQXsBO8EygXfBNwAygXcAOADvAMMANcEvAPXBMsF4APfAA0A4AMNALwDvAPLBcoFvAPKBeAD7wTrBAoF7wQKBQ0FzgUKBesEzgXrBM0FAwSwAd4AAwTeAN8DzAVJBQUFzAUFBQYF3wNkBTYF3wM2BQMESQXOBc0FSQXNBXYFzwURBQsFzwULBQ0FMgUvBREFMgURBc8FzQXrBH4CzQV+AiYEAgR2Bc0FAgTNBSYEJgSBAq8BJgSvAQIEDQUKBc4FDQXOBc8FHAVRBSsFHAUrBSwFgwaEBo4GgwaOBrkFggaDBrkFgga5BZQGbQPSBdUFbQPVBXAD2QV0A3ED2QVxA9YF2wWaA2wD2wVsA9EFpwPcBdEFpwPRBWwD1wVyA3MD1wVzA9gF1gVxA3ID1gVyA9cF3AWnA3UD3AV1A9oF2AVzA28D2AVvA9QFmgPbBdMFmgPTBW4D1AVvA3AD1AVwA9UF5AXYBdQF5AXUBeAF4AXUBdUF4AXVBeEF2wXnBd8F2wXfBdMF5QXZBdYF5QXWBeIF0gXeBeEF0gXhBdUF5wXbBdEF5wXRBd0F3AXoBd0F3AXdBdEF6AXcBdoF6AXaBeYF4wXXBdgF4wXYBeQF4gXWBdcF4gXXBeMF7wXjBeQF7wXkBfAF7gXiBeMF7gXjBe8F8AXkBeAF8AXgBewF7AXgBeEF7AXhBe0F5wXzBesF5wXrBd8F8QXlBeIF8QXiBe4F3gXqBe0F3gXtBeEF8wXnBd0F8wXdBekF6AX0BekF6AXpBd0F9AXoBeYF9AXmBfIF/wXzBekF/wXpBfUF9AUABvUF9AX1BekFAAb0BfIFAAbyBf4F+wXvBfAF+wXwBfwF+gXuBe8F+gXvBfsF/AXwBewF/AXsBfgF+AXsBe0F+AXtBfkF8wX/BfcF8wX3BesF/QXxBe4F/QXuBfoF6gX2BfkF6gX5Be0F/wULBgMG/wUDBvcFCQb9BfoFCQb6BQYG9gUCBgUG9gUFBvkFCwb/BfUFCwb1BQEGAAYMBgEGAAYBBvUFDAYABv4FDAb+BQoGBwb7BfwFBwb8BQgGBgb6BfsFBgb7BQcGCAb8BfgFCAb4BQQGBAb4BfkFBAb5BQUGFAYIBgQGFAYEBhAGEAYEBgUGEAYFBhEGCwYXBg8GCwYPBgMGFQYJBgYGFQYGBhIGAgYOBhEGAgYRBgUGFwYLBgEGFwYBBg0GDAYYBg0GDAYNBgEGGAYMBgoGGAYKBhYGEwYHBggGEwYIBhQGEgYGBgcGEgYHBhMGHwUeBRAGHwUQBhEGMwUfBREGMwURBg4GQQUdBhwGQQUcBkAFQAUcBhsGQAUbBj8FPgUaBhkGPgUZBj0FHQYfBh4GHQYeBhwGHwYhBiAGHwYgBh4GIQYkBiMGIQYjBiAGTQVhBj0GTQU9BmAGJAYnBiYGJAYmBiMGJwYqBikGJwYpBiYGNQZhBWQGNQZkBikGJQU1BikGJQUpBioGFQANAN8AFQDfAO4A5gDeALAB5gCwAb8BTAQUAO0ATATtAGsEawR0AcAAawTAAEwEdAHjBN4EdAHeBMAAVgbeBOMEVgbjBEwGJAUnBUEFJAVBBV0GGgUpBScFGgUnBRcFNQU0BQ8GNQUPBhcGcQTlAL4BcQS+AZAEkARFApEBkASRAXEEtwGvAYECtwGBAowClgS2AYsClgSLArUEtQQEA2ICtQRiApYEBAPxBOoEBAPqBGICVwbqBPEEVwbxBFIGHAUbBQMFHAUDBQgFLAUqBRsFLAUbBRwFUQUcBQgFUQUIBQcFTgYIBQMFTgYDBVEG5ASRAUUC5ARFAukEDwUOBTEFDwUxBSwGLQZXBV0FLQZdBTgGbAU7BUMFbAVDBS4FFAUhBfgEFAX4BPoEFAX6BPcEFAX3BBAFGAVSBf8EGAX/BAAFLwVFBQwFLwUMBREFRwU1BRcGRwUXBg0GUAVPBTgGUAU4BjAGWQUxBjoGWQU6BlMFcwUtBjgGcwU4Bk8FVwUtBjMGVwUzBloFUwU6BjcGUwU3BlwFIgUyBjYGIgU2Bm8FWgUzBi4GWgUuBlsFZQUyBjEGZQUxBlkFbwU2Bi4GbwUuBmYFMQUwBTwGMQU8BiwGJgYpBmQGJgZkBmYGEgUsBjwGEgU8Bi0FIwYmBmYGIwZmBmkGSAVHBQ0GSAUNBhgGGAYWBlkGGAZZBkgFJgVYBhUGJgUVBhIGYwUmBRIGYwUSBhMGEwYUBjkGEwY5BmMFNwZgBj0GNwY9BlwFLwZfBWgFLwZoBTsGOwYdBWkFOwZpBS8GRAU4BUUFRAVFBS8FPAXCBWEGPAVhBk0FggaBBsYFggbGBccFgQaABsUFgQbFBcYFgAZ/BsQFgAbEBcUFfwZ+BsgFfwbIBcQFfgZ9BtAFfgbQBcgFfQZ8BskFfQbJBdAFfAZ7BksGfAZLBskFWQVTBcAFWQXABccFZQVZBccFZQXHBcYFxgXFBVgFxgVYBWUFxQXEBVsFxQVbBVgFWgVbBcQFWgXEBcgFVwVaBcgFVwXIBdAF0AXJBV0F0AVdBVcFegZ7Bp4GegaeBqMGeQZ6BqMGeQajBkkGYgVdBckFYgXJBUsGBQVJBXYFBQV2BeYECAVOBk0GCAVNBgcF/AT1BE8G/ARPBvsEBgUFBeYEBgXmBOcE5wTlBAQF5wQEBQYF5ARRBlAG5ARQBuIEIAUEBeUEIAXlBDYFDwVSBlMGDwVTBg4F9QTdBNwE9QTcBE8GNgVkBVIFNgVSBSAF/wRSBWQF/wRkBeAEAAX/BOAEAAXgBOEE4QTfBP4E4QT+BAAFAgVMBlAGAgVQBgEF6gRXBk0G6gRNBugE9gTuBA4F9gQOBVMGdQX+BN8EdQXfBMoF3gRWBk8G3gRPBtwEygXLBSEFygUhBXUF+AQhBcsF+ATLBdcE+gT4BNcE+gTXBNsE9gRTBvAE9gTwBPIE2wTWBPcE2wT3BPoEEAX3BNYEEAXWBPME8wTYBPkE8wT5BBAFEwX5BFQGEwVUBnAG/AQVBXEG/ARxBlUG7gTtBAwF7gQMBQ4FEQUMBe0EEQXtBPQE9ATsBAsF9AQLBREF2ATZBFQG2ARUBvkE/QRWBkwG/QRMBgIFCQVXBlIGCQVSBg8F6QROBlEG6QRRBuQEFAYQBh4FFAYeBTkGWgZbBlgGWgZYBiYFTgVaBiYFTgUmBWMFcgVCBToFcgU6BXAFYAY3BjcFYAY3BV4GcgZiBUsGcgZLBnYGTQVOBWMFTQVjBTkGcgZ2BkIGcgZCBl8FXwZCBXIFXwZyBSMFQgVfBl4GQgVeBjcFXgZfBloGXgZaBk4FIwUTBVoGIwVaBl8GOgVCBTcFOgU3BXQFSwU6BXQFSwV0BW4FNQYlBR0FNQYdBTsGOwZoBWEFOwZhBTUGKwZeBUEGKwZBBj8GKAYrBj8GKAY/BkAGJQYoBkAGJQZABkMGIgYlBkMGIgZDBkUGPgYiBkUGPgZFBkQGwgU+BkQGwgVEBkcGYQbCBUcGYQZHBkYGPQZhBkYGPQZGBsEFKwZiBmcFKwZnBV4FGQbCBTwFGQY8BT0FKAY0BmIGKAZiBisGZwViBmMGZwVjBmAFIAYjBmkGIAZpBmwGbAZvBh4GbAYeBiAGZQZjBmIGZQZiBjQGNAZnBmgGNAZoBmUGZwZqBmsGZwZrBmgGagZtBm4GagZuBmsGJQZnBjQGJQY0BigGagZnBiUGagYlBiIGIgY+Bm0GIgZtBmoGHgZvBhsGHgYbBhwGbgZtBhkGbgYZBhoGGQZtBj4GGQY+BsIFRQU4BTAFRQUwBTEFOQVLBW4FOQVuBSIFIgVvBUoFIgVKBTkFbwVmBVQFbwVUBUoFTAVUBWYFTAVmBW0FOwVMBW0FOwVtBXMFQwU7BXMFQwVzBU8FRgVDBU8FRgVPBVAFMAU4BWkFMAVpBR0FHQUlBTwGHQU8BjAFLQU8BiUFLQUlBSoGKgYnBisFKgYrBS0FLAUrBScGLAUnBiQGJAYhBioFJAYqBSwFIQYfBigFIQYoBSoFKQUoBR8GKQUfBh0GHQZBBScFHQYnBSkF/ARVBtoE/ATaBPUEFgUkBXEGFgVxBhUF/AT7BBYF/AQWBRUFEwVwBlsGEwVbBloGLwZ1BnIGLwZyBl8FXAU9BsEFXAXBBcMFUwVcBcMFUwXDBcAFOAVEBXcGOAV3BmkFLwZpBXcGLwZ3BnUGUAV3BkQFUAVEBUYFdQZ3BlAFdQZQBTAGTgVNBWAGTgVgBl4GSAVZBlwGSAVcBl0GXQZBBUcFXQZHBUgFQQVABTUFQQU1BUcFQAU/BTQFQAU0BTUFPgU9BR8FPgUfBTMFPQU8BR4FPQUeBR8FPAVNBTkGPAU5Bh4FjAaLBo8GjAaPBqYGiwaKBpEGiwaRBo8GigaJBroFiga6BZEGiAaJBkQGiAZEBkUGhwaIBkUGhwZFBkMGhgaHBkMGhgZDBkAGhQaGBkAGhQZABj8GhQZ4BkgGhQZIBnMGhAaMBqYGhAamBo4GQgZ2BnoGQgZ6BnkGlAa3BYEGlAaBBoIGoQa+BYgGoQaIBocGxwXABYMGxwWDBoIGRwZEBokGRwaJBooGwAXDBYQGwAWEBoMGnAaeBnsGnAZ7BnwGwwXBBYwGwwWMBoQGmgaYBn4GmgZ+Bn8GlgacBnwGlgZ8Bn0GRgZHBooGRgaKBosGcwafBoYGcwaGBoUGvQWaBn8GvQV/BoAGmAaWBn0GmAZ9Bn4GPwZBBngGPwZ4BoUGvgW6BYkGvgWJBogGtwW9BYAGtwWABoEGdgZLBnsGdgZ7BnoGnwahBocGnwaHBoYGwQVGBosGwQWLBowGcQYkBV0GcQZdBlwGqgOrA0QDqgNEA0oDrQasBrkGrAbhBrkGswayBrkGrga5BqsGsAatBrkGtwanBrkGpwaoBrkGqAa4BrkGuAaqBrkGqgapBrkGuQapBt4GuQa1BrMGrwa5Bq4GsQa5Bq8GtQa5BrEGsga0BrkGtAa2BrkGtgawBrkG1gbABpIG1gaSBrsFxwbFBpkGxwaZBrwFzwa/BrYFzwa2BZMG0AbMBqIG0AaiBqAGvQbPBpMGvQaTBrgFvwbHBrwFvwa8BbYF0gbQBqAG0gagBnQG4Aa9BrgF4Aa4BY0G2AbUBkoG2AZKBqQGygbWBrsFyga7Bb8FyQbbBp0GyQadBpsG1AbSBnQG1AZ0BkoGwAbcBpAGwAaQBpIGzAbKBr8FzAa/BaIG3Aa7BqUG3AalBpAG4wbJBpsG4wabBpUG2wbYBqQG2wakBp0GxQbDBpcGxQaXBpkGpwa3BsIGpwbCBsQGrQawBtkGrQbZBtoG4QasBsgG4QbIBuIG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" + } + ] +} diff --git a/assets/linear_srgb.fs b/assets/linear_srgb.fs new file mode 100644 index 0000000..89a36a0 --- /dev/null +++ b/assets/linear_srgb.fs @@ -0,0 +1,18 @@ +precision mediump float; + +varying vec2 fragTexCoord; +varying vec4 fragColor; +uniform sampler2D texture0; + +vec3 srgb_to_linear(vec3 c) { + bvec3 cutoff = lessThanEqual(c, vec3(0.04045)); + vec3 low = c / 12.92; + vec3 high = pow((c + 0.055) / 1.055, vec3(2.4)); + return mix(high, low, vec3(cutoff)); +} + +void main() { + vec4 c = texture2D(texture0, fragTexCoord) * fragColor; + c.rgb = srgb_to_linear(c.rgb); // decode to linear + gl_FragColor = c; +} diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..c91b414 --- /dev/null +++ b/flake.lock @@ -0,0 +1,116 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "wlroots-lunar": "wlroots-lunar" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "wlroots-lunar": { + "inputs": { + "flake-utils": "flake-utils_2", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1759266345, + "narHash": "sha256-BJ+CTRXaFArVFgJfL19QpoR7Ebk8HU63Lz0+jQvhV3Y=", + "owner": "slendidev", + "repo": "wlroots-lunar", + "rev": "1179ca07821decbff320eafd7ffb3caaadcefbf4", + "type": "github" + }, + "original": { + "owner": "slendidev", + "repo": "wlroots-lunar", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..6c6253e --- /dev/null +++ b/flake.nix @@ -0,0 +1,88 @@ +{ + description = "LunarWM is a VR-based Wayland compositor"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + wlroots-lunar = { + url = "github:slendidev/wlroots-lunar"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + + outputs = + { + self, + nixpkgs, + flake-utils, + wlroots-lunar, + }: + flake-utils.lib.eachDefaultSystem ( + system: + let + pkgs = import nixpkgs { + system = system; + config.cudaSupport = true; + config.allowUnfree = true; + }; + in + { + devShells.default = pkgs.mkShell.override { stdenv = pkgs.llvmPackages_20.libcxxStdenv; } { + hardeningDisable = [ "fortify" ]; + + packages = with pkgs; [ + pkg-config + cmake + ninja + (pkgs.llvmPackages_20.clang-tools.override { enableLibcxx = true; }) + lldb + + lua + + # For wlroots + libxkbcommon + libxkbcommon.dev + libdrm + xorg.libxcb + pixman + libgbm + lcms2 + seatd + libdisplay-info + libliftoff + libinput + xorg.xcbutilrenderutil + xorg.xcbutilwm + xorg.xcbutilerrors + vulkan-loader + + wlroots-lunar.packages."${system}".default + + # For raylib + xorg.libXrandr + xorg.libXinerama + xorg.libXcursor + xorg.libXi + glfw + + boost + libffi + wayland + wayland-scanner + wayland-protocols + + openxr-loader + libGL + glm + xorg.libX11 + xorg.libXau + xorg.libXdmcp + ]; + + shellHook = '' + export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -B${pkgs.llvmPackages_20.libcxx}/lib -I${pkgs.llvmPackages_20.libcxx.dev}/include/c++/v1" + ''; + }; + } + ); +} diff --git a/launch_settings.cap b/launch_settings.cap new file mode 100644 index 0000000..fa0051c --- /dev/null +++ b/launch_settings.cap @@ -0,0 +1,34 @@ +{ + "rdocCaptureSettings": 1, + "settings": { + "autoStart": false, + "commandLine": "", + "environment": [ + { + "separator": "Platform style", + "type": "Set", + "value": "1", + "variable": "LWM_NO_XR" + } + ], + "executable": "/home/lain/Documents/projs/lunarwm/build/LunarWM", + "inject": false, + "numQueuedFrames": 0, + "options": { + "allowFullscreen": true, + "allowVSync": true, + "apiValidation": false, + "captureAllCmdLists": false, + "captureCallstacks": false, + "captureCallstacksOnlyDraws": false, + "debugOutputMute": true, + "delayForDebugger": 0, + "hookIntoChildren": false, + "refAllResources": false, + "softMemoryLimit": 0, + "verifyBufferAccess": false + }, + "queuedFrameCap": 0, + "workingDir": "/home/lain/Documents/projs/lunarwm" + } +} diff --git a/lunarwm/citrus_orchard_road_puresky_8k.hdr b/lunarwm/citrus_orchard_road_puresky_8k.hdr new file mode 100644 index 0000000..82f442b Binary files /dev/null and b/lunarwm/citrus_orchard_road_puresky_8k.hdr differ diff --git a/lunarwm/citrus_orchard_road_puresky_8k.png b/lunarwm/citrus_orchard_road_puresky_8k.png new file mode 100644 index 0000000..dd74db8 Binary files /dev/null and b/lunarwm/citrus_orchard_road_puresky_8k.png differ diff --git a/lunarwm/cubemap.png b/lunarwm/cubemap.png new file mode 100644 index 0000000..d09a9bb Binary files /dev/null and b/lunarwm/cubemap.png differ diff --git a/lunarwm/init.lua b/lunarwm/init.lua new file mode 100644 index 0000000..c0043c0 --- /dev/null +++ b/lunarwm/init.lua @@ -0,0 +1,34 @@ +function main(kbd) + return "Super-" .. kbd +end + +return { + input = { + keyboard = { + xkb_options = { "altwin:swap_lalt_lwin" }, + }, + mouse = { + invert_y = false, + }, + }, + keybindings = { + { bind = main("Shift-Q"), action = lunar.quit_compositor }, + { bind = main("Shift-R"), action = lunar.reload_config }, + { bind = main("R"), action = lunar.recenter }, + { bind = main("Tab"), action = lunar.cycle_next }, + { bind = main("Space"), action = function() lunar.exec("kitty") end }, + }, + space = { + radius = 1.0, + }, + displays = { + hud = { + size = 720, + font_size = 24, + }, + virtual = { + resolution = { 2560, 1440 }, + }, + }, + cubemap = 'cubemap.png', +} diff --git a/src/Config.c b/src/Config.c new file mode 100644 index 0000000..351ecd9 --- /dev/null +++ b/src/Config.c @@ -0,0 +1,493 @@ +#include "Config.h" + +#include "common.h" +#include "lua_helpers.h" + +#include +#include +#include +#include + +#include +#include + +#include +#include + +char const *get_config_path(void) +{ + static char const *paths[] = { + "lunarwm/init.lua", + }; + for (size_t i = 0; i < ARRAY_SZ(paths); ++i) { + char const *p = paths[i]; + struct stat s; + if (stat(p, &s) == 0) + return p; + } + return NULL; +} + +static int dupstr(char const *s, char **out) +{ + if (!s) { + *out = NULL; + return 0; + } + size_t n = strlen(s) + 1; + char *m = (char *)malloc(n); + if (!m) + return -1; + memcpy(m, s, n); + *out = m; + return 0; +} + +static uint32_t mod_from_token(char const *t) +{ + if (!t) + return 0; + if (strcasecmp(t, "Super") == 0) + return WLR_MODIFIER_LOGO; + if (strcasecmp(t, "Shift") == 0) + return WLR_MODIFIER_SHIFT; + if (strcasecmp(t, "Ctrl") == 0 || strcasecmp(t, "Control") == 0) + return WLR_MODIFIER_CTRL; + if (strcasecmp(t, "Alt") == 0) + return WLR_MODIFIER_ALT; + return 0; +} + +static int parse_bind( + char const *bind, uint32_t *mods_out, xkb_keysym_t *sym_out) +{ + if (!bind || !mods_out || !sym_out) + return -1; + + char buf[256]; + strncpy(buf, bind, sizeof buf - 1); + buf[sizeof buf - 1] = 0; + + char *save = NULL; + char *tok = strtok_r(buf, "-", &save); + char *last = tok; + while (tok) { + last = tok; + tok = strtok_r(NULL, "-", &save); + } + + strncpy(buf, bind, sizeof buf - 1); + buf[sizeof buf - 1] = 0; + save = NULL; + + uint32_t mods = 0; + for (char *t = strtok_r(buf, "-", &save); t; + t = strtok_r(NULL, "-", &save)) { + if (t == last) + break; + mods |= mod_from_token(t); + } + + int flags = XKB_KEYSYM_CASE_INSENSITIVE; + xkb_keysym_t sym = xkb_keysym_from_name(last, flags); + if (sym == XKB_KEY_NoSymbol) + return -1; + + *mods_out = mods; + *sym_out = sym; + return 0; +} + +static int push_config_table_from_idx(lua_State *L, int idx_abs) +{ + if (!lua_istable(L, idx_abs)) + return luaL_error(L, "config: expected table at index %d", idx_abs); + lua_pushvalue(L, idx_abs); + return 0; +} + +static int join_string_array(lua_State *L, int idx_abs, char **out) +{ + *out = NULL; + if (!lua_istable(L, idx_abs)) + return 0; + + size_t n = (size_t)lua_rawlen(L, idx_abs); + if (n == 0) + return 0; + + size_t total = 1; + for (size_t i = 1; i <= n; ++i) { + lua_rawgeti(L, idx_abs, (lua_Integer)i); + size_t len = 0; + (void)lua_tolstring(L, -1, &len); + total += len + (i < n ? 1 : 0); + lua_pop(L, 1); + } + + char *buf = (char *)malloc(total); + if (!buf) + return -1; + + size_t off = 0; + for (size_t i = 1; i <= n; ++i) { + lua_rawgeti(L, idx_abs, (lua_Integer)i); + size_t len = 0; + char const *s = lua_tolstring(L, -1, &len); + if (!s) { + lua_pop(L, 1); + free(buf); + return -1; + } + memcpy(buf + off, s, len); + off += len; + lua_pop(L, 1); + if (i != n) + buf[off++] = ','; + } + buf[off] = 0; + *out = buf; + return 0; +} + +int config_load_ref(lua_State *L, int idx, Config *out) +{ + if (!L || !out) + return -1; + + memset(out, 0, sizeof(*out)); + + // ======== DEFAULTS ======== + out->space.offset = (Vector3) { 0, 0, 0 }; + out->space.radius = 1.0f; + out->space.window_scale = 0.001f; + out->displays.hud.size = 720; + out->displays.hud.font_size = 24; + out->displays.virtual.resolution = (Vector2) { 2560, 1440 }; + out->xwayland.enabled = true; + out->xwayland.lazy = false; + out->input.mouse.invert_x = false; + out->input.mouse.invert_y = false; + // ====== END DEFAULTS ====== + + int cfg_abs = lua_absindex(L, idx); + if (push_config_table_from_idx(L, cfg_abs) != 0) + return -1; + + lua_getfield(L, -1, "keybindings"); + if (!lua_istable(L, -1)) { + lua_pop(L, 2); + return luaL_error(L, "config: 'keybindings' must be a table (array)"); + } + + size_t n = (size_t)lua_rawlen(L, -1); + if (n) { + BindingRef *arr = (BindingRef *)calloc(n, sizeof(*arr)); + if (!arr) { + lua_pop(L, 2); + return luaL_error(L, "config: OOM"); + } + + size_t ok = 0; + for (size_t i = 0; i < n; ++i) { + lua_rawgeti(L, -1, (lua_Integer)(i + 1)); + if (!lua_istable(L, -1)) { + lua_pop(L, 1); + continue; + } + + lua_getfield(L, -1, "bind"); + char const *bind = lua_tostring(L, -1); + if (!bind) { + lua_pop(L, 2); + continue; + } + + uint32_t mods = 0; + xkb_keysym_t sym = XKB_KEY_NoSymbol; + if (parse_bind(bind, &mods, &sym) != 0) { + lua_pop(L, 2); + continue; + } + + lua_getfield(L, -2, "action"); + if (!lua_isfunction(L, -1)) { + lua_pop(L, 3); + continue; + } + + int ref = luaL_ref(L, LUA_REGISTRYINDEX); + lua_pop(L, 1); + + arr[ok].mods_mask = mods; + arr[ok].sym = sym; + arr[ok].action_ref = ref; + ++ok; + + lua_pop(L, 1); + } + + if (ok == 0) { + free(arr); + } else if (ok < n) { + BindingRef *shr = (BindingRef *)realloc(arr, ok * sizeof(*shr)); + if (shr) + arr = shr; + } + + out->keybindings.items = ok ? arr : NULL; + out->keybindings.count = ok; + } + lua_pop(L, 1); + + lua_getfield(L, -1, "input"); + if (lua_istable(L, -1)) { + lua_getfield(L, -1, "keyboard"); + if (lua_istable(L, -1)) { + lua_getfield(L, -1, "xkb_options"); + if (lua_istable(L, -1)) { + (void)join_string_array( + L, lua_absindex(L, -1), &out->input.keyboard.xkb_options); + } + lua_pop(L, 1); + } + lua_pop(L, 1); + + lua_getfield(L, -1, "mouse"); + if (lua_istable(L, -1)) { + lua_getfield(L, -1, "invert_x"); + if (lua_isboolean(L, -1)) + out->input.mouse.invert_x = lua_toboolean(L, -1); + lua_pop(L, 1); + + lua_getfield(L, -1, "invert_y"); + if (lua_isboolean(L, -1)) + out->input.mouse.invert_y = lua_toboolean(L, -1); + lua_pop(L, 1); + } + lua_pop(L, 1); + } + lua_pop(L, 1); + + lua_getfield(L, -1, "space"); + if (lua_istable(L, -1)) { + lua_getfield(L, -1, "offset"); + if (lua_istable(L, -1) || lua_isuserdata(L, -1)) + out->space.offset = lua_readVector3(L, lua_absindex(L, -1)); + lua_pop(L, 1); + + lua_getfield(L, -1, "radius"); + if (lua_isnumber(L, -1)) + out->space.radius = (float)lua_tonumber(L, -1); + lua_pop(L, 1); + + lua_getfield(L, -1, "window_scale"); + if (lua_isnumber(L, -1)) + out->space.window_scale = (float)lua_tonumber(L, -1); + lua_pop(L, 1); + } + lua_pop(L, 1); + + lua_getfield(L, -1, "xwayland"); + if (lua_istable(L, -1)) { + lua_getfield(L, -1, "enabled"); + if (lua_isboolean(L, -1)) + out->xwayland.enabled = lua_toboolean(L, -1); + lua_pop(L, 1); + + lua_getfield(L, -1, "lazy"); + if (lua_isboolean(L, -1)) + out->xwayland.lazy = lua_toboolean(L, -1); + lua_pop(L, 1); + } + lua_pop(L, 1); + + lua_getfield(L, -1, "displays"); + if (lua_istable(L, -1)) { + lua_getfield(L, -1, "hud"); + if (lua_istable(L, -1)) { + lua_getfield(L, -1, "size"); + if (lua_isnumber(L, -1)) + out->displays.hud.size = (float)lua_tonumber(L, -1); + lua_pop(L, 1); + + lua_getfield(L, -1, "font_size"); + if (lua_isnumber(L, -1)) + out->displays.hud.font_size = (float)lua_tonumber(L, -1); + lua_pop(L, 1); + } + lua_pop(L, 1); + + lua_getfield(L, -1, "virtual"); + if (lua_istable(L, -1)) { + lua_getfield(L, -1, "resolution"); + if (lua_istable(L, -1) || lua_isuserdata(L, -1)) + out->displays.virtual.resolution + = lua_readVector2(L, lua_absindex(L, -1)); + lua_pop(L, 1); + } + lua_pop(L, 1); + } + lua_pop(L, 1); + + lua_getfield(L, -1, "cubemap"); + if (lua_isstring(L, -1)) { + char const *s = lua_tostring(L, -1); + if (s && s[0]) { + (void)dupstr(s, (char **)&out->cubemap); + } + } + lua_pop(L, 1); + + lua_pop(L, 1); + return 0; +} + +void config_unref(lua_State *L, Config *cfg) +{ + if (!cfg) + return; + + for (size_t i = 0; i < cfg->keybindings.count; ++i) { + int r = cfg->keybindings.items ? cfg->keybindings.items[i].action_ref + : LUA_NOREF; + if (r != LUA_NOREF && r != LUA_REFNIL) + luaL_unref(L, LUA_REGISTRYINDEX, r); + } + free(cfg->keybindings.items); + cfg->keybindings.items = NULL; + cfg->keybindings.count = 0; + + free(cfg->input.keyboard.xkb_options); + cfg->input.keyboard.xkb_options = NULL; + + if (cfg->cubemap) { + free((void *)cfg->cubemap); + cfg->cubemap = NULL; + } +} + +void config_trigger_ref(lua_State *L, Config *cfg, int ref) +{ + lua_rawgeti(L, LUA_REGISTRYINDEX, ref); + if (!lua_isfunction(L, -1)) { + lua_pop(L, 1); + return; + } + + if (lua_pcall(L, 0, 0, 0) != LUA_OK) { + fprintf(stderr, "config: action error: %s\n", lua_tostring(L, -1)); + lua_pop(L, 1); + return; + } +} + +static int load_config_file(lua_State *L, char const *path) +{ + if (!path || !path[0]) + return -1; + + if (luaL_loadfile(L, path) != LUA_OK) { + char const *err = lua_tostring(L, -1); + fprintf( + stderr, "config: loadfile failed: %s\n", err ? err : "(unknown)"); + lua_pop(L, 1); + return -1; + } + if (lua_pcall(L, 0, 1, 0) != LUA_OK) { + char const *err = lua_tostring(L, -1); + fprintf(stderr, "config: executing '%s' failed: %s\n", path, + err ? err : "(unknown)"); + lua_pop(L, 1); + return -1; + } + if (!lua_istable(L, -1)) { + lua_pop(L, 1); + fprintf(stderr, "config: '%s' did not return a table\n", path); + return -1; + } + return 0; +} + +ConfigManager *config_manager_create(char const *path) +{ + ConfigManager *cm = (ConfigManager *)calloc(1, sizeof(*cm)); + if (!cm) + return NULL; + + cm->L = luaL_newstate(); + if (!cm->L) { + free(cm); + return NULL; + } + luaL_openlibs(cm->L); + + if (!path) + path = get_config_path(); + if (path && dupstr(path, &cm->path) != 0) { + lua_close(cm->L); + free(cm); + return NULL; + } + + return cm; +} + +void config_manager_destroy(ConfigManager *cm) +{ + if (!cm) + return; + config_unref(cm->L, &cm->cfg); + if (cm->L) + lua_close(cm->L); + free(cm->path); + free(cm); +} + +int config_manager_reload(ConfigManager *cm) +{ + if (!cm || !cm->path) + return -1; + + config_unref(cm->L, &cm->cfg); + + if (load_config_file(cm->L, cm->path) != 0) + return -1; + + int rc = config_load_ref(cm->L, -1, &cm->cfg); + lua_pop(cm->L, 1); + if (rc != 0) + return rc; + + if (cm->cfg.cubemap && cm->cfg.cubemap[0] != '/') { + char const *slash = strrchr(cm->path, '/'); + char const *dir = "."; + size_t dirlen = 1; + if (slash) { + dir = cm->path; + dirlen = (size_t)(slash - cm->path); + } + size_t n = dirlen + 1 + strlen(cm->cfg.cubemap) + + 1; // dir + '/' + hdri + '\0' + char *full = (char *)malloc(n); + if (full) { + memcpy(full, dir, dirlen); + full[dirlen] = '/'; + strcpy(full + dirlen + 1, cm->cfg.cubemap); + free((void *)cm->cfg.cubemap); + cm->cfg.cubemap = full; + } + } + + return 0; +} + +lua_State *config_manager_lua(ConfigManager *cm) { return cm ? cm->L : NULL; } +Config const *config_manager_get(ConfigManager *cm) +{ + return cm ? &cm->cfg : NULL; +} +char const *config_manager_path(ConfigManager *cm) +{ + return cm ? cm->path : NULL; +} diff --git a/src/Config.h b/src/Config.h new file mode 100644 index 0000000..6bcad21 --- /dev/null +++ b/src/Config.h @@ -0,0 +1,79 @@ +#ifndef CONFIG_H +#define CONFIG_H + +#include + +#include +#include + +#include + +typedef struct { + xkb_keysym_t sym; + uint32_t mods_mask; + int action_ref; +} BindingRef; + +typedef struct { + struct { + struct { + char *xkb_options; + } keyboard; + struct { + bool invert_x; + bool invert_y; + } mouse; + } input; + + struct { + BindingRef *items; + size_t count; + } keybindings; + + struct { + Vector3 offset; + float radius; + float window_scale; + } space; + + struct { + bool enabled; + bool lazy; + } xwayland; + + struct { + struct { + int size; + float font_size; + } hud; + struct { + Vector2 resolution; + } virtual; + } displays; + + char const *cubemap; +} Config; + +char const *get_config_path(void); + +int config_load_ref(lua_State *L, int idx, Config *out); +void config_unref(lua_State *L, Config *cfg); +void config_trigger_ref(lua_State *L, Config *cfg, int ref); + +struct ConfigManager { + lua_State *L; + Config cfg; + char *path; +}; +typedef struct ConfigManager ConfigManager; + +ConfigManager *config_manager_create(char const *path); +void config_manager_destroy(ConfigManager *cm); + +int config_manager_reload(ConfigManager *cm); + +lua_State *config_manager_lua(ConfigManager *cm); +Config const *config_manager_get(ConfigManager *cm); +char const *config_manager_path(ConfigManager *cm); + +#endif // CONFIG_H diff --git a/src/LunarWM.h b/src/LunarWM.h new file mode 100644 index 0000000..9d1dd61 --- /dev/null +++ b/src/LunarWM.h @@ -0,0 +1,7 @@ +#ifndef LUNAR_WM_H +#define LUNAR_WM_H + +#include "LunarWM_core.h" +#include "LunarWM_types.h" + +#endif diff --git a/src/LunarWM_core.c b/src/LunarWM_core.c new file mode 100644 index 0000000..7b138c1 --- /dev/null +++ b/src/LunarWM_core.c @@ -0,0 +1,434 @@ +#include "LunarWM_core.h" + +#include "LunarWM_render.h" +#include "LunarWM_wayland.h" +#include "LunarWM_xr.h" +#include "RayExt.h" +#include "common.h" +#include "vec.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +extern char **environ; + +static void cleanup_raylib_egl(LunarWM *wm) +{ + if (IsWindowReady()) { + CloseWindow(); + } +} + +static void cleanup_lua_cfg(LunarWM *wm) +{ + if (wm->cman) { + config_manager_destroy(wm->cman); + wm->cman = NULL; + } +} + +void LunarWM_set_recenter_from_camera(LunarWM *wm) +{ + Vector3 pos = wm->renderer.camera.position; + Vector3 fwd + = Vector3Normalize(Vector3Subtract(wm->renderer.camera.target, pos)); + + float len_xz = sqrtf(fwd.x * fwd.x + fwd.z * fwd.z); + float yaw = (len_xz > 1e-6f) ? atan2f(fwd.x, fwd.z) : 0.0f; + + Quaternion q_step = QuaternionFromAxisAngle((Vector3) { 0, 1, 0 }, -yaw); + Vector3 t_step = Vector3Negate(Vector3RotateByQuaternion(pos, q_step)); + + Quaternion q_total = QuaternionMultiply(q_step, wm->xr.recenter_rot); + Vector3 t_total = Vector3Add( + Vector3RotateByQuaternion(wm->xr.recenter_trans, q_step), t_step); + + wm->xr.recenter_rot = q_total; + wm->xr.recenter_trans = t_total; + wm->xr.recenter_active = true; +} + +static void sync_config(LunarWM *wm) +{ + if (wm->cman->cfg.cubemap) { + Skybox_init(&wm->renderer.skybox, wm->cman->cfg.cubemap); + } else { + Skybox_destroy(&wm->renderer.skybox); + } + + if (IsTextureValid(wm->renderer.hud_rt.texture)) { + UnloadTexture(wm->renderer.hud_rt.texture); + wm->renderer.hud_rt.texture.id = 0; + wm->renderer.hud_rt.texture.width = 0; + wm->renderer.hud_rt.texture.height = 0; + } + + int vw = (int)wm->cman->cfg.displays.virtual.resolution.x; + int vh = (int)wm->cman->cfg.displays.virtual.resolution.y; + int hud = wm->cman->cfg.displays.hud.size; + + LunarWM_wayland_update_virtual_outputs(wm, vw, vh, hud); +} + +static int l_exec(lua_State *L) +{ + char const *cmd = luaL_checkstring(L, 1); + + pid_t pid; + char *argv[] = { (char *)"sh", (char *)"-c", (char *)cmd, NULL }; + + int rc = posix_spawnp(&pid, "sh", NULL, NULL, argv, environ); + if (rc != 0) { + lua_pushnil(L); + lua_pushfstring(L, "posix_spawnp failed: %s", strerror(rc)); + return 2; + } + + lua_pushinteger(L, (lua_Integer)pid); + return 1; +} + +static int l_cycle_next(lua_State *L) +{ + LunarWM *wm = &g_wm; + if (vector_size(wm->wayland.v_toplevels) == 0) { + lua_pushnil(L); + return 1; + } + + wm->wayland.current_focus++; + if (wm->wayland.current_focus >= vector_size(wm->wayland.v_toplevels)) { + wm->wayland.current_focus = 0; + } + + LunarWM_Toplevel *tl = wm->wayland.v_toplevels[wm->wayland.current_focus]; + LunarWM_Toplevel_focus(tl); + + lua_pushnil(L); + return 1; +} + +static int l_recenter(lua_State *L) +{ + (void)L; + + LunarWM_set_recenter_from_camera(&g_wm); + + lua_pushnil(L); + return 1; +} + +static int l_reload_config(lua_State *L) +{ + LunarWM *wm = &g_wm; + ConfigManager *cm = wm->cman; + if (!cm) { + lua_pushnil(L); + return 1; + } + + config_manager_reload(cm); + sync_config(wm); + lua_pushnil(L); + return 1; +} + +static int l_quit_compositor(lua_State *L) +{ + (void)L; + LunarWM_terminate(&g_wm); + lua_pushnil(L); + return 1; +} + +bool LunarWM_init(LunarWM *wm) +{ + memset(wm, 0, sizeof(*wm)); + wm->xr.session = XR_NULL_HANDLE; + wm->xr.session_state = XR_SESSION_STATE_UNKNOWN; + wm->xr.environment_blend_mode = XR_ENVIRONMENT_BLEND_MODE_MAX_ENUM; + wm->xr.local_space = wm->xr.view_space = XR_NULL_HANDLE; + wm->xr.hand_tracking_system_properties.type + = XR_TYPE_SYSTEM_HAND_TRACKING_PROPERTIES_EXT; + wm->xr.hand_tracking_system_properties.next = NULL; + wm->xr.hand_tracking_system_properties.supportsHandTracking = XR_FALSE; + wm->xr.hand_tracking_enabled = false; + wm->renderer.camera.position = (Vector3) { 0, 0, 0 }; + wm->renderer.camera.target = (Vector3) { 0, 0, 1 }; + wm->renderer.camera.up = (Vector3) { 0, 1, 0 }; + wm->renderer.camera.fovy = 45; + wm->renderer.camera.projection = CAMERA_PERSPECTIVE; + wm->xr.recenter_rot = (Quaternion) { 0, 0, 0, 1 }; + wm->xr.recenter_trans = (Vector3) { 0, 0, 0 }; + wm->xr.recenter_active = false; + wm->counter = 0; + + wm->wm.active_workspace = 0; + for (size_t i = 0; i < ARRAY_SZ(wm->wm.workspaces); i++) { + wm->wm.workspaces[i].v_windows = vector_create(); + } + + wm->cman = config_manager_create(get_config_path()); + assert(wm->cman); + + { + lua_State *L = wm->cman->L; + + lua_newtable(L); + lua_pushcfunction(L, l_quit_compositor); + lua_setfield(L, -2, "quit_compositor"); + lua_pushcfunction(L, l_reload_config); + lua_setfield(L, -2, "reload_config"); + lua_pushcfunction(L, l_recenter); + lua_setfield(L, -2, "recenter"); + lua_pushcfunction(L, l_cycle_next); + lua_setfield(L, -2, "cycle_next"); + lua_pushcfunction(L, l_exec); + lua_setfield(L, -2, "exec"); + lua_setglobal(L, "lunar"); + + config_manager_reload(wm->cman); + } + + // if (getenv("DISPLAY") != NULL || getenv("WAYLAND_DISPLAY") != NULL) { + // wlr_log(WLR_ERROR, "This compositor can only be ran in DRM mode."); + // return false; + // } + + if (!LunarWM_wayland_init(wm)) { + wlr_log(WLR_ERROR, "Failed to initialize wlroots"); + return false; + } + + EGLSurface draw = eglGetCurrentSurface(EGL_DRAW); + EGLSurface read = eglGetCurrentSurface(EGL_READ); + if (eglMakeCurrent(wm->wayland.egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, + wm->wayland.egl_context) + == EGL_FALSE) { + wlr_log(WLR_ERROR, "Failed to eglMakeCurrent"); + return false; + } + + wm->xr.available = false; + { + char *no_xr = getenv("LWM_NO_XR"); + bool xr = true; + + if (no_xr != NULL && no_xr[0] != '\0') + xr = false; + + if (xr) { + if (!LunarWM_xr_init(wm)) { + wlr_log( + WLR_ERROR, "Failed to initialize OpenXR! Disabling XR..."); + LunarWM_xr_cleanup(wm); + } else { + wm->xr.available = true; + } + } + } + + wlr_log(WLR_INFO, "OpenGL ES version: %s", glGetString(GL_VERSION)); + InitWindow(0, 0, ""); + + if (eglMakeCurrent( + wm->wayland.egl_display, draw, read, wm->wayland.egl_context) + == EGL_FALSE) { + wlr_log(WLR_ERROR, "Failed to eglMakeCurrent"); + return false; + } + + sync_config(wm); + + wm->initialized = true; + + return true; +} + +void LunarWM_destroy(LunarWM *wm) +{ + if (!wm) + return; + + eglMakeCurrent(wm->wayland.egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, + wm->wayland.egl_context); + + LunarWM_xr_cleanup(wm); + cleanup_raylib_egl(wm); + LunarWM_wayland_cleanup(wm); + cleanup_lua_cfg(wm); + + memset(wm, 0, sizeof(*wm)); +} + +void LunarWM_terminate(LunarWM *wm) +{ + wlr_log(WLR_INFO, "Stopping compositor"); + wm->running = false; +} + +void LunarWM_run(LunarWM *wm) +{ + assert(wm); + assert(wm->initialized); + + wm->renderer.first_frame = true; + + if (!wlr_backend_start(wm->wayland.backend)) { + wlr_log(WLR_ERROR, "Failed to start backend"); + return; + } + + char const *socket = wl_display_add_socket_auto(wm->wayland.display); + if (socket == NULL) { + wlr_log(WLR_ERROR, "Failed to add wayland socket to display"); + return; + } + + setenv("WAYLAND_DISPLAY", socket, 1); + wlr_log(LOG_INFO, "Running on WAYLAND_DISPLAY=%s", socket); + + wm->running = true; + + struct timespec last, now; + clock_gettime(CLOCK_MONOTONIC, &last); + while (wm->running) { + clock_gettime(CLOCK_MONOTONIC, &now); + float dt = (now.tv_sec - last.tv_sec) + + (now.tv_nsec - last.tv_nsec) / 1000000000.0f; + last = now; + + for (size_t i = 0; i < vector_size(wm->wayland.v_toplevels); i++) { + LunarWM_Toplevel *tl = wm->wayland.v_toplevels[i]; + if (tl->surface) { + wlr_surface_send_frame_done(tl->surface, &now); + } + } + + wl_display_flush_clients(wm->wayland.display); + wl_event_loop_dispatch(wm->wayland.event_loop, 0); + + EGLSurface draw = eglGetCurrentSurface(EGL_DRAW); + EGLSurface read = eglGetCurrentSurface(EGL_READ); + if (eglMakeCurrent(wm->wayland.egl_display, EGL_NO_SURFACE, + EGL_NO_SURFACE, wm->wayland.egl_context) + == EGL_FALSE) { + wlr_log(WLR_ERROR, "Failed to eglMakeCurrent"); + return; + } + + WindowShouldClose(); + BeginDrawing(); + + if (wm->xr.available) { + LunarWM_xr_poll_events(wm); + + if (!wm->xr.session_running) { + EndDrawing(); + continue; + } + + XrFrameState frame_state = { + .type = XR_TYPE_FRAME_STATE, + }; + XrFrameWaitInfo frame_wait_info = { + .type = XR_TYPE_FRAME_WAIT_INFO, + }; + if (xrWaitFrame(wm->xr.session, &frame_wait_info, &frame_state) + != XR_SUCCESS) { + wlr_log(WLR_ERROR, "Failed to wait for OpenXR frame"); + return; + } + + XrFrameBeginInfo frame_begin_info = { + .type = XR_TYPE_FRAME_BEGIN_INFO, + }; + XrResult res = xrBeginFrame(wm->xr.session, &frame_begin_info); + if (res != XR_FRAME_DISCARDED && res != XR_SUCCESS) { + wlr_log(WLR_ERROR, "Failed to begin the OpenXR Frame: %d", res); + return; + } + + if (wm->xr.hand_tracking_enabled) { + for (size_t i = 0; i < 2; i++) { + LunarWM_Hand *hand = &wm->xr.hands[i]; + bool const unobstructed = true; + if (!wm->xr.LocateHandJointsEXT + || hand->hand_tracker == XR_NULL_HANDLE) { + continue; + } + + XrHandJointsMotionRangeInfoEXT mri = { + .type = XR_TYPE_HAND_JOINTS_MOTION_RANGE_INFO_EXT, + }; + mri.handJointsMotionRange = unobstructed + ? XR_HAND_JOINTS_MOTION_RANGE_UNOBSTRUCTED_EXT + : XR_HAND_JOINTS_MOTION_RANGE_CONFORMING_TO_CONTROLLER_EXT; + + XrHandJointsLocateInfoEXT li = { + .type = XR_TYPE_HAND_JOINTS_LOCATE_INFO_EXT, + .next = &mri, + .baseSpace = wm->xr.local_space, + .time = frame_state.predictedDisplayTime, + }; + + XrHandJointLocationsEXT hji = { + .type = XR_TYPE_HAND_JOINT_LOCATIONS_EXT, + .jointCount = XR_HAND_JOINT_COUNT_EXT, + .jointLocations = hand->joint_locations, + }; + + if (wm->xr.LocateHandJointsEXT( + hand->hand_tracker, &li, &hji) + != XR_SUCCESS) { + wlr_log(WLR_ERROR, "Failed to locate hand joints"); + return; + } + } + } + + LunarWM_RenderLayerInfo render_layer_info = { + .predicted_display_time = frame_state.predictedDisplayTime, + .layer_projection.type = XR_TYPE_COMPOSITION_LAYER_PROJECTION, + }; + bool const session_active + = (wm->xr.session_state == XR_SESSION_STATE_SYNCHRONIZED) + || (wm->xr.session_state == XR_SESSION_STATE_VISIBLE) + || (wm->xr.session_state == XR_SESSION_STATE_FOCUSED); + if (session_active && (frame_state.shouldRender != 0u)) { + bool rendered + = LunarWM_render_layer(wm, &render_layer_info, dt); + if (rendered) { + render_layer_info.layers[render_layer_info.layers_count] + = (XrCompositionLayerBaseHeader *)&render_layer_info + .layer_projection; + } + } + + XrFrameEndInfo frame_end_info = { + .type = XR_TYPE_FRAME_END_INFO, + .displayTime = frame_state.predictedDisplayTime, + .environmentBlendMode = wm->xr.environment_blend_mode, + .layerCount = render_layer_info.layers_count, + .layers = (XrCompositionLayerBaseHeader const **) + render_layer_info.layers, + }; + if (xrEndFrame(wm->xr.session, &frame_end_info) != XR_SUCCESS) { + wlr_log(WLR_ERROR, "Failed to end OpenXR frame"); + return; + } + + EndDrawing(); + } else { + wm->renderer.camera.fovy = 75; + } + } +} diff --git a/src/LunarWM_core.h b/src/LunarWM_core.h new file mode 100644 index 0000000..7fd17b3 --- /dev/null +++ b/src/LunarWM_core.h @@ -0,0 +1,14 @@ +#ifndef LUNAR_WM_CORE_H +#define LUNAR_WM_CORE_H + +#include "LunarWM_types.h" + +bool LunarWM_init(LunarWM *wm); +void LunarWM_destroy(LunarWM *wm); +void LunarWM_terminate(LunarWM *wm); +void LunarWM_run(LunarWM *wm); +void LunarWM_set_recenter_from_camera(LunarWM *wm); + +extern LunarWM g_wm; + +#endif diff --git a/src/LunarWM_render.c b/src/LunarWM_render.c new file mode 100644 index 0000000..deb1ae8 --- /dev/null +++ b/src/LunarWM_render.c @@ -0,0 +1,675 @@ +#include "LunarWM_render.h" + +#include "LunarWM_core.h" +#include "LunarWM_xr.h" +#include "common.h" +#include "vec.h" + +#include +#include +#include +#include + +static inline SphericalCoord get_forward_spherical_with_nearest( + Vector3 fwd, float r) +{ + if (fabs(fwd.y) < 0.2f) { + fwd.y = 0; + } + Vector3 vec = Vector3Scale(Vector3Normalize(fwd), r); + return Vector3ToSpherical(vec); +} + +static inline Matrix xr_matrix(XrPosef const pose) +{ + Matrix const translation + = MatrixTranslate(pose.position.x, pose.position.y, pose.position.z); + Matrix const rotation = QuaternionToMatrix((Quaternion) { + pose.orientation.x, + pose.orientation.y, + pose.orientation.z, + pose.orientation.w, + }); + return MatrixMultiply(rotation, translation); +} + +static inline Matrix xr_projection_matrix(XrFovf const fov) +{ + static_assert(RL_CULL_DISTANCE_FAR > RL_CULL_DISTANCE_NEAR); + + Matrix matrix = {}; + + auto const near = (float)RL_CULL_DISTANCE_NEAR; + auto const far = (float)RL_CULL_DISTANCE_FAR; + + float const tan_angle_left = tanf(fov.angleLeft); + float const tan_angle_right = tanf(fov.angleRight); + + float const tan_angle_down = tanf(fov.angleDown); + float const tan_angle_up = tanf(fov.angleUp); + + float const tan_angle_width = tan_angle_right - tan_angle_left; + float const tan_angle_height = tan_angle_up - tan_angle_down; + + matrix.m0 = 2 / tan_angle_width; + matrix.m4 = 0; + matrix.m8 = (tan_angle_right + tan_angle_left) / tan_angle_width; + matrix.m12 = 0; + + matrix.m1 = 0; + matrix.m5 = 2 / tan_angle_height; + matrix.m9 = (tan_angle_up + tan_angle_down) / tan_angle_height; + matrix.m13 = 0; + + matrix.m2 = 0; + matrix.m6 = 0; + matrix.m10 = -(far + near) / (far - near); + matrix.m14 = -(far * (near + near)) / (far - near); + + matrix.m3 = 0; + matrix.m7 = 0; + matrix.m11 = -1; + matrix.m15 = 0; + + return matrix; +} + +static void DrawBillboardNoShear( + Camera3D const cam, Texture2D tex, Vector3 pos, float scale, Color tint) +{ + Rectangle const src = { 0, 0, tex.width, tex.height }; + + Vector2 const size = { scale * fabsf(src.width / src.height), -scale }; + Vector2 const origin = { size.x * 0.5f, size.y * 0.5f }; + + DrawBillboardPro(cam, tex, src, pos, cam.up, size, origin, 0.0f, tint); +} + +void DrawTextureCyl( + Texture2D tex, Vector3 center, float radius, float scale, bool y_flip) +{ + if (!tex.id || scale <= 0.0f || radius == 0.0f) + return; + + float r = fabsf(radius); + float arc_len = (float)tex.width * scale; // arc length in world units + float theta = arc_len / r; // radians across the panel + float half_t = 0.5f * theta; + float half_h = 0.5f * (float)tex.height * scale; + + // mid-angle around Y so the segment's middle sits at 'center' + float a0 = atan2f(center.x, center.z); + + // shift so the cylinder surface midpoint matches 'center' + Vector3 mid_ref = (Vector3) { sinf(a0) * r, center.y, cosf(a0) * r }; + Vector3 delta = Vector3Subtract(center, mid_ref); + + // tessellation: about 3° per slice (min 8) + int slices = (int)ceilf(fmaxf(theta * (180.0f / PI) / 3.0f, 8.0f)); + if (slices > 1024) + slices = 1024; + + float vt = y_flip ? 1.0f : 0.0f; + float vb = y_flip ? 0.0f : 1.0f; + + rlDrawRenderBatchActive(); // flush any prior state + rlSetTexture(tex.id); + rlDisableBackfaceCulling(); + rlColor4ub(255, 255, 255, 255); + rlBegin(RL_QUADS); + + for (int i = 0; i < slices; ++i) { + float u0 = (float)i / (float)slices; + float u1 = (float)(i + 1) / (float)slices; + + float aL = a0 - half_t + theta * u0; + float aR = a0 - half_t + theta * u1; + + Vector3 nL = (Vector3) { sinf(aL), 0.0f, cosf(aL) }; + Vector3 nR = (Vector3) { sinf(aR), 0.0f, cosf(aR) }; + if (radius < 0.0f) { + nL = Vector3Negate(nL); + nR = Vector3Negate(nR); + } + + Vector3 pLT = Vector3Add( + (Vector3) { nL.x * r, center.y + half_h, nL.z * r }, delta); + Vector3 pLB = Vector3Add( + (Vector3) { nL.x * r, center.y - half_h, nL.z * r }, delta); + Vector3 pRT = Vector3Add( + (Vector3) { nR.x * r, center.y + half_h, nR.z * r }, delta); + Vector3 pRB = Vector3Add( + (Vector3) { nR.x * r, center.y - half_h, nR.z * r }, delta); + + // match your flat-quad U flip (so WL textures look correct) + float U0 = 1.0f - u0; + float U1 = 1.0f - u1; + + // one normal per-vertex (simple cylindrical) + rlNormal3f(nL.x, nL.y, nL.z); + rlTexCoord2f(U0, vt); + rlVertex3f(pLT.x, pLT.y, pLT.z); + rlNormal3f(nR.x, nR.y, nR.z); + rlTexCoord2f(U1, vt); + rlVertex3f(pRT.x, pRT.y, pRT.z); + rlNormal3f(nR.x, nR.y, nR.z); + rlTexCoord2f(U1, vb); + rlVertex3f(pRB.x, pRB.y, pRB.z); + rlNormal3f(nL.x, nL.y, nL.z); + rlTexCoord2f(U0, vb); + rlVertex3f(pLB.x, pLB.y, pLB.z); + } + + rlEnd(); + rlSetTexture(0); + rlEnableBackfaceCulling(); +} + +static void DrawTextureCyl2(Texture2D tex, Vector3 sphere_center, + SphericalCoord coord, float rad, float scale, bool y_flip) +{ + if (!tex.id || scale <= 0.0f || rad == 0.0f) + return; + + // midpoint on the sphere where the panel should sit (its center) + Vector3 fwd = SphericalToVector3(coord); + if (Vector3Length(fwd) < 1e-6f) + fwd = (Vector3) { 0, 0, 1 }; + fwd = Vector3Normalize(fwd); + + // build a local tangent frame at that point (right, up, forward) + Vector3 worldUp = (Vector3) { 0, 1, 0 }; + if (fabsf(Vector3DotProduct(worldUp, fwd)) > 0.99f) + worldUp = (Vector3) { 1, 0, 0 }; + Vector3 right = Vector3Normalize(Vector3CrossProduct(worldUp, fwd)); + Vector3 up = Vector3Normalize(Vector3CrossProduct(fwd, right)); + + float r = fabsf(rad); + float arc_len = (float)tex.width * scale; // world units across + float theta = arc_len / r; // total horizontal FOV in radians + float half_t = 0.5f * theta; + float half_h = 0.5f * (float)tex.height * scale; + + // shift so cylinder's surface midpoint lands exactly at coord.r from + // sphere_center + Vector3 delta = Vector3Add(sphere_center, + Vector3Add(Vector3Scale(fwd, coord.r - r), (Vector3) { 0, 0, 0 })); + + // tessellation: about 3° per slice (min 8, max 1024) + int slices = (int)ceilf(fmaxf(theta * (180.0f / PI) / 3.0f, 8.0f)); + if (slices > 1024) + slices = 1024; + + float vt = y_flip ? 1.0f : 0.0f; + float vb = y_flip ? 0.0f : 1.0f; + + rlDrawRenderBatchActive(); + rlSetTexture(tex.id); + rlDisableBackfaceCulling(); + rlColor4ub(255, 255, 255, 255); + rlBegin(RL_QUADS); + + for (int i = 0; i < slices; ++i) { + float u0 = (float)i / (float)slices; + float u1 = (float)(i + 1) / (float)slices; + + float aL = -half_t + theta * u0; + float aR = -half_t + theta * u1; + + // local outward directions on the cylindrical surface + Vector3 nL = Vector3Add( + Vector3Scale(right, sinf(aL)), Vector3Scale(fwd, cosf(aL))); + Vector3 nR = Vector3Add( + Vector3Scale(right, sinf(aR)), Vector3Scale(fwd, cosf(aR))); + + if (rad < 0.0f) { + nL = Vector3Negate(nL); + nR = Vector3Negate(nR); + } + + // surface points (center band), then top/bottom by +/- up*half_h + Vector3 cL = Vector3Add(delta, Vector3Scale(nL, r)); + Vector3 cR = Vector3Add(delta, Vector3Scale(nR, r)); + + Vector3 pLT = Vector3Add(cL, Vector3Scale(up, half_h)); + Vector3 pLB = Vector3Add(cL, Vector3Scale(up, -half_h)); + Vector3 pRT = Vector3Add(cR, Vector3Scale(up, half_h)); + Vector3 pRB = Vector3Add(cR, Vector3Scale(up, -half_h)); + + // match the original horizontal flip so Wayland textures look correct + float U0 = 1.0f - u0; + float U1 = 1.0f - u1; + + rlNormal3f(nL.x, nL.y, nL.z); + rlTexCoord2f(U0, vt); + rlVertex3f(pLT.x, pLT.y, pLT.z); + + rlNormal3f(nR.x, nR.y, nR.z); + rlTexCoord2f(U1, vt); + rlVertex3f(pRT.x, pRT.y, pRT.z); + + rlNormal3f(nR.x, nR.y, nR.z); + rlTexCoord2f(U1, vb); + rlVertex3f(pRB.x, pRB.y, pRB.z); + + rlNormal3f(nL.x, nL.y, nL.z); + rlTexCoord2f(U0, vb); + rlVertex3f(pLB.x, pLB.y, pLB.z); + } + + rlEnd(); + rlSetTexture(0); + rlEnableBackfaceCulling(); +} + +static inline Vector3 RecenterPoint(LunarWM *wm, Vector3 p) +{ + if (!wm->xr.recenter_active) + return p; + return Vector3Add(Vector3RotateByQuaternion(p, wm->xr.recenter_rot), + wm->xr.recenter_trans); +} + +static inline Quaternion RecenterOrient(LunarWM *wm, Quaternion q) +{ + if (!wm->xr.recenter_active) + return q; + return QuaternionMultiply(wm->xr.recenter_rot, q); +} + +static LunarWM_Toplevel *find_toplevel(LunarWM *this, int id) +{ + for (size_t i = 0; i < vector_size(this->wayland.v_toplevels); i++) { + auto *tl = this->wayland.v_toplevels[i]; + if (tl->id == id) + return tl; + } + + return NULL; +} + +void LunarWM_render_hud(LunarWM *this, float /*dt*/, int hud_size) +{ + ClearBackground((Color) { 0, 0, 0, 0 }); + + float const text_size = this->cman->cfg.displays.hud.font_size; + + char const *txt + = TextFormat("WAYLAND_DISPLAY=%s", getenv("WAYLAND_DISPLAY")); + auto txt_w = MeasureText(txt, 24); + DrawText( + txt, hud_size / 2 - txt_w / 2, hud_size - text_size, text_size, WHITE); + + txt = TextFormat("DISPLAY=%s", getenv("DISPLAY")); + txt_w = MeasureText(txt, text_size); + DrawText(txt, hud_size / 2 - txt_w / 2, hud_size - text_size * 2, text_size, + WHITE); + + { + time_t t = time(NULL); + struct tm *tm_info = localtime(&t); + + int hours = tm_info->tm_hour; + int minutes = tm_info->tm_min; + txt = TextFormat("%02d:%02d", hours, minutes); + txt_w = MeasureText(txt, 32); + DrawText(txt, hud_size / 2 - txt_w / 2, 0, text_size, WHITE); + } +} + +void LunarWM_render_windows(LunarWM *this, bool alpha_check) +{ + for (size_t i = 0; i + < vector_size(this->wm.workspaces[this->wm.active_workspace].v_windows); + i++) { + auto *window + = &this->wm.workspaces[this->wm.active_workspace].v_windows[i]; + auto *tl = window->tl; + if (!tl || !tl->surface) { + continue; + } + if (tl->gles_texture) { + if (alpha_check && tl->composed_has_alpha) { + continue; + } + Texture2D tex = tl->rl_texture; + bool y_flip = false; + if (IsRenderTextureValid(tl->surface_rt)) { + tex = tl->surface_rt.texture; + tex.width = tl->rl_texture.width; + tex.height = tl->rl_texture.height; + y_flip = true; + } + if (!tex.id) + continue; + float rad = window->coord.r - 0.01f * (float)i; + DrawTextureCyl2(tex, Vector3Zero(), window->coord, rad, + this->cman->cfg.space.window_scale, y_flip); + } + } +} + +void LunarWM_render_3d(LunarWM *this, float /*dt*/) +{ + LunarWM_render_windows(this, true); + + for (int h = 0; this->xr.hand_tracking_enabled && h < 2; ++h) { + auto *hand_info = &this->xr.hands[h]; + if (hand_info->hand_tracker == XR_NULL_HANDLE) + continue; + for (size_t k = 0; k < XR_HAND_JOINT_COUNT_EXT; ++k) { + auto const *jl = &hand_info->joint_locations[k]; + Vector3 pos = { + jl->pose.position.x, + jl->pose.position.y, + jl->pose.position.z, + }; + pos = RecenterPoint(this, pos); + DrawSphere(pos, jl->radius, (Color) { 255, 0, 0, 255 }); + } + } + + Skybox_draw(this->renderer.skybox, this->renderer.camera.position); + + rlEnableColorBlend(); + rlDisableDepthMask(); // don't write depth + LunarWM_render_windows(this, false); + // TODO: Replace with actual cursor texture. + { // Cursor + rlDrawRenderBatchActive(); + rlDisableDepthTest(); + Vector3 tip = SphericalToVector3(this->wm.pointer); + + Vector3 n = Vector3Normalize( + Vector3Subtract(this->renderer.camera.position, tip)); + Vector3 up_hint = (Vector3) { 0, 1, 0 }; + if (fabsf(Vector3DotProduct(up_hint, n)) > 0.98f) + up_hint = (Vector3) { 1, 0, 0 }; + Vector3 right = Vector3Normalize(Vector3CrossProduct(up_hint, n)); + Vector3 up = Vector3Normalize(Vector3CrossProduct(n, right)); + Vector3 down = Vector3Negate(up); + + float const s = 0.03f; + + Vector3 v1 = tip; + Vector3 v2 = Vector3Add(tip, Vector3Scale(down, s)); + Vector3 v3 = Vector3Add(tip, Vector3Scale(right, s)); + + Vector3 normal = Vector3CrossProduct( + Vector3Subtract(v2, v1), Vector3Subtract(v3, v1)); + if (Vector3DotProduct(normal, n) < 0.0f) { + Vector3 tmp = v2; + v2 = v3; + v3 = tmp; + } + + DrawTriangle3D(v1, v2, v3, RED); + rlDrawRenderBatchActive(); + rlEnableDepthTest(); + } + rlEnableDepthMask(); + + if (IsTextureValid(this->renderer.hud_rt.texture)) { + rlDrawRenderBatchActive(); + rlDisableDepthTest(); + + Vector3 camPos = this->renderer.camera.position; + Vector3 camDir = Vector3Normalize( + Vector3Subtract(this->renderer.camera.target, camPos)); + Vector3 up = this->renderer.camera.up; + Vector3 right = Vector3Normalize(Vector3CrossProduct(camDir, up)); + up = Vector3CrossProduct(right, camDir); + + Vector3 center = Vector3Add(camPos, Vector3Scale(camDir, 0.6f)); + + float heightMeters = 0.10f; + + DrawBillboardNoShear(this->renderer.camera, + this->renderer.hud_rt.texture, center, heightMeters * 5, WHITE); + rlDrawRenderBatchActive(); + + rlEnableDepthTest(); + } +} + +bool LunarWM_render_layer( + LunarWM *this, LunarWM_RenderLayerInfo *info, float dt) +{ + auto const view_count = (uint32_t)this->xr.view_configuration_views_count; + assert(view_count == 2); + + XrView views[2] = {}; + for (int i = 0; i < ARRAY_SZ(views); i++) { + views[i] = (XrView) { + .type = XR_TYPE_VIEW, + }; + } + + XrViewLocateInfo locInfo = { + .type = XR_TYPE_VIEW_LOCATE_INFO, + .viewConfigurationType = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO, + .displayTime = info->predicted_display_time, + .space = this->xr.local_space, + }; + + XrViewState viewState = { .type = XR_TYPE_VIEW_STATE }; + uint32_t located = 0; + if (xrLocateViews( + this->xr.session, &locInfo, &viewState, view_count, &located, views) + != XR_SUCCESS + || located != view_count) { + wlr_log(WLR_ERROR, "Failed to locate views"); + return false; + } + + // acquire swapchain images + auto *color_sc = &this->xr.swapchains.v_color[0]; + auto *depth_sc = &this->xr.swapchains.v_depth[0]; + + uint32_t col_idx = 0; + uint32_t dep_idx = 0; + if (!LunarWM_xr_acquire_wait(color_sc->swapchain, &col_idx) + || !LunarWM_xr_acquire_wait(depth_sc->swapchain, &dep_idx)) { + wlr_log(WLR_ERROR, "Swap-chain acquire failed"); + return false; + } + + GLuint color_tex = LunarWM_xr_get_swapchain_image(this, 0, col_idx); + GLuint depth_tex = LunarWM_xr_get_swapchain_image(this, 1, dep_idx); + + // build FBO + if (this->renderer.fbo == 0u) { + glGenFramebuffers(1, &this->renderer.fbo); + } + glBindFramebuffer(GL_FRAMEBUFFER, this->renderer.fbo); + rlFramebufferAttach(this->renderer.fbo, color_tex, + RL_ATTACHMENT_COLOR_CHANNEL0, RL_ATTACHMENT_TEXTURE2D, 0); + rlFramebufferAttach(this->renderer.fbo, depth_tex, RL_ATTACHMENT_DEPTH, + RL_ATTACHMENT_TEXTURE2D, 0); + assert(rlFramebufferComplete(this->renderer.fbo)); + + uint32_t const eye_w + = this->xr.a_view_configuration_views[0].recommendedImageRectWidth; + uint32_t const eye_h + = this->xr.a_view_configuration_views[0].recommendedImageRectHeight; + + this->renderer.tmp_rt = (RenderTexture2D) { + .id = this->renderer.fbo, + .texture = { color_tex, (int)eye_w * view_count, (int)eye_h, 1, -1 }, + .depth = { depth_tex, (int)eye_w * view_count, (int)eye_h, 1, -1 }, + }; + + // head-space view matrix (matches rlOpenXR) + XrSpaceLocation headLoc = { .type = XR_TYPE_SPACE_LOCATION }; + xrLocateSpace(this->xr.view_space, this->xr.local_space, + info->predicted_display_time, &headLoc); + auto const head_view = MatrixInvert(xr_matrix(headLoc.pose)); + + // per-eye projection + view-offset + Matrix const view_off_l + = MatrixMultiply(xr_matrix(views[0].pose), head_view); + Matrix const view_off_r + = MatrixMultiply(xr_matrix(views[1].pose), head_view); + + Matrix const proj_r = xr_projection_matrix(views[0].fov); + Matrix const proj_l = xr_projection_matrix(views[1].fov); + + int const hud_size = this->cman->cfg.displays.hud.size; + if (!IsTextureValid(this->renderer.hud_rt.texture)) { + this->renderer.hud_rt = LoadRenderTexture(hud_size, hud_size); + } + + if (IsTextureValid(this->renderer.hud_rt.texture)) { + BeginTextureMode(this->renderer.hud_rt); + { + LunarWM_render_hud(this, dt, hud_size); + } + EndTextureMode(); + } + + // draw + + if (!IsTextureValid(this->renderer.main_rt.texture)) { + this->renderer.main_rt = LoadRenderTexture(eye_w * view_count, eye_h); + } + + BeginTextureMode(this->renderer.main_rt); + + rlEnableStereoRender(); + rlSetMatrixProjectionStereo(proj_r, proj_l); + rlSetMatrixViewOffsetStereo(view_off_r, view_off_l); + + glViewport(0, 0, (GLsizei)eye_w * view_count, (GLsizei)eye_h); + rlClearColor(0, 0, 10, 255); + rlClearScreenBuffers(); + + for (int i = 0; i < 1; i++) { + XrTime const time = info->predicted_display_time; + + XrSpaceLocation view_location = { .type = XR_TYPE_SPACE_LOCATION }; + XrResult const result = xrLocateSpace( + this->xr.view_space, this->xr.local_space, time, &view_location); + if (result != XR_SUCCESS) { + break; + } + + if ((view_location.locationFlags & XR_SPACE_LOCATION_POSITION_VALID_BIT) + != 0u) { + auto const pos = view_location.pose.position; + this->renderer.camera.position = (Vector3) { pos.x, pos.y, pos.z }; + } + if ((view_location.locationFlags + & XR_SPACE_LOCATION_ORIENTATION_VALID_BIT) + != 0u) { + auto const rot = view_location.pose.orientation; + auto const forward + = Vector3RotateByQuaternion((Vector3) { 0, 0, -1 }, + (Quaternion) { rot.x, rot.y, rot.z, rot.w }); + auto const up = Vector3RotateByQuaternion((Vector3) { 0, 1, 0 }, + (Quaternion) { rot.x, rot.y, rot.z, rot.w }); + this->renderer.camera.target + = Vector3Add(this->renderer.camera.position, forward); + this->renderer.camera.up = up; + } + + if (this->xr.recenter_active) { + Vector3 pos = this->renderer.camera.position; + Vector3 fwd = Vector3Normalize( + Vector3Subtract(this->renderer.camera.target, pos)); + Vector3 up = this->renderer.camera.up; + + pos = Vector3Add( + Vector3RotateByQuaternion(pos, this->xr.recenter_rot), + this->xr.recenter_trans); + fwd = Vector3RotateByQuaternion(fwd, this->xr.recenter_rot); + up = Vector3RotateByQuaternion(up, this->xr.recenter_rot); + + this->renderer.camera.position = pos; + this->renderer.camera.target = Vector3Add(pos, fwd); + this->renderer.camera.up = up; + } + } + + BeginMode3D(this->renderer.camera); + { + ClearBackground(RED); + LunarWM_render_3d(this, dt); + } + EndMode3D(); + + rlDisableStereoRender(); + EndTextureMode(); + + if (!IsShaderValid(this->renderer.linear_srgb)) { + static char const linear_srgb[] = { +#embed "../assets/linear_srgb.fs" + , 0 + }; + this->renderer.linear_srgb = LoadShaderFromMemory(NULL, linear_srgb); + } + + BeginTextureMode(this->renderer.tmp_rt); + rlDisableColorBlend(); + ClearBackground(BLACK); + BeginShaderMode(this->renderer.linear_srgb); + DrawTexturePro(this->renderer.main_rt.texture, + (Rectangle) { + 0, + 0, + this->renderer.main_rt.texture.width, + -this->renderer.main_rt.texture.height, + }, + (Rectangle) { + 0, + 0, + this->renderer.tmp_rt.texture.width, + this->renderer.tmp_rt.texture.height, + }, + (Vector2) { 0, 0 }, 0, WHITE); + EndShaderMode(); + EndTextureMode(); + rlEnableColorBlend(); + + // release swapchain images + XrSwapchainImageReleaseInfo const ri + = { .type = XR_TYPE_SWAPCHAIN_IMAGE_RELEASE_INFO }; + xrReleaseSwapchainImage(color_sc->swapchain, &ri); + xrReleaseSwapchainImage(depth_sc->swapchain, &ri); + + // fill projection layer + info->layer_projection_views_count = view_count; + + for (uint32_t i = 0; i < view_count; ++i) { + int32_t const xOff = i * eye_w; + auto *pv = &info->layer_projection_views[i]; + pv->pose = views[i].pose; + pv->fov = views[i].fov; + pv->subImage.swapchain = color_sc->swapchain; + pv->subImage.imageRect.offset = (XrOffset2Di) { .x = xOff, .y = 0 }; + pv->subImage.imageRect.extent + = (XrExtent2Di) { .width = eye_w, .height = eye_h }; + pv->subImage.imageArrayIndex = 0; + } + + info->layer_projection = (XrCompositionLayerProjection) { + .type = XR_TYPE_COMPOSITION_LAYER_PROJECTION, + .layerFlags = XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT + | XR_COMPOSITION_LAYER_CORRECT_CHROMATIC_ABERRATION_BIT, + .space = this->xr.local_space, + .viewCount = view_count, + .views = info->layer_projection_views, + }; + + info->layers_count = 0; + info->layers[info->layers_count++] + = (XrCompositionLayerBaseHeader *)&info->layer_projection; + + if (this->renderer.first_frame) { + LunarWM_set_recenter_from_camera(this); + this->renderer.first_frame = false; + this->wm.pointer = get_forward_spherical_with_nearest( + this->renderer.camera.target, this->cman->cfg.space.radius); + } + + return true; +} diff --git a/src/LunarWM_render.h b/src/LunarWM_render.h new file mode 100644 index 0000000..2d7f345 --- /dev/null +++ b/src/LunarWM_render.h @@ -0,0 +1,11 @@ +#ifndef LUNAR_WM_RENDER_H +#define LUNAR_WM_RENDER_H + +#include "LunarWM_types.h" + +void LunarWM_render_hud(LunarWM *wm, float dt, int hud_size); +void LunarWM_render_windows(LunarWM *wm, bool alpha_check); +bool LunarWM_render_layer(LunarWM *wm, LunarWM_RenderLayerInfo *info, float dt); +void LunarWM_render_3d(LunarWM *this, float dt); + +#endif diff --git a/src/LunarWM_types.h b/src/LunarWM_types.h new file mode 100644 index 0000000..3f73015 --- /dev/null +++ b/src/LunarWM_types.h @@ -0,0 +1,293 @@ +#ifndef LUNAR_WM_TYPES_H +#define LUNAR_WM_TYPES_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "Config.h" +#include "RayExt.h" + +struct LunarWM; + +typedef struct { + float r, theta, phi; +} SphericalCoord; + +static inline SphericalCoord Vector3ToSpherical(Vector3 v) +{ + SphericalCoord s; + s.r = sqrtf(v.x * v.x + v.y * v.y + v.z * v.z); + if (s.r > 0.0f) { + s.theta = atan2f(v.z, v.x); + s.phi = acosf(v.y / s.r); + } else { + s.theta = 0.0f; + s.phi = 0.0f; + } + return s; +} + +static inline Vector3 SphericalToVector3(SphericalCoord s) +{ + Vector3 v; + float sin_phi = sinf(s.phi); + v.x = s.r * cosf(s.theta) * sin_phi; + v.y = s.r * cosf(s.phi); + v.z = s.r * sinf(s.theta) * sin_phi; + return v; +} + +typedef struct virtual_output { + struct wl_global *global; + struct wl_display *display; + struct wl_list clients; + + int32_t x, y; + int32_t phys_w_mm, phys_h_mm; + int32_t width, height; + int32_t refresh_mhz; + int32_t scale; + enum wl_output_subpixel subpixel; + enum wl_output_transform transform; + char const *make, *model; + char const *name, *desc; +} LunarWM_VirtualOutput; + +typedef struct { + struct LunarWM *server; + + struct wl_list link; + struct wlr_keyboard *wlr_keyboard; + + struct wl_listener modifiers; + struct wl_listener key; + struct wl_listener destroy; +} LunarWM_Keyboard; + +typedef struct { + struct LunarWM *server; + + struct wl_list link; + struct wlr_pointer *wlr_pointer; + + struct wl_listener motion; + struct wl_listener destroy; +} LunarWM_Pointer; + +typedef struct { + struct LunarWM *wm; + struct wlr_output *wlr_output; + + struct wl_listener frame; + struct wl_listener destroy; +} LunarWM_Output; + +typedef struct { + uint32_t id; + + bool is_xwayland; + + struct LunarWM *server; + + struct wl_listener commit; + struct wl_listener destroy; + + struct wl_listener map, unmap; + + union { + struct wlr_xdg_toplevel *xdg; + struct wlr_xwayland_surface *xwl; + } u; + + struct wlr_surface *surface; + struct wlr_texture *texture; + + struct wlr_buffer *locked_buffer; + struct wlr_gles2_texture_attribs attribs; + struct wlr_gles2_texture *gles_texture; + Texture2D rl_texture; + RenderTexture2D surface_rt; + struct wlr_box surface_extents; + bool composed_has_alpha; +} LunarWM_Toplevel; + +typedef struct { + LunarWM_Toplevel *tl; + SphericalCoord coord; +} LunarWM_Window; + +bool LunarWM_Toplevel_init_xdg( + LunarWM_Toplevel *tl, struct LunarWM *wm, struct wlr_xdg_toplevel *xdg); +bool LunarWM_Toplevel_init_xwayland( + LunarWM_Toplevel *tl, struct LunarWM *wm, struct wlr_xwayland_surface *xwl); +bool LunarWM_Toplevel_destroy(LunarWM_Toplevel *this); + +bool LunarWM_Toplevel_update(LunarWM_Toplevel *this); +void LunarWM_Toplevel_focus(LunarWM_Toplevel *this); + +typedef struct { + XrSwapchain swapchain; + int64_t swapchain_format; + GLuint *v_image_views; +} LunarWM_SwapchainInfo; + +typedef struct { + XrSwapchain handle; + XrSwapchainImageOpenGLESKHR *a_imgs; + uint32_t a_imgs_count; +} LunarWM_SwapchainImagesEntry; + +typedef struct { + XrHandJointLocationEXT joint_locations[XR_HAND_JOINT_COUNT_EXT]; + XrHandTrackerEXT hand_tracker; +} LunarWM_Hand; + +typedef struct { + XrTime predicted_display_time; + XrCompositionLayerProjection layer_projection; + XrCompositionLayerBaseHeader *layers[10]; + uint32_t layers_count; + XrCompositionLayerProjectionView layer_projection_views[10]; + uint32_t layer_projection_views_count; +} LunarWM_RenderLayerInfo; + +typedef struct LunarWM { + struct { + struct wl_display *display; + struct wl_event_loop *event_loop; + + struct wlr_backend *backend; + struct wlr_renderer *renderer; + struct wlr_session *session; + + struct wlr_egl *egl; + EGLDisplay egl_display; + EGLContext egl_context; + EGLConfig egl_config; + + struct wlr_allocator *allocator; + struct wlr_compositor *compositor; + struct wl_listener new_surface_listener; + struct wlr_subcompositor *subcompositor; + struct wlr_data_device_manager *data_device_manager; + + struct wlr_seat *seat; + struct wl_list keyboards; + struct wl_list pointers; + struct wl_listener new_input_listener; + + struct wlr_xdg_shell *xdg_shell; + struct wl_listener new_xdg_toplevel_listener; + struct wl_listener new_xdg_popup_listener; + + struct wlr_xwayland *xwayland; + + struct wl_listener xwayland_ready; + struct wl_listener xwayland_new_surface; + struct wl_listener xwayland_associate_tmp; + struct wl_listener xwayland_dissociate_tmp; + + LunarWM_VirtualOutput *custom_out_virtual; + LunarWM_VirtualOutput *custom_out_hud; + + LunarWM_Toplevel **v_toplevels; + int current_focus; + + struct wl_listener new_output_listener; + LunarWM_Output **v_outputs; + + } wayland; + + struct { + bool available; + + XrInstance instance; + XrSystemId system_id; + XrSession session; + XrSessionState session_state; + struct { + LunarWM_SwapchainInfo *v_color; + LunarWM_SwapchainInfo *v_depth; + } swapchains; + LunarWM_SwapchainImagesEntry swapchain_images[2]; + XrViewConfigurationView *a_view_configuration_views; + uint32_t view_configuration_views_count; + XrEnvironmentBlendMode environment_blend_mode; + XrSpace local_space, view_space; + LunarWM_Hand hands[2]; + XrSystemHandTrackingPropertiesEXT hand_tracking_system_properties; + + PFN_xrCreateHandTrackerEXT CreateHandTrackerEXT; + PFN_xrDestroyHandTrackerEXT DestroyHandTrackerEXT; + PFN_xrLocateHandJointsEXT LocateHandJointsEXT; + bool hand_tracking_enabled; + + Quaternion recenter_rot; + Vector3 recenter_trans; + bool recenter_active; + + bool session_running; + } xr; + + struct { + GLuint fbo; + RenderTexture2D tmp_rt; + RenderTexture2D main_rt; + RenderTexture2D hud_rt; + Camera3D camera; + Shader linear_srgb; + + Skybox skybox; + + bool first_frame; + } renderer; + + struct { + SphericalCoord pointer; + int active_workspace; + struct { + LunarWM_Window *v_windows; + } workspaces[10]; + } wm; + + ConfigManager *cman; + + _Atomic(int) counter; + + bool initialized; + bool running; +} LunarWM; + +static inline bool LunarWM_get_new_id(LunarWM *this) { return ++this->counter; } + +#endif diff --git a/src/LunarWM_wayland.c b/src/LunarWM_wayland.c new file mode 100644 index 0000000..4ecf947 --- /dev/null +++ b/src/LunarWM_wayland.c @@ -0,0 +1,2043 @@ +#include "LunarWM_wayland.h" + +#include "LunarWM_core.h" +#include "LunarWM_render.h" +#include "common.h" +#include "vec.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include + +static void handle_new_output(struct wl_listener *listener, void *data); +static void handle_output_frame(struct wl_listener *listener, void *data); +static void handle_output_destroy(struct wl_listener *listener, void *data); + +static inline SphericalCoord get_forward_spherical_with_nearest( + Vector3 fwd, float r) +{ + if (fabs(fwd.y) < 0.2f) { + fwd.y = 0; + } + auto vec = Vector3Scale(Vector3Normalize(fwd), r); + return Vector3ToSpherical(vec); +} + +struct SurfaceDamageListener { + struct wl_listener client_commit; + struct wl_listener destroy; +}; + +static void surface_damage_client_commit( + struct wl_listener *listener, void *data) +{ + (void)listener; + struct wlr_surface *surface = data; + if (!surface) { + return; + } + if (!wlr_surface_state_has_buffer(&surface->pending)) { + return; + } + if (pixman_region32_not_empty(&surface->pending.surface_damage) + || pixman_region32_not_empty(&surface->pending.buffer_damage)) { + return; + } + + int surface_width = surface->pending.width > 0 ? surface->pending.width + : surface->current.width; + int surface_height = surface->pending.height > 0 ? surface->pending.height + : surface->current.height; + int buffer_width = surface->pending.buffer_width > 0 + ? surface->pending.buffer_width + : surface->current.buffer_width; + int buffer_height = surface->pending.buffer_height > 0 + ? surface->pending.buffer_height + : surface->current.buffer_height; + + if (surface_width <= 0 || surface_height <= 0 || buffer_width <= 0 + || buffer_height <= 0) { + return; + } + + pixman_region32_union_rect(&surface->pending.surface_damage, + &surface->pending.surface_damage, 0, 0, surface_width, surface_height); + pixman_region32_union_rect(&surface->pending.buffer_damage, + &surface->pending.buffer_damage, 0, 0, buffer_width, buffer_height); +} + +static void surface_damage_destroy(struct wl_listener *listener, void *data) +{ + (void)data; + struct SurfaceDamageListener *hook + = wl_container_of(listener, hook, destroy); + wl_list_remove(&hook->client_commit.link); + wl_list_remove(&hook->destroy.link); + free(hook); +} + +static void surface_damage_track(struct wlr_surface *surface) +{ + if (!surface) { + return; + } + + struct SurfaceDamageListener *hook = calloc(1, sizeof(*hook)); + if (!hook) { + wlr_log(WLR_ERROR, "Failed to allocate surface damage listener"); + return; + } + + hook->client_commit.notify = surface_damage_client_commit; + wl_signal_add(&surface->events.client_commit, &hook->client_commit); + + hook->destroy.notify = surface_damage_destroy; + wl_signal_add(&surface->events.destroy, &hook->destroy); +} + +static void compositor_new_surface_notify( + struct wl_listener *listener, void *data) +{ + (void)listener; + struct wlr_surface *surface = data; + if (!surface) { + return; + } + + surface_damage_track(surface); +} + +struct ExternalTexturePipeline { + bool attempted_init; + bool ready; + GLuint program; + GLint sampler_loc; + GLuint vao; + GLuint vbo; +}; + +static struct ExternalTexturePipeline g_external_pipeline = { 0 }; + +static GLuint compile_shader(GLenum type, char const *source) +{ + GLuint shader = glCreateShader(type); + if (shader == 0) { + TraceLog( + LOG_ERROR, "Failed to create shader object for external texture"); + return 0; + } + glShaderSource(shader, 1, &source, NULL); + glCompileShader(shader); + GLint status = GL_FALSE; + glGetShaderiv(shader, GL_COMPILE_STATUS, &status); + if (status != GL_TRUE) { + GLint log_len = 0; + glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_len); + if (log_len > 1) { + char *log = malloc((size_t)log_len); + if (log) { + glGetShaderInfoLog(shader, log_len, NULL, log); + TraceLog(LOG_ERROR, + "External texture shader compile failed: %s", log); + free(log); + } + } + glDeleteShader(shader); + return 0; + } + return shader; +} + +static bool ensure_external_pipeline(void) +{ + if (g_external_pipeline.attempted_init) + return g_external_pipeline.ready; + + g_external_pipeline.attempted_init = true; + + static char const *vertex_src_300 + = "#version 300 es\n" + "precision highp float;\n" + "layout(location = 0) in vec2 a_pos;\n" + "layout(location = 1) in vec2 a_uv;\n" + "out vec2 v_uv;\n" + "void main() {\n" + " v_uv = a_uv;\n" + " gl_Position = vec4(a_pos, 0.0, 1.0);\n" + "}\n"; + + static char const *fragment_src_300 + = "#version 300 es\n" + "#extension GL_OES_EGL_image_external_essl3 : require\n" + "precision mediump float;\n" + "in vec2 v_uv;\n" + "layout(location = 0) out vec4 fragColor;\n" + "uniform samplerExternalOES u_texture;\n" + "void main() {\n" + " fragColor = texture(u_texture, v_uv);\n" + "}\n"; + + static char const *vertex_src_100 + = "#version 100\n" + "attribute vec2 a_pos;\n" + "attribute vec2 a_uv;\n" + "varying vec2 v_uv;\n" + "void main() {\n" + " v_uv = a_uv;\n" + " gl_Position = vec4(a_pos, 0.0, 1.0);\n" + "}\n"; + + static char const *fragment_src_100 + = "#version 100\n" + "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" + "varying vec2 v_uv;\n" + "uniform samplerExternalOES u_texture;\n" + "void main() {\n" + " gl_FragColor = texture2D(u_texture, v_uv);\n" + "}\n"; + + struct { + char const *vs; + char const *fs; + } const variants[] = { + { vertex_src_300, fragment_src_300 }, + { vertex_src_100, fragment_src_100 }, + }; + + GLuint program = 0; + GLint sampler_loc = -1; + size_t chosen_idx = (size_t)-1; + for (size_t i = 0; i < ARRAY_SZ(variants); ++i) { + GLuint vert = compile_shader(GL_VERTEX_SHADER, variants[i].vs); + if (vert == 0) + continue; + GLuint frag = compile_shader(GL_FRAGMENT_SHADER, variants[i].fs); + if (frag == 0) { + glDeleteShader(vert); + continue; + } + + GLuint prog = glCreateProgram(); + if (prog == 0) { + TraceLog(LOG_ERROR, + "Failed to create shader program for external texture"); + glDeleteShader(vert); + glDeleteShader(frag); + continue; + } + glAttachShader(prog, vert); + glAttachShader(prog, frag); + glBindAttribLocation(prog, 0, "a_pos"); + glBindAttribLocation(prog, 1, "a_uv"); + glLinkProgram(prog); + GLint link_status = GL_FALSE; + glGetProgramiv(prog, GL_LINK_STATUS, &link_status); + if (link_status != GL_TRUE) { + GLint log_len = 0; + glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &log_len); + if (log_len > 1) { + char *log = malloc((size_t)log_len); + if (log) { + glGetProgramInfoLog(prog, log_len, NULL, log); + TraceLog(LOG_ERROR, + "External texture program link failed: %s", log); + free(log); + } + } + glDeleteShader(vert); + glDeleteShader(frag); + glDeleteProgram(prog); + continue; + } + glDetachShader(prog, vert); + glDetachShader(prog, frag); + glDeleteShader(vert); + glDeleteShader(frag); + + sampler_loc = glGetUniformLocation(prog, "u_texture"); + if (sampler_loc < 0) { + TraceLog(LOG_ERROR, + "External texture program missing u_texture uniform"); + glDeleteProgram(prog); + continue; + } + + program = prog; + chosen_idx = i; + break; + } + + if (program == 0) + return false; + + if (chosen_idx == 1) { + TraceLog( + LOG_DEBUG, "External texture shader fallback to ESSL 100 variant"); + } + + GLuint vao = 0; + GLuint vbo = 0; + glGenVertexArrays(1, &vao); + glGenBuffers(1, &vbo); + if (vao == 0 || vbo == 0) { + TraceLog(LOG_ERROR, "Failed to allocate buffers for external texture"); + if (vao) + glDeleteVertexArrays(1, &vao); + if (vbo) + glDeleteBuffers(1, &vbo); + glDeleteProgram(program); + return false; + } + + GLint prev_vao = 0; + glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &prev_vao); + GLint prev_array_buffer = 0; + glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &prev_array_buffer); + glBindVertexArray(vao); + glBindBuffer(GL_ARRAY_BUFFER, vbo); + glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 16, NULL, GL_DYNAMIC_DRAW); + glEnableVertexAttribArray(0); + glVertexAttribPointer( + 0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 4, (void *)0); + glEnableVertexAttribArray(1); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 4, + (void *)(sizeof(float) * 2)); + glBindBuffer(GL_ARRAY_BUFFER, (GLuint)prev_array_buffer); + glBindVertexArray((GLuint)prev_vao); + + g_external_pipeline.program = program; + g_external_pipeline.sampler_loc = sampler_loc; + g_external_pipeline.vao = vao; + g_external_pipeline.vbo = vbo; + g_external_pipeline.ready = true; + return true; +} + +static bool draw_external_texture( + struct wlr_gles2_texture_attribs const *attribs, int tex_width, + int tex_height, Rectangle src, Rectangle dst, int target_width, + int target_height) +{ + if (!attribs || attribs->target != GL_TEXTURE_EXTERNAL_OES) + return false; + if (tex_width <= 0 || tex_height <= 0 || target_width <= 0 + || target_height <= 0) + return false; + if (!ensure_external_pipeline()) + return false; + + rlDrawRenderBatchActive(); + + float x0 = dst.x; + float y0 = dst.y; + float x1 = dst.x + dst.width; + float y1 = dst.y + dst.height; + + float ndc_x0 = (x0 / (float)target_width) * 2.0f - 1.0f; + float ndc_x1 = (x1 / (float)target_width) * 2.0f - 1.0f; + float ndc_y0 = 1.0f - (y0 / (float)target_height) * 2.0f; + float ndc_y1 = 1.0f - (y1 / (float)target_height) * 2.0f; + + float inv_tex_w = 1.0f / (float)tex_width; + float inv_tex_h = 1.0f / (float)tex_height; + float u0 = src.x * inv_tex_w; + float v0 = src.y * inv_tex_h; + float u1 = (src.x + src.width) * inv_tex_w; + float v1 = (src.y + src.height) * inv_tex_h; + + GLfloat vertices[] = { + ndc_x0, + ndc_y0, + u0, + v0, + ndc_x1, + ndc_y0, + u1, + v0, + ndc_x0, + ndc_y1, + u0, + v1, + ndc_x1, + ndc_y1, + u1, + v1, + }; + + GLint prev_program = 0; + glGetIntegerv(GL_CURRENT_PROGRAM, &prev_program); + + GLint prev_active_texture = 0; + glGetIntegerv(GL_ACTIVE_TEXTURE, &prev_active_texture); + glActiveTexture(GL_TEXTURE0); + GLint prev_tex0_external = 0; + glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, &prev_tex0_external); + GLint prev_tex0_2d = 0; + glGetIntegerv(GL_TEXTURE_BINDING_2D, &prev_tex0_2d); + + GLint prev_array_buffer = 0; + glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &prev_array_buffer); + GLint prev_element_array_buffer = 0; + glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &prev_element_array_buffer); + GLint prev_vertex_array = 0; + glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &prev_vertex_array); + + glUseProgram(g_external_pipeline.program); + glUniform1i(g_external_pipeline.sampler_loc, 0); + glBindTexture(GL_TEXTURE_EXTERNAL_OES, attribs->tex); + glBindVertexArray(g_external_pipeline.vao); + glBindBuffer(GL_ARRAY_BUFFER, g_external_pipeline.vbo); + glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + glBindBuffer(GL_ARRAY_BUFFER, (GLuint)prev_array_buffer); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, (GLuint)prev_element_array_buffer); + glBindVertexArray((GLuint)prev_vertex_array); + glBindTexture(GL_TEXTURE_EXTERNAL_OES, (GLuint)prev_tex0_external); + glBindTexture(GL_TEXTURE_2D, (GLuint)prev_tex0_2d); + glUseProgram((GLuint)prev_program); + glActiveTexture((GLenum)prev_active_texture); + + return true; +} + +static void LunarWM_Toplevel_release_surface_rt(LunarWM_Toplevel *tl) +{ + if (!tl) + return; + if (IsRenderTextureValid(tl->surface_rt)) { + UnloadRenderTexture(tl->surface_rt); + } + tl->surface_rt = (RenderTexture2D) { 0 }; + tl->surface_extents = (struct wlr_box) { 0 }; + tl->composed_has_alpha = false; +} + +static void remove_windows_for_tl(LunarWM *wm, LunarWM_Toplevel *tl) +{ + if (!wm || !tl) + return; + for (size_t ws = 0; ws < ARRAY_SZ(wm->wm.workspaces); ++ws) { + auto *vec = &wm->wm.workspaces[ws].v_windows; + for (size_t i = 0; i < vector_size(*vec);) { + if ((*vec)[i].tl == tl) { + vector_remove(*vec, i); + } else { + i++; + } + } + } +} + +static void focus_fallback(LunarWM *wm); + +static void toplevel_commit_notify(struct wl_listener *l, void *) +{ + auto *tl = wl_container_of(l, (LunarWM_Toplevel *)(NULL), commit); + + if (!tl || !tl->surface) + return; + + if (!tl->is_xwayland) { + if (tl->u.xdg && tl->u.xdg->base->initial_commit) { + wlr_xdg_toplevel_set_size(tl->u.xdg, 0, 0); + return; + } + } + + LunarWM_Toplevel_update(tl); +} + +static void toplevel_destroy_notify(struct wl_listener *l, void *) +{ + auto *tl = wl_container_of(l, (LunarWM_Toplevel *)(NULL), destroy); + + for (size_t i = 0; i < vector_size(tl->server->wayland.v_toplevels); i++) { + if (tl == tl->server->wayland.v_toplevels[i]) { + vector_remove(tl->server->wayland.v_toplevels, i); + break; + } + } + + remove_windows_for_tl(tl->server, tl); + + focus_fallback(tl->server); + + LunarWM_Toplevel_destroy(tl); + free(tl); +} + +static void toplevel_map_notify(struct wl_listener *l, void *data) +{ + (void)data; + LunarWM_Toplevel *tl = wl_container_of(l, (LunarWM_Toplevel *)0, map); + if (!tl || !tl->surface) + return; + + if (tl->is_xwayland && tl->u.xwl) { + if (tl->u.xwl->override_redirect + && !wlr_xwayland_surface_override_redirect_wants_focus(tl->u.xwl)) { + return; + } + } + + LunarWM_Toplevel_focus(tl); + + LunarWM *wm = tl->server; + for (size_t i = 0; i < vector_size(wm->wayland.v_toplevels); ++i) { + if (wm->wayland.v_toplevels[i] == tl) { + wm->wayland.current_focus = (int)i; + break; + } + } +} + +static void toplevel_unmap_notify(struct wl_listener *l, void *data) +{ + (void)data; + LunarWM_Toplevel *tl = wl_container_of(l, tl, unmap); + if (!tl || !tl->surface) + return; + + if (tl->map.link.prev || tl->map.link.next) + wl_list_remove(&tl->map.link); + if (tl->unmap.link.prev || tl->unmap.link.next) + wl_list_remove(&tl->unmap.link); + if (tl->commit.link.prev || tl->commit.link.next) + wl_list_remove(&tl->commit.link); + + if (tl->locked_buffer) { + wlr_buffer_unlock(tl->locked_buffer); + tl->locked_buffer = NULL; + } + tl->texture = NULL; + tl->gles_texture = NULL; + tl->rl_texture = (Texture) { 0 }; + LunarWM_Toplevel_release_surface_rt(tl); + tl->surface = NULL; + tl->composed_has_alpha = false; + + focus_fallback(tl->server); +} + +bool LunarWM_Toplevel_init_xdg( + LunarWM_Toplevel *tl, LunarWM *wm, struct wlr_xdg_toplevel *xdg) +{ + tl->id = LunarWM_get_new_id(wm); + tl->server = wm; + tl->is_xwayland = false; + tl->u.xdg = xdg; + tl->surface = xdg->base->surface; + + assert(tl->surface); + + tl->commit.notify = toplevel_commit_notify; + wl_signal_add(&tl->surface->events.commit, &tl->commit); + + tl->destroy.notify = toplevel_destroy_notify; + wl_signal_add(&tl->surface->events.destroy, &tl->destroy); + + tl->map.notify = toplevel_map_notify; + wl_signal_add(&tl->u.xdg->base->surface->events.map, &tl->map); + + tl->unmap.notify = toplevel_unmap_notify; + wl_signal_add(&tl->u.xdg->base->surface->events.unmap, &tl->unmap); + + return true; +} + +bool LunarWM_Toplevel_init_xwayland( + LunarWM_Toplevel *tl, LunarWM *wm, struct wlr_xwayland_surface *xwl) +{ + tl->id = LunarWM_get_new_id(wm); + tl->server = wm; + tl->is_xwayland = true; + tl->u.xwl = xwl; + tl->surface = xwl->surface; + assert(tl->surface); + + tl->commit.notify = toplevel_commit_notify; + wl_signal_add(&tl->surface->events.commit, &tl->commit); + + tl->destroy.notify = toplevel_destroy_notify; + wl_signal_add(&tl->surface->events.destroy, &tl->destroy); + + tl->map.notify = toplevel_map_notify; + wl_signal_add(&xwl->surface->events.map, &tl->map); + + tl->unmap.notify = toplevel_unmap_notify; + wl_signal_add(&xwl->surface->events.unmap, &tl->unmap); + + return true; +} + +bool LunarWM_Toplevel_destroy(LunarWM_Toplevel *this) +{ + if (!this) + return false; + if (this->map.link.prev || this->map.link.next) + wl_list_remove(&this->map.link); + if (this->unmap.link.prev || this->unmap.link.next) + wl_list_remove(&this->unmap.link); + if (this->commit.link.prev || this->commit.link.next) + wl_list_remove(&this->commit.link); + if (this->destroy.link.prev || this->destroy.link.next) + wl_list_remove(&this->destroy.link); + if (this->locked_buffer) + wlr_buffer_unlock(this->locked_buffer); + LunarWM_Toplevel_release_surface_rt(this); + this->composed_has_alpha = false; + return true; +} + +struct SurfaceComposeCtx { + struct wlr_box extents; + bool *has_alpha; +}; + +char const *GLInternalFormatName(GLenum format) +{ + switch (format) { + case GL_RGBA8: + return "GL_RGBA8"; + case GL_RGB8: + return "GL_RGB8"; + case GL_RGB565: + return "GL_RGB565"; + case GL_RGBA4: + return "GL_RGBA4"; + case GL_RGB5_A1: + return "GL_RGB5_A1"; + case GL_DEPTH_COMPONENT16: + return "GL_DEPTH_COMPONENT16"; + case GL_DEPTH_COMPONENT24: + return "GL_DEPTH_COMPONENT24"; + case GL_DEPTH24_STENCIL8: + return "GL_DEPTH24_STENCIL8"; + case GL_DEPTH32F_STENCIL8: + return "GL_DEPTH32F_STENCIL8"; + case GL_R8: + return "GL_R8"; + case GL_RG8: + return "GL_RG8"; + default: + return "Unknown format"; + } +} + +static void surface_compose_draw( + struct wlr_surface *surface, int sx, int sy, void *user_data) +{ + struct SurfaceComposeCtx *ctx = user_data; + if (!ctx) + return; + + struct wlr_texture *wlr_tex = wlr_surface_get_texture(surface); + if (!wlr_tex || wlr_tex->width == 0 || wlr_tex->height == 0) + return; + + struct wlr_gles2_texture *gles_tex = gles2_get_texture(wlr_tex); + if (!gles_tex) + return; + if (ctx->has_alpha && gles_tex->has_alpha) + *ctx->has_alpha = true; + + struct wlr_gles2_texture_attribs attribs; + wlr_gles2_texture_get_attribs(wlr_tex, &attribs); + Texture2D tex = { + .id = (unsigned int)attribs.tex, + .width = (int)wlr_tex->width, + .height = (int)wlr_tex->height, + .mipmaps = 1, + .format = gles_tex->has_alpha ? PIXELFORMAT_UNCOMPRESSED_R8G8B8A8 + : PIXELFORMAT_UNCOMPRESSED_R8G8B8, + }; + + float dest_w = (float)surface->current.width; + float dest_h = (float)surface->current.height; + if (dest_w <= 0.0f || dest_h <= 0.0f) { + dest_w = (float)tex.width; + dest_h = (float)tex.height; + } + + Rectangle src = { 0.0f, 0.0f, (float)tex.width, (float)tex.height }; + Rectangle dst = { + (float)(sx - ctx->extents.x), + (float)(sy - ctx->extents.y), + dest_w, + dest_h, + }; + + if (attribs.target == GL_TEXTURE_EXTERNAL_OES) { + static bool external_draw_warned = false; + if (!draw_external_texture(&attribs, tex.width, tex.height, src, dst, + ctx->extents.width, ctx->extents.height)) { + if (!external_draw_warned) { + TraceLog(LOG_WARNING, + "Failed to draw external texture, skipping frame"); + external_draw_warned = true; + } + } + } else { + assert(attribs.target == GL_TEXTURE_2D); + DrawTexturePro(tex, src, dst, (Vector2) { 0.0f, 0.0f }, 0.0f, WHITE); + } +} + +bool LunarWM_Toplevel_update(LunarWM_Toplevel *this) +{ + if (!this || !this->surface) + return false; + + this->texture = wlr_surface_get_texture(this->surface); + struct wlr_client_buffer *cl_buf = this->surface->buffer; + if ((this->texture == nullptr) || (cl_buf == nullptr)) { + return false; + } + + if ((this->locked_buffer != nullptr) + && this->locked_buffer != &cl_buf->base) { + wlr_buffer_unlock(this->locked_buffer); + this->locked_buffer = nullptr; + } + if (this->locked_buffer == nullptr) { + this->locked_buffer = wlr_buffer_lock(&cl_buf->base); + } + + wlr_gles2_texture_get_attribs(this->texture, &this->attribs); + this->gles_texture = gles2_get_texture(this->texture); + if (this->gles_texture == nullptr) { + return false; + } + + this->rl_texture.id = (unsigned int)this->attribs.tex; + this->rl_texture.width = (int)this->texture->width; + this->rl_texture.height = (int)this->texture->height; + this->rl_texture.mipmaps = 1; + this->rl_texture.format = this->gles_texture->has_alpha + ? PIXELFORMAT_UNCOMPRESSED_R8G8B8A8 + : PIXELFORMAT_UNCOMPRESSED_R8G8B8; + + SetTextureFilter(this->rl_texture, TEXTURE_FILTER_BILINEAR); + SetTextureWrap(this->rl_texture, TEXTURE_WRAP_CLAMP); + + struct wlr_box extents = { 0 }; + wlr_surface_get_extents(this->surface, &extents); + if (extents.width <= 0 || extents.height <= 0) { + LunarWM_Toplevel_release_surface_rt(this); + this->composed_has_alpha = this->gles_texture->has_alpha; + return true; + } + + bool needs_alpha = this->gles_texture->has_alpha; + if (extents.x != 0 || extents.y != 0 + || extents.width != (int)this->texture->width + || extents.height != (int)this->texture->height) { + needs_alpha = true; + } + + bool const size_changed = !IsRenderTextureValid(this->surface_rt) + || this->surface_rt.texture.width != extents.width + || this->surface_rt.texture.height != extents.height; + if (size_changed) { + LunarWM_Toplevel_release_surface_rt(this); + this->surface_rt = LoadRenderTexture(extents.width, extents.height); + if (!IsRenderTextureValid(this->surface_rt)) { + this->composed_has_alpha = needs_alpha; + return true; + } + SetTextureFilter(this->surface_rt.texture, TEXTURE_FILTER_BILINEAR); + SetTextureWrap(this->surface_rt.texture, TEXTURE_WRAP_CLAMP); + } + + BeginTextureMode(this->surface_rt); + ClearBackground(BLANK); + BeginBlendMode(BLEND_ALPHA); + struct SurfaceComposeCtx ctx = { + .extents = extents, + .has_alpha = &needs_alpha, + }; + wlr_surface_for_each_surface(this->surface, surface_compose_draw, &ctx); + EndBlendMode(); + EndTextureMode(); + + this->surface_extents = extents; + Texture2D composed = this->surface_rt.texture; + composed.width = extents.width; + composed.height = extents.height; + this->rl_texture = composed; + this->composed_has_alpha = needs_alpha; + + return true; +} + +static void clamp_to_hints( + const struct wlr_xwayland_surface *x, uint16_t *w, uint16_t *h) +{ + xcb_size_hints_t *hints = x->size_hints; + if (!hints) + return; + + if ((hints->flags & XCB_ICCCM_SIZE_HINT_P_MIN_SIZE)) { + if (*w < hints->min_width) + *w = hints->min_width; + if (*h < hints->min_height) + *h = hints->min_height; + } + if ((hints->flags & XCB_ICCCM_SIZE_HINT_P_MAX_SIZE)) { + if (hints->max_width > 0 && *w > hints->max_width) + *w = hints->max_width; + if (hints->max_height > 0 && *h > hints->max_height) + *h = hints->max_height; + } + if ((hints->flags & XCB_ICCCM_SIZE_HINT_P_RESIZE_INC)) { + if (hints->width_inc > 0) + *w = (*w / hints->width_inc) * hints->width_inc; + if (hints->height_inc > 0) + *h = (*h / hints->height_inc) * hints->height_inc; + } + if ((hints->flags & XCB_ICCCM_SIZE_HINT_BASE_SIZE)) { + if (*w < hints->base_width) + *w = hints->base_width; + if (*h < hints->base_height) + *h = hints->base_height; + } +} + +struct XwlHooks { + LunarWM *wm; + struct wlr_xwayland_surface *xwl; + struct wl_listener associate; + struct wl_listener dissociate; + struct wl_listener destroy; + + struct wl_listener req_configure; + struct wl_listener req_maximize; + struct wl_listener req_fullscreen; + struct wl_listener req_activate; + struct wl_listener set_geometry; +}; + +static void xwayland_ready_notify(struct wl_listener *l, void *data) +{ + (void)data; + LunarWM *wm = wl_container_of(l, wm, wayland.xwayland_ready); + wlr_xwayland_set_seat(wm->wayland.xwayland, wm->wayland.seat); + setenv("DISPLAY", wm->wayland.xwayland->display_name, 1); +} + +static void handle_associate(struct wl_listener *ll, void *d) +{ + struct wlr_xwayland_surface *x = d; + LunarWM *wm2 = wl_container_of(ll, wm2, wayland.xwayland_associate_tmp); + if (!x->surface) + return; + + LunarWM_Toplevel *tl = calloc(1, sizeof *tl); + if (!tl) + return; + + if (LunarWM_Toplevel_init_xwayland(tl, wm2, x)) { + vector_add(&wm2->wayland.v_toplevels, tl); + LunarWM_Window window = { + .tl = tl, + .coord = get_forward_spherical_with_nearest( + wm2->renderer.camera.target, wm2->cman->cfg.space.radius), + }; + vector_add( + &wm2->wm.workspaces[wm2->wm.active_workspace].v_windows, window); + } else { + free(tl); + } + wl_list_remove(&wm2->wayland.xwayland_associate_tmp.link); +} + +static void handle_dissociate(struct wl_listener *ll, void *d) +{ + struct wlr_xwayland_surface *x = d; + LunarWM *wm2 = wl_container_of(ll, wm2, wayland.xwayland_dissociate_tmp); + for (size_t i = 0; i < vector_size(wm2->wayland.v_toplevels); ++i) { + LunarWM_Toplevel *tl = wm2->wayland.v_toplevels[i]; + if (tl->is_xwayland && tl->u.xwl == x) { + vector_remove(wm2->wayland.v_toplevels, i); + remove_windows_for_tl(wm2, tl); + LunarWM_Toplevel_destroy(tl); + free(tl); + break; + } + } + wl_list_remove(&wm2->wayland.xwayland_dissociate_tmp.link); +} + +static void xwl_hooks_destroy(struct XwlHooks *h) +{ + if (!h) + return; + if (h->associate.link.prev || h->associate.link.next) + wl_list_remove(&h->associate.link); + if (h->dissociate.link.prev || h->dissociate.link.next) + wl_list_remove(&h->dissociate.link); + if (h->destroy.link.prev || h->destroy.link.next) + wl_list_remove(&h->destroy.link); + free(h); +} + +static void xwl_on_associate(struct wl_listener *ll, void *data) +{ + struct XwlHooks *h = wl_container_of(ll, h, associate); + struct wlr_xwayland_surface *x = h->xwl; + if (!x || !x->surface) + return; + + LunarWM_Toplevel *tl = calloc(1, sizeof *tl); + if (!tl) + return; + if (LunarWM_Toplevel_init_xwayland(tl, h->wm, x)) { + vector_add(&h->wm->wayland.v_toplevels, tl); + } else { + free(tl); + } +} + +static void xwl_unmap_toplevel(LunarWM_Toplevel *tl) +{ + if (!tl) + return; + + if (tl->map.link.prev || tl->map.link.next) + wl_list_remove(&tl->map.link); + if (tl->unmap.link.prev || tl->unmap.link.next) + wl_list_remove(&tl->unmap.link); + if (tl->commit.link.prev || tl->commit.link.next) + wl_list_remove(&tl->commit.link); + if (tl->destroy.link.prev || tl->destroy.link.next) + wl_list_remove(&tl->destroy.link); + + if (tl->locked_buffer) { + wlr_buffer_unlock(tl->locked_buffer); + tl->locked_buffer = NULL; + } + + tl->texture = NULL; + tl->gles_texture = NULL; + tl->rl_texture = (Texture) { 0 }; + LunarWM_Toplevel_release_surface_rt(tl); + tl->surface = NULL; +} + +static void xwl_on_dissociate(struct wl_listener *ll, void *data) +{ + struct XwlHooks *h = wl_container_of(ll, h, dissociate); + LunarWM *wm = h->wm; + struct wlr_xwayland_surface *x = h->xwl; + + for (size_t i = 0; i < vector_size(wm->wayland.v_toplevels); ++i) { + LunarWM_Toplevel *tl = wm->wayland.v_toplevels[i]; + if (tl->is_xwayland && tl->u.xwl == x) { + xwl_unmap_toplevel(tl); + break; + } + } + + focus_fallback(wm); +} + +static void xwl_on_request_configure(struct wl_listener *ll, void *data) +{ + struct XwlHooks *xh = wl_container_of(ll, xh, req_configure); + struct wlr_xwayland_surface_configure_event *ev = data; + if (!xh->xwl) + return; + + int16_t x = xh->xwl->x, y = xh->xwl->y; + uint16_t w = xh->xwl->width, h = xh->xwl->height; + + if (ev->mask & XCB_CONFIG_WINDOW_X) + x = ev->x; + if (ev->mask & XCB_CONFIG_WINDOW_Y) + y = ev->y; + if (ev->mask & XCB_CONFIG_WINDOW_WIDTH) + w = ev->width; + if (ev->mask & XCB_CONFIG_WINDOW_HEIGHT) + h = ev->height; + + clamp_to_hints(xh->xwl, &w, &h); + + wlr_xwayland_surface_configure(xh->xwl, x, y, w, h); +} + +static void xwl_on_request_maximize(struct wl_listener *ll, void *data) +{ + (void)data; + struct XwlHooks *xh = wl_container_of(ll, xh, req_maximize); + wlr_xwayland_surface_set_maximized(xh->xwl, true, true); +} + +static void xwl_on_request_fullscreen(struct wl_listener *ll, void *data) +{ + (void)data; + struct XwlHooks *xh = wl_container_of(ll, xh, req_fullscreen); + wlr_xwayland_surface_set_fullscreen(xh->xwl, true); +} + +static void xwl_on_request_activate(struct wl_listener *ll, void *data) +{ + (void)data; + struct XwlHooks *h = wl_container_of(ll, h, req_activate); + for (size_t i = 0; i < vector_size(h->wm->wayland.v_toplevels); ++i) { + LunarWM_Toplevel *tl = h->wm->wayland.v_toplevels[i]; + if (tl->is_xwayland && tl->u.xwl == h->xwl) { + LunarWM_Toplevel_focus(tl); + break; + } + } +} + +static void xwl_on_set_geometry(struct wl_listener *ll, void *data) +{ + (void)ll; + (void)data; +} + +static void xwl_on_destroy(struct wl_listener *ll, void *data) +{ + (void)data; + struct XwlHooks *xh = wl_container_of(ll, xh, destroy); + LunarWM *wm = xh->wm; + struct wlr_xwayland_surface *x = xh->xwl; + + if (xh->req_configure.link.prev) + wl_list_remove(&xh->req_configure.link); + if (xh->req_maximize.link.prev) + wl_list_remove(&xh->req_maximize.link); + if (xh->req_fullscreen.link.prev) + wl_list_remove(&xh->req_fullscreen.link); + if (xh->req_activate.link.prev) + wl_list_remove(&xh->req_activate.link); + if (xh->set_geometry.link.prev) + wl_list_remove(&xh->set_geometry.link); + if (xh->associate.link.prev) + wl_list_remove(&xh->associate.link); + if (xh->dissociate.link.prev) + wl_list_remove(&xh->dissociate.link); + if (xh->destroy.link.prev) + wl_list_remove(&xh->destroy.link); + + for (size_t i = 0; i < vector_size(wm->wayland.v_toplevels); ++i) { + LunarWM_Toplevel *tl = wm->wayland.v_toplevels[i]; + if (tl->is_xwayland && tl->u.xwl == x) { + vector_remove(wm->wayland.v_toplevels, i); + remove_windows_for_tl(wm, tl); + free(tl); + break; + } + } + + focus_fallback(wm); + + free(xh); +} + +static bool xwl_wants_focus(struct wlr_xwayland_surface *x) +{ + if (!x) + return false; + if (!x->surface) + return false; + if (x->override_redirect + && !wlr_xwayland_surface_override_redirect_wants_focus(x)) { + return false; + } + if (x->withdrawn || x->minimized) + return false; + return true; +} + +static void focus_fallback(LunarWM *wm) +{ + if (!wm || !wm->wayland.seat) + return; + + for (ssize_t i = (ssize_t)vector_size(wm->wayland.v_toplevels) - 1; i >= 0; + --i) { + LunarWM_Toplevel *cand = wm->wayland.v_toplevels[i]; + if (!cand || !cand->surface) + continue; + + if (cand->is_xwayland) { + if (!xwl_wants_focus(cand->u.xwl)) + continue; + } + LunarWM_Toplevel_focus(cand); + wm->wayland.current_focus = (int)i; + return; + } + + struct wlr_seat *seat = wm->wayland.seat; + struct wlr_surface *prev = seat->keyboard_state.focused_surface; + if (prev) { + struct wlr_xdg_toplevel *pt; + struct wlr_xwayland_surface *px; + if ((pt = wlr_xdg_toplevel_try_from_wlr_surface(prev))) + wlr_xdg_toplevel_set_activated(pt, false); + if ((px = wlr_xwayland_surface_try_from_wlr_surface(prev))) + wlr_xwayland_surface_activate(px, false); + } + wlr_seat_keyboard_clear_focus(seat); + wm->wayland.current_focus = -1; +} + +static void xwayland_new_surface_notify(struct wl_listener *l, void *data) +{ + LunarWM *wm = wl_container_of(l, wm, wayland.xwayland_new_surface); + struct wlr_xwayland_surface *xwl = data; + + if (xwl->surface) { + LunarWM_Toplevel *tl = calloc(1, sizeof *tl); + if (tl && LunarWM_Toplevel_init_xwayland(tl, wm, xwl)) + vector_add(&wm->wayland.v_toplevels, tl); + else + free(tl); + } + + struct XwlHooks *h = calloc(1, sizeof *h); + if (!h) + return; + h->wm = wm; + h->xwl = xwl; + + h->associate.notify = xwl_on_associate; + wl_signal_add(&xwl->events.associate, &h->associate); + + h->dissociate.notify = xwl_on_dissociate; + wl_signal_add(&xwl->events.dissociate, &h->dissociate); + + h->req_configure.notify = xwl_on_request_configure; + wl_signal_add(&xwl->events.request_configure, &h->req_configure); + + h->req_maximize.notify = xwl_on_request_maximize; + wl_signal_add(&xwl->events.request_maximize, &h->req_maximize); + + h->req_fullscreen.notify = xwl_on_request_fullscreen; + wl_signal_add(&xwl->events.request_fullscreen, &h->req_fullscreen); + + h->req_activate.notify = xwl_on_request_activate; + wl_signal_add(&xwl->events.request_activate, &h->req_activate); + + h->set_geometry.notify = xwl_on_set_geometry; + wl_signal_add(&xwl->events.set_geometry, &h->set_geometry); + + h->destroy.notify = xwl_on_destroy; + wl_signal_add(&xwl->events.destroy, &h->destroy); + + xwl->data = h; +} + +void LunarWM_Toplevel_focus(LunarWM_Toplevel *this) +{ + if (!this) + return; + + LunarWM *wm = this->server; + struct wlr_seat *seat = wm->wayland.seat; + struct wlr_surface *prev_surface = seat->keyboard_state.focused_surface; + struct wlr_surface *surface = this->surface; + if (prev_surface == surface) { + return; + } + if (prev_surface) { + struct wlr_xdg_toplevel *prev_tl + = wlr_xdg_toplevel_try_from_wlr_surface(prev_surface); + if (prev_tl) + wlr_xdg_toplevel_set_activated(prev_tl, false); + struct wlr_xwayland_surface *prev_x + = wlr_xwayland_surface_try_from_wlr_surface(prev_surface); + if (prev_x) + wlr_xwayland_surface_activate(prev_x, false); + } + struct wlr_keyboard *keyboard = wlr_seat_get_keyboard(seat); + + if (this->is_xwayland) { + wlr_xwayland_surface_offer_focus(this->u.xwl); + wlr_xwayland_surface_activate(this->u.xwl, true); + } else { + wlr_xdg_toplevel_set_activated(this->u.xdg, true); + } + + if (keyboard != NULL) { + wlr_seat_keyboard_notify_enter(seat, surface, keyboard->keycodes, + keyboard->num_keycodes, &keyboard->modifiers); + } +} + +static void Keyboard_modifiers_notify(struct wl_listener *listener, void *) +{ + auto *kbd + = wl_container_of(listener, (LunarWM_Keyboard *)(NULL), modifiers); + if (!kbd->server || !kbd->server->wayland.seat) { + return; + } + wlr_seat_set_keyboard(kbd->server->wayland.seat, kbd->wlr_keyboard); + wlr_seat_keyboard_notify_modifiers( + kbd->server->wayland.seat, &kbd->wlr_keyboard->modifiers); +} + +static void Keyboard_key_notify(struct wl_listener *listener, void *data) +{ + auto *kbd = wl_container_of(listener, (LunarWM_Keyboard *)(NULL), key); + if (!kbd->server || !kbd->server->wayland.seat) { + return; + } + auto *server = kbd->server; + auto *event = (struct wlr_keyboard_key_event *)data; + struct wlr_seat *seat = server->wayland.seat; + + uint32_t const keycode = event->keycode + 8; + xkb_keysym_t const *syms = nullptr; + int const nsyms + = xkb_state_key_get_syms(kbd->wlr_keyboard->xkb_state, keycode, &syms); + xkb_keysym_t const keysym + = xkb_state_key_get_one_sym(kbd->wlr_keyboard->xkb_state, keycode); + + bool handled = false; + uint32_t const modifiers = wlr_keyboard_get_modifiers(kbd->wlr_keyboard); + + if (event->state == WL_KEYBOARD_KEY_STATE_PRESSED) { + if (server->wayland.session && keysym >= XKB_KEY_XF86Switch_VT_1 + && keysym <= XKB_KEY_XF86Switch_VT_12) { + unsigned const vt = keysym - XKB_KEY_XF86Switch_VT_1 + 1; + wlr_session_change_vt(server->wayland.session, vt); + return; + } + + for (int i = 0; i < server->cman->cfg.keybindings.count; i++) { + BindingRef ref = server->cman->cfg.keybindings.items[i]; + if (ref.mods_mask == 0 || ref.sym == XKB_KEY_NoSymbol) + continue; + + bool sym_match = false; + if (syms && nsyms > 0) { + xkb_keysym_t want = xkb_keysym_to_lower(ref.sym); + for (int s = 0; s < nsyms; ++s) { + if (syms[s] == want) { + sym_match = true; + break; + } + if (xkb_keysym_to_lower(syms[s]) == want) { + sym_match = true; + break; + } + } + } + + if (((modifiers & ref.mods_mask) == ref.mods_mask) && sym_match) { + config_trigger_ref( + server->cman->L, &server->cman->cfg, ref.action_ref); + handled = true; + break; + } + } + } + + if (!handled) { + if (!seat) + return; + if (!kbd->wlr_keyboard) + return; + wlr_seat_set_keyboard(seat, kbd->wlr_keyboard); + wlr_seat_keyboard_notify_key( + seat, event->time_msec, event->keycode, event->state); + } +} + +static void Keyboard_destroy_notify(struct wl_listener *listener, void *) +{ + auto *p = wl_container_of(listener, (LunarWM_Keyboard *)(NULL), destroy); + wl_list_remove(&p->modifiers.link); + wl_list_remove(&p->key.link); + wl_list_remove(&p->destroy.link); + wl_list_remove(&p->link); + free(p); +} + +static inline float wrap_pi(float a) +{ + a = fmodf(a + PI, 2.0f * PI); + if (a < 0.0f) + a += 2.0f * PI; + return a - PI; +} + +static void Pointer_motion_notify(struct wl_listener *listener, void *data) +{ + LunarWM_Pointer *p + = wl_container_of(listener, (LunarWM_Pointer *)NULL, motion); + if (!p->server || !p->server->wayland.seat) + return; + + struct wlr_pointer_motion_event *ev = data; + + float dx = (float)ev->delta_x; + float dy = (float)ev->delta_y; + if (p->server->cman->cfg.input.mouse.invert_x) { + dx *= -1; + } + if (p->server->cman->cfg.input.mouse.invert_y) { + dy *= -1; + } + + float const R = p->server->cman->cfg.space.radius; + float const g = 0.0005f; + + float const POLE_GUARD = 6.0f * (float)M_PI / 180.0f; + float const MIN_SIN = sinf(POLE_GUARD); + + SphericalCoord *coord = &p->server->wm.pointer; + + float theta = coord->theta + dx * g; + float phi = coord->phi + dy * g; + + theta = wrap_pi(theta); + + float sin_phi = sinf(phi); + if (fabsf(sin_phi) < MIN_SIN) { + float sign = sin_phi < 0.0f ? -1.0f : 1.0f; + phi = asinf(sign * MIN_SIN); + } + + coord->theta = theta; + coord->phi = phi; + coord->r = R; +} + +static void Pointer_destroy_notify(struct wl_listener *listener, void *) +{ + auto *kbd = wl_container_of(listener, (LunarWM_Pointer *)(NULL), destroy); + wl_list_remove(&kbd->motion.link); + wl_list_remove(&kbd->destroy.link); + wl_list_remove(&kbd->link); + free(kbd); +} + +static void new_input_listener_notify(struct wl_listener *listener, void *data) +{ + LunarWM *wm = wl_container_of(listener, wm, wayland.new_input_listener); + auto *dev = (struct wlr_input_device *)data; + if (dev->type == WLR_INPUT_DEVICE_KEYBOARD) { + struct wlr_keyboard *wlr_keyboard = wlr_keyboard_from_input_device(dev); + + LunarWM_Keyboard *keyboard = calloc(1, sizeof(*keyboard)); + keyboard->server = wm; + keyboard->wlr_keyboard = wlr_keyboard; + + struct xkb_rule_names const rule_names = { + .options = wm->cman->cfg.input.keyboard.xkb_options, + }; + + wlr_log(LOG_INFO, "xkb_options=%s", + wm->cman->cfg.input.keyboard.xkb_options); + + struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); + struct xkb_keymap *keymap = xkb_keymap_new_from_names( + context, &rule_names, XKB_KEYMAP_COMPILE_NO_FLAGS); + + wlr_keyboard_set_keymap(wlr_keyboard, keymap); + xkb_keymap_unref(keymap); + xkb_context_unref(context); + wlr_keyboard_set_repeat_info(wlr_keyboard, 25, 600); + + keyboard->modifiers.notify = Keyboard_modifiers_notify; + wl_signal_add(&wlr_keyboard->events.modifiers, &keyboard->modifiers); + + keyboard->key.notify = Keyboard_key_notify; + wl_signal_add(&wlr_keyboard->events.key, &keyboard->key); + + keyboard->destroy.notify = Keyboard_destroy_notify; + wl_signal_add(&dev->events.destroy, &keyboard->destroy); + + wlr_seat_set_keyboard(wm->wayland.seat, keyboard->wlr_keyboard); + + wl_list_insert(&wm->wayland.keyboards, &keyboard->link); + } else if (dev->type == WLR_INPUT_DEVICE_POINTER) { + struct wlr_pointer *wlr_pointer = wlr_pointer_from_input_device(dev); + + LunarWM_Pointer *pointer = calloc(1, sizeof(*pointer)); + pointer->server = wm; + pointer->wlr_pointer = wlr_pointer; + + pointer->destroy.notify = Pointer_destroy_notify; + wl_signal_add(&dev->events.destroy, &pointer->destroy); + + pointer->motion.notify = Pointer_motion_notify; + wl_signal_add(&wlr_pointer->events.motion, &pointer->motion); + + wl_list_insert(&wm->wayland.pointers, &pointer->link); + } + + uint32_t caps = WL_SEAT_CAPABILITY_POINTER; + if (!wl_list_empty(&wm->wayland.keyboards)) { + caps |= WL_SEAT_CAPABILITY_KEYBOARD; + } + assert(wm->wayland.seat); + wlr_seat_set_capabilities(wm->wayland.seat, caps); +} + +static void new_xdg_popup_listener_notify(struct wl_listener *, void *) { } + +static void new_xdg_toplevel_listener_notify( + struct wl_listener *listener, void *data) +{ + LunarWM *wm + = wl_container_of(listener, wm, wayland.new_xdg_toplevel_listener); + auto *xdg_tl = (struct wlr_xdg_toplevel *)data; + + LunarWM_Toplevel *tl = (LunarWM_Toplevel *)calloc(1, sizeof(*tl)); + if (!tl) { + wlr_log(WLR_ERROR, "oom"); + return; + } + + if (LunarWM_Toplevel_init_xdg(tl, wm, xdg_tl)) { + vector_add(&wm->wayland.v_toplevels, tl); + LunarWM_Window window = { + .tl = tl, + .coord = get_forward_spherical_with_nearest( + wm->renderer.camera.target, wm->cman->cfg.space.radius), + }; + vector_add( + &wm->wm.workspaces[wm->wm.active_workspace].v_windows, window); + } else { + wlr_log(WLR_ERROR, "Failed to initialize Toplevel."); + free(tl); + } +} + +struct vo_client_res { + struct wl_resource *res; + struct wl_list link; +}; + +static void vo_send_initial(struct virtual_output *vo, struct wl_resource *res) +{ + wl_output_send_geometry(res, vo->x, vo->y, vo->phys_w_mm, vo->phys_h_mm, + vo->subpixel, vo->make, vo->model, vo->transform); + + uint32_t flags = WL_OUTPUT_MODE_CURRENT | WL_OUTPUT_MODE_PREFERRED; + wl_output_send_mode(res, flags, vo->width, vo->height, vo->refresh_mhz); + + if (wl_resource_get_version(res) >= 2) + wl_output_send_scale(res, vo->scale); + + if (wl_resource_get_version(res) >= 4) { + wl_output_send_name(res, vo->name); + wl_output_send_description(res, vo->desc); + } + + if (wl_resource_get_version(res) >= 2) + wl_output_send_done(res); +} + +static void vo_resource_destroy(struct wl_resource *res) +{ + struct vo_client_res *cr = wl_resource_get_user_data(res); + if (!cr) + return; + wl_list_remove(&cr->link); + free(cr); +} + +static void output_release(struct wl_client *client, struct wl_resource *res) +{ + (void)client; + wl_resource_destroy(res); +} + +static const struct wl_output_interface output_impl = { + .release = output_release, +}; + +static void vo_bind( + struct wl_client *client, void *data, uint32_t version, uint32_t id) +{ + struct virtual_output *vo = data; + struct wl_resource *res + = wl_resource_create(client, &wl_output_interface, version, id); + if (!res) + return; + + struct vo_client_res *cr = calloc(1, sizeof(*cr)); + if (!cr) { + wl_resource_destroy(res); + return; + } + + cr->res = res; + wl_resource_set_implementation(res, &output_impl, cr, vo_resource_destroy); + wl_list_insert(&vo->clients, &cr->link); + + vo_send_initial(vo, res); +} + +static void vo_broadcast_mode(struct virtual_output *vo) +{ + struct vo_client_res *cr; + wl_list_for_each(cr, &vo->clients, link) + { + struct wl_resource *res = cr->res; + uint32_t flags = WL_OUTPUT_MODE_CURRENT | WL_OUTPUT_MODE_PREFERRED; + wl_output_send_mode(res, flags, vo->width, vo->height, vo->refresh_mhz); + if (wl_resource_get_version(res) >= 2) + wl_output_send_done(res); + } +} + +static void vo_broadcast_scale(struct virtual_output *vo) +{ + struct vo_client_res *cr; + wl_list_for_each(cr, &vo->clients, link) + { + struct wl_resource *res = cr->res; + if (wl_resource_get_version(res) >= 2) { + wl_output_send_scale(res, vo->scale); + wl_output_send_done(res); + } + } +} + +static void vo_destroy(struct virtual_output *vo) +{ + struct vo_client_res *cr, *tmp; + wl_list_for_each_safe(cr, tmp, &vo->clients, link) + { + wl_resource_destroy(cr->res); + } + if (vo->global) { + wl_global_destroy(vo->global); + vo->global = NULL; + } + free(vo); +} + +static struct virtual_output *vo_create(struct wl_display *display, + char const *name, char const *desc, int32_t w, int32_t h, + int32_t refresh_mhz, int32_t scale, char const *make, char const *model) +{ + struct virtual_output *vo = calloc(1, sizeof *vo); + if (!vo) + return NULL; + vo->display = display; + wl_list_init(&vo->clients); + + vo->x = 0; + vo->y = 0; + vo->phys_w_mm = 0; + vo->phys_h_mm = 0; + vo->width = w; + vo->height = h; + vo->refresh_mhz = refresh_mhz; + vo->scale = scale > 0 ? scale : 1; + vo->subpixel = WL_OUTPUT_SUBPIXEL_UNKNOWN; + vo->transform = WL_OUTPUT_TRANSFORM_NORMAL; + vo->make = make ? make : "Lunar"; + vo->model = model ? model : "Virtual"; + vo->name = name; + vo->desc = desc ? desc : name; + + vo->global + = wl_global_create(display, &wl_output_interface, 4, vo, vo_bind); + if (!vo->global) { + free(vo); + return NULL; + } + + return vo; +} + +static void setup_xwayland(LunarWM *this) +{ + this->wayland.xwayland_ready.notify = xwayland_ready_notify; + wl_signal_add( + &this->wayland.xwayland->events.ready, &this->wayland.xwayland_ready); + + this->wayland.xwayland_new_surface.notify = xwayland_new_surface_notify; + wl_signal_add(&this->wayland.xwayland->events.new_surface, + &this->wayland.xwayland_new_surface); +} +static void destroy_output(LunarWM_Output *output) +{ + if (!output) { + return; + } + + if (output->frame.link.prev || output->frame.link.next) { + wl_list_remove(&output->frame.link); + } + if (output->destroy.link.prev || output->destroy.link.next) { + wl_list_remove(&output->destroy.link); + } + + free(output); +} + +static void handle_output_destroy(struct wl_listener *listener, void *data) +{ + (void)data; + LunarWM_Output *output = wl_container_of(listener, output, destroy); + LunarWM *wm = output->wm; + + if (wm && wm->wayland.v_outputs) { + for (size_t i = 0; i < vector_size(wm->wayland.v_outputs); ++i) { + if (wm->wayland.v_outputs[i] == output) { + vector_remove(wm->wayland.v_outputs, i); + break; + } + } + } + + destroy_output(output); +} + +static void handle_output_frame(struct wl_listener *listener, void *data) +{ + (void)data; + LunarWM_Output *output = wl_container_of(listener, output, frame); + LunarWM *wm = output->wm; + struct wlr_output *wlr_output = output->wlr_output; + + if (wm->xr.available) { + wlr_output_schedule_frame(wlr_output); + return; + } + + struct wlr_output_state state; + wlr_output_state_init(&state); + + int width, height; + wlr_output_effective_resolution(wlr_output, &width, &height); + + struct wlr_render_pass *pass + = wlr_output_begin_render_pass(wlr_output, &state, NULL); + if (pass == NULL) { + wlr_output_state_finish(&state); + wlr_output_schedule_frame(wlr_output); + wlr_log(WLR_ERROR, "Failed to begin render pass for output %s", + wlr_output->name); + return; + } + + GLint drawFboId = 0, readFboId = 0; + glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &drawFboId); + glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &readFboId); + + rlMatrixMode(RL_MODELVIEW); + rlLoadIdentity(); + + // if (!IsTextureValid(wm->renderer.main_rt.texture)) { + // wm->renderer.main_rt = LoadRenderTexture(width, height); + // } + + if (!wlr_render_pass_submit(pass)) { + wlr_output_state_finish(&state); + wlr_output_schedule_frame(wlr_output); + wlr_log(WLR_ERROR, "Failed to submit render pass for output %s", + wlr_output->name); + return; + } + + if (!wlr_output_commit_state(wlr_output, &state)) { + wlr_output_state_finish(&state); + wlr_output_schedule_frame(wlr_output); + return; + } + + wm->renderer.tmp_rt.id = drawFboId; + wm->renderer.tmp_rt.texture = (Texture) { + .id = drawFboId, + .width = width, + .height = height, + .mipmaps = 1, + .format = PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, + }; + if (!IsRenderTextureValid(wm->renderer.tmp_rt)) { + wm->renderer.tmp_rt.depth.id = rlLoadTextureDepth(width, height, true); + wm->renderer.tmp_rt.depth.width = width; + wm->renderer.tmp_rt.depth.height = height; + wm->renderer.tmp_rt.depth.format = 19; // DEPTH_COMPONENT_24BIT? + wm->renderer.tmp_rt.depth.mipmaps = 1; + } + rlFramebufferAttach(wm->renderer.tmp_rt.id, wm->renderer.tmp_rt.depth.id, + RL_ATTACHMENT_DEPTH, RL_ATTACHMENT_RENDERBUFFER, 0); + + if (!wm->xr.available && !wm->renderer.first_frame) { + wm->renderer.camera.target = SphericalToVector3(wm->wm.pointer); + } + + int const hud_size = wm->cman->cfg.displays.hud.size; + if (!IsTextureValid(wm->renderer.hud_rt.texture)) { + wm->renderer.hud_rt = LoadRenderTexture(hud_size, hud_size); + } + BeginTextureMode(wm->renderer.hud_rt); + { + LunarWM_render_hud(wm, GetFrameTime(), 1); + } + EndTextureMode(); + + if (!IsTextureValid(wm->renderer.main_rt.texture)) { + wm->renderer.main_rt = LoadRenderTexture(width, height); + } + BeginTextureMode(wm->renderer.main_rt); + { + BeginMode3D(wm->renderer.camera); + { + ClearBackground(BLACK); + LunarWM_render_3d(wm, GetFrameTime()); + } + EndMode3D(); + + rlDrawRenderBatchActive(); + } + EndTextureMode(); + + BeginTextureMode(wm->renderer.tmp_rt); + { + DrawTexturePro(wm->renderer.main_rt.texture, + (Rectangle) { + 0, + 0, + wm->renderer.main_rt.texture.width, + wm->renderer.main_rt.texture.height, + }, + (Rectangle) { + 0, + 0, + wm->renderer.main_rt.texture.width, + -wm->renderer.main_rt.texture.height, + }, + (Vector2) { 0, 0 }, 0, WHITE); + } + EndTextureMode(); + + if (wm->renderer.first_frame) { + LunarWM_set_recenter_from_camera(wm); + wm->renderer.first_frame = false; + wm->wm.pointer = get_forward_spherical_with_nearest( + wm->renderer.camera.target, wm->cman->cfg.space.radius); + } + + wlr_output_state_finish(&state); +} + +static void handle_new_output(struct wl_listener *listener, void *data) +{ + struct wlr_output *wlr_output = data; + LunarWM *wm = wl_container_of(listener, wm, wayland.new_output_listener); + + wlr_log(WLR_INFO, "Got new output."); + + if (!wlr_output_init_render( + wlr_output, wm->wayland.allocator, wm->wayland.renderer)) { + wlr_log( + WLR_ERROR, "Failed to init render for output %s", wlr_output->name); + return; + } + + struct wlr_output_state state; + wlr_output_state_init(&state); + wlr_output_state_set_enabled(&state, true); + + struct wlr_output_mode *mode = wlr_output_preferred_mode(wlr_output); + if (mode != NULL) { + wlr_output_state_set_mode(&state, mode); + } + + bool committed = wlr_output_commit_state(wlr_output, &state); + wlr_output_state_finish(&state); + if (!committed) { + wlr_log(WLR_ERROR, "Failed to commit init state for output %s", + wlr_output->name); + return; + } + + LunarWM_Output *output = calloc(1, sizeof(*output)); + if (!output) { + wlr_log(WLR_ERROR, "Out of memory creating output state"); + return; + } + + output->wm = wm; + output->wlr_output = wlr_output; + + output->frame.notify = handle_output_frame; + wl_signal_add(&wlr_output->events.frame, &output->frame); + output->destroy.notify = handle_output_destroy; + wl_signal_add(&wlr_output->events.destroy, &output->destroy); + + vector_add(&wm->wayland.v_outputs, output); + + wlr_output_schedule_frame(wlr_output); +} + +bool LunarWM_wayland_init(LunarWM *this) +{ + wlr_log_init(WLR_DEBUG, nullptr); + + this->wayland.v_toplevels = vector_create(); + this->wayland.v_outputs = vector_create(); + + this->wayland.display = wl_display_create(); + if (this->wayland.display == nullptr) { + return false; + } + + this->wayland.event_loop = wl_display_get_event_loop(this->wayland.display); + if (this->wayland.event_loop == nullptr) { + wlr_log(WLR_ERROR, "Failed to get wayland event loop"); + return false; + } + + this->wayland.backend + = wlr_backend_autocreate(this->wayland.event_loop, nullptr); + if (this->wayland.backend == nullptr) { + wlr_log(WLR_ERROR, "Failed to create wlroots backend"); + return false; + } + + setenv("WLR_RENDERER", "gles2", 1); + this->wayland.renderer = wlr_renderer_autocreate(this->wayland.backend); + if (this->wayland.renderer == nullptr) { + wlr_log(WLR_ERROR, "Failed to create wlroots renderer"); + return false; + } + + this->wayland.session = wlr_session_create(this->wayland.event_loop); + if (this->wayland.session == nullptr) { + wlr_log(WLR_ERROR, "Failed to create session"); + return false; + } + + this->wayland.egl = wlr_gles2_renderer_get_egl(this->wayland.renderer); + if (this->wayland.egl == nullptr) { + wlr_log(WLR_ERROR, "Failed to get egl information from renderer"); + return false; + } + + this->wayland.egl_display = wlr_egl_get_display(this->wayland.egl); + this->wayland.egl_context = wlr_egl_get_context(this->wayland.egl); + this->wayland.egl_config = EGL_NO_CONFIG_KHR; + + if (!wlr_renderer_init_wl_display( + this->wayland.renderer, this->wayland.display)) { + wlr_log( + WLR_ERROR, "Failed to initialize renderer with wayland display"); + return false; + } + + this->wayland.allocator = wlr_allocator_autocreate( + this->wayland.backend, this->wayland.renderer); + if (!this->wayland.allocator) { + wlr_log(WLR_ERROR, "Failed to create allocator"); + return false; + } + + this->wayland.compositor = wlr_compositor_create( + this->wayland.display, 5, this->wayland.renderer); + if (!this->wayland.compositor) { + wlr_log(WLR_ERROR, "Failed to create compositor"); + return false; + } + this->wayland.new_surface_listener.notify = compositor_new_surface_notify; + wl_signal_add(&this->wayland.compositor->events.new_surface, + &this->wayland.new_surface_listener); + + this->wayland.subcompositor + = wlr_subcompositor_create(this->wayland.display); + if (!this->wayland.subcompositor) { + wlr_log(WLR_ERROR, "Failed to create subcompositor"); + return false; + } + + this->wayland.data_device_manager + = wlr_data_device_manager_create(this->wayland.display); + if (!this->wayland.data_device_manager) { + wlr_log(WLR_ERROR, "Failed to create data device manager"); + return false; + } + + this->wayland.xdg_shell = wlr_xdg_shell_create(this->wayland.display, 3); + if (!this->wayland.xdg_shell) { + wlr_log(WLR_ERROR, "Failed to create xdg shell"); + return false; + } + + this->wayland.new_xdg_toplevel_listener.notify + = new_xdg_toplevel_listener_notify; + wl_signal_add(&this->wayland.xdg_shell->events.new_toplevel, + &this->wayland.new_xdg_toplevel_listener); + + this->wayland.new_xdg_popup_listener.notify = new_xdg_popup_listener_notify; + wl_signal_add(&this->wayland.xdg_shell->events.new_popup, + &this->wayland.new_xdg_popup_listener); + + this->wayland.seat = wlr_seat_create(this->wayland.display, "seat0"); + if (!this->wayland.seat) { + wlr_log(WLR_ERROR, "Failed to create seat"); + return false; + } + wl_list_init(&this->wayland.keyboards); + wl_list_init(&this->wayland.pointers); + + this->wayland.new_output_listener.notify = handle_new_output; + wl_signal_add(&this->wayland.backend->events.new_output, + &this->wayland.new_output_listener); + + this->wayland.new_input_listener.notify = new_input_listener_notify; + wl_signal_add(&this->wayland.backend->events.new_input, + &this->wayland.new_input_listener); + + this->wayland.xwayland = wlr_xwayland_create( + this->wayland.display, this->wayland.compositor, false); + if (!this->wayland.xwayland) { + wlr_log(WLR_ERROR, "Failed to start XWayland"); + return false; + } + + setup_xwayland(this); + + this->wayland.event_loop = wl_display_get_event_loop(this->wayland.display); + + return true; +} + +void LunarWM_wayland_cleanup(LunarWM *this) +{ + if (this->wayland.custom_out_virtual) { + vo_destroy(this->wayland.custom_out_virtual); + this->wayland.custom_out_virtual = NULL; + } + if (this->wayland.custom_out_hud) { + vo_destroy(this->wayland.custom_out_hud); + this->wayland.custom_out_hud = NULL; + } + + if (this->wayland.new_output_listener.link.prev + || this->wayland.new_output_listener.link.next) { + wl_list_remove(&this->wayland.new_output_listener.link); + this->wayland.new_output_listener.notify = NULL; + } + + if (this->wayland.new_surface_listener.link.prev + || this->wayland.new_surface_listener.link.next) { + wl_list_remove(&this->wayland.new_surface_listener.link); + this->wayland.new_surface_listener.notify = NULL; + } + + if (this->wayland.v_outputs) { + for (size_t i = 0; i < vector_size(this->wayland.v_outputs); ++i) { + destroy_output(this->wayland.v_outputs[i]); + } + vector_free(this->wayland.v_outputs); + this->wayland.v_outputs = NULL; + } + + if (this->wayland.xwayland) { + if (this->wayland.xwayland_new_surface.link.prev + || this->wayland.xwayland_new_surface.link.next) { + wl_list_remove(&this->wayland.xwayland_new_surface.link); + this->wayland.xwayland_new_surface.notify = NULL; + } + if (this->wayland.xwayland_ready.link.prev + || this->wayland.xwayland_ready.link.next) { + wl_list_remove(&this->wayland.xwayland_ready.link); + this->wayland.xwayland_ready.notify = NULL; + } + wlr_xwayland_destroy(this->wayland.xwayland); + this->wayland.xwayland = NULL; + } + + if (this->wayland.new_xdg_toplevel_listener.link.prev + || this->wayland.new_xdg_toplevel_listener.link.next) { + wl_list_remove(&this->wayland.new_xdg_toplevel_listener.link); + this->wayland.new_xdg_toplevel_listener.notify = NULL; + } + if (this->wayland.new_xdg_popup_listener.link.prev + || this->wayland.new_xdg_popup_listener.link.next) { + wl_list_remove(&this->wayland.new_xdg_popup_listener.link); + this->wayland.new_xdg_popup_listener.notify = NULL; + } + if (this->wayland.new_input_listener.link.prev + || this->wayland.new_input_listener.link.next) { + wl_list_remove(&this->wayland.new_input_listener.link); + this->wayland.new_input_listener.notify = NULL; + } + + if (this->wayland.v_toplevels) { + for (size_t i = 0; i < vector_size(this->wayland.v_toplevels); ++i) { + if (this->wayland.v_toplevels[i]) { + LunarWM_Toplevel_destroy(this->wayland.v_toplevels[i]); + free(this->wayland.v_toplevels[i]); + } + } + vector_free(this->wayland.v_toplevels); + this->wayland.v_toplevels = NULL; + } + + if (this->wayland.backend) { + wlr_backend_destroy(this->wayland.backend); + this->wayland.backend = NULL; + } + + if (this->wayland.seat) { + wlr_seat_destroy(this->wayland.seat); + this->wayland.seat = NULL; + } + + if (this->wayland.allocator) { + wlr_allocator_destroy(this->wayland.allocator); + this->wayland.allocator = NULL; + } + if (this->wayland.renderer) { + wlr_renderer_destroy(this->wayland.renderer); + this->wayland.renderer = NULL; + } + if (this->wayland.display) { + wl_display_destroy(this->wayland.display); + this->wayland.display = NULL; + } +} + +void LunarWM_wayland_update_virtual_outputs( + LunarWM *wm, int virtual_width, int virtual_height, int hud_size) +{ + if (wm->wayland.custom_out_virtual) { + vo_destroy(wm->wayland.custom_out_virtual); + wm->wayland.custom_out_virtual = NULL; + } + if (wm->wayland.custom_out_hud) { + vo_destroy(wm->wayland.custom_out_hud); + wm->wayland.custom_out_hud = NULL; + } + + wm->wayland.custom_out_virtual + = vo_create(wm->wayland.display, "Virtual", "Virtual output", + virtual_width, virtual_height, 60000, 1, "LunarWM", "Virtual"); + wm->wayland.custom_out_hud = vo_create(wm->wayland.display, "HUD", + "HUD output", hud_size, hud_size, 60000, 1, "LunarWM", "HUD"); +} diff --git a/src/LunarWM_wayland.h b/src/LunarWM_wayland.h new file mode 100644 index 0000000..2a78ad3 --- /dev/null +++ b/src/LunarWM_wayland.h @@ -0,0 +1,11 @@ +#ifndef LUNAR_WM_WAYLAND_H +#define LUNAR_WM_WAYLAND_H + +#include "LunarWM_types.h" + +bool LunarWM_wayland_init(LunarWM *wm); +void LunarWM_wayland_cleanup(LunarWM *wm); +void LunarWM_wayland_update_virtual_outputs( + LunarWM *wm, int virtual_width, int virtual_height, int hud_size); + +#endif diff --git a/src/LunarWM_xr.c b/src/LunarWM_xr.c new file mode 100644 index 0000000..70c8238 --- /dev/null +++ b/src/LunarWM_xr.c @@ -0,0 +1,909 @@ +#include "LunarWM_xr.h" + +#include "common.h" +#include "vec.h" + +#include +#include +#include + +GLuint LunarWM_xr_get_swapchain_image( + LunarWM *wm, int swapchain_images_i, uint32_t index) +{ + return wm->xr.swapchain_images[swapchain_images_i].a_imgs[index].image; +} + +bool LunarWM_xr_init(LunarWM *this) +{ + XrResult res = XR_SUCCESS; + + XrApplicationInfo app_info = { + .applicationVersion = 1, + .engineVersion = 1, + .apiVersion = XR_CURRENT_API_VERSION, + }; + strncpy((char *)app_info.applicationName, "LunarWM", + XR_MAX_APPLICATION_NAME_SIZE); + strncpy( + (char *)app_info.engineName, "LunarWM Engine", XR_MAX_ENGINE_NAME_SIZE); + + char const *required_instance_extensions[] = { + XR_EXT_DEBUG_UTILS_EXTENSION_NAME, + XR_MNDX_EGL_ENABLE_EXTENSION_NAME, + XR_KHR_OPENGL_ES_ENABLE_EXTENSION_NAME, + }; + char const *optional_instance_extensions[] = { + XR_EXT_HAND_TRACKING_EXTENSION_NAME, + }; + bool hand_tracking_ext_available = false; + char const **v_active_instance_extensions = vector_create(); + + uint32_t extension_properties_count = 0; + XrExtensionProperties *extension_properties; + if (xrEnumerateInstanceExtensionProperties( + nullptr, 0, &extension_properties_count, nullptr) + != XR_SUCCESS) { + wlr_log(WLR_ERROR, + "Failed to enumerate OpenXR instance extension properties (count)"); + return false; + } + extension_properties + = malloc(sizeof(*extension_properties) * extension_properties_count); + for (uint32_t i = 0; i < extension_properties_count; ++i) { + extension_properties[i].type = XR_TYPE_EXTENSION_PROPERTIES; + extension_properties[i].next = NULL; + } + + if (xrEnumerateInstanceExtensionProperties(nullptr, + extension_properties_count, &extension_properties_count, + extension_properties) + != XR_SUCCESS) { + wlr_log(WLR_ERROR, + "Failed to enumerate OpenXR instance extension properties"); + return false; + } + + for (size_t i = 0; i < ARRAY_SZ(required_instance_extensions); i++) { + char const *requested_instance_extension + = required_instance_extensions[i]; + bool found = false; + for (int j = 0; j < extension_properties_count; j++) { + if (strcmp(requested_instance_extension, + extension_properties[j].extensionName) + != 0) { + continue; + } + + vector_add( + &v_active_instance_extensions, requested_instance_extension); + found = true; + break; + } + + if (!found) { + wlr_log(WLR_ERROR, "Failed to find OpenXR instance extension: %s", + requested_instance_extension); + return false; + } + } + + for (size_t i = 0; i < ARRAY_SZ(optional_instance_extensions); i++) { + char const *requested_instance_extension + = optional_instance_extensions[i]; + bool found = false; + for (int j = 0; j < extension_properties_count; j++) { + if (strcmp(requested_instance_extension, + extension_properties[j].extensionName) + != 0) { + continue; + } + + vector_add( + &v_active_instance_extensions, requested_instance_extension); + found = true; + break; + } + + if (!found) { + wlr_log(WLR_INFO, "Optional OpenXR instance extension missing: %s", + requested_instance_extension); + } else if (strcmp(requested_instance_extension, + XR_EXT_HAND_TRACKING_EXTENSION_NAME) + == 0) { + hand_tracking_ext_available = true; + } + } + + { + XrInstanceCreateInfo const ci = { + .type = XR_TYPE_INSTANCE_CREATE_INFO, + .next = nullptr, + .createFlags = 0, + .applicationInfo = app_info, + .enabledApiLayerCount = 0, + .enabledApiLayerNames = nullptr, + .enabledExtensionCount + = (uint32_t)vector_size(v_active_instance_extensions), + .enabledExtensionNames = v_active_instance_extensions, + }; + + XrInstance instance = nullptr; + if (xrCreateInstance(&ci, &instance) != XR_SUCCESS) { + wlr_log(WLR_ERROR, "Failed to create OpenXR instance"); + return false; + } + this->xr.instance = instance; + + this->xr.CreateHandTrackerEXT = NULL; + this->xr.DestroyHandTrackerEXT = NULL; + this->xr.LocateHandJointsEXT = NULL; + + if (hand_tracking_ext_available) { + res = xrGetInstanceProcAddr(this->xr.instance, + "xrCreateHandTrackerEXT", + (PFN_xrVoidFunction *)&this->xr.CreateHandTrackerEXT); + if (res != XR_SUCCESS) { + wlr_log(WLR_ERROR, + "Failed to get proc addr xrCreateHandTrackerEXT " + "(optional): %d", + res); + hand_tracking_ext_available = false; + } + } + if (hand_tracking_ext_available) { + res = xrGetInstanceProcAddr(this->xr.instance, + "xrDestroyHandTrackerEXT", + (PFN_xrVoidFunction *)&this->xr.DestroyHandTrackerEXT); + if (res != XR_SUCCESS) { + wlr_log(WLR_ERROR, + "Failed to get proc addr xrDestroyHandTrackerEXT " + "(optional): %d", + res); + hand_tracking_ext_available = false; + } + } + if (hand_tracking_ext_available) { + res = xrGetInstanceProcAddr(this->xr.instance, + "xrLocateHandJointsEXT", + (PFN_xrVoidFunction *)&this->xr.LocateHandJointsEXT); + if (res != XR_SUCCESS) { + wlr_log(WLR_ERROR, + "Failed to get proc addr xrLocateHandJointsEXT (optional): " + "%d", + res); + hand_tracking_ext_available = false; + } + } + } + + { + XrSystemGetInfo gi = { + .type = XR_TYPE_SYSTEM_GET_INFO, + .next = nullptr, + }; + + XrFormFactor const factors[2] = { + XR_FORM_FACTOR_HEAD_MOUNTED_DISPLAY, + XR_FORM_FACTOR_HANDHELD_DISPLAY, + }; + for (size_t i = 0; i < ARRAY_SZ(factors); i++) { + auto factor = factors[i]; + + gi.formFactor = factor; + XrSystemId system_id = 0; + if (xrGetSystem(this->xr.instance, &gi, &system_id) == XR_SUCCESS) { + this->xr.system_id = system_id; + break; + } + } + + if (!this->xr.system_id) { + wlr_log(WLR_ERROR, "Failed to find valid form factor"); + return false; + } + } + + { + this->xr.hand_tracking_enabled = hand_tracking_ext_available; + XrSystemProperties system_props = { + .type = XR_TYPE_SYSTEM_PROPERTIES, + .next = this->xr.hand_tracking_enabled + ? &this->xr.hand_tracking_system_properties + : NULL, + }; + res = xrGetSystemProperties( + this->xr.instance, this->xr.system_id, &system_props); + if (res != XR_SUCCESS) { + wlr_log(WLR_ERROR, "xrGetSystemProperties failed: %d", res); + return false; + } + if (this->xr.hand_tracking_enabled + && !this->xr.hand_tracking_system_properties.supportsHandTracking) { + wlr_log(WLR_INFO, + "Hand tracking extension present but system does not support " + "it"); + this->xr.hand_tracking_enabled = false; + } + } + + XrGraphicsRequirementsOpenGLESKHR reqs = { + .type = XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_ES_KHR, + .next = nullptr, + }; + PFN_xrGetOpenGLESGraphicsRequirementsKHR + xrGetOpenGLESGraphicsRequirementsKHR + = nullptr; + xrGetInstanceProcAddr(this->xr.instance, + "xrGetOpenGLESGraphicsRequirementsKHR", + (PFN_xrVoidFunction *)&xrGetOpenGLESGraphicsRequirementsKHR); + if (xrGetOpenGLESGraphicsRequirementsKHR( + this->xr.instance, this->xr.system_id, &reqs) + != XR_SUCCESS) { + wlr_log(WLR_ERROR, "Failed to get GLES graphics requirements"); + return false; + } + wlr_log(WLR_INFO, "OpenGL ES range: %d.%d.%d - %d.%d.%d\n", + XR_VERSION_MAJOR(reqs.minApiVersionSupported), + XR_VERSION_MINOR(reqs.minApiVersionSupported), + XR_VERSION_PATCH(reqs.minApiVersionSupported), + XR_VERSION_MAJOR(reqs.maxApiVersionSupported), + XR_VERSION_MINOR(reqs.maxApiVersionSupported), + XR_VERSION_PATCH(reqs.maxApiVersionSupported)); + + wlr_log(WLR_DEBUG, "Creating XR stuff.."); + + glEnable(GL_DEBUG_OUTPUT_KHR); + glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR); + + { + XrGraphicsBindingEGLMNDX gbind = { + .type = XR_TYPE_GRAPHICS_BINDING_EGL_MNDX, + .next = nullptr, + .getProcAddress = eglGetProcAddress, + .display = this->wayland.egl_display, + .config = this->wayland.egl_config, + .context = this->wayland.egl_context, + }; + + XrSessionCreateInfo const ci = { + .type = XR_TYPE_SESSION_CREATE_INFO, + .next = &gbind, + .createFlags = 0, + .systemId = this->xr.system_id, + }; + + if (xrCreateSession(this->xr.instance, &ci, &this->xr.session) + != XR_SUCCESS) { + wlr_log(WLR_ERROR, "Failed to create OpenXR session"); + return false; + } + } + + // Swapchain time! + wlr_log(WLR_DEBUG, "Creating XR swapchains..."); + XrViewConfigurationType *a_view_config_types; + uint32_t view_config_types_count = 0; + { + if (xrEnumerateViewConfigurations(this->xr.instance, this->xr.system_id, + 0, &view_config_types_count, nullptr) + != XR_SUCCESS) { + wlr_log(WLR_ERROR, + "Failed to get amount of OpenXR view configurations"); + return false; + } + a_view_config_types + = malloc(sizeof(*a_view_config_types) * view_config_types_count); + for (uint32_t i = 0; i < this->xr.view_configuration_views_count; ++i) { + this->xr.a_view_configuration_views[i].type + = XR_TYPE_VIEW_CONFIGURATION_VIEW; + this->xr.a_view_configuration_views[i].next = NULL; + } + if (xrEnumerateViewConfigurations(this->xr.instance, this->xr.system_id, + view_config_types_count, &view_config_types_count, + a_view_config_types) + != XR_SUCCESS) { + wlr_log( + WLR_ERROR, "Failed to enumerate OpenXR view configurations"); + return false; + } + } + + { + bool found = false; + for (size_t i = 0; i < view_config_types_count; i++) { + if (a_view_config_types[i] + == XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO) { + found = true; + break; + } + } + if (!found) { + wlr_log(WLR_ERROR, + "XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO not present"); + return false; + } + } + + { + if (xrEnumerateViewConfigurationViews(this->xr.instance, + this->xr.system_id, XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO, + 0, &this->xr.view_configuration_views_count, nullptr) + != XR_SUCCESS) { + wlr_log(WLR_ERROR, + "Failed to get amount of OpenXR view configuration views"); + return false; + } + this->xr.a_view_configuration_views + = malloc(sizeof(*this->xr.a_view_configuration_views) + * this->xr.view_configuration_views_count); + for (uint32_t i = 0; i < this->xr.view_configuration_views_count; ++i) { + this->xr.a_view_configuration_views[i].type + = XR_TYPE_VIEW_CONFIGURATION_VIEW; + this->xr.a_view_configuration_views[i].next = NULL; + } + if (xrEnumerateViewConfigurationViews(this->xr.instance, + this->xr.system_id, XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO, + this->xr.view_configuration_views_count, + &this->xr.view_configuration_views_count, + this->xr.a_view_configuration_views) + != XR_SUCCESS) { + wlr_log(WLR_ERROR, + "Failed to enumerate OpenXR view configuration views"); + return false; + } + } + + int64_t *a_swapchain_formats; + uint32_t a_swapchain_formats_count = 0; + { + if (xrEnumerateSwapchainFormats( + this->xr.session, 0, &a_swapchain_formats_count, nullptr) + != XR_SUCCESS) { + wlr_log( + WLR_ERROR, "Failed to get amount of OpenXR swapchain formats"); + return false; + } + a_swapchain_formats + = malloc(sizeof(*a_swapchain_formats) * a_swapchain_formats_count); + if (xrEnumerateSwapchainFormats(this->xr.session, + a_swapchain_formats_count, &a_swapchain_formats_count, + a_swapchain_formats) + != XR_SUCCESS) { + wlr_log(WLR_ERROR, "Failed to enumerate OpenXR swapchain formats"); + return false; + } + } + + { + bool found = false; + for (size_t i = 0; i < a_swapchain_formats_count; i++) { + if (a_swapchain_formats[i] == GL_DEPTH_COMPONENT16) { + found = true; + break; + } + } + if (!found) { + wlr_log( + WLR_ERROR, "Failed to find satisfying depth swapchain format"); + return false; + } + } + + auto const swapchain_format_depth = GL_DEPTH_COMPONENT24; + auto const swapchain_format_color = GL_RGBA8; + + { + bool found = false; + for (size_t i = 0; i < a_swapchain_formats_count; i++) { + if (a_swapchain_formats[i] == swapchain_format_color) { + found = true; + break; + } + } + if (!found) { + wlr_log( + WLR_ERROR, "Failed to find satisfying color swapchain format"); + return false; + } + } + + uint32_t const view_count = this->xr.view_configuration_views_count; + uint32_t const eye_w + = this->xr.a_view_configuration_views[0].recommendedImageRectWidth; + uint32_t const eye_h + = this->xr.a_view_configuration_views[0].recommendedImageRectHeight; + uint32_t const buf_w = eye_w * view_count; + + if (!this->xr.swapchains.v_color) { + this->xr.swapchains.v_color = vector_create(); + } + if (!this->xr.swapchains.v_depth) { + this->xr.swapchains.v_depth = vector_create(); + } + + vector_add(&this->xr.swapchains.v_color, (LunarWM_SwapchainInfo) {}); + vector_add(&this->xr.swapchains.v_depth, (LunarWM_SwapchainInfo) {}); + + { + auto *color_sc = &this->xr.swapchains.v_color[0]; + auto *depth_sc = &this->xr.swapchains.v_depth[0]; + auto *vcv = &this->xr.a_view_configuration_views[0]; + + { // Create color swapchain + XrSwapchainCreateInfo const ci = { + .type = XR_TYPE_SWAPCHAIN_CREATE_INFO, + .next = nullptr, + .createFlags = 0, + .usageFlags = XR_SWAPCHAIN_USAGE_COLOR_ATTACHMENT_BIT, + .format = swapchain_format_color, + .sampleCount = vcv->recommendedSwapchainSampleCount, + .width = buf_w, + .height = eye_h, + .faceCount = 1, + .arraySize = 1, + .mipCount = 1, + }; + color_sc->swapchain_format = ci.format; + + if (xrCreateSwapchain(this->xr.session, &ci, &color_sc->swapchain) + != XR_SUCCESS) { + wlr_log(WLR_ERROR, "Failed to create OpenXR color swapchain"); + return false; + } + } + + { // Create depth swapchain + XrSwapchainCreateInfo const ci = { + .type = XR_TYPE_SWAPCHAIN_CREATE_INFO, + .next = nullptr, + .createFlags = 0, + .usageFlags = XR_SWAPCHAIN_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, + .format = swapchain_format_depth, + .sampleCount = vcv->recommendedSwapchainSampleCount, + .width = buf_w, + .height = eye_h, + .faceCount = 1, + .arraySize = 1, + .mipCount = 1, + }; + depth_sc->swapchain_format = ci.format; + + if (xrCreateSwapchain(this->xr.session, &ci, &depth_sc->swapchain) + != XR_SUCCESS) { + wlr_log(WLR_ERROR, "Failed to create OpenXR depth swapchain"); + return false; + } + } + + // Enumerate swapchain images + { // Color + this->xr.swapchain_images[0].handle = color_sc->swapchain; + if (xrEnumerateSwapchainImages(color_sc->swapchain, 0, + &this->xr.swapchain_images[0].a_imgs_count, nullptr) + != XR_SUCCESS) { + wlr_log( + WLR_ERROR, "Failed to get Color Swapchain Images count."); + return false; + } + this->xr.swapchain_images[0].a_imgs + = malloc(sizeof(*this->xr.swapchain_images[0].a_imgs) + * this->xr.swapchain_images[0].a_imgs_count); + for (uint32_t i = 0; i < this->xr.swapchain_images[0].a_imgs_count; + ++i) { + this->xr.swapchain_images[0].a_imgs[i].type + = XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR; + this->xr.swapchain_images[0].a_imgs[i].next = NULL; + } + if (xrEnumerateSwapchainImages(color_sc->swapchain, + this->xr.swapchain_images[0].a_imgs_count, + &this->xr.swapchain_images[0].a_imgs_count, + (XrSwapchainImageBaseHeader *)this->xr.swapchain_images[0] + .a_imgs) + != XR_SUCCESS) { + wlr_log( + WLR_ERROR, "Failed to enumerate color swapchain images."); + return false; + } + } + { // Depth + this->xr.swapchain_images[1].handle = depth_sc->swapchain; + if (xrEnumerateSwapchainImages(depth_sc->swapchain, 0, + &this->xr.swapchain_images[1].a_imgs_count, nullptr) + != XR_SUCCESS) { + wlr_log( + WLR_ERROR, "Failed to get depth Swapchain Images count."); + return false; + } + this->xr.swapchain_images[1].a_imgs + = malloc(sizeof(*this->xr.swapchain_images[1].a_imgs) + * this->xr.swapchain_images[1].a_imgs_count); + for (uint32_t i = 0; i < this->xr.swapchain_images[1].a_imgs_count; + ++i) { + this->xr.swapchain_images[1].a_imgs[i].type + = XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR; + this->xr.swapchain_images[1].a_imgs[i].next = NULL; + } + if (xrEnumerateSwapchainImages(depth_sc->swapchain, + this->xr.swapchain_images[1].a_imgs_count, + &this->xr.swapchain_images[1].a_imgs_count, + (XrSwapchainImageBaseHeader *)this->xr.swapchain_images[1] + .a_imgs) + != XR_SUCCESS) { + wlr_log( + WLR_ERROR, "Failed to enumerate depth swapchain images."); + return false; + } + } + + // Get image views + for (uint32_t j = 0; j < this->xr.swapchain_images[0].a_imgs_count; + j++) { + GLuint framebuffer = 0; + glGenFramebuffers(1, &framebuffer); + + GLenum const attachment = GL_COLOR_ATTACHMENT0; + + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, attachment, + GL_TEXTURE_2D, LunarWM_xr_get_swapchain_image(this, 0, j), 0); + + GLenum const result = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER); + if (result != GL_FRAMEBUFFER_COMPLETE) { + wlr_log(WLR_ERROR, "Failed to create color framebuffer"); + return false; + } + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + if (!color_sc->v_image_views) { + color_sc->v_image_views = vector_create(); + } + vector_add(&color_sc->v_image_views, framebuffer); + } + + for (uint32_t j = 0; j < this->xr.swapchain_images[1].a_imgs_count; + j++) { + GLuint framebuffer = 0; + glGenFramebuffers(1, &framebuffer); + + GLenum const attachment = GL_DEPTH_ATTACHMENT; + + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, attachment, + GL_TEXTURE_2D, LunarWM_xr_get_swapchain_image(this, 1, j), 0); + + GLenum const result = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER); + if (result != GL_FRAMEBUFFER_COMPLETE) { + wlr_log(WLR_ERROR, "Failed to create depth framebuffer"); + return false; + } + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + if (!depth_sc->v_image_views) { + depth_sc->v_image_views = vector_create(); + } + vector_add(&depth_sc->v_image_views, framebuffer); + } + } + + assert(this->xr.instance); + assert(this->xr.system_id); + + wlr_log(WLR_DEBUG, "Fetching blend modes..."); + XrEnvironmentBlendMode *a_environment_blend_modes; + uint32_t a_environment_blend_modes_count = 0; + { // Get available blend modes + if (xrEnumerateEnvironmentBlendModes(this->xr.instance, + this->xr.system_id, XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO, + 0, &a_environment_blend_modes_count, nullptr) + != XR_SUCCESS) { + wlr_log( + WLR_ERROR, "Failed to get OpenXR environment blend mode count"); + return false; + } + a_environment_blend_modes = malloc(sizeof(*a_environment_blend_modes) + * a_environment_blend_modes_count); + if (xrEnumerateEnvironmentBlendModes(this->xr.instance, + this->xr.system_id, XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO, + a_environment_blend_modes_count, + &a_environment_blend_modes_count, a_environment_blend_modes) + != XR_SUCCESS) { + wlr_log(WLR_ERROR, "Failed to get XR environment blend modes"); + return false; + } + } + XrEnvironmentBlendMode const requested_environment_blend_modes[] = { + XR_ENVIRONMENT_BLEND_MODE_OPAQUE, + XR_ENVIRONMENT_BLEND_MODE_ADDITIVE, + XR_ENVIRONMENT_BLEND_MODE_MAX_ENUM, + }; + + for (size_t i = 0; i < ARRAY_SZ(requested_environment_blend_modes); i++) { + this->xr.environment_blend_mode = requested_environment_blend_modes[i]; + bool found = false; + for (size_t j = 0; j < a_environment_blend_modes_count; j++) { + if (requested_environment_blend_modes[i] + == a_environment_blend_modes[j]) { + found = true; + break; + } + } + if (found) { + break; + } + } + if (this->xr.environment_blend_mode == XR_ENVIRONMENT_BLEND_MODE_MAX_ENUM) { + wlr_log(WLR_INFO, + "Failed to find a compatible blend mode. Defaulting to " + "XR_ENVIRONMENT_BLEND_MODE_OPAQUE."); + this->xr.environment_blend_mode = XR_ENVIRONMENT_BLEND_MODE_OPAQUE; + } + + wlr_log(WLR_DEBUG, "Getting reference space..."); + { // Reference space + XrReferenceSpaceCreateInfo const ci = { + .type = XR_TYPE_REFERENCE_SPACE_CREATE_INFO, + .next = nullptr, + .referenceSpaceType = XR_REFERENCE_SPACE_TYPE_LOCAL, + .poseInReferenceSpace = { .orientation = { 0.0f, 0.0f, 0.0f, 1.0f }, + .position = { 0.0f, 0.0f, 0.0f } }, + }; + + if (xrCreateReferenceSpace(this->xr.session, &ci, &this->xr.local_space) + != XR_SUCCESS) { + wlr_log(WLR_ERROR, "Failed to create OpenXR reference space"); + return false; + } + } + + { // View reference space + XrReferenceSpaceCreateInfo const ci = { + .type = XR_TYPE_REFERENCE_SPACE_CREATE_INFO, + .next = nullptr, + .referenceSpaceType = XR_REFERENCE_SPACE_TYPE_VIEW, + .poseInReferenceSpace = { .orientation = { 0.0f, 0.0f, 0.0f, 1.0f }, + .position = { 0.0f, 0.0f, 0.0f } }, + }; + + if (xrCreateReferenceSpace(this->xr.session, &ci, &this->xr.view_space) + != XR_SUCCESS) { + wlr_log(WLR_ERROR, "Failed to create OpenXR reference space"); + return false; + } + } + + if (this->xr.hand_tracking_enabled && this->xr.CreateHandTrackerEXT) { + bool hand_trackers_created = true; + for (size_t i = 0; i < 2; i++) { + auto *hand = &this->xr.hands[i]; + + XrHandTrackerCreateInfoEXT const ci = { + .type = XR_TYPE_HAND_TRACKER_CREATE_INFO_EXT, + .hand = i == 0 ? XR_HAND_LEFT_EXT : XR_HAND_RIGHT_EXT, + .handJointSet = XR_HAND_JOINT_SET_DEFAULT_EXT, + }; + + res = this->xr.CreateHandTrackerEXT( + this->xr.session, &ci, &hand->hand_tracker); + if (res != XR_SUCCESS) { + wlr_log(WLR_ERROR, "Failed to create hand tracker: %d", res); + hand_trackers_created = false; + break; + } + } + if (!hand_trackers_created) { + if (this->xr.DestroyHandTrackerEXT) { + for (size_t i = 0; i < 2; i++) { + auto *hand = &this->xr.hands[i]; + if (hand->hand_tracker != XR_NULL_HANDLE) { + this->xr.DestroyHandTrackerEXT(hand->hand_tracker); + hand->hand_tracker = XR_NULL_HANDLE; + } + } + } + this->xr.hand_tracking_enabled = false; + } + } + if (!this->xr.hand_tracking_enabled) { + for (size_t i = 0; i < 2; i++) { + this->xr.hands[i].hand_tracker = XR_NULL_HANDLE; + } + this->xr.hand_tracking_system_properties.supportsHandTracking + = XR_FALSE; + } + + free(extension_properties); + free(a_view_config_types); + free(a_swapchain_formats); + free(a_environment_blend_modes); + vector_free(v_active_instance_extensions); + + wlr_log(WLR_INFO, "OpenXR initialized."); + + return true; +} + +static void free_swapchain_info(LunarWM_SwapchainInfo *sc) +{ + if (!sc) + return; + if (sc->v_image_views) { + for (size_t i = 0; i < vector_size(sc->v_image_views); ++i) { + GLuint fb = sc->v_image_views[i]; + if (fb) + glDeleteFramebuffers(1, &fb); + } + vector_free(sc->v_image_views); + sc->v_image_views = NULL; + } + if (sc->swapchain) { + xrDestroySwapchain(sc->swapchain); + sc->swapchain = XR_NULL_HANDLE; + } +} + +void LunarWM_xr_cleanup(LunarWM *this) +{ + for (int i = 0; i < 2; ++i) { + if (this->xr.swapchain_images[i].a_imgs) { + free(this->xr.swapchain_images[i].a_imgs); + this->xr.swapchain_images[i].a_imgs = NULL; + this->xr.swapchain_images[i].a_imgs_count = 0; + } + } + + if (this->xr.swapchains.v_color) { + for (size_t i = 0; i < vector_size(this->xr.swapchains.v_color); ++i) + free_swapchain_info(&this->xr.swapchains.v_color[i]); + vector_free(this->xr.swapchains.v_color); + this->xr.swapchains.v_color = NULL; + } + if (this->xr.swapchains.v_depth) { + for (size_t i = 0; i < vector_size(this->xr.swapchains.v_depth); ++i) + free_swapchain_info(&this->xr.swapchains.v_depth[i]); + vector_free(this->xr.swapchains.v_depth); + this->xr.swapchains.v_depth = NULL; + } + + if (this->renderer.fbo) { + glDeleteFramebuffers(1, &this->renderer.fbo); + this->renderer.fbo = 0; + } + this->renderer.tmp_rt = (RenderTexture2D) { 0 }; + + if (this->xr.view_space) + xrDestroySpace(this->xr.view_space), + this->xr.view_space = XR_NULL_HANDLE; + if (this->xr.local_space) + xrDestroySpace(this->xr.local_space), + this->xr.local_space = XR_NULL_HANDLE; + + for (size_t i = 0; i < 2; ++i) { + if (this->xr.hands[i].hand_tracker && this->xr.DestroyHandTrackerEXT) + this->xr.DestroyHandTrackerEXT(this->xr.hands[i].hand_tracker); + this->xr.hands[i].hand_tracker = XR_NULL_HANDLE; + } + + if (this->xr.a_view_configuration_views) { + free(this->xr.a_view_configuration_views); + this->xr.a_view_configuration_views = NULL; + this->xr.view_configuration_views_count = 0; + } + + if (this->xr.session != XR_NULL_HANDLE) { + xrDestroySession(this->xr.session); + this->xr.session = XR_NULL_HANDLE; + this->xr.session_running = false; + } + + if (this->xr.instance) + xrDestroyInstance(this->xr.instance), + this->xr.instance = XR_NULL_HANDLE; +} +void LunarWM_xr_poll_events(LunarWM *this) +{ + XrEventDataBuffer event_data = { + .type = XR_TYPE_EVENT_DATA_BUFFER, + }; + + while (xrPollEvent(this->xr.instance, &event_data) == XR_SUCCESS) { + switch (event_data.type) { + case XR_TYPE_EVENT_DATA_EVENTS_LOST: { + auto *el = (XrEventDataEventsLost *)&event_data; + wlr_log(WLR_INFO, "OPENXR: Events Lost: %d", el->lostEventCount); + break; + } + case XR_TYPE_EVENT_DATA_INSTANCE_LOSS_PENDING: { + auto *ilp = (XrEventDataInstanceLossPending *)&event_data; + wlr_log(WLR_INFO, "OPENXR: Instance Loss Pending at: %ld", + ilp->lossTime); + this->xr.session_running = false; + this->running = false; + break; + } + case XR_TYPE_EVENT_DATA_INTERACTION_PROFILE_CHANGED: { + auto *ipc = (XrEventDataInteractionProfileChanged *)&event_data; + wlr_log(WLR_INFO, + "OPENXR: Interaction Profile changed for Session: " + "%p", + ipc->session); + if (ipc->session != this->xr.session) { + wlr_log(WLR_ERROR, + "XrEventDataInteractionProfileChanged for " + "unknown Session"); + break; + } + break; + } + case XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING: { + auto *scp = (XrEventDataReferenceSpaceChangePending *)&event_data; + wlr_log(WLR_INFO, + "OPENXR: Reference Space Change pending for " + "Session: %p", + scp->session); + if (scp->session != this->xr.session) { + wlr_log(WLR_ERROR, + "XrEventDataReferenceSpaceChangePending for " + "unknown " + "Session"); + break; + } + break; + } + case XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED: { + auto *sc = (XrEventDataSessionStateChanged *)&event_data; + if (sc->session != this->xr.session) { + wlr_log(WLR_ERROR, + "XrEventDataSessionStateChanged for unknown " + "Session"); + break; + } + + if (sc->state == XR_SESSION_STATE_READY) { + XrSessionBeginInfo bi = { .type = XR_TYPE_SESSION_BEGIN_INFO }; + bi.primaryViewConfigurationType + = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO; + bi.primaryViewConfigurationType + = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO; + if (xrBeginSession(this->xr.session, &bi) != XR_SUCCESS) { + wlr_log(WLR_ERROR, "Failed to begin session"); + } else { + this->xr.session_running = true; + } + } + if (sc->state == XR_SESSION_STATE_STOPPING) { + if (xrEndSession(this->xr.session) != XR_SUCCESS) { + wlr_log(WLR_ERROR, "Failed to end session"); + } + this->xr.session_running = false; + } + if (sc->state == XR_SESSION_STATE_EXITING) { + this->xr.session_running = false; + this->running = false; + } + if (sc->state == XR_SESSION_STATE_LOSS_PENDING) { + this->xr.session_running = false; + this->running = false; + } + this->xr.session_state = sc->state; + break; + } + default: { + break; + } + } + } +} + +bool LunarWM_xr_acquire_wait(XrSwapchain sc, uint32_t *idx) +{ + XrSwapchainImageAcquireInfo ai + = { .type = XR_TYPE_SWAPCHAIN_IMAGE_ACQUIRE_INFO, .next = NULL }; + if (xrAcquireSwapchainImage(sc, &ai, idx) != XR_SUCCESS) { + return false; + } + + XrSwapchainImageWaitInfo wi = { .type = XR_TYPE_SWAPCHAIN_IMAGE_WAIT_INFO, + .next = NULL, + .timeout = XR_INFINITE_DURATION }; + return xrWaitSwapchainImage(sc, &wi) == XR_SUCCESS; +} diff --git a/src/LunarWM_xr.h b/src/LunarWM_xr.h new file mode 100644 index 0000000..e526d15 --- /dev/null +++ b/src/LunarWM_xr.h @@ -0,0 +1,13 @@ +#ifndef LUNAR_WM_XR_H +#define LUNAR_WM_XR_H + +#include "LunarWM_types.h" + +bool LunarWM_xr_init(LunarWM *wm); +void LunarWM_xr_cleanup(LunarWM *wm); +void LunarWM_xr_poll_events(LunarWM *wm); +bool LunarWM_xr_acquire_wait(XrSwapchain sc, uint32_t *idx); +GLuint LunarWM_xr_get_swapchain_image( + LunarWM *wm, int swapchain_images_i, uint32_t index); + +#endif diff --git a/src/RayExt.c b/src/RayExt.c new file mode 100644 index 0000000..3169ea0 --- /dev/null +++ b/src/RayExt.c @@ -0,0 +1,118 @@ +#include "RayExt.h" + +#include + +#include +#include +#include + +static char const *SKYBOX_VS + = "#version 300 es\n" + "precision mediump float;\n" + "layout(location=0) in vec3 vertexPosition;\n" + "uniform mat4 mvp;\n" + "out vec3 vDir;\n" + "void main(){\n" + "\tvDir = vertexPosition;\n" + "\tvec4 pos = mvp * vec4(vertexPosition, 1.0);\n" + "\tgl_Position = vec4(pos.xy, pos.w, pos.w); // z := 1 after division\n" + "}\n"; +static char const *SKYBOX_FS + = "#version 300 es\n" + "precision highp float;\n" + "in vec3 vDir;\n" + "uniform samplerCube environmentMap;\n" + "out vec4 finalColor;\n" + "void main(){ vec3 dir=normalize(vDir); " + "finalColor=vec4(texture(environmentMap, normalize(vDir)).rgb, 1.0); }\n"; + +void Skybox_init(Skybox *skybox, char const *fp) +{ + if (skybox->ok) { + Skybox_destroy(skybox); + } + + // 1) Load cubemap from a 3x4 cross image + Image img = LoadImage(fp); + if (img.width == 0 || img.height == 0) { + TraceLog(LOG_ERROR, "Skybox: failed to load image: %s", fp); + skybox->ok = false; + return; + } + + TextureCubemap cubemap + = LoadTextureCubemap(img, CUBEMAP_LAYOUT_AUTO_DETECT); + UnloadImage(img); + if (cubemap.id == 0) { + TraceLog(LOG_ERROR, "Skybox: failed to create cubemap from %s", fp); + skybox->ok = false; + return; + } + + // 2) Make an inward-facing cube mesh + Mesh m = GenMeshCube( + 2.0f, 2.0f, 2.0f); // size doesn't matter; depth writes off + // Invert winding so we see the inside + for (int i = 0; i < m.triangleCount; ++i) { + unsigned short *idx = &m.indices[i * 3]; + unsigned short tmp = idx[1]; + idx[1] = idx[2]; + idx[2] = tmp; + } + UploadMesh(&m, false); + Model cube = LoadModelFromMesh(m); + + Shader sh = LoadShaderFromMemory(SKYBOX_VS, SKYBOX_FS); + + // make raylib aware which sampler is the cubemap + sh.locs[SHADER_LOC_MAP_CUBEMAP] = GetShaderLocation(sh, "environmentMap"); + + cube.materials[0].shader = sh; + + // put the cubemap in the expected material slot + cube.materials[0].maps[MATERIAL_MAP_CUBEMAP].texture = cubemap; + + // nicer defaults + SetTextureWrap(cubemap, TEXTURE_WRAP_CLAMP); + SetTextureFilter(cubemap, TEXTURE_FILTER_BILINEAR); + + skybox->cubemap = cubemap; + skybox->shader = sh; + skybox->cube = cube; + skybox->ok = true; +} + +void Skybox_destroy(Skybox *skybox) +{ + if (!skybox->ok) + return; + + UnloadModel(skybox->cube); // also unloads Mesh + UnloadTexture(skybox->cubemap); + UnloadShader(skybox->shader); + + *skybox = (Skybox) { 0 }; +} + +void Skybox_draw(Skybox const skybox, Vector3 camPos) +{ + if (!skybox.ok) + return; + + rlDisableBackfaceCulling(); + rlDisableDepthMask(); + rlDisableColorBlend(); + + rlDrawRenderBatchActive(); + GLint oldFunc = 0; + glGetIntegerv(GL_DEPTH_FUNC, &oldFunc); + glDepthFunc(GL_LEQUAL); + + DrawModel(skybox.cube, camPos, 500.0f, (Color) { 255, 255, 255, 255 }); + rlDrawRenderBatchActive(); + + glDepthFunc(oldFunc ? oldFunc : GL_LESS); + rlEnableColorBlend(); + rlEnableDepthMask(); + rlEnableBackfaceCulling(); +} diff --git a/src/RayExt.h b/src/RayExt.h new file mode 100644 index 0000000..2237628 --- /dev/null +++ b/src/RayExt.h @@ -0,0 +1,18 @@ +#ifndef RAYEXT_H +#define RAYEXT_H + +#include + +typedef struct { + bool ok; + Model cube; + Shader shader; + TextureCubemap cubemap; +} Skybox; + +void Skybox_init(Skybox *skybox, char const *fp); +void Skybox_destroy(Skybox *skybox); + +void Skybox_draw(Skybox const skybox, Vector3 position); + +#endif // RAYEXT_H diff --git a/src/common.h b/src/common.h new file mode 100644 index 0000000..0e00b91 --- /dev/null +++ b/src/common.h @@ -0,0 +1,6 @@ +#ifndef COMMON_H +#define COMMON_H + +#define ARRAY_SZ(arr) (sizeof(arr) / sizeof(*arr)) + +#endif // COMMON_H diff --git a/src/lua_helpers.h b/src/lua_helpers.h new file mode 100644 index 0000000..9fd1bfb --- /dev/null +++ b/src/lua_helpers.h @@ -0,0 +1,78 @@ +#ifndef LUA_HELPERS_H +#define LUA_HELPERS_H + +#include +#include +#include + +static Vector3 lua_readVector3(lua_State *L, int index) +{ + Vector3 v = { 0 }; + + if (!lua_istable(L, index)) + return v; + + lua_getfield(L, index, "x"); + if (lua_isnumber(L, -1)) { + v.x = lua_tonumber(L, -1); + lua_pop(L, 1); + + lua_getfield(L, index, "y"); + v.y = luaL_optnumber(L, -1, 0); + lua_pop(L, 1); + + lua_getfield(L, index, "z"); + v.z = luaL_optnumber(L, -1, 0); + lua_pop(L, 1); + + return v; + } + lua_pop(L, 1); + + lua_rawgeti(L, index, 1); + v.x = luaL_optnumber(L, -1, 0); + lua_pop(L, 1); + + lua_rawgeti(L, index, 2); + v.y = luaL_optnumber(L, -1, 0); + lua_pop(L, 1); + + lua_rawgeti(L, index, 3); + v.z = luaL_optnumber(L, -1, 0); + lua_pop(L, 1); + + return v; +} + +static Vector2 lua_readVector2(lua_State *L, int index) +{ + Vector2 v = { 0 }; + + if (!lua_istable(L, index)) + return v; + + lua_getfield(L, index, "x"); + if (lua_isnumber(L, -1)) { + v.x = lua_tonumber(L, -1); + lua_pop(L, 1); + + lua_getfield(L, index, "y"); + v.y = luaL_optnumber(L, -1, 0); + lua_pop(L, 1); + + return v; + } + lua_pop(L, 1); + + lua_rawgeti(L, index, 1); + v.x = luaL_optnumber(L, -1, 0); + lua_pop(L, 1); + + lua_rawgeti(L, index, 2); + v.y = luaL_optnumber(L, -1, 0); + lua_pop(L, 1); + + return v; +} + +#endif // LUA_HELPERS_H diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..fe91853 --- /dev/null +++ b/src/main.c @@ -0,0 +1,16 @@ +#include +#include + +#include "LunarWM.h" + +LunarWM g_wm = {}; + +void sigint_handler(int) { LunarWM_terminate(&g_wm); } + +int main(void) +{ + assert(LunarWM_init(&g_wm)); + signal(SIGINT, sigint_handler); + LunarWM_run(&g_wm); + LunarWM_destroy(&g_wm); +} diff --git a/src/vec.c b/src/vec.c new file mode 100644 index 0000000..4848040 --- /dev/null +++ b/src/vec.c @@ -0,0 +1,148 @@ +/* +BSD 3-Clause License + +Copyright (c) 2024, Mashpoe +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "vec.h" +#include + +typedef struct +{ + vec_size_t size; + vec_size_t capacity; + unsigned char data[]; +} vector_header; + +vector_header* vector_get_header(vector vec) { return &((vector_header*)vec)[-1]; } + +vector vector_create(void) +{ + vector_header* h = (vector_header*)malloc(sizeof(vector_header)); + h->capacity = 0; + h->size = 0; + + return &h->data; +} + +void vector_free(vector vec) { free(vector_get_header(vec)); } + +vec_size_t vector_size(vector vec) { return vector_get_header(vec)->size; } + +vec_size_t vector_capacity(vector vec) { return vector_get_header(vec)->capacity; } + +vector_header* vector_realloc(vector_header* h, vec_type_t type_size) +{ + vec_size_t new_capacity = (h->capacity == 0) ? 1 : h->capacity * 2; + vector_header* new_h = (vector_header*)realloc(h, sizeof(vector_header) + new_capacity * type_size); + new_h->capacity = new_capacity; + + return new_h; +} + +bool vector_has_space(vector_header* h) +{ + return h->capacity - h->size > 0; +} + +void* _vector_add_dst(vector* vec_addr, vec_type_t type_size) +{ + vector_header* h = vector_get_header(*vec_addr); + + if (!vector_has_space(h)) + { + h = vector_realloc(h, type_size); + *vec_addr = h->data; + } + + return &h->data[type_size * h->size++]; +} + +void* _vector_insert_dst(vector* vec_addr, vec_type_t type_size, vec_size_t pos) +{ + vector_header* h = vector_get_header(*vec_addr); + + vec_size_t new_length = h->size + 1; + + // make sure there is enough room for the new element + if (!vector_has_space(h)) + { + h = vector_realloc(h, type_size); + *vec_addr = h->data; + } + // move trailing elements + memmove(&h->data[(pos + 1) * type_size], + &h->data[pos * type_size], + (h->size - pos) * type_size); + + h->size = new_length; + + return &h->data[pos * type_size]; +} + +void _vector_erase(vector vec, vec_type_t type_size, vec_size_t pos, vec_size_t len) +{ + vector_header* h = vector_get_header(vec); + memmove(&h->data[pos * type_size], + &h->data[(pos + len) * type_size], + (h->size - pos - len) * type_size); + + h->size -= len; +} + +void _vector_remove(vector vec, vec_type_t type_size, vec_size_t pos) +{ + _vector_erase(vec, type_size, pos, 1); +} + +void vector_pop(vector vec) { --vector_get_header(vec)->size; } + +void _vector_reserve(vector* vec_addr, vec_type_t type_size, vec_size_t capacity) +{ + vector_header* h = vector_get_header(*vec_addr); + if (h->capacity >= capacity) + { + return; + } + + h = (vector_header*)realloc(h, sizeof(vector_header) + capacity * type_size); + h->capacity = capacity; + *vec_addr = &h->data; +} + +vector _vector_copy(vector vec, vec_type_t type_size) +{ + vector_header* h = vector_get_header(vec); + size_t alloc_size = sizeof(vector_header) + h->size * type_size; + vector_header* copy_h = (vector_header*)malloc(alloc_size); + memcpy(copy_h, h, alloc_size); + copy_h->capacity = copy_h->size; + + return ©_h->data; +} \ No newline at end of file diff --git a/src/vec.h b/src/vec.h new file mode 100644 index 0000000..b4756c5 --- /dev/null +++ b/src/vec.h @@ -0,0 +1,128 @@ +/* +BSD 3-Clause License + +Copyright (c) 2024, Mashpoe +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef vec_h +#define vec_h + +#ifdef __cpp_decltype +# include +# define typeof(T) \ + std::remove_reference< \ + std::add_lvalue_reference::type>::type +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +// generic type for internal use +typedef void *vector; +// number of elements in a vector +typedef size_t vec_size_t; +// number of bytes for a type +typedef size_t vec_type_t; + +// TODO: more rigorous check for typeof support with different compilers +#if _MSC_VER == 0 || __STDC_VERSION__ >= 202311L || defined __cpp_decltype + +// shortcut defines + +// vec_addr is a vector* (aka type**) +# define vector_add_dst(vec_addr) \ + ((typeof(*vec_addr))(_vector_add_dst( \ + (vector *)vec_addr, sizeof(**vec_addr)))) +# define vector_insert_dst(vec_addr, pos) \ + ((typeof(*vec_addr))(_vector_insert_dst( \ + (vector *)vec_addr, sizeof(**vec_addr), pos))) + +# define vector_add(vec_addr, value) (*vector_add_dst(vec_addr) = value) +# define vector_insert(vec_addr, pos, value) \ + (*vector_insert_dst(vec_addr, pos) = value) + +#else + +# define vector_add_dst(vec_addr, type) \ + ((type *)_vector_add_dst((vector *)vec_addr, sizeof(type))) +# define vector_insert_dst(vec_addr, type, pos) \ + ((type *)_vector_insert_dst((vector *)vec_addr, sizeof(type), pos)) + +# define vector_add(vec_addr, type, value) \ + (*vector_add_dst(vec_addr, type) = value) +# define vector_insert(vec_addr, type, pos, value) \ + (*vector_insert_dst(vec_addr, type, pos) = value) + +#endif + +// vec is a vector (aka type*) +#define vector_erase(vec, pos, len) \ + (_vector_erase((vector)vec, sizeof(*vec), pos, len)) +#define vector_remove(vec, pos) (_vector_remove((vector)vec, sizeof(*vec), pos)) + +#define vector_reserve(vec_addr, capacity) \ + (_vector_reserve((vector *)vec_addr, sizeof(**vec_addr), capacity)) + +#define vector_copy(vec) (_vector_copy((vector)vec, sizeof(*vec))) + +vector vector_create(void); + +void vector_free(vector vec); + +void *_vector_add_dst(vector *vec_addr, vec_type_t type_size); + +void *_vector_insert_dst( + vector *vec_addr, vec_type_t type_size, vec_size_t pos); + +void _vector_erase( + vector vec_addr, vec_type_t type_size, vec_size_t pos, vec_size_t len); + +void _vector_remove(vector vec_addr, vec_type_t type_size, vec_size_t pos); + +void vector_pop(vector vec); + +void _vector_reserve( + vector *vec_addr, vec_type_t type_size, vec_size_t capacity); + +vector _vector_copy(vector vec, vec_type_t type_size); + +vec_size_t vector_size(vector vec); + +vec_size_t vector_capacity(vector vec); + +// closing bracket for extern "C" +#ifdef __cplusplus +} +#endif + +#endif /* vec_h */ diff --git a/tools/format.sh b/tools/format.sh new file mode 100755 index 0000000..8cae0fc --- /dev/null +++ b/tools/format.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT="$(git rev-parse --show-toplevel)" + +find "$ROOT/src" -type f -name '*.c' -o -name '*.h' -print0 | while IFS= read -r -d '' f; do + clang-format -i --style=file "$f" +done diff --git a/wlroots-lunar b/wlroots-lunar new file mode 160000 index 0000000..a9abd5a --- /dev/null +++ b/wlroots-lunar @@ -0,0 +1 @@ +Subproject commit a9abd5a6e4fb4e5ac6c410e1fb1ad438d3b12001