diff --git a/.gitattributes b/hardware/braille_xr/.gitattributes
similarity index 100%
rename from .gitattributes
rename to hardware/braille_xr/.gitattributes
diff --git a/.gitignore b/hardware/braille_xr/.gitignore
similarity index 100%
rename from .gitignore
rename to hardware/braille_xr/.gitignore
diff --git a/.vscode/arduino.json b/hardware/braille_xr/.vscode/arduino.json
similarity index 100%
rename from .vscode/arduino.json
rename to hardware/braille_xr/.vscode/arduino.json
diff --git a/.vscode/c_cpp_properties.json b/hardware/braille_xr/.vscode/c_cpp_properties.json
similarity index 100%
rename from .vscode/c_cpp_properties.json
rename to hardware/braille_xr/.vscode/c_cpp_properties.json
diff --git a/_wifi_config.h b/hardware/braille_xr/_wifi_config.h
similarity index 100%
rename from _wifi_config.h
rename to hardware/braille_xr/_wifi_config.h
diff --git a/braille_xr.ino b/hardware/braille_xr/braille_xr.ino
similarity index 100%
rename from braille_xr.ino
rename to hardware/braille_xr/braille_xr.ino
diff --git a/debug.cfg b/hardware/braille_xr/debug.cfg
similarity index 100%
rename from debug.cfg
rename to hardware/braille_xr/debug.cfg
diff --git a/debug_custom.json b/hardware/braille_xr/debug_custom.json
similarity index 100%
rename from debug_custom.json
rename to hardware/braille_xr/debug_custom.json
diff --git a/git-workshop.pdf b/hardware/braille_xr/git-workshop.pdf
similarity index 100%
rename from git-workshop.pdf
rename to hardware/braille_xr/git-workshop.pdf
diff --git a/libs/AsyncUDP/examples/AsyncUDPClient/.skip.esp32h2 b/hardware/braille_xr/libs/AsyncUDP/examples/AsyncUDPClient/.skip.esp32h2
similarity index 100%
rename from libs/AsyncUDP/examples/AsyncUDPClient/.skip.esp32h2
rename to hardware/braille_xr/libs/AsyncUDP/examples/AsyncUDPClient/.skip.esp32h2
diff --git a/libs/AsyncUDP/examples/AsyncUDPClient/AsyncUDPClient.ino b/hardware/braille_xr/libs/AsyncUDP/examples/AsyncUDPClient/AsyncUDPClient.ino
similarity index 100%
rename from libs/AsyncUDP/examples/AsyncUDPClient/AsyncUDPClient.ino
rename to hardware/braille_xr/libs/AsyncUDP/examples/AsyncUDPClient/AsyncUDPClient.ino
diff --git a/libs/AsyncUDP/examples/AsyncUDPMulticastServer/.skip.esp32h2 b/hardware/braille_xr/libs/AsyncUDP/examples/AsyncUDPMulticastServer/.skip.esp32h2
similarity index 100%
rename from libs/AsyncUDP/examples/AsyncUDPMulticastServer/.skip.esp32h2
rename to hardware/braille_xr/libs/AsyncUDP/examples/AsyncUDPMulticastServer/.skip.esp32h2
diff --git a/libs/AsyncUDP/examples/AsyncUDPMulticastServer/AsyncUDPMulticastServer.ino b/hardware/braille_xr/libs/AsyncUDP/examples/AsyncUDPMulticastServer/AsyncUDPMulticastServer.ino
similarity index 100%
rename from libs/AsyncUDP/examples/AsyncUDPMulticastServer/AsyncUDPMulticastServer.ino
rename to hardware/braille_xr/libs/AsyncUDP/examples/AsyncUDPMulticastServer/AsyncUDPMulticastServer.ino
diff --git a/libs/AsyncUDP/examples/AsyncUDPServer/.skip.esp32h2 b/hardware/braille_xr/libs/AsyncUDP/examples/AsyncUDPServer/.skip.esp32h2
similarity index 100%
rename from libs/AsyncUDP/examples/AsyncUDPServer/.skip.esp32h2
rename to hardware/braille_xr/libs/AsyncUDP/examples/AsyncUDPServer/.skip.esp32h2
diff --git a/libs/AsyncUDP/examples/AsyncUDPServer/AsyncUDPServer.ino b/hardware/braille_xr/libs/AsyncUDP/examples/AsyncUDPServer/AsyncUDPServer.ino
similarity index 100%
rename from libs/AsyncUDP/examples/AsyncUDPServer/AsyncUDPServer.ino
rename to hardware/braille_xr/libs/AsyncUDP/examples/AsyncUDPServer/AsyncUDPServer.ino
diff --git a/libs/AsyncUDP/keywords.txt b/hardware/braille_xr/libs/AsyncUDP/keywords.txt
similarity index 100%
rename from libs/AsyncUDP/keywords.txt
rename to hardware/braille_xr/libs/AsyncUDP/keywords.txt
diff --git a/libs/AsyncUDP/library.properties b/hardware/braille_xr/libs/AsyncUDP/library.properties
similarity index 100%
rename from libs/AsyncUDP/library.properties
rename to hardware/braille_xr/libs/AsyncUDP/library.properties
diff --git a/libs/AsyncUDP/src/AsyncUDP.cpp b/hardware/braille_xr/libs/AsyncUDP/src/AsyncUDP.cpp
similarity index 100%
rename from libs/AsyncUDP/src/AsyncUDP.cpp
rename to hardware/braille_xr/libs/AsyncUDP/src/AsyncUDP.cpp
diff --git a/libs/AsyncUDP/src/AsyncUDP.h b/hardware/braille_xr/libs/AsyncUDP/src/AsyncUDP.h
similarity index 100%
rename from libs/AsyncUDP/src/AsyncUDP.h
rename to hardware/braille_xr/libs/AsyncUDP/src/AsyncUDP.h
diff --git a/libs/ESP32Servo/AddDoxygenToGHPages.sh b/hardware/braille_xr/libs/ESP32Servo/AddDoxygenToGHPages.sh
similarity index 100%
rename from libs/ESP32Servo/AddDoxygenToGHPages.sh
rename to hardware/braille_xr/libs/ESP32Servo/AddDoxygenToGHPages.sh
diff --git a/libs/ESP32Servo/README.md b/hardware/braille_xr/libs/ESP32Servo/README.md
similarity index 100%
rename from libs/ESP32Servo/README.md
rename to hardware/braille_xr/libs/ESP32Servo/README.md
diff --git a/libs/ESP32Servo/doxy.doxyfile b/hardware/braille_xr/libs/ESP32Servo/doxy.doxyfile
similarity index 100%
rename from libs/ESP32Servo/doxy.doxyfile
rename to hardware/braille_xr/libs/ESP32Servo/doxy.doxyfile
diff --git a/libs/ESP32Servo/examples/Knob/Knob.ino b/hardware/braille_xr/libs/ESP32Servo/examples/Knob/Knob.ino
similarity index 100%
rename from libs/ESP32Servo/examples/Knob/Knob.ino
rename to hardware/braille_xr/libs/ESP32Servo/examples/Knob/Knob.ino
diff --git a/libs/ESP32Servo/examples/Multiple-Servo-Example-Arduino/Multiple-Servo-Example-Arduino.ino b/hardware/braille_xr/libs/ESP32Servo/examples/Multiple-Servo-Example-Arduino/Multiple-Servo-Example-Arduino.ino
similarity index 100%
rename from libs/ESP32Servo/examples/Multiple-Servo-Example-Arduino/Multiple-Servo-Example-Arduino.ino
rename to hardware/braille_xr/libs/ESP32Servo/examples/Multiple-Servo-Example-Arduino/Multiple-Servo-Example-Arduino.ino
diff --git a/libs/ESP32Servo/examples/PWMExample/PWMExample.ino b/hardware/braille_xr/libs/ESP32Servo/examples/PWMExample/PWMExample.ino
similarity index 100%
rename from libs/ESP32Servo/examples/PWMExample/PWMExample.ino
rename to hardware/braille_xr/libs/ESP32Servo/examples/PWMExample/PWMExample.ino
diff --git a/libs/ESP32Servo/examples/Sweep/Sweep.ino b/hardware/braille_xr/libs/ESP32Servo/examples/Sweep/Sweep.ino
similarity index 100%
rename from libs/ESP32Servo/examples/Sweep/Sweep.ino
rename to hardware/braille_xr/libs/ESP32Servo/examples/Sweep/Sweep.ino
diff --git a/libs/ESP32Servo/examples/ToneExample/ToneExample.ino b/hardware/braille_xr/libs/ESP32Servo/examples/ToneExample/ToneExample.ino
similarity index 100%
rename from libs/ESP32Servo/examples/ToneExample/ToneExample.ino
rename to hardware/braille_xr/libs/ESP32Servo/examples/ToneExample/ToneExample.ino
diff --git a/libs/ESP32Servo/examples/analogWriteExample/analogWriteExample.ino b/hardware/braille_xr/libs/ESP32Servo/examples/analogWriteExample/analogWriteExample.ino
similarity index 100%
rename from libs/ESP32Servo/examples/analogWriteExample/analogWriteExample.ino
rename to hardware/braille_xr/libs/ESP32Servo/examples/analogWriteExample/analogWriteExample.ino
diff --git a/libs/ESP32Servo/keywords.txt b/hardware/braille_xr/libs/ESP32Servo/keywords.txt
similarity index 100%
rename from libs/ESP32Servo/keywords.txt
rename to hardware/braille_xr/libs/ESP32Servo/keywords.txt
diff --git a/libs/ESP32Servo/library.properties b/hardware/braille_xr/libs/ESP32Servo/library.properties
similarity index 100%
rename from libs/ESP32Servo/library.properties
rename to hardware/braille_xr/libs/ESP32Servo/library.properties
diff --git a/libs/ESP32Servo/src/ESP32PWM.cpp b/hardware/braille_xr/libs/ESP32Servo/src/ESP32PWM.cpp
similarity index 100%
rename from libs/ESP32Servo/src/ESP32PWM.cpp
rename to hardware/braille_xr/libs/ESP32Servo/src/ESP32PWM.cpp
diff --git a/libs/ESP32Servo/src/ESP32PWM.h b/hardware/braille_xr/libs/ESP32Servo/src/ESP32PWM.h
similarity index 100%
rename from libs/ESP32Servo/src/ESP32PWM.h
rename to hardware/braille_xr/libs/ESP32Servo/src/ESP32PWM.h
diff --git a/libs/ESP32Servo/src/ESP32Servo.cpp b/hardware/braille_xr/libs/ESP32Servo/src/ESP32Servo.cpp
similarity index 100%
rename from libs/ESP32Servo/src/ESP32Servo.cpp
rename to hardware/braille_xr/libs/ESP32Servo/src/ESP32Servo.cpp
diff --git a/libs/ESP32Servo/src/ESP32Servo.h b/hardware/braille_xr/libs/ESP32Servo/src/ESP32Servo.h
similarity index 100%
rename from libs/ESP32Servo/src/ESP32Servo.h
rename to hardware/braille_xr/libs/ESP32Servo/src/ESP32Servo.h
diff --git a/libs/WiFi/examples/FTM/FTM_Initiator/.skip.esp32h2 b/hardware/braille_xr/libs/WiFi/examples/FTM/FTM_Initiator/.skip.esp32h2
similarity index 100%
rename from libs/WiFi/examples/FTM/FTM_Initiator/.skip.esp32h2
rename to hardware/braille_xr/libs/WiFi/examples/FTM/FTM_Initiator/.skip.esp32h2
diff --git a/libs/WiFi/examples/FTM/FTM_Initiator/FTM_Initiator.ino b/hardware/braille_xr/libs/WiFi/examples/FTM/FTM_Initiator/FTM_Initiator.ino
similarity index 100%
rename from libs/WiFi/examples/FTM/FTM_Initiator/FTM_Initiator.ino
rename to hardware/braille_xr/libs/WiFi/examples/FTM/FTM_Initiator/FTM_Initiator.ino
diff --git a/libs/WiFi/examples/FTM/FTM_Initiator/README.md b/hardware/braille_xr/libs/WiFi/examples/FTM/FTM_Initiator/README.md
similarity index 100%
rename from libs/WiFi/examples/FTM/FTM_Initiator/README.md
rename to hardware/braille_xr/libs/WiFi/examples/FTM/FTM_Initiator/README.md
diff --git a/libs/WiFi/examples/FTM/FTM_Responder/.skip.esp32h2 b/hardware/braille_xr/libs/WiFi/examples/FTM/FTM_Responder/.skip.esp32h2
similarity index 100%
rename from libs/WiFi/examples/FTM/FTM_Responder/.skip.esp32h2
rename to hardware/braille_xr/libs/WiFi/examples/FTM/FTM_Responder/.skip.esp32h2
diff --git a/libs/WiFi/examples/FTM/FTM_Responder/FTM_Responder.ino b/hardware/braille_xr/libs/WiFi/examples/FTM/FTM_Responder/FTM_Responder.ino
similarity index 100%
rename from libs/WiFi/examples/FTM/FTM_Responder/FTM_Responder.ino
rename to hardware/braille_xr/libs/WiFi/examples/FTM/FTM_Responder/FTM_Responder.ino
diff --git a/libs/WiFi/examples/FTM/FTM_Responder/README.md b/hardware/braille_xr/libs/WiFi/examples/FTM/FTM_Responder/README.md
similarity index 100%
rename from libs/WiFi/examples/FTM/FTM_Responder/README.md
rename to hardware/braille_xr/libs/WiFi/examples/FTM/FTM_Responder/README.md
diff --git a/libs/WiFi/examples/SimpleWiFiServer/.skip.esp32h2 b/hardware/braille_xr/libs/WiFi/examples/SimpleWiFiServer/.skip.esp32h2
similarity index 100%
rename from libs/WiFi/examples/SimpleWiFiServer/.skip.esp32h2
rename to hardware/braille_xr/libs/WiFi/examples/SimpleWiFiServer/.skip.esp32h2
diff --git a/libs/WiFi/examples/SimpleWiFiServer/SimpleWiFiServer.ino b/hardware/braille_xr/libs/WiFi/examples/SimpleWiFiServer/SimpleWiFiServer.ino
similarity index 100%
rename from libs/WiFi/examples/SimpleWiFiServer/SimpleWiFiServer.ino
rename to hardware/braille_xr/libs/WiFi/examples/SimpleWiFiServer/SimpleWiFiServer.ino
diff --git a/libs/WiFi/examples/WPS/.skip.esp32h2 b/hardware/braille_xr/libs/WiFi/examples/WPS/.skip.esp32h2
similarity index 100%
rename from libs/WiFi/examples/WPS/.skip.esp32h2
rename to hardware/braille_xr/libs/WiFi/examples/WPS/.skip.esp32h2
diff --git a/libs/WiFi/examples/WPS/README.md b/hardware/braille_xr/libs/WiFi/examples/WPS/README.md
similarity index 100%
rename from libs/WiFi/examples/WPS/README.md
rename to hardware/braille_xr/libs/WiFi/examples/WPS/README.md
diff --git a/libs/WiFi/examples/WPS/WPS.ino b/hardware/braille_xr/libs/WiFi/examples/WPS/WPS.ino
similarity index 100%
rename from libs/WiFi/examples/WPS/WPS.ino
rename to hardware/braille_xr/libs/WiFi/examples/WPS/WPS.ino
diff --git a/libs/WiFi/examples/WiFiAccessPoint/.skip.esp32h2 b/hardware/braille_xr/libs/WiFi/examples/WiFiAccessPoint/.skip.esp32h2
similarity index 100%
rename from libs/WiFi/examples/WiFiAccessPoint/.skip.esp32h2
rename to hardware/braille_xr/libs/WiFi/examples/WiFiAccessPoint/.skip.esp32h2
diff --git a/libs/WiFi/examples/WiFiAccessPoint/WiFiAccessPoint.ino b/hardware/braille_xr/libs/WiFi/examples/WiFiAccessPoint/WiFiAccessPoint.ino
similarity index 100%
rename from libs/WiFi/examples/WiFiAccessPoint/WiFiAccessPoint.ino
rename to hardware/braille_xr/libs/WiFi/examples/WiFiAccessPoint/WiFiAccessPoint.ino
diff --git a/libs/WiFi/examples/WiFiBlueToothSwitch/.skip.esp32h2 b/hardware/braille_xr/libs/WiFi/examples/WiFiBlueToothSwitch/.skip.esp32h2
similarity index 100%
rename from libs/WiFi/examples/WiFiBlueToothSwitch/.skip.esp32h2
rename to hardware/braille_xr/libs/WiFi/examples/WiFiBlueToothSwitch/.skip.esp32h2
diff --git a/libs/WiFi/examples/WiFiBlueToothSwitch/.skip.esp32s2 b/hardware/braille_xr/libs/WiFi/examples/WiFiBlueToothSwitch/.skip.esp32s2
similarity index 100%
rename from libs/WiFi/examples/WiFiBlueToothSwitch/.skip.esp32s2
rename to hardware/braille_xr/libs/WiFi/examples/WiFiBlueToothSwitch/.skip.esp32s2
diff --git a/libs/WiFi/examples/WiFiBlueToothSwitch/WiFiBlueToothSwitch.ino b/hardware/braille_xr/libs/WiFi/examples/WiFiBlueToothSwitch/WiFiBlueToothSwitch.ino
similarity index 100%
rename from libs/WiFi/examples/WiFiBlueToothSwitch/WiFiBlueToothSwitch.ino
rename to hardware/braille_xr/libs/WiFi/examples/WiFiBlueToothSwitch/WiFiBlueToothSwitch.ino
diff --git a/libs/WiFi/examples/WiFiClient/.skip.esp32h2 b/hardware/braille_xr/libs/WiFi/examples/WiFiClient/.skip.esp32h2
similarity index 100%
rename from libs/WiFi/examples/WiFiClient/.skip.esp32h2
rename to hardware/braille_xr/libs/WiFi/examples/WiFiClient/.skip.esp32h2
diff --git a/libs/WiFi/examples/WiFiClient/README.md b/hardware/braille_xr/libs/WiFi/examples/WiFiClient/README.md
similarity index 100%
rename from libs/WiFi/examples/WiFiClient/README.md
rename to hardware/braille_xr/libs/WiFi/examples/WiFiClient/README.md
diff --git a/libs/WiFi/examples/WiFiClient/WiFiClient.ino b/hardware/braille_xr/libs/WiFi/examples/WiFiClient/WiFiClient.ino
similarity index 100%
rename from libs/WiFi/examples/WiFiClient/WiFiClient.ino
rename to hardware/braille_xr/libs/WiFi/examples/WiFiClient/WiFiClient.ino
diff --git a/libs/WiFi/examples/WiFiClientBasic/.skip.esp32h2 b/hardware/braille_xr/libs/WiFi/examples/WiFiClientBasic/.skip.esp32h2
similarity index 100%
rename from libs/WiFi/examples/WiFiClientBasic/.skip.esp32h2
rename to hardware/braille_xr/libs/WiFi/examples/WiFiClientBasic/.skip.esp32h2
diff --git a/libs/WiFi/examples/WiFiClientBasic/WiFiClientBasic.ino b/hardware/braille_xr/libs/WiFi/examples/WiFiClientBasic/WiFiClientBasic.ino
similarity index 100%
rename from libs/WiFi/examples/WiFiClientBasic/WiFiClientBasic.ino
rename to hardware/braille_xr/libs/WiFi/examples/WiFiClientBasic/WiFiClientBasic.ino
diff --git a/libs/WiFi/examples/WiFiClientConnect/.skip.esp32h2 b/hardware/braille_xr/libs/WiFi/examples/WiFiClientConnect/.skip.esp32h2
similarity index 100%
rename from libs/WiFi/examples/WiFiClientConnect/.skip.esp32h2
rename to hardware/braille_xr/libs/WiFi/examples/WiFiClientConnect/.skip.esp32h2
diff --git a/libs/WiFi/examples/WiFiClientConnect/README.md b/hardware/braille_xr/libs/WiFi/examples/WiFiClientConnect/README.md
similarity index 100%
rename from libs/WiFi/examples/WiFiClientConnect/README.md
rename to hardware/braille_xr/libs/WiFi/examples/WiFiClientConnect/README.md
diff --git a/libs/WiFi/examples/WiFiClientConnect/WiFiClientConnect.ino b/hardware/braille_xr/libs/WiFi/examples/WiFiClientConnect/WiFiClientConnect.ino
similarity index 100%
rename from libs/WiFi/examples/WiFiClientConnect/WiFiClientConnect.ino
rename to hardware/braille_xr/libs/WiFi/examples/WiFiClientConnect/WiFiClientConnect.ino
diff --git a/libs/WiFi/examples/WiFiClientEnterprise/.skip.esp32h2 b/hardware/braille_xr/libs/WiFi/examples/WiFiClientEnterprise/.skip.esp32h2
similarity index 100%
rename from libs/WiFi/examples/WiFiClientEnterprise/.skip.esp32h2
rename to hardware/braille_xr/libs/WiFi/examples/WiFiClientEnterprise/.skip.esp32h2
diff --git a/libs/WiFi/examples/WiFiClientEnterprise/README.md b/hardware/braille_xr/libs/WiFi/examples/WiFiClientEnterprise/README.md
similarity index 100%
rename from libs/WiFi/examples/WiFiClientEnterprise/README.md
rename to hardware/braille_xr/libs/WiFi/examples/WiFiClientEnterprise/README.md
diff --git a/libs/WiFi/examples/WiFiClientEnterprise/WiFiClientEnterprise.ino b/hardware/braille_xr/libs/WiFi/examples/WiFiClientEnterprise/WiFiClientEnterprise.ino
similarity index 100%
rename from libs/WiFi/examples/WiFiClientEnterprise/WiFiClientEnterprise.ino
rename to hardware/braille_xr/libs/WiFi/examples/WiFiClientEnterprise/WiFiClientEnterprise.ino
diff --git a/libs/WiFi/examples/WiFiClientEvents/.skip.esp32h2 b/hardware/braille_xr/libs/WiFi/examples/WiFiClientEvents/.skip.esp32h2
similarity index 100%
rename from libs/WiFi/examples/WiFiClientEvents/.skip.esp32h2
rename to hardware/braille_xr/libs/WiFi/examples/WiFiClientEvents/.skip.esp32h2
diff --git a/libs/WiFi/examples/WiFiClientEvents/WiFiClientEvents.ino b/hardware/braille_xr/libs/WiFi/examples/WiFiClientEvents/WiFiClientEvents.ino
similarity index 100%
rename from libs/WiFi/examples/WiFiClientEvents/WiFiClientEvents.ino
rename to hardware/braille_xr/libs/WiFi/examples/WiFiClientEvents/WiFiClientEvents.ino
diff --git a/libs/WiFi/examples/WiFiClientStaticIP/.skip.esp32h2 b/hardware/braille_xr/libs/WiFi/examples/WiFiClientStaticIP/.skip.esp32h2
similarity index 100%
rename from libs/WiFi/examples/WiFiClientStaticIP/.skip.esp32h2
rename to hardware/braille_xr/libs/WiFi/examples/WiFiClientStaticIP/.skip.esp32h2
diff --git a/libs/WiFi/examples/WiFiClientStaticIP/WiFiClientStaticIP.ino b/hardware/braille_xr/libs/WiFi/examples/WiFiClientStaticIP/WiFiClientStaticIP.ino
similarity index 100%
rename from libs/WiFi/examples/WiFiClientStaticIP/WiFiClientStaticIP.ino
rename to hardware/braille_xr/libs/WiFi/examples/WiFiClientStaticIP/WiFiClientStaticIP.ino
diff --git a/libs/WiFi/examples/WiFiIPv6/.skip.esp32h2 b/hardware/braille_xr/libs/WiFi/examples/WiFiIPv6/.skip.esp32h2
similarity index 100%
rename from libs/WiFi/examples/WiFiIPv6/.skip.esp32h2
rename to hardware/braille_xr/libs/WiFi/examples/WiFiIPv6/.skip.esp32h2
diff --git a/libs/WiFi/examples/WiFiIPv6/WiFiIPv6.ino b/hardware/braille_xr/libs/WiFi/examples/WiFiIPv6/WiFiIPv6.ino
similarity index 100%
rename from libs/WiFi/examples/WiFiIPv6/WiFiIPv6.ino
rename to hardware/braille_xr/libs/WiFi/examples/WiFiIPv6/WiFiIPv6.ino
diff --git a/libs/WiFi/examples/WiFiMulti/.skip.esp32h2 b/hardware/braille_xr/libs/WiFi/examples/WiFiMulti/.skip.esp32h2
similarity index 100%
rename from libs/WiFi/examples/WiFiMulti/.skip.esp32h2
rename to hardware/braille_xr/libs/WiFi/examples/WiFiMulti/.skip.esp32h2
diff --git a/libs/WiFi/examples/WiFiMulti/WiFiMulti.ino b/hardware/braille_xr/libs/WiFi/examples/WiFiMulti/WiFiMulti.ino
similarity index 100%
rename from libs/WiFi/examples/WiFiMulti/WiFiMulti.ino
rename to hardware/braille_xr/libs/WiFi/examples/WiFiMulti/WiFiMulti.ino
diff --git a/libs/WiFi/examples/WiFiMultiAdvanced/.skip.esp32h2 b/hardware/braille_xr/libs/WiFi/examples/WiFiMultiAdvanced/.skip.esp32h2
similarity index 100%
rename from libs/WiFi/examples/WiFiMultiAdvanced/.skip.esp32h2
rename to hardware/braille_xr/libs/WiFi/examples/WiFiMultiAdvanced/.skip.esp32h2
diff --git a/libs/WiFi/examples/WiFiMultiAdvanced/WiFiMultiAdvanced.ino b/hardware/braille_xr/libs/WiFi/examples/WiFiMultiAdvanced/WiFiMultiAdvanced.ino
similarity index 100%
rename from libs/WiFi/examples/WiFiMultiAdvanced/WiFiMultiAdvanced.ino
rename to hardware/braille_xr/libs/WiFi/examples/WiFiMultiAdvanced/WiFiMultiAdvanced.ino
diff --git a/libs/WiFi/examples/WiFiScan/.skip.esp32h2 b/hardware/braille_xr/libs/WiFi/examples/WiFiScan/.skip.esp32h2
similarity index 100%
rename from libs/WiFi/examples/WiFiScan/.skip.esp32h2
rename to hardware/braille_xr/libs/WiFi/examples/WiFiScan/.skip.esp32h2
diff --git a/libs/WiFi/examples/WiFiScan/README.md b/hardware/braille_xr/libs/WiFi/examples/WiFiScan/README.md
similarity index 100%
rename from libs/WiFi/examples/WiFiScan/README.md
rename to hardware/braille_xr/libs/WiFi/examples/WiFiScan/README.md
diff --git a/libs/WiFi/examples/WiFiScan/WiFiScan.ino b/hardware/braille_xr/libs/WiFi/examples/WiFiScan/WiFiScan.ino
similarity index 100%
rename from libs/WiFi/examples/WiFiScan/WiFiScan.ino
rename to hardware/braille_xr/libs/WiFi/examples/WiFiScan/WiFiScan.ino
diff --git a/libs/WiFi/examples/WiFiScanAsync/.skip.esp32h2 b/hardware/braille_xr/libs/WiFi/examples/WiFiScanAsync/.skip.esp32h2
similarity index 100%
rename from libs/WiFi/examples/WiFiScanAsync/.skip.esp32h2
rename to hardware/braille_xr/libs/WiFi/examples/WiFiScanAsync/.skip.esp32h2
diff --git a/libs/WiFi/examples/WiFiScanAsync/README.md b/hardware/braille_xr/libs/WiFi/examples/WiFiScanAsync/README.md
similarity index 100%
rename from libs/WiFi/examples/WiFiScanAsync/README.md
rename to hardware/braille_xr/libs/WiFi/examples/WiFiScanAsync/README.md
diff --git a/libs/WiFi/examples/WiFiScanAsync/WiFiScanAsync.ino b/hardware/braille_xr/libs/WiFi/examples/WiFiScanAsync/WiFiScanAsync.ino
similarity index 100%
rename from libs/WiFi/examples/WiFiScanAsync/WiFiScanAsync.ino
rename to hardware/braille_xr/libs/WiFi/examples/WiFiScanAsync/WiFiScanAsync.ino
diff --git a/libs/WiFi/examples/WiFiScanDualAntenna/.skip.esp32h2 b/hardware/braille_xr/libs/WiFi/examples/WiFiScanDualAntenna/.skip.esp32h2
similarity index 100%
rename from libs/WiFi/examples/WiFiScanDualAntenna/.skip.esp32h2
rename to hardware/braille_xr/libs/WiFi/examples/WiFiScanDualAntenna/.skip.esp32h2
diff --git a/libs/WiFi/examples/WiFiScanDualAntenna/README.md b/hardware/braille_xr/libs/WiFi/examples/WiFiScanDualAntenna/README.md
similarity index 100%
rename from libs/WiFi/examples/WiFiScanDualAntenna/README.md
rename to hardware/braille_xr/libs/WiFi/examples/WiFiScanDualAntenna/README.md
diff --git a/libs/WiFi/examples/WiFiScanDualAntenna/WiFiScanDualAntenna.ino b/hardware/braille_xr/libs/WiFi/examples/WiFiScanDualAntenna/WiFiScanDualAntenna.ino
similarity index 100%
rename from libs/WiFi/examples/WiFiScanDualAntenna/WiFiScanDualAntenna.ino
rename to hardware/braille_xr/libs/WiFi/examples/WiFiScanDualAntenna/WiFiScanDualAntenna.ino
diff --git a/libs/WiFi/examples/WiFiSmartConfig/.skip.esp32h2 b/hardware/braille_xr/libs/WiFi/examples/WiFiSmartConfig/.skip.esp32h2
similarity index 100%
rename from libs/WiFi/examples/WiFiSmartConfig/.skip.esp32h2
rename to hardware/braille_xr/libs/WiFi/examples/WiFiSmartConfig/.skip.esp32h2
diff --git a/libs/WiFi/examples/WiFiSmartConfig/WiFiSmartConfig.ino b/hardware/braille_xr/libs/WiFi/examples/WiFiSmartConfig/WiFiSmartConfig.ino
similarity index 100%
rename from libs/WiFi/examples/WiFiSmartConfig/WiFiSmartConfig.ino
rename to hardware/braille_xr/libs/WiFi/examples/WiFiSmartConfig/WiFiSmartConfig.ino
diff --git a/libs/WiFi/examples/WiFiTelnetToSerial/.skip.esp32h2 b/hardware/braille_xr/libs/WiFi/examples/WiFiTelnetToSerial/.skip.esp32h2
similarity index 100%
rename from libs/WiFi/examples/WiFiTelnetToSerial/.skip.esp32h2
rename to hardware/braille_xr/libs/WiFi/examples/WiFiTelnetToSerial/.skip.esp32h2
diff --git a/libs/WiFi/examples/WiFiTelnetToSerial/WiFiTelnetToSerial.ino b/hardware/braille_xr/libs/WiFi/examples/WiFiTelnetToSerial/WiFiTelnetToSerial.ino
similarity index 100%
rename from libs/WiFi/examples/WiFiTelnetToSerial/WiFiTelnetToSerial.ino
rename to hardware/braille_xr/libs/WiFi/examples/WiFiTelnetToSerial/WiFiTelnetToSerial.ino
diff --git a/libs/WiFi/examples/WiFiUDPClient/.skip.esp32h2 b/hardware/braille_xr/libs/WiFi/examples/WiFiUDPClient/.skip.esp32h2
similarity index 100%
rename from libs/WiFi/examples/WiFiUDPClient/.skip.esp32h2
rename to hardware/braille_xr/libs/WiFi/examples/WiFiUDPClient/.skip.esp32h2
diff --git a/libs/WiFi/examples/WiFiUDPClient/WiFiUDPClient.ino b/hardware/braille_xr/libs/WiFi/examples/WiFiUDPClient/WiFiUDPClient.ino
similarity index 100%
rename from libs/WiFi/examples/WiFiUDPClient/WiFiUDPClient.ino
rename to hardware/braille_xr/libs/WiFi/examples/WiFiUDPClient/WiFiUDPClient.ino
diff --git a/libs/WiFi/examples/WiFiUDPClient/udp_server.py b/hardware/braille_xr/libs/WiFi/examples/WiFiUDPClient/udp_server.py
similarity index 100%
rename from libs/WiFi/examples/WiFiUDPClient/udp_server.py
rename to hardware/braille_xr/libs/WiFi/examples/WiFiUDPClient/udp_server.py
diff --git a/libs/WiFi/examples/WiFiUDPClient/udp_server.rb b/hardware/braille_xr/libs/WiFi/examples/WiFiUDPClient/udp_server.rb
similarity index 100%
rename from libs/WiFi/examples/WiFiUDPClient/udp_server.rb
rename to hardware/braille_xr/libs/WiFi/examples/WiFiUDPClient/udp_server.rb
diff --git a/libs/WiFi/keywords.txt b/hardware/braille_xr/libs/WiFi/keywords.txt
similarity index 100%
rename from libs/WiFi/keywords.txt
rename to hardware/braille_xr/libs/WiFi/keywords.txt
diff --git a/libs/WiFi/library.properties b/hardware/braille_xr/libs/WiFi/library.properties
similarity index 100%
rename from libs/WiFi/library.properties
rename to hardware/braille_xr/libs/WiFi/library.properties
diff --git a/libs/WiFi/src/WiFi.cpp b/hardware/braille_xr/libs/WiFi/src/WiFi.cpp
similarity index 100%
rename from libs/WiFi/src/WiFi.cpp
rename to hardware/braille_xr/libs/WiFi/src/WiFi.cpp
diff --git a/libs/WiFi/src/WiFi.h b/hardware/braille_xr/libs/WiFi/src/WiFi.h
similarity index 100%
rename from libs/WiFi/src/WiFi.h
rename to hardware/braille_xr/libs/WiFi/src/WiFi.h
diff --git a/libs/WiFi/src/WiFiAP.cpp b/hardware/braille_xr/libs/WiFi/src/WiFiAP.cpp
similarity index 100%
rename from libs/WiFi/src/WiFiAP.cpp
rename to hardware/braille_xr/libs/WiFi/src/WiFiAP.cpp
diff --git a/libs/WiFi/src/WiFiAP.h b/hardware/braille_xr/libs/WiFi/src/WiFiAP.h
similarity index 100%
rename from libs/WiFi/src/WiFiAP.h
rename to hardware/braille_xr/libs/WiFi/src/WiFiAP.h
diff --git a/libs/WiFi/src/WiFiClient.cpp b/hardware/braille_xr/libs/WiFi/src/WiFiClient.cpp
similarity index 100%
rename from libs/WiFi/src/WiFiClient.cpp
rename to hardware/braille_xr/libs/WiFi/src/WiFiClient.cpp
diff --git a/libs/WiFi/src/WiFiClient.h b/hardware/braille_xr/libs/WiFi/src/WiFiClient.h
similarity index 100%
rename from libs/WiFi/src/WiFiClient.h
rename to hardware/braille_xr/libs/WiFi/src/WiFiClient.h
diff --git a/libs/WiFi/src/WiFiGeneric.cpp b/hardware/braille_xr/libs/WiFi/src/WiFiGeneric.cpp
similarity index 100%
rename from libs/WiFi/src/WiFiGeneric.cpp
rename to hardware/braille_xr/libs/WiFi/src/WiFiGeneric.cpp
diff --git a/libs/WiFi/src/WiFiGeneric.h b/hardware/braille_xr/libs/WiFi/src/WiFiGeneric.h
similarity index 100%
rename from libs/WiFi/src/WiFiGeneric.h
rename to hardware/braille_xr/libs/WiFi/src/WiFiGeneric.h
diff --git a/libs/WiFi/src/WiFiMulti.cpp b/hardware/braille_xr/libs/WiFi/src/WiFiMulti.cpp
similarity index 100%
rename from libs/WiFi/src/WiFiMulti.cpp
rename to hardware/braille_xr/libs/WiFi/src/WiFiMulti.cpp
diff --git a/libs/WiFi/src/WiFiMulti.h b/hardware/braille_xr/libs/WiFi/src/WiFiMulti.h
similarity index 100%
rename from libs/WiFi/src/WiFiMulti.h
rename to hardware/braille_xr/libs/WiFi/src/WiFiMulti.h
diff --git a/libs/WiFi/src/WiFiSTA.cpp b/hardware/braille_xr/libs/WiFi/src/WiFiSTA.cpp
similarity index 100%
rename from libs/WiFi/src/WiFiSTA.cpp
rename to hardware/braille_xr/libs/WiFi/src/WiFiSTA.cpp
diff --git a/libs/WiFi/src/WiFiSTA.h b/hardware/braille_xr/libs/WiFi/src/WiFiSTA.h
similarity index 100%
rename from libs/WiFi/src/WiFiSTA.h
rename to hardware/braille_xr/libs/WiFi/src/WiFiSTA.h
diff --git a/libs/WiFi/src/WiFiScan.cpp b/hardware/braille_xr/libs/WiFi/src/WiFiScan.cpp
similarity index 100%
rename from libs/WiFi/src/WiFiScan.cpp
rename to hardware/braille_xr/libs/WiFi/src/WiFiScan.cpp
diff --git a/libs/WiFi/src/WiFiScan.h b/hardware/braille_xr/libs/WiFi/src/WiFiScan.h
similarity index 100%
rename from libs/WiFi/src/WiFiScan.h
rename to hardware/braille_xr/libs/WiFi/src/WiFiScan.h
diff --git a/libs/WiFi/src/WiFiServer.cpp b/hardware/braille_xr/libs/WiFi/src/WiFiServer.cpp
similarity index 100%
rename from libs/WiFi/src/WiFiServer.cpp
rename to hardware/braille_xr/libs/WiFi/src/WiFiServer.cpp
diff --git a/libs/WiFi/src/WiFiServer.h b/hardware/braille_xr/libs/WiFi/src/WiFiServer.h
similarity index 100%
rename from libs/WiFi/src/WiFiServer.h
rename to hardware/braille_xr/libs/WiFi/src/WiFiServer.h
diff --git a/libs/WiFi/src/WiFiType.h b/hardware/braille_xr/libs/WiFi/src/WiFiType.h
similarity index 100%
rename from libs/WiFi/src/WiFiType.h
rename to hardware/braille_xr/libs/WiFi/src/WiFiType.h
diff --git a/libs/WiFi/src/WiFiUdp.cpp b/hardware/braille_xr/libs/WiFi/src/WiFiUdp.cpp
similarity index 100%
rename from libs/WiFi/src/WiFiUdp.cpp
rename to hardware/braille_xr/libs/WiFi/src/WiFiUdp.cpp
diff --git a/libs/WiFi/src/WiFiUdp.h b/hardware/braille_xr/libs/WiFi/src/WiFiUdp.h
similarity index 100%
rename from libs/WiFi/src/WiFiUdp.h
rename to hardware/braille_xr/libs/WiFi/src/WiFiUdp.h
diff --git a/sk_demo/.gitignore b/sk_demo/.gitignore
new file mode 100644
index 0000000..0fc8209
--- /dev/null
+++ b/sk_demo/.gitignore
@@ -0,0 +1,484 @@
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+##
+## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
+
+# User-specific files
+*.rsuser
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# User-specific files (MonoDevelop/Xamarin Studio)
+*.userprefs
+
+# Mono auto generated files
+mono_crash.*
+
+# Build results
+[Dd]ebug/
+[Dd]ebugPublic/
+[Rr]elease/
+[Rr]eleases/
+x64/
+x86/
+[Ww][Ii][Nn]32/
+[Aa][Rr][Mm]/
+[Aa][Rr][Mm]64/
+bld/
+[Bb]in/
+[Oo]bj/
+[Ll]og/
+[Ll]ogs/
+
+# Visual Studio 2015/2017 cache/options directory
+.vs/
+.vscode
+# Uncomment if you have tasks that create the project's static files in wwwroot
+#wwwroot/
+
+# Visual Studio 2017 auto generated files
+Generated\ Files/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+# NUnit
+*.VisualState.xml
+TestResult.xml
+nunit-*.xml
+
+# Build Results of an ATL Project
+[Dd]ebugPS/
+[Rr]eleasePS/
+dlldata.c
+
+# Benchmark Results
+BenchmarkDotNet.Artifacts/
+
+# .NET
+project.lock.json
+project.fragment.lock.json
+artifacts/
+
+# Tye
+.tye/
+
+# ASP.NET Scaffolding
+ScaffoldingReadMe.txt
+
+# StyleCop
+StyleCopReport.xml
+
+# Files built by Visual Studio
+*_i.c
+*_p.c
+*_h.h
+*.ilk
+*.meta
+*.obj
+*.iobj
+*.pch
+*.pdb
+*.ipdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*_wpftmp.csproj
+*.log
+*.tlog
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+# Chutzpah Test files
+_Chutzpah*
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opendb
+*.opensdf
+*.sdf
+*.cachefile
+*.VC.db
+*.VC.VC.opendb
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+*.sap
+
+# Visual Studio Trace Files
+*.e2e
+
+# TFS 2012 Local Workspace
+$tf/
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+*.DotSettings.user
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# AxoCover is a Code Coverage Tool
+.axoCover/*
+!.axoCover/settings.json
+
+# Coverlet is a free, cross platform Code Coverage Tool
+coverage*.json
+coverage*.xml
+coverage*.info
+
+# Visual Studio code coverage results
+*.coverage
+*.coveragexml
+
+# NCrunch
+_NCrunch_*
+.*crunch*.local.xml
+nCrunchTemp_*
+
+# MightyMoose
+*.mm.*
+AutoTest.Net/
+
+# Web workbench (sass)
+.sass-cache/
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.[Pp]ublish.xml
+*.azurePubxml
+# Note: Comment the next line if you want to checkin your web deploy settings,
+# but database connection strings (with potential passwords) will be unencrypted
+*.pubxml
+*.publishproj
+
+# Microsoft Azure Web App publish settings. Comment the next line if you want to
+# checkin your Azure Web App publish settings, but sensitive information contained
+# in these scripts will be unencrypted
+PublishScripts/
+
+# NuGet Packages
+*.nupkg
+# NuGet Symbol Packages
+*.snupkg
+# The packages folder can be ignored because of Package Restore
+**/[Pp]ackages/*
+# except build/, which is used as an MSBuild target.
+!**/[Pp]ackages/build/
+# Uncomment if necessary however generally it will be regenerated when needed
+#!**/[Pp]ackages/repositories.config
+# NuGet v3's project.json files produces more ignorable files
+*.nuget.props
+*.nuget.targets
+
+# Microsoft Azure Build Output
+csx/
+*.build.csdef
+
+# Microsoft Azure Emulator
+ecf/
+rcf/
+
+# Windows Store app package directories and files
+AppPackages/
+BundleArtifacts/
+Package.StoreAssociation.xml
+_pkginfo.txt
+*.appx
+*.appxbundle
+*.appxupload
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!?*.[Cc]ache/
+
+# Others
+ClientBin/
+~$*
+*~
+*.dbmdl
+*.dbproj.schemaview
+*.jfm
+*.pfx
+*.publishsettings
+orleans.codegen.cs
+
+# Including strong name files can present a security risk
+# (https://github.com/github/gitignore/pull/2483#issue-259490424)
+#*.snk
+
+# Since there are multiple workflows, uncomment next line to ignore bower_components
+# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
+#bower_components/
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file
+# to a newer Visual Studio version. Backup files are not needed,
+# because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+ServiceFabricBackup/
+*.rptproj.bak
+
+# SQL Server files
+*.mdf
+*.ldf
+*.ndf
+
+# Business Intelligence projects
+*.rdl.data
+*.bim.layout
+*.bim_*.settings
+*.rptproj.rsuser
+*- [Bb]ackup.rdl
+*- [Bb]ackup ([0-9]).rdl
+*- [Bb]ackup ([0-9][0-9]).rdl
+
+# Microsoft Fakes
+FakesAssemblies/
+
+# GhostDoc plugin setting file
+*.GhostDoc.xml
+
+# Node.js Tools for Visual Studio
+.ntvs_analysis.dat
+node_modules/
+
+# Visual Studio 6 build log
+*.plg
+
+# Visual Studio 6 workspace options file
+*.opt
+
+# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
+*.vbw
+
+# Visual Studio 6 auto-generated project file (contains which files were open etc.)
+*.vbp
+
+# Visual Studio 6 workspace and project file (working project files containing files to include in project)
+*.dsw
+*.dsp
+
+# Visual Studio 6 technical files
+*.ncb
+*.aps
+
+# Visual Studio LightSwitch build output
+**/*.HTMLClient/GeneratedArtifacts
+**/*.DesktopClient/GeneratedArtifacts
+**/*.DesktopClient/ModelManifest.xml
+**/*.Server/GeneratedArtifacts
+**/*.Server/ModelManifest.xml
+_Pvt_Extensions
+
+# Paket dependency manager
+.paket/paket.exe
+paket-files/
+
+# FAKE - F# Make
+.fake/
+
+# CodeRush personal settings
+.cr/personal
+
+# Python Tools for Visual Studio (PTVS)
+__pycache__/
+*.pyc
+
+# Cake - Uncomment if you are using it
+# tools/**
+# !tools/packages.config
+
+# Tabs Studio
+*.tss
+
+# Telerik's JustMock configuration file
+*.jmconfig
+
+# BizTalk build output
+*.btp.cs
+*.btm.cs
+*.odx.cs
+*.xsd.cs
+
+# OpenCover UI analysis results
+OpenCover/
+
+# Azure Stream Analytics local run output
+ASALocalRun/
+
+# MSBuild Binary and Structured Log
+*.binlog
+
+# NVidia Nsight GPU debugger configuration file
+*.nvuser
+
+# MFractors (Xamarin productivity tool) working folder
+.mfractor/
+
+# Local History for Visual Studio
+.localhistory/
+
+# Visual Studio History (VSHistory) files
+.vshistory/
+
+# BeatPulse healthcheck temp database
+healthchecksdb
+
+# Backup folder for Package Reference Convert tool in Visual Studio 2017
+MigrationBackup/
+
+# Ionide (cross platform F# VS Code tools) working folder
+.ionide/
+
+# Fody - auto-generated XML schema
+FodyWeavers.xsd
+
+# VS Code files for those working on multiple tools
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+*.code-workspace
+
+# Local History for Visual Studio Code
+.history/
+
+# Windows Installer files from build outputs
+*.cab
+*.msi
+*.msix
+*.msm
+*.msp
+
+# JetBrains Rider
+*.sln.iml
+
+##
+## Visual studio for Mac
+##
+
+
+# globs
+Makefile.in
+*.userprefs
+*.usertasks
+config.make
+config.status
+aclocal.m4
+install-sh
+autom4te.cache/
+*.tar.gz
+tarballs/
+test-results/
+
+# Mac bundle stuff
+*.dmg
+*.app
+
+# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore
+# General
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore
+# Windows thumbnail cache files
+Thumbs.db
+ehthumbs.db
+ehthumbs_vista.db
+
+# Dump file
+*.stackdump
+
+# Folder config file
+[Dd]esktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msix
+*.msm
+*.msp
+
+# Windows shortcuts
+*.lnk
+
+bin/
+obj/
+.vscode/
+
+tracker_log.txt
\ No newline at end of file
diff --git a/sk_demo/dofbox.csproj b/sk_demo/dofbox.csproj
new file mode 100644
index 0000000..bf07b5d
--- /dev/null
+++ b/sk_demo/dofbox.csproj
@@ -0,0 +1,23 @@
+
+
+
+ Exe
+ net8
+ enable
+ enable
+
+ res
+ res
+
+ true
+
+
+
+
+
+
+ PreserveNewest
+
+
+
+
diff --git a/sk_demo/dofbox.sln b/sk_demo/dofbox.sln
new file mode 100644
index 0000000..23a2b1f
--- /dev/null
+++ b/sk_demo/dofbox.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.5.002.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dofbox", "dofbox.csproj", "{FFC00048-7289-4D14-A409-ECCC8EBABD94}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {FFC00048-7289-4D14-A409-ECCC8EBABD94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FFC00048-7289-4D14-A409-ECCC8EBABD94}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FFC00048-7289-4D14-A409-ECCC8EBABD94}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FFC00048-7289-4D14-A409-ECCC8EBABD94}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {EDD834D9-A059-4CA7-B670-43DC10BDA6FD}
+ EndGlobalSection
+EndGlobal
diff --git a/sk_demo/raw/room.blend b/sk_demo/raw/room.blend
new file mode 100644
index 0000000..2657084
Binary files /dev/null and b/sk_demo/raw/room.blend differ
diff --git a/sk_demo/raw/room.blend1 b/sk_demo/raw/room.blend1
new file mode 100644
index 0000000..34bed81
Binary files /dev/null and b/sk_demo/raw/room.blend1 differ
diff --git a/sk_demo/readme.md b/sk_demo/readme.md
new file mode 100644
index 0000000..19a4e14
--- /dev/null
+++ b/sk_demo/readme.md
@@ -0,0 +1,33 @@
+
+
+https://github.com/spatialfree/dofbox/assets/49330364/3470d708-eded-4872-926b-24cfef3e51e0
+
+```shell
+cls && dotnet run --dev
+
+
+# debug publish
+dotnet publish -r win-x64 --no-self-contained
+cd bin/Debug/net7/win-x64/publish
+delete old zip
+compress all files in folder to oriel.zip
+go to the steamworks http portal and upload the zip and set it live
+```
+
+loc :
+IGame.cs : 6
+Mat.cs : 49
+Mono.cs : 94
+Rig.cs : 33
+SKs.cs : 81
+silo/Mono.cs : 60
+snek/Mono.cs : 52
+spes/Mono.cs : 64
+= src/ : 439
+
+fireball.hlsl : 57
+mono.hlsl : 75
+unlit.hlsl : 47
+= res/shaders/ : 179
+
+= total : 618
\ No newline at end of file
diff --git a/sk_demo/res/LDR_RGB1_0.png b/sk_demo/res/LDR_RGB1_0.png
new file mode 100644
index 0000000..973c6e7
Binary files /dev/null and b/sk_demo/res/LDR_RGB1_0.png differ
diff --git a/sk_demo/res/bake.png b/sk_demo/res/bake.png
new file mode 100644
index 0000000..006becf
Binary files /dev/null and b/sk_demo/res/bake.png differ
diff --git a/sk_demo/res/room.glb b/sk_demo/res/room.glb
new file mode 100644
index 0000000..7485d4b
Binary files /dev/null and b/sk_demo/res/room.glb differ
diff --git a/sk_demo/res/shaders/dofdev.hlsli b/sk_demo/res/shaders/dofdev.hlsli
new file mode 100644
index 0000000..7b8ef2e
--- /dev/null
+++ b/sk_demo/res/shaders/dofdev.hlsli
@@ -0,0 +1,82 @@
+#ifndef _DOFDEV_HLSLI
+#define _DOFDEV_HLSLI
+
+float sum(float4 v) { // *used in firball.hlsl
+ return dot(v, float4(1,1,1,1));
+}
+
+// color space conversions
+float4 gamma_linear(float4 gamma_col) {
+ return float4(pow(gamma_col.rgb, 0.454545), gamma_col.a);
+}
+float4 linear_gamma(float4 linear_col) {
+ return float4(pow(linear_col.rgb, 2.2), linear_col.a);
+}
+
+struct psOut {
+ float4 color : SV_TARGET;
+ float depth : SV_Depth;
+};
+
+// oriel
+struct oriel_data {
+ float4x4 m4;
+ float4x4 m4_inv;
+ float3 size;
+ float pad;
+};
+cbuffer oriel_buffer : register(b3) {
+ oriel_data oriels[455]; // UINT16_MAX(65535) / sizeof(oriel 144) = 455
+};
+
+float2 face_dist(oriel_data oriel, float3 cam_pos, float3 dir) {
+ float3 box = oriel.size / 2.0;
+ float3 boxMin = -box;
+ float3 boxMax = box;
+
+ float3 tMin = (boxMin - cam_pos) / dir;
+ float3 tMax = (boxMax - cam_pos) / dir;
+ float3 t1 = min(tMin, tMax);
+ float3 t2 = max(tMin, tMax);
+ float tNear = max(max(t1.x, t1.y), t1.z);
+ float tFar = min(min(t2.x, t2.y), t2.z);
+ return float2(tNear, tFar);
+};
+
+float oriel(int id, float depth, int view_id, float3 world_pos) {
+ if (id == -1) return depth; // optimal?
+
+ oriel_data oriel = oriels[id];
+
+ float3 cam_pos = sk_camera_pos[view_id].xyz;
+ cam_pos = mul(float4(cam_pos, 1), oriel.m4).xyz;
+ world_pos = mul(float4(world_pos, 1), oriel.m4).xyz;
+
+ float3 dir = normalize(world_pos - cam_pos);
+ float2 faces = face_dist(oriel, cam_pos, dir);
+ clip(faces.y - faces.x); // no intersection
+
+ // is a distance call cheaper than just transforming the input depth?
+ float dist = distance(cam_pos, world_pos);
+ clip(dist - faces.x); // near clip
+
+ // far depth *flatten
+ float pad = 0.01; // 1cm ?
+ if (dist > faces.y) {
+ float bleed = (dist - faces.y) / (100.0 - faces.y);
+ dist = faces.y + (bleed * pad);
+ }
+ // gotta be a better way to do this than having two matrices...
+ float3 new_pos = mul(float4(cam_pos + (dir * dist), 1), oriel.m4_inv).xyz;
+ float4 og = mul(float4(new_pos, 1), sk_viewproj[view_id]);
+ depth = (og * rcp(og.w)).z;
+
+ return depth;
+}
+
+// !!!
+// for the build process to include new changes:
+// you need to edit another shader that uses it
+
+
+#endif
\ No newline at end of file
diff --git a/sk_demo/res/shaders/fireball.hlsl b/sk_demo/res/shaders/fireball.hlsl
new file mode 100644
index 0000000..722d140
--- /dev/null
+++ b/sk_demo/res/shaders/fireball.hlsl
@@ -0,0 +1,65 @@
+#include "stereokit.hlsli"
+#include "dofdev.hlsli"
+
+//--name = dofdev/fireball
+
+//--oriel_id = -1
+//--tex_scale = 1
+//--diffuse = white
+
+int oriel_id;
+
+float tex_scale;
+Texture2D diffuse : register(t0);
+SamplerState diffuse_s : register(s0);
+
+struct vsIn {
+ float4 pos : SV_Position;
+ float3 norm : NORMAL0;
+ float2 uv : TEXCOORD0;
+ float4 col : COLOR0;
+};
+struct psIn {
+ float4 pos : SV_Position;
+ float3 norm : NORMAL0;
+ float2 uv : TEXCOORD0;
+ float4 world : WORLD;
+ float4 color : COLOR0;
+ float3 campos : TEXCOORD1;
+ uint view_id : SV_RenderTargetArrayIndex;
+};
+
+psIn vs(vsIn input, uint id : SV_InstanceID) {
+ psIn o;
+ o.view_id = id % sk_view_count;
+ id = id / sk_view_count;
+
+ o.campos = sk_camera_pos[o.view_id].xyz;
+
+ float squish = sin(
+ (sk_time * 3.14) + (
+ sum(float4(input.norm, 1))
+ ) * 24
+ );
+ input.pos.xyz *= 1 - squish * 0.1;
+ o.world = mul(input.pos, sk_inst[id].world);
+ o.pos = mul(o.world, sk_viewproj[o.view_id]);
+
+ o.norm = normalize(mul(input.norm, (float3x3)sk_inst[id].world));
+
+ o.uv = input.uv * tex_scale;
+ o.color = input.col * sk_inst[id].color;
+ o.color.rgb *= sk_lighting(o.norm);
+ return o;
+}
+
+psOut ps(psIn input) {
+ psOut o;
+
+ o.depth = oriel(oriel_id, input.pos.z, input.view_id, input.world.xyz);
+ o.color = input.color;
+
+ return o;
+ // float4 noise = diffuse.Sample(diffuse_s, input.uv);
+ // return noise;
+}
\ No newline at end of file
diff --git a/sk_demo/res/shaders/mono.hlsl b/sk_demo/res/shaders/mono.hlsl
new file mode 100644
index 0000000..c2f863f
--- /dev/null
+++ b/sk_demo/res/shaders/mono.hlsl
@@ -0,0 +1,78 @@
+#include "stereokit.hlsli"
+#include "dofdev.hlsli"
+
+//--name = dofdev/mono
+
+//--oriel_id = -1
+//--diffuse = white
+
+int oriel_id;
+
+Texture2D diffuse : register(t0);
+SamplerState diffuse_s : register(s0);
+
+struct vsIn {
+ float4 pos : SV_Position;
+ float3 norm : NORMAL0;
+ float2 uv : TEXCOORD0;
+ float4 col : COLOR0;
+};
+struct psIn {
+ float4 pos : SV_Position;
+ float3 norm : NORMAL0;
+ float2 uv : TEXCOORD0;
+ float4 world : WORLD;
+ float4 color : COLOR0;
+ uint view_id : SV_RenderTargetArrayIndex;
+};
+
+psIn vs(vsIn input, uint id : SV_InstanceID) {
+ psIn o;
+ o.view_id = id % sk_view_count;
+ id = id / sk_view_count;
+
+ o.world = mul(input.pos, sk_inst[id].world);
+ o.pos = mul(o.world, sk_viewproj[o.view_id]);
+
+ o.norm = normalize(mul(input.norm, (float3x3)sk_inst[id].world));
+
+ o.uv = input.uv;
+ o.color = input.col;
+ o.color *= linear_gamma(sk_inst[id].color);
+ // o.color.rgb *= Lighting(o.norm);
+ return o;
+}
+
+psOut ps(psIn input) {
+ psOut o;
+
+ o.depth = oriel(oriel_id, input.pos.z, input.view_id, input.world.xyz);
+ o.color = input.color * diffuse.Sample(diffuse_s, input.uv);
+
+
+ float test = 1 - (o.depth * 0.5 + 0.5);
+
+ return o;
+
+
+ // // clip(input.world.y);
+ // col = col * input.color;
+
+
+ // if (input.world.y < 0) {
+ // col.r = col.r * 0.0;
+ // col.g = col.g * 0.0;
+ // col.b = col.b * 0.3;
+
+ // col.rgb *= 0.1;
+ // }
+
+ // // dist magnitude from center X0Z
+ // float dist = max(1 - (length(input.world.xz) / 10.0), 0.0);
+ // float4 color = lerp(clearcolor, col, 1 - ((1 - dist) * (1 - dist)));
+
+ // // float glow = FingerGlow(input.world.xyz, input.norm);
+ // // color.rgb += glow * 0.5;
+
+ // return color;
+}
\ No newline at end of file
diff --git a/sk_demo/res/shaders/room.hlsl b/sk_demo/res/shaders/room.hlsl
new file mode 100644
index 0000000..2fd3d25
--- /dev/null
+++ b/sk_demo/res/shaders/room.hlsl
@@ -0,0 +1,40 @@
+#include "stereokit.hlsli"
+#include "dofdev.hlsli"
+
+//--name = dofdev/room
+
+//--diffuse = white
+
+Texture2D diffuse : register(t0);
+SamplerState diffuse_s : register(s0);
+
+struct vsIn {
+ float4 pos : SV_Position;
+ float3 norm : NORMAL0;
+ float2 uv : TEXCOORD0;
+};
+struct psIn {
+ float4 pos : SV_Position;
+ float3 norm : NORMAL0;
+ float2 uv : TEXCOORD0;
+ float4 world : WORLD;
+ uint view_id : SV_RenderTargetArrayIndex;
+};
+
+psIn vs(vsIn input, uint id : SV_InstanceID) {
+ psIn o;
+ o.view_id = id % sk_view_count;
+ id = id / sk_view_count;
+
+ o.world = mul(input.pos, sk_inst[id].world);
+ o.pos = mul(o.world, sk_viewproj[o.view_id]);
+
+ o.norm = normalize(mul(input.norm, (float3x3)sk_inst[id].world));
+
+ o.uv = input.uv;
+ return o;
+}
+
+float4 ps(psIn input) : SV_Target {
+ return diffuse.Sample(diffuse_s, input.uv);
+}
\ No newline at end of file
diff --git a/sk_demo/res/shaders/sky.hlsl b/sk_demo/res/shaders/sky.hlsl
new file mode 100644
index 0000000..37c2362
--- /dev/null
+++ b/sk_demo/res/shaders/sky.hlsl
@@ -0,0 +1,57 @@
+#include "stereokit.hlsli"
+#include "dofdev.hlsli"
+
+//--name = dofdev/sky
+
+//--oriel_id = -1
+//--diffuse = white
+
+int oriel_id;
+
+Texture2D diffuse : register(t0);
+SamplerState diffuse_s : register(s0);
+
+struct vsIn {
+ float4 pos : SV_Position;
+ float3 norm : NORMAL0;
+ float2 uv : TEXCOORD0;
+ float4 col : COLOR0;
+};
+struct psIn {
+ float4 pos : SV_Position;
+ float3 norm : NORMAL0;
+ float2 uv : TEXCOORD0;
+ float4 world : WORLD;
+ float4 color : COLOR0;
+ uint view_id : SV_RenderTargetArrayIndex;
+};
+
+psIn vs(vsIn input, uint id : SV_InstanceID) {
+ psIn o;
+ o.view_id = id % sk_view_count;
+ id = id / sk_view_count;
+
+ o.world = mul(input.pos, sk_inst[id].world);
+ o.pos = mul(o.world, sk_viewproj[o.view_id]);
+
+ o.norm = normalize(mul(input.norm, (float3x3)sk_inst[id].world));
+
+ o.uv = input.uv;
+ o.color = input.col;
+ o.color *= linear_gamma(sk_inst[id].color);
+ // o.color.rgb *= Lighting(o.norm);
+ return o;
+}
+
+psOut ps(psIn input) {
+ psOut o;
+
+ // o.depth = oriel(input.pos.z, input.view_id, input.world.xyz);
+ o.depth = oriel(oriel_id, 0.999, input.view_id, input.world.xyz);
+
+ // float4 col = diffuse.Sample(diffuse_s, input.uv);
+
+ o.color = input.color;// * diffuse.Sample(diffuse_s, input.uv);
+
+ return o;
+}
\ No newline at end of file
diff --git a/sk_demo/res/shaders/unlit.hlsl b/sk_demo/res/shaders/unlit.hlsl
new file mode 100644
index 0000000..bcea33b
--- /dev/null
+++ b/sk_demo/res/shaders/unlit.hlsl
@@ -0,0 +1,47 @@
+#include "stereokit.hlsli"
+#include "dofdev.hlsli"
+
+//--name = dofdev/unlit
+
+//--diffuse = white
+
+Texture2D diffuse : register(t0);
+SamplerState diffuse_s : register(s0);
+
+struct vsIn {
+ float4 pos : SV_Position;
+ float3 norm : NORMAL0;
+ float2 uv : TEXCOORD0;
+ float4 col : COLOR0;
+};
+struct psIn {
+ float4 pos : SV_Position;
+ float3 norm : NORMAL0;
+ float2 uv : TEXCOORD0;
+ float4 world : WORLD;
+ float4 color : COLOR0;
+ float3 campos : TEXCOORD1;
+ uint view_id : SV_RenderTargetArrayIndex;
+};
+
+psIn vs(vsIn input, uint id : SV_InstanceID) {
+ psIn o;
+ o.view_id = id % sk_view_count;
+ id = id / sk_view_count;
+
+ o.campos = sk_camera_pos[o.view_id].xyz;
+
+ o.world = mul(input.pos, sk_inst[id].world);
+ o.pos = mul(o.world, sk_viewproj[o.view_id]);
+
+ o.norm = normalize(mul(input.norm, (float3x3)sk_inst[id].world));
+
+ o.uv = input.uv;
+ o.color = input.col;
+ o.color *= linear_gamma(sk_inst[id].color);
+ return o;
+}
+
+float4 ps(psIn input) : SV_TARGET {
+ return input.color * diffuse.Sample(diffuse_s, input.uv);
+}
\ No newline at end of file
diff --git a/sk_demo/src/Mat.cs b/sk_demo/src/Mat.cs
new file mode 100644
index 0000000..b9d6d67
--- /dev/null
+++ b/sk_demo/src/Mat.cs
@@ -0,0 +1,55 @@
+namespace Main;
+
+using System.Runtime.InteropServices;
+[StructLayout(LayoutKind.Sequential)]
+struct oriel_data {
+ public Matrix m4;
+ public Matrix m4_inv;
+ public Vec3 size;
+ public float pad; // padding (16 byte alignment)
+}
+[StructLayout(LayoutKind.Sequential)]
+unsafe struct oriel_buffer {
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 455)] // 455 *see dofdev.hlsli
+ public oriel_data[] oriels;
+}
+
+public class Mat {
+ MaterialBuffer buffer = new (3);
+ oriel_buffer data = new ();
+ public void SetOriel(int id, Matrix m4, Vec3 size) {
+ data.oriels[id].m4 = (Matrix)System.Numerics.Matrix4x4.Transpose(
+ m4.Inverse
+ );
+ data.oriels[id].m4_inv = (Matrix)System.Numerics.Matrix4x4.Transpose(
+ m4
+ );
+ data.oriels[id].size = size;
+ buffer.Set(data);
+ }
+
+ public Material mono = new (Shader.FromFile("shaders/mono.hlsl"));
+ public void SetAtlas(string name, Material mat) {
+ Tex tex = Tex.FromFile($"{name}/{name}.png");
+ tex.SampleMode = TexSample.Point;
+ mat.SetTexture("diffuse", tex);
+ }
+
+ public Material sky = new (Shader.FromFile("shaders/sky.hlsl"));
+
+ public Material unlit = new (Shader.FromFile("shaders/unlit.hlsl"));
+
+ public void Init() {
+ data.oriels = new oriel_data[455]; // 455 *see dofdev.hlsli
+
+ mono.FaceCull = Cull.None;
+ sky.FaceCull = Cull.Front;
+ }
+
+ public void Run() {
+ Rig rig = Main.Mono.inst.rig;
+
+
+ // Log.Info($"{rig.perch_pos.z}");
+ }
+}
\ No newline at end of file
diff --git a/sk_demo/src/Mono.cs b/sk_demo/src/Mono.cs
new file mode 100644
index 0000000..990e56f
--- /dev/null
+++ b/sk_demo/src/Mono.cs
@@ -0,0 +1,102 @@
+using System.Security.AccessControl;
+
+namespace Main;
+public class Mono {
+ private static readonly Lazy lazy = new(() => new Mono());
+ public static Mono inst { get { return lazy.Value; } }
+
+ public static readonly bool dev = Environment.CommandLine.Contains("--dev");
+
+ public MonoNet monoNet = new();
+
+ public Rig rig = new();
+
+
+ public Mat mat = new();
+ Mesh mesh_floor = Mesh.Quad;
+
+ Material mat_room = new (Shader.FromFile("shaders/room.hlsl"));
+ Model model_room = Model.FromFile("room.glb");
+ Mesh mesh_room = Mesh.Quad;
+
+ int last_xi = 0;
+
+ // alphabet a-z
+ string[] characters = new string[] {
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
+ "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
+ "u", "v", "w", "x", "y", "z"
+ };
+
+
+ public void Init() {
+ rig.Init();
+
+ mat.Init();
+ mesh_floor = Mesh.GenerateCircle(1, 64);
+
+ mat_room.SetTexture("diffuse", Tex.FromFile("bake.png"));
+ mesh_room = model_room.Nodes.First(n => n.Name == "Room").Mesh;
+ }
+
+ public void Run() {
+ rig.Run();
+
+ mat.Run(); // run here or at the end?... or maybe both?
+
+ if (Input.Key(Key.Left).IsJustActive()) {
+ monoNet.value = 1;
+ monoNet.send = true;
+ }
+
+ if (Input.Key(Key.Right).IsJustActive()) {
+ monoNet.value = 2;
+ monoNet.send = true;
+ }
+
+ int xi = (int)(rig.hand_1.palm.position.x * 20f);
+ xi = Math.Clamp(xi + 10, 0, 26);
+ Log.Info($"xi: {xi}");
+ if (xi != last_xi) {
+ last_xi = xi;
+ monoNet.value = xi;
+ monoNet.send = true;
+ }
+
+ // HUD
+ // void Text.Add(string text, Matrix transform, TextAlign position = TextAlign.Center, TextAlign align = TextAlign.Center, float offX = 0, float offY = 0, float offZ = 0)
+ Text.Add(
+ characters[last_xi],
+ Matrix.TRS(
+ rig.hand_1.palm.position + V.XYZ(0, 0.1f, 0),
+ rig.head_ori * Quat.FromAngles(0, 180, 0),
+ 2f
+ ),
+ TextAlign.Center,
+ TextAlign.Center,
+ 0, 0, 0
+ );
+
+ // WORLD
+ mesh_room.Draw(
+ mat_room,
+ Matrix.T(V.XYZ(0, 0, 0))
+ );
+
+
+ mesh_floor.Draw(
+ mat.unlit,
+ Matrix.TS(
+ V.XYZ(0, 0, 0),
+ 1*U.cm
+ ),
+ Color.Hex(0x666666FF)
+ );
+
+ Vec3[] offsets = new Vec3[] {
+ V.XYZ(-2, -2f, -2f) * U.cm,
+ V.XYZ(2, 2f, 2f) * U.cm,
+ V.XYZ(0, 0, 0)
+ };
+ }
+}
\ No newline at end of file
diff --git a/sk_demo/src/MonoNet.cs b/sk_demo/src/MonoNet.cs
new file mode 100644
index 0000000..120c1ea
--- /dev/null
+++ b/sk_demo/src/MonoNet.cs
@@ -0,0 +1,46 @@
+using System.Net;
+using System.Net.Http;
+using System.Net.Sockets;
+using System.Threading;
+
+public class MonoNet {
+ public Socket socket;
+ int bufferSize = 180; // ?
+ byte[] wData; int wHead;
+
+ public bool send = true;
+ public int value = 0;
+
+
+ public MonoNet() {
+
+ socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
+ string ip = "192.168.1.81";
+
+ EndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(ip), 1234);
+ socket.Connect(serverEndPoint);
+ wData = new byte[bufferSize];
+
+ Thread.Sleep(1000); // useful?
+
+ // Thread readThread = new Thread(Read);
+ // readThread.Start();
+ Thread writeThread = new Thread(Write);
+ writeThread.Start();
+ }
+
+ void Write() {
+ bool running = true;
+ while (running) {
+ Thread.Sleep(60);
+ if (send) {
+ wHead = 0;
+ BitConverter.GetBytes(value).CopyTo(wData, wHead);
+ socket.Send(wData);
+
+ Log.Info($"Sent {value}");
+ send = false; // for testing
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/sk_demo/src/Rig.cs b/sk_demo/src/Rig.cs
new file mode 100644
index 0000000..2f4c7f0
--- /dev/null
+++ b/sk_demo/src/Rig.cs
@@ -0,0 +1,33 @@
+public class Rig {
+ public Vec3 head_pos = Vec3.Zero;
+ public Quat head_ori = Quat.Identity;
+ public Vec3 view_pos = Vec3.Zero;
+
+ public Hand hand_0 = new();
+ public Hand hand_1 = new();
+ public Vec3 palm_pos = Vec3.Zero;
+ public Quat palm_ori = Quat.Identity;
+
+ public Vec3 perch_pos = Vec3.Zero;
+
+ public void Init() {
+ }
+
+ public void Run() {
+ hand_0 = Input.Hand(Handed.Left);
+ hand_1 = Input.Hand(Handed.Right);
+
+ head_pos = Main.Mono.dev && Time.Totalf > 0.5f ? head_pos : Input.Head.position;
+ head_ori = Main.Mono.dev && Time.Totalf > 0.5f ? head_ori : Input.Head.orientation;
+ view_pos = head_pos + V.XYZ(0, -6*U.cm, 0);
+
+
+
+ // Position is specifically defined as the middle of the middle finger's root (metacarpal) bone.
+ palm_pos = hand_1.palm.position;
+ // For orientation, Forward is the direction the flat of the palm is facing, "Iron Man" style. X+ is to the outside of the right hand, and to the inside of the left hand.
+ palm_ori = hand_1.palm.orientation;
+
+ perch_pos = palm_pos + Vec3.Up * 8 * U.cm;
+ }
+}
\ No newline at end of file
diff --git a/sk_demo/src/SKs.cs b/sk_demo/src/SKs.cs
new file mode 100644
index 0000000..42c9853
--- /dev/null
+++ b/sk_demo/src/SKs.cs
@@ -0,0 +1,39 @@
+global using System;
+global using StereoKit;
+
+Log.Filter = LogLevel.Info;
+Log.Info("hello log!");
+
+SKSettings settings = new() {
+ appName = "dofbox",
+ assetsFolder = "res",
+ depthMode = DepthMode.D32,
+ disableUnfocusedSleep = true,
+ flatscreenWidth = 1280,
+ flatscreenHeight = 720,
+ // displayPreference = DisplayMode.Flatscreen,
+ // disableFlatscreenMRSim = true,
+ origin = OriginMode.Floor,
+ overlayApp = true,
+ overlayPriority = 1,
+ blendPreference = DisplayBlend.AnyTransparent,
+};
+if (!SK.Initialize(settings))
+ Environment.Exit(1);
+
+// Input.HandSolid(Handed.Max, false);
+// Input.HandVisible(Handed.Max, true);
+// Input.HandMaterial(Handed.Max, Material.Default);
+
+Renderer.Scaling = 2;
+Renderer.Multisample = 0;
+Renderer.SetClip(0.02f, 100f);
+Renderer.EnableSky = false;
+Renderer.ClearColor = Color.Hex(0x808080FF);
+Renderer.SetFOV(60f);
+
+Main.Mono mono = Main.Mono.inst;
+mono.Init();
+SK.Run(() => {
+ mono.Run();
+});