Compare commits
94 commits
pre-alpha-
...
master
Author | SHA1 | Date | |
---|---|---|---|
16f973c9c2 | |||
![]() |
5b5006eb90 | ||
e2054a51a8 | |||
93984ce1c0 | |||
6803a659cb | |||
a619fa3afc | |||
43e41caebf | |||
1bd9b00c47 | |||
ae9a4adf67 | |||
7bd3e70c3a | |||
52cfa69a6e | |||
62743d8998 | |||
2fec4cc7f2 | |||
56ffc3f88c | |||
384c249874 | |||
692bb17d44 | |||
2ed8c83ec3 | |||
801b00ad97 | |||
4940b07403 | |||
2f09c6eb9c | |||
3521f50d1b | |||
11df6595c0 | |||
44c28b6825 | |||
92ab9f6fb9 | |||
b117f3cd4d | |||
d086cf629b | |||
143d3769c7 | |||
243af95a3b | |||
3df575314e | |||
8d5fb3b2c6 | |||
471b2472e3 | |||
be324e0aa8 | |||
330f128dd3 | |||
8b8776cbd7 | |||
74a4a01ebf | |||
12fc8906bc | |||
6d95cc8e1a | |||
6e387a72d2 | |||
d79d4e3b4a | |||
4b6fa1d3ff | |||
259c14294c | |||
99f4da8b2f | |||
1538d06c39 | |||
275229a37c | |||
aedcd29a1e | |||
b8c4d130d4 | |||
c944c0cb09 | |||
8b789fc9b6 | |||
bb3132d4ba | |||
31aa28909e | |||
2538673fb2 | |||
d23206b1fc | |||
0196d80944 | |||
dca5c483c4 | |||
0ded4ac7fb | |||
a75119a8c2 | |||
acc1f93f27 | |||
bb2b0a2762 | |||
86b750b1a3 | |||
41c5b74527 | |||
fcf4343509 | |||
783fd17563 | |||
e40b594ae5 | |||
133ca0bb5e | |||
e28436b76c | |||
c628fa2b83 | |||
c63e91285b | |||
5c8c39cc33 | |||
75f0892748 | |||
a5bbfe53f2 | |||
2047ed6d65 | |||
74b8bca10a | |||
9f97a90c12 | |||
f305595b8f | |||
c54580bdeb | |||
1f15662c2d | |||
a10b34dc94 | |||
f27e778f1c | |||
284a176158 | |||
d558f166f9 | |||
527f159ff3 | |||
1e5e60bbcf | |||
19f048b52a | |||
82c0a86235 | |||
0d53d1593f | |||
ff83211b19 | |||
![]() |
4274a4a68f | ||
![]() |
1071efb137 | ||
0991f31e57 | |||
fc105400e3 | |||
f80e9c4cc3 | |||
c2135b2f8c | |||
8c95f3b9fb | |||
650ba0068a |
1
.clangd
|
@ -1,2 +1,3 @@
|
|||
CompileFlags:
|
||||
Add: [-std=c++20]
|
||||
Remove: [-mno-direct-extern-access]
|
32
BUILD.md
|
@ -1,20 +1,27 @@
|
|||
# Building on Linux
|
||||
|
||||
For pre-requisite packages, check [deps.txt](./deps.txt)
|
||||
You will need to install Qt and LLVM/libclang beforehand. All other packages will automatically be obtained through CPM.
|
||||
|
||||
If your distribution does not provide ReactPhysics3D, you will have to build (and install) it yourself prior to this step
|
||||
ccache is highly recommended.
|
||||
|
||||
Use the following to generate the build files:
|
||||
|
||||
cmake -Bbuild .
|
||||
|
||||
> [!NOTE]
|
||||
> Add -DCMAKE_BUILD_TYPE=Release to produce a release build
|
||||
|
||||
Then build the project using:
|
||||
|
||||
cmake --build build
|
||||
|
||||
The compiled binaries should then be located in `./build/bin/` and should be ready for redistribution without any further work.
|
||||
|
||||
If any of the compilation steps fail, or the binaries fail to execute, please create an issue so that this can be corrected.
|
||||
|
||||
# Building on Windows
|
||||
|
||||
The project will be built using VCPKG and MSVC
|
||||
The process is very similar on Windows
|
||||
|
||||
## Pre-requisites
|
||||
|
||||
|
@ -22,6 +29,7 @@ The project will be built using VCPKG and MSVC
|
|||
* Qt 6.8.3 or higher, with MSVC toolchain
|
||||
* CMake
|
||||
* Git (for cloning the repo, optional)
|
||||
* LLVM/libclang 18.1.8+ (from https://github.com/llvm/llvm-project/releases/download/llvmorg-18.1.8/LLVM-18.1.8-win64.exe)
|
||||
* QScintilla already built (see [docs/qscintilla.md](./docs/qscintilla.md)) *\*likely temporary\**
|
||||
|
||||
To start, clone the repository:
|
||||
|
@ -34,18 +42,18 @@ Once in the directory, add Qt to the `CMAKE_PREFIX_PATH` variable (for instance,
|
|||
|
||||
set CMAKE_PREFIX_PATH=C:\Qt\6.8.3\msvc2022_64
|
||||
|
||||
Now, generate the build files with cmake via the vcpkg preset:
|
||||
Now, generate the build files:
|
||||
|
||||
cmake -Bbuild . --preset vcpkg
|
||||
cmake -Bbuild .
|
||||
|
||||
Then, finally, build in release mode\*:
|
||||
Then, finally build:
|
||||
|
||||
cmake --build build --config Release
|
||||
cmake --build build
|
||||
|
||||
The compiled binaries should then be placed in `./build/bin/` and should be ready for redistribution without any further work.
|
||||
> [!NOTE]
|
||||
> To build in release mode, add -DCMAKE_BUILD_TYPE=Release to the configure (first) command,
|
||||
> and add --config Release to the build (second) command
|
||||
|
||||
If any of the compilation steps fail, or the binaries fail to execute, please create an issue so that this can be corrected.
|
||||
The compiled binaries should then be located in `./build/bin/[Debug|Release]` and should be ready for redistribution without any further work.
|
||||
|
||||
\* Release mode is necessary as debug mode copies DLLs that are not linked to the output binary
|
||||
|
||||
DEVELOPER NOTE: AKA Not for you. If you get CUSTOM COMMAND BUILD errors just keep rerunning build
|
||||
If any of the compilation steps fail, or the binaries fail to execute, please create an issue so that this can be corrected.
|
|
@ -10,6 +10,7 @@ else()
|
|||
endif()
|
||||
|
||||
set( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" )
|
||||
set(USE_CCACHE ON)
|
||||
|
||||
add_subdirectory(autogen)
|
||||
|
||||
|
@ -24,4 +25,6 @@ add_subdirectory(client)
|
|||
add_subdirectory(editor)
|
||||
|
||||
|
||||
install(FILES $<TARGET_RUNTIME_DLLS:editor> TYPE BIN)
|
||||
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/tests )
|
||||
enable_testing()
|
||||
add_subdirectory(tests)
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
{
|
||||
"version": 2,
|
||||
"configurePresets": [
|
||||
{
|
||||
"name": "vcpkg",
|
||||
"generator": "Visual Studio 17 2022",
|
||||
"binaryDir": "${sourceDir}/build",
|
||||
"cacheVariables": {
|
||||
"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "vcpkg-linux",
|
||||
"generator": "Ninja",
|
||||
"binaryDir": "${sourceDir}/build",
|
||||
"cacheVariables": {
|
||||
"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
{
|
||||
"version": 2,
|
||||
"configurePresets": [
|
||||
{
|
||||
"name": "default",
|
||||
"inherits": "vcpkg",
|
||||
"environment": {
|
||||
"VCPKG_ROOT": "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\vcpkg\\vcpkg.exe"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.5 KiB |
9
asset-srcs/models/NOTE.txt
Normal file
|
@ -0,0 +1,9 @@
|
|||
sphere.obj was made by subdividing a cube, unwrapping it using cube projection, and then using the "To-sphere" tool in Blender to fully smoothen it out.
|
||||
Make sure you select "shade smooth" before exporting!
|
||||
|
||||
Other settings:
|
||||
Up axis: Y
|
||||
Forward axis: -Z
|
||||
|
||||
The winding order in .obj files is always counter-clockwise, so my script (genmesh.py) uses reversed() to reverse this and homogenous the winding order
|
||||
across meshes
|
565
asset-srcs/models/arc.obj
Normal file
|
@ -0,0 +1,565 @@
|
|||
# Blender 4.4.0
|
||||
# www.blender.org
|
||||
mtllib arc.mtl
|
||||
o Torus.001
|
||||
v 1.090000 0.000000 0.000000
|
||||
v 1.060000 0.051962 0.000000
|
||||
v 1.000000 0.051962 0.000000
|
||||
v 0.970000 0.000000 0.000000
|
||||
v 1.000000 -0.051962 0.000000
|
||||
v 1.060000 -0.051962 0.000000
|
||||
v 1.030941 0.000000 -0.353922
|
||||
v 1.002566 0.051962 -0.344181
|
||||
v 0.945817 0.051962 -0.324699
|
||||
v 0.917443 0.000000 -0.314958
|
||||
v 0.945817 -0.051962 -0.324699
|
||||
v 1.002566 -0.051962 -0.344181
|
||||
v 0.860163 0.000000 -0.669492
|
||||
v 0.836489 0.051962 -0.651065
|
||||
v 0.789140 0.051962 -0.614213
|
||||
v 0.765466 0.000000 -0.595786
|
||||
v 0.789140 -0.051962 -0.614213
|
||||
v 0.836489 -0.051962 -0.651065
|
||||
v 0.596173 0.000000 -0.912512
|
||||
v 0.579765 0.051962 -0.887396
|
||||
v 0.546948 0.051962 -0.837166
|
||||
v 0.530540 0.000000 -0.812051
|
||||
v 0.546948 -0.051962 -0.837166
|
||||
v 0.579765 -0.051962 -0.887396
|
||||
v 0.267579 0.000000 -1.056646
|
||||
v 0.260214 0.051962 -1.027564
|
||||
v 0.245485 0.051962 -0.969400
|
||||
v 0.238121 0.000000 -0.940318
|
||||
v 0.245485 -0.051962 -0.969400
|
||||
v 0.260214 -0.051962 -1.027564
|
||||
v -0.090011 0.000000 -1.086277
|
||||
v -0.087534 0.051962 -1.056379
|
||||
v -0.082579 0.051962 -0.996584
|
||||
v -0.080102 0.000000 -0.966687
|
||||
v -0.082579 -0.051962 -0.996584
|
||||
v -0.087534 -0.051962 -1.056379
|
||||
v -0.437848 0.000000 -0.998193
|
||||
v -0.425797 0.051962 -0.970720
|
||||
v -0.401695 0.051962 -0.915773
|
||||
v -0.389644 0.000000 -0.888300
|
||||
v -0.401695 -0.051962 -0.915773
|
||||
v -0.425797 -0.051962 -0.970720
|
||||
v -0.738237 0.000000 -0.801939
|
||||
v -0.717918 0.051962 -0.779867
|
||||
v -0.677281 0.051962 -0.735724
|
||||
v -0.656963 0.000000 -0.713652
|
||||
v -0.677281 -0.051962 -0.735724
|
||||
v -0.717918 -0.051962 -0.779867
|
||||
v -0.958627 0.000000 -0.518782
|
||||
v -0.932242 0.051962 -0.504504
|
||||
v -0.879474 0.051962 -0.475947
|
||||
v -0.853090 0.000000 -0.461669
|
||||
v -0.879474 -0.051962 -0.475947
|
||||
v -0.932242 -0.051962 -0.504504
|
||||
v -1.075134 0.000000 -0.179408
|
||||
v -1.045543 0.051962 -0.174470
|
||||
v -0.986361 0.051962 -0.164595
|
||||
v -0.956770 0.000000 -0.159657
|
||||
v -0.986361 -0.051962 -0.164595
|
||||
v -1.045543 -0.051962 -0.174470
|
||||
v -1.075134 0.000000 0.179408
|
||||
v -1.045543 0.051962 0.174470
|
||||
v -0.986361 0.051962 0.164594
|
||||
v -0.956771 0.000000 0.159656
|
||||
v -0.986361 -0.051962 0.164594
|
||||
v -1.045543 -0.051962 0.174470
|
||||
v -0.958627 0.000000 0.518782
|
||||
v -0.932242 0.051962 0.504504
|
||||
v -0.879474 0.051962 0.475947
|
||||
v -0.853090 0.000000 0.461669
|
||||
v -0.879474 -0.051962 0.475947
|
||||
v -0.932242 -0.051962 0.504504
|
||||
v -0.738237 0.000000 0.801939
|
||||
v -0.717918 0.051962 0.779867
|
||||
v -0.677281 0.051962 0.735724
|
||||
v -0.656963 0.000000 0.713652
|
||||
v -0.677281 -0.051962 0.735724
|
||||
v -0.717918 -0.051962 0.779867
|
||||
v -0.437848 0.000000 0.998193
|
||||
v -0.425797 0.051962 0.970720
|
||||
v -0.401695 0.051962 0.915773
|
||||
v -0.389644 0.000000 0.888300
|
||||
v -0.401695 -0.051962 0.915773
|
||||
v -0.425797 -0.051962 0.970720
|
||||
v -0.090012 0.000000 1.086277
|
||||
v -0.087535 0.051962 1.056379
|
||||
v -0.082580 0.051962 0.996584
|
||||
v -0.080102 0.000000 0.966687
|
||||
v -0.082580 -0.051962 0.996584
|
||||
v -0.087535 -0.051962 1.056379
|
||||
v 0.267579 0.000000 1.056646
|
||||
v 0.260214 0.051962 1.027564
|
||||
v 0.245485 0.051962 0.969400
|
||||
v 0.238121 0.000000 0.940318
|
||||
v 0.245485 -0.051962 0.969400
|
||||
v 0.260214 -0.051962 1.027564
|
||||
v 0.596173 0.000000 0.912512
|
||||
v 0.579765 0.051962 0.887396
|
||||
v 0.546948 0.051962 0.837166
|
||||
v 0.530540 0.000000 0.812051
|
||||
v 0.546948 -0.051962 0.837166
|
||||
v 0.579765 -0.051962 0.887396
|
||||
v 0.860163 0.000000 0.669492
|
||||
v 0.836489 0.051962 0.651065
|
||||
v 0.789141 0.051962 0.614212
|
||||
v 0.765466 0.000000 0.595786
|
||||
v 0.789141 -0.051962 0.614212
|
||||
v 0.836489 -0.051962 0.651065
|
||||
v 1.030941 0.000000 0.353923
|
||||
v 1.002566 0.051962 0.344182
|
||||
v 0.945817 0.051962 0.324700
|
||||
v 0.917443 0.000000 0.314959
|
||||
v 0.945817 -0.051962 0.324700
|
||||
v 1.002566 -0.051962 0.344182
|
||||
vn 0.8571 0.4949 -0.1430
|
||||
vn -0.0000 1.0000 -0.0000
|
||||
vn -0.8571 0.4949 0.1430
|
||||
vn -0.8571 -0.4949 0.1430
|
||||
vn -0.0000 -1.0000 -0.0000
|
||||
vn 0.8571 -0.4949 -0.1430
|
||||
vn 0.7642 0.4949 -0.4136
|
||||
vn -0.7642 0.4949 0.4136
|
||||
vn -0.7642 -0.4949 0.4136
|
||||
vn 0.7642 -0.4949 -0.4136
|
||||
vn 0.5885 0.4949 -0.6393
|
||||
vn -0.5885 0.4949 0.6393
|
||||
vn -0.5885 -0.4949 0.6393
|
||||
vn 0.5885 -0.4949 -0.6393
|
||||
vn 0.3491 0.4949 -0.7958
|
||||
vn -0.3491 0.4949 0.7958
|
||||
vn -0.3491 -0.4949 0.7958
|
||||
vn 0.3491 -0.4949 -0.7958
|
||||
vn 0.0718 0.4949 -0.8660
|
||||
vn -0.0718 0.4949 0.8660
|
||||
vn -0.0718 -0.4949 0.8660
|
||||
vn 0.0718 -0.4949 -0.8660
|
||||
vn -0.2133 0.4949 -0.8424
|
||||
vn 0.2133 0.4949 0.8424
|
||||
vn 0.2133 -0.4949 0.8424
|
||||
vn -0.2133 -0.4949 -0.8424
|
||||
vn -0.4753 0.4949 -0.7275
|
||||
vn 0.4753 0.4949 0.7275
|
||||
vn 0.4753 -0.4949 0.7275
|
||||
vn -0.4753 -0.4949 -0.7275
|
||||
vn -0.6857 0.4949 -0.5337
|
||||
vn 0.6857 0.4949 0.5337
|
||||
vn 0.6857 -0.4949 0.5337
|
||||
vn -0.6857 -0.4949 -0.5337
|
||||
vn -0.8219 0.4949 -0.2822
|
||||
vn 0.8219 0.4949 0.2822
|
||||
vn 0.8219 -0.4949 0.2822
|
||||
vn -0.8219 -0.4949 -0.2822
|
||||
vn -0.8690 0.4949 -0.0000
|
||||
vn 0.8690 0.4949 -0.0000
|
||||
vn 0.8690 -0.4949 -0.0000
|
||||
vn -0.8690 -0.4949 -0.0000
|
||||
vn -0.8219 0.4949 0.2822
|
||||
vn 0.8219 0.4949 -0.2822
|
||||
vn 0.8219 -0.4949 -0.2822
|
||||
vn -0.8219 -0.4949 0.2822
|
||||
vn -0.6857 0.4949 0.5337
|
||||
vn 0.6857 0.4949 -0.5337
|
||||
vn 0.6857 -0.4949 -0.5337
|
||||
vn -0.6857 -0.4949 0.5337
|
||||
vn -0.4753 0.4949 0.7275
|
||||
vn 0.4753 0.4949 -0.7275
|
||||
vn 0.4753 -0.4949 -0.7275
|
||||
vn -0.4753 -0.4949 0.7275
|
||||
vn -0.2133 0.4949 0.8424
|
||||
vn 0.2133 0.4949 -0.8424
|
||||
vn 0.2133 -0.4949 -0.8424
|
||||
vn -0.2133 -0.4949 0.8424
|
||||
vn 0.0718 0.4949 0.8660
|
||||
vn -0.0718 0.4949 -0.8660
|
||||
vn -0.0718 -0.4949 -0.8660
|
||||
vn 0.0718 -0.4949 0.8660
|
||||
vn 0.3491 0.4949 0.7958
|
||||
vn -0.3491 0.4949 -0.7958
|
||||
vn -0.3491 -0.4949 -0.7958
|
||||
vn 0.3491 -0.4949 0.7958
|
||||
vn 0.5885 0.4949 0.6393
|
||||
vn -0.5885 0.4949 -0.6393
|
||||
vn -0.5885 -0.4949 -0.6393
|
||||
vn 0.5885 -0.4949 0.6393
|
||||
vn 0.7642 0.4949 0.4136
|
||||
vn -0.7642 0.4949 -0.4136
|
||||
vn -0.7642 -0.4949 -0.4136
|
||||
vn 0.7642 -0.4949 0.4136
|
||||
vn 0.8571 0.4949 0.1430
|
||||
vn -0.8571 0.4949 -0.1430
|
||||
vn -0.8571 -0.4949 -0.1430
|
||||
vn 0.8571 -0.4949 0.1430
|
||||
vt 0.526316 0.500000
|
||||
vt 0.578947 0.666667
|
||||
vt 0.526316 0.666667
|
||||
vt 0.526316 0.833333
|
||||
vt 0.578947 0.833333
|
||||
vt 0.526316 1.000000
|
||||
vt 0.578947 -0.000000
|
||||
vt 0.526316 0.166667
|
||||
vt 0.526316 -0.000000
|
||||
vt 0.578947 0.333333
|
||||
vt 0.526316 0.333333
|
||||
vt 0.578947 0.500000
|
||||
vt 0.631579 0.500000
|
||||
vt 0.631579 0.666667
|
||||
vt 0.631579 0.833333
|
||||
vt 0.578947 1.000000
|
||||
vt 0.631579 -0.000000
|
||||
vt 0.578947 0.166667
|
||||
vt 0.631579 0.166667
|
||||
vt 0.684211 0.500000
|
||||
vt 0.684211 0.666667
|
||||
vt 0.684211 0.833333
|
||||
vt 0.631579 1.000000
|
||||
vt 0.684211 0.166667
|
||||
vt 0.631579 0.333333
|
||||
vt 0.684211 0.333333
|
||||
vt 0.736842 0.666667
|
||||
vt 0.736842 0.833333
|
||||
vt 0.684211 1.000000
|
||||
vt 0.736842 -0.000000
|
||||
vt 0.684211 -0.000000
|
||||
vt 0.736842 0.333333
|
||||
vt 0.789474 0.500000
|
||||
vt 0.736842 0.500000
|
||||
vt 0.789474 0.666667
|
||||
vt 0.789474 0.833333
|
||||
vt 0.736842 1.000000
|
||||
vt 0.789474 -0.000000
|
||||
vt 0.736842 0.166667
|
||||
vt 0.789474 0.166667
|
||||
vt 0.789474 0.333333
|
||||
vt 0.842105 0.666667
|
||||
vt 0.842105 0.833333
|
||||
vt 0.789474 1.000000
|
||||
vt 0.842105 -0.000000
|
||||
vt 0.842105 0.166667
|
||||
vt 0.842105 0.333333
|
||||
vt 0.842105 0.500000
|
||||
vt 0.894737 0.666667
|
||||
vt 0.894737 0.833333
|
||||
vt 0.842105 1.000000
|
||||
vt 0.894737 -0.000000
|
||||
vt 0.894737 0.333333
|
||||
vt 0.894737 0.500000
|
||||
vt 0.947368 0.666667
|
||||
vt 0.947368 0.833333
|
||||
vt 0.894737 1.000000
|
||||
vt 0.947368 -0.000000
|
||||
vt 0.894737 0.166667
|
||||
vt 0.947368 0.333333
|
||||
vt 0.947368 0.500000
|
||||
vt 1.000000 0.666667
|
||||
vt 1.000000 0.833333
|
||||
vt 0.947368 1.000000
|
||||
vt 1.000000 -0.000000
|
||||
vt 0.947368 0.166667
|
||||
vt 1.000000 0.166667
|
||||
vt 1.000000 0.333333
|
||||
vt 0.052632 0.500000
|
||||
vt -0.000000 0.666667
|
||||
vt -0.000000 0.500000
|
||||
vt 0.052632 0.666667
|
||||
vt -0.000000 0.833333
|
||||
vt 0.052632 1.000000
|
||||
vt -0.000000 1.000000
|
||||
vt 0.052632 -0.000000
|
||||
vt -0.000000 0.166667
|
||||
vt -0.000000 -0.000000
|
||||
vt 0.052632 0.166667
|
||||
vt -0.000000 0.333333
|
||||
vt 0.052632 0.333333
|
||||
vt 0.105263 0.500000
|
||||
vt 0.105263 0.833333
|
||||
vt 0.052632 0.833333
|
||||
vt 0.105263 1.000000
|
||||
vt 0.105263 -0.000000
|
||||
vt 0.105263 0.166667
|
||||
vt 0.157895 0.500000
|
||||
vt 0.105263 0.666667
|
||||
vt 0.157895 0.666667
|
||||
vt 0.157895 0.833333
|
||||
vt 0.157895 0.166667
|
||||
vt 0.105263 0.333333
|
||||
vt 0.210526 0.500000
|
||||
vt 0.210526 0.833333
|
||||
vt 0.157895 1.000000
|
||||
vt 0.210526 -0.000000
|
||||
vt 0.157895 -0.000000
|
||||
vt 0.210526 0.166667
|
||||
vt 0.157895 0.333333
|
||||
vt 0.210526 0.333333
|
||||
vt 0.263158 0.500000
|
||||
vt 0.210526 0.666667
|
||||
vt 0.263158 0.666667
|
||||
vt 0.263158 0.833333
|
||||
vt 0.210526 1.000000
|
||||
vt 0.263158 0.166667
|
||||
vt 0.263158 0.333333
|
||||
vt 0.315789 0.500000
|
||||
vt 0.315789 0.833333
|
||||
vt 0.263158 1.000000
|
||||
vt 0.315789 -0.000000
|
||||
vt 0.263158 -0.000000
|
||||
vt 0.315789 0.166667
|
||||
vt 0.315789 0.333333
|
||||
vt 0.368421 0.500000
|
||||
vt 0.315789 0.666667
|
||||
vt 0.368421 0.833333
|
||||
vt 0.315789 1.000000
|
||||
vt 0.368421 -0.000000
|
||||
vt 0.368421 0.166667
|
||||
vt 0.421053 0.666667
|
||||
vt 0.368421 0.666667
|
||||
vt 0.421053 0.833333
|
||||
vt 0.368421 1.000000
|
||||
vt 0.421053 -0.000000
|
||||
vt 0.421053 0.333333
|
||||
vt 0.368421 0.333333
|
||||
vt 0.421053 0.500000
|
||||
vt 0.473684 0.666667
|
||||
vt 0.473684 0.833333
|
||||
vt 0.421053 1.000000
|
||||
vt 0.473684 -0.000000
|
||||
vt 0.421053 0.166667
|
||||
vt 0.473684 0.166667
|
||||
vt 0.473684 0.333333
|
||||
vt 0.473684 0.500000
|
||||
vt 0.473684 1.000000
|
||||
vt 1.000000 0.500000
|
||||
vt 1.000000 1.000000
|
||||
s 0
|
||||
f 1/1/1 8/2/1 2/3/1
|
||||
f 8/2/2 3/4/2 2/3/2
|
||||
f 9/5/3 4/6/3 3/4/3
|
||||
f 10/7/4 5/8/4 4/9/4
|
||||
f 5/8/5 12/10/5 6/11/5
|
||||
f 6/11/6 7/12/6 1/1/6
|
||||
f 13/13/7 8/2/7 7/12/7
|
||||
f 14/14/2 9/5/2 8/2/2
|
||||
f 15/15/8 10/16/8 9/5/8
|
||||
f 16/17/9 11/18/9 10/7/9
|
||||
f 17/19/5 12/10/5 11/18/5
|
||||
f 12/10/10 13/13/10 7/12/10
|
||||
f 19/20/11 14/14/11 13/13/11
|
||||
f 20/21/2 15/15/2 14/14/2
|
||||
f 21/22/12 16/23/12 15/15/12
|
||||
f 16/17/13 23/24/13 17/19/13
|
||||
f 23/24/5 18/25/5 17/19/5
|
||||
f 24/26/14 13/13/14 18/25/14
|
||||
f 19/20/15 26/27/15 20/21/15
|
||||
f 20/21/2 27/28/2 21/22/2
|
||||
f 27/28/16 22/29/16 21/22/16
|
||||
f 28/30/17 23/24/17 22/31/17
|
||||
f 23/24/5 30/32/5 24/26/5
|
||||
f 30/32/18 19/20/18 24/26/18
|
||||
f 31/33/19 26/27/19 25/34/19
|
||||
f 32/35/2 27/28/2 26/27/2
|
||||
f 33/36/20 28/37/20 27/28/20
|
||||
f 34/38/21 29/39/21 28/30/21
|
||||
f 35/40/5 30/32/5 29/39/5
|
||||
f 36/41/22 25/34/22 30/32/22
|
||||
f 31/33/23 38/42/23 32/35/23
|
||||
f 32/35/2 39/43/2 33/36/2
|
||||
f 39/43/24 34/44/24 33/36/24
|
||||
f 40/45/25 35/40/25 34/38/25
|
||||
f 41/46/5 36/41/5 35/40/5
|
||||
f 42/47/26 31/33/26 36/41/26
|
||||
f 37/48/27 44/49/27 38/42/27
|
||||
f 44/49/2 39/43/2 38/42/2
|
||||
f 45/50/28 40/51/28 39/43/28
|
||||
f 46/52/29 41/46/29 40/45/29
|
||||
f 41/46/5 48/53/5 42/47/5
|
||||
f 48/53/30 37/48/30 42/47/30
|
||||
f 43/54/31 50/55/31 44/49/31
|
||||
f 44/49/2 51/56/2 45/50/2
|
||||
f 51/56/32 46/57/32 45/50/32
|
||||
f 52/58/33 47/59/33 46/52/33
|
||||
f 47/59/5 54/60/5 48/53/5
|
||||
f 54/60/34 43/54/34 48/53/34
|
||||
f 49/61/35 56/62/35 50/55/35
|
||||
f 56/62/2 51/56/2 50/55/2
|
||||
f 57/63/36 52/64/36 51/56/36
|
||||
f 58/65/37 53/66/37 52/58/37
|
||||
f 59/67/5 54/60/5 53/66/5
|
||||
f 60/68/38 49/61/38 54/60/38
|
||||
f 61/69/39 56/70/39 55/71/39
|
||||
f 62/72/2 57/73/2 56/70/2
|
||||
f 57/73/40 64/74/40 58/75/40
|
||||
f 64/76/41 59/77/41 58/78/41
|
||||
f 65/79/5 60/80/5 59/77/5
|
||||
f 66/81/42 55/71/42 60/80/42
|
||||
f 67/82/43 62/72/43 61/69/43
|
||||
f 62/72/2 69/83/2 63/84/2
|
||||
f 63/84/44 70/85/44 64/74/44
|
||||
f 70/86/45 65/79/45 64/76/45
|
||||
f 71/87/5 66/81/5 65/79/5
|
||||
f 66/81/46 67/82/46 61/69/46
|
||||
f 73/88/47 68/89/47 67/82/47
|
||||
f 74/90/2 69/83/2 68/89/2
|
||||
f 75/91/48 70/85/48 69/83/48
|
||||
f 70/86/49 77/92/49 71/87/49
|
||||
f 77/92/5 72/93/5 71/87/5
|
||||
f 72/93/50 73/88/50 67/82/50
|
||||
f 79/94/51 74/90/51 73/88/51
|
||||
f 74/90/2 81/95/2 75/91/2
|
||||
f 81/95/52 76/96/52 75/91/52
|
||||
f 82/97/53 77/92/53 76/98/53
|
||||
f 83/99/5 78/100/5 77/92/5
|
||||
f 84/101/54 73/88/54 78/100/54
|
||||
f 85/102/55 80/103/55 79/94/55
|
||||
f 86/104/2 81/95/2 80/103/2
|
||||
f 87/105/56 82/106/56 81/95/56
|
||||
f 82/97/57 89/107/57 83/99/57
|
||||
f 89/107/5 84/101/5 83/99/5
|
||||
f 90/108/58 79/94/58 84/101/58
|
||||
f 91/109/59 86/104/59 85/102/59
|
||||
f 86/104/2 93/110/2 87/105/2
|
||||
f 93/110/60 88/111/60 87/105/60
|
||||
f 94/112/61 89/107/61 88/113/61
|
||||
f 95/114/5 90/108/5 89/107/5
|
||||
f 96/115/62 85/102/62 90/108/62
|
||||
f 97/116/63 92/117/63 91/109/63
|
||||
f 92/117/2 99/118/2 93/110/2
|
||||
f 99/118/64 94/119/64 93/110/64
|
||||
f 100/120/65 95/114/65 94/112/65
|
||||
f 101/121/5 96/115/5 95/114/5
|
||||
f 96/115/66 97/116/66 91/109/66
|
||||
f 97/116/67 104/122/67 98/123/67
|
||||
f 104/122/2 99/118/2 98/123/2
|
||||
f 105/124/68 100/125/68 99/118/68
|
||||
f 106/126/69 101/121/69 100/120/69
|
||||
f 101/121/5 108/127/5 102/128/5
|
||||
f 108/127/70 97/116/70 102/128/70
|
||||
f 103/129/71 110/130/71 104/122/71
|
||||
f 110/130/2 105/124/2 104/122/2
|
||||
f 111/131/72 106/132/72 105/124/72
|
||||
f 112/133/73 107/134/73 106/126/73
|
||||
f 113/135/5 108/127/5 107/134/5
|
||||
f 114/136/74 103/129/74 108/127/74
|
||||
f 1/1/75 110/130/75 109/137/75
|
||||
f 2/3/2 111/131/2 110/130/2
|
||||
f 3/4/76 112/138/76 111/131/76
|
||||
f 4/9/77 113/135/77 112/133/77
|
||||
f 5/8/5 114/136/5 113/135/5
|
||||
f 6/11/78 109/137/78 114/136/78
|
||||
f 1/1/1 7/12/1 8/2/1
|
||||
f 8/2/2 9/5/2 3/4/2
|
||||
f 9/5/3 10/16/3 4/6/3
|
||||
f 10/7/4 11/18/4 5/8/4
|
||||
f 5/8/5 11/18/5 12/10/5
|
||||
f 6/11/6 12/10/6 7/12/6
|
||||
f 13/13/7 14/14/7 8/2/7
|
||||
f 14/14/2 15/15/2 9/5/2
|
||||
f 15/15/8 16/23/8 10/16/8
|
||||
f 16/17/9 17/19/9 11/18/9
|
||||
f 17/19/5 18/25/5 12/10/5
|
||||
f 12/10/10 18/25/10 13/13/10
|
||||
f 19/20/11 20/21/11 14/14/11
|
||||
f 20/21/2 21/22/2 15/15/2
|
||||
f 21/22/12 22/29/12 16/23/12
|
||||
f 16/17/13 22/31/13 23/24/13
|
||||
f 23/24/5 24/26/5 18/25/5
|
||||
f 24/26/14 19/20/14 13/13/14
|
||||
f 19/20/15 25/34/15 26/27/15
|
||||
f 20/21/2 26/27/2 27/28/2
|
||||
f 27/28/16 28/37/16 22/29/16
|
||||
f 28/30/17 29/39/17 23/24/17
|
||||
f 23/24/5 29/39/5 30/32/5
|
||||
f 30/32/18 25/34/18 19/20/18
|
||||
f 31/33/19 32/35/19 26/27/19
|
||||
f 32/35/2 33/36/2 27/28/2
|
||||
f 33/36/20 34/44/20 28/37/20
|
||||
f 34/38/21 35/40/21 29/39/21
|
||||
f 35/40/5 36/41/5 30/32/5
|
||||
f 36/41/22 31/33/22 25/34/22
|
||||
f 31/33/23 37/48/23 38/42/23
|
||||
f 32/35/2 38/42/2 39/43/2
|
||||
f 39/43/24 40/51/24 34/44/24
|
||||
f 40/45/25 41/46/25 35/40/25
|
||||
f 41/46/5 42/47/5 36/41/5
|
||||
f 42/47/26 37/48/26 31/33/26
|
||||
f 37/48/27 43/54/27 44/49/27
|
||||
f 44/49/2 45/50/2 39/43/2
|
||||
f 45/50/28 46/57/28 40/51/28
|
||||
f 46/52/29 47/59/29 41/46/29
|
||||
f 41/46/5 47/59/5 48/53/5
|
||||
f 48/53/30 43/54/30 37/48/30
|
||||
f 43/54/31 49/61/31 50/55/31
|
||||
f 44/49/2 50/55/2 51/56/2
|
||||
f 51/56/32 52/64/32 46/57/32
|
||||
f 52/58/33 53/66/33 47/59/33
|
||||
f 47/59/5 53/66/5 54/60/5
|
||||
f 54/60/34 49/61/34 43/54/34
|
||||
f 49/61/35 55/139/35 56/62/35
|
||||
f 56/62/2 57/63/2 51/56/2
|
||||
f 57/63/36 58/140/36 52/64/36
|
||||
f 58/65/37 59/67/37 53/66/37
|
||||
f 59/67/5 60/68/5 54/60/5
|
||||
f 60/68/38 55/139/38 49/61/38
|
||||
f 61/69/39 62/72/39 56/70/39
|
||||
f 62/72/2 63/84/2 57/73/2
|
||||
f 57/73/40 63/84/40 64/74/40
|
||||
f 64/76/41 65/79/41 59/77/41
|
||||
f 65/79/5 66/81/5 60/80/5
|
||||
f 66/81/42 61/69/42 55/71/42
|
||||
f 67/82/43 68/89/43 62/72/43
|
||||
f 62/72/2 68/89/2 69/83/2
|
||||
f 63/84/44 69/83/44 70/85/44
|
||||
f 70/86/45 71/87/45 65/79/45
|
||||
f 71/87/5 72/93/5 66/81/5
|
||||
f 66/81/46 72/93/46 67/82/46
|
||||
f 73/88/47 74/90/47 68/89/47
|
||||
f 74/90/2 75/91/2 69/83/2
|
||||
f 75/91/48 76/96/48 70/85/48
|
||||
f 70/86/49 76/98/49 77/92/49
|
||||
f 77/92/5 78/100/5 72/93/5
|
||||
f 72/93/50 78/100/50 73/88/50
|
||||
f 79/94/51 80/103/51 74/90/51
|
||||
f 74/90/2 80/103/2 81/95/2
|
||||
f 81/95/52 82/106/52 76/96/52
|
||||
f 82/97/53 83/99/53 77/92/53
|
||||
f 83/99/5 84/101/5 78/100/5
|
||||
f 84/101/54 79/94/54 73/88/54
|
||||
f 85/102/55 86/104/55 80/103/55
|
||||
f 86/104/2 87/105/2 81/95/2
|
||||
f 87/105/56 88/111/56 82/106/56
|
||||
f 82/97/57 88/113/57 89/107/57
|
||||
f 89/107/5 90/108/5 84/101/5
|
||||
f 90/108/58 85/102/58 79/94/58
|
||||
f 91/109/59 92/117/59 86/104/59
|
||||
f 86/104/2 92/117/2 93/110/2
|
||||
f 93/110/60 94/119/60 88/111/60
|
||||
f 94/112/61 95/114/61 89/107/61
|
||||
f 95/114/5 96/115/5 90/108/5
|
||||
f 96/115/62 91/109/62 85/102/62
|
||||
f 97/116/63 98/123/63 92/117/63
|
||||
f 92/117/2 98/123/2 99/118/2
|
||||
f 99/118/64 100/125/64 94/119/64
|
||||
f 100/120/65 101/121/65 95/114/65
|
||||
f 101/121/5 102/128/5 96/115/5
|
||||
f 96/115/66 102/128/66 97/116/66
|
||||
f 97/116/67 103/129/67 104/122/67
|
||||
f 104/122/2 105/124/2 99/118/2
|
||||
f 105/124/68 106/132/68 100/125/68
|
||||
f 106/126/69 107/134/69 101/121/69
|
||||
f 101/121/5 107/134/5 108/127/5
|
||||
f 108/127/70 103/129/70 97/116/70
|
||||
f 103/129/71 109/137/71 110/130/71
|
||||
f 110/130/2 111/131/2 105/124/2
|
||||
f 111/131/72 112/138/72 106/132/72
|
||||
f 112/133/73 113/135/73 107/134/73
|
||||
f 113/135/5 114/136/5 108/127/5
|
||||
f 114/136/74 109/137/74 103/129/74
|
||||
f 1/1/75 2/3/75 110/130/75
|
||||
f 2/3/2 3/4/2 111/131/2
|
||||
f 3/4/76 4/6/76 112/138/76
|
||||
f 4/9/77 5/8/77 113/135/77
|
||||
f 5/8/5 6/11/5 114/136/5
|
||||
f 6/11/78 1/1/78 109/137/78
|
119
asset-srcs/models/arrow.obj
Normal file
|
@ -0,0 +1,119 @@
|
|||
# Blender 4.3.2
|
||||
# www.blender.org
|
||||
mtllib arrow.mtl
|
||||
o Cylinder.001
|
||||
v 0.189969 0.008460 -1.749730
|
||||
v 0.189969 0.008460 1.759116
|
||||
v 0.134756 -0.124837 -1.749730
|
||||
v 0.134756 -0.124837 1.759116
|
||||
v 0.001459 -0.180050 -1.749730
|
||||
v 0.001459 -0.180050 1.759116
|
||||
v -0.131837 -0.124837 -1.749730
|
||||
v -0.131837 -0.124837 1.759116
|
||||
v -0.187050 0.008460 -1.749730
|
||||
v -0.187050 0.008460 1.759116
|
||||
v -0.131837 0.141756 -1.749730
|
||||
v -0.131837 0.141756 1.759116
|
||||
v 0.001459 0.196969 -1.749730
|
||||
v 0.001459 0.196969 1.759116
|
||||
v 0.134756 0.141756 -1.749730
|
||||
v 0.134756 0.141756 1.759116
|
||||
v 0.398640 0.008460 1.759116
|
||||
v 0.282308 -0.272389 1.759116
|
||||
v 0.001459 -0.388721 1.759116
|
||||
v -0.279390 -0.272389 1.759116
|
||||
v -0.395722 0.008460 1.759116
|
||||
v -0.279390 0.289309 1.759116
|
||||
v 0.001459 0.405641 1.759116
|
||||
v 0.282308 0.289309 1.759116
|
||||
v 0.001459 0.010576 2.759115
|
||||
vn 0.9239 -0.3827 -0.0000
|
||||
vn 0.3827 -0.9239 -0.0000
|
||||
vn -0.3827 -0.9239 -0.0000
|
||||
vn -0.9239 -0.3827 -0.0000
|
||||
vn -0.9239 0.3827 -0.0000
|
||||
vn -0.3827 0.9239 -0.0000
|
||||
vn -0.0000 -0.0000 -1.0000
|
||||
vn 0.3827 0.9239 -0.0000
|
||||
vn 0.9239 0.3827 -0.0000
|
||||
vn 0.8676 0.3594 0.3438
|
||||
vn -0.3595 0.8679 0.3429
|
||||
vn -0.8671 -0.3592 0.3452
|
||||
vn 0.3590 -0.8668 0.3461
|
||||
vn 0.3595 0.8679 0.3429
|
||||
vn -0.8676 0.3594 0.3438
|
||||
vn -0.3590 -0.8668 0.3461
|
||||
vn 0.8671 -0.3592 0.3452
|
||||
vt 1.000000 1.000000
|
||||
vt 0.875000 0.500000
|
||||
vt 1.000000 0.500000
|
||||
vt 0.875000 1.000000
|
||||
vt 0.750000 0.500000
|
||||
vt 0.750000 1.000000
|
||||
vt 0.625000 0.500000
|
||||
vt 0.625000 1.000000
|
||||
vt 0.500000 0.500000
|
||||
vt 0.500000 1.000000
|
||||
vt 0.375000 0.500000
|
||||
vt 0.375000 1.000000
|
||||
vt 0.250000 0.500000
|
||||
vt 0.250000 1.000000
|
||||
vt 0.125000 0.500000
|
||||
vt 0.125000 1.000000
|
||||
vt 0.000000 0.500000
|
||||
vt 0.919706 0.080294
|
||||
vt 0.580294 0.080294
|
||||
vt 0.580294 0.419706
|
||||
vt 0.000000 1.000000
|
||||
vt 0.750000 0.490000
|
||||
vt 0.919706 0.419706
|
||||
vt 0.990000 0.250000
|
||||
vt 0.750000 0.010000
|
||||
vt 0.510000 0.250000
|
||||
s 0
|
||||
f 2/1/1 3/2/1 1/3/1
|
||||
f 4/4/2 5/5/2 3/2/2
|
||||
f 6/6/3 7/7/3 5/5/3
|
||||
f 8/8/4 9/9/4 7/7/4
|
||||
f 10/10/5 11/11/5 9/9/5
|
||||
f 12/12/6 13/13/6 11/11/6
|
||||
f 8/8/7 21/10/7 10/10/7
|
||||
f 14/14/8 15/15/8 13/13/8
|
||||
f 16/16/9 1/17/9 15/15/9
|
||||
f 7/18/7 11/19/7 15/20/7
|
||||
f 17/21/10 24/16/10 25/21/10
|
||||
f 14/14/7 24/16/7 16/16/7
|
||||
f 4/4/7 19/6/7 6/6/7
|
||||
f 10/10/7 22/12/7 12/12/7
|
||||
f 16/16/7 17/21/7 2/21/7
|
||||
f 2/1/7 18/4/7 4/4/7
|
||||
f 6/6/7 20/8/7 8/8/7
|
||||
f 12/12/7 23/14/7 14/14/7
|
||||
f 23/14/11 22/12/11 25/14/11
|
||||
f 21/10/12 20/8/12 25/10/12
|
||||
f 19/6/13 18/4/13 25/6/13
|
||||
f 24/16/14 23/14/14 25/16/14
|
||||
f 22/12/15 21/10/15 25/12/15
|
||||
f 20/8/16 19/6/16 25/8/16
|
||||
f 18/4/17 17/1/17 25/4/17
|
||||
f 2/1/1 4/4/1 3/2/1
|
||||
f 4/4/2 6/6/2 5/5/2
|
||||
f 6/6/3 8/8/3 7/7/3
|
||||
f 8/8/4 10/10/4 9/9/4
|
||||
f 10/10/5 12/12/5 11/11/5
|
||||
f 12/12/6 14/14/6 13/13/6
|
||||
f 8/8/7 20/8/7 21/10/7
|
||||
f 14/14/8 16/16/8 15/15/8
|
||||
f 16/16/9 2/21/9 1/17/9
|
||||
f 15/20/7 1/22/7 3/23/7
|
||||
f 3/23/7 5/24/7 7/18/7
|
||||
f 7/18/7 9/25/7 11/19/7
|
||||
f 11/19/7 13/26/7 15/20/7
|
||||
f 15/20/7 3/23/7 7/18/7
|
||||
f 14/14/7 23/14/7 24/16/7
|
||||
f 4/4/7 18/4/7 19/6/7
|
||||
f 10/10/7 21/10/7 22/12/7
|
||||
f 16/16/7 24/16/7 17/21/7
|
||||
f 2/1/7 17/1/7 18/4/7
|
||||
f 6/6/7 19/6/7 20/8/7
|
||||
f 12/12/7 22/12/7 23/14/7
|
36
asset-srcs/models/cube.obj
Normal file
|
@ -0,0 +1,36 @@
|
|||
# Blender 4.3.2
|
||||
# www.blender.org
|
||||
mtllib cube.mtl
|
||||
o Cube
|
||||
v 1.000000 1.000000 -1.000000
|
||||
v 1.000000 -1.000000 -1.000000
|
||||
v 1.000000 1.000000 1.000000
|
||||
v 1.000000 -1.000000 1.000000
|
||||
v -1.000000 1.000000 -1.000000
|
||||
v -1.000000 -1.000000 -1.000000
|
||||
v -1.000000 1.000000 1.000000
|
||||
v -1.000000 -1.000000 1.000000
|
||||
vn -0.0000 1.0000 -0.0000
|
||||
vn -0.0000 -0.0000 1.0000
|
||||
vn -1.0000 -0.0000 -0.0000
|
||||
vn -0.0000 -1.0000 -0.0000
|
||||
vn 1.0000 -0.0000 -0.0000
|
||||
vn -0.0000 -0.0000 -1.0000
|
||||
vt 0.000000 1.000000
|
||||
vt 1.000000 0.000000
|
||||
vt 1.000000 1.000000
|
||||
vt 0.000000 0.000000
|
||||
s 0
|
||||
usemtl Material
|
||||
f 5/1/1 3/2/1 1/3/1
|
||||
f 3/3/2 8/4/2 4/2/2
|
||||
f 7/1/3 6/2/3 8/4/3
|
||||
f 2/3/4 8/4/4 6/1/4
|
||||
f 1/3/5 4/4/5 2/2/5
|
||||
f 5/1/6 2/2/6 6/4/6
|
||||
f 5/1/1 7/4/1 3/2/1
|
||||
f 3/3/2 7/1/2 8/4/2
|
||||
f 7/1/3 5/3/3 6/2/3
|
||||
f 2/3/4 4/2/4 8/4/4
|
||||
f 1/3/5 3/1/5 4/4/5
|
||||
f 5/1/6 1/3/6 2/2/6
|
137
asset-srcs/models/cylinder.obj
Normal file
|
@ -0,0 +1,137 @@
|
|||
# Blender 4.4.1
|
||||
# www.blender.org
|
||||
mtllib cylinder.mtl
|
||||
o Cylinder
|
||||
v 0.000000 -1.000000 1.000000
|
||||
v 0.000000 -1.000000 -1.000000
|
||||
v 0.500000 -0.866025 1.000000
|
||||
v 0.500000 -0.866025 -1.000000
|
||||
v 0.866025 -0.500000 1.000000
|
||||
v 0.866025 -0.500000 -1.000000
|
||||
v 1.000000 0.000000 1.000000
|
||||
v 1.000000 -0.000000 -1.000000
|
||||
v 0.866025 0.500000 1.000000
|
||||
v 0.866025 0.500000 -1.000000
|
||||
v 0.500000 0.866025 1.000000
|
||||
v 0.500000 0.866025 -1.000000
|
||||
v 0.000000 1.000000 1.000000
|
||||
v 0.000000 1.000000 -1.000000
|
||||
v -0.500000 0.866025 1.000000
|
||||
v -0.500000 0.866025 -1.000000
|
||||
v -0.866025 0.500000 1.000000
|
||||
v -0.866025 0.500000 -1.000000
|
||||
v -1.000000 0.000000 1.000000
|
||||
v -1.000000 -0.000000 -1.000000
|
||||
v -0.866025 -0.500000 1.000000
|
||||
v -0.866025 -0.500000 -1.000000
|
||||
v -0.500000 -0.866025 1.000000
|
||||
v -0.500000 -0.866025 -1.000000
|
||||
vn 0.2588 -0.9659 -0.0000
|
||||
vn 0.7071 -0.7071 -0.0000
|
||||
vn 0.9659 -0.2588 -0.0000
|
||||
vn 0.9659 0.2588 -0.0000
|
||||
vn 0.7071 0.7071 -0.0000
|
||||
vn 0.2588 0.9659 -0.0000
|
||||
vn -0.2588 0.9659 -0.0000
|
||||
vn -0.7071 0.7071 -0.0000
|
||||
vn -0.9659 0.2588 -0.0000
|
||||
vn -0.9659 -0.2588 -0.0000
|
||||
vn -0.0000 -0.0000 -1.0000
|
||||
vn -0.7071 -0.7071 -0.0000
|
||||
vn -0.2588 -0.9659 -0.0000
|
||||
vn -0.0000 -0.0000 1.0000
|
||||
vt 1.000000 1.000000
|
||||
vt 0.916667 0.500000
|
||||
vt 1.000000 0.500000
|
||||
vt 0.916667 1.000000
|
||||
vt 0.833333 0.500000
|
||||
vt 0.833333 1.000000
|
||||
vt 0.750000 0.500000
|
||||
vt 0.750000 1.000000
|
||||
vt 0.666667 0.500000
|
||||
vt 0.666667 1.000000
|
||||
vt 0.583333 0.500000
|
||||
vt 0.583333 1.000000
|
||||
vt 0.500000 0.500000
|
||||
vt 0.500000 1.000000
|
||||
vt 0.416667 0.500000
|
||||
vt 0.416667 1.000000
|
||||
vt 0.333333 0.500000
|
||||
vt 0.333333 1.000000
|
||||
vt 0.250000 0.500000
|
||||
vt 0.250000 1.000000
|
||||
vt 0.166667 0.500000
|
||||
vt 0.042154 0.370000
|
||||
vt 0.250000 0.010000
|
||||
vt 0.457846 0.370000
|
||||
vt 0.166667 1.000000
|
||||
vt 0.083333 0.500000
|
||||
vt 0.083333 1.000000
|
||||
vt 0.000000 0.500000
|
||||
vt 0.990000 0.250000
|
||||
vt 0.630000 0.042154
|
||||
vt 0.630000 0.457846
|
||||
vt 0.370000 0.457846
|
||||
vt 0.250000 0.490000
|
||||
vt 0.130000 0.457846
|
||||
vt 0.010000 0.250000
|
||||
vt 0.042154 0.130000
|
||||
vt 0.130000 0.042154
|
||||
vt 0.370000 0.042154
|
||||
vt 0.457846 0.130000
|
||||
vt 0.490000 0.250000
|
||||
vt 0.000000 1.000000
|
||||
vt 0.750000 0.490000
|
||||
vt 0.870000 0.457846
|
||||
vt 0.957846 0.370000
|
||||
vt 0.957846 0.130000
|
||||
vt 0.870000 0.042154
|
||||
vt 0.750000 0.010000
|
||||
vt 0.542154 0.130000
|
||||
vt 0.510000 0.250000
|
||||
vt 0.542154 0.370000
|
||||
s 0
|
||||
f 2/1/1 3/2/1 1/3/1
|
||||
f 4/4/2 5/5/2 3/2/2
|
||||
f 6/6/3 7/7/3 5/5/3
|
||||
f 8/8/4 9/9/4 7/7/4
|
||||
f 10/10/5 11/11/5 9/9/5
|
||||
f 12/12/6 13/13/6 11/11/6
|
||||
f 14/14/7 15/15/7 13/13/7
|
||||
f 16/16/8 17/17/8 15/15/8
|
||||
f 18/18/9 19/19/9 17/17/9
|
||||
f 20/20/10 21/21/10 19/19/10
|
||||
f 22/22/11 14/23/11 6/24/11
|
||||
f 22/25/12 23/26/12 21/21/12
|
||||
f 24/27/13 1/28/13 23/26/13
|
||||
f 7/29/14 15/30/14 23/31/14
|
||||
f 2/1/1 4/4/1 3/2/1
|
||||
f 4/4/2 6/6/2 5/5/2
|
||||
f 6/6/3 8/8/3 7/7/3
|
||||
f 8/8/4 10/10/4 9/9/4
|
||||
f 10/10/5 12/12/5 11/11/5
|
||||
f 12/12/6 14/14/6 13/13/6
|
||||
f 14/14/7 16/16/7 15/15/7
|
||||
f 16/16/8 18/18/8 17/17/8
|
||||
f 18/18/9 20/20/9 19/19/9
|
||||
f 20/20/10 22/25/10 21/21/10
|
||||
f 6/24/11 4/32/11 2/33/11
|
||||
f 2/33/11 24/34/11 22/22/11
|
||||
f 22/22/11 20/35/11 18/36/11
|
||||
f 18/36/11 16/37/11 22/22/11
|
||||
f 16/37/11 14/23/11 22/22/11
|
||||
f 14/23/11 12/38/11 10/39/11
|
||||
f 10/39/11 8/40/11 14/23/11
|
||||
f 8/40/11 6/24/11 14/23/11
|
||||
f 6/24/11 2/33/11 22/22/11
|
||||
f 22/25/12 24/27/12 23/26/12
|
||||
f 24/27/13 2/41/13 1/28/13
|
||||
f 23/31/14 1/42/14 3/43/14
|
||||
f 3/43/14 5/44/14 23/31/14
|
||||
f 5/44/14 7/29/14 23/31/14
|
||||
f 7/29/14 9/45/14 11/46/14
|
||||
f 11/46/14 13/47/14 7/29/14
|
||||
f 13/47/14 15/30/14 7/29/14
|
||||
f 15/30/14 17/48/14 19/49/14
|
||||
f 19/49/14 21/50/14 23/31/14
|
||||
f 15/30/14 19/49/14 23/31/14
|
295
asset-srcs/models/outline.obj
Normal file
|
@ -0,0 +1,295 @@
|
|||
# Blender 4.4.0
|
||||
# www.blender.org
|
||||
mtllib outline.mtl
|
||||
o Cube
|
||||
v -1.000000 -1.000000 1.000000
|
||||
v -1.000000 1.000000 1.000000
|
||||
v -1.000000 -1.000000 -1.000000
|
||||
v -1.000000 1.000000 -1.000000
|
||||
v 1.000000 -1.000000 1.000000
|
||||
v 1.000000 1.000000 1.000000
|
||||
v 1.000000 -1.000000 -1.000000
|
||||
v 1.000000 1.000000 -1.000000
|
||||
v -0.500000 -1.000000 -1.000000
|
||||
v -0.500000 1.000000 -1.000000
|
||||
v -0.500000 -1.000000 1.000000
|
||||
v -0.500000 1.000000 1.000000
|
||||
v 0.500000 1.000000 -1.000000
|
||||
v 0.500000 -1.000000 1.000000
|
||||
v 0.500000 -1.000000 -1.000000
|
||||
v 0.500000 1.000000 1.000000
|
||||
v -1.000000 -1.000000 -0.500000
|
||||
v -1.000000 1.000000 -0.500000
|
||||
v 1.000000 -1.000000 -0.500000
|
||||
v 1.000000 1.000000 -0.500000
|
||||
v -0.500000 1.000000 -0.500000
|
||||
v -0.500000 -1.000000 -0.500000
|
||||
v 0.500000 1.000000 -0.500000
|
||||
v 0.500000 -1.000000 -0.500000
|
||||
v -1.000000 -1.000000 0.500000
|
||||
v 1.000000 1.000000 0.500000
|
||||
v -0.500000 1.000000 0.500000
|
||||
v -0.500000 -1.000000 0.500000
|
||||
v 0.500000 1.000000 0.500000
|
||||
v 0.500000 -1.000000 0.500000
|
||||
v -1.000000 1.000000 0.500000
|
||||
v 1.000000 -1.000000 0.500000
|
||||
v -1.000000 0.500000 1.000000
|
||||
v -1.000000 0.500000 -1.000000
|
||||
v 1.000000 0.500000 -1.000000
|
||||
v 1.000000 0.500000 1.000000
|
||||
v -0.500000 0.500000 1.000000
|
||||
v -0.500000 0.500000 -1.000000
|
||||
v 0.500000 0.500000 1.000000
|
||||
v 0.500000 0.500000 -1.000000
|
||||
v 1.000000 0.500000 -0.500000
|
||||
v -1.000000 0.500000 -0.500000
|
||||
v -1.000000 0.500000 0.500000
|
||||
v 1.000000 0.500000 0.500000
|
||||
v -1.000000 -0.500000 -1.000000
|
||||
v 1.000000 -0.500000 -1.000000
|
||||
v 1.000000 -0.500000 1.000000
|
||||
v -0.500000 -0.500000 1.000000
|
||||
v -0.500000 -0.500000 -1.000000
|
||||
v 0.500000 -0.500000 1.000000
|
||||
v 0.500000 -0.500000 -1.000000
|
||||
v 1.000000 -0.500000 -0.500000
|
||||
v -1.000000 -0.500000 -0.500000
|
||||
v -1.000000 -0.500000 0.500000
|
||||
v 1.000000 -0.500000 0.500000
|
||||
v -1.000000 -0.500000 1.000000
|
||||
v 0.500000 0.500000 0.500000
|
||||
v -0.500000 -0.500000 0.500000
|
||||
v 0.500000 0.500000 -0.500000
|
||||
v 0.500000 -0.500000 -0.500000
|
||||
v -0.500000 -0.500000 -0.500000
|
||||
v 0.500000 -0.500000 0.500000
|
||||
v -0.500000 0.500000 0.500000
|
||||
v -0.500000 0.500000 -0.500000
|
||||
vn -1.0000 -0.0000 -0.0000
|
||||
vn -0.0000 -0.0000 -1.0000
|
||||
vn 1.0000 -0.0000 -0.0000
|
||||
vn -0.0000 -0.0000 1.0000
|
||||
vn -0.0000 -1.0000 -0.0000
|
||||
vn -0.0000 1.0000 -0.0000
|
||||
vt 0.625000 0.187500
|
||||
vt 0.562500 0.250000
|
||||
vt 0.562500 0.187500
|
||||
vt 0.625000 0.437500
|
||||
vt 0.562500 0.500000
|
||||
vt 0.562500 0.437500
|
||||
vt 0.625000 0.687500
|
||||
vt 0.562500 0.750000
|
||||
vt 0.562500 0.687500
|
||||
vt 0.625000 0.937500
|
||||
vt 0.562500 1.000000
|
||||
vt 0.562500 0.937500
|
||||
vt 0.375000 0.687500
|
||||
vt 0.312500 0.750000
|
||||
vt 0.312500 0.687500
|
||||
vt 0.875000 0.687500
|
||||
vt 0.812500 0.750000
|
||||
vt 0.812500 0.687500
|
||||
vt 0.687500 0.750000
|
||||
vt 0.687500 0.687500
|
||||
vt 0.187500 0.687500
|
||||
vt 0.125000 0.750000
|
||||
vt 0.125000 0.687500
|
||||
vt 0.625000 0.812500
|
||||
vt 0.562500 0.812500
|
||||
vt 0.625000 0.250000
|
||||
vt 0.562500 0.312500
|
||||
vt 0.625000 0.750000
|
||||
vt 0.187500 0.750000
|
||||
vt 0.625000 0.312500
|
||||
vt 0.312500 0.500000
|
||||
vt 0.187500 0.562500
|
||||
vt 0.187500 0.500000
|
||||
vt 0.687500 0.500000
|
||||
vt 0.625000 0.562500
|
||||
vt 0.625000 0.500000
|
||||
vt 0.125000 0.562500
|
||||
vt 0.125000 0.500000
|
||||
vt 0.812500 0.500000
|
||||
vt 0.687500 0.562500
|
||||
vt 0.875000 0.500000
|
||||
vt 0.812500 0.562500
|
||||
vt 0.375000 0.500000
|
||||
vt 0.312500 0.562500
|
||||
vt 0.562500 0.562500
|
||||
vt 0.625000 0.062500
|
||||
vt 0.562500 0.062500
|
||||
vt 0.625000 0.000000
|
||||
vt 0.562500 0.000000
|
||||
vt 0.875000 0.562500
|
||||
vt 0.375000 0.562500
|
||||
vt 0.437500 0.562500
|
||||
vt 0.437500 0.062500
|
||||
vt 0.437500 0.000000
|
||||
vt 0.437500 0.500000
|
||||
vt 0.437500 0.437500
|
||||
vt 0.437500 0.812500
|
||||
vt 0.437500 0.750000
|
||||
vt 0.437500 0.312500
|
||||
vt 0.437500 0.250000
|
||||
vt 0.437500 1.000000
|
||||
vt 0.437500 0.937500
|
||||
vt 0.437500 0.687500
|
||||
vt 0.437500 0.187500
|
||||
vt 0.375000 0.250000
|
||||
vt 0.375000 0.187500
|
||||
vt 0.375000 0.437500
|
||||
vt 0.375000 0.750000
|
||||
vt 0.375000 1.000000
|
||||
vt 0.375000 0.937500
|
||||
vt 0.375000 0.812500
|
||||
vt 0.375000 0.312500
|
||||
vt 0.375000 0.062500
|
||||
vt 0.375000 0.000000
|
||||
vt 0.625000 1.000000
|
||||
vt 0.875000 0.750000
|
||||
s 0
|
||||
f 18/1/1 34/2/1 42/3/1
|
||||
f 13/4/2 35/5/2 40/6/2
|
||||
f 26/7/3 36/8/3 44/9/3
|
||||
f 12/10/4 33/11/4 37/12/4
|
||||
f 32/13/5 14/14/5 30/15/5
|
||||
f 31/16/6 12/17/6 27/18/6
|
||||
f 27/18/6 16/19/6 29/20/6
|
||||
f 28/21/5 1/22/5 25/23/5
|
||||
f 16/24/4 37/12/4 39/25/4
|
||||
f 4/26/2 38/27/2 34/2/2
|
||||
f 6/28/4 39/25/4 36/8/4
|
||||
f 29/20/6 6/28/6 26/7/6
|
||||
f 30/15/5 11/29/5 28/21/5
|
||||
f 10/30/2 40/6/2 38/27/2
|
||||
f 15/31/5 22/32/5 9/33/5
|
||||
f 13/34/6 20/35/6 8/36/6
|
||||
f 9/33/5 17/37/5 3/38/5
|
||||
f 10/39/6 23/40/6 13/34/6
|
||||
f 4/41/6 21/42/6 10/39/6
|
||||
f 7/43/5 24/44/5 15/31/5
|
||||
f 8/36/3 41/45/3 35/5/3
|
||||
f 31/46/1 42/3/1 43/47/1
|
||||
f 2/48/1 43/47/1 33/49/1
|
||||
f 28/21/2 62/15/2 30/15/2
|
||||
f 23/40/6 26/7/6 20/35/6
|
||||
f 22/32/5 25/23/5 17/37/5
|
||||
f 27/18/3 64/42/3 21/42/3
|
||||
f 18/50/6 27/18/6 21/42/6
|
||||
f 19/51/5 30/15/5 24/44/5
|
||||
f 20/35/3 44/9/3 41/45/3
|
||||
f 41/45/4 60/52/4 52/52/4
|
||||
f 33/49/1 54/53/1 56/54/1
|
||||
f 43/47/2 58/53/2 54/53/2
|
||||
f 35/5/3 52/52/3 46/55/3
|
||||
f 51/56/1 59/6/1 40/6/1
|
||||
f 36/8/4 50/57/4 47/58/4
|
||||
f 34/2/2 49/59/2 45/60/2
|
||||
f 39/25/1 62/57/1 50/57/1
|
||||
f 37/12/4 56/61/4 48/62/4
|
||||
f 44/9/3 47/58/3 55/63/3
|
||||
f 40/6/2 46/55/2 51/56/2
|
||||
f 42/3/1 45/60/1 53/64/1
|
||||
f 53/64/1 3/65/1 17/66/1
|
||||
f 51/56/2 7/43/2 15/67/2
|
||||
f 55/63/3 5/68/3 32/13/3
|
||||
f 48/62/4 1/69/4 11/70/4
|
||||
f 50/57/4 11/70/4 14/71/4
|
||||
f 45/60/2 9/72/2 3/65/2
|
||||
f 47/58/4 14/71/4 5/68/4
|
||||
f 49/59/2 15/67/2 9/72/2
|
||||
f 46/55/3 19/51/3 7/43/3
|
||||
f 54/53/1 17/66/1 25/73/1
|
||||
f 56/54/1 25/73/1 1/74/1
|
||||
f 52/52/3 32/13/3 19/51/3
|
||||
f 50/57/6 58/62/6 48/62/6
|
||||
f 48/62/3 63/12/3 37/12/3
|
||||
f 37/12/5 57/25/5 39/25/5
|
||||
f 52/52/6 62/63/6 55/63/6
|
||||
f 44/9/5 59/45/5 41/45/5
|
||||
f 55/63/2 57/9/2 44/9/2
|
||||
f 38/27/3 61/59/3 49/59/3
|
||||
f 40/6/5 64/27/5 38/27/5
|
||||
f 49/59/6 60/56/6 51/56/6
|
||||
f 29/20/2 63/18/2 27/18/2
|
||||
f 21/42/4 59/40/4 23/40/4
|
||||
f 23/40/1 57/20/1 29/20/1
|
||||
f 30/15/1 60/44/1 24/44/1
|
||||
f 24/44/4 61/32/4 22/32/4
|
||||
f 22/32/3 58/21/3 28/21/3
|
||||
f 42/3/5 63/47/5 43/47/5
|
||||
f 54/53/6 61/64/6 53/64/6
|
||||
f 53/64/4 64/3/4 42/3/4
|
||||
f 18/1/1 4/26/1 34/2/1
|
||||
f 13/4/2 8/36/2 35/5/2
|
||||
f 26/7/3 6/28/3 36/8/3
|
||||
f 12/10/4 2/75/4 33/11/4
|
||||
f 32/13/5 5/68/5 14/14/5
|
||||
f 31/16/6 2/76/6 12/17/6
|
||||
f 27/18/6 12/17/6 16/19/6
|
||||
f 28/21/5 11/29/5 1/22/5
|
||||
f 16/24/4 12/10/4 37/12/4
|
||||
f 4/26/2 10/30/2 38/27/2
|
||||
f 6/28/4 16/24/4 39/25/4
|
||||
f 29/20/6 16/19/6 6/28/6
|
||||
f 30/15/5 14/14/5 11/29/5
|
||||
f 10/30/2 13/4/2 40/6/2
|
||||
f 15/31/5 24/44/5 22/32/5
|
||||
f 13/34/6 23/40/6 20/35/6
|
||||
f 9/33/5 22/32/5 17/37/5
|
||||
f 10/39/6 21/42/6 23/40/6
|
||||
f 4/41/6 18/50/6 21/42/6
|
||||
f 7/43/5 19/51/5 24/44/5
|
||||
f 8/36/3 20/35/3 41/45/3
|
||||
f 31/46/1 18/1/1 42/3/1
|
||||
f 2/48/1 31/46/1 43/47/1
|
||||
f 28/21/2 58/21/2 62/15/2
|
||||
f 23/40/6 29/20/6 26/7/6
|
||||
f 22/32/5 28/21/5 25/23/5
|
||||
f 27/18/3 63/18/3 64/42/3
|
||||
f 18/50/6 31/16/6 27/18/6
|
||||
f 19/51/5 32/13/5 30/15/5
|
||||
f 20/35/3 26/7/3 44/9/3
|
||||
f 41/45/4 59/45/4 60/52/4
|
||||
f 33/49/1 43/47/1 54/53/1
|
||||
f 43/47/2 63/47/2 58/53/2
|
||||
f 35/5/3 41/45/3 52/52/3
|
||||
f 51/56/1 60/56/1 59/6/1
|
||||
f 36/8/4 39/25/4 50/57/4
|
||||
f 34/2/2 38/27/2 49/59/2
|
||||
f 39/25/1 57/25/1 62/57/1
|
||||
f 37/12/4 33/11/4 56/61/4
|
||||
f 44/9/3 36/8/3 47/58/3
|
||||
f 40/6/2 35/5/2 46/55/2
|
||||
f 42/3/1 34/2/1 45/60/1
|
||||
f 53/64/1 45/60/1 3/65/1
|
||||
f 51/56/2 46/55/2 7/43/2
|
||||
f 55/63/3 47/58/3 5/68/3
|
||||
f 48/62/4 56/61/4 1/69/4
|
||||
f 50/57/4 48/62/4 11/70/4
|
||||
f 45/60/2 49/59/2 9/72/2
|
||||
f 47/58/4 50/57/4 14/71/4
|
||||
f 49/59/2 51/56/2 15/67/2
|
||||
f 46/55/3 52/52/3 19/51/3
|
||||
f 54/53/1 53/64/1 17/66/1
|
||||
f 56/54/1 54/53/1 25/73/1
|
||||
f 52/52/3 55/63/3 32/13/3
|
||||
f 50/57/6 62/57/6 58/62/6
|
||||
f 48/62/3 58/62/3 63/12/3
|
||||
f 37/12/5 63/12/5 57/25/5
|
||||
f 52/52/6 60/52/6 62/63/6
|
||||
f 44/9/5 57/9/5 59/45/5
|
||||
f 55/63/2 62/63/2 57/9/2
|
||||
f 38/27/3 64/27/3 61/59/3
|
||||
f 40/6/5 59/6/5 64/27/5
|
||||
f 49/59/6 61/59/6 60/56/6
|
||||
f 29/20/2 57/20/2 63/18/2
|
||||
f 21/42/4 64/42/4 59/40/4
|
||||
f 23/40/1 59/40/1 57/20/1
|
||||
f 30/15/1 62/15/1 60/44/1
|
||||
f 24/44/4 60/44/4 61/32/4
|
||||
f 22/32/3 61/32/3 58/21/3
|
||||
f 42/3/5 64/3/5 63/47/5
|
||||
f 54/53/6 58/53/6 61/64/6
|
||||
f 53/64/4 61/64/4 64/3/4
|
1627
asset-srcs/models/sphere.obj
Normal file
36
asset-srcs/models/wedge.obj
Normal file
|
@ -0,0 +1,36 @@
|
|||
# Blender 4.4.3
|
||||
# www.blender.org
|
||||
mtllib wedge.mtl
|
||||
o Cube
|
||||
v 1.000000 -1.000000 -1.000000
|
||||
v 1.000000 1.000000 1.000000
|
||||
v 1.000000 -1.000000 1.000000
|
||||
v -1.000000 -1.000000 -1.000000
|
||||
v -1.000000 1.000000 1.000000
|
||||
v -1.000000 -1.000000 1.000000
|
||||
vn -0.0000 -0.0000 1.0000
|
||||
vn -1.0000 -0.0000 -0.0000
|
||||
vn -0.0000 -1.0000 -0.0000
|
||||
vn 1.0000 -0.0000 -0.0000
|
||||
vn -0.0000 0.7071 -0.7071
|
||||
vt 0.625000 0.750000
|
||||
vt 0.375000 1.000000
|
||||
vt 0.375000 0.750000
|
||||
vt 0.375000 0.000000
|
||||
vt 0.625000 0.000000
|
||||
vt 0.375000 0.250000
|
||||
vt 0.375000 0.500000
|
||||
vt 0.125000 0.750000
|
||||
vt 0.125000 0.500000
|
||||
vt 0.875000 0.750000
|
||||
vt 0.625000 1.000000
|
||||
s 0
|
||||
usemtl Material
|
||||
f 2/1/1 6/2/1 3/3/1
|
||||
f 6/4/2 5/5/2 4/6/2
|
||||
f 1/7/3 6/8/3 4/9/3
|
||||
f 1/7/4 2/1/4 3/3/4
|
||||
f 5/10/5 1/7/5 4/6/5
|
||||
f 2/1/1 5/11/1 6/2/1
|
||||
f 1/7/3 3/3/3 6/8/3
|
||||
f 5/10/5 2/1/5 1/7/5
|
16
assets/font/AUTHORS
Normal file
|
@ -0,0 +1,16 @@
|
|||
AUTHORS
|
||||
|
||||
Current Contributors (sorted alphabetically):
|
||||
|
||||
- Vishal Vijayraghavan <vishalvvr at fedoraproject dot org>
|
||||
Project Owner/ Maintainer (Current)
|
||||
Red Hat, Inc.
|
||||
|
||||
Previous Contributors
|
||||
- Pravin Satpute <psatpute at redhat dot com>
|
||||
Project Owner/ Maintainer
|
||||
Red Hat, Inc.
|
||||
|
||||
- Steve Matteson
|
||||
Original Designer
|
||||
Ascender, Inc.
|
102
assets/font/LICENSE
Normal file
|
@ -0,0 +1,102 @@
|
|||
Digitized data copyright (c) 2010 Google Corporation
|
||||
with Reserved Font Arimo, Tinos and Cousine.
|
||||
Copyright (c) 2012 Red Hat, Inc.
|
||||
with Reserved Font Name Liberation.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License,
|
||||
Version 1.1.
|
||||
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
|
||||
PREAMBLE The goals of the Open Font License (OFL) are to stimulate
|
||||
worldwide development of collaborative font projects, to support the font
|
||||
creation efforts of academic and linguistic communities, and to provide
|
||||
a free and open framework in which fonts may be shared and improved in
|
||||
partnership with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves.
|
||||
The fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply to
|
||||
any document created using the fonts or their derivatives.
|
||||
|
||||
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such.
|
||||
This may include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components
|
||||
as distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting ? in part or in whole ?
|
||||
any of the components of the Original Version, by changing formats or
|
||||
by porting the Font Software to a new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical writer
|
||||
or other person who contributed to the Font Software.
|
||||
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,in
|
||||
Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the
|
||||
corresponding Copyright Holder. This restriction only applies to the
|
||||
primary font name as presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole, must
|
||||
be distributed entirely under this license, and must not be distributed
|
||||
under any other license. The requirement for fonts to remain under
|
||||
this license does not apply to any document created using the Font
|
||||
Software.
|
||||
|
||||
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are not met.
|
||||
|
||||
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER
|
||||
DEALINGS IN THE FONT SOFTWARE.
|
||||
|
BIN
assets/font/LiberationMono-Bold.ttf
Normal file
BIN
assets/font/LiberationMono-BoldItalic.ttf
Normal file
BIN
assets/font/LiberationMono-Italic.ttf
Normal file
BIN
assets/font/LiberationMono-Regular.ttf
Normal file
BIN
assets/font/LiberationSans-Bold.ttf
Normal file
BIN
assets/font/LiberationSans-BoldItalic.ttf
Normal file
BIN
assets/font/LiberationSans-Italic.ttf
Normal file
BIN
assets/font/LiberationSans-Regular.ttf
Normal file
BIN
assets/font/LiberationSerif-Bold.ttf
Normal file
BIN
assets/font/LiberationSerif-BoldItalic.ttf
Normal file
BIN
assets/font/LiberationSerif-Italic.ttf
Normal file
BIN
assets/font/LiberationSerif-Regular.ttf
Normal file
1
assets/icons/editor/actions/48/NOTE.txt
Normal file
|
@ -0,0 +1 @@
|
|||
Icons transform-move, transform-scale, and transform-rotate were modified from silk icons by maelstrom
|
BIN
assets/icons/editor/actions/48/edit-redo.png
Normal file
After Width: | Height: | Size: 625 B |
BIN
assets/icons/editor/actions/48/edit-undo.png
Normal file
After Width: | Height: | Size: 631 B |
BIN
assets/icons/editor/actions/48/object-group.png
Normal file
After Width: | Height: | Size: 553 B |
BIN
assets/icons/editor/actions/48/object-ungroup.png
Normal file
After Width: | Height: | Size: 666 B |
BIN
assets/icons/editor/actions/48/transform-move.png
Normal file
After Width: | Height: | Size: 355 B |
BIN
assets/icons/editor/actions/48/transform-rotate.png
Normal file
After Width: | Height: | Size: 443 B |
BIN
assets/icons/editor/actions/48/transform-scale.png
Normal file
After Width: | Height: | Size: 512 B |
BIN
assets/icons/message.png
Normal file
After Width: | Height: | Size: 413 B |
22
assets/shaders/debug/debugfont.fs
Normal file
|
@ -0,0 +1,22 @@
|
|||
#version 330 core
|
||||
|
||||
out vec4 FragColor;
|
||||
in vec3 vPos;
|
||||
in vec2 vTexCoord;
|
||||
|
||||
uniform sampler2D fontTex;
|
||||
uniform int charIndex;
|
||||
|
||||
// Main
|
||||
|
||||
void main() {
|
||||
int x = (charIndex-32) % 16;
|
||||
int y = (charIndex-32) / 16;
|
||||
|
||||
float fx = float(x) / 16;
|
||||
float fy = float(y) / 8;
|
||||
|
||||
vec4 color = texture(fontTex, vec2(fx, fy) + vTexCoord * vec2(1.f/32, 1.f/16));
|
||||
FragColor = vec3(color) == vec3(0, 0, 0) ? vec4(0, 0, 0, 0) : color;
|
||||
// FragColor = color;
|
||||
}
|
12
assets/shaders/debug/debugfont.vs
Normal file
|
@ -0,0 +1,12 @@
|
|||
#version 330 core
|
||||
in vec3 aPos;
|
||||
in vec2 aTexCoord;
|
||||
|
||||
out vec3 vPos;
|
||||
out vec2 vTexCoord;
|
||||
void main()
|
||||
{
|
||||
gl_Position = vec4(aPos, 1.0);
|
||||
vPos = aPos;
|
||||
vTexCoord = aTexCoord;
|
||||
}
|
|
@ -1,22 +1,14 @@
|
|||
// https://learnopengl.com/In-Practice/Text-Rendering
|
||||
|
||||
#version 330 core
|
||||
in vec2 TexCoords;
|
||||
out vec4 color;
|
||||
|
||||
out vec4 FragColor;
|
||||
in vec3 vPos;
|
||||
in vec2 vTexCoord;
|
||||
uniform sampler2D text;
|
||||
uniform vec3 textColor;
|
||||
|
||||
uniform sampler2D fontTex;
|
||||
uniform int charIndex;
|
||||
|
||||
// Main
|
||||
|
||||
void main() {
|
||||
int x = (charIndex-32) % 16;
|
||||
int y = (charIndex-32) / 16;
|
||||
|
||||
float fx = float(x) / 16;
|
||||
float fy = float(y) / 8;
|
||||
|
||||
vec4 color = texture(fontTex, vec2(fx, fy) + vTexCoord * vec2(1.f/32, 1.f/16));
|
||||
FragColor = vec3(color) == vec3(0, 0, 0) ? vec4(0, 0, 0, 0) : color;
|
||||
// FragColor = color;
|
||||
}
|
||||
void main()
|
||||
{
|
||||
vec4 sampled = vec4(1.0, 1.0, 1.0, texture(text, TexCoords).r);
|
||||
color = vec4(textColor, 1.0) * sampled;
|
||||
}
|
|
@ -1,12 +1,13 @@
|
|||
#version 330 core
|
||||
in vec3 aPos;
|
||||
in vec2 aTexCoord;
|
||||
// https://learnopengl.com/In-Practice/Text-Rendering
|
||||
|
||||
#version 330 core
|
||||
layout (location = 0) in vec4 vertex; // <vec2 pos, vec2 tex>
|
||||
out vec2 TexCoords;
|
||||
|
||||
uniform mat4 projection;
|
||||
|
||||
out vec3 vPos;
|
||||
out vec2 vTexCoord;
|
||||
void main()
|
||||
{
|
||||
gl_Position = vec4(aPos, 1.0);
|
||||
vPos = aPos;
|
||||
vTexCoord = aTexCoord;
|
||||
}
|
||||
gl_Position = projection * vec4(vertex.xy, 0.0, 1.0);
|
||||
TexCoords = vertex.zw;
|
||||
}
|
12
assets/shaders/generic2d.fs
Normal file
|
@ -0,0 +1,12 @@
|
|||
#version 330 core
|
||||
|
||||
// I/O
|
||||
|
||||
out vec4 fColor;
|
||||
uniform vec4 aColor;
|
||||
|
||||
// Main
|
||||
|
||||
void main() {
|
||||
fColor = aColor;
|
||||
}
|
10
assets/shaders/generic2d.vs
Normal file
|
@ -0,0 +1,10 @@
|
|||
#version 330 core
|
||||
layout (location = 0) in vec2 aPos;
|
||||
layout (location = 1) in vec2 aTexCoords;
|
||||
|
||||
uniform mat4 projection;
|
||||
uniform mat4 model;
|
||||
|
||||
void main() {
|
||||
gl_Position = projection * model * vec4(aPos, 0.0, 1);
|
||||
}
|
|
@ -54,11 +54,14 @@ uniform int numPointLights;
|
|||
uniform DirLight sunLight;
|
||||
uniform Material material;
|
||||
uniform sampler2DArray studs;
|
||||
uniform samplerCube skybox;
|
||||
uniform float transparency;
|
||||
uniform float reflectance;
|
||||
uniform vec3 texScale;
|
||||
|
||||
// Functions
|
||||
|
||||
// Functions
|
||||
vec3 calculateReflection();
|
||||
vec3 calculateDirectionalLight(DirLight light);
|
||||
vec3 calculatePointLight(PointLight light);
|
||||
mat3 lookAlong(vec3 pos, vec3 forward, vec3 up);
|
||||
|
@ -68,6 +71,7 @@ mat3 lookAlong(vec3 pos, vec3 forward, vec3 up);
|
|||
void main() {
|
||||
vec3 result = vec3(0.0);
|
||||
|
||||
result += calculateReflection();
|
||||
result += calculateDirectionalLight(sunLight);
|
||||
|
||||
for (int i = 0; i < numPointLights; i++) {
|
||||
|
@ -95,6 +99,25 @@ mat3 lookAlong(vec3 pos, vec3 forward, vec3 up) {
|
|||
return mat3(s, u, f);
|
||||
}
|
||||
|
||||
|
||||
vec3 sampleSkybox()
|
||||
{
|
||||
vec3 norm = normalize(vNormal);
|
||||
vec3 viewDir = normalize(viewPos - vPos);
|
||||
vec3 reflectDir = reflect(-viewDir, norm);
|
||||
|
||||
return textureLod(skybox,reflectDir, 5.0 * (1.0-material.shininess)).rgb;
|
||||
}
|
||||
|
||||
vec3 calculateReflection() {
|
||||
vec3 norm = normalize(vNormal);
|
||||
vec3 viewDir = normalize(viewPos - vPos);
|
||||
vec3 reflectDir = reflect(viewDir, norm);
|
||||
float fresnel = (pow(1.0-max(dot(viewDir, norm), 0.0), 5.0));
|
||||
vec3 result = sampleSkybox() * mix(/* TEMPORARY: will be replaced by setting */ 0 * /* /TEMPORARY */ fresnel * material.specular, vec3(1.0), reflectance);
|
||||
return result;
|
||||
}
|
||||
|
||||
vec3 calculateDirectionalLight(DirLight light) {
|
||||
// Calculate diffuse
|
||||
vec3 norm = normalize(vNormal);
|
||||
|
@ -105,10 +128,13 @@ vec3 calculateDirectionalLight(DirLight light) {
|
|||
vec3 viewDir = normalize(viewPos - vPos);
|
||||
vec3 reflectDir = reflect(-lightDir, norm);
|
||||
float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
|
||||
// float fresnel = (pow(1.0-max(dot(viewDir, norm), 0.0), 5.0));
|
||||
|
||||
vec3 ambient = light.ambient * material.diffuse;
|
||||
vec3 diffuse = light.diffuse * diff * material.diffuse;
|
||||
|
||||
vec3 ambient = light.ambient * (material.diffuse * (1.0-reflectance));
|
||||
vec3 diffuse = light.diffuse * diff * (material.diffuse * (1.0-reflectance));
|
||||
vec3 specular = light.specular * spec * material.specular;
|
||||
// specular += sampleSkybox() * fresnel * material.specular;
|
||||
|
||||
return (ambient + diffuse + specular);
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ const int FaceBack = 2;
|
|||
const int FaceLeft = 3;
|
||||
const int FaceBottom = 4;
|
||||
const int FaceFront = 5;
|
||||
const int FaceNone = 6;
|
||||
|
||||
const int SurfaceSmooth = 0;
|
||||
const int SurfaceGlue = 1;
|
||||
|
@ -31,6 +32,8 @@ uniform mat4 projection;
|
|||
uniform int surfaces[6];
|
||||
uniform vec3 texScale;
|
||||
|
||||
const float faceThreshold = sqrt(2)/2;
|
||||
|
||||
void main()
|
||||
{
|
||||
gl_Position = projection * view * model * vec4(aPos, 1.0);
|
||||
|
@ -38,12 +41,20 @@ void main()
|
|||
lPos = aPos;
|
||||
vNormal = normalMatrix * aNormal;
|
||||
lNormal = aNormal;
|
||||
int vFace = aNormal == vec3(0,1,0) ? FaceTop :
|
||||
aNormal == vec3(0, -1, 0) ? FaceBottom :
|
||||
aNormal == vec3(1, 0, 0) ? FaceRight :
|
||||
aNormal == vec3(-1, 0, 0) ? FaceLeft :
|
||||
aNormal == vec3(0, 0, -1) ? FaceFront :
|
||||
aNormal == vec3(0, 0, 1) ? FaceBack : -1;
|
||||
int vFace = FaceNone;
|
||||
|
||||
if (dot(vec3(0, 1, 0), aNormal) > faceThreshold)
|
||||
vFace = FaceTop;
|
||||
else if (dot(vec3(0, -1, 0), aNormal) > faceThreshold)
|
||||
vFace = FaceBottom;
|
||||
else if (dot(vec3(1, 0, 0), aNormal) > faceThreshold)
|
||||
vFace = FaceRight;
|
||||
else if (dot(vec3(-1, 0, 0), aNormal) > faceThreshold)
|
||||
vFace = FaceLeft;
|
||||
else if (dot(vec3(0, 0, -1), aNormal) > faceThreshold)
|
||||
vFace = FaceFront;
|
||||
else if (dot(vec3(0, 0, 1), aNormal) > faceThreshold)
|
||||
vFace = FaceBack;
|
||||
|
||||
vSurfaceZ = surfaces[vFace];
|
||||
if (surfaces[vFace] > SurfaceUniversal) vSurfaceZ = 0;
|
||||
|
|
|
@ -26,6 +26,7 @@ int processHeader(fs::path srcRoot, fs::path srcPath, fs::path outPath) {
|
|||
std::string srcRootStr = string_of(srcRoot);
|
||||
std::string srcPathStr = string_of(srcPath);
|
||||
std::string outPathStr = string_of(outPath);
|
||||
std::string logFileStr = outPathStr + ".log";
|
||||
|
||||
const char* cargs[] = { "-xc++", "-std=c++17", "-I", srcRootStr.c_str(), "-D__AUTOGEN__", 0 };
|
||||
// THANK YOU SO MUCH THIS STACKOVERFLOW ANSWER IS SO HELPFUL
|
||||
|
@ -42,17 +43,26 @@ int processHeader(fs::path srcRoot, fs::path srcPath, fs::path outPath) {
|
|||
return 1;
|
||||
}
|
||||
|
||||
fs::create_directories(outPath.parent_path()); // Make sure generated dir exists before we try writing to it
|
||||
|
||||
// We write to a special log file instead of stdout/stderr to
|
||||
// 1. avoid confusion
|
||||
// 2. prevent MSBuild from reading the word "error" and detecting there's a problem with the program (there isn't)
|
||||
FILE* logout = fopen(logFileStr.c_str(), "w");
|
||||
|
||||
// Print errors
|
||||
int ndiags = clang_getNumDiagnostics(unit);
|
||||
for (int i = 0; i < ndiags; i++) {
|
||||
CXDiagnostic diag = clang_getDiagnostic(unit, i);
|
||||
CXString str = clang_formatDiagnostic(diag, 0);
|
||||
fprintf(stderr, "diag: %s\n", clang_getCString(str));
|
||||
fprintf(logout, "diag: %s\n", clang_getCString(str));
|
||||
|
||||
clang_disposeString(str);
|
||||
clang_disposeDiagnostic(diag);
|
||||
}
|
||||
|
||||
fclose(logout);
|
||||
|
||||
CXCursor cursor = clang_getTranslationUnitCursor(unit);
|
||||
|
||||
object::AnalysisState objectAnlyState;
|
||||
|
@ -66,8 +76,6 @@ int processHeader(fs::path srcRoot, fs::path srcPath, fs::path outPath) {
|
|||
data::analyzeClasses(cursor, srcRootStr, &dataAnlyState);
|
||||
enum_::analyzeClasses(cursor, srcRootStr, &enumAnlyState);
|
||||
|
||||
fs::create_directories(outPath.parent_path()); // Make sure generated dir exists before we try writing to it
|
||||
|
||||
printf("[AUTOGEN] Generating file %s...\n", relpathStr.c_str());
|
||||
std::ofstream outStream(outPathStr);
|
||||
|
||||
|
@ -104,5 +112,7 @@ int main(int argc, char** argv) {
|
|||
fs::path srcPath = argv[2];
|
||||
fs::path outPath = argv[3];
|
||||
|
||||
// fprintf(stderr, "Some error here\n");
|
||||
// return 0;
|
||||
return processHeader(srcRoot, srcPath, outPath);
|
||||
}
|
|
@ -1,8 +1,24 @@
|
|||
find_package(SDL2 REQUIRED)
|
||||
include_directories(${SDL2_INCLUDE_DIRS})
|
||||
|
||||
find_package(glfw3 REQUIRED)
|
||||
include(${CMAKE_CURRENT_SOURCE_DIR}/deps.cmake)
|
||||
|
||||
add_executable(client "src/main.cpp")
|
||||
target_link_libraries(client PRIVATE ${SDL2_LIBRARIES} openblocks glfw)
|
||||
add_dependencies(client openblocks)
|
||||
target_link_libraries(client PRIVATE openblocks glfw)
|
||||
add_dependencies(client openblocks)
|
||||
|
||||
if(WIN32)
|
||||
# Copy assets
|
||||
add_custom_command(
|
||||
TARGET client POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_directory
|
||||
${CMAKE_SOURCE_DIR}/assets
|
||||
$<TARGET_FILE_DIR:client>/assets)
|
||||
endif()
|
||||
|
||||
set_target_properties(client PROPERTIES
|
||||
WIN32_EXECUTABLE ON
|
||||
)
|
||||
|
||||
# https://stackoverflow.com/a/73899349/16255372
|
||||
if (WIN32)
|
||||
# /ENTRY:mainCRTStartup keeps the same "main" function instead of requiring "WinMain"
|
||||
target_link_options(client PRIVATE "/ENTRY:mainCRTStartup")
|
||||
endif()
|
12
client/deps.cmake
Normal file
|
@ -0,0 +1,12 @@
|
|||
# Declare/fetch packages
|
||||
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
glfw3
|
||||
GIT_REPOSITORY https://github.com/glfw/glfw
|
||||
GIT_TAG 3.4
|
||||
)
|
||||
|
||||
FetchContent_MakeAvailable(glfw3)
|
||||
|
||||
# Find/include packages
|
|
@ -1,8 +1,11 @@
|
|||
#include <GL/glew.h>
|
||||
#include <glad/gl.h>
|
||||
#include <GLFW/glfw3.h>
|
||||
#include "objects/part.h"
|
||||
#include "logger.h"
|
||||
#include "objects/part/part.h"
|
||||
#include "panic.h"
|
||||
#include "rendering/renderer.h"
|
||||
#include "common.h"
|
||||
#include "version.h"
|
||||
|
||||
void errorCatcher(int id, const char* str);
|
||||
|
||||
|
@ -15,26 +18,37 @@ void mouseCallback(GLFWwindow* window, double xpos, double ypos);
|
|||
void mouseButtonCallback(GLFWwindow* window, int button, int action, int mods);
|
||||
void resizeCallback(GLFWwindow* window, int width, int height);
|
||||
|
||||
std::shared_ptr<Part> lastPart;
|
||||
std::shared_ptr<BasePart> lastPart;
|
||||
|
||||
int main() {
|
||||
Logger::init();
|
||||
|
||||
glfwSetErrorCallback(errorCatcher);
|
||||
|
||||
std::string title = std::string() + "Openblocks Client " + BUILD_VERSION;
|
||||
|
||||
glfwInit();
|
||||
glfwWindowHint(GLFW_SAMPLES, 4);
|
||||
GLFWwindow *window = glfwCreateWindow(1200, 900, "OpenBlocks Client ALPHA", NULL, NULL);
|
||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE); // Valid only in OpenGL 3.2+, see: https://stackoverflow.com/a/70519392/16255372
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
||||
GLFWwindow *window = glfwCreateWindow(1200, 900, title.c_str(), NULL, NULL);
|
||||
glfwSetKeyCallback(window, keyCallback);
|
||||
glfwSetMouseButtonCallback(window, mouseButtonCallback);
|
||||
glfwSetCursorPosCallback(window, mouseCallback);
|
||||
glfwSetFramebufferSizeCallback(window, resizeCallback);
|
||||
|
||||
glfwMakeContextCurrent(window);
|
||||
glewInit();
|
||||
int version = gladLoadGL(glfwGetProcAddress);
|
||||
if (version == 0) {
|
||||
Logger::fatalError("Failed to initialize OpenGL context");
|
||||
panic();
|
||||
} else {
|
||||
Logger::debugf("Initialized GL context version %d.%d", GLAD_VERSION_MAJOR(version), GLAD_VERSION_MINOR(version));
|
||||
}
|
||||
|
||||
gDataModel->Init();
|
||||
renderInit(window, 1200, 900);
|
||||
renderInit(1200, 900);
|
||||
|
||||
// Baseplate
|
||||
gWorkspace()->AddChild(Part::New({
|
||||
|
@ -55,7 +69,7 @@ int main() {
|
|||
|
||||
for (std::shared_ptr<Instance> inst : gWorkspace()->GetChildren()) {
|
||||
if (inst->GetClass()->className != "Part") continue;
|
||||
std::shared_ptr<Part> part = std::dynamic_pointer_cast<Part>(inst);
|
||||
std::shared_ptr<BasePart> part = std::dynamic_pointer_cast<BasePart>(inst);
|
||||
gWorkspace()->SyncPartPhysics(part);
|
||||
}
|
||||
|
||||
|
@ -66,7 +80,7 @@ int main() {
|
|||
|
||||
processInput(window);
|
||||
gWorkspace()->PhysicsStep(deltaTime);
|
||||
render(window);
|
||||
render();
|
||||
|
||||
glfwSwapBuffers(window);
|
||||
glfwPollEvents();
|
||||
|
@ -77,7 +91,7 @@ int main() {
|
|||
}
|
||||
|
||||
void errorCatcher(int id, const char* str) {
|
||||
Logger::fatalError(std::format("GLFW Error: [{}] {}", id, str));
|
||||
Logger::fatalErrorf("GLFW Error: [%d] %s", id, str);
|
||||
}
|
||||
|
||||
float lastTime;
|
||||
|
@ -93,6 +107,10 @@ void processInput(GLFWwindow* window) {
|
|||
camera.processMovement(DIRECTION_LEFT, deltaTime);
|
||||
if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS)
|
||||
camera.processMovement(DIRECTION_RIGHT, deltaTime);
|
||||
if (glfwGetKey(window, GLFW_KEY_E) == GLFW_PRESS)
|
||||
camera.processMovement(DIRECTION_UP, deltaTime);
|
||||
if (glfwGetKey(window, GLFW_KEY_Q) == GLFW_PRESS)
|
||||
camera.processMovement(DIRECTION_DOWN, deltaTime);
|
||||
if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS)
|
||||
camera.processMovement(DIRECTION_UP, deltaTime);
|
||||
if (glfwGetKey(window, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS)
|
||||
|
@ -144,6 +162,7 @@ void mouseButtonCallback(GLFWwindow* window, int button, int action, int mods) {
|
|||
}
|
||||
}
|
||||
|
||||
bool doDebugRender = false;
|
||||
void keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) {
|
||||
if (key == GLFW_KEY_F && action == GLFW_PRESS) {
|
||||
gWorkspace()->AddChild(lastPart = Part::New({
|
||||
|
@ -187,6 +206,8 @@ void keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods
|
|||
if (key == GLFW_KEY_M && action == GLFW_PRESS) mode = 0;
|
||||
if (key == GLFW_KEY_E && action == GLFW_PRESS) mode = 1; // Enlarge
|
||||
if (key == GLFW_KEY_R && action == GLFW_PRESS) mode = 2;
|
||||
|
||||
if (key == GLFW_KEY_LEFT_BRACKET && action == GLFW_PRESS) setDebugRendererEnabled(doDebugRender = !doDebugRender);
|
||||
}
|
||||
|
||||
void resizeCallback(GLFWwindow* window, int width, int height) {
|
||||
|
|
23
cmake/CPM.cmake
Normal file
|
@ -0,0 +1,23 @@
|
|||
set(CPM_DOWNLOAD_VERSION 0.42.0)
|
||||
# Patch support is broken in CPM upstream atm, so we have to use a fork
|
||||
set(CPM_HASH_SUM "f7d92592a257d184fd8de6fb496a711ce393676ed68999b96043aab2e5e6f9e6")
|
||||
# set(CPM_HASH_SUM "2020b4fc42dba44817983e06342e682ecfc3d2f484a581f11cc5731fbe4dce8a")
|
||||
|
||||
if(CPM_SOURCE_CACHE)
|
||||
set(CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
|
||||
elseif(DEFINED ENV{CPM_SOURCE_CACHE})
|
||||
set(CPM_DOWNLOAD_LOCATION "$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
|
||||
else()
|
||||
set(CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
|
||||
endif()
|
||||
|
||||
# Expand relative path. This is important if the provided path contains a tilde (~)
|
||||
get_filename_component(CPM_DOWNLOAD_LOCATION ${CPM_DOWNLOAD_LOCATION} ABSOLUTE)
|
||||
|
||||
file(DOWNLOAD
|
||||
https://raw.githubusercontent.com/BohdanBuinich/CPM.cmake/refs/heads/feat/fix_patch_command/cmake/CPM.cmake
|
||||
# https://github.com/cpm-cmake/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake
|
||||
${CPM_DOWNLOAD_LOCATION} EXPECTED_HASH SHA256=${CPM_HASH_SUM}
|
||||
)
|
||||
|
||||
include(${CPM_DOWNLOAD_LOCATION})
|
60
cmake/FindQScintilla6.cmake
Normal file
|
@ -0,0 +1,60 @@
|
|||
# Modified from QGIS' FindQScintilla.cmake by Thomas Moenicke, Larry Schaffer
|
||||
|
||||
add_library(QScintilla::QScintilla UNKNOWN IMPORTED)
|
||||
|
||||
### NECESSARY TO PREVENT staticMetaObject ERROR!!! See qscintilla.prf AKA qmake config
|
||||
if(WIN32)
|
||||
add_compile_definitions(QSCINTILLA_DLL)
|
||||
endif()
|
||||
|
||||
FIND_PATH(QSCINTILLA_INCLUDE_DIR
|
||||
NAMES Qsci/qsciglobal.h
|
||||
PATHS
|
||||
${Qt6Core_INCLUDE_DIRS}
|
||||
$ENV{LIB_DIR}/include
|
||||
/usr/local/include
|
||||
/usr/include
|
||||
${VCPKG_INSTALLED_DIR}/x64-windows/include
|
||||
PATH_SUFFIXES ${QSCINTILLA_PATH_SUFFIXES}
|
||||
)
|
||||
|
||||
set(QSCINTILLA_LIBRARY_NAMES
|
||||
qscintilla2-qt6
|
||||
qscintilla2_qt6
|
||||
libqt6scintilla2
|
||||
libqscintilla2-qt6
|
||||
qt6scintilla2
|
||||
libqscintilla2-qt6.dylib
|
||||
qscintilla2
|
||||
)
|
||||
|
||||
|
||||
find_library(QSCINTILLA_LIBRARY
|
||||
NAMES ${QSCINTILLA_LIBRARY_NAMES}
|
||||
PATHS
|
||||
"${QT_LIBRARY_DIR}"
|
||||
$ENV{LIB_DIR}/lib
|
||||
/usr/local/lib
|
||||
/usr/local/lib/qt6
|
||||
/usr/lib
|
||||
/usr/lib64
|
||||
/usr/lib32
|
||||
${VCPKG_INSTALLED_DIR}/x64-windows/lib
|
||||
)
|
||||
|
||||
get_filename_component(QSCINTILLA_LIB_DIR ${QSCINTILLA_LIBRARY} DIRECTORY)
|
||||
list(TRANSFORM QSCINTILLA_LIBRARY_NAMES APPEND ".dll" OUTPUT_VARIABLE QSCINTILLA_DLL_NAMES)
|
||||
|
||||
find_file(QSCINTILLA_DLLS
|
||||
NAMES ${QSCINTILLA_DLL_NAMES}
|
||||
PATHS
|
||||
"${QT_LIBRARY_DIR}"
|
||||
$ENV{LIB_DIR}/lib
|
||||
/usr/local/lib
|
||||
/usr/local/lib/qt6
|
||||
/usr/lib64
|
||||
/usr/lib32
|
||||
/usr/lib
|
||||
${QSCINTILLA_LIB_DIR}
|
||||
${VCPKG_INSTALLED_DIR}/x64-windows/lib
|
||||
)
|
|
@ -1,30 +0,0 @@
|
|||
# Distributed under the OSI-approved BSD 3-Clause License.
|
||||
# Copyright Stefano Sinigardi
|
||||
|
||||
#.rst:
|
||||
# FindStb
|
||||
# ------------
|
||||
#
|
||||
# Find the Stb include headers.
|
||||
#
|
||||
# Result Variables
|
||||
# ^^^^^^^^^^^^^^^^
|
||||
#
|
||||
# This module defines the following variables:
|
||||
#
|
||||
# ``Stb_FOUND``
|
||||
# True if Stb library found
|
||||
#
|
||||
# ``Stb_INCLUDE_DIR``
|
||||
# Location of Stb headers
|
||||
#
|
||||
|
||||
include(${CMAKE_ROOT}/Modules/FindPackageHandleStandardArgs.cmake)
|
||||
include(${CMAKE_ROOT}/Modules/SelectLibraryConfigurations.cmake)
|
||||
|
||||
if(NOT Stb_INCLUDE_DIR)
|
||||
find_path(Stb_INCLUDE_DIR NAMES stb_image.h PATHS ${Stb_DIR} PATH_SUFFIXES include stb include/stb)
|
||||
endif()
|
||||
|
||||
find_package_handle_standard_args(Stb DEFAULT_MSG Stb_INCLUDE_DIR)
|
||||
mark_as_advanced(Stb_INCLUDE_DIR)
|
40
cmake/gitversion.cmake
Normal file
|
@ -0,0 +1,40 @@
|
|||
|
||||
# https://jonathanhamberg.com/post/cmake-embedding-git-hash/
|
||||
|
||||
# Detect current version from git
|
||||
execute_process(
|
||||
COMMAND git rev-parse HEAD
|
||||
OUTPUT_VARIABLE GIT_COMMIT_HASH RESULT_VARIABLE GIT_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
|
||||
|
||||
execute_process(
|
||||
COMMAND git describe --abbrev=0
|
||||
OUTPUT_VARIABLE GIT_VERSION RESULT_VARIABLE GIT_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
|
||||
|
||||
execute_process(
|
||||
COMMAND git describe --dirty
|
||||
OUTPUT_VARIABLE GIT_VERSION_LONG RESULT_VARIABLE GIT_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
|
||||
|
||||
# For some reason, CMake sets CMAKE_*_DIR all to be CMAKE_CURRENT_BINARY_DIR
|
||||
# so we have to bypass this by passing in custom "orig_" variables
|
||||
if (NOT GIT_STATE_WITHIN)
|
||||
# Re-run this target always so that the version can be checked
|
||||
add_custom_target(recheck_git_version ALL COMMAND ${CMAKE_COMMAND}
|
||||
-DGIT_STATE_WITHIN=1
|
||||
-DORIG_BINARY_DIR=${CMAKE_BINARY_DIR}
|
||||
-DORIG_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}
|
||||
-DORIG_SOURCE_DIR=${CMAKE_SOURCE_DIR}
|
||||
-DORIG_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}
|
||||
-P ${CMAKE_MODULE_PATH}/gitversion.cmake
|
||||
BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/src/version.cpp
|
||||
)
|
||||
else ()
|
||||
# # Set defaults if the git commands fail
|
||||
if (NOT GIT_RESULT EQUAL 0)
|
||||
set(GIT_COMMIT_HASH "unknown")
|
||||
set(GIT_VERSION "unknown")
|
||||
set(GIT_VERSION_LONG "unknown")
|
||||
endif ()
|
||||
|
||||
# configure_file only touches the file if it has been changed, so no caching is necessary
|
||||
configure_file(${ORIG_CURRENT_SOURCE_DIR}/src/version.cpp.in ${ORIG_CURRENT_BINARY_DIR}/src/version.cpp @ONLY)
|
||||
endif ()
|
|
@ -1,28 +1,176 @@
|
|||
find_package(OpenGL REQUIRED COMPONENTS OpenGL)
|
||||
include(${CMAKE_CURRENT_SOURCE_DIR}/deps.cmake)
|
||||
|
||||
find_package(GLEW REQUIRED)
|
||||
include_directories(${GLEW_INCLUDE_DIRS})
|
||||
## Sources
|
||||
set(SOURCES
|
||||
src/stb.cpp
|
||||
src/glad.cpp
|
||||
|
||||
find_package(OpenGL)
|
||||
find_package(glm CONFIG REQUIRED)
|
||||
find_package(ReactPhysics3D REQUIRED)
|
||||
find_package(pugixml 1.15 REQUIRED)
|
||||
src/ptr_helpers.h
|
||||
src/enum/part.h
|
||||
src/enum/surface.cpp
|
||||
src/enum/meta.h
|
||||
src/enum/annotation.h
|
||||
src/enum/surface.h
|
||||
src/camera.cpp
|
||||
src/datatypes/vector.cpp
|
||||
src/datatypes/variant.h
|
||||
src/datatypes/cframe.cpp
|
||||
src/datatypes/signal.cpp
|
||||
src/datatypes/base.h
|
||||
src/datatypes/enum.h
|
||||
src/datatypes/enum.cpp
|
||||
src/datatypes/primitives.h
|
||||
src/datatypes/cframe.h
|
||||
src/datatypes/variant.cpp
|
||||
src/datatypes/vector.h
|
||||
src/datatypes/color3.h
|
||||
src/datatypes/annotation.h
|
||||
src/datatypes/color3.cpp
|
||||
src/datatypes/primitives.cpp
|
||||
src/datatypes/ref.cpp
|
||||
src/datatypes/ref.h
|
||||
src/datatypes/signal.h
|
||||
src/common.cpp
|
||||
src/utils.h
|
||||
src/platform.h
|
||||
src/math_helper.cpp
|
||||
src/rendering/skybox.cpp
|
||||
src/rendering/mesh2d.cpp
|
||||
src/rendering/torus.cpp
|
||||
src/rendering/mesh.h
|
||||
src/rendering/font.cpp
|
||||
src/rendering/debug/debugrenderer.cpp
|
||||
src/rendering/texture.h
|
||||
src/rendering/shader.h
|
||||
src/rendering/defaultmeshes.cpp
|
||||
src/rendering/skybox.h
|
||||
src/rendering/mesh2d.h
|
||||
src/rendering/light.h
|
||||
src/rendering/renderer.cpp
|
||||
src/rendering/texture3d.h
|
||||
src/rendering/texture.cpp
|
||||
src/rendering/renderer.h
|
||||
src/rendering/shader.cpp
|
||||
src/rendering/mesh.cpp
|
||||
src/rendering/material.h
|
||||
src/rendering/torus.h
|
||||
src/rendering/font.h
|
||||
src/rendering/defaultmeshes.h
|
||||
src/rendering/texture3d.cpp
|
||||
src/logger.cpp
|
||||
src/handles.h
|
||||
src/timeutil.h
|
||||
src/error/error.h
|
||||
src/error/result.h
|
||||
src/error/instance.h
|
||||
src/error/data.h
|
||||
src/partassembly.h
|
||||
src/objects/service/jointsservice.cpp
|
||||
src/objects/service/script/serverscriptservice.h
|
||||
src/objects/service/script/serverscriptservice.cpp
|
||||
src/objects/service/script/scriptcontext.h
|
||||
src/objects/service/script/scriptcontext.cpp
|
||||
src/objects/service/workspace.cpp
|
||||
src/objects/service/selection.cpp
|
||||
src/objects/service/selection.h
|
||||
src/objects/service/jointsservice.h
|
||||
src/objects/service/workspace.h
|
||||
src/objects/datamodel.cpp
|
||||
src/objects/script.h
|
||||
src/objects/joint/snap.h
|
||||
src/objects/joint/jointinstance.h
|
||||
src/objects/joint/rotatev.h
|
||||
src/objects/joint/weld.cpp
|
||||
src/objects/joint/jointinstance.cpp
|
||||
src/objects/joint/rotate.cpp
|
||||
src/objects/joint/rotate.h
|
||||
src/objects/joint/weld.h
|
||||
src/objects/joint/snap.cpp
|
||||
src/objects/joint/rotatev.cpp
|
||||
src/objects/base/service.h
|
||||
src/objects/base/member.h
|
||||
src/objects/base/instance.h
|
||||
src/objects/base/service.cpp
|
||||
src/objects/base/instance.cpp
|
||||
src/objects/base/refstate.h
|
||||
src/objects/message.h
|
||||
src/objects/pvinstance.cpp
|
||||
src/objects/hint.cpp
|
||||
src/objects/pvinstance.h
|
||||
src/objects/base.h
|
||||
src/objects/folder.cpp
|
||||
src/objects/model.cpp
|
||||
src/objects/datamodel.h
|
||||
src/objects/folder.h
|
||||
src/objects/meta.cpp
|
||||
src/objects/model.h
|
||||
src/objects/part/part.cpp
|
||||
src/objects/part/part.h
|
||||
src/objects/part/wedgepart.h
|
||||
src/objects/part/basepart.cpp
|
||||
src/objects/part/wedgepart.cpp
|
||||
src/objects/part/basepart.h
|
||||
src/objects/meta.h
|
||||
src/objects/hint.h
|
||||
src/objects/annotation.h
|
||||
src/objects/message.cpp
|
||||
src/objects/script.cpp
|
||||
src/partassembly.cpp
|
||||
src/panic.cpp
|
||||
src/logger.h
|
||||
src/camera.h
|
||||
src/handles.cpp
|
||||
src/version.h
|
||||
src/common.h
|
||||
src/platform.cpp
|
||||
src/panic.h
|
||||
src/lua/instancelib.cpp
|
||||
src/timeutil.cpp
|
||||
src/physics/util.h
|
||||
src/luaapis.h
|
||||
src/math_helper.h
|
||||
)
|
||||
|
||||
find_package(Stb REQUIRED)
|
||||
include_directories(${Stb_INCLUDE_DIR})
|
||||
set(AUTOGEN_SOURCES
|
||||
# Objects
|
||||
src/objects/service/script/serverscriptservice.h
|
||||
src/objects/service/script/scriptcontext.h
|
||||
src/objects/service/selection.h
|
||||
src/objects/service/jointsservice.h
|
||||
src/objects/service/workspace.h
|
||||
src/objects/script.h
|
||||
src/objects/joint/snap.h
|
||||
src/objects/joint/jointinstance.h
|
||||
src/objects/joint/rotatev.h
|
||||
src/objects/joint/rotate.h
|
||||
src/objects/joint/weld.h
|
||||
src/objects/message.h
|
||||
src/objects/pvinstance.h
|
||||
src/objects/base.h
|
||||
src/objects/datamodel.h
|
||||
src/objects/folder.h
|
||||
src/objects/model.h
|
||||
src/objects/part/part.h
|
||||
src/objects/part/wedgepart.h
|
||||
src/objects/part/basepart.h
|
||||
src/objects/meta.h
|
||||
src/objects/hint.h
|
||||
# Enum
|
||||
src/enum/part.h
|
||||
src/enum/surface.h
|
||||
# Data types
|
||||
src/datatypes/enum.h
|
||||
src/datatypes/cframe.h
|
||||
src/datatypes/vector.h
|
||||
src/datatypes/color3.h
|
||||
)
|
||||
|
||||
# PkgConfig packages
|
||||
find_package(PkgConfig REQUIRED)
|
||||
pkg_check_modules(LUAJIT REQUIRED luajit)
|
||||
link_directories(${LUAJIT_LIBRARY_DIRS})
|
||||
|
||||
# Run autogen
|
||||
file(GLOB_RECURSE AUTOGEN_SOURCES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/src" "src/objects/*.h" "src/datatypes/*.h" "src/enum/*.h")
|
||||
### Autogen
|
||||
|
||||
# https://cmake.org/cmake/help/book/mastering-cmake/chapter/Custom%20Commands.html
|
||||
foreach (SRC ${AUTOGEN_SOURCES})
|
||||
string(REGEX REPLACE "[.]h$" ".cpp" OUT_SRC_NAME ${SRC})
|
||||
set(SRC_PATH "${CMAKE_CURRENT_SOURCE_DIR}/src/${SRC}")
|
||||
set(SRC_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${SRC}")
|
||||
set(OUT_PATH "${CMAKE_BINARY_DIR}/generated/${OUT_SRC_NAME}")
|
||||
|
||||
add_custom_command(
|
||||
|
@ -35,17 +183,22 @@ foreach (SRC ${AUTOGEN_SOURCES})
|
|||
list(APPEND AUTOGEN_OUTS "${OUT_PATH}")
|
||||
endforeach()
|
||||
|
||||
### /Autogen
|
||||
|
||||
# Add version info into the build
|
||||
include(gitversion)
|
||||
|
||||
add_custom_target(autogen_build ALL
|
||||
DEPENDS ${AUTOGEN_OUTS}
|
||||
)
|
||||
|
||||
file(GLOB_RECURSE SOURCES "src/*.cpp" "src/*.h")
|
||||
list(APPEND SOURCES ${AUTOGEN_OUTS})
|
||||
list(APPEND SOURCES ${CMAKE_CURRENT_BINARY_DIR}/src/version.cpp)
|
||||
add_library(openblocks STATIC ${SOURCES})
|
||||
set_target_properties(openblocks PROPERTIES OUTPUT_NAME "openblocks")
|
||||
target_link_directories(openblocks PUBLIC ${LUAJIT_LIBRARY_DIRS})
|
||||
target_link_libraries(openblocks ${GLEW_LIBRARIES} ${LUAJIT_LIBRARIES} OpenGL::GL ReactPhysics3D::ReactPhysics3D pugixml::pugixml)
|
||||
target_include_directories(openblocks PUBLIC "src" "../include" ${LUAJIT_INCLUDE_DIRS})
|
||||
target_link_libraries(openblocks reactphysics3d pugixml::pugixml Freetype::Freetype glm::glm libluajit ${LuaJIT_LIBRARIES})
|
||||
target_include_directories(openblocks PUBLIC "src" "../include" "${CMAKE_SOURCE_DIR}/external/glad" ${ReactPhysics3D_SOURCE_DIR}/include ${LUAJIT_INCLUDE_DIRS} ${stb_SOURCE_DIR})
|
||||
add_dependencies(openblocks autogen_build autogen)
|
||||
|
||||
# Windows-specific dependencies
|
||||
|
|
32
core/deps.cmake
Normal file
|
@ -0,0 +1,32 @@
|
|||
|
||||
include(CPM)
|
||||
|
||||
# Some packages will build helper binaries. This keeps them out of our own build output
|
||||
set (PREV_BIN_PATH ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
|
||||
unset (CMAKE_RUNTIME_OUTPUT_DIRECTORY)
|
||||
|
||||
CPMAddPackage("gh:g-truc/glm#1.0.1")
|
||||
CPMAddPackage(NAME reactphysics3d GITHUB_REPOSITORY "DanielChappuis/reactphysics3d" VERSION 0.10.2 PATCHES ${CMAKE_SOURCE_DIR}/patches/std_chrono.patch)
|
||||
# https://github.com/StereoKit/StereoKit/blob/0be056efebcee5e58ad1438f4cf6dfdb942f6cf9/CMakeLists.txt#L205
|
||||
set_property(TARGET reactphysics3d PROPERTY POSITION_INDEPENDENT_CODE ON)
|
||||
CPMAddPackage("gh:zeux/pugixml@1.15")
|
||||
|
||||
CPMAddPackage(
|
||||
NAME freetype
|
||||
GIT_REPOSITORY https://github.com/aseprite/freetype2.git
|
||||
GIT_TAG VER-2-10-0
|
||||
VERSION 2.10.0
|
||||
PATCHES ${CMAKE_SOURCE_DIR}/patches/freetype_cmakever.patch
|
||||
)
|
||||
|
||||
if (freetype_ADDED)
|
||||
add_library(Freetype::Freetype ALIAS freetype)
|
||||
endif()
|
||||
|
||||
CPMAddPackage("gh:nothings/stb#8cfb1605c02aee9fb6eb5d8ea559017745bd9a16") # 2.14
|
||||
CPMAddPackage("gh:WohlSoft/LuaJIT#a5da8f4a31972b74254f00969111b8b7a07cf584") # v2.1
|
||||
set(LUAJIT_INCLUDE_DIRS ${LuaJIT_SOURCE_DIR}/src)
|
||||
|
||||
CPMAddPackage("gh:mackron/miniaudio#0.11.22")
|
||||
|
||||
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PREV_BIN_PATH})
|
|
@ -6,13 +6,14 @@
|
|||
#include <iomanip>
|
||||
#include <algorithm>
|
||||
|
||||
Color3::Color3() {};
|
||||
Color3::Color3(float r, float g, float b) : r(std::clamp(r, 0.f, 1.f)), g(std::clamp(g, 0.f, 1.f)), b(std::clamp(b, 0.f, 1.f)) {};
|
||||
Color3::Color3(const glm::vec3& vec) : r(std::clamp(vec.x, 0.f, 1.f)), g(std::clamp(vec.y, 0.f, 1.f)), b(std::clamp(vec.z, 0.f, 1.f)) {};
|
||||
|
||||
Color3::~Color3() = default;
|
||||
|
||||
const std::string Color3::ToString() const {
|
||||
return std::to_string(int(r*256)) + ", " + std::to_string(int(g*256)) + ", " + std::to_string(int(b*256));
|
||||
return std::to_string(int(r*255)) + ", " + std::to_string(int(g*255)) + ", " + std::to_string(int(b*255));
|
||||
}
|
||||
|
||||
Color3::operator glm::vec3() const { return glm::vec3(r, g, b); };
|
||||
|
|
|
@ -14,6 +14,7 @@ class DEF_DATA Color3 {
|
|||
|
||||
public:
|
||||
DEF_DATA_CTOR Color3(float r, float g, float b);
|
||||
Color3();
|
||||
Color3(const glm::vec3&);
|
||||
virtual ~Color3();
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
#include <vector>
|
||||
#include "datatypes/annotation.h"
|
||||
#include "error/data.h"
|
||||
#include "lua.h" // IWYU pragma: keep
|
||||
#include "luaapis.h" // IWYU pragma: keep
|
||||
|
||||
struct _EnumData {
|
||||
std::string name;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
#include "error/data.h"
|
||||
#include "variant.h"
|
||||
#include <pugixml.hpp>
|
||||
#include "lua.h" // IWYU pragma: keep
|
||||
#include "luaapis.h" // IWYU pragma: keep
|
||||
#include <sstream>
|
||||
|
||||
// null
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
#include <memory>
|
||||
#include <optional>
|
||||
#include "objects/base/instance.h"
|
||||
#include "lua.h" // IWYU pragma: keep
|
||||
#include "luaapis.h" // IWYU pragma: keep
|
||||
#include "objects/base/member.h"
|
||||
#include <pugixml.hpp>
|
||||
|
||||
|
|
|
@ -1,12 +1,14 @@
|
|||
#include "signal.h"
|
||||
#include "datatypes/base.h"
|
||||
#include "variant.h"
|
||||
#include "lua.h" // IWYU pragma: keep
|
||||
#include "luaapis.h" // IWYU pragma: keep
|
||||
#include <cstdio>
|
||||
#include <pugixml.hpp>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
int script_errhandler(lua_State*); // extern
|
||||
|
||||
SignalSource::SignalSource() : std::shared_ptr<Signal>(std::make_shared<Signal>()) {}
|
||||
SignalSource::~SignalSource() = default;
|
||||
|
||||
|
@ -25,6 +27,8 @@ LuaSignalConnection::LuaSignalConnection(lua_State* L, std::weak_ptr<Signal> par
|
|||
// Save function and current thread so they don't get GC'd
|
||||
function = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
lua_pushthread(L);
|
||||
// For posterity, since I accidentally removed this once, the parent thread must not be
|
||||
// deleted because it may (likely) contain upvalues that the handler references
|
||||
thread = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
}
|
||||
|
||||
|
@ -34,40 +38,24 @@ LuaSignalConnection::~LuaSignalConnection() {
|
|||
luaL_unref(state, LUA_REGISTRYINDEX, thread);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void stackdump(lua_State* L) {
|
||||
printf("%d\n", lua_gettop(L));
|
||||
fflush(stdout);
|
||||
lua_getfield(L, LUA_GLOBALSINDEX, "tostring");
|
||||
for (int i = lua_gettop(L)-1; i >= 1; i--) {
|
||||
lua_pushvalue(L, -1);
|
||||
lua_pushvalue(L, i);
|
||||
lua_call(L, 1, 1);
|
||||
const char* str = lua_tostring(L, -1);
|
||||
lua_pop(L, 1);
|
||||
printf("%s: %s\n", lua_typename(L, lua_type(L, i)), str);
|
||||
}
|
||||
lua_pop(L, 1);
|
||||
printf("\n\n");
|
||||
fflush(stdout);
|
||||
}
|
||||
#endif
|
||||
|
||||
void LuaSignalConnection::Call(std::vector<Variant> args) {
|
||||
lua_State* thread = lua_newthread(state);
|
||||
|
||||
// Push function
|
||||
// Push wrapepr as thread function
|
||||
lua_getfield(thread, LUA_REGISTRYINDEX, "LuaPCallWrapper");
|
||||
|
||||
// Push function as upvalue for wrapper
|
||||
lua_rawgeti(thread, LUA_REGISTRYINDEX, function);
|
||||
|
||||
// Also push our error handler and generate wrapped function
|
||||
lua_pushcfunction(thread, script_errhandler);
|
||||
lua_call(thread, 2, 1);
|
||||
|
||||
for (Variant arg : args) {
|
||||
arg.PushLuaValue(thread);
|
||||
}
|
||||
|
||||
int status = lua_resume(thread, args.size());
|
||||
if (status > LUA_YIELD) {
|
||||
Logger::error(lua_tostring(thread, -1));
|
||||
lua_pop(thread, 1); // Pop return value
|
||||
}
|
||||
lua_resume(thread, args.size());
|
||||
|
||||
lua_pop(state, 1); // Pop thread
|
||||
}
|
||||
|
@ -152,11 +140,7 @@ void Signal::Fire(std::vector<Variant> args) {
|
|||
arg.PushLuaValue(thread);
|
||||
}
|
||||
|
||||
int status = lua_resume(thread, args.size());
|
||||
if (status > LUA_YIELD) {
|
||||
Logger::error(lua_tostring(thread, -1));
|
||||
lua_pop(thread, 1); // Pop return value
|
||||
}
|
||||
lua_resume(thread, args.size());
|
||||
|
||||
// Remove thread from registry
|
||||
luaL_unref(thread, LUA_REGISTRYINDEX, threadId);
|
||||
|
|
14
core/src/enum/part.h
Normal file
|
@ -0,0 +1,14 @@
|
|||
#pragma once
|
||||
|
||||
#include "datatypes/enum.h"
|
||||
#include "enum/annotation.h"
|
||||
|
||||
|
||||
enum class DEF_ENUM PartType {
|
||||
Ball = 0,
|
||||
Block = 1,
|
||||
};
|
||||
|
||||
namespace EnumType {
|
||||
extern const Enum PartType;
|
||||
};
|
2
core/src/glad.cpp
Normal file
|
@ -0,0 +1,2 @@
|
|||
#define GLAD_GL_IMPLEMENTATION
|
||||
#include <glad/gl.h>
|
|
@ -27,11 +27,11 @@ static CFrame XYZToZXY(glm::vec3(0, 0, 0), -glm::vec3(1, 0, 0), glm::vec3(0, 0,
|
|||
static rp3d::PhysicsCommon common;
|
||||
static rp3d::PhysicsWorld* world = common.createPhysicsWorld();
|
||||
|
||||
std::shared_ptr<Part> getHandleAdornee() {
|
||||
std::shared_ptr<BasePart> getHandleAdornee() {
|
||||
std::shared_ptr<Selection> selection = gDataModel->GetService<Selection>();
|
||||
for (std::weak_ptr<Instance> inst : selection->Get()) {
|
||||
if (!inst.expired() && inst.lock()->IsA<Part>())
|
||||
return inst.lock()->CastTo<Part>().expect();
|
||||
if (!inst.expired() && inst.lock()->IsA<BasePart>())
|
||||
return inst.lock()->CastTo<BasePart>().expect();
|
||||
}
|
||||
|
||||
return {};
|
||||
|
@ -58,7 +58,7 @@ std::optional<HandleFace> raycastHandle(rp3d::Ray ray) {
|
|||
// Implement manual detection via boxes instead of... this shit
|
||||
// This code also hardly works, and is not good at all... Hooo nope.
|
||||
rp3d::RigidBody* body = world->createRigidBody(CFrame::IDENTITY + cframe.Position());
|
||||
body->addCollider(common.createBoxShape(cframe.Rotation() * Vector3(handleSize(face) / 2.f)), rp3d::Transform::identity());
|
||||
body->addCollider(common.createBoxShape((cframe.Rotation() * Vector3(handleSize(face) / 2.f)).Abs()), rp3d::Transform::identity());
|
||||
|
||||
rp3d::RaycastInfo info;
|
||||
if (body->raycast(ray, info)) {
|
||||
|
@ -82,8 +82,8 @@ static int getAABBOfSelection(glm::vec3& pos, glm::vec3& size, glm::vec3& min, g
|
|||
int count = 0;
|
||||
std::shared_ptr<Selection> selection = gDataModel->GetService<Selection>();
|
||||
for (std::weak_ptr<Instance> inst : selection->Get()) {
|
||||
if (inst.expired() || !inst.lock()->IsA<Part>()) continue;
|
||||
std::shared_ptr<Part> part = inst.lock()->CastTo<Part>().expect();
|
||||
if (inst.expired() || !inst.lock()->IsA<BasePart>()) continue;
|
||||
std::shared_ptr<BasePart> part = inst.lock()->CastTo<BasePart>().expect();
|
||||
|
||||
if (count == 0)
|
||||
min = part->position(), max = part->position();
|
||||
|
@ -99,12 +99,12 @@ static int getAABBOfSelection(glm::vec3& pos, glm::vec3& size, glm::vec3& min, g
|
|||
return count;
|
||||
}
|
||||
|
||||
static std::shared_ptr<Part> getFirstSelectedPart() {
|
||||
static std::shared_ptr<BasePart> getFirstSelectedPart() {
|
||||
std::shared_ptr<Selection> selection = gDataModel->GetService<Selection>();
|
||||
for (std::weak_ptr<Instance> inst : selection->Get()) {
|
||||
if (inst.expired() || !inst.lock()->IsA<Part>()) continue;
|
||||
if (inst.expired() || !inst.lock()->IsA<BasePart>()) continue;
|
||||
|
||||
return inst.lock()->CastTo<Part>().expect();
|
||||
return inst.lock()->CastTo<BasePart>().expect();
|
||||
}
|
||||
|
||||
return {};
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "datatypes/cframe.h"
|
||||
#include "objects/part.h"
|
||||
#include "objects/part/part.h"
|
||||
#include <array>
|
||||
#include <memory>
|
||||
|
||||
|
@ -36,7 +36,7 @@ struct Handles {
|
|||
bool worldMode = false;
|
||||
};
|
||||
|
||||
std::shared_ptr<Part> getHandleAdornee();
|
||||
std::shared_ptr<BasePart> getHandleAdornee();
|
||||
CFrame getHandleCFrame(HandleFace face);
|
||||
CFrame partCFrameFromHandlePos(HandleFace face, Vector3 newPos);
|
||||
Vector3 handleSize(HandleFace face);
|
||||
|
|
|
@ -9,26 +9,33 @@
|
|||
|
||||
static std::ofstream logStream;
|
||||
static std::vector<Logger::LogListener> logListeners;
|
||||
static std::vector<Logger::TraceLogListener> traceLogListeners;
|
||||
std::string Logger::currentLogDir = "NULL";
|
||||
static std::stringstream* rawOutputBuffer = nullptr;
|
||||
|
||||
void Logger::init() {
|
||||
initProgramLogsDir();
|
||||
|
||||
const auto now = std::chrono::system_clock::now();
|
||||
const auto nows = std::chrono::floor<std::chrono::seconds>(now);
|
||||
|
||||
std::string fileName = std::format("log_{0:%Y%m%d}_{0:%H%M%S}.txt", now);
|
||||
std::string fileName = std::format("log_{0:%Y%m%d}_{0:%H%M%S}.txt", nows);
|
||||
|
||||
logStream = std::ofstream(currentLogDir = (getProgramLogsDir() + "/" + fileName));
|
||||
Logger::debug("Logger initialized");
|
||||
}
|
||||
|
||||
// Initializes the logger in a "void" mode for testing.
|
||||
// It is not necessary to call Logger::finish
|
||||
void Logger::initTest(std::stringstream* outputBuffer) {
|
||||
rawOutputBuffer = outputBuffer;
|
||||
}
|
||||
|
||||
void Logger::finish() {
|
||||
Logger::debug("Closing logger...");
|
||||
logStream.close();
|
||||
}
|
||||
|
||||
void Logger::log(std::string message, Logger::LogLevel logLevel) {
|
||||
void Logger::log(std::string message, Logger::LogLevel logLevel, ScriptSource source) {
|
||||
std::string logLevelStr = logLevel == Logger::LogLevel::INFO ? "INFO" :
|
||||
logLevel == Logger::LogLevel::DEBUG ? "DEBUG" :
|
||||
logLevel == Logger::LogLevel::TRACE ? "TRACE" :
|
||||
|
@ -42,9 +49,10 @@ void Logger::log(std::string message, Logger::LogLevel logLevel) {
|
|||
|
||||
logStream << formattedLogLine << std::endl;
|
||||
printf("%s\n", formattedLogLine.c_str());
|
||||
if (rawOutputBuffer != nullptr) *rawOutputBuffer << logLevelStr << ": " << message << "\n";
|
||||
|
||||
for (Logger::LogListener listener : logListeners) {
|
||||
listener(logLevel, message);
|
||||
listener(logLevel, message, source);
|
||||
}
|
||||
|
||||
if (logLevel == Logger::LogLevel::FATAL_ERROR) {
|
||||
|
@ -52,20 +60,10 @@ void Logger::log(std::string message, Logger::LogLevel logLevel) {
|
|||
}
|
||||
}
|
||||
|
||||
void Logger::trace(std::string source, int line, void* userData) {
|
||||
std::string message = "'" + source + "' Line " + std::to_string(line);
|
||||
|
||||
log(message, Logger::LogLevel::TRACE);
|
||||
|
||||
for (Logger::TraceLogListener listener : traceLogListeners) {
|
||||
listener(message, source, line, userData);
|
||||
}
|
||||
}
|
||||
|
||||
void Logger::addLogListener(Logger::LogListener listener) {
|
||||
logListeners.push_back(listener);
|
||||
}
|
||||
|
||||
void Logger::addLogListener(Logger::TraceLogListener listener) {
|
||||
traceLogListeners.push_back(listener);
|
||||
void Logger::resetLogListeners() {
|
||||
logListeners.clear();
|
||||
}
|
|
@ -1,9 +1,12 @@
|
|||
#pragma once
|
||||
|
||||
#include <format>
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <ostream>
|
||||
#include <string>
|
||||
|
||||
class Script;
|
||||
|
||||
namespace Logger {
|
||||
enum class LogLevel {
|
||||
INFO,
|
||||
|
@ -14,34 +17,41 @@ namespace Logger {
|
|||
FATAL_ERROR,
|
||||
};
|
||||
|
||||
typedef std::function<void(LogLevel logLevel, std::string message)> LogListener;
|
||||
typedef std::function<void(std::string message, std::string source, int line, void* userData)> TraceLogListener;
|
||||
struct ScriptSource {
|
||||
std::shared_ptr<Script> script;
|
||||
int line;
|
||||
};
|
||||
|
||||
typedef std::function<void(LogLevel logLevel, std::string message, ScriptSource source)> LogListener;
|
||||
|
||||
extern std::string currentLogDir;
|
||||
|
||||
void init();
|
||||
void initTest(std::stringstream* out); // Testing only!
|
||||
void finish();
|
||||
void addLogListener(LogListener);
|
||||
void addLogListener(TraceLogListener);
|
||||
void resetLogListeners(); // Testing only!
|
||||
|
||||
void log(std::string message, LogLevel logLevel);
|
||||
void log(std::string message, LogLevel logLevel, ScriptSource source = {});
|
||||
inline void info(std::string message) { log(message, LogLevel::INFO); }
|
||||
inline void debug(std::string message) { log(message, LogLevel::DEBUG); }
|
||||
inline void warning(std::string message) { log(message, LogLevel::WARNING); }
|
||||
inline void error(std::string message) { log(message, LogLevel::ERROR); }
|
||||
inline void fatalError(std::string message) { log(message, LogLevel::FATAL_ERROR); }
|
||||
inline void trace(std::string message) { log(message, LogLevel::TRACE); };
|
||||
|
||||
inline void traceStart() { log("Stack start", LogLevel::TRACE); }
|
||||
inline void traceEnd() { log("Stack end", LogLevel::TRACE); }
|
||||
void trace(std::string source, int line, void* userData = nullptr);
|
||||
template <typename ...Args>
|
||||
void scriptLogf(std::string format, LogLevel logLevel, ScriptSource source, Args&&... args) {
|
||||
char message[200];
|
||||
sprintf(message, format.c_str(), args...);
|
||||
log(message, logLevel, source);
|
||||
}
|
||||
|
||||
template <typename ...Args>
|
||||
void logf(std::string format, LogLevel logLevel, Args&&... args) {
|
||||
char message[200];
|
||||
sprintf(message, format.c_str(), args...);
|
||||
log(message, logLevel);
|
||||
scriptLogf(format, logLevel, {}, args...);
|
||||
}
|
||||
|
||||
|
||||
template <typename ...Args> inline void infof(std::string format, Args&&... args) { logf(format, LogLevel::INFO, args...); }
|
||||
template <typename ...Args> inline void debugf(std::string format, Args&&... args) { logf(format, LogLevel::DEBUG, args...); }
|
||||
template <typename ...Args> inline void warningf(std::string format, Args&&... args) { logf(format, LogLevel::WARNING, args...); }
|
||||
|
|
77
core/src/lua/instancelib.cpp
Normal file
|
@ -0,0 +1,77 @@
|
|||
#include "objects/base/instance.h"
|
||||
#include "datatypes/ref.h"
|
||||
#include "luaapis.h" // IWYU pragma: keep
|
||||
#include "objects/meta.h"
|
||||
#include <memory>
|
||||
|
||||
static int lib_Instance_index(lua_State*);
|
||||
static int lib_Instance_tostring(lua_State*);
|
||||
static const struct luaL_Reg lib_Instance_metatable [] = {
|
||||
{"__index", lib_Instance_index},
|
||||
{"__tostring", lib_Instance_tostring},
|
||||
{NULL, NULL} /* end of array */
|
||||
};
|
||||
|
||||
static int __lua_impl__Instance__new(lua_State* L) {
|
||||
int n = lua_gettop(L);
|
||||
|
||||
// First argument (className)
|
||||
std::string className = luaL_checkstring(L, 1);
|
||||
|
||||
// [Optional] Second argument (parent)
|
||||
std::shared_ptr<Instance> parent;
|
||||
if (n > 1) {
|
||||
parent = **(std::shared_ptr<Instance>**)luaL_checkudata(L, 2, "__mt_instance");
|
||||
}
|
||||
|
||||
// Look up class name
|
||||
if (INSTANCE_MAP.count(className) == 0)
|
||||
return luaL_error(L, "Attempt to create instance of unknown type '%s'", className.c_str());
|
||||
|
||||
const InstanceType* type = INSTANCE_MAP[className];
|
||||
|
||||
if (type->flags & (INSTANCE_NOTCREATABLE | INSTANCE_SERVICE) || type->constructor == nullptr)
|
||||
return luaL_error(L, "Attempt to create Instance of type '%s', which is not creatable", className.c_str());
|
||||
|
||||
std::shared_ptr<Instance> object = type->constructor();
|
||||
|
||||
if (parent != nullptr)
|
||||
object->SetParent(parent);
|
||||
|
||||
InstanceRef(object).PushLuaValue(L);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void Instance::PushLuaLibrary(lua_State* L) {
|
||||
lua_getglobal(L, "_G");
|
||||
lua_pushstring(L, "Instance");
|
||||
|
||||
lua_newuserdata(L, 0);
|
||||
|
||||
// Create the library's metatable
|
||||
luaL_newmetatable(L, "__mt_lib_Instance");
|
||||
luaL_register(L, NULL, lib_Instance_metatable);
|
||||
lua_setmetatable(L, -2);
|
||||
|
||||
lua_rawset(L, -3);
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
|
||||
|
||||
int lib_Instance_tostring(lua_State* L) {
|
||||
lua_pushstring(L, "Instance");
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int lib_Instance_index(lua_State* L) {
|
||||
std::string key(lua_tostring(L, 2));
|
||||
lua_pop(L, 2);
|
||||
|
||||
if (key == "new") {
|
||||
lua_pushcfunction(L, __lua_impl__Instance__new);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return luaL_error(L, "%s is not a valid member of %s\n", key.c_str(), "Instance");
|
||||
}
|
||||
|
|
@ -6,6 +6,8 @@ extern "C" {
|
|||
#include <lua.h>
|
||||
}
|
||||
|
||||
LUALIB_API void *(luaL_testudata) (lua_State *L, int ud, const char *tname);
|
||||
|
||||
inline const char* x_luaL_udatatname (lua_State *L, int ud) {
|
||||
void *p = lua_touserdata(L, ud);
|
||||
if (p != NULL) {
|
||||
|
@ -16,4 +18,6 @@ inline const char* x_luaL_udatatname (lua_State *L, int ud) {
|
|||
return str;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
#define LUA_OK 0
|
|
@ -95,6 +95,7 @@ public:
|
|||
|
||||
// Instance is abstract, so it should not implement GetClass directly
|
||||
virtual const InstanceType* GetClass() = 0;
|
||||
static void PushLuaLibrary(lua_State*); // Defined in lua/instancelib.cpp
|
||||
bool SetParent(std::optional<std::shared_ptr<Instance>> newParent);
|
||||
std::optional<std::shared_ptr<Instance>> GetParent();
|
||||
bool IsParentLocked();
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
#include "panic.h"
|
||||
#include <memory>
|
||||
|
||||
Service::Service(const InstanceType* type) : Instance(type){}
|
||||
Service::Service(const InstanceType* type) : Instance(type) {}
|
||||
|
||||
// Fail if parented to non-datamodel, otherwise lock parent
|
||||
void Service::OnParentUpdated(std::optional<std::shared_ptr<Instance>> oldParent, std::optional<std::shared_ptr<Instance>> newParent) {
|
||||
|
|
|
@ -21,12 +21,8 @@ DataModel::DataModel()
|
|||
}
|
||||
|
||||
void DataModel::Init(bool runMode) {
|
||||
// Create the workspace if it doesn't exist
|
||||
if (this->services.count("Workspace") == 0) {
|
||||
this->services["Workspace"] = std::make_shared<Workspace>();
|
||||
AddChild(this->services["Workspace"]);
|
||||
}
|
||||
|
||||
// Create default services
|
||||
GetService<Workspace>();
|
||||
GetService<ServerScriptService>();
|
||||
|
||||
// Init all services
|
||||
|
|
4
core/src/objects/hint.cpp
Normal file
|
@ -0,0 +1,4 @@
|
|||
#include "hint.h"
|
||||
|
||||
Hint::Hint(): Message(&TYPE) {}
|
||||
Hint::~Hint() = default;
|
18
core/src/objects/hint.h
Normal file
|
@ -0,0 +1,18 @@
|
|||
#pragma once
|
||||
|
||||
#include "objects/annotation.h"
|
||||
#include "objects/base/instance.h"
|
||||
#include "objects/message.h"
|
||||
#include <memory>
|
||||
|
||||
// Dims the player's screen and displays some centered text
|
||||
class DEF_INST_(explorer_icon="message") Hint : public Message {
|
||||
AUTOGEN_PREAMBLE
|
||||
|
||||
public:
|
||||
Hint();
|
||||
~Hint();
|
||||
|
||||
static inline std::shared_ptr<Hint> New() { return std::make_shared<Hint>(); };
|
||||
static inline std::shared_ptr<Instance> Create() { return std::make_shared<Hint>(); };
|
||||
};
|
|
@ -4,7 +4,7 @@
|
|||
#include "datatypes/ref.h"
|
||||
#include "objects/datamodel.h"
|
||||
#include "objects/service/jointsservice.h"
|
||||
#include "objects/part.h"
|
||||
#include "objects/part/part.h"
|
||||
#include "objects/service/workspace.h"
|
||||
#include <memory>
|
||||
#include <reactphysics3d/constraint/FixedJoint.h>
|
||||
|
@ -54,6 +54,6 @@ void JointInstance::onUpdated(std::string property) {
|
|||
oldPart1 = part1;
|
||||
}
|
||||
|
||||
std::optional<std::shared_ptr<Workspace>> JointInstance::workspaceOfPart(std::shared_ptr<Part> part) {
|
||||
std::optional<std::shared_ptr<Workspace>> JointInstance::workspaceOfPart(std::shared_ptr<BasePart> part) {
|
||||
return part->workspace();
|
||||
}
|
|
@ -8,31 +8,31 @@
|
|||
|
||||
//this is necessary ebcause we use std::weak_ptr<Part> without including it in this file
|
||||
#ifdef __AUTOGEN_EXTRA_INCLUDES__
|
||||
#include "../part.h"
|
||||
#include "objects/part/part.h"
|
||||
#endif
|
||||
|
||||
class Part;
|
||||
class BasePart;
|
||||
class Workspace;
|
||||
|
||||
class DEF_INST_ABSTRACT JointInstance : public Instance {
|
||||
AUTOGEN_PREAMBLE
|
||||
|
||||
std::weak_ptr<Part> oldPart0;
|
||||
std::weak_ptr<Part> oldPart1;
|
||||
std::weak_ptr<BasePart> oldPart0;
|
||||
std::weak_ptr<BasePart> oldPart1;
|
||||
protected:
|
||||
// The workspace the joint was created in, if it exists
|
||||
std::weak_ptr<Workspace> jointWorkspace;
|
||||
|
||||
void OnAncestryChanged(std::optional<std::shared_ptr<Instance>>, std::optional<std::shared_ptr<Instance>>) override;
|
||||
|
||||
std::optional<std::shared_ptr<Workspace>> workspaceOfPart(std::shared_ptr<Part>);
|
||||
std::optional<std::shared_ptr<Workspace>> workspaceOfPart(std::shared_ptr<BasePart>);
|
||||
void onUpdated(std::string property);
|
||||
virtual void buildJoint() = 0;
|
||||
virtual void breakJoint() = 0;
|
||||
public:
|
||||
|
||||
DEF_PROP_(on_update=onUpdated) std::weak_ptr<Part> part0;
|
||||
DEF_PROP_(on_update=onUpdated) std::weak_ptr<Part> part1;
|
||||
DEF_PROP_(on_update=onUpdated) std::weak_ptr<BasePart> part0;
|
||||
DEF_PROP_(on_update=onUpdated) std::weak_ptr<BasePart> part1;
|
||||
DEF_PROP_(on_update=onUpdated) CFrame c0;
|
||||
DEF_PROP_(on_update=onUpdated) CFrame c1;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include "rotate.h"
|
||||
#include "objects/service/jointsservice.h"
|
||||
#include "objects/part.h"
|
||||
#include "objects/part/part.h"
|
||||
#include "objects/service/workspace.h"
|
||||
#include "rendering/renderer.h"
|
||||
#include <reactphysics3d/constraint/HingeJoint.h>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include "rotatev.h"
|
||||
#include "objects/service/jointsservice.h"
|
||||
#include "objects/part.h"
|
||||
#include "objects/part/part.h"
|
||||
#include "objects/service/workspace.h"
|
||||
#include "rendering/renderer.h"
|
||||
#include <reactphysics3d/constraint/HingeJoint.h>
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
#include "objects/datamodel.h"
|
||||
#include "objects/joint/jointinstance.h"
|
||||
#include "objects/service/jointsservice.h"
|
||||
#include "objects/part.h"
|
||||
#include "objects/part/part.h"
|
||||
#include "objects/service/workspace.h"
|
||||
#include <memory>
|
||||
#include <reactphysics3d/constraint/FixedJoint.h>
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
#include "objects/datamodel.h"
|
||||
#include "objects/joint/jointinstance.h"
|
||||
#include "objects/service/jointsservice.h"
|
||||
#include "objects/part.h"
|
||||
#include "objects/part/part.h"
|
||||
#include "objects/service/workspace.h"
|
||||
#include <memory>
|
||||
#include <reactphysics3d/constraint/FixedJoint.h>
|
||||
|
|
5
core/src/objects/message.cpp
Normal file
|
@ -0,0 +1,5 @@
|
|||
#include "message.h"
|
||||
|
||||
Message::Message(const InstanceType* type) : Instance(type) {}
|
||||
Message::Message(): Instance(&TYPE) {}
|
||||
Message::~Message() = default;
|
21
core/src/objects/message.h
Normal file
|
@ -0,0 +1,21 @@
|
|||
#pragma once
|
||||
|
||||
#include "objects/annotation.h"
|
||||
#include "objects/base/instance.h"
|
||||
#include <memory>
|
||||
|
||||
// Dims the player's screen and displays some centered text
|
||||
class DEF_INST_(explorer_icon="message") Message : public Instance {
|
||||
AUTOGEN_PREAMBLE
|
||||
|
||||
protected:
|
||||
Message(const InstanceType* type);
|
||||
public:
|
||||
Message();
|
||||
~Message();
|
||||
|
||||
DEF_PROP std::string text;
|
||||
|
||||
static inline std::shared_ptr<Message> New() { return std::make_shared<Message>(); };
|
||||
static inline std::shared_ptr<Instance> Create() { return std::make_shared<Message>(); };
|
||||
};
|
|
@ -1,12 +1,15 @@
|
|||
#include "meta.h"
|
||||
#include "objects/folder.h"
|
||||
#include "objects/hint.h"
|
||||
#include "objects/joint/jointinstance.h"
|
||||
#include "objects/joint/rotate.h"
|
||||
#include "objects/joint/rotatev.h"
|
||||
#include "objects/joint/weld.h"
|
||||
#include "objects/message.h"
|
||||
#include "objects/part/wedgepart.h"
|
||||
#include "objects/service/jointsservice.h"
|
||||
#include "objects/model.h"
|
||||
#include "objects/part.h"
|
||||
#include "objects/part/part.h"
|
||||
#include "objects/joint/snap.h"
|
||||
#include "objects/script.h"
|
||||
#include "objects/service/script/scriptcontext.h"
|
||||
|
@ -19,7 +22,9 @@ std::map<std::string, const InstanceType*> INSTANCE_MAP = {
|
|||
{ "Instance", &Instance::TYPE },
|
||||
{ "DataModel", &DataModel::TYPE },
|
||||
|
||||
{ "BasePart", &BasePart::TYPE },
|
||||
{ "Part", &Part::TYPE },
|
||||
{ "WedgePart", &WedgePart::TYPE },
|
||||
{ "Snap", &Snap::TYPE },
|
||||
{ "Weld", &Weld::TYPE },
|
||||
{ "Rotate", &Rotate::TYPE },
|
||||
|
@ -27,6 +32,8 @@ std::map<std::string, const InstanceType*> INSTANCE_MAP = {
|
|||
{ "JointInstance", &JointInstance::TYPE },
|
||||
{ "Script", &Script::TYPE },
|
||||
{ "Model", &Model::TYPE },
|
||||
{ "Message", &Message::TYPE },
|
||||
{ "Hint", &Hint::TYPE },
|
||||
// { "Folder", &Folder::TYPE },
|
||||
|
||||
// Services
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#include "part.h"
|
||||
#include "base/instance.h"
|
||||
#include "basepart.h"
|
||||
#include "objects/base/instance.h"
|
||||
#include "common.h"
|
||||
#include "datatypes/base.h"
|
||||
#include "datatypes/cframe.h"
|
||||
|
@ -19,15 +19,14 @@
|
|||
#include <memory>
|
||||
#include <optional>
|
||||
|
||||
Part::Part(): Part(PartConstructParams { .size = glm::vec3(2, 1.2, 4), .color = Color3(0.639216f, 0.635294f, 0.647059f) }) {
|
||||
BasePart::BasePart(const InstanceType* type): BasePart(type, PartConstructParams { .size = glm::vec3(4, 1.2, 2), .color = Color3(0.639216f, 0.635294f, 0.647059f) }) {
|
||||
}
|
||||
|
||||
Part::Part(PartConstructParams params): PVInstance(&TYPE), cframe(CFrame::FromEulerAnglesXYZ((Vector3)params.rotation) + params.position),
|
||||
size(params.size), color(params.color), anchored(params.anchored), locked(params.locked) {
|
||||
|
||||
BasePart::BasePart(const InstanceType* type, PartConstructParams params): PVInstance(type), cframe(CFrame::FromEulerAnglesXYZ((Vector3)params.rotation) + params.position),
|
||||
size(params.size), color(params.color), anchored(params.anchored), locked(params.locked) {
|
||||
}
|
||||
|
||||
Part::~Part() {
|
||||
BasePart::~BasePart() {
|
||||
// This relies on physicsCommon still existing. Be very careful.
|
||||
if (this->rigidBody && workspace()) {
|
||||
workspace().value()->DestroyRigidBody(rigidBody);
|
||||
|
@ -36,12 +35,12 @@ Part::~Part() {
|
|||
}
|
||||
|
||||
|
||||
void Part::OnAncestryChanged(std::optional<std::shared_ptr<Instance>> child, std::optional<std::shared_ptr<Instance>> newParent) {
|
||||
void BasePart::OnAncestryChanged(std::optional<std::shared_ptr<Instance>> child, std::optional<std::shared_ptr<Instance>> newParent) {
|
||||
if (this->rigidBody)
|
||||
this->rigidBody->setIsActive(workspace().has_value());
|
||||
|
||||
if (workspace())
|
||||
workspace().value()->SyncPartPhysics(std::dynamic_pointer_cast<Part>(this->shared_from_this()));
|
||||
workspace().value()->SyncPartPhysics(std::dynamic_pointer_cast<BasePart>(this->shared_from_this()));
|
||||
|
||||
// Destroy joints
|
||||
if (!workspace()) BreakJoints();
|
||||
|
@ -49,25 +48,23 @@ void Part::OnAncestryChanged(std::optional<std::shared_ptr<Instance>> child, std
|
|||
// TODO: Sleeping bodies that touch this one also need to be updated
|
||||
}
|
||||
|
||||
void Part::OnWorkspaceAdded(std::optional<std::shared_ptr<Workspace>> oldWorkspace, std::shared_ptr<Workspace> newWorkspace) {
|
||||
newWorkspace->AddBody(shared<Part>());
|
||||
void BasePart::OnWorkspaceAdded(std::optional<std::shared_ptr<Workspace>> oldWorkspace, std::shared_ptr<Workspace> newWorkspace) {
|
||||
newWorkspace->AddBody(shared<BasePart>());
|
||||
}
|
||||
|
||||
void Part::OnWorkspaceRemoved(std::shared_ptr<Workspace> oldWorkspace) {
|
||||
if (simulationTicket->get() != nullptr)
|
||||
oldWorkspace->RemoveBody(shared<Part>());
|
||||
void BasePart::OnWorkspaceRemoved(std::shared_ptr<Workspace> oldWorkspace) {
|
||||
if (simulationTicket.has_value())
|
||||
oldWorkspace->RemoveBody(shared<BasePart>());
|
||||
}
|
||||
|
||||
void Part::onUpdated(std::string property) {
|
||||
// Reset velocity
|
||||
if (property != "Velocity")
|
||||
velocity = Vector3::ZERO;
|
||||
void BasePart::onUpdated(std::string property) {
|
||||
bool reset = property == "Position" || property == "Rotation" || property == "CFrame" || property == "Size" || property == "Shape";
|
||||
|
||||
if (workspace())
|
||||
workspace().value()->SyncPartPhysics(std::dynamic_pointer_cast<Part>(this->shared_from_this()));
|
||||
workspace().value()->SyncPartPhysics(std::dynamic_pointer_cast<BasePart>(this->shared_from_this()));
|
||||
|
||||
// When position/rotation/size is manually edited, break all joints, they don't apply anymore
|
||||
if (property != "Anchored")
|
||||
if (reset)
|
||||
BreakJoints();
|
||||
}
|
||||
|
||||
|
@ -88,7 +85,7 @@ static Vector3 verts[8] {
|
|||
{1, 1, 1},
|
||||
};
|
||||
|
||||
Vector3 Part::GetAABB() {
|
||||
Vector3 BasePart::GetAABB() {
|
||||
Vector3 min(0, 0, 0);
|
||||
Vector3 max(0, 0, 0);
|
||||
for (Vector3 vert : verts) {
|
||||
|
@ -99,7 +96,7 @@ Vector3 Part::GetAABB() {
|
|||
return (min - max).Abs() / 2;
|
||||
}
|
||||
|
||||
void Part::BreakJoints() {
|
||||
void BasePart::BreakJoints() {
|
||||
for (std::weak_ptr<JointInstance> joint : primaryJoints) {
|
||||
if (joint.expired()) continue;
|
||||
joint.lock()->Destroy();
|
||||
|
@ -120,7 +117,7 @@ static Vector3 FACES[6] = {
|
|||
{0, 0, -1},
|
||||
};
|
||||
|
||||
SurfaceType Part::surfaceFromFace(NormalId face) {
|
||||
SurfaceType BasePart::surfaceFromFace(NormalId face) {
|
||||
switch (face) {
|
||||
case Top: return topSurface;
|
||||
case Bottom: return bottomSurface;
|
||||
|
@ -132,7 +129,7 @@ SurfaceType Part::surfaceFromFace(NormalId face) {
|
|||
return SurfaceType::Smooth; // Unreachable
|
||||
}
|
||||
|
||||
float Part::GetSurfaceParamA(Vector3 face) {
|
||||
float BasePart::GetSurfaceParamA(Vector3 face) {
|
||||
switch (faceFromNormal(face)) {
|
||||
case Top: return topParamA;
|
||||
case Bottom: return bottomParamA;
|
||||
|
@ -144,7 +141,7 @@ float Part::GetSurfaceParamA(Vector3 face) {
|
|||
return 0; // Unreachable
|
||||
}
|
||||
|
||||
float Part::GetSurfaceParamB(Vector3 face) {
|
||||
float BasePart::GetSurfaceParamB(Vector3 face) {
|
||||
switch (faceFromNormal(face)) {
|
||||
case Top: return topParamB;
|
||||
case Bottom: return bottomParamB;
|
||||
|
@ -156,14 +153,18 @@ float Part::GetSurfaceParamB(Vector3 face) {
|
|||
return 0; // Unreachable
|
||||
}
|
||||
|
||||
bool Part::checkJointContinuity(std::shared_ptr<Part> otherPart) {
|
||||
Vector3 BasePart::GetEffectiveSize() {
|
||||
return size;
|
||||
}
|
||||
|
||||
bool BasePart::checkJointContinuity(std::shared_ptr<BasePart> otherPart) {
|
||||
// Make sure that the two parts don't depend on one another
|
||||
|
||||
return checkJointContinuityUp(otherPart) && checkJointContinuityDown(otherPart);
|
||||
}
|
||||
|
||||
bool Part::checkJointContinuityDown(std::shared_ptr<Part> otherPart) {
|
||||
if (shared<Part>() == otherPart) return false;
|
||||
bool BasePart::checkJointContinuityDown(std::shared_ptr<BasePart> otherPart) {
|
||||
if (shared<BasePart>() == otherPart) return false;
|
||||
for (auto joint : primaryJoints) {
|
||||
if (joint.expired() || joint.lock()->part1.expired()) continue;
|
||||
if (!joint.lock()->part1.lock()->checkJointContinuityDown(otherPart))
|
||||
|
@ -172,8 +173,8 @@ bool Part::checkJointContinuityDown(std::shared_ptr<Part> otherPart) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool Part::checkJointContinuityUp(std::shared_ptr<Part> otherPart) {
|
||||
if (shared<Part>() == otherPart) return false;
|
||||
bool BasePart::checkJointContinuityUp(std::shared_ptr<BasePart> otherPart) {
|
||||
if (shared<BasePart>() == otherPart) return false;
|
||||
for (auto joint : secondaryJoints) {
|
||||
if (joint.expired() || joint.lock()->part0.expired()) continue;
|
||||
if (!joint.lock()->part0.lock()->checkJointContinuityUp(otherPart))
|
||||
|
@ -182,7 +183,7 @@ bool Part::checkJointContinuityUp(std::shared_ptr<Part> otherPart) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool Part::checkSurfacesTouching(CFrame surfaceFrame, Vector3 size, Vector3 myFace, Vector3 otherFace, std::shared_ptr<Part> otherPart) {
|
||||
bool BasePart::checkSurfacesTouching(CFrame surfaceFrame, Vector3 size, Vector3 myFace, Vector3 otherFace, std::shared_ptr<BasePart> otherPart) {
|
||||
Vector3 farCorner0 = surfaceFrame.Inverse() * otherPart->cframe * (Vector3::ONE * (otherPart->size / 2.f));
|
||||
Vector3 farCorner1 = surfaceFrame.Inverse() * otherPart->cframe * (-Vector3::ONE * (otherPart->size / 2.f));
|
||||
|
||||
|
@ -218,7 +219,7 @@ std::optional<std::shared_ptr<JointInstance>> makeJointFromSurfaces(SurfaceType
|
|||
return std::nullopt;
|
||||
}
|
||||
|
||||
void Part::MakeJoints() {
|
||||
void BasePart::MakeJoints() {
|
||||
// Algorithm: Find nearby parts
|
||||
// Make sure parts are not dependant on each other (via primary/secondaryJoints)
|
||||
// Find matching surfaces (surface normal dot product < -0.999)
|
||||
|
@ -233,8 +234,8 @@ void Part::MakeJoints() {
|
|||
for (auto it = workspace().value()->GetDescendantsStart(); it != workspace().value()->GetDescendantsEnd(); it++) {
|
||||
std::shared_ptr<Instance> obj = *it;
|
||||
if (obj == shared_from_this()) continue; // Skip ourselves
|
||||
if (obj->GetClass()->className != "Part") continue; // TODO: Replace this with a .IsA call instead of comparing the class name directly
|
||||
std::shared_ptr<Part> otherPart = obj->CastTo<Part>().expect();
|
||||
if (!obj->IsA<BasePart>()) continue;
|
||||
std::shared_ptr<BasePart> otherPart = obj->CastTo<BasePart>().expect();
|
||||
|
||||
for (Vector3 myFace : FACES) {
|
||||
Vector3 myWorldNormal = cframe.Rotation() * myFace;
|
||||
|
@ -278,8 +279,8 @@ void Part::MakeJoints() {
|
|||
auto joint_ = makeJointFromSurfaces(mySurface, otherSurface);
|
||||
if (!joint_) continue;
|
||||
std::shared_ptr<JointInstance> joint = joint_.value();
|
||||
joint->part0 = shared<Part>();
|
||||
joint->part1 = otherPart->shared<Part>();
|
||||
joint->part0 = shared<BasePart>();
|
||||
joint->part1 = otherPart->shared<BasePart>();
|
||||
joint->c0 = contact0;
|
||||
joint->c1 = contact1;
|
||||
dataModel().value()->GetService<JointsService>()->AddChild(joint);
|
||||
|
@ -291,7 +292,7 @@ void Part::MakeJoints() {
|
|||
}
|
||||
}
|
||||
|
||||
void Part::trackJoint(std::shared_ptr<JointInstance> joint) {
|
||||
void BasePart::trackJoint(std::shared_ptr<JointInstance> joint) {
|
||||
if (!joint->part0.expired() && joint->part0.lock() == shared_from_this()) {
|
||||
for (auto it = primaryJoints.begin(); it != primaryJoints.end();) {
|
||||
// Clean expired refs
|
||||
|
@ -325,7 +326,7 @@ void Part::trackJoint(std::shared_ptr<JointInstance> joint) {
|
|||
}
|
||||
}
|
||||
|
||||
void Part::untrackJoint(std::shared_ptr<JointInstance> joint) {
|
||||
void BasePart::untrackJoint(std::shared_ptr<JointInstance> joint) {
|
||||
for (auto it = primaryJoints.begin(); it != primaryJoints.end();) {
|
||||
// Clean expired refs
|
||||
if (it->expired() || it->lock() == joint) {
|
|
@ -12,9 +12,11 @@
|
|||
#include "enum/surface.h"
|
||||
#include <mutex>
|
||||
#include <optional>
|
||||
#include <reactphysics3d/body/RigidBody.h>
|
||||
#include <reactphysics3d/engine/PhysicsCommon.h>
|
||||
#include <reactphysics3d/reactphysics3d.h>
|
||||
#include <vector>
|
||||
#include "annotation.h"
|
||||
#include "objects/annotation.h"
|
||||
#include "objects/pvinstance.h"
|
||||
|
||||
namespace rp = reactphysics3d;
|
||||
|
@ -34,11 +36,11 @@ class Workspace;
|
|||
|
||||
#ifndef __SIMULATION_TICKET
|
||||
#define __SIMULATION_TICKET
|
||||
class Part;
|
||||
typedef std::list<std::shared_ptr<Part>>::iterator SimulationTicket;
|
||||
class BasePart;
|
||||
typedef std::list<std::shared_ptr<BasePart>>::iterator SimulationTicket;
|
||||
#endif
|
||||
|
||||
class DEF_INST_(explorer_icon="part") Part : public PVInstance {
|
||||
class DEF_INST_ABSTRACT_(explorer_icon="part") BasePart : public PVInstance {
|
||||
AUTOGEN_PREAMBLE
|
||||
protected:
|
||||
// Joints where this part is Part0
|
||||
|
@ -50,10 +52,10 @@ protected:
|
|||
void untrackJoint(std::shared_ptr<JointInstance>);
|
||||
|
||||
SurfaceType surfaceFromFace(NormalId);
|
||||
bool checkJointContinuity(std::shared_ptr<Part>);
|
||||
bool checkJointContinuityUp(std::shared_ptr<Part>);
|
||||
bool checkJointContinuityDown(std::shared_ptr<Part>);
|
||||
bool checkSurfacesTouching(CFrame surfaceFrame, Vector3 size, Vector3 myFace, Vector3 otherFace, std::shared_ptr<Part> otherPart);
|
||||
bool checkJointContinuity(std::shared_ptr<BasePart>);
|
||||
bool checkJointContinuityUp(std::shared_ptr<BasePart>);
|
||||
bool checkJointContinuityDown(std::shared_ptr<BasePart>);
|
||||
bool checkSurfacesTouching(CFrame surfaceFrame, Vector3 size, Vector3 myFace, Vector3 otherFace, std::shared_ptr<BasePart> otherPart);
|
||||
|
||||
friend JointInstance;
|
||||
friend Workspace;
|
||||
|
@ -62,6 +64,11 @@ protected:
|
|||
virtual void OnWorkspaceRemoved(std::shared_ptr<Workspace> oldWorkspace) override;
|
||||
void OnAncestryChanged(std::optional<std::shared_ptr<Instance>> child, std::optional<std::shared_ptr<Instance>> newParent) override;
|
||||
void onUpdated(std::string);
|
||||
|
||||
virtual void updateCollider(rp::PhysicsCommon* common) = 0;
|
||||
|
||||
BasePart(const InstanceType*);
|
||||
BasePart(const InstanceType*, PartConstructParams params);
|
||||
public:
|
||||
DEF_PROP_CATEGORY(DATA)
|
||||
DEF_PROP_(on_update=onUpdated) Vector3 velocity;
|
||||
|
@ -76,6 +83,7 @@ public:
|
|||
DEF_PROP_CATEGORY(APPEARANCE)
|
||||
DEF_PROP Color3 color;
|
||||
DEF_PROP float transparency = 0.f;
|
||||
DEF_PROP float reflectance = 0.f;
|
||||
|
||||
DEF_PROP_CATEGORY(BEHAVIOR)
|
||||
DEF_PROP_(on_update=onUpdated) bool anchored = false;
|
||||
|
@ -109,20 +117,15 @@ public:
|
|||
DEF_SIGNAL SignalSource TouchEnded;
|
||||
|
||||
rp::RigidBody* rigidBody = nullptr;
|
||||
SimulationTicket simulationTicket;
|
||||
std::optional<SimulationTicket> simulationTicket;
|
||||
bool rigidBodyDirty = true;
|
||||
|
||||
inline SurfaceType GetSurfaceFromFace(NormalId face) { return surfaceFromFace(face); }
|
||||
float GetSurfaceParamA(Vector3 face);
|
||||
float GetSurfaceParamB(Vector3 face);
|
||||
virtual Vector3 GetEffectiveSize();
|
||||
|
||||
Part();
|
||||
Part(PartConstructParams params);
|
||||
~Part() override;
|
||||
|
||||
static inline std::shared_ptr<Part> New() { return std::make_shared<Part>(); };
|
||||
static inline std::shared_ptr<Part> New(PartConstructParams params) { return std::make_shared<Part>(params); };
|
||||
static inline std::shared_ptr<Instance> Create() { return std::make_shared<Part>(); };
|
||||
~BasePart() override;
|
||||
|
||||
inline Vector3 position() { return cframe.Position(); }
|
||||
|
42
core/src/objects/part/part.cpp
Normal file
|
@ -0,0 +1,42 @@
|
|||
#include "part.h"
|
||||
#include "enum/part.h"
|
||||
#include "physics/util.h"
|
||||
#include <glm/common.hpp>
|
||||
|
||||
Part::Part(): BasePart(&TYPE) {
|
||||
_lastShape = shape;
|
||||
_lastSize = size;
|
||||
}
|
||||
|
||||
Part::Part(PartConstructParams params): BasePart(&TYPE, params) {
|
||||
_lastShape = shape;
|
||||
_lastSize = size;
|
||||
}
|
||||
|
||||
void Part::updateCollider(rp::PhysicsCommon* common) {
|
||||
rp::CollisionShape* physShape;
|
||||
if (shape == PartType::Ball) {
|
||||
physShape = common->createSphereShape(glm::min(size.X(), size.Y(), size.Z()) * 0.5f);
|
||||
} else if (shape == PartType::Block) {
|
||||
physShape = common->createBoxShape(glmToRp(size * glm::vec3(0.5f)));
|
||||
}
|
||||
|
||||
// Recreate the rigidbody if the shape changes
|
||||
if (rigidBody->getNbColliders() > 0 && (_lastShape != shape || _lastSize != size)) {
|
||||
// TODO: This causes Touched to get called twice. Fix this.
|
||||
rigidBody->removeCollider(rigidBody->getCollider(0));
|
||||
rigidBody->addCollider(physShape, rp::Transform());
|
||||
}
|
||||
|
||||
if (rigidBody->getNbColliders() == 0)
|
||||
rigidBody->addCollider(physShape, rp::Transform());
|
||||
|
||||
|
||||
_lastShape = shape;
|
||||
_lastSize = size;
|
||||
}
|
||||
|
||||
Vector3 Part::GetEffectiveSize() {
|
||||
return shape == PartType::Ball ? (Vector3)glm::vec3(glm::min(size.X(), size.Y(), size.Z())) : size;
|
||||
|
||||
}
|
26
core/src/objects/part/part.h
Normal file
|
@ -0,0 +1,26 @@
|
|||
#pragma once
|
||||
|
||||
#include "basepart.h"
|
||||
#include "enum/part.h"
|
||||
#include "objects/annotation.h"
|
||||
|
||||
class DEF_INST Part : public BasePart {
|
||||
AUTOGEN_PREAMBLE
|
||||
|
||||
PartType _lastShape;
|
||||
Vector3 _lastSize;
|
||||
protected:
|
||||
void updateCollider(rp::PhysicsCommon* common) override;
|
||||
|
||||
public:
|
||||
Part();
|
||||
Part(PartConstructParams params);
|
||||
|
||||
DEF_PROP_(on_update=onUpdated) PartType shape = PartType::Block;
|
||||
|
||||
Vector3 GetEffectiveSize() override;
|
||||
|
||||
static inline std::shared_ptr<Part> New() { return std::make_shared<Part>(); };
|
||||
static inline std::shared_ptr<Part> New(PartConstructParams params) { return std::make_shared<Part>(params); };
|
||||
static inline std::shared_ptr<Instance> Create() { return std::make_shared<Part>(); };
|
||||
};
|
92
core/src/objects/part/wedgepart.cpp
Normal file
|
@ -0,0 +1,92 @@
|
|||
#include "wedgepart.h"
|
||||
#include "physics/util.h"
|
||||
#include <reactphysics3d/collision/ConvexMesh.h>
|
||||
#include <reactphysics3d/collision/shapes/ConvexMeshShape.h>
|
||||
|
||||
rp::ConvexMesh* wedgePhysMesh;
|
||||
|
||||
WedgePart::WedgePart(): BasePart(&TYPE) {
|
||||
}
|
||||
|
||||
WedgePart::WedgePart(PartConstructParams params): BasePart(&TYPE, params) {
|
||||
|
||||
}
|
||||
|
||||
void WedgePart::updateCollider(rp::PhysicsCommon* common) {
|
||||
Logger::fatalError("Wedges are currently disabled! Please do not use them or your editor may crash\n");
|
||||
rp::ConvexMeshShape* shape = common->createConvexMeshShape(wedgePhysMesh, glmToRp(size * glm::vec3(0.5f)));
|
||||
|
||||
// Recreate the rigidbody if the shape changes
|
||||
if (rigidBody->getNbColliders() > 0
|
||||
&& dynamic_cast<rp::ConvexMeshShape*>(rigidBody->getCollider(0)->getCollisionShape())->getScale() != shape->getScale()) {
|
||||
// TODO: This causes Touched to get called twice. Fix this.
|
||||
rigidBody->removeCollider(rigidBody->getCollider(0));
|
||||
rigidBody->addCollider(shape, rp::Transform());
|
||||
}
|
||||
|
||||
if (rigidBody->getNbColliders() == 0)
|
||||
rigidBody->addCollider(shape, rp::Transform());
|
||||
}
|
||||
|
||||
void WedgePart::createWedgeShape(rp::PhysicsCommon* common) {
|
||||
// https://www.reactphysics3d.com/documentation/index.html#creatingbody
|
||||
float vertices[] = {
|
||||
// X Y Z
|
||||
/*0*/ -1, 1, 1, // 0
|
||||
/*1*/ -1, -1, 1, // |
|
||||
/*2*/ -1, -1, -1, // 1---2
|
||||
|
||||
/*3*/ 1, 1, 1,
|
||||
/*4*/ 1, -1, 1,
|
||||
/*5*/ 1, -1, -1,
|
||||
};
|
||||
|
||||
// -x +x
|
||||
// +z 1----------4
|
||||
// | bottom |
|
||||
// -z 2----------5
|
||||
|
||||
// -x +x
|
||||
// +y 0----------3
|
||||
// | front |
|
||||
// -y 1----------4
|
||||
|
||||
// -x +x
|
||||
// +yz 0----------3
|
||||
// | slope |
|
||||
// -yz 2----------5
|
||||
|
||||
int indices[] = {
|
||||
// Base
|
||||
1, 2, 5, 4,
|
||||
|
||||
// Back-face
|
||||
0, 1, 4, 3,
|
||||
// 4, 1, 0, 3,
|
||||
|
||||
// Slope
|
||||
0, 2, 5, 3,
|
||||
// 3, 5, 2, 0,
|
||||
|
||||
// Sides
|
||||
0, 1, 2,
|
||||
3, 4, 5,
|
||||
};
|
||||
|
||||
// Description of the six faces of the convex mesh
|
||||
rp::PolygonVertexArray::PolygonFace* polygonFaces = new rp::PolygonVertexArray::PolygonFace[5];
|
||||
polygonFaces[0] = { 4, 0 }; // Bottom
|
||||
polygonFaces[1] = { 4, 4 }; // Front
|
||||
polygonFaces[2] = { 4, 8 }; // Slope
|
||||
polygonFaces[3] = { 3, 12 }; // Side
|
||||
polygonFaces[4] = { 3, 15 }; // Side
|
||||
|
||||
// Create the polygon vertex array
|
||||
rp::PolygonVertexArray polygonVertexArray(6, vertices, 3 * sizeof(float), indices, sizeof(int), 5, polygonFaces,
|
||||
rp::PolygonVertexArray::VertexDataType::VERTEX_FLOAT_TYPE,
|
||||
rp::PolygonVertexArray::IndexDataType::INDEX_INTEGER_TYPE);
|
||||
|
||||
// Create the convex mesh
|
||||
std::vector<rp3d::Message> messages;
|
||||
// wedgePhysMesh = common->createConvexMesh(polygonVertexArray, messages);
|
||||
}
|
21
core/src/objects/part/wedgepart.h
Normal file
|
@ -0,0 +1,21 @@
|
|||
#pragma once
|
||||
|
||||
#include "basepart.h"
|
||||
#include "objects/annotation.h"
|
||||
|
||||
class DEF_INST_(hidden) WedgePart : public BasePart {
|
||||
AUTOGEN_PREAMBLE
|
||||
|
||||
protected:
|
||||
void updateCollider(rp::PhysicsCommon* common) override;
|
||||
static void createWedgeShape(rp::PhysicsCommon* common);
|
||||
|
||||
friend Workspace;
|
||||
public:
|
||||
WedgePart();
|
||||
WedgePart(PartConstructParams params);
|
||||
|
||||
static inline std::shared_ptr<WedgePart> New() { return std::make_shared<WedgePart>(); };
|
||||
static inline std::shared_ptr<WedgePart> New(PartConstructParams params) { return std::make_shared<WedgePart>(params); };
|
||||
static inline std::shared_ptr<Instance> Create() { return std::make_shared<WedgePart>(); };
|
||||
};
|
|
@ -1,5 +1,7 @@
|
|||
#include "script.h"
|
||||
#include "common.h"
|
||||
#include "datatypes/variant.h"
|
||||
#include "lauxlib.h"
|
||||
#include "logger.h"
|
||||
#include "objects/base/instance.h"
|
||||
#include "objects/base/member.h"
|
||||
|
@ -7,12 +9,11 @@
|
|||
#include "objects/service/workspace.h"
|
||||
#include "objects/datamodel.h"
|
||||
#include "datatypes/ref.h"
|
||||
#include "lua.h" // IWYU pragma: keep
|
||||
#include "luaapis.h" // IWYU pragma: keep
|
||||
#include <algorithm>
|
||||
#include <memory>
|
||||
|
||||
int script_wait(lua_State*);
|
||||
int script_delay(lua_State*);
|
||||
int script_errhandler(lua_State*);
|
||||
|
||||
Script::Script(): Instance(&TYPE) {
|
||||
source = "print(\"Hello, world!\")";
|
||||
|
@ -25,101 +26,106 @@ void Script::Run() {
|
|||
std::shared_ptr<ScriptContext> scriptContext = dataModel().value()->GetService<ScriptContext>();
|
||||
|
||||
lua_State* L = scriptContext->state;
|
||||
int top = lua_gettop(L);
|
||||
|
||||
// Create thread
|
||||
this->thread = lua_newthread(L);
|
||||
lua_State* Lt = thread;
|
||||
|
||||
// Initialize script globals
|
||||
lua_getglobal(Lt, "_G");
|
||||
// Push wrapper as thread function
|
||||
lua_getfield(Lt, LUA_REGISTRYINDEX, "LuaPCallWrapper");
|
||||
|
||||
InstanceRef(shared_from_this()).PushLuaValue(Lt);
|
||||
lua_setfield(Lt, -2, "script");
|
||||
|
||||
InstanceRef(dataModel().value()).PushLuaValue(Lt);
|
||||
lua_setfield(Lt, -2, "game");
|
||||
// Load source code and push onto thread as upvalue for wrapper
|
||||
int status = luaL_loadbuffer(Lt, source.c_str(), source.size(), this->GetFullName().c_str());
|
||||
if (status != LUA_OK) {
|
||||
// Failed to parse/load chunk
|
||||
Logger::error(lua_tostring(Lt, -1));
|
||||
|
||||
InstanceRef(dataModel().value()->GetService<Workspace>()).PushLuaValue(Lt);
|
||||
lua_setfield(Lt, -2, "workspace");
|
||||
|
||||
lua_pushlightuserdata(Lt, scriptContext.get());
|
||||
lua_pushcclosure(Lt, script_wait, 1);
|
||||
lua_setfield(Lt, -2, "wait");
|
||||
|
||||
lua_pushlightuserdata(Lt, scriptContext.get());
|
||||
lua_pushcclosure(Lt, script_delay, 1);
|
||||
lua_setfield(Lt, -2, "delay");
|
||||
|
||||
lua_pop(Lt, 1); // _G
|
||||
|
||||
// Load source and push onto thread stack as function ptr
|
||||
// luaL_loadstring(Lt, source.c_str());
|
||||
luaL_loadbuffer(Lt, source.c_str(), source.size(), scriptContext->RegisterScriptSource(shared<Script>()).c_str());
|
||||
|
||||
int status = lua_resume(Lt, 0);
|
||||
if (status > LUA_YIELD) {
|
||||
lua_Debug dbg;
|
||||
lua_getstack(Lt, 1, &dbg);
|
||||
lua_getinfo(Lt, "S", &dbg);
|
||||
|
||||
std::weak_ptr<Script> source = scriptContext->GetScriptFromSource(dbg.source);
|
||||
|
||||
std::string errorMessage = lua_tostring(Lt, -1);
|
||||
if (!source.expired())
|
||||
errorMessage = source.lock()->GetFullName() + errorMessage.substr(errorMessage.find(':'));
|
||||
|
||||
Logger::error(errorMessage);
|
||||
lua_pop(Lt, 1); // Pop return value
|
||||
|
||||
Logger::traceStart();
|
||||
|
||||
int stack = 1;
|
||||
while (lua_getstack(Lt, stack++, &dbg)) {
|
||||
lua_getinfo(Lt, "nlSu", &dbg);
|
||||
|
||||
std::weak_ptr<Script> source = scriptContext->GetScriptFromSource(dbg.source);
|
||||
if (source.expired()) {
|
||||
Logger::trace(dbg.source, dbg.currentline);
|
||||
} else {
|
||||
Logger::trace(source.lock()->GetFullName(), dbg.currentline, &source);
|
||||
}
|
||||
}
|
||||
|
||||
Logger::traceEnd();
|
||||
lua_settop(L, top);
|
||||
return;
|
||||
}
|
||||
|
||||
// Initialize script globals
|
||||
scriptContext->NewEnvironment(Lt); // Pushes envtable, metatable
|
||||
|
||||
// Set script in metatable source
|
||||
InstanceRef(shared_from_this()).PushLuaValue(Lt);
|
||||
lua_setfield(Lt, -2, "source");
|
||||
|
||||
lua_pop(Lt, 1); // Pop metatable
|
||||
|
||||
// Set script in environment
|
||||
InstanceRef(shared_from_this()).PushLuaValue(Lt);
|
||||
lua_setfield(Lt, -2, "script");
|
||||
|
||||
lua_setfenv(Lt, -2); // Set env of loaded function
|
||||
|
||||
// Push our error handler and then generate the wrapped function
|
||||
lua_pushcfunction(Lt, script_errhandler);
|
||||
lua_call(Lt, 2, 1);
|
||||
|
||||
// Resume the thread
|
||||
lua_resume(Lt, 0);
|
||||
|
||||
lua_pop(L, 1); // Pop the thread
|
||||
lua_settop(L, top);
|
||||
}
|
||||
|
||||
void Script::Stop() {
|
||||
// TODO:
|
||||
}
|
||||
|
||||
int script_wait(lua_State* L) {
|
||||
ScriptContext* scriptContext = (ScriptContext*)lua_touserdata(L, lua_upvalueindex(1));
|
||||
float secs = lua_gettop(L) == 0 ? 0.03 : std::max(luaL_checknumber(L, 1), 0.03);
|
||||
if (lua_gettop(L) > 0) lua_pop(L, 1); // pop secs
|
||||
static std::shared_ptr<Script> getfsource(lua_State* L, lua_Debug* dbg) {
|
||||
int top = lua_gettop(L);
|
||||
|
||||
scriptContext->PushThreadSleep(L, secs);
|
||||
lua_getinfo(L, "f", dbg);
|
||||
lua_getfenv(L, -1); // Get fenv of stack pos
|
||||
if (lua_isnil(L, -1)) { // No env could be found
|
||||
lua_settop(L, top);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Yield
|
||||
return lua_yield(L, 0);
|
||||
// Get source from metatable
|
||||
lua_getmetatable(L, -1);
|
||||
lua_getfield(L, -1, "source");
|
||||
|
||||
auto result = InstanceRef::FromLuaValue(L, -1);
|
||||
if (!result) {
|
||||
lua_settop(L, top);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
lua_settop(L, top);
|
||||
|
||||
std::shared_ptr<Instance> ref = result.expect().get<InstanceRef>();
|
||||
if (!ref->IsA<Script>()) return nullptr;
|
||||
|
||||
return ref->CastTo<Script>().expect();
|
||||
}
|
||||
|
||||
int script_delay(lua_State* L) {
|
||||
ScriptContext* scriptContext = (ScriptContext*)lua_touserdata(L, lua_upvalueindex(1));
|
||||
float secs = std::max(luaL_checknumber(L, 1), 0.03);
|
||||
luaL_checktype(L, 2, LUA_TFUNCTION);
|
||||
int script_errhandler(lua_State* L) {
|
||||
std::string errorMessage = lua_tostring(L, -1);
|
||||
Logger::error(errorMessage);
|
||||
|
||||
lua_State* Lt = lua_newthread(L); // Create a new thread
|
||||
// I think this is memory abuse??
|
||||
// Wouldn't popping the thread in this case make it eligible for garbage collection?
|
||||
lua_pop(L, 1); // pop the newly created thread so that xmove moves func instead of it into itself
|
||||
lua_xmove(L, Lt, 1); // move func
|
||||
lua_pop(L, 1); // pop secs
|
||||
// Traceback
|
||||
|
||||
// Schedule next run
|
||||
scriptContext->PushThreadSleep(Lt, secs);
|
||||
Logger::trace("Stack start");
|
||||
|
||||
lua_Debug dbg;
|
||||
int stack = 1;
|
||||
while (lua_getstack(L, stack++, &dbg)) {
|
||||
lua_getinfo(L, "nlSu", &dbg);
|
||||
// Ignore C frames and internal wrappers
|
||||
if (strcmp(dbg.what, "C") == 0 || strcmp(dbg.source, "=PCALL_WRAPPER") == 0)
|
||||
continue;
|
||||
|
||||
// Find script source
|
||||
std::shared_ptr<Script> source = getfsource(L, &dbg);
|
||||
|
||||
Logger::scriptLogf("'%s', Line %d", Logger::LogLevel::TRACE, {source, dbg.currentline}, dbg.source, dbg.currentline);
|
||||
}
|
||||
|
||||
Logger::trace("Stack end");
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -3,7 +3,7 @@
|
|||
#include "objects/annotation.h"
|
||||
#include "objects/base/service.h"
|
||||
|
||||
class DEF_INST_SERVICE JointsService : public Service {
|
||||
class DEF_INST_SERVICE_(hidden) JointsService : public Service {
|
||||
AUTOGEN_PREAMBLE
|
||||
private:
|
||||
std::optional<std::shared_ptr<Workspace>> jointWorkspace();
|
||||
|
|
|
@ -1,22 +1,30 @@
|
|||
#include "scriptcontext.h"
|
||||
#include "datatypes/cframe.h"
|
||||
#include "datatypes/color3.h"
|
||||
#include "datatypes/ref.h"
|
||||
#include "datatypes/vector.h"
|
||||
#include "logger.h"
|
||||
#include "objects/datamodel.h"
|
||||
#include "objects/service/workspace.h"
|
||||
#include "timeutil.h"
|
||||
#include <ctime>
|
||||
#include <string>
|
||||
#include "lua.h" // IWYU pragma: keep
|
||||
#include "luaapis.h" // IWYU pragma: keep
|
||||
|
||||
const char* WRAPPER_SRC = "local func, errhandler = ... return function(...) local args = {...} xpcall(function() func(unpack(args)) end, errhandler) end";
|
||||
|
||||
int g_wait(lua_State*);
|
||||
int g_delay(lua_State*);
|
||||
static int g_print(lua_State*);
|
||||
static int g_require(lua_State*);
|
||||
static const struct luaL_Reg luaglobals [] = {
|
||||
static const luaL_Reg luaglobals [] = {
|
||||
{"print", g_print},
|
||||
{"require", g_require},
|
||||
{NULL, NULL} /* end of array */
|
||||
};
|
||||
|
||||
std::string unsafe_globals[] = {
|
||||
// Todo implement our own "safe" setfenv/getfenv
|
||||
"loadfile", "loadstring", "load", "dofile", "getfenv", "setfenv"
|
||||
};
|
||||
|
||||
|
@ -46,6 +54,30 @@ void ScriptContext::InitService() {
|
|||
Vector3::PushLuaLibrary(state);
|
||||
CFrame::PushLuaLibrary(state);
|
||||
Color3::PushLuaLibrary(state);
|
||||
Instance::PushLuaLibrary(state);
|
||||
|
||||
// Add other globals
|
||||
lua_getglobal(state, "_G");
|
||||
|
||||
InstanceRef(dataModel().value()).PushLuaValue(state);
|
||||
lua_setfield(state, -2, "game");
|
||||
|
||||
InstanceRef(dataModel().value()->GetService<Workspace>()).PushLuaValue(state);
|
||||
lua_setfield(state, -2, "workspace");
|
||||
|
||||
lua_pushlightuserdata(state, this);
|
||||
lua_pushcclosure(state, g_wait, 1);
|
||||
lua_setfield(state, -2, "wait");
|
||||
|
||||
lua_pushlightuserdata(state, this);
|
||||
lua_pushcclosure(state, g_delay, 1);
|
||||
lua_setfield(state, -2, "delay");
|
||||
|
||||
lua_pop(state, 1); // _G
|
||||
|
||||
// Add wrapper function
|
||||
luaL_loadbuffer(state, WRAPPER_SRC, strlen(WRAPPER_SRC), "=PCALL_WRAPPER");
|
||||
lua_setfield(state, LUA_REGISTRYINDEX, "LuaPCallWrapper");
|
||||
|
||||
// TODO: custom os library
|
||||
|
||||
|
@ -105,11 +137,7 @@ void ScriptContext::RunSleepingThreads() {
|
|||
// Time args
|
||||
lua_pushnumber(sleep.thread, float(tu_clock_micros() - sleep.timeYieldedWhen) / 1'000'000);
|
||||
lua_pushnumber(sleep.thread, float(tu_clock_micros()) / 1'000'000);
|
||||
int status = lua_resume(sleep.thread, 2);
|
||||
if (status > LUA_YIELD) {
|
||||
Logger::error(lua_tostring(sleep.thread, -1));
|
||||
lua_pop(sleep.thread, 1); // Pop return value
|
||||
}
|
||||
lua_resume(sleep.thread, 2);
|
||||
|
||||
// Remove thread
|
||||
deleted = true;
|
||||
|
@ -134,21 +162,25 @@ void ScriptContext::RunSleepingThreads() {
|
|||
schedTime = tu_clock_micros() - startTime;
|
||||
}
|
||||
|
||||
std::string ScriptContext::RegisterScriptSource(std::shared_ptr<Script> script) {
|
||||
// If it has already been registered, reference it here
|
||||
for (auto& [id, script2] : scriptSources) {
|
||||
if (!script2.expired() && script2.lock() == script)
|
||||
return "=f" + std::to_string(id);
|
||||
}
|
||||
void ScriptContext::NewEnvironment(lua_State* L) {
|
||||
lua_newtable(L); // Env table
|
||||
lua_newtable(L); // Metatable
|
||||
|
||||
int id = lastScriptSourceId++;
|
||||
scriptSources[id] = script;
|
||||
return "=f" + std::to_string(id);
|
||||
}
|
||||
// Push __index
|
||||
lua_pushvalue(L, LUA_GLOBALSINDEX);
|
||||
lua_setfield(L, -2, "__index");
|
||||
|
||||
std::weak_ptr<Script> ScriptContext::GetScriptFromSource(std::string source) {
|
||||
int id = std::stoi(source.c_str() + 2);
|
||||
return scriptSources[id];
|
||||
// Push __metatable
|
||||
lua_pushstring(L, "metatable is locked");
|
||||
lua_setfield(L, -2, "__metatable");
|
||||
|
||||
// Copy metatable and set the env table's metatable
|
||||
lua_pushvalue(L, -1);
|
||||
lua_setmetatable(L, -3);
|
||||
|
||||
// Remainder on stack:
|
||||
// 1. Env table
|
||||
// 2. Metatable
|
||||
}
|
||||
|
||||
// https://www.lua.org/source/5.1/lbaselib.c.html
|
||||
|
@ -181,4 +213,33 @@ static int g_require(lua_State* L) {
|
|||
if (nargs < 1) return luaL_error(L, "expected argument module");
|
||||
|
||||
return luaL_error(L, "require is not yet implemented");
|
||||
}
|
||||
|
||||
int g_wait(lua_State* L) {
|
||||
ScriptContext* scriptContext = (ScriptContext*)lua_touserdata(L, lua_upvalueindex(1));
|
||||
float secs = lua_gettop(L) == 0 ? 0.03 : std::max(luaL_checknumber(L, 1), 0.03);
|
||||
if (lua_gettop(L) > 0) lua_pop(L, 1); // pop secs
|
||||
|
||||
scriptContext->PushThreadSleep(L, secs);
|
||||
|
||||
// Yield
|
||||
return lua_yield(L, 0);
|
||||
}
|
||||
|
||||
int g_delay(lua_State* L) {
|
||||
ScriptContext* scriptContext = (ScriptContext*)lua_touserdata(L, lua_upvalueindex(1));
|
||||
float secs = std::max(luaL_checknumber(L, 1), 0.03);
|
||||
luaL_checktype(L, 2, LUA_TFUNCTION);
|
||||
|
||||
lua_State* Lt = lua_newthread(L); // Create a new thread
|
||||
// I think this is memory abuse??
|
||||
// Wouldn't popping the thread in this case make it eligible for garbage collection?
|
||||
lua_pop(L, 1); // pop the newly created thread so that xmove moves func instead of it into itself
|
||||
lua_xmove(L, Lt, 1); // move func
|
||||
lua_pop(L, 1); // pop secs
|
||||
|
||||
// Schedule next run
|
||||
scriptContext->PushThreadSleep(Lt, secs);
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
#include "objects/annotation.h"
|
||||
#include "objects/base/service.h"
|
||||
#include "lua.h" // IWYU pragma: keep
|
||||
#include "luaapis.h" // IWYU pragma: keep
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
|
@ -15,11 +15,10 @@ struct SleepingThread {
|
|||
|
||||
class Script;
|
||||
|
||||
class DEF_INST_SERVICE ScriptContext : public Service {
|
||||
class DEF_INST_SERVICE_(hidden) ScriptContext : public Service {
|
||||
AUTOGEN_PREAMBLE
|
||||
|
||||
std::vector<SleepingThread> sleepingThreads;
|
||||
std::map<int, std::weak_ptr<Script>> scriptSources;
|
||||
int lastScriptSourceId = 0;
|
||||
protected:
|
||||
void InitService() override;
|
||||
|
@ -32,8 +31,9 @@ public:
|
|||
lua_State* state;
|
||||
void PushThreadSleep(lua_State* thread, float delay);
|
||||
void RunSleepingThreads();
|
||||
std::string RegisterScriptSource(std::shared_ptr<Script>);
|
||||
std::weak_ptr<Script> GetScriptFromSource(std::string source);
|
||||
|
||||
// Generates an environment with a metatable and pushes it both the env table and metatable in order onto the stack
|
||||
void NewEnvironment(lua_State* state);
|
||||
|
||||
static inline std::shared_ptr<Instance> Create() { return std::make_shared<ScriptContext>(); };
|
||||
};
|