From 86ffc43c93d98410650d64197a7de3ff35f4a3c7 Mon Sep 17 00:00:00 2001 From: David Allemang Date: Sun, 27 Mar 2022 17:08:44 -0400 Subject: [PATCH] Copy infrastructure from tc --- .gitignore | 152 -------------- .gitmodules | 7 - CMakeLists.txt | 35 +++- External/eigen.cmake | 9 + External/glad.cmake | 9 + External/glfw.cmake | 10 + External/imgui.cmake | 22 ++ External/json.cmake | 7 + README.md | 21 -- images/default.png | Bin 36898 -> 0 bytes images/rotated.png | Bin 48961 -> 0 bytes images/zoomed.png | Bin 88054 -> 0 bytes include/geo/combo.hpp | 30 +++ include/geo/geometry.hpp | 63 ++++++ include/geo/mirror.hpp | 128 ++++++++++++ include/geo/solver.hpp | 233 +++++++++++++++++++++ include/ml/meshlib.hpp | 83 ++++++++ include/ml/meshlib_json.hpp | 68 ++++++ main/CMakeLists.txt | 29 --- main/include/glga.hpp | 165 --------------- main/shaders/main.frag | 20 -- main/shaders/main.geom | 47 ----- main/shaders/main.vert | 12 -- main/src/main.cpp | 397 ------------------------------------ res/shaders/4d.vert.glsl | 13 ++ res/shaders/main.frag.glsl | 12 ++ res/shaders/main.vert.glsl | 13 ++ src/gl/buffer.hpp | 53 +++++ src/gl/debug.hpp | 80 ++++++++ src/gl/shader.hpp | 79 +++++++ src/gl/types.hpp | 118 +++++++++++ src/gl/vertexarray.hpp | 67 ++++++ src/main.cpp | 293 ++++++++++++++++++++++++++ vendor/glad | 1 - vendor/glfw | 1 - 35 files changed, 1416 insertions(+), 861 deletions(-) delete mode 100644 .gitignore delete mode 100644 .gitmodules create mode 100644 External/eigen.cmake create mode 100644 External/glad.cmake create mode 100644 External/glfw.cmake create mode 100644 External/imgui.cmake create mode 100644 External/json.cmake delete mode 100644 README.md delete mode 100644 images/default.png delete mode 100644 images/rotated.png delete mode 100644 images/zoomed.png create mode 100644 include/geo/combo.hpp create mode 100644 include/geo/geometry.hpp create mode 100644 include/geo/mirror.hpp create mode 100644 include/geo/solver.hpp create mode 100644 include/ml/meshlib.hpp create mode 100644 include/ml/meshlib_json.hpp delete mode 100644 main/CMakeLists.txt delete mode 100644 main/include/glga.hpp delete mode 100644 main/shaders/main.frag delete mode 100644 main/shaders/main.geom delete mode 100644 main/shaders/main.vert delete mode 100644 main/src/main.cpp create mode 100644 res/shaders/4d.vert.glsl create mode 100644 res/shaders/main.frag.glsl create mode 100644 res/shaders/main.vert.glsl create mode 100644 src/gl/buffer.hpp create mode 100644 src/gl/debug.hpp create mode 100644 src/gl/shader.hpp create mode 100644 src/gl/types.hpp create mode 100644 src/gl/vertexarray.hpp create mode 100644 src/main.cpp delete mode 160000 vendor/glad delete mode 160000 vendor/glfw diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 05a71e0..0000000 --- a/.gitignore +++ /dev/null @@ -1,152 +0,0 @@ -# Created by .ignore support plugin (hsz.mobi) -### C template -# Prerequisites -*.d - -# Object files -*.o -*.ko -*.obj -*.elf - -# Linker output -*.ilk -*.map -*.exp - -# Precompiled Headers -*.gch -*.pch - -# Libraries -*.lib -*.a -*.la -*.lo - -# Shared objects (inc. Windows DLLs) -*.dll -*.so -*.so.* -*.dylib - -# Executables -*.exe -*.out -*.app -*.i*86 -*.x86_64 -*.hex - -# Debug files -*.dSYM/ -*.su -*.idb -*.pdb - -# Kernel Module Compile Results -*.mod* -*.cmd -.tmp_versions/ -modules.order -Module.symvers -Mkfile.old -dkms.conf -### CMake template -CMakeCache.txt -CMakeFiles -CMakeScripts -Testing -Makefile -cmake_install.cmake -install_manifest.txt -compile_commands.json -CTestTestfile.cmake -### JetBrains template -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm -# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 - -# User-specific stuff -.idea/**/workspace.xml -.idea/**/tasks.xml -.idea/**/dictionaries -.idea/**/shelf - -# Sensitive or high-churn files -.idea/**/dataSources/ -.idea/**/dataSources.ids -.idea/**/dataSources.local.xml -.idea/**/sqlDataSources.xml -.idea/**/dynamic.xml -.idea/**/uiDesigner.xml -.idea/**/dbnavigator.xml - -# Gradle -.idea/**/gradle.xml -.idea/**/libraries - -# CMake -cmake-build-debug/ -cmake-build-release/ - -# Mongo Explorer plugin -.idea/**/mongoSettings.xml - -# File-based project format -*.iws - -# IntelliJ -out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Cursive Clojure plugin -.idea/replstate.xml - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties - -# Editor-based Rest Client -.idea/httpRequests -### C++ template -# Prerequisites -*.d - -# Compiled Object files -*.slo -*.lo -*.o -*.obj - -# Precompiled Headers -*.gch -*.pch - -# Compiled Dynamic libraries -*.so -*.dylib -*.dll - -# Fortran module files -*.mod -*.smod - -# Compiled Static libraries -*.lai -*.la -*.a -*.lib - -# Executables -*.exe -*.out -*.app - -.idea/ \ No newline at end of file diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 74ae14a..0000000 --- a/.gitmodules +++ /dev/null @@ -1,7 +0,0 @@ -[submodule "vendor/glfw"] - path = vendor/glfw - url = https://github.com/glfw/glfw.git -[submodule "vendor/glad"] - path = vendor/glad - url = https://github.com/Dav1dde/glad.git - branch = c diff --git a/CMakeLists.txt b/CMakeLists.txt index 0028c7b..5c54245 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,14 +1,31 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.21) project(hopf) -set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD 20) -add_library(glad vendor/glad/src/glad.c) -target_include_directories(glad PUBLIC vendor/glad/include) +include(FetchContent) -option(GLFW_BUILD_DOCS OFF) -option(GLFW_BUILD_EXAMPLES OFF) -option(GLFW_BUILD_TESTS OFF) -add_subdirectory(vendor/glfw) +include(External/glfw.cmake) +include(External/imgui.cmake) +include(External/eigen.cmake) +include(External/glad.cmake) +include(External/json.cmake) -add_subdirectory(main) +include_directories(include) + +add_custom_target(resources DEPENDS resources_output) +add_custom_command( + OUTPUT resources_output + COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/res ${CMAKE_CURRENT_BINARY_DIR}/res + COMMENT "Copying Resources") + +add_executable(hopf + src/main.cpp + src/gl/debug.hpp + src/gl/shader.hpp + src/gl/buffer.hpp + src/gl/vertexarray.hpp + src/gl/types.hpp) + +target_link_libraries(hopf glfw glad imgui eigen nlohmann_json) +add_dependencies(hopf resources) diff --git a/External/eigen.cmake b/External/eigen.cmake new file mode 100644 index 0000000..78bd394 --- /dev/null +++ b/External/eigen.cmake @@ -0,0 +1,9 @@ +FetchContent_Declare( + eigen + GIT_REPOSITORY https://gitlab.com/libeigen/eigen.git + GIT_TAG 3.4 +) +set(EIGEN_BUILD_DOC OFF CACHE INTERNAL "") +set(BUILD_TESTING OFF CACHE INTERNAL "") +set(EIGEN_BUILD_PKGCONFIG OFF CACHE INTERNAL "") +FetchContent_MakeAvailable(eigen) diff --git a/External/glad.cmake b/External/glad.cmake new file mode 100644 index 0000000..dd71ac1 --- /dev/null +++ b/External/glad.cmake @@ -0,0 +1,9 @@ +FetchContent_Declare( + glad + GIT_REPOSITORY https://github.com/Dav1dde/glad.git + GIT_TAG v0.1.36 +) +set(GLAD_PROFILE "core" CACHE INTERNAL "OpenGL profile") +set(GLAD_API "gl=4.6" CACHE INTERNAL "API type/version pairs, like \"gl=3.2,gles=\", no version means latest") +set(GLAD_GENERATOR "c" CACHE INTERNAL "Language to generate the binding for") +FetchContent_MakeAvailable(glad) diff --git a/External/glfw.cmake b/External/glfw.cmake new file mode 100644 index 0000000..8e88164 --- /dev/null +++ b/External/glfw.cmake @@ -0,0 +1,10 @@ +FetchContent_Declare( + glfw + GIT_REPOSITORY https://github.com/glfw/glfw.git + GIT_TAG 3.3.6 +) +set(GLFW_BUILD_EXAMPLES OFF CACHE INTERNAL "") +set(GLFW_BUILD_TESTS OFF CACHE INTERNAL "") +set(GLFW_BUILD_DOCS OFF CACHE INTERNAL "") +set(GLFW_INSTALL OFF CACHE INTERNAL "") +FetchContent_MakeAvailable(glfw) diff --git a/External/imgui.cmake b/External/imgui.cmake new file mode 100644 index 0000000..d28c60f --- /dev/null +++ b/External/imgui.cmake @@ -0,0 +1,22 @@ +FetchContent_Declare( + imgui + GIT_REPOSITORY https://github.com/ocornut/imgui + GIT_TAG v1.86 +) +FetchContent_MakeAvailable(imgui) + +add_library( + imgui + ${imgui_SOURCE_DIR}/backends/imgui_impl_glfw.cpp + ${imgui_SOURCE_DIR}/backends/imgui_impl_glfw.h + ${imgui_SOURCE_DIR}/backends/imgui_impl_opengl3.cpp + ${imgui_SOURCE_DIR}/backends/imgui_impl_opengl3.h + ${imgui_SOURCE_DIR}/imgui.cpp + ${imgui_SOURCE_DIR}/imgui.h + ${imgui_SOURCE_DIR}/imgui_demo.cpp + ${imgui_SOURCE_DIR}/imgui_draw.cpp + ${imgui_SOURCE_DIR}/imgui_tables.cpp + ${imgui_SOURCE_DIR}/imgui_widgets.cpp +) +target_include_directories(imgui PUBLIC ${imgui_SOURCE_DIR}) +target_link_libraries(imgui PRIVATE glfw) diff --git a/External/json.cmake b/External/json.cmake new file mode 100644 index 0000000..fe5ed3a --- /dev/null +++ b/External/json.cmake @@ -0,0 +1,7 @@ +FetchContent_Declare( + json + GIT_REPOSITORY https://github.com/nlohmann/json.git + GIT_TAG v3.10.5 +) +SET(JSON_ImplicitConversions OFF CACHE INTERNAL "") +FetchContent_MakeAvailable(json) diff --git a/README.md b/README.md deleted file mode 100644 index 986e6f9..0000000 --- a/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# hopf-fibration - -Generate images of the hopf fibration. - -![zoomed](images/zoomed.png) - -## Usage - -Hold keys `Q`, `W`, `E`, `A`, `S`, `D` to select from the six planes of rotation, and use the scroll wheel to rotate the fibration through the selected plane. The resulting Hopf links are stereographically projected into 3D space, and the resulting circles are rendered orthographically on screen. - -Hold left-control `LCTL` and scroll to zoom in on the fibration. This affects only the orthographic rendering, not the fibration itself. - -![default](images/default.png) - -![rotated](images/rotated.png) - ---- - -## More information - -[Wikipedia: Hopf Fibration](https://en.wikipedia.org/wiki/Hopf_fibration) diff --git a/images/default.png b/images/default.png deleted file mode 100644 index b385ed991b6153005fc0af1ed9498131a8316b8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36898 zcmeFY`#;nD{|7!&t)kSWaz5m8m9(64K2}$hDMg53SST~6#A0U7V{H4rT<`bi^Zns_`~C+XH|+4*>-l^f?vMN9@q9d=dvg7nwZwke z{U8uX;>zVe?Lna3z*EsR@E+hHOa97t;6V(1;mS=g@Dl^R{TO&HbMMlvdk#Uq_aeMP zeL#MJK`0*x8WHN_6NtVObdR%(Yz_h`gRcB}{$^y}{Alca*zoz|8*3w&;o&hGlN4N; z<++=GMybo}r`eC$cK@!b{O8z%c$+Ahe%JRCpWCHnexoEm@!r#F7-Hqxfs453YoBq- z_WkQl$>3L)cf;;NXKzMBuc#1exaL&dIJaIBbJL7DPogncVI1noyA$SQG;P?!uaHD0 z6V^FS8xU$Vt=ePbvufHl-dZv0C!%mAk7>#^qDJ)=QDbIw3uOR}K=EFq_2`o$^=Rfr z@{$~RNrMw7+=}DxQrc*t3g;>Xb8vB$CP;#0;6uq)-GZg$OmpETRS1VKJ~(bF+!@Q- ze5w7n$t8-?p@@Z%*`e^AK|Md=VYRJ0e>=A|K2;kuF4))$Sm0?| z?8f9Hi)G+4X?VxYAgRUn-|P||DMtS)`u93!Vn?NwfUO-Y#K%SfgSJ%{^5>c6ixYnx z!bWmBcJ2aAn@!13BUg8(n2;gKiSE3Y9>JpF{Y-jWWYgD&I=B`Ra44W!CAcKlKcndXTD<`$+a*;H}i zFD1UxWMeaHfJ>NuX0dE7C|hjVbtr+eSwMf-7{N)PZst)B*qJW<8QCU>HEr7L3EBr= zbJWzNbx2-_T(2%vP>fmpxG3O~E%L&1OqV~aa{GlJ4`JWm$p?WjOG)I7q)8WQv{U5j zH|w^)4w*||08j2%-WfaX+!`d92}(TPy!g;%dOt`6w1-0+U9C9at{zA#e%n_}Gd(ju+4S#PA7|L2Zl+W;uNBdiTKvx6Q2 zwy@h@$c-vg!m{aD0GX|OEjB)4=JtXnK17gM`I9BsxsukxP2D(szzT;RNnY6K8Q<<% zY@n0$o92BAkD2qoTj-X#i710wCd{WDJmdkfVdS;ShqWX&${Eg$5cCS~QT^M|@D)Ay zR=+TghYHmIFw|Uv1%b|PeS&X)T6~t-^n24nSfvDf=_p)gVN7C@P|4pr`J2VkZ>_`Q zg7x{(-SHq$hS~OF+a#-b0omq-Zqpn19FynF_D>xxq*nAKTyD{Wtwx_TF19@g^0+dBnzXatx?XwO6(f4HBIm{4+Y^Tb z*Ec5iT1cBS(SkdXEZF!l0S_)zYNf~YI6pd0-gw>?BxI9So0w*teHP2A7DxUS1BmYW z5`1MGUwCwEts>%~rr?Jr=~i5K*7ny!{NTuqNxwwuMlw~rHpt>|Ge9BAF;s30hxnHW zNb7wN?+sbHdCH{OEM|lf>lQi6@{n5?BgvTyrYy{xSniztfQN*r@On{8P`pI*W-fWQ z096Y_B6CBjt=l?2IV zUKw0*YQ+1a9`n)OyS|?HJH#pa=wbv%7P2i+Jd%FWJuHELrrmujlV3UuzY%) znd$l<<}7hqu6dIB2;iw%;`UEF!R-xTQ0odJ|C_avM4H+9t&Q12LG~i>@53Tpz=%`Y zA)-fdTS0O900xg^CzTHEgwn=C_{PI=Mk~hTU$9{X%s7?p5h_VNX08NlvyoG|Ik(u% zC24Li9ul@K^60{;#a~5fiPlQ7=VCZqEIg9iI37z_$kN{Yp(%K^m>SWf3f#_j+qf9_ zOKtLKLf3KIWbI=HVycu#7-#k z2m?8ft{w8*15zHFm7R02SaUcAUwL($bm~7g1)@Qrc}Wg_bjKmh3#?}SrtN9?(dM7f z=HFwsYU8ZIDhUxyQwo#Qn!>pqc3a#HU)-F8HBW0k)ZA{hP!x2+H_LV~`z2_1yoEG& zGm{f17%znsuHP*Tr;>M)i2ue(;m^V`F5^2ZZZ;FE9>b>#hk^kTTvUTEf0}fxCaF0#%@bF4|zkE3yCV?H^@L;*no-~Nx?c4#Uy zZc_mWpGaP2gVOfI-Zqo5rLLW<@fn+*bQFkQxtO8M*v;6u-5WKI1__eban4p2VBDaX zDRT7b$gL`+Epl5IT;Moa1kiC|^eDi1dw25G1+WSb&_UqwWk{U*_5$E71AI5dsaY##o+4;o+-6!>0Ek*C;Eucw?@0XuBud4= z@n!{prkL1;s{qUkwnl0iKp@}Ht#$Td>^PS+iLh8l6h_aCAAoPPE|SK#8Ww%v>(fIb z6T8&p_JLYR1^jtGfC(cPKbB}VnyWjYSKC`7#=?c#MO%6y>)LEP$!s_odv~bH}M9>*KTfb|8{QD0W4f89u&7V z+(wD%rXRJ{DCp5V4k}Fkm=&jVtSXy`cJ3P+NNoU9ccmZQXs$@k1hh{ zS}l${1$Z5PzijrYwc@@*W~*OQjK`zb)(W@32z>yl_qLHYjtBi~dvPEZ2V*OZ9%ce= zUa7$SX7UFJWDNj1)_dcSaIy!8kw~9^*>h}bjGO4(^dn=kCkPAOXt&!=m=8sX>;b*~ zbuw;QxKFrbA)qYoM8Y$^JGHy}5aQVk#rf@m#xL|(8c zfD(x~o?YC)n@~JR3=nXoB?&Ssf?u)t<9M76K<`4I4WPVg*kKq>DIG8r zV$zJWIk4zbxRyPM4~m6F4wN;|mS%(!VuW0wW#o@1ls3OunqMN2``A0UocVM#(gI** zMeN2Sp;u&wuHyc<)ieQp@@f!|J6RIP^IM4ODTDKK784D&|J(rV#!b}RctAb0V) zGDSew|AMrDfS>mWQOljj!73OTkP(Zyy7S7jq#V#4sL2$5`)?7o52z}D_bG}E7`p0z zo>%_=eI{@x5i5#baq&!s>9f94R2-}%`8N~SHMyz_cK z3naPo_%>NfM|1Vw4zZ{bQO+*63hgljA8f|dI&r89E z4-Y3E;a?4@cE_{qZlF^G^tucydfJ{c@|Ww`LkoE;P)MbUHN%QsW+k>SIk6X_V2Q@+E)8BRi^FgM^D#LwK=7zZjn<^5Lm0K@4jVP zyjT16sn;_rzx)HU1D76Y`VYfEb%gH29f+$7IHo;Sx|}cl;2XuFqx?SmGkZayhPJ;P z!#xnc3^2j-p*DZ=N`p1&<(*CW1{tS$ca27;eCS$!zqvVKu5xYfB`e9{G04grx)G9y zsPd%=lI8altO`8L42CtUKyR%9A@1kIO;^*aY0(1;MPXVl{-&-8IONO0E2Y8FrFl69 zMcN3Lt+bkUMJl7PBySmszjoHex59~8iSvp`iuTWX$tDfoDie(HMV0eGlAhNInvC6X znQPdE(JO4!t9r^SpHms%3-Mty{jnZ#a~PbUGpM)f3hJV5Ha>Ndz1%^C za^S|}8T?xS0pa(VlDzbqoVFVQ|u z`o&Mg9@h%xfGBbFIC_Ot&#CnJxv1Cib}G8BF&1B-VEAKjmwX0D^2LJ!jm)zdqbs5@ z3Ht5Q>f0u@YuWzlQ-wOmt;OY_{k4SN+%QV&)@2pX9;R{Pd(%Hi#I{W1Lurzr!dlg0 z2&8k)XVpAeGKal+{2!3%6%hEkW#Id#%e=hx8f@xlRIKWrIH=0dWp>kTlqsSx(^)4g z@Mv$3{AZLzFswg+i{}QJo8@n}doU-SGpK)+yI7-iS6@cRJ-iRv`W+TNzoc)}S!i-icEMc^UEb7$QO6RROG}DWYtdFp`^VZ$MWK za35{hO~@#KoyB}%L)jA*uW4u!cjV5u#KXL(54F}O&I~QbK3i!UAKGo4%O}lU$cT=p|fOyR8K9PY0fzxwhy1`l2-psbwa7Mu(VR$ z-S3I2V^od+SR?_IPGCXcB zXb6|ZyLd|t#`XB2ax<-?R@D>36OfoI~sk-5Ss*17Oj_{hqp|C{$3;@YO}Y9+yi zr*pvsS)&qW&S5tydTIc0lOPed*0)tf>ZhqZNg-)eD*4!0kGvbs+fYE81d8 ztGHQ`SovOl((1)0pqpBDE0a+(@QW&2Ue$+M^&~pQmKtnSRieHXD2AmINIqM;MGoy4Cd7{2hp6_J5)&UD!n3D0WVzx$bjT^^{Yy z#n<-`e6?H<8D3zYLJ?yB`m?aLcT@KH>S*Gzwdcwg zh;>1M(AmE{HQLBm8;qSqByFQ2g|x^g0jt4>F0F4 zT{*!-yEaIaPVX1JUj+0zA62cL(B;0;F99@A>uR!e~kI^o0AN&qQqD72KpfGjNj@6=S?>8dq=ult08&YMdM^ba~XU0ebCxI z(EU-3!`sD8=n1Xd<9532o~OOWTe&D7*SRg& z?s$CdDy~3P&0=r8PlvyP>3W~eVY;_y4V9tkcjeoG`_ax;aBcZG%3i~ zp$o`BM?;Om623AMF|YBt$gh>4ZthBbow3H{^K}KC$*tfxwtn6@!JI<`Q2b>(j?Ba_$O^j z_WUTWMSVuE*aE6X`J;F~C#+pyx~@kbJKmZ_y_Ev-vn%^an>*;Gq|t5{21r+rQJ*eI zeqZ+TC(}ED6Bthui*Ko@+23aqctZx2+g%)OgTJ-ktM_Oqy;IyPIrq`Am-b(bp{Q(p zRZ7jxU>A)n4iCO}Lac|e5m*Yww zuAl(qO<+YWJ&(Jh$O@AWVu`35B+UxH1MZ=#48eeoSh=GWUPm*-0iDt7;q(Bt`S5e{ zaIE!^|4`$$6lOzywA>)UNN}BAnkval93a*1+0{L_QveOV8ju(Smsz>O^HMkF3&z$5 zOQ6^Iu-siG_!msh-O_%iep#!4?@p?ZY@z6oc6M{|aQ{~IVBZ)o8ry6pM2pi)&Cb^y#)5>oCccMHnsnH>eeNyrPGX z<6i=#jnf@O#MK5|VTX8JMFpkkr@q&Vv_ne{Dv2m-J;cGV7q29L1kj}AcvA8M~sK1FXfg+%R3H~;BgYcZBg7XuKZFf8^0z~#C(tr4d zCoo|t!66oH$EI(Y1#QES{O*n{ZR3m~|AF?;FP&M+sMUc=Jf&_e3Qzf)JZK!gIOp5p)lzxt2&*VY-b)|x)v#0z#>%1*TAMb=Kd(kHV-(BYsk>-7G3uZ|2kIbp~?~o6;vF zpzkDw(~Q$9^Sf&ESRyt+**ZFKOQzbX7wkp7eBO2b>M!t=6XP=FWyZ7EYx_ikh$@8C zk=&AJ25`L~MeFNmOkm1l&@9sc((~y^nZVxZI;E+EX2a^=BtBZfb{cuUrcUL^{8dbl zeD5RYTF_-}Lf=IJ3W>zN)3^OYp4Lm5_l932(EkY_PF=r{Vos^R-rA}q#8D;W5aUW3 z#d(8E3+}%7Pz+86M(xA36T*K6YO+Z>+mFw;d+f@>GdmQmz-N&?kA_lr2cHqOd{Iw; zkc$JOqZ3V#8i%a+=i@r=cD&a~hz%s2ed$|>CPow|#xpI38)SpaTs1DcjwcuNyKOpu zXgcEaCLrGpY2EvdoJFrOG*HlcJcuOwvFNAn2lSw$I=L#A2Y}&AonWEX;t@b>K0Dmj zd1ReYsfV9|Ujt`3P;hc@?G0k|0zK)Sa%yjpqrLr9HiH$K2J78a4IhA~t@MF4s-g#x zpz3?3*8E;MuY)w>O!~IZG0TG@%3r&0w33l)Y0*ouS2)_`K9zjeJ_G^b56;?ZKo(XH zE@J}rja`gF`Wls#1e){?Ets_V|GeSkP0&Z&I)><&GP22qRkkV?kGF)3>{l_I0y*MQ z+WC`KAvm5x4{hvLCXYaGE=V3Ef4|y;o3JQ>!zizQ-b%gcltTT~!%d642G4n<9rjZ! z4!Smt8*Y7!^7pFb7gWJjYmC-)-9B_5=1I&Kf+XMCY#0z_hUF1}e7gSR+6n$#V% zPmjD-$P^Vd1M=VxoM^MGfraXbblTTF1wU^k--Ut=TT>=H`lY*`5{(KwFGKvg>bjT9 z$x_z*ZnjZ;c2$sSO}&+L{rdKoBCH^uCl+sc11bV%;id4&UlVWY60;JZgELYX&bX|~#nIgUp^GhQRcOE0#DFMaabXE9S7*FpAVLar@T50SA0tHcR_d+= zrF#-P{96E~(gN1x?@##-z)Kf7zA|QQ<*bh3z{L@ZHAi6g)9y{Bn?%^8eZv{$HMW|r z#g>x0jr&Y(LRLd$)Pij?q6PB!IPJ1VOzjZP(^E>+a>5)>Oiz^z?B)g3=j9G(16J#^ z+81oq_aiD^^_Q6tnlepW)MSq2@tOxYjk)XR#%+$+&SL_*6+;Z^gpMobFFuV!v$_%BhO^Grc<+*O~&>Vp@^0 zva=hYDF9G*vkC%&)NtZqMs#4!dODFS_@uRmRWZ8QJ|@2-T8im| z2lHlrA-l}cxu(kW zu{Ap2qbm1a96#4))Rxfjv=8N!van2_(oVGyIezwI0wwef+OGH3s^Fk&^wl0>&#KJ)#|_h2@DyM!WQ_@-`x!Mif6Wl& z16UknV_|Z)i-jKl&0#D+<@@0WRjRAni6OUWn3xgC0ml`L_s>PnZQSMn3vJl7(I1`= zl0`^Ut$~5T>B^vld^yOr1}Z`SXBJ^peMf{2FPE;Rq2a4`3xgTbD}z<0(HjvTYU`bI zmZJK=Q`Z|MAX|pZ>qF1(dzA6+Z|(zmQLMy;Hey1&PG_BrR zFxxiajU;&`7yS3`^48x(MeBhKI*{=|um8@)By5USIN?9DH54Gyx7=R48ra|qie0BN z4d@-OY44U@+Q`pu1Q9W52e@)!73ux2()8w}CkK-y{}f#T;C^sm|0;1rIlZAiYwZso zT6l@!1ts-1w^G%J+yw>|ojTCNJu`q#U*xp+tm{mn&r~aN?Ac@X*E%tN3Vtunh$zo@ z167K;YK;n|oP8}M!MsD~82VR;Zn`V{%ieZ)Zl+p?7gQ#bksGm3Y_k8DSVnZKv?IM<;|I5Vl)1mdR)uR{}g>%0lssj79-w_}t1jO2bLkv<{$(Z_YsffHC6|xA0q+xgeqnwHdwrn7O}`kYooJLah)N%_qop zFsKE3N3ktxfbw5|QSrme-K9f;V^#+s+-=*>H>8scG14autm$h! z#fEj+6}DmW_wT7%$EquQ3AI8QaIzf;{9Crlb{T0}JUS<~nb;6t7@OA% zLHUh#^<2kK9W}AiHGTC;t?;`ch9@2v_V3+B>_GnB>k09}@_^9o;*;Y~<$dOTS$;i9 z--kM09iO^sJ$p1-+o%7uNeM(fZnaI~wDrA&;5UCNVUoXtDIMXS%3=VS(!kWi^GBru z@Z3`(lpDN#MWr&{a9%C`;}2Yh8Vq|Q46;4k7S(k%Tz=|arAuLErgwih{t7B01$#Cl z+kU*90_9b*T1wP)gT&uHm(9)oW=;>OLW^{tJMYg|LLB z|6wc&(AN6<4#_NKONMTotU*tX+;x-X)-;WNzbgMJk5|DDNGtsAiVg^35)NA=_3N>; zl~iu$hRw&b#p1Q<#^PT8RifZC4@@VGkw0+%LP3FnEs3J9cdF@kpKUAn$KI?2Sv!-? zTR+#Uxf`n$aitQfV(FG6?c9aI4rWzNt=!htbzx%nH2R^>_Uv>&h$J*nf zR$e0!UqfM7DukpSrip(gC4iv+QlQ=%Wu2PRMp^)Qm>?O9lxevI&}>-s*xMe)!c7c| zNjvbBl(N^S2m6|scv(jD?`T#v#n^@Ig(8%M6wHt;ng+2rP_eNyH4{T zo%Y=>k|XU5U_I+suA1`bMLIr|X*oZlOLb`m3tVx2I$ifClWcK6{y13OfjpZE zfyP=+IyWbR8;X`-`SSBt10y)R`_TYU{uv4k#u4wN45ksnQy2?(>2+h z{Q~dnqFs?Pd58Kz!EsLhUIn_sL|d_3UE8`_S2_(O89wp(_*(Fjq+a7Z^px*YY(7@x2Az@_4*EB8{1eQWYPfWV6_drt4GS$7`#S(bKPWj zyXtPuUw3EGI?H}<>M{JAvM6WL&m6M< zl*dUu$H@~i@1<|hV`U@)~%7`&Nk5C^Cz#$skX#do$*P39irlX}=<1|iYi z1SiUy8QOSmjBjndKGvL)nH|La9}yPZEv_emB#m>{Ud42TQwM$Lv=04{Dbul%0K@P) zP3z{2MWbuzpG(FzpLLNIekksjdG;eSfK^_Lxq_w!r&6xs@noYo$ppg=&6K4Fk>;9O z79z^`PPFW@`q3)5NIcQN_=);zIz5J^bdk7ofelg)`; zg9Cu&xqS`F)JZJ;I7mYW+x`mgVMMeL3OC2%qZFo1ymo|MkemrL=>`IGzF^{r;omvT z21Vu#gU7=%ZU3FJXtnxx*nO|FfP8;~cL&P{`g?kqlPP*rRfSbOmP$ajNB}*}b(%ilw9G}$QmQRNBY1FWsqBQ!` zxR>GSSlsPy&x4270zvcn*B{7sYj{K4|6z8&%$?5fJmqNjq~84lL_H7}+o19{UY9vj z+8^cFr35Lx!KGCt^~ZR41RXM+CPPUengBY-n$-t(B;5x0$a%huR;?!yi)Kb8ofpxsOjBE-fe~ z_J8$1`lDwVR)IBjK9L8@{Y`H!xwPcAJEXOLsP{=SMP7EeT;)a7?l6FJOFso9jkH~A z_u$>=Q>6T^pYU!oxe2X({0B^P)edDWT*430dFGT3evgOj^G2$%=t& z*C1*Gt#iy((DQ*C9tb(F6+$jb{sPnkJFUvor^23oUG_$F9LSX!7SDX0V1dcwA}3*8 zxt0CO?{78|#r}aYzG;ZNy=(O47hm{{4@2QA+x0oco(*emSr3(e)mfRZBMW`XK=*$G zx-}bWtOIoxlnJbE>X$wx&ByF68qm}XWUAca$YmE3-J;!Xqx6KAuY8fzDG{u2Q4%K* zbDDZeu8IE;+9=Or)n&xfV#Z|ZQPq;PA#IL~+I1&nRZW1Iw&SWt^U8VctC?AES%`>jj?^wLEo-+0}F0TXyQxTmNnC{1LPbc)G3Numwgn0BOt@ zmU5D!?B=V7Z1^vq_49&=UdUMH8tzmHk*2ZcT5)0IMA)^}Ip0NqkR4Se^KsYvk)ocx044IHg%?sto*>LrhK6-R`&n>@p<3W2dUei z0{2}t@=&{2lDkH1y8GBgLK?x^LO*!!ssasw*>qUM@AnSQc)0yOK+xL;_MZm~iE3S`GDS|*(*gXb zLD_T~IKcZNPD-5;gnaDa?=u|b0_*B3-D(oZQf@wkj44_{-mH<$mFzbNGk4n>AJ3;Sgs;Sg>ZH7ZaGCiO2F5nlc|3blXGVUJQj z%4@H%Z3@#6X!=n`ZsGR74<&efbEfXU+i>)erw5?!F3Gkc#S8eamTjyLQKCl zide#Qu_1s4@<1i{caFi`qMDLoWUQUUEh25;#Oi0W4z=Oy)e7q9r6ve$2J5d}+h34H ztjRhFqZIp%s&k-t&9&-gf~LC9s%c$Iw-dd~Iq$kxy(D8*y7}}UvdE2Ib33;@%p{jhnMcja2Z;)oTHP9$< z0tiM52$fUp&mpMd{@DjjR^;eZdSB=JoY=sZGn-r6dmw(miGap+-gj~kfVos|lu56! zF@v_IsgO2?$X*s?ZJMssgJ|8Wu?7w>FHN!duY-)^`I;B99OnFLX(_QuEfb7Om>$W= zoI$}^f){ejzn~Vjz5K_?7wQVz?*0zl82>mwMF_b3F0xK;OF*C#+%6ffES+YbLg*kY z{E#aF?1xXmKx!yz<%Xot)(4uND*4QxRge8xpqpAWcFqmy%(`x*@A>5} zoz}wKCTo&r`pB84G{S?r^o$%emR;;M#B9|_U)mryjTiMOr#s5?i67{~MN)IRyLbz~ zH|RvrI~l=f1A(7r=yuwGnTWMgE6_85j-xLSkD!q#;Aj&6Q*Rf6XJr&f8n%BWI7SyE z6b>EV5{yy&6O3}-&1`3d+1mFEQh}`W8aQy+W@O_zreoK=V^ntPz9qGz z%u`eM(y?!TY5$?8scfxj@Pk?ac3?xh0S7O&y(ik%EG&{qavho8_Gz=4n*JY-7j z>1GIMfaq>P`_QijIntzv3=$(l4W+kAMbWQovNBg7-w^SqvfsXJcJTH_8&OE5$ z;LL}RW^Tf5bFFxJnfp6Jsn7Ku)FTlt8uv!}9zDHanfgUO36b|gLPYuIAB*={(U0Pa z{@&-b?p>24K$acB)T$)ZO%;52R@olTDh~E#y(23Qe?-2QeQ%o$BZ{R-il&BFG?r5Q zQ0dx3ZBcJt-$*_1uQ%=x4`dH9a#^SNuPbC%?yx>#IowRAS7z$N9#DdYj~aXqNf%8| z*G_U@bB;ENnPgnm(H2EI!se*0q$XP3i0t1zfGeZ=C%UV#Du)tRh_4l?9tQK;YaM}&S0#kr@Y=A0 zlz`3rCCmxGUig96{K#eJ{{Ok#Y|EZ@kaGmA>2DzfuY$)5VaQugm?_|3FC z{o3{6-&`6<^)L%@&7@}enk*1S+M0o;)?VMnp+Yf{lh&RX@ES#x;0|LvcXhUnycyaR zOSAlg8WPetIp~XSJKQ33mPcwF2%5!MKQgYLUd?Bk#j?V zUS?}s|A*)_-8D9!CpG~z+|LBxxSpDH#((&`yd3)t`gJbzX;7ziAPkJI3F_A;dhm~} z0ib*N7#4C&PHAgGC#D_$@%^5QQvv9-(`y9 z&bl#Vr|X!Dwr{pl);DGFW=ww~s@2~3{!dT=)fAPtAzD0 z1f)Zv4_E?%%7nqTJjVBpOdjH(UUK-<2*wl#EYhBT8#WBxvO>Z*l8b%hj6muQ;;y#O zu5sZpPA`Fdg6jhX53x_&{wv=sg*{=%06Ds=v6eA>M{5#>i9 zN&OFeZbLT1#t37vP+j>V84rBfY?;9QId%@df0qLTE#TDO{~T2q>U`=ff#X|W+}Y$3 zUb-BO{MG?k0h*<9kn|D%*=qOJI|x0XM81x&wQ6+Ao~;|+Bfb*-He#3Ou_E_VT6&DYX)QJGPHXMkIY*<%+tO;14#y6=AWqI9qORXp&fo) zxR;O-S7pz`unG0dVdQz5Yp(sSsw|?L2B!~cKU_;lK~BRD{ElXNeOYoZE1B{0VM!;i zx|_LT?C}KBO`%O5)h35uR~0vNs{6|^&%u_^RhFAna@ma2--?vj(q26KZaw>VgLu{r zuDx6+@1JV^S`22vHP^dSeX0B7%5nukb*(OAjz#!T$;UjY4@1R3O^X75LcEFycy9fx z^~m(RN>v2|U~ggy4eZR@@Bs_^>{}#J`W%V<3EZ!$?9R3W(oQpCW+cU6;Ie(jJ&|u)OS(M zZ*OqVFc*iqN64!3h1opA3ot+FlRHOC4AT#vbz1kY34sjYa?rm08F8gHi7qPXTZkiS z3`bq@a-&+C-JVR!>q{*}sdFA0Tds1o=}|l`l6s}-rj!4$4V5d65gaU6ct?L%8KIzc zpm6UXK)27cW(_8-H$u%XC|TPhnlSLoxOa^mojDNd=IMbFhn>|(t*qAsV}J9rsi^At z^ySRdpp=38Mm{BC230<9YBXz6229K~6Z=)y6oU(%GmRLm+RV3KD=)ZfUlgS;)&bv= zl-scPaw^tLcDro`@eS}hs94*b-_NbU&%e9jXH$O?_E#64bf$XFQLt~ zKz*2r@l_}r^&r;YRnRFXmZ>(cCxk<7a*UUxY$wzMD=kp)Oy5Pi-SN8O&PqZ~mG!6* z`!mF#cHWh3tSMY2JD51I8fhIXA8J$E2+5Ei zz+XPsl{x>Ed82|PriU@rH(-~hVdf5W1ICf>r5$)ma7Nbq)KO50xJtZy4+@&bY3xh0uG+r`BXkXk`bHdlFy|S_qEedd~DuIJ3T< z9>V*j)oR!Kh%Z{in{t)Ac@XE~H^~m2Oww8&tW2|*U0vbtYeGrXn*opPY%Lmg2CYpz zD=3=@h3BsDj^IQqpuS@#GUXWfhd|v6ShjMva+zsb`X>!fu--qA3~%*Zp+z_fA2p(*oJQtTVAN-G_*?iUl=c^1jA1 z*59H(LCaofzELQyWy}Oj0$*a=&eMO>@2L9KRI?Fx1dwc zkX-EW1K~)-bMzTv;MO&XBXo~A-sY)~u^O1!?;bpnoi4d&#)00GJ?pS3#=4H;4A)0{ zDpc`Y`Rk<^H=Ow-Kki6Kgq#}x1XhrKtChx&Wp$B|0AC8DIoi%7C%%T_9c2pP;+VnSvN zG1=FO)?r@N*taCa7_!V*#ug!am@&*)l4Y2|*lEV_dwRb=zwh_&@Bg3vQIE`-v)t!C z=f3ajy3P-co0h;NjyM}83RTMmfABMbivAwBFxvg;k$mt^2d`7K_@Nckl36PvYu8V_zM#w0=UMEMo&YAGz=aYB@FaG`PAp7;pfz`{-aR>t3 z)uMxQwNBq7!MZE4TU@azA544E%Pjb-_u%qT^HCUWGI**d*1GMXm%h(vVfX?*DN+L_ zAYRVaq7$<>E;m~Jy}Ey|I6Tt4Uzn17W>Zy)LKgVr#wZHVB^1RgSOv}fS_GfB{v(bb zl9HtL2;Xc=tpDPT$B7;&Uccau_W}|>P?(^Wn?O~rQ!X>cDy4i6Zz&$56cm~ovXgMw z$JCp-AcQI=4@1LElboc#-gSDPY!lfn`byEDr24|>AnvD(B2G;4@89wM`jNnvNPPkd zfo8q74oEyM4h3DMXsiYW9xI)kNJ`?02Z;mM?bl_LcinXx*t}t-PjKICN4CRU4HSLn zjje`sI0#l;M07B2Ux5`pVT%6zvT-Rt14no;UR3_z{uooMEnNR3-T@ z9RbrcZq3ohKr-+}+Qg9v)+s3fn)v?8*-mS0^oI8w@|Wt@yNCFYd?^?x4H-)V>%dD! zPz$|@h$(y}(5mkb#BXf{`7j^m*}Lt?og&9(o+khs>U_+T^t9|u(|A9|J*NUsgwqlA zM1uVc0kNPbuaId?ODyB6+O~`ONQe7C+2!~Q9B6-@`OJcw`=cCZlNQP5WI|=~5gEo$z2h==T5&5W1=WUE zDzk8Q`{S3)%WRy?xDo-eqq)~%KKp#h#o#Qml>5d|WVp{Dc_Js$bKfsu`wV&ao=P$% z220Jgx*sV04!sMZPvvT$zX^X`J6xK%aJlrdGM!t%>MVdWL8K3>c{7ELr)iJjuj;f} z!)1D5oxzn`neyx0hzcgpj9Vn1Jh0ENO$e5sUf>Jq>?i|s#V_z*$!;yox1MhCQS3g3 z2lHENLkg6*kT}u6+kx%YO=xGSm26zMABRxig7WctE^( zvD4)ekQ`p7C{vHWE5W~ByJ?gBK|1~!^KrC05C(ped@b2McJ-5S-62y6`ss+DPKtyF zgW&tth4;)5)oV4@3L}Yxiov73;Qde4D@o4S5^{1}xJ9QPL9LiN+Wfcb2j~2&zX!Yl zc;oqw*O~~rsR5*j#K;y~pSt`PMK}%dHETci%gs*LXZU%Id#4X>;X58UG4R-#w~d1k zA0*?a7qngQTcCiL$W99ezmeL1VX|mEBBzol1La-%hxh!yk4R_2Hwu1)D@07Vth8zq z>PPgwhf{|p>tx0nK!K(|%Lso;JpeG|@IYas&0j@EK`FI(P3atXf4mG+JV4<|iRyj} zZk5IUy`X9d;&@HJ+rHw=i`-DKcalQg>DleNoStmq>_O_5_pw=PJ7x>1d_8&a=-J*| zjYEoK5C#lSy=n)0?Fc*WE3r99FS7#GJHgw&(ha_LtN()n*sYB|6<}?foUX)Eou#zM zN}n`IZZ#Nk3pcdzR@)WI(8Zojbt=R@6|53FpO83!CN+jLVM9Z`O>&wexgf+Qqf>4& z88#TW?^hz=#EVTLe86$GR*>;?L_?1`yh`r~7=CN6^o?Rkt7%Od>)o-(U<7USA|7z- z3yDW_;Ac6QUibNJxn+qC?SuHEGFdA`}c~q05H#}y!C!%MV+8q%` zPtA?FSTLOk76p~XTe}gi(lHKYmMX4ma&7vA5xlBd#7qAsHaM$$%zbSzR6*5}*1XO8 z^(K$NKeW|YawbOuoBkx1(mg*|W1JP0%eI4=K^Hvx$&tqaLw;J9a9tMuY}KS~XFCFp zxT=0tMd3gRwv5C*VWli3hJrj?wV~2+vC<9_HepfTfKV<-MuKn!YpEu*J!eK{~RD$@w?E$ z?qpZ(#V_to+O!Bu1Etc_PY~(@CJ;E(j)@mfO7V8Wozlt7DH7=NVkHK~=^BGKN;b8l z)}Vg3!}Mjt7SG%Vj*{O8PJtr2^*5yTcVTlWFbGxf%v;iNk)#fDMa@9kGQdflX&hYm zUQN3VFDS(m9-O`K;~ZzO_n;$;MhzSvqYnsCpZwFBW|jPI51RdN%PAdW8)Q%A)|F}f zoZ{PZ!sU9G@DX@WY_7Kqm=RX+x6FP2Xd=Q&o&Lz8YS>NvaYx|r2SOw;^Rr+ip_S3; zjOF2d=nGWOucWT$6?zhl9rxQ4&&m*7oDXZ8@_XYe$;EoFaF6tGgoC~g5y_#BroJV0 z584tFFa`c-P9ikzv{7Za2MC9B!1e-K8?iis2c|xMlr}r`3|3fO$n?;|^L;VXnkL4z`c^#f~P;N+1j3pApT5>6}$`b5-elbW=$g`wU!SK zEGSm^~>FZOr|VDFPu4 z5Zw-z9oTl^Im?-McZ~%dy|kiS*w0tIq^tD9id@g7m$H`(jugEdNWW2le1A+ z>!{B63*b`x<-ic|D*?J-?-M@izHS_U+`VdEu<0(L_`GAIH22uF8Q0M?z;A#?~B9A|;AYi68-*|}TukWl-@h9vfw~eW7HB*I+ z@bBihgjWTKH-8<>tF^fj?(TpMVYN;1mx5|d!|f^r^4%D(=Q_XMq?(Km=bTv==c|zA zi5XX=#*(g_QYf!jO~p^@hwYl4an&_?+%)tAV3SotQEFlQXfBH`AYER zgB{I|xlLnKEFY38A!6a<#YrqBf?Ns`(hCp@A-HRQs>6LzDm-*x>l{55O(}b-_UPzh z)V&TEPFOQV5j2zl`rIuK&`^}Wkzs>-tr*S^E%f1T4d(`)RT+{0d*p3S`YQS%tIa=g z=j=i_zZ$@2!+KONMT4yE`q!wD;fvb=D!fJvSmTF?+G?;j+(Ge0YAW`}RkBKR$3SkG z2kk(l^Ns+osJ(3Dw-luykAX>#+8~~9xlZyEUAZfvF%LAI z;J3O(1GE)3{AcdA>;D*ZLE6F>5Wm%*w|;OR95SlEv#?Y$qvXEvlhF_+aiUm7bC0_k z{UU9h&x?7?caZ~a#kK_}3hb@z+r$~aCo(qDCdE3IS7FgU*JbH3ayIiaz_rUMc^<0#zxkUbMJi<8MnZ6-K3q}73 z)@#=yNq>z2pr{j-s9-B)x3u_<(phQQuXCk`l?n5S>n$WdwnG=(l>eFhce8dsc|4i0 z@wO&ynqHxjpLzP3M^^_yczsIh9qCu)0|>MwW<|xFU0ma>Gmh(n-om-0@?fF6;@>eI^muWGE} z@P_JiWItQdUGzN9{6`)^IXA))zXtWleyP^%>5(+ATDRtSd{+L;N7aaG2bVWId4nJt z)%ABS8}{lkkl;GWHz=7;T0zp?j^r9P3b#Eau-2r9*xboveXl&fYJu#>ZGDD4MtR292)W`toV4*5(z$5$T3XqcSi_7P}K>TOURO;>GZ=4 zk`tbIOZC8&0h7FsQreo7m`;W)uY6IQ0Cm6`N0h&iU_?cj4;~@p-~COrVurvPVpBSL zhJC1^cYfz;kWzPZUo1PSSMpNk(aLYfLYa>9D}@!H4?8PwPsF`?$r?@loB#%tr%6Cj`l;B;ORP{W3^~i7h^ky zc=gMaSND(YT|QEbMqBN`jQy|Qbxx*)yj$#6H6ss9HbvliNC~R>subrWkug+w=GQ(T z4E&vV{;5|Q;$5Rk-Zq$4Z{u_%-i8)j&?N<_H|y#9K##KyNYXt~ZV73C8t)wE`#QHr zsLrexTu!Uko}Uh0$UdQ&prt|SkkbRn(5<|+_Z;QoQybCp++dP+6^S6c%Jc{^GwAi2 z%$jx^`0Ow%Rl@P!g}J3?2>s-O5@Nx!?eRipMAXvKBUeU0;gFY+F|*!2dN;~^jp zCEaI!*(j|!c@&4MuMw-j)fwa!jqrHMKai6!MR@skm0nSiDs`PK*cQIC@)^Y7 z6n*vckE+3NUjc3SWz0FMBJk5xVh@}{|UqC|i?(z@cdC|Zr z6lW0y4@ZIz)QLU(H9NFj`J0hRwU{Y=$9l3qEU_bXp--SZy_xr+7~c(^w-R2Wzl+xK z8sJ?5!LySCFS=4E*8gQN!+PALZS?~jai!F)__nxx=uxEIZopKnds9ClFovnEq+#a z4K-?jc$yx0*pGfMjUycXMjmV#Hb~0JfDnqO(xyY8boa3eck&QkBh%N+sZa-B{1HQr zgCn}+)$-%y7l;pf21T>gdp*lbw&5Ypr>92_mWzkH+cBZ2DGLKd2JwXh68`h<$CHLG z*Ua>HN8y&uTUAzfO<2_XyWrPI>{mPax;^s2XF z2|eU<3q3Ffd5gsc=#i7%!Cgm8phuKX{t8uSF^6ax!QpX7V*A)y&-+@xJPIpLz$YE~ zwYu;@`lnu?;>_>ItJ@zi8kvNG#LGaw9G}zk3YR*E{dX0Gn>wA2r@g9NRZ60 zps!`7*zL3ob!u-4XSb?!KOHf4<{oqe^gteh3nq*f1i#r<cBAuBNmACO_v)1kE%n_ii7zK|i z*VGoF))j#Wb27{v78|WX6W)yMGG;(6Q4 zMUf_xO_c|dmd~LV8un1N|E%oCUB5$mjpac)j~5mRF(hz{W_$MZo+f5k zt=Or~(OwacA0+fqk^QSLBS8AZg_f`4L>%Ly$ zI&^WN{OWNVMMMl;hTyY0OP|R>I9x?c5%3;YI)pq%dXrI}FUe6eNB5>-e*t9KQ9wzj zX-hI2U0@_7qQE=AjK?)h+oQA^jC^SAKeM_8TYbh&fEtir`iB3$tI?k|kVQp(J+aEC zdCxx)zgo7Tv^k?aGY%tX*??GQcE;AT-W`$&!)pfRIu%6Yrw+FZD_A2lPf`91;Svlw z91SE80Z)zqB+wG($MP<;atfNAA{~BHxDA)5>-Q`Xt{x#?4xVf(JngUsIB2MrT3nE zyn#qrXxPIX97gt4cWwPLTwLWbD;dLbUx~pCIuQ$h!V0o-m71VF{DV|Ac42$+66f(0V7x$M8Us5G2g2E$35V;HOEw8 z-Kn2ZmG{y~(SWW;?Y}G#m(lR;;LP>^l+GWL(njGxv44`Nk-t~A42|?rRNCO;2>c~v z7x3b}e!Qm+;b^u}`yn|S!nTjo*<>{|0mZZq3oV)&Q5`qB?u+RU6?JT{N$gq95#$@~ zO%{9}!h;8@+=4ld^EN#uZEFIjtY!AqIrz?);Ua0LpQBV+kQzeV)46pO$a9;f26a79 zz@XM92|P_mTAlL7E*nX13eg^PnouqqtI)PnadnLWd^f&+YHJ~RpL$Y`Pf~@Q+w6w~ zdmiP5Pyz}Tb7GB?Fhd&Ego~GD&R^j=HUcbCYC>4JnN*uKws&KtE>TBHn`_|z?a5TV z3)Fn$53gt<(3;Zbs*lE zL5MWJcePA#44p5YaQW-Z>S4=i7xpmzx()sIoMHpq)f}f-srO zq?SsqCp|Gt;7Ewita!DrzYY9gp=x-ERys*_4158A|v07l@-y+ zYL{zM8#F;K{ZP8h8xQydodM3pt7PwmZh#=t^SK39bJ{&oU>~f=^f#Tdq<+@wClz}ShaNz-b2%pWZ% z4{)VPY5$1d?6n1?FBIxzwCp-p@63^d>p&mY6N%HBf$9%B3JDnKzicXouzq|Z^uP#( zQLAB5A+)Lus}}ArJ^1MqAW@O=36na=_Y4PlZua(2t0|clCS%89TO#BfqUH-5Fy#BC z$cuo`MaRbPewqygw>Ya;;!{{1SJ}c*5_)9SWHrOF&VTp+V*&cSx#_sNJuub$ug97O zb#eX|1}3Xe{hM%b+}$q1!28T2TB`tAo}rXWDs0I0+(k&_q%V9|DXCja6{>#$M48on z)NUwx7jJRVmmLW{{%(B{dzk{gsHG*r*7}{{X4Y;zxqS0U&)v;{$a}tDd63nJz|KN4sxmEnlNt zict=H3>++bx0xaNQ~pn!%muVM5`WuNQy7>@*fkJ{3Gd}4qiv*9Vr~d zj<|vN5&;`zhhG(n863HKy+b^&>lNv@l1IS9_9y-TQ>UcFuM3`40tTWV?vTHaL#T_- zr*wsYSTED+U;S3a29&O+qXJVQK%qT4)Z)~&`mTvc`l)S-zBEMtR{rKxt-%IREkAYU zLArC;&Nw7@t;C2+VVH&-81GMau)gjMSLyY4F`x$B$8A(3XXP@KR1VXSv3LS;2b^s{&2^5sEEGr?Vi+GIqt83DN1rN~bwj07gLw@a;I zh$GIYJK?+axr%s#ubX$PEI$?j5LL3rzPIj%FKVKJl})if@)%cs+$tNg3^Z>@rqSW_ZR`bc|QvS$Nhp z|Kl943qWnbo|R|KW4%^47a*I&fMIQ@3iRCI;yX!S)&y4KRew--Zta<+MPGj=yHLqJ zjTo__p`RlgSze-D&P2<3j??S;zT1zh>GN;^4*UgBZ8oH|d;Zd;`-R8qVYhPf1LKd+ zT;zXN$LNV*x%xm%Uo>C@zu4YL1&^myZj9)O(VFLb)6?0WmFgc%urDs+W!~DfK5B{V zfvvuU?k567r0o7QU(JQ^KUG_H6)N%$$AX*QHa=d*7wTwYV8e<1zm+_RRPq}c?EdlA zYnQe=63+ZlvxD6@Z}Lf$uK$D&-~s=F36sjkzJk2fI336QJouk!-!#6G zyX|S8kNt@yWj1KKvp;nuw=JNYvL3wVH(p*(EQ4=4F|_SMkFWnO=eV@SSo))nv+gER>M6W5S0JRQO_|>a<9`-3jY(Ilo*4T0;bBEyz2i8uVE7z<;#Rv#UwH;@UxH=Z zO$MNWP%~b3teR6r7<2w^k6p#f>TXNzR4dIkZ{rU#5sAT z*)f^0g|ipf$x|=26kjw_{X-L+gmni=c9V!G-Lp|RkjffZ)WO;rOQ-;Q>4e4Fb+6~k zUcnwS%_(*azkKP^HoPwpbTLZ5+s%CIhac}M0LXe~(^N2QAyHz(PJza%qzLirBPecN zMkW1B(U|GM(d*G1=SbKYe*zI(IbH878W@?7z@GK&i1Z3cCl!I`hl?HjH+M(1BDlLm z|FPCeN)D^f!0t7oWzzF@nw{h+Eg+LGn-;K-(Hi8k!F0smeAuC(jqv*0)66_A(i3-F z%7Dz}>`vEH=8KC)G%5~1G@U+>qrRRW^U^oUj_Gx0bQaF+>Yd9}cxOfxURP7}r+KKz z^7sKAe?O?nkoMWOJIZV4jeG-iKc^)bB{?u62!Hw$1bd{l>17@|NHHzpxtcrgtZ=|) zUloaM)w^`(9OAdQ+Jk%)(R6CO! z%Ag#MaL$g)k@z??f9?iwa;@9%AENbqJn}lvL)~sl^htSB<4@>H-iFF>YJFws?GO(^ zEu{MI{NC;X12ZINXRWxAd7ATcx1AHG8ZYtCmhXmu+swV$x0;O#gz6vi+^*8*u}^2LV79Jnem_OI<&O?PRmT}D5`Qb;Yz|_J`NGqF-mVRKJ)*%b zW9_c%L>Fi$Wi=Iz?>Z0kSWa&qej$DW%ZN)&1q#XhMyTtw6fl4 zi|5XGFKTBxa1Sm6h56|WVg9{gw@x{Cs{DNb>O7Blbbjb_@rTK)P0}3=Oeu-m`s6fr z72;l9UBka-4iZ$NqN1IRK4R0>u6w+wgWlZ`DDkl}vWVJiOFOm(L|Ybtko_h{H%{Qe zXK(r5q~P9p5E->d9jzJo%qh(<2yf8#3ZWw-nhbnJdmz2Lz8BKx#C8{-)GIf(7iE zNrX9yBI%2b1?y{U6X!_{N;o=mJX8`Qy{~uVy5|8;MaEXY+K}mjnT23*<*p6WLXU2G z?#*~c@4rzQsm@i58%(3B{-OI?)3yjywaVI$TSZ)oJk;OR04{OK9>6wShiHFwC|v;j zsm6Sm^_o2nknQ|d7pFfK_Np?cP1Slh2SlqjvTmkd(bFn^h}z8<<@r6#+7w$}#HbLN z^mfhr`STnQ>ePH&$Y}iiKi&%SVQq5%0{7*8q%l-)ZHngm*WEjJCug=Yp{=_AEM9@K9vSEnAAXr#dILjZ(&v~1;aqiu$&2QchcD(%o( zM)&FF%z*2%(INub(Kf)1=~Kd`VJsnn97w;OoAnJ#T-}_jjZCYkcM^e>NcbWYaJ}nA z!1r;xk6(o|vqmGe-t!2G{dpK@3I>O3 z8B>V=HmZ%fD>X^B^Z8{bTo%XPOk9i%|6VE}_>mm-ZLf~&PQE)_xX=?|YH*=2AGtK} zi0&i&$p5xt*1-_eDITH-z~EIV;fo<_?R}r0>8<(%&?fJ%u@1^|0_`{!Amb zRT(YSM{oa86PN)m8BHTYx31I8q$X|YUfZVQoKx=ZVkPLtCd7*Wk8httuI%e`*GgR)D-$18_8-Az&kjX@>o|M%=N+ z5_Bl?Tyu9_eIij_(>cJuwItB(8q7`RJgRf5W~{x9TEIP^1$;nO=dTCyi%9EMF*?39 z3w5v$6}%QiVi;U_pj#ZW>z}>@xIC>B43gxfd`YMvpuVM{%$bS&&+s%+Q@RBq0dOI<{-D+{`PH4%vfc)g7_%`J-N0Se_J|I6? z3Nx@nZ2A({_5}heb#F)R{QzZr!ci9;0W(clKL5Gzd*&f(>U^bs_|-Qug^NP6ns-dW?Qd%p%BHRJ-*l%Xnx-9VB9_rU>YtxPm8 zwp(cXuTk1aoG``g%o=wq@uf-r5jXKHioEWw3tI5}5tu}fcXQzZm`3p1pDtW;NaJn} zcuiU%k&#sUQ7`W6!Py`-uEzA&^1*ajYJj*sP@3X{saL1y-A#4c^(|O*d#z$&yVl8$A;+G&9(XNSy4QY_Pba=sEB4GE|xw8D{WjE`}eYHC^R^&k~~Qu}@7t3jvnXagm=hFus}jB_DH6 zM((jnrVijFwkHnMnPZoH2@VTyuS+RB)(#}Pu+DnU=h0On>Iig_0wSsf#+q^@D-Hr|(Re zKV94*&>yv*@SdLlB2Z|3Jc%qZBc z7y>U4`M6%_yVdxhoOU0)J0FM!9JG!2k;RJ8waqzkh|JeChuuZ`W=5!#9&KIjI)3C+4R*!2)o&)G0e;)Zzpr}wG zH07)~MIY24wvP$;4L5MCw~(y$|ID#gHd-5HoI2WCu#S!-nNRt*;wj@Z;vtgrfg=$r z%a+je|1qGLz{;KFLV*arexTDg-`{GqiFDV55g`Nx*f~!XDX&0@{Jx2CS{1oIe{Rt? z>>kzpfNQPI^JHpd&*}V;P|t>gVnYCIK#UCgaMrax=sqrP(F} zk5~?-hPSHU>-7UKtgvK2=G*^ty6r*h#qQ&i*HpK$UMIrN`EEZ--(jeWy>H#ZDq2xL7GA6H*51&670m)x z>0eBHpM~qih2fGYiFaJGxxaN~cSt&Z6IM?K9a(G*&Qr07%1{==Zm1YO9-e$xXuElE zX^;F+Isha5j|;rGiCl~GnkwBw4Bq3ILf4$S(UDUzQPt>!C56+=n@`Obf@{|+sKJNM z?Ob=gV$^U@$xshRmD}E@4@{g9xOfS!BL7t$O8W9o(}_<-vzW;KR#;o->m}B`h2)g4 z+=~9?HqZFE1`F|bwwx;X*1>rod6@P_jBha6DXPGhmchhC)~g)%0!idsO}KQ7C&mxI z4zj>$grG(S$*ukeplg&v&{9Si^WuD($k?Gn7~mLudGTHaoF-hLr0qcnBcHQ&NbwuG z^<@d|Z^^okYAs#r5$EEYq>B_NPC0~8MfNCjT?D%*^4kUQeCV$k0X-23A=O3fhUE&qnoh23fVrJr`+pBkLPIu3S1{ z0^AYf?i}LvY_NPnDU;UD&GJPx6JJ9gi0tSk3>OxqU-v9N-Z5Hv$tCPw;kZQ3-qbaLef9WLVI$}OI5eBqok%hF@X*+(>ZqhulPC8e zrm{%c=!F#fkBk_oJ6WFq3%aM>WUz;1KK{$U?5yjbv7BSlY*E+wP@QZv_D!g?0muH0 z@J{XycOaOoo0m=;{fe;0)X%uhl%84-NBt1z`ZZ~xW})co7w6ABle!N;lU@a|!nGO5gQ`rL>2-u$WL zdl7T23n&l0xGlg7dHd_7FyPJG4n>%|O8$8xxszZ~Yd*NBeUNe?cxy7o&tCnJqsn%< zwcr*2s(h7FcerHzk#}I!=Rr}|en2=;Nc@$jberd^rIME5JB|UWw=mEXldIFf=kRDD zs^a!O*dd;Y8;axaPF@&!{eQnoXxWNlVub2FK5@?7!{ycdxMwRJEz;`RqQ3*|&kG>o z!@JR9z#jXWa^WGmeQ5rW^Pai>caXiI@x5P{N^ajBR)?yGex?xXsgrq|A=Ujqs9{2M zZC6Q9?M8TlO4#^q&QZQWAj$9o$KLXu(!ki`N3}glmfrq}i8$Lm>i52^P&#PZxL5Ra zL!5phNUOnATZumOH@TyfqqSy#Q`4|S1HF|#TkUq%9?&}9GM;-R=Sg%HDW1jN{7lyA zKNRuBf(f0H-wuP2-Z<079D(R>tdignC?`(-gZnPvt3#^{c~E{7c1H6=u_X<`c3L+c|aihD4s zp^|1YoGN+U2R*OR4$KF4=@fM2_*kM`5NFsy!v~sJ>)PigscMozpb8u zE)@la8@-BBq$buN{!!<6{or_blB@l{O=i4?&g&n?ZYUWNjboC8*oV4+&9!ejCR&jx z_cv_}@wnPap`3YcB1XSnEAZP^v#Kh%3Y8v@O>(f zWD|v6fYp+R*;WsCgmvc)4q!Jdw+^Q7nK-jfc&Ym}+d~&NXc(ihHduzn##0IbJ;DI* zOj&g+&`z$;Cdb$4-VluWHN^eLVUIcmzf-LqyDIkhDB%9^`Pkl=07GwHkCfcP7JU#s zrHDISRz&q#8S32}YxT%qD)AtSp-Toy4IlGM!#P(bUGk-j$8pLBq(Pt76KU}R-yw)I zp(R)OHvowH%b4g~v=bf!F~;1_%R6huUV0R(Q9Of5HaGMQ!mlb&Kg)Qe)_GpvA!)v_fpEyyF0$L2A?)MiScE0%|U`6dSV?q&kh^)!e z+E`k>td6|GRiGsq+F_s9KU6Aq#fzv7Rtv>W*~fpS0#>-YXxR83&5u6JYj+f4daKNq zUBig1gD#;K)yk1;ml0@2icc9;3yG8`goTw;afiYjM8l=3O(aRFd?R?(uD>Mb3_?tYt1OV!Xa32C-3EKJa68p|jAb zx39l`p#qS_&^jPJ_UgI~K#+6SiHT}7=eu#<3~l^e+Whmy+AL+eo}oM5yJ@4hdQK`V zRtf=1+ChJkIFXIig-GA=w>)&Gcg%d`TFJ-w3>_l+CTSL-y9S z5S%=q*87q8r_2}vBlwoqaDE__+vdJEcW_<)zVH9o)KIBZ{&`XQJTPJR-8YS&dsa#t zn+8`~M@5=>?J^?5%aG&xcMp-lvFo`PoB`UPuQfW&1mRW3eSLndVs(}H@x?1SRwC2A zWv3gqI*@cuuY;CIwTPk$E=rzK!v*US`l0R)-9O}kalrm) zLe*V67qW`a2D#4+BB_5vLYI^$NBwcRMW5bL8}fT&VG1q5zu*9iz4j-}TX?pi}c*oxm!zICm<$f!W zK%g|<*J!J%>0iwSTnGBQ|P7=sqC*b@I$#{VxK%BZbeXZxI%v z6IIF6#Vn%vVQX3KEcQ;|6_V}>kqK?6cE=YI?+8*lUMm#`R*SLx}=3 zFOdOK!b{@IXyscNrg_N{YZ2Kh-EczzFp88uG(Y56vS*71eW=>kH*hYj(fjk;gCPPWCbUu!$cl6Wwva>8O6F=tDFjoAfptI8M+IKe*0N82o1S&Y`4DXY5HwDw%ij20d*<-jdWA}K#!hp}q9(IG*hB&i!tQ(qj+Hy!E~H5pfuG(&y_DHdAeU*d z;kwJC2ZZd!9(uyw>JKwTY3VRZWZfGoi)0%mGvU&GBBCOEN)xtqimUh3O142}@|>H1f{Xk{NNY(boLXiwVg5I|5qF^ieK5*pu>WdZ6ABS5i*XxxCGx+9@oY zdFTYN-(FYpW~z(;+r=mQV$T&MA~uj zS2is=w7$gKV2xizCH;Ni+#Wfv(mvnUa|u^Gji(#l)A5)3E)`IpDSl&3%U9aI)J2G< zu)Qx3kPUsQ!~KuJ3b~Gi4&hyVjb0ws195XP5F-1sE!x&b?RkxoLQ#`Xh+@exUb7~m zC#YB+v(cClo0^|C_%D1Tx4K`)Ncy*QgDs(x3GGSd#hC3d178#=(*GRt_FRKzwrG-CbYd#c}0uP~TidFQ-5glN+~qbPXV zwN1aImf`EMMd2VD+D_f(Q3Pz&%leXwmEFHzlDWZl3PLYBFBKr1a4tci`}L|3TbDU= zzAzA%T(K~)VR_-6kApfQt$M{b#+kALy6~`<934apXGclbpM1wH2hb?UzLU}PMnTE{_A2=GF6a6ifG-lc{N!*Zpdprt~9+paIs48hRZj z+Qx94;Eod|x%9U)gB}~PHV{9lvMPE)=JUu2)Ztx^O_B4jM57zUKwzP&ro%)hP*29n zLL@W6f?`YP|MHYL{CzxM6;RHjs0YRReepLY33=^*=p|tViZ?!S9UOP_OXT2&myydw z-Osv=1cmqUqR|h4eW-xteg$DPb2wHjr{APE_}b3MyBy{l0h|Q{d_mw!h5*6) zmT5#E$TOkh!iwK7!(N{0nm-xFdOas8K$;wVitF4Cjk2+D&|{MaU<>z_>nwHF=yyBojWVM3 z)^UVgVoX%dodpU-Jk5J@i~MQ5zQeJ!+v z`ZFl2JNO?h)8B*4R2^)T(4w?|$F3^#$oq7S3M~qpaPYMWK;f407qr*8uwB+P>4Mek zNVnbz=uVSEMNYxjLi#?Zi%sXQaTk2S^~S}X0$LXzdaHmeqgFS3DdY{U$D)@jwR%ix z4%kSeQUsbJOowfx^t&$jxOwPL05v^uRBp!E`N5O zxNE`1F=x;I#vk=rB-9mG7+ZxED>LifE^m%IQfeCskJ3QcQzh8Z6Q?VJkNU5R`unaI zZA+=a^UC;nwn2$A4;TMyK}@wI_0 zT`e=c5sG@6i!idR2-}>lp}stdi?6Qq56w8JzFwic(utWx_vB&5Lu1zhT7nB*f0T~8 zg+sq;CIUa)?$J9OA(FwfB}yO;MB6eYJd>mINHiH;?xxh0So3R7bY$ADOlg^PINOSJS0qi8bFXXzqwenKXu;wa2W zH$K1#t}B~hO%G_vc-WiuE0ZDZi$D?A+GgR!IfqB@2NU279g6Z-=aHka(0$KViyhHafeQQ$=kQ2>IAI z9p3XdZq?ZxAY85dvg3d-Q3*>2&kds!-B~Nnd9TrKn`P|6s@DknIj0xu==z?qd>qR8 z4Oqb)KROSMn1PW^IET+)2imwqeEH0Zy5te7k@tB0c&<_oh%=2*=V(dcO}!sDSt7Qa zqIx$|dmOo2Cm%Rcl6N+aFT%#5NkrkGY36JaDdDLQn@viTpcFf=Ctw;n={k*%0mct+ zDDKm{Z>qkrXO=~&TOJKCx0hmvR1{t zF>N())Q~Z5+lPtjWeX|fAUn`iSv(*>5-a&3h5W3XX<2G`W*jx!T;#`)5Xeo``SZSq zL_igJZonE71JIFe5DUNonuSPS%ipFx(dvI&eF+o3)?~Tf|1>KF%Yig}*yJr{b zIp*7ESZ{d|<-$^O@$YbU&EnlNRl(QBvGg}%^(Td7-#3us;d7i0QznO6??D@>fh<-! z@Pe7DcC=UO0UO6njC5tUiN$i1PomGiq##DtkC^c20~?5+!0i4z&mO-mU=Ht+8kbt{ zT^vXQDTsOc>=x8AVP{Uq31Gl+&8P&kx^uQlA^gY(Ux&eKOTHfV)SN{Dj$|~Tk{W$S zU?1HfJ1)owA2B6<$HASXHjAoY6b8uIiZ}vK!B7}27|xB?C5i&m}j`o9-IN=kz1_B*c;(=ysCozR{!cUiM&Dnn&3Xptik%;meZ)& zp$4syNkp*yNxf|d7a1_!dn0-Pco1G}Q>TJhtT%RcsN4ltbX^Fj#swMSqOrJ~r_+$N zhzG05vt64hjIqOKJ^8$<@~-q5;8mo-^!|nND^zmp2HfzCHXg-(QYX)g7S-K8<_)Ra{6;{HPj^e@3>z?hgzmWo0W;tMG>mzV z55Nso)p*`X*5C1=Wr)(Y+bt$$lH^2I6~g#$#lui3@Hub6C?Vnj#|oA7mcn0<{;)8JhpA%aE7HvEv?|k{6mF1 z_g)V$U-@Q|Uh3qWJ7JEi^!)Wfn{L#RV r|NZa(otFPKhyUFM|F7O*=Y*B*-~Vr7@53T?fC>>$S3j3^P6?a?IrGZsuKuZ$0w)0gICbl$jtKxT zfrrp-R%Y-oMd;Q5_{Zpbl?b?|X? z^zwD_enw`%X#jvIa7#z)Uf}1IKgfLV(fcENes=#BUcOj$ZspPGHfDBa4+Te=R);US z*)l)Pnna=hZ0NlE@+eA7*wXl{z^gcw(_$y1?q2z0Kd^zx`BLWyg$_U^SgIWRPuk<- z*m~Ap+raLLIwa>2QFQ!P5s`ej#=lcMOmttR({Co(HBjpoR?2e9dT0gcwGY8W3D`yy z{*V8-rzUFLvr7GNXWSb%bNsV4|H-@20vyqCsrH*|KUd>3*S>JL(sQ_yg*~L?98u)4 zd!2O}8?Oux(A-E|RNIHBwtp4>PzLqYmyM4|St9gB{XZf5t9CoR+MK^5I5jRlD70R( z@c&^I)uwiC*vcEdzB$)n7rInA?u9y#uA10%OorR7* z=3zmLV#gNZ4vuU5$OgSbPw?131_M}HH>V;v+Y73QLHKMzuj*;p1~!KO-9b!(?s&G4 zZIFER&tRSC|1JWQ)YQ~J&z9QXUvX|=gZ}Sg)6dat;`#qq!G30WDDMWq^}kcTk=O@C zwyQSBm^&_dZ2%*Pz9!z#4c?ApAG`K&0)R}JAc_~fE1DU)2M;w)qkNJ4ZMW~Pc~RtG zibdpbAFr`fvibVK0eMs8u;u6q9Qix`dn(!cAQpGE2fgMy3r==Y=)U(6=iZ!M$mokw zsXc?xC0qh%`R_d2?b|g$+pmN10l~>?lwR%4dBvl+`UQ1r+ZOf+S|Rs3Y9feK;L~zS zu`NfF?y9_Ut!A}yygT(Mj0I+-E(ril7m52sYC8xu)|#zu)w!2~UR>M>9m((xaB__I zR-84j#G@u=UdI_654x#_e9%o!6xmBSGFz)zfFT!DkKP5(N{Cn-OpFtEuJ3JW9&P!C z27rh}t~ayHp~)z$b>qPswcV)*AAf%*vtjIh4fegH`qHgUo5^jVy}=xf^Wx&1YU@ok zTj0#tk2X+4bcj2ZRlg@`R-sm2je9)Y-2Yio6g+oj*41$TI+8YkwRmO?#egpDR^R&_ z@G7d!kUnVGu|IiqIMhSm3O$5(J4(P%ebKfD>sZdo3spXQn{&PkETH|R)JAH(32d&<3ID@Ace&Nppte`O~NmgD7B8Stw9Uz{$a`)wyPejV6%?~}ndWY?H$hDTx0KBl>#Ul##(9nlqGx?9m z{s?~75ss>>&Rp*;0d$Q(-K#s*N+_$DYL%e$XdEPXHY%^5z(Po6)#k zwoPqK3Ska+kR1Oys*TNV7y6$^HFqO4-#Dwy@Nb%GZpY6x?ytR5Y}_EsvNcYz%|4As zeXd{gD@xX+4`{yMU)$e(WD!EqKPn8S4G=muhpQUzhtLV34izf_L}boHz$AKer|Kw7 zjlN{~4tuzCqy_RT{x>*}A|O%%LaBD|BVj=|iS)IA&=5AVBXVq@@n7P0VL*o}apUgZ zymv@x{h}^Bai5H{Bd)&;mGBOpDf*onK)iI^d_8RlclmgJ%z9EyBzsUqYFnfRMGT2o zC5lbb3JeqK$cL(%_|OA9XEMlr`)kxc0oVyNb@Dy-XfIUEF!0A29UYJ`dr|eX=QS^b z8bKR#>xqp_mIvW4`sd-P?XJm#*{&WnP`VRyG`7EiW5L;ktl(`ggHrSUKQyx0t_SZC z$#mPjJ?s$^$dBGgjep>Q&1|5|UfBfYS3hJ^@+d5r8gO)fPyc99q{B3AGqHySu#*%y zT>nKq5^mr0oZRtTI6ORq-F<#g7fL1ZYM^!xSTuLF_7X()#(lPz?}I&{)9NYNp@wPH zdUC?iuE>#*PGLhGd9Nq5xyCny5TL#=tr@zP99mPqQ-QmD92w@ei$WvnH)3%YCihY& z#r|{H-*ZL5yTX`kzs-&KQ0tH>mXMpr0v|9*513^MU1ymstXm7J4hB(|RTI2d8ob*g z^0p^ifB6*cixpI8H0FMe$O!E#ZfCG2PyuX)go!>g}7-CTZvGif~94^3AB0&kVQ zIVKkwjBDq(6TpDfxIzP`OHy1MjMmOPq4OD$SF!unY@F(p-kKx3%~O->r#5{xsb!ms z`k@I2WuZI1n?HDy=#S#xs({S)>HDu=?ZbT3pKk|XD5z5n3bG+hduZLQovwVom`{exFLwk*sb<}fI(A+GF)}2xhWaC zDY^MmQp5Og2uHJN$^vy9sg5BQxG zJ!n{d@NdVCquoySrU8zE`whl2jsNa~=}ZEle!e0Pd(@_Xs0os!k-V?5_XB=#qlQ%I zUAz7PwN|5_b}(BvdmMFbLyoAEm*J?<4tVf|io4(}Ic=5asL%WW#RSxH+@2!V&d*v7 z0EftK(->^=A0ctuR^D&ndvD_}(Re(L0&FtSDPFm~eEKHE+{CDa9 z-}WD$4(WQv|En|jA?gk2}wT4S%{oy)?Cg8yADm`-M?k$<)1m);QgWn#Qy-pBLw9cvXaRT^iyH*)T zV4bfSG(!d|_kx1tgeE0*?fZ4z&GK}aOmR^JlD={RFbO_zcur@g!^)ib8<;!Pl1^;9 zJOKJ+ynkr{PneFM=F(mI`$-oiP^5*3d7;4!6zc#okpG(fc(IuoK1VsrICwEKhZKel zi3?d|h>8jkWP>!_ac^!K2xR~Om#|6bcwA(<1$j$5`4@aYJstp(xPbg8K@R6tLE8g) zFDXrx$pB!Ie0V3NhW#ifp>EiB_D-6Es+cxCY|GsM zRMMuIJ|hsz#SZ44X;RX|>hLM`;YQDM&$0Iw_4pKC5%eZ)svjDVo%@i@!p z7`a)MMnoexYV!Bl=(4aec9`cc>0z3OC*b|_Y4KUMWn?N?S%Oa~r{eb;e-^-e+%nf! zr}sF=_JBNx4p1x+9_C=+Y6^`2FsCm;GTI<4P+Nip zfyp9fC)X}N!#h24z}bj+e!{Fri3@^|WMz&Mt6F7chXPV7(!CZi10=$>fvDn;@J6FXD)hl4L*4~G>ymJ0EV(Gzs0az4j zMqq;~bh|sumLvcf5hw@Rl^NpNQ61!o%jx-f1C?RcWk!7K+h;dk+(pr9wMI2CqgexP>J5%*V`2m{X9&c!jkFfj5Nsqh-fBL^( z)WY!_%&s)5Q-*ev{vs6ni+vxWWNy3C=fwa-T6Tp1sj4K<#Sr@5Rjn|?Rj~;+ijG>D zW=DAK_=@MTDYRW?!uVec549x(*>+@mx;LmB2*+S5Z=9kT3YD?!FXqkE8b9|waMBZH zsbIYTBD!xQpE1ULwxGVLBytjRlZ%Vd$0)*H4j2) zPm~OW+lU$CsX&q$eiBmBx)bdWIS^ZPjz)UJK0y%NJQqjs!*^ZMMIZnsEmM6<=L*@w z1*@WVrd&%iwZjYSNK~|6r)NGhexIvB1cFJ*rDkU*7e~t^V>fFXcPy{E%iGFNozl{5 zGBW{;9ut27?ZxVR0&OQ5W%9-p9&{*JEgOswpb_qRpUBB$&$lZ$%OT}`IsGNwe z>?~+!^x0Vn48y6%Owg293l+mAT=0tg8p5^yU~V^j^CE*-!R*W@Dj`2zQ zixm^VMN*-z=ZBP?cxmOD1WhGeV}{qW%!5*+CO}*IT*`nEm%3*Z32|%Rb1u~Dc2I^LR>2#7-w~ZDF$0}&=|+|$;IhCsjKrhazTukmpAEk zcyBMY%!qNZiiRgq(_mW<<5BKplnUvDrVCrSOpvC;B1?>xG;py$wB$tzcc<1R8V82o zqoCR8^HETPV5O6Er==yY--$$tMMa)@?Wm~FuiA$G7&>P9W-#S_I!zA9%WBB4~%}TajLt&eq+nMl?8G&!u%+GGjQ;mpdrFDe2-rPh*2^9ba{mJ(a5aNm-b zh5COo-sd{JPoGrF+%X=JVFO+lW3*5LIQ5heRS{?yp!Y-FBX!RE#8+ZijgH_JBYpl% zLHv(2R}iT7Cu#PeGH|gn_P!n(i&A(Xujp2=` zsG2xel#nw0d<8r;#Osp#n~)Pf_11fEpZzX-0-ZVdYRSdOd!P+D9X$5onDy5P(YVzv z(?4B zUoXA8YQX{bo62CvFolQY{yK;f`V-1locw~R_yuB0sC+(i=CGd>wt5!LyO`sD)joBW zbG46yE&_9*YJ=Hb&?4+VJ}a>@#{K@T&guKWF6ra}8CvkJp*yLh%y1e@1{~=24nXfk6Y?o4-n?%!`+* z;AyF;>Id?a=|(le(NoQhMI#NG+#9bXT^c)~=Gp=>txTeQRlkf<*Han+0=+VUlXjd#9(w=`cf;2Jk zSVvvG{l@t$_d@hdyTCW+SO;IpbUP>ZU(LVOVeGyBy77elJ+WizRre;F9Z7ISsdHB{ ziGcNHJ8F`P*IXlOD|P8!Ss}EHwdoUd?y(yOr{5^lzky{<@k-en{5<3?>BKNYgSK4h zY+9Mv_z+HDKjq3pF%RY`tuLNFO|VLnWkFZ3D5c4Sxsy`S*W#SD$44@}rupe-Y?r+JA}cv<<7yR#`UY=<)QuY*H+HTUqw%us~G! z-s$0&YyeEhk`JQH`q}>0Ap2r2bEsNr6XEO?NE&M2s2yAQMW_euyXGy8Tydn6Bt-%W{u#U5kZL^mZ&`gJwtZY{( zMm&V~HeY0L zQ4UV6CT(S%z>7Z=jH{TUdy{3W`ejwe123gYN-gNXNnvJAwPqCA@%on~vd)>2OJFx8 zBG1FD84aIEZ6=FS90O-$_q})Q-ZrcC=_ejepWCkLdZcE$u=wgQ()KGm0PEc8k{a6> zsRDb@qBL?f9Hi*SPl?P-e@uj}gPK}`vZ#Bq7eYS4fyGatvrelDGB+a46X9Zk z;Sr0Yy%fi(+T59uvEhd5`)H&MrwiY9ZLeW8N`=m&-gneHK!G32acb>slwUwZF`tN6ty7k$?476b^8YKmF-`xmjIE-o8Fd5sJ|_7k#A1XecVz z$}1*e&CuHWowJ`Xuzi>rp>W}ealB_^j5g)QWCRN%U`VkQeWYg0LziHJW)0TpOLT^T z4-~&Rv~e1QpQv6C6PTCje5ov8%LQ1=EJL~JI+mZ~&$8-#;HCjvN>bYgzfK=KN(f3= z`^`7*K`*A(KB}ZKV@w$V#bU(IPCZs=Mw}nlY9Pt5pkg!OR8-P6e0zV1`MbrXl2!+s zR~E=>PWhc)HZ*4%7ckNM=#*vV&Ut89@5#(m=7Ved{bqZMEm3ie?h$ZSz$ymbdG&9Z zNUQ$^@t{k53^UBk(tX~H#;rFfK|7bLY*F=7C{8qk!Z0n~AEzQzB$KuF^`Qw9IVUw{dR)SG1Zxn>kzUz@ zB>2r@;>3`=)#eLZ`r(#ue6tTt$nW&Va9Hb6m5aWD(J2)IF4oUntB` z7!V4yWs@5Qrc|I9rZ$*XK?2VaBXmLGhqclVh4fUjt(}Wh7P!x{@0Wdf``CTSC)`x7 zK>u$6kW3X-RaNQ~>#RV*kx=}rghIA)y%e^ky4;7`YnqD}zxD9=eq2BfxYy{NMt>Gr zOOD*ndC*7V-{@VK66VLe-~Gy`6d%*19Q)=LzS4fBWR2IBmX_>8xkjRSwYuxoE>e+A zr?(`k4%22=Bo# zeran*w(YVJH~oa^wj6*`JdiGD7_HoNCVckkdo>`YpNMMioWad#xn8wIkB{?hn5CIm z5@cIyy(lE@#zm?;?b>lir=b{Ty|xf7D|t10AsLNFePcIxYYI#wKIDuR;zL=aUTIu+ zdZ-+~ohGpqq0~xaZ)*{H?ZOHO@SopjTBU@ry1epimUVIN6*?5Uzw8Hw#5Fqmqdq=C z+XYm-W4ohql>{+Mzb=inet3_Sy2w!E7qihz;NpfL93-ytJ#?--ydl~PUky=ePZqC1 zCrSS>FTKu@86R(&wT;X}Q9P(2yRu_^jzW;8>rl+8;$ntMZdS@KpGJX8pfigK7Z)6I zg+&qw3^lli{;pOB!wc8U2}M)|8@D|*yOwV^9b?1yxr`!_CycoPkH?9Twj*1IPaeJk zZiPzIh!;mO;*P$mbRh$^xX6Jf8`nLPaN`=yGXKv!etdKd;hL2MWG*#ctL&G*=(&#zo);lUHg;lDA)aT&^zLm9h zNODARGn%=#S?Kj5E8veXg5K2b4Gxy5cJWsV)yF&3S zM`*UNf|ccN&$F#?U2KfocvKW%Czu`U4*kdoMd$HLG~fx}Tp$WX%}p-UrHgYy#-tFr z0rWrpe2f?(_~12@c{UFnRCVz^0ig_z89vv$`AY$e(3z;=2l|Vq2F*=v1mBqbA>BcJ zjb-*;eD#lutbj^WIH%R3$O5-e-$FrXY~m?%Utx;hk;&N47VpQx6`V*uiHWS~U%4~E zYz~~#y*)A@a_+`#HnEkz-I~HPSgK_`W^l8Pj1Zq?r*On{ndB^nv*IP=B8-@B#I`tFAFE0f&(A;ieqcjSWC@J#Q`dR1Z z4`mmm0hehLGSq(bp&0UDd<`=LK$F1Fu*Qb3GNse?Q+O5jCD9EcT_st5`7KYyW0x#Z zXx#Sa=D?qqR%;%$KINcrdB(DT5ohQvF)p=DkCuwKmgOP*3z^j!{gM8zam|3#Xfd#p zfH!saWLF-W^!(U|8!>%3WpYT;P?hw2#$z*;m4(#9A3NeU>ivXJa>` zyH&QmJ{Nf^Yw$#+us73Z<5lmW%0}Kmz6fw#N6urLiI%e0_!{{J!q>@a0q@oRss$_k zQpjJ>bKI|83#(uM_^^@%ZQpFht$br#`}uDuLE6&G*j0C!W3E2L~g%ID;0%K3eG88+}) zi57-jZM~_$`p3V%YV5+_zwyETSQMTbQ zW7)XYewC?;vnvA!*)U73rk0JkBf$rmsWnPAvyH&f zqFu@98nH8KO*F>%(({6|6g+qk;td+^tJ2&1*_h3*uu(;(2?xd15CTt(Gqf zXr|c7Nx*9^ zb#pqCmEJD6%nm#|UMb`B_myBxaVm-f-*>W}-K7lfTnc-Yjhn1xrUeS;A(Qs%G*|a8 zQs!v3Q@=l)i4PtBURB#J zJbsDLME?=bGb8_3s5h(Aw)J_kPx{?*S(X^7zi6)B8^Dt%5=>X$L`E{(WHCXVD-^HR zGatrTY-`g3Xxd@FS{OM0Aq5RZ&!ZDjo4b51LAeIz8Qu^5839RzKfc~201c9U+zodz z`bHiyb^n(}c&P6~wQ_tQU>{b)Bnl{<3+M6uJMC!m?;kGK7|%pR@{mGrm8Y=g^YUO( zSHD8-N##Sk#}b|A5N8=(?ZZNttXtra4|l#yK4H;mN_p-1JbBB?ro{uTI;T=W5`XmP zYolt#>_TNoqhjn+v!Iw^&B)-vGLB_#p2Y`EexOmmyicaFaYA>Z4l;@! zq$YhPUwiVva{e=RKqcpTE4Wf06$4EDbm~}35$3$wag8(=ct`k1F?hr+nR{Nl!<|p; zrlmodtvXenv$<-(H|XNKq(oF))!}r38s8Z@`*CMTMxZ(3j}9xe5`0_34u)v{;CpEB zq>+2FC3!}vX}-Wid>qmYvq*%EKRKI5@?T9`tLZd0iY!LppjX8KR&M_NW{!o8bsyts z%f-RNR?zMT`7WcAbvYAbgKm;),_1JPSS?S5$zt+efYap?6-Ngh<#o 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 me7d7+4=);{8~CHz>ZZRMmc?b?{Z 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 diff --git a/include/geo/combo.hpp b/include/geo/combo.hpp new file mode 100644 index 0000000..3a5331f --- /dev/null +++ b/include/geo/combo.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include +#include + +template +V select(const V &data, const M &mask, size_t count) { + V result; + result.reserve(count); + + for (int i = 0; i < mask.size(); ++i) { + if (mask[i]) result.push_back(data[i]); + } + + return result; +} + +template +std::vector combinations(const V &data, const size_t count) { + std::vector result; + + std::vector mask(data.size(), false); + std::fill(mask.begin(), mask.begin() + count, true); + + do { + result.push_back(select(data, mask, count)); + } while (std::next_permutation(mask.begin(), mask.end(), std::greater<>())); + + return result; +} diff --git a/include/geo/geometry.hpp b/include/geo/geometry.hpp new file mode 100644 index 0000000..92c772c --- /dev/null +++ b/include/geo/geometry.hpp @@ -0,0 +1,63 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include + +#include "combo.hpp" + +template +using Prims = Eigen::Matrix; + +template +using vec = Eigen::Matrix; +template +using mat = Eigen::Matrix; + +using vec1 = vec<1>; +using vec2 = vec<2>; +using vec3 = vec<3>; +using vec4 = vec<4>; +using vec5 = vec<5>; + +using mat1 = mat<1>; +using mat2 = mat<2>; +using mat3 = mat<3>; +using mat4 = mat<4>; +using mat5 = mat<5>; + +mat4 orthographic(float left, float right, float bottom, float top, float front, float back) { + mat4 res = mat4(); + res << + 2 / (right - left), 0, 0, -(right + left) / (right - left), + 0, 2 / (top - bottom), 0, -(top + bottom) / (top - bottom), + 0, 0, 2 / (front - back), -(front + back) / (front - back), + 0, 0, 0, 1; + return res; +} + +mat4 perspective(float fovy, float aspect, float zNear, float zFar) { + float tanHalfFovy(std::tan(fovy / 2)); + + mat4 res = mat4::Identity(); + res(0, 0) = 1 / (aspect * tanHalfFovy); + res(1, 1) = 1 / (tanHalfFovy); + res(2, 2) = -(zFar + zNear) / (zFar - zNear); + res(3, 2) = -1; + res(2, 3) = -(2 + zFar * zNear) / (zFar - zNear); + return res; +} + +mat4 translation(float x, float y, float z) { + mat4 res = mat4(); + res << + 1, 0, 0, x, + 0, 1, 0, y, + 0, 0, 1, z, + 0, 0, 0, 1; + return res; +} diff --git a/include/geo/mirror.hpp b/include/geo/mirror.hpp new file mode 100644 index 0000000..1e7c1bb --- /dev/null +++ b/include/geo/mirror.hpp @@ -0,0 +1,128 @@ +#pragma once + +#include + +#include +#include +#include + +#include + +template +float dot(int n, const V &a, const V &b) { + float sum = 0; + for (int i = 0; i < n; ++i) { + sum += a[i] * b[i]; + } + return sum; +} + +template +std::vector> mirror(const tc::Group &group) { + std::vector> mirrors; + + for (int p = 0; p < group.ngens; ++p) { + std::vector vp; + for (int m = 0; m < p; ++m) { + auto &vq = mirrors[m]; + vp.push_back((cos(M_PI / group.get(p, m)) - dot(m, vp, vq)) / vq[m]); + } + vp.push_back(std::sqrt(1 - dot(p, vp, vp))); + + for (const auto &v : mirrors) { + if (dot(p, vp, vp) > 0) { + for (auto &e : vp) { + e *= -1; + } + break; + } + } + + mirrors.push_back(vp); + } + + std::vector> res; + for (const auto &v : mirrors) { + vec rv = vec::Zero(); + + // ortho proj + for (int i = 0; i < std::min(v.size(), (size_t) N); ++i) { + rv[i] = v[i]; + } + + res.push_back(rv); + } + return res; +} + +template +vec stereo(const vec &v) { + vec r; + for (int i = 0; i < N; ++i) { + r[i] = v[i] / (1 - v[N]); + } + return r; +} + +template +vec ortho(const vec &v) { + vec r; + for (int i = 0; i < N; ++i) { + r[i] = v[i]; + } + return r; +} + +template +V project(const V &vec, const V &target) { + return vec.dot(target) / target.dot(target) * target; +} + +template +V reflect(const V &a, const V &axis) { + return a - 2.f * project(a, axis); +} + +template +V gram_schmidt_last(std::vector vecs) { + for (int i = 0; i < vecs.size(); ++i) { + for (int j = 0; j < i; ++j) { + vecs[i] -= project(vecs[i], vecs[j]); + } + } + + return vecs[vecs.size() - 1].normalized(); +} + +template +V barycentric(const std::vector &basis, const C &coords) { + V res = V::Zero(); + + int N = std::min((int) basis.size(), (int) coords.rows()); + for (int i = 0; i < N; ++i) { + res += basis[i] * coords[i]; + } + return res; +} + +template +std::vector plane_intersections(std::vector normals) { + std::vector results(normals.size()); + + for (int i = 0; i < normals.size(); ++i) { + std::rotate(normals.begin(), normals.begin() + 1, normals.end()); + results[i] = gram_schmidt_last(normals); + } + + return results; +} + +template +mat rot(int u, int v, float theta) { + mat res = mat::Identity(); + res(u, u) = std::cos(theta); + res(u, v) = std::sin(theta); + res(v, u) = -std::sin(theta); + res(v, v) = std::cos(theta); + return res; +} diff --git a/include/geo/solver.hpp b/include/geo/solver.hpp new file mode 100644 index 0000000..7c6c897 --- /dev/null +++ b/include/geo/solver.hpp @@ -0,0 +1,233 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include + +#include "combo.hpp" + +/** + * Produce a list of all generators for the group context. The range [0..group.ngens). + */ +std::vector generators(const tc::Group &context) { + // todo if tc::Group has 'global' generators, then this will be a member of tc::Group. + // std::iota would populate a 'default' list of names, if names are not provided. + std::vector g_gens(context.ngens); + std::iota(g_gens.begin(), g_gens.end(), 0); + return g_gens; +} + +/** + * Determine which of g_gens are the correct names for sg_gens within the current context + */ +std::vector recontext_gens( + const tc::Group &context, + std::vector g_gens, + std::vector sg_gens) { + // todo ideally tc::Group will deal in 'global' generators so this stell will be unecessary. + + std::sort(g_gens.begin(), g_gens.end()); + + int inv_gen_map[context.ngens]; + for (size_t i = 0; i < g_gens.size(); i++) { + inv_gen_map[g_gens[i]] = i; + } + + std::vector s_sg_gens; + s_sg_gens.reserve(sg_gens.size()); + for (const auto gen: sg_gens) { + s_sg_gens.push_back(inv_gen_map[gen]); + } + std::sort(s_sg_gens.begin(), s_sg_gens.end()); + + return s_sg_gens; +} + +/** + * Solve the cosets generated by sg_gens within the subgroup generated by g_gens of the group context + */ +tc::Cosets solve( + const tc::Group &context, + const std::vector &g_gens, + const std::vector &sg_gens +) { + // todo this should also be handled with 'global' generators. + const auto proper_sg_gens = recontext_gens(context, g_gens, sg_gens); + return context.subgroup(g_gens).solve(proper_sg_gens); +} + +/** + * Apply some context transformation to all primitives of this mesh. + */ +template +void apply(const tc::Cosets &table, int gen, Prims &mat) { + auto data = mat.data(); + for (int i = 0; i < mat.size(); ++i) { + data[i] = table.get(data[i], gen); + } +} + +/** + * Convert the indexes of this mesh to those of a different context, using g_gens to build the parent context and sg_gens to build this context. + */ +template +[[nodiscard]] +Prims recontext( + Prims prims, + const tc::Group &context, + const std::vector &g_gens, + const std::vector &sg_gens +) { + // todo this will be simpler with 'global' gens, but it's still not free... + const auto proper_sg_gens = recontext_gens(context, g_gens, sg_gens); + const auto table = solve(context, g_gens, {}); + const auto path = solve(context, sg_gens, {}).path; + + auto map = path.template walk(0, proper_sg_gens, [table](int coset, int gen) { + return table.get(coset, gen); + }); + + Prims res(prims); + auto data = res.data(); + for (int i = 0; i < prims.size(); ++i) { + data[i] = map[data[i]]; + } + + return res; +} + +/** + * Union several meshes of the same dimension + */ +template +Prims merge(const std::vector> &meshes) { + // todo (?) might be possible with NullaryExpr + size_t cols = 0; + for (const auto &mesh: meshes) { + cols += mesh.cols(); + } + + Prims res(N, cols); + + size_t offset = 0; + for (const Prims &mesh: meshes) { + res.middleCols(offset, mesh.cols()) = mesh; + offset += mesh.cols(); + } + + return res; +} + +template +[[nodiscard]] +std::vector> tile( + Prims prims, + const tc::Group &context, + const std::vector &g_gens, + const std::vector &sg_gens +) { + // todo convert to nullaryexpr. + // some stuff will be easier with global generators, but not all. + Prims base = recontext(prims, context, g_gens, sg_gens); + const auto proper_sg_gens = recontext_gens(context, g_gens, sg_gens); + + const auto table = solve(context, g_gens, {}); + const auto path = solve(context, g_gens, sg_gens).path; + + std::vector _gens = generators(context); + + std::vector> res = path.walk, int>( + base, _gens, + [&](Prims from, int gen) { + apply(table, gen, from); + return from; + } + ); + + return res; +} + +/** + * Produce a mesh of higher dimension by fanning a single point to all primitives in this mesh. + */ +template +[[nodiscard]] +Prims fan(Prims prims, int root) { + // todo convert to nullaryexpr. + Prims res(N + 1, prims.cols()); + + res.topRows(1) = Prims<1>::Constant(1, prims.cols(), root); + res.bottomRows(N) = prims; + + return res; +} + +/** + * Produce a mesh of primitives that fill out the volume of the subgroup generated by generators g_gens within the group context + */ +template +Prims triangulate( + const tc::Group &context, + const std::vector &g_gens +) { + // todo (?) might be possible with nullaryexpr + // not so sure, though. + if (g_gens.size() + 1 != N) // todo make static assert + throw std::logic_error("g_gens size must be one less than N"); + + const auto &combos = combinations(g_gens, g_gens.size() - 1); + + std::vector> meshes; + + for (const auto &sg_gens: combos) { + auto base = triangulate(context, sg_gens); + auto parts = tile(base, context, g_gens, sg_gens); + parts.erase(parts.begin(), parts.begin() + 1); + auto raised = merge(parts); + auto fanned = fan(raised, 0); + meshes.push_back(fanned); + } + + return merge(meshes); +} + +/** + * Single-index primitives should not be further triangulated. + */ +template<> +Prims<1> triangulate<1>( + const tc::Group &context, + const std::vector &g_gens +) { + if (not g_gens.empty()) // todo make static assert + throw std::logic_error("g_gens must be empty for a trivial Mesh"); + + return Prims<1>::Zero(1, 1); +} + +template +auto hull(const tc::Group &group, T all_sg_gens, const std::vector> &exclude) { + std::vector> parts; + auto g_gens = generators(group); + for (const std::vector &sg_gens: all_sg_gens) { + bool excluded = false; + for (const auto &test: exclude) { + if (sg_gens == test) { + excluded = true; + break; + } + } + if (excluded) continue; + + const auto &base = triangulate(group, sg_gens); + const auto &tiles = tile(base, group, g_gens, sg_gens); + for (const auto &tile: tiles) { + parts.push_back(tile); + } + } + return parts; +} diff --git a/include/ml/meshlib.hpp b/include/ml/meshlib.hpp new file mode 100644 index 0000000..258f206 --- /dev/null +++ b/include/ml/meshlib.hpp @@ -0,0 +1,83 @@ +#pragma once + +#include +#include +#include +#include + +#include + +namespace ml { + using Matrix1Xui = Eigen::Matrix; + using Matrix2Xui = Eigen::Matrix; + using Matrix3Xui = Eigen::Matrix; + using Matrix4Xui = Eigen::Matrix; + + template + class Mesh { + public: + using Points = PT_; + using Cells = CT_; + + Points points; + Cells cells; + + Mesh(Points points, Cells cells) + : points(std::move(points)), cells(std::move(cells)) {} + }; + + auto make_cube(float radius) { + Eigen::Matrix3Xf points(3, 8); + points.fill(radius); + for (int i = 0; i < points.cols(); ++i) { + for (int j = 0; j < 3; ++j) { + if ((i >> j) & 1) { + points(j, i) *= -1; + } + } + } + + Matrix3Xui cells(3, 12); + cells.transpose() + << 0b000, 0b001, 0b010, 0b001, 0b010, 0b011, + 0b100, 0b101, 0b110, 0b101, 0b110, 0b111, + + 0b000, 0b001, 0b100, 0b001, 0b100, 0b101, + 0b010, 0b011, 0b110, 0b011, 0b110, 0b111, + + 0b000, 0b010, 0b100, 0b010, 0b100, 0b110, + 0b001, 0b011, 0b101, 0b011, 0b101, 0b111; + + return Mesh(points, cells); + } + + template + auto make_cube_wire(float radius) { + constexpr size_t NPoints = 1 << Dim; + constexpr size_t NCells = Dim * (NPoints >> 1); + + Eigen::Matrix points; + points.fill(radius); + for (int i = 0; i < points.cols(); ++i) { + for (int j = 0; j < Dim; ++j) { + if ((i >> j) & 1) { + points(j, i) *= -1; + } + } + } + + Eigen::Matrix cells; + int k = 0; + for (int i = 0; i < NPoints; ++i) { + for (int j = 0; j < Dim; ++j) { + if ((i >> j) & 1) { + cells(0, k) = i; + cells(1, k) = i ^ (1 << j); + k++; + } + } + } + + return Mesh(points, cells); + } +} diff --git a/include/ml/meshlib_json.hpp b/include/ml/meshlib_json.hpp new file mode 100644 index 0000000..555ac3d --- /dev/null +++ b/include/ml/meshlib_json.hpp @@ -0,0 +1,68 @@ +#pragma once + +#include "meshlib.hpp" + +#include +#include + +namespace Eigen { + template + void to_json(nlohmann::json &json, const Eigen::PlainObjectBase &mat) { + using Scalar = typename Derived::Scalar; + + auto rows = mat.rows(); + auto cols = mat.cols(); + + std::vector vals(mat.size()); + Map(vals.data(), rows, cols) = mat; + + json = { + {"rows", rows}, + {"cols", cols}, + {"vals", vals}, + }; + } + + template + void from_json(const nlohmann::json &j, Derived &d) { + using Scalar = typename Derived::Scalar; + + auto rows = j["rows"].get(); + auto cols = j["cols"].get(); + auto vals = j["vals"].get>(); + + d = Map(vals.data(), rows, cols); + } +} + +namespace nlohmann { + template + struct adl_serializer> { + static void to_json(json &j, const ml::Mesh &m) { + j = { + {"points", m.points}, + {"cells", m.cells}, + }; + } + + static ml::Mesh from_json(const json &j) { + return ml::Mesh( + j["points"].get(), + j["cells"].get() + ); + } + }; +} + +namespace ml { + template + void write(const ml::Mesh &mesh, std::ostream &&out) { + nlohmann::json json = mesh; + nlohmann::json::to_msgpack(json, out); + } + + template + M_ read(std::istream &&in) { + return nlohmann::json::from_msgpack(in).get(); + } +} diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt deleted file mode 100644 index ddda9a7..0000000 --- a/main/CMakeLists.txt +++ /dev/null @@ -1,29 +0,0 @@ -project(main) - -add_executable(${PROJECT_NAME} - src/main.cpp) - -target_link_libraries(${PROJECT_NAME} - glad - glfw) - -target_include_directories(${PROJECT_NAME} - PRIVATE include) - -set(SHADERS - shaders/main.frag - shaders/main.vert) -add_custom_target(shaders DEPENDS ${SHADERS}) - -add_custom_command( - TARGET shaders PRE_BUILD - COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_CURRENT_BINARY_DIR}/shaders/ - COMMENT "clearing shaders" -) -add_custom_command( - TARGET shaders POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/shaders/ ${CMAKE_CURRENT_BINARY_DIR}/shaders/ - COMMENT "copying shaders" -) - -add_dependencies(${PROJECT_NAME} shaders) \ No newline at end of file diff --git a/main/include/glga.hpp b/main/include/glga.hpp deleted file mode 100644 index 2944ce0..0000000 --- a/main/include/glga.hpp +++ /dev/null @@ -1,165 +0,0 @@ -#include - -namespace ga { - struct Vec; - struct Bivec; - struct Mat; - - struct Vec { - float x, y, z, w; - - Vec(float x, float y, float z, float w) : - x(x), y(y), z(z), w(w) {} - }; - - struct Bivec { - float xy, yz, zw, wx, xz, yw; - - Bivec(float xy, float yz, float zw, float wx, float xz, float yw) : - xy(xy), yz(yz), zw(zw), wx(wx), xz(xz), yw(yw) {} - }; - - struct Mat { - Vec x, y, z, w; - - Mat(Vec x, Vec y, Vec z, Vec w) : x(x), y(y), z(z), w(w) {} - }; - - namespace unit { - Vec x() { return Vec(1, 0, 0, 0); }; - - Vec y() { return Vec(0, 1, 0, 0); }; - - Vec z() { return Vec(0, 0, 1, 0); }; - - Vec w() { return Vec(0, 0, 0, 1); }; - - Bivec xy() { return Bivec(1, 0, 0, 0, 0, 0); } - - Bivec yz() { return Bivec(0, 1, 0, 0, 0, 0); } - - Bivec zw() { return Bivec(0, 0, 1, 0, 0, 0); } - - Bivec wx() { return Bivec(0, 0, 0, 1, 0, 0); } - - Bivec xz() { return Bivec(0, 0, 0, 0, 1, 0); } - - Bivec yw() { return Bivec(0, 0, 0, 0, 0, 1); } - - Mat identity() { return Mat(x(), y(), z(), w()); } - } - - float length2(Vec v) { - return v.x * v.x + v.y * v.y + v.z * v.z + v.w * v.w; - } - - float length2(Bivec v) { - return v.xy * v.xy + v.yz * v.yz + v.zw * v.zw - + v.wx * v.wx + v.xz * v.xz + v.yw * v.yw; - } - - float length(Vec v) { return sqrt(length2(v)); } - - float length(Bivec v) { return sqrt(length2(v)); } - - Vec add(Vec u, Vec v) { - return Vec(u.x + v.x, - u.y + v.y, - u.z + v.z, - u.w + v.w); - } - - Bivec add(Bivec u, Bivec v) { - Bivec(u.xy + v.xy, - u.yz + v.yz, - u.zw + v.zw, - u.wx + v.wx, - u.xz + v.xz, - u.yw + v.yw); - } - - Vec mul(float c, Vec v) { - return Vec(c * v.x, - c * v.y, - c * v.z, - c * v.w); - } - - Bivec mul(float c, Bivec v) { - Bivec(c * v.xy, - c * v.yz, - c * v.zw, - c * v.wx, - c * v.xz, - c * v.yw); - } - - Vec mul(Mat m, Vec v) { - return add(add(mul(v.x, m.x), mul(v.y, m.y)), add(mul(v.z, m.z), mul(v.w, m.w))); - } - - Mat mul(Mat m, Mat n) { - return Mat( - mul(m, n.x), - mul(m, n.y), - mul(m, n.z), - mul(m, n.w) - ); - } - - Mat mul(float c, Mat m) { - return Mat( - mul(c, m.x), - mul(c, m.y), - mul(c, m.z), - mul(c, m.w) - ); - } - - Vec normalize(Vec v) { - return mul(1 / length(v), v); - } - - Bivec normalize(Bivec v) { - return mul(1 / length(v), v); - } - - Vec tform(float c, Vec v) { - - } - - Vec tform(Vec u, Vec v) { - - } - - Vec tform(Bivec u, Vec v) { - - } - - Mat matrix(float c) { - auto m = unit::identity(); - m.x = tform(c, m.x); - m.y = tform(c, m.y); - m.z = tform(c, m.z); - m.w = tform(c, m.w); - return m; - } - - Mat matrix(Vec v) { - auto m = unit::identity(); - m.x = tform(v, m.x); - m.y = tform(v, m.y); - m.z = tform(v, m.z); - m.w = tform(v, m.w); - return m; - } - - Mat matrix(Bivec v) { - auto m = unit::identity(); - m.x = tform(v, m.x); - m.y = tform(v, m.y); - m.z = tform(v, m.z); - m.w = tform(v, m.w); - return m; - } -} \ No newline at end of file diff --git a/main/shaders/main.frag b/main/shaders/main.frag deleted file mode 100644 index 395796a..0000000 --- a/main/shaders/main.frag +++ /dev/null @@ -1,20 +0,0 @@ -#version 440 - -#define PI 3.14159 - -uniform float bright; - -in vec4 pos; -in vec4 pos4; -in vec4 pos3; - -out vec4 color; - -void main() { - float light = -pos3.y / 10 + .5; - - vec3 col = vec3(bright); - - //color = vec4(col * light, 1); - color = vec4(col, 1); -} \ No newline at end of file diff --git a/main/shaders/main.geom b/main/shaders/main.geom deleted file mode 100644 index 81d2b1e..0000000 --- a/main/shaders/main.geom +++ /dev/null @@ -1,47 +0,0 @@ -#version 440 - -#define CIRCLE_RES 128 -#define PI 3.14159 - -layout(points) in; -layout(line_strip, max_vertices=CIRCLE_RES) out; - -layout(binding=1) uniform Matrices { - mat4 proj; - mat4 model; -}; - -in float xi_[]; -in float eta_[]; - -out vec4 pos; -out vec4 pos4; -out vec4 pos3; - -void main(){ - for(int k = 0; k <= CIRCLE_RES; k++) { - vec2 xi = vec2(xi_[0], 4 * PI * k / (CIRCLE_RES - 1)); - float eta = eta_[0]; - - // todo parameterize the projected circle so there aren't jagged edges. - // should be smooth at <=32 segments, not just 128+ - float x = cos((xi.y + xi.x) / 2) * sin(eta); - float y = sin((xi.y + xi.x) / 2) * sin(eta); - float z = cos((xi.y - xi.x) / 2) * cos(eta); - float w = sin((xi.y - xi.x) / 2) * cos(eta); - - pos = vec4(x, y, z, w); - pos4 = model * pos; - pos3 = vec4(pos4.xyz / (1 - pos4.w), 1); - gl_Position = proj * pos3; - - if (length(gl_Position) > 4) { - EndPrimitive(); - continue; - } - - EmitVertex(); - } - - EndPrimitive(); -} \ No newline at end of file diff --git a/main/shaders/main.vert b/main/shaders/main.vert deleted file mode 100644 index ed3da93..0000000 --- a/main/shaders/main.vert +++ /dev/null @@ -1,12 +0,0 @@ -#version 440 - -layout(location=0) in float xi; -layout(location=1) in float eta; - -out float xi_; -out float eta_; - -void main(){ - xi_ = xi; - eta_ = eta; -} \ No newline at end of file diff --git a/main/src/main.cpp b/main/src/main.cpp deleted file mode 100644 index c93f90b..0000000 --- a/main/src/main.cpp +++ /dev/null @@ -1,397 +0,0 @@ -#include -#include - -#include -#include -#include -#include -#include - -#include "glga.hpp" - -#define PI 3.14159f - -namespace util { - template - void bufferData(GLenum target, std::vector data, GLenum usage) { - glBufferData(target, data.size() * sizeof(T), &data.front(), usage); - } - - template - void bufferData(GLenum target, T &data, GLenum usage) { - glBufferData(target, sizeof(T), &data, usage); - } - - std::string readFile(const std::string &path) { - std::ifstream file(path); - if (!file) return std::string(); - - file.ignore(std::numeric_limits::max()); - auto size = file.gcount(); - - if (size > 0x10000) return std::string(); - - file.clear(); - file.seekg(0, std::ios_base::beg); - - std::stringstream sstr; - sstr << file.rdbuf(); - file.close(); - - return sstr.str(); - } - - void shaderFiles(GLuint shader, std::vector &paths) { - std::vector strs; - std::vector c_strs; - - for (const auto &path : paths) strs.push_back(readFile(path)); - for (const auto &str:strs) c_strs.push_back(str.c_str()); - - glShaderSource(shader, (GLsizei) c_strs.size(), &c_strs.front(), nullptr); - } - - std::string shaderInfoLog(GLuint shader) { - GLint log_len; - glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_len); - char log[log_len]; - glGetShaderInfoLog(shader, log_len, nullptr, log); - return std::string(log); - } - - std::string programInfoLog(GLuint program) { - GLint log_len; - glGetProgramiv(program, GL_INFO_LOG_LENGTH, &log_len); - char log[log_len]; - glGetProgramInfoLog(program, log_len, nullptr, log); - return std::string(log); - } - - GLuint buildShader(GLenum kind, const std::string &name, std::vector paths) { - GLuint shader = glCreateShader(kind); - shaderFiles(shader, paths); - - glCompileShader(shader); - - GLint comp; - glGetShaderiv(shader, GL_COMPILE_STATUS, &comp); - if (!comp) { - std::string log = shaderInfoLog(shader); - fprintf(stderr, "SHADER ERROR (%s):\n%s", name.c_str(), log.c_str()); - glDeleteShader(shader); - return 0; - } - - return shader; - } - - GLuint buildProgram(bool separable, const std::string &name, std::vector shaders) { - GLuint program = glCreateProgram(); - - if (separable) - glProgramParameteri(program, GL_PROGRAM_SEPARABLE, GL_TRUE); - - for (GLuint shader : shaders) - glAttachShader(program, shader); - - glLinkProgram(program); - - GLint link; - glGetProgramiv(program, GL_LINK_STATUS, &link); - if (!link) { - std::string log = programInfoLog(program); - fprintf(stderr, "PROGRAM ERROR (%s):\n%s", name.c_str(), log.c_str()); - glDeleteProgram(program); - return 0; - } - - return program; - } -} - -struct HopfCircle { - float xi; // longitude - float eta; // latitude - - HopfCircle(float xi, float eta) : xi(xi), eta(eta) {} - - HopfCircle() : HopfCircle(0, 0) {} -}; - -struct State { - GLuint vao{}; - GLuint vbo{}, ubo{}; - GLuint unif_bright{}; - GLuint ubo_bp = 1; - - GLuint prog{}; - - std::vector circles{}; - ga::Mat rot = ga::unit::identity(); - float view = 4.f; - - float t = 0; - float dt = 0; - - void regen() { - circles.clear(); - - const int N = 32; - const int M = 4; - const float PAD = 0.0125; - - for (int x = 0; x <= N; ++x) { - for (int e = 1; e < M; ++e) { - float xi = 2 * PI * x / N; - float eta = (PI / 2 - 2 * PAD) * e / M + PAD; - circles.emplace_back(xi, eta); - } - } - - glBindBuffer(GL_ARRAY_BUFFER, vbo); - util::bufferData(GL_ARRAY_BUFFER, circles, GL_STREAM_DRAW); - glBindBuffer(GL_ARRAY_BUFFER, 0); - } - - explicit State(GLFWwindow *window) { - printf("vendor: %s\nrenderer: %s\n", glGetString(GL_VENDOR), glGetString(GL_RENDERER)); - - float lw[2]; - glGetFloatv(GL_LINE_WIDTH_RANGE, lw); - printf("line width range: %.2f to %.2f\n", lw[0], lw[1]); - - glGenBuffers(1, &vbo); - glGenBuffers(1, &ubo); - glGenVertexArrays(1, &vao); - - regen(); - - glBindBufferBase(GL_UNIFORM_BUFFER, ubo_bp, ubo); - - GLuint vs = util::buildShader(GL_VERTEX_SHADER, "vs", {"shaders/main.vert"}); - GLuint gs = util::buildShader(GL_GEOMETRY_SHADER, "gs", {"shaders/main.geom"}); - GLuint fs = util::buildShader(GL_FRAGMENT_SHADER, "fs", {"shaders/main.frag"}); - prog = util::buildProgram(false, "prog", {vs, gs, fs}); - - unif_bright = (GLuint) glGetUniformLocation(prog, "bright"); - - glBindVertexArray(vao); - - glBindBuffer(GL_ARRAY_BUFFER, vbo); - auto xi = glGetAttribLocation(prog, "xi"); - if (xi >= 0) { - glEnableVertexAttribArray((unsigned) xi); - glVertexAttribPointer((unsigned) xi, 1, GL_FLOAT, GL_FALSE, - sizeof(HopfCircle), - (void *) offsetof(HopfCircle, xi)); - } - - auto eta = glGetAttribLocation(prog, "eta"); - if (eta >= 0) { - glEnableVertexAttribArray((unsigned) eta); - glVertexAttribPointer((unsigned) eta, 1, GL_FLOAT, GL_FALSE, - sizeof(HopfCircle), - (void *) offsetof(HopfCircle, eta)); - } - glBindBuffer(GL_ARRAY_BUFFER, 0); - - glBindVertexArray(0); - } - - void update(GLFWwindow *window, float dt, int frame) { - int w, h; - glfwGetFramebufferSize(window, &w, &h); - auto ar = (float) w / h; - - t += dt; - - float c = std::cos(t / 8); - float s = std::sin(t / 8); - - float c_ = std::cos(3.f / 8); - float s_ = std::sin(3.f / 8); - - glBindBuffer(GL_UNIFORM_BUFFER, ubo); - util::bufferData(GL_UNIFORM_BUFFER, { - ga::Mat( - ga::Vec(1.f / view / ar, 0, 0, 0), - ga::Vec(0, 0, 1.f / 10, 0), - ga::Vec(0, 1.f / view, 0, 0), - ga::Vec(0, 0, 0, 1.f)), - rot - }, GL_STREAM_DRAW); - glBindBuffer(GL_UNIFORM_BUFFER, 0); - } - - void render(GLFWwindow *window, float dt, int frame) { - int w, h; - glfwGetFramebufferSize(window, &w, &h); - glViewport(0, 0, w, h); - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glDepthFunc(GL_LEQUAL); - - glUseProgram(prog); - glBindVertexArray(vao); - glEnable(GL_DEPTH_TEST); - - glLineWidth(10); - glUniform1f(unif_bright, 0); - glDrawArrays(GL_POINTS, 0, (unsigned) circles.size()); - - glLineWidth(1); - glUniform1f(unif_bright, 1); - glDrawArrays(GL_POINTS, 0, (unsigned) circles.size()); - - glBindVertexArray(0); - glUseProgram(0); - - glFinish(); - glfwSwapBuffers(window); - } - - void on_scroll(GLFWwindow *window, double xoffset, double yoffset) { - printf("scroll %.2f %.2f\n", xoffset, yoffset); - - int xw = glfwGetKey(window, GLFW_KEY_Q); - int yw = glfwGetKey(window, GLFW_KEY_W); - int zw = glfwGetKey(window, GLFW_KEY_E); - int xy = glfwGetKey(window, GLFW_KEY_A); - int yz = glfwGetKey(window, GLFW_KEY_S); - int zx = glfwGetKey(window, GLFW_KEY_D); - - int zoom = glfwGetKey(window, GLFW_KEY_LEFT_CONTROL); - - float t = (float) yoffset * PI / 48; - float c = std::cos(t); - float s = std::sin(t); - - if (xw) { - rot = ga::mul(rot, ga::Mat( - ga::Vec(c, 0, 0, s), - ga::Vec(0, 1, 0, 0), - ga::Vec(0, 0, 1, 0), - ga::Vec(-s, 0, 0, c) - )); - } - - if (yw) { - rot = ga::mul(rot, ga::Mat( - ga::Vec(1, 0, 0, 0), - ga::Vec(0, c, 0, s), - ga::Vec(0, 0, 1, 0), - ga::Vec(0, -s, 0, c) - )); - } - - if (zw) { - rot = ga::mul(rot, ga::Mat( - ga::Vec(1, 0, 0, 0), - ga::Vec(0, 1, 0, 0), - ga::Vec(0, 0, c, s), - ga::Vec(0, 0, -s, c) - )); - } - - if (xy) { - rot = ga::mul(rot, ga::Mat( - ga::Vec(c, s, 0, 0), - ga::Vec(-s, c, 0, 0), - ga::Vec(0, 0, 1, 0), - ga::Vec(0, 0, 0, 1) - )); - } - - if (yz) { - rot = ga::mul(rot, ga::Mat( - ga::Vec(1, 0, 0, 0), - ga::Vec(0, c, s, 0), - ga::Vec(0, -s, c, 0), - ga::Vec(0, 0, 0, 1) - )); - } - - if (zx) { - rot = ga::mul(rot, ga::Mat( - ga::Vec(c, 0, -s, 0), - ga::Vec(0, 1, 0, 0), - ga::Vec(s, 0, c, 0), - ga::Vec(0, 0, 0, 1) - )); - } - - if (zoom) { - view *= 1 - t / 5; - } - - std::ofstream matfile; - matfile.open("matrix.txt"); - matfile << "vec((\n"; - matfile << "vec((" << rot.x.x << ", " << rot.x.y << ", " << rot.x.z << ", " << rot.x.w << ")),\n"; - matfile << "vec((" << rot.y.x << ", " << rot.y.y << ", " << rot.y.z << ", " << rot.y.w << ")),\n"; - matfile << "vec((" << rot.z.x << ", " << rot.z.y << ", " << rot.z.z << ", " << rot.z.w << ")),\n"; - matfile << "vec((" << rot.w.x << ", " << rot.w.y << ", " << rot.w.z << ", " << rot.w.w << ")),\n"; - matfile << ")),"; - matfile.close(); - } - - void deinit(GLFWwindow *window) { - } -}; - -void scroll_callback(GLFWwindow *window, double xoffset, double yoffset) { - auto *state = (State *) glfwGetWindowUserPointer(window); - state->on_scroll(window, xoffset, yoffset); -} - -void run() { - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 4); - glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); - - auto window = glfwCreateWindow(1280, 720, "Hopf Fibration", nullptr, nullptr); - if (!window) { - glfwTerminate(); - exit(EXIT_FAILURE); - } - - glfwMakeContextCurrent(window); - gladLoadGLLoader((GLADloadproc) glfwGetProcAddress); - glfwSwapInterval(0); - - auto state = State(window); - glfwSetWindowUserPointer(window, &state); - - glfwSetScrollCallback(window, scroll_callback); - - double time = glfwGetTime(); - int frame = 0; - while (!glfwWindowShouldClose(window)) { - double time_ = glfwGetTime(); - auto dt = (float) (time_ - time); - - state.update(window, dt, frame); - state.render(window, dt, frame); - - glfwPollEvents(); - - time = time_; - frame += 1; - } - - state.deinit(window); - - glfwDestroyWindow(window); -} - -int main() { - if (!glfwInit()) { - return EXIT_FAILURE; - } - - run(); - - glfwTerminate(); - return EXIT_SUCCESS; -} \ No newline at end of file diff --git a/res/shaders/4d.vert.glsl b/res/shaders/4d.vert.glsl new file mode 100644 index 0000000..c9432bd --- /dev/null +++ b/res/shaders/4d.vert.glsl @@ -0,0 +1,13 @@ +#version 440 + +layout(location=1) uniform float time; +layout(location=2) uniform mat4 proj; +layout(location=3) uniform mat4 rot; +layout(location=4) uniform mat4 view; + +layout(location=0) in vec4 pos; + +void main() { + vec4 pos = rot * pos; + gl_Position = proj * view * vec4(pos.xyz / (1 - pos.w), 1.0); +} diff --git a/res/shaders/main.frag.glsl b/res/shaders/main.frag.glsl new file mode 100644 index 0000000..539d64e --- /dev/null +++ b/res/shaders/main.frag.glsl @@ -0,0 +1,12 @@ +#version 440 + +layout(location=0) uniform vec4 ucol; + +layout(location=0) out vec4 col; + +void main() { + float d = 1.0 - gl_FragCoord.z; + d = (d - 0.5) / 0.7 + 0.5; + col = ucol; + col.xyz *= d; +} diff --git a/res/shaders/main.vert.glsl b/res/shaders/main.vert.glsl new file mode 100644 index 0000000..ca74f76 --- /dev/null +++ b/res/shaders/main.vert.glsl @@ -0,0 +1,13 @@ +#version 440 + +layout(location=1) uniform float time; +layout(location=2) uniform mat4 proj; +layout(location=3) uniform mat4 rot; +layout(location=0) in vec3 pos; + +void main() { + mat3 rot3 = mat3(rot); + vec3 pos3 = rot3 * pos; + + gl_Position = proj * vec4(pos3, 1.0); +} diff --git a/src/gl/buffer.hpp b/src/gl/buffer.hpp new file mode 100644 index 0000000..4e91dd1 --- /dev/null +++ b/src/gl/buffer.hpp @@ -0,0 +1,53 @@ +#pragma once + +#include + +#include + +template +class Buffer { +public: + using Type = T_; + +private: + GLuint id = 0; + +public: + Buffer() { + glCreateBuffers(1, &id); + } + + Buffer(Buffer&& o) noexcept { + id = std::exchange(o.id, 0); + } + + Buffer(const Buffer&) = delete; // this is doable, but would be slow. + + operator GLuint() const { // NOLINT(google-explicit-constructor) + return id; + } + + template + GLuint upload(RandomIt first, RandomIt last, GLenum mode = GL_STATIC_DRAW) { + size_t count = last - first; + + // todo StaticBuffer that uses BufferStorage + glNamedBufferData(id, sizeof(Type) * count, nullptr, mode); + + Type* out = (Type*) glMapNamedBuffer(id, GL_WRITE_ONLY); + std::copy(first, last, out); + glUnmapNamedBuffer(id); + + return count; + } + + template + GLuint upload(const T& data, GLenum mode = GL_STATIC_DRAW) { + return upload(data.begin(), data.end(), mode); + } + + ~Buffer() { + // delete silently ignores 0. + glDeleteBuffers(1, &id); + } +}; diff --git a/src/gl/debug.hpp b/src/gl/debug.hpp new file mode 100644 index 0000000..4bd4ee4 --- /dev/null +++ b/src/gl/debug.hpp @@ -0,0 +1,80 @@ +#pragma once + +#ifndef NDEBUG + +void GLAPIENTRY log_gl_debug_callback( + GLenum source, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, + const GLchar *message, + const void *userParam +) { + std::string s_source; + switch(type){ + case GL_DEBUG_SOURCE_API: + s_source = "API:"; + case GL_DEBUG_SOURCE_WINDOW_SYSTEM: + s_source = "WINDOW:"; + case GL_DEBUG_SOURCE_SHADER_COMPILER: + s_source = "SHADER:"; + case GL_DEBUG_SOURCE_THIRD_PARTY: + s_source = "3P:"; + case GL_DEBUG_SOURCE_APPLICATION: + s_source = "APP:"; + default: + s_source = ""; + } + + std::string s_type; + switch (type) { + case GL_DEBUG_TYPE_ERROR: + s_type = "ERROR:"; + break; + case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: + s_type = "DEPRECATED:"; + break; + case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: + s_type = "UNDEFINED:"; + break; + case GL_DEBUG_TYPE_PORTABILITY: + s_type = "PORTABILITY:"; + break; + case GL_DEBUG_TYPE_PERFORMANCE: + s_type = "PERFORMANCE:"; + break; + case GL_DEBUG_TYPE_MARKER: + s_type = "MARKER:"; + break; + case GL_DEBUG_TYPE_PUSH_GROUP: + s_type = "PUSH_GROUP:"; + break; + case GL_DEBUG_TYPE_POP_GROUP: + s_type = "POP_GROUP:"; + break; + default: + s_type = ""; + break; + } + + std::string s_severity; + switch (severity) { + case GL_DEBUG_SEVERITY_HIGH: + s_severity = "HIGH:"; + break; + case GL_DEBUG_SEVERITY_MEDIUM: + s_severity = "MED:"; + break; + case GL_DEBUG_SEVERITY_LOW: + s_severity = "LOW:"; + break; + default: + s_severity = "INFO:"; + break; + } + + std::cerr << "GL:" << s_source << s_type << s_severity << " " << message << std::endl; +} + +#endif diff --git a/src/gl/shader.hpp b/src/gl/shader.hpp new file mode 100644 index 0000000..70111fa --- /dev/null +++ b/src/gl/shader.hpp @@ -0,0 +1,79 @@ +#pragma once + +#include + +#include +#include +#include + +template +class Shader { +public: +private: + GLuint id = 0; + +public: + explicit Shader(const std::string &src) { + id = glCreateShader(mode); + + const char *str = src.c_str(); + glShaderSource(id, 1, &str, nullptr); + glCompileShader(id); + + // todo throw if compile failed + } + + explicit Shader(std::ifstream source) + : Shader(std::string( + std::istreambuf_iterator(source), + std::istreambuf_iterator() + )) {} + + Shader(const Shader &) = delete; + + Shader(Shader &&o) noexcept { + id = std::exchange(o.id, 0); + } + + ~Shader() { + glDeleteShader(id); + } + + operator GLuint() const { // NOLINT(google-explicit-constructor) + return id; + } +}; + +using VertexShader = Shader; +using FragmentShader = Shader; + +class Program { +private: + GLuint id = 0; + +public: + template + explicit Program(const Shader &...shader) { + id = glCreateProgram(); + + (glAttachShader(id, shader), ...); + + glLinkProgram(id); + + // todo throw if link failed + } + + Program(const Program &) = delete; + + Program(Program &&o) noexcept { + id = std::exchange(o.id, 0); + } + + ~Program() { + glDeleteProgram(id); + } + + operator GLuint() const { // NOLINT(google-explicit-constructor) + return id; + } +}; diff --git a/src/gl/types.hpp b/src/gl/types.hpp new file mode 100644 index 0000000..e31111d --- /dev/null +++ b/src/gl/types.hpp @@ -0,0 +1,118 @@ +#pragma once + +#include + +#include + +template +struct Buffer; + +template +struct VertexArray; + + +template +struct Format { + using CType = ctype; + static constexpr GLenum Type = type; + static constexpr GLint Size = size; + static constexpr GLuint Offset = offset; + static constexpr GLboolean Norm = norm; + + template + using As = Format; + + static inline constexpr void apply(GLuint vao, GLuint idx) { + glEnableVertexArrayAttrib(vao, idx); + glVertexArrayAttribFormat(vao, idx, size, type, norm, offset); + } +}; + +template +struct IFormat { + using CType = ctype; + static constexpr GLenum Type = type; + static constexpr GLint Size = size; + static constexpr GLuint Offset = offset; + + template + using As = IFormat; + + static inline constexpr void apply(GLuint vao, GLuint idx) { + glEnableVertexArrayAttrib(vao, idx); + glVertexArrayAttribIFormat(vao, idx, size, type, offset); + } +}; + +template +struct LFormat { + using CType = ctype; + static constexpr GLenum Type = type; + static constexpr GLint Size = size; + static constexpr GLuint Offset = offset; + + template + using As = LFormat; + + static inline constexpr void apply(GLuint vao, GLuint idx) { + glEnableVertexArrayAttrib(vao, idx); + glVertexArrayAttribLFormat(vao, idx, size, type, offset); + } +}; + +template +struct AutoFormat { + using Fmt = Fmt_; +}; + +template<> +struct AutoFormat { + using Fmt = LFormat; +}; + +template<> +struct AutoFormat { + using Fmt = Format; +}; + +template<> +struct AutoFormat { + using Fmt = IFormat; +}; + +template<> +struct AutoFormat { + using Fmt = IFormat; +}; + +template +struct AutoFormat> { + static_assert((Dim >= 1) && (Dim <= 4), "Dim must be in range 1-4"); + + using Fmt = typename AutoFormat::Fmt::template As, Dim>; +}; + +template +struct Binder { + using CType = typename AutoFormat::Fmt::CType; + + const GLuint buf; + const GLuint offset; + const GLuint stride; + + Binder(const Buffer &buf) // NOLINT(google-explicit-constructor) + : buf((GLuint) buf), offset(0), stride(sizeof(CType)) {} + + template + Binder(const Buffer &buf, GLuint offset) + : buf((GLuint) buf), offset(offset), stride(sizeof(CType_)) {} + + Binder(const Binder &o) + : buf(o.buf), offset(o.offset), stride(o.stride) {} + + inline void bind(GLuint vao, GLuint idx) const { + glVertexArrayVertexBuffer(vao, idx, buf, offset, stride); + } +}; + +#define ATTR(buf, field) Binder(buf, offsetof(decltype(buf)::Type, field)) diff --git a/src/gl/vertexarray.hpp b/src/gl/vertexarray.hpp new file mode 100644 index 0000000..7b863e6 --- /dev/null +++ b/src/gl/vertexarray.hpp @@ -0,0 +1,67 @@ +#pragma once + +#include + +#include + +#include "buffer.hpp" +#include "types.hpp" + +template +class VertexArray { +public: + template + using Fmt = std::tuple_element_t>; + +private: + GLuint id = 0; + + template + inline void formatall( + std::integer_sequence + ) { + (AutoFormat::Fmt::apply(id, idx), ...); + } + + template + inline void bindall( + const Binder &...buf, + std::integer_sequence + ) { + (buf.bind(id, idx), ...); + } + +public: + explicit VertexArray() { + glCreateVertexArrays(1, &id); + formatall(std::make_index_sequence()); + } + + explicit VertexArray(const Binder &...buf) + : VertexArray() { + bind(buf...); + } + + VertexArray(VertexArray &&o) noexcept { + id = std::exchange(o.id, 0); + } + + VertexArray(const VertexArray &) = delete; // this is doable, but would be slow. + + ~VertexArray() { + glDeleteVertexArrays(1, &id); + } + + operator GLuint() const { // NOLINT(google-explicit-constructor) + return id; + } + + void bind(const Binder &...buf) { + bindall(buf..., std::make_index_sequence()); + } + + template + void bind(const Binder> &buf) { + buf.bind(id, idx); + } +}; diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..99f03f4 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,293 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gl/debug.hpp" +#include "gl/buffer.hpp" +#include "gl/shader.hpp" +#include "gl/vertexarray.hpp" + +#include +#include + +struct State { + using Transform4 = Eigen::Transform; + using Transform3 = Eigen::Transform; + + Eigen::Vector4f bg{0.07f, 0.09f, 0.10f, 1.00f}; + Eigen::Vector4f fg{0.71f, 0.53f, 0.94f, 1.00f}; + Eigen::Vector4f wf{0.95f, 0.95f, 0.95f, 1.00f}; + + Eigen::Vector4f R{1.00f, 0.00f, 0.00f, 1.00f}; + Eigen::Vector4f G{0.00f, 1.00f, 0.00f, 1.00f}; + Eigen::Vector4f B{0.00f, 0.00f, 1.00f, 1.00f}; + Eigen::Vector4f Y{1.20f, 1.20f, 0.00f, 1.00f}; + + Transform4 rot = Transform4::Identity(); + Transform3 view = Transform3::Identity(); + + bool color_axes = false; +}; + +Eigen::Matrix4f rotor(int u, int v, float rad) { + Eigen::Matrix4f res = Eigen::Matrix4f::Identity(); + res(u, u) = res(v, v) = cosf(rad); + res(u, v) = res(v, u) = sinf(rad); + res(u, v) *= -1; + return res; +} + +template +T_ mix(const T_ &a, const T_ &b, const typename T_::Scalar &x) { + return a * (1 - x) + b * x; +} + +void show_overlay(State &state) { + static std::string gl_vendor = (const char *) glGetString(GL_VENDOR); + static std::string gl_renderer = (const char *) glGetString(GL_RENDERER); + static std::string gl_version = (const char *) glGetString(GL_VERSION); + static std::string glsl_version = (const char *) glGetString(GL_SHADING_LANGUAGE_VERSION); + + ImGuiWindowFlags window_flags = + ImGuiWindowFlags_AlwaysAutoResize | + ImGuiWindowFlags_NoSavedSettings | + ImGuiWindowFlags_NoFocusOnAppearing | + ImGuiWindowFlags_NoNav | + ImGuiWindowFlags_NoBringToFrontOnFocus | + ImGuiWindowFlags_NoMove; + + ImGuiStyle &style = ImGui::GetStyle(); + const auto PAD = style.DisplaySafeAreaPadding; + auto window_pos = PAD; + + ImGui::SetNextWindowPos(window_pos, ImGuiCond_Always); + ImGui::SetNextWindowBgAlpha(0.35f * style.Alpha); + ImGui::SetNextWindowCollapsed(true, ImGuiCond_Appearing); + ImGui::Begin("Graphics Information", nullptr, window_flags); + ImGui::Text("GL Vendor | %s", gl_vendor.c_str()); + ImGui::Text("GL Renderer | %s", gl_renderer.c_str()); + ImGui::Text("GL Version | %s", gl_version.c_str()); + ImGui::Text("GLSL Version | %s", glsl_version.c_str()); + + auto v2 = ImGui::GetWindowSize(); + window_pos.y += v2.y + PAD.y; + ImGui::End(); + + ImGui::SetNextWindowPos(window_pos, ImGuiCond_Always); + ImGui::SetNextWindowBgAlpha(0.35f * style.Alpha); + ImGui::Begin("Controls", nullptr, window_flags); + + ImGuiIO &io = ImGui::GetIO(); + ImGui::Text("FPS | %.2f", io.Framerate); + + ImGui::Separator(); + + ImGui::ColorEdit3("Background", state.bg.data(), ImGuiColorEditFlags_Float); + ImGui::ColorEdit3("Foreground", state.fg.data(), ImGuiColorEditFlags_Float); + ImGui::ColorEdit3("Wireframe", state.wf.data(), ImGuiColorEditFlags_Float); + + ImGui::Checkbox("Show RGBY axis colors", &state.color_axes); + + if (io.MouseDown[0] && !io.WantCaptureMouse) { + Eigen::Matrix4f rot = Eigen::Matrix4f::Identity(); + Eigen::Vector2f del{io.MouseDelta.x, io.MouseDelta.y}; + del /= 200.0f; + + if (io.KeyShift) { + del /= 5.0f; + } + + if (io.KeyCtrl) { + Eigen::Matrix4f rx = rotor(0, 3, -del.x()); + Eigen::Matrix4f ry = rotor(1, 3, del.y()); + rot = rx * ry; + } else { + Eigen::Matrix4f rx = rotor(0, 2, -del.x()); + Eigen::Matrix4f ry = rotor(1, 2, del.y()); + rot = rx * ry; + } + + state.rot.linear() = rot * state.rot.linear(); + } + + if ((io.MouseWheel != 0) && !io.WantCaptureMouse) { + float scale = 1.0f + io.MouseWheel * 0.05f; + state.view.linear() *= scale; + } + + ImGui::End(); +} + +void set_style() { + ImGui::StyleColorsDark(); + + ImGuiStyle &style = ImGui::GetStyle(); + style.WindowRounding = 4; + style.FrameRounding = 2; + style.DisplaySafeAreaPadding.x = 10; + style.DisplaySafeAreaPadding.y = 10; +} + + +Eigen::Vector4f hopf_map(float e1, float e2, float n) { + Eigen::Vector4f res; + res << + cosf((e2 + e1) / 2) * sinf(n), + sinf((e2 + e1) / 2) * sinf(n), + cosf((e2 - e1) / 2) * cosf(n), + sinf((e2 - e1) / 2) * cosf(n); + return res; +} + +auto make_hopf(size_t latitudes, size_t longitudes, size_t link_res) { + Eigen::Matrix4Xf points(4, latitudes * longitudes * link_res); + ml::Matrix1Xui lines(1, latitudes * longitudes * link_res); + + Eigen::Index idx = 0; + + for (int i = 0; i < latitudes; ++i) { + float n = (float) i / (float) (latitudes - 1) * M_PIf32 / 2.0f; + + for (int j = 0; j < longitudes; ++j) { + float e1 = (float) j / (float) longitudes * M_PIf32 * 2.0f; + + for (int k = 0; k < link_res; ++k) { + float e2 = (float) k / (float) link_res * M_PIf32 * 4.0f; + + lines.col(idx) << idx; + points.col(idx) = hopf_map(e1, e2, n).normalized(); + idx++; + } + } + } + + return ml::Mesh(points, lines); +} + +int run(GLFWwindow *window, ImGuiContext *context) { + State state; + + Buffer ind_buf; + Buffer vert_buf; + + VertexArray vao(vert_buf); + glVertexArrayElementBuffer(vao, ind_buf); + + using PointsType = Eigen::Matrix; + using CellsType = Eigen::Matrix; + using Mesh = ml::Mesh; + +// auto m = make_hopf(3, 4, 5); +// auto mesh = ml::make_cube_wire<4>(0.22f); + auto mesh = make_hopf(6, 8, 4096); + + auto elements = (GLint) ind_buf.upload(mesh.cells.reshaped()); + vert_buf.upload(mesh.points.colwise()); + + VertexShader vs4d(std::ifstream("res/shaders/4d.vert.glsl")); + FragmentShader fs(std::ifstream("res/shaders/main.frag.glsl")); + + Program pgm(vs4d, fs); + + glEnable(GL_DEPTH_TEST); + + Eigen::Projective3f proj; + + while (!glfwWindowShouldClose(window)) { + glfwPollEvents(); + + ImGui_ImplOpenGL3_NewFrame(); + ImGui_ImplGlfw_NewFrame(); + ImGui::NewFrame(); + show_overlay(state); + ImGui::Render(); + + int display_w, display_h; + glfwGetFramebufferSize(window, &display_w, &display_h); + glViewport(0, 0, display_w, display_h); + glClearColor(state.bg[0], state.bg[1], state.bg[2], state.bg[3]); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + auto aspect = (float) display_h / (float) display_w; + proj = Eigen::AlignedScaling3f(aspect, 1.0, -0.6); + + Eigen::Matrix4f rot = state.rot.linear(); + Eigen::Matrix4f view = state.view.matrix(); + + glUseProgram(pgm); + glBindVertexArray(vao); + glUniform4fv(0, 1, state.fg.data()); + glUniform1f(1, (GLfloat) glfwGetTime()); + glUniformMatrix4fv(2, 1, false, proj.data()); + glUniformMatrix4fv(3, 1, false, rot.data()); + glUniformMatrix4fv(4, 1, false, view.data()); + glDrawElements(GL_POINTS, elements, GL_UNSIGNED_INT, nullptr); + glBindVertexArray(0); + glUseProgram(0); + + ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); + glfwSwapBuffers(window); + } + + return EXIT_SUCCESS; +} + +int main() { + if (!glfwInit()) { + std::cerr << "GLFW:Failed initialization" << std::endl; + return EXIT_FAILURE; + } + + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + auto *window = glfwCreateWindow(1280, 720, "Cosets Visualization", nullptr, nullptr); + if (!window) { + std::cerr << "GLFW:Failed to create window" << std::endl; + return EXIT_FAILURE; + } + + glfwMakeContextCurrent(window); + glfwSwapInterval(1); + gladLoadGLLoader((GLADloadproc) glfwGetProcAddress); + +#ifndef NDEBUG + glEnable(GL_DEBUG_OUTPUT); + glDebugMessageCallback(log_gl_debug_callback, nullptr); + glDebugMessageControl( + GL_DONT_CARE, GL_DEBUG_TYPE_OTHER, + GL_DEBUG_SEVERITY_NOTIFICATION, + 0, nullptr, GL_FALSE + ); +#endif + + IMGUI_CHECKVERSION(); + auto *context = ImGui::CreateContext(); + ImGui_ImplGlfw_InitForOpenGL(window, true); + ImGui_ImplOpenGL3_Init("#version 130"); + + set_style(); + + int exit_code = EXIT_SUCCESS; + + try { + exit_code = run(window, context); + } catch (const std::exception &e) { + std::cerr << e.what() << std::endl; + exit_code = EXIT_FAILURE; + } + + ImGui_ImplOpenGL3_Shutdown(); + ImGui_ImplGlfw_Shutdown(); + ImGui::DestroyContext(); + + glfwDestroyWindow(window); + glfwTerminate(); + + return exit_code; +} diff --git a/vendor/glad b/vendor/glad deleted file mode 160000 index 5bf3eda..0000000 --- a/vendor/glad +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5bf3eda6da606324999775b88a90ed572202be93 diff --git a/vendor/glfw b/vendor/glfw deleted file mode 160000 index 72c3908..0000000 --- a/vendor/glfw +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 72c3908e1474d0cd72bed9fecb6ff3da022f7200