Compare commits
No commits in common. "master" and "windows-port" have entirely different histories.
master
...
windows-po
1
.clangd
|
@ -1,3 +1,2 @@
|
||||||
CompileFlags:
|
CompileFlags:
|
||||||
Add: [-std=c++20]
|
Add: [-std=c++20]
|
||||||
Remove: [-mno-direct-extern-access]
|
|
7
.vscode/launch.json
vendored
|
@ -4,13 +4,6 @@
|
||||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
{
|
|
||||||
"type": "gdb",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Debug (gdb)",
|
|
||||||
"program": "${workspaceFolder}/build/bin/editor",
|
|
||||||
"cwd": "${workspaceFolder}",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"type": "lldb",
|
"type": "lldb",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
|
|
32
BUILD.md
|
@ -1,27 +1,20 @@
|
||||||
# Building on Linux
|
# Building on Linux
|
||||||
|
|
||||||
You will need to install Qt and LLVM/libclang beforehand. All other packages will automatically be obtained through CPM.
|
For pre-requisite packages, check [deps.txt](./deps.txt)
|
||||||
|
|
||||||
ccache is highly recommended.
|
If your distribution does not provide ReactPhysics3D, you will have to build (and install) it yourself prior to this step
|
||||||
|
|
||||||
Use the following to generate the build files:
|
Use the following to generate the build files:
|
||||||
|
|
||||||
cmake -Bbuild .
|
cmake -Bbuild .
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> Add -DCMAKE_BUILD_TYPE=Release to produce a release build
|
|
||||||
|
|
||||||
Then build the project using:
|
Then build the project using:
|
||||||
|
|
||||||
cmake --build build
|
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
|
# Building on Windows
|
||||||
|
|
||||||
The process is very similar on Windows
|
The project will be built using VCPKG and MSVC
|
||||||
|
|
||||||
## Pre-requisites
|
## Pre-requisites
|
||||||
|
|
||||||
|
@ -29,7 +22,6 @@ The process is very similar on Windows
|
||||||
* Qt 6.8.3 or higher, with MSVC toolchain
|
* Qt 6.8.3 or higher, with MSVC toolchain
|
||||||
* CMake
|
* CMake
|
||||||
* Git (for cloning the repo, optional)
|
* 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\**
|
* QScintilla already built (see [docs/qscintilla.md](./docs/qscintilla.md)) *\*likely temporary\**
|
||||||
|
|
||||||
To start, clone the repository:
|
To start, clone the repository:
|
||||||
|
@ -42,18 +34,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
|
set CMAKE_PREFIX_PATH=C:\Qt\6.8.3\msvc2022_64
|
||||||
|
|
||||||
Now, generate the build files:
|
Now, generate the build files with cmake via the vcpkg preset:
|
||||||
|
|
||||||
cmake -Bbuild .
|
cmake -Bbuild . --preset vcpkg
|
||||||
|
|
||||||
Then, finally build:
|
Then, finally, build in release mode\*:
|
||||||
|
|
||||||
cmake --build build
|
cmake --build build --config Release
|
||||||
|
|
||||||
> [!NOTE]
|
The compiled binaries should then be placed in `./build/bin/` and should be ready for redistribution without any further work.
|
||||||
> To build in release mode, add -DCMAKE_BUILD_TYPE=Release to the configure (first) command,
|
|
||||||
> and add --config Release to the build (second) command
|
|
||||||
|
|
||||||
The compiled binaries should then be located in `./build/bin/[Debug|Release]` 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.
|
If any of the compilation steps fail, or the binaries fail to execute, please create an issue so that this can be corrected.
|
||||||
|
|
||||||
|
\* 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
|
|
@ -10,7 +10,6 @@ else()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" )
|
set( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" )
|
||||||
set(USE_CCACHE ON)
|
|
||||||
|
|
||||||
add_subdirectory(autogen)
|
add_subdirectory(autogen)
|
||||||
|
|
||||||
|
@ -25,6 +24,4 @@ add_subdirectory(client)
|
||||||
add_subdirectory(editor)
|
add_subdirectory(editor)
|
||||||
|
|
||||||
|
|
||||||
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/tests )
|
install(FILES $<TARGET_RUNTIME_DLLS:editor> TYPE BIN)
|
||||||
enable_testing()
|
|
||||||
add_subdirectory(tests)
|
|
21
CMakePresets.json
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
13
CMakeUserPresets.json
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
{
|
||||||
|
"version": 2,
|
||||||
|
"configurePresets": [
|
||||||
|
{
|
||||||
|
"name": "default",
|
||||||
|
"inherits": "vcpkg",
|
||||||
|
"environment": {
|
||||||
|
"VCPKG_ROOT": "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\vcpkg\\vcpkg.exe"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
504
LICENSE
|
@ -1,504 +0,0 @@
|
||||||
GNU LESSER GENERAL PUBLIC LICENSE
|
|
||||||
Version 2.1, February 1999
|
|
||||||
|
|
||||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
[This is the first released version of the Lesser GPL. It also counts
|
|
||||||
as the successor of the GNU Library Public License, version 2, hence
|
|
||||||
the version number 2.1.]
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
Licenses are intended to guarantee your freedom to share and change
|
|
||||||
free software--to make sure the software is free for all its users.
|
|
||||||
|
|
||||||
This license, the Lesser General Public License, applies to some
|
|
||||||
specially designated software packages--typically libraries--of the
|
|
||||||
Free Software Foundation and other authors who decide to use it. You
|
|
||||||
can use it too, but we suggest you first think carefully about whether
|
|
||||||
this license or the ordinary General Public License is the better
|
|
||||||
strategy to use in any particular case, based on the explanations below.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom of use,
|
|
||||||
not price. Our General Public Licenses are designed to make sure that
|
|
||||||
you have the freedom to distribute copies of free software (and charge
|
|
||||||
for this service if you wish); that you receive source code or can get
|
|
||||||
it if you want it; that you can change the software and use pieces of
|
|
||||||
it in new free programs; and that you are informed that you can do
|
|
||||||
these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
distributors to deny you these rights or to ask you to surrender these
|
|
||||||
rights. These restrictions translate to certain responsibilities for
|
|
||||||
you if you distribute copies of the library or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of the library, whether gratis
|
|
||||||
or for a fee, you must give the recipients all the rights that we gave
|
|
||||||
you. You must make sure that they, too, receive or can get the source
|
|
||||||
code. If you link other code with the library, you must provide
|
|
||||||
complete object files to the recipients, so that they can relink them
|
|
||||||
with the library after making changes to the library and recompiling
|
|
||||||
it. And you must show them these terms so they know their rights.
|
|
||||||
|
|
||||||
We protect your rights with a two-step method: (1) we copyright the
|
|
||||||
library, and (2) we offer you this license, which gives you legal
|
|
||||||
permission to copy, distribute and/or modify the library.
|
|
||||||
|
|
||||||
To protect each distributor, we want to make it very clear that
|
|
||||||
there is no warranty for the free library. Also, if the library is
|
|
||||||
modified by someone else and passed on, the recipients should know
|
|
||||||
that what they have is not the original version, so that the original
|
|
||||||
author's reputation will not be affected by problems that might be
|
|
||||||
introduced by others.
|
|
||||||
|
|
||||||
Finally, software patents pose a constant threat to the existence of
|
|
||||||
any free program. We wish to make sure that a company cannot
|
|
||||||
effectively restrict the users of a free program by obtaining a
|
|
||||||
restrictive license from a patent holder. Therefore, we insist that
|
|
||||||
any patent license obtained for a version of the library must be
|
|
||||||
consistent with the full freedom of use specified in this license.
|
|
||||||
|
|
||||||
Most GNU software, including some libraries, is covered by the
|
|
||||||
ordinary GNU General Public License. This license, the GNU Lesser
|
|
||||||
General Public License, applies to certain designated libraries, and
|
|
||||||
is quite different from the ordinary General Public License. We use
|
|
||||||
this license for certain libraries in order to permit linking those
|
|
||||||
libraries into non-free programs.
|
|
||||||
|
|
||||||
When a program is linked with a library, whether statically or using
|
|
||||||
a shared library, the combination of the two is legally speaking a
|
|
||||||
combined work, a derivative of the original library. The ordinary
|
|
||||||
General Public License therefore permits such linking only if the
|
|
||||||
entire combination fits its criteria of freedom. The Lesser General
|
|
||||||
Public License permits more lax criteria for linking other code with
|
|
||||||
the library.
|
|
||||||
|
|
||||||
We call this license the "Lesser" General Public License because it
|
|
||||||
does Less to protect the user's freedom than the ordinary General
|
|
||||||
Public License. It also provides other free software developers Less
|
|
||||||
of an advantage over competing non-free programs. These disadvantages
|
|
||||||
are the reason we use the ordinary General Public License for many
|
|
||||||
libraries. However, the Lesser license provides advantages in certain
|
|
||||||
special circumstances.
|
|
||||||
|
|
||||||
For example, on rare occasions, there may be a special need to
|
|
||||||
encourage the widest possible use of a certain library, so that it becomes
|
|
||||||
a de-facto standard. To achieve this, non-free programs must be
|
|
||||||
allowed to use the library. A more frequent case is that a free
|
|
||||||
library does the same job as widely used non-free libraries. In this
|
|
||||||
case, there is little to gain by limiting the free library to free
|
|
||||||
software only, so we use the Lesser General Public License.
|
|
||||||
|
|
||||||
In other cases, permission to use a particular library in non-free
|
|
||||||
programs enables a greater number of people to use a large body of
|
|
||||||
free software. For example, permission to use the GNU C Library in
|
|
||||||
non-free programs enables many more people to use the whole GNU
|
|
||||||
operating system, as well as its variant, the GNU/Linux operating
|
|
||||||
system.
|
|
||||||
|
|
||||||
Although the Lesser General Public License is Less protective of the
|
|
||||||
users' freedom, it does ensure that the user of a program that is
|
|
||||||
linked with the Library has the freedom and the wherewithal to run
|
|
||||||
that program using a modified version of the Library.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow. Pay close attention to the difference between a
|
|
||||||
"work based on the library" and a "work that uses the library". The
|
|
||||||
former contains code derived from the library, whereas the latter must
|
|
||||||
be combined with the library in order to run.
|
|
||||||
|
|
||||||
GNU LESSER GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License Agreement applies to any software library or other
|
|
||||||
program which contains a notice placed by the copyright holder or
|
|
||||||
other authorized party saying it may be distributed under the terms of
|
|
||||||
this Lesser General Public License (also called "this License").
|
|
||||||
Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
A "library" means a collection of software functions and/or data
|
|
||||||
prepared so as to be conveniently linked with application programs
|
|
||||||
(which use some of those functions and data) to form executables.
|
|
||||||
|
|
||||||
The "Library", below, refers to any such software library or work
|
|
||||||
which has been distributed under these terms. A "work based on the
|
|
||||||
Library" means either the Library or any derivative work under
|
|
||||||
copyright law: that is to say, a work containing the Library or a
|
|
||||||
portion of it, either verbatim or with modifications and/or translated
|
|
||||||
straightforwardly into another language. (Hereinafter, translation is
|
|
||||||
included without limitation in the term "modification".)
|
|
||||||
|
|
||||||
"Source code" for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For a library, complete source code means
|
|
||||||
all the source code for all modules it contains, plus any associated
|
|
||||||
interface definition files, plus the scripts used to control compilation
|
|
||||||
and installation of the library.
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running a program using the Library is not restricted, and output from
|
|
||||||
such a program is covered only if its contents constitute a work based
|
|
||||||
on the Library (independent of the use of the Library in a tool for
|
|
||||||
writing it). Whether that is true depends on what the Library does
|
|
||||||
and what the program that uses the Library does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Library's
|
|
||||||
complete source code as you receive it, in any medium, provided that
|
|
||||||
you conspicuously and appropriately publish on each copy an
|
|
||||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
|
||||||
all the notices that refer to this License and to the absence of any
|
|
||||||
warranty; and distribute a copy of this License along with the
|
|
||||||
Library.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy,
|
|
||||||
and you may at your option offer warranty protection in exchange for a
|
|
||||||
fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Library or any portion
|
|
||||||
of it, thus forming a work based on the Library, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) The modified work must itself be a software library.
|
|
||||||
|
|
||||||
b) You must cause the files modified to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
c) You must cause the whole of the work to be licensed at no
|
|
||||||
charge to all third parties under the terms of this License.
|
|
||||||
|
|
||||||
d) If a facility in the modified Library refers to a function or a
|
|
||||||
table of data to be supplied by an application program that uses
|
|
||||||
the facility, other than as an argument passed when the facility
|
|
||||||
is invoked, then you must make a good faith effort to ensure that,
|
|
||||||
in the event an application does not supply such function or
|
|
||||||
table, the facility still operates, and performs whatever part of
|
|
||||||
its purpose remains meaningful.
|
|
||||||
|
|
||||||
(For example, a function in a library to compute square roots has
|
|
||||||
a purpose that is entirely well-defined independent of the
|
|
||||||
application. Therefore, Subsection 2d requires that any
|
|
||||||
application-supplied function or table used by this function must
|
|
||||||
be optional: if the application does not supply it, the square
|
|
||||||
root function must still compute square roots.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Library,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Library, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote
|
|
||||||
it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Library.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Library
|
|
||||||
with the Library (or with a work based on the Library) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
|
||||||
License instead of this License to a given copy of the Library. To do
|
|
||||||
this, you must alter all the notices that refer to this License, so
|
|
||||||
that they refer to the ordinary GNU General Public License, version 2,
|
|
||||||
instead of to this License. (If a newer version than version 2 of the
|
|
||||||
ordinary GNU General Public License has appeared, then you can specify
|
|
||||||
that version instead if you wish.) Do not make any other change in
|
|
||||||
these notices.
|
|
||||||
|
|
||||||
Once this change is made in a given copy, it is irreversible for
|
|
||||||
that copy, so the ordinary GNU General Public License applies to all
|
|
||||||
subsequent copies and derivative works made from that copy.
|
|
||||||
|
|
||||||
This option is useful when you wish to copy part of the code of
|
|
||||||
the Library into a program that is not a library.
|
|
||||||
|
|
||||||
4. You may copy and distribute the Library (or a portion or
|
|
||||||
derivative of it, under Section 2) in object code or executable form
|
|
||||||
under the terms of Sections 1 and 2 above provided that you accompany
|
|
||||||
it with the complete corresponding machine-readable source code, which
|
|
||||||
must be distributed under the terms of Sections 1 and 2 above on a
|
|
||||||
medium customarily used for software interchange.
|
|
||||||
|
|
||||||
If distribution of object code is made by offering access to copy
|
|
||||||
from a designated place, then offering equivalent access to copy the
|
|
||||||
source code from the same place satisfies the requirement to
|
|
||||||
distribute the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
5. A program that contains no derivative of any portion of the
|
|
||||||
Library, but is designed to work with the Library by being compiled or
|
|
||||||
linked with it, is called a "work that uses the Library". Such a
|
|
||||||
work, in isolation, is not a derivative work of the Library, and
|
|
||||||
therefore falls outside the scope of this License.
|
|
||||||
|
|
||||||
However, linking a "work that uses the Library" with the Library
|
|
||||||
creates an executable that is a derivative of the Library (because it
|
|
||||||
contains portions of the Library), rather than a "work that uses the
|
|
||||||
library". The executable is therefore covered by this License.
|
|
||||||
Section 6 states terms for distribution of such executables.
|
|
||||||
|
|
||||||
When a "work that uses the Library" uses material from a header file
|
|
||||||
that is part of the Library, the object code for the work may be a
|
|
||||||
derivative work of the Library even though the source code is not.
|
|
||||||
Whether this is true is especially significant if the work can be
|
|
||||||
linked without the Library, or if the work is itself a library. The
|
|
||||||
threshold for this to be true is not precisely defined by law.
|
|
||||||
|
|
||||||
If such an object file uses only numerical parameters, data
|
|
||||||
structure layouts and accessors, and small macros and small inline
|
|
||||||
functions (ten lines or less in length), then the use of the object
|
|
||||||
file is unrestricted, regardless of whether it is legally a derivative
|
|
||||||
work. (Executables containing this object code plus portions of the
|
|
||||||
Library will still fall under Section 6.)
|
|
||||||
|
|
||||||
Otherwise, if the work is a derivative of the Library, you may
|
|
||||||
distribute the object code for the work under the terms of Section 6.
|
|
||||||
Any executables containing that work also fall under Section 6,
|
|
||||||
whether or not they are linked directly with the Library itself.
|
|
||||||
|
|
||||||
6. As an exception to the Sections above, you may also combine or
|
|
||||||
link a "work that uses the Library" with the Library to produce a
|
|
||||||
work containing portions of the Library, and distribute that work
|
|
||||||
under terms of your choice, provided that the terms permit
|
|
||||||
modification of the work for the customer's own use and reverse
|
|
||||||
engineering for debugging such modifications.
|
|
||||||
|
|
||||||
You must give prominent notice with each copy of the work that the
|
|
||||||
Library is used in it and that the Library and its use are covered by
|
|
||||||
this License. You must supply a copy of this License. If the work
|
|
||||||
during execution displays copyright notices, you must include the
|
|
||||||
copyright notice for the Library among them, as well as a reference
|
|
||||||
directing the user to the copy of this License. Also, you must do one
|
|
||||||
of these things:
|
|
||||||
|
|
||||||
a) Accompany the work with the complete corresponding
|
|
||||||
machine-readable source code for the Library including whatever
|
|
||||||
changes were used in the work (which must be distributed under
|
|
||||||
Sections 1 and 2 above); and, if the work is an executable linked
|
|
||||||
with the Library, with the complete machine-readable "work that
|
|
||||||
uses the Library", as object code and/or source code, so that the
|
|
||||||
user can modify the Library and then relink to produce a modified
|
|
||||||
executable containing the modified Library. (It is understood
|
|
||||||
that the user who changes the contents of definitions files in the
|
|
||||||
Library will not necessarily be able to recompile the application
|
|
||||||
to use the modified definitions.)
|
|
||||||
|
|
||||||
b) Use a suitable shared library mechanism for linking with the
|
|
||||||
Library. A suitable mechanism is one that (1) uses at run time a
|
|
||||||
copy of the library already present on the user's computer system,
|
|
||||||
rather than copying library functions into the executable, and (2)
|
|
||||||
will operate properly with a modified version of the library, if
|
|
||||||
the user installs one, as long as the modified version is
|
|
||||||
interface-compatible with the version that the work was made with.
|
|
||||||
|
|
||||||
c) Accompany the work with a written offer, valid for at
|
|
||||||
least three years, to give the same user the materials
|
|
||||||
specified in Subsection 6a, above, for a charge no more
|
|
||||||
than the cost of performing this distribution.
|
|
||||||
|
|
||||||
d) If distribution of the work is made by offering access to copy
|
|
||||||
from a designated place, offer equivalent access to copy the above
|
|
||||||
specified materials from the same place.
|
|
||||||
|
|
||||||
e) Verify that the user has already received a copy of these
|
|
||||||
materials or that you have already sent this user a copy.
|
|
||||||
|
|
||||||
For an executable, the required form of the "work that uses the
|
|
||||||
Library" must include any data and utility programs needed for
|
|
||||||
reproducing the executable from it. However, as a special exception,
|
|
||||||
the materials to be distributed need not include anything that is
|
|
||||||
normally distributed (in either source or binary form) with the major
|
|
||||||
components (compiler, kernel, and so on) of the operating system on
|
|
||||||
which the executable runs, unless that component itself accompanies
|
|
||||||
the executable.
|
|
||||||
|
|
||||||
It may happen that this requirement contradicts the license
|
|
||||||
restrictions of other proprietary libraries that do not normally
|
|
||||||
accompany the operating system. Such a contradiction means you cannot
|
|
||||||
use both them and the Library together in an executable that you
|
|
||||||
distribute.
|
|
||||||
|
|
||||||
7. You may place library facilities that are a work based on the
|
|
||||||
Library side-by-side in a single library together with other library
|
|
||||||
facilities not covered by this License, and distribute such a combined
|
|
||||||
library, provided that the separate distribution of the work based on
|
|
||||||
the Library and of the other library facilities is otherwise
|
|
||||||
permitted, and provided that you do these two things:
|
|
||||||
|
|
||||||
a) Accompany the combined library with a copy of the same work
|
|
||||||
based on the Library, uncombined with any other library
|
|
||||||
facilities. This must be distributed under the terms of the
|
|
||||||
Sections above.
|
|
||||||
|
|
||||||
b) Give prominent notice with the combined library of the fact
|
|
||||||
that part of it is a work based on the Library, and explaining
|
|
||||||
where to find the accompanying uncombined form of the same work.
|
|
||||||
|
|
||||||
8. You may not copy, modify, sublicense, link with, or distribute
|
|
||||||
the Library except as expressly provided under this License. Any
|
|
||||||
attempt otherwise to copy, modify, sublicense, link with, or
|
|
||||||
distribute the Library is void, and will automatically terminate your
|
|
||||||
rights under this License. However, parties who have received copies,
|
|
||||||
or rights, from you under this License will not have their licenses
|
|
||||||
terminated so long as such parties remain in full compliance.
|
|
||||||
|
|
||||||
9. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Library or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Library (or any work based on the
|
|
||||||
Library), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Library or works based on it.
|
|
||||||
|
|
||||||
10. Each time you redistribute the Library (or any work based on the
|
|
||||||
Library), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute, link with or modify the Library
|
|
||||||
subject to these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties with
|
|
||||||
this License.
|
|
||||||
|
|
||||||
11. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Library at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Library by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Library.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under any
|
|
||||||
particular circumstance, the balance of the section is intended to apply,
|
|
||||||
and the section as a whole is intended to apply in other circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
12. If the distribution and/or use of the Library is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Library under this License may add
|
|
||||||
an explicit geographical distribution limitation excluding those countries,
|
|
||||||
so that distribution is permitted only in or among countries not thus
|
|
||||||
excluded. In such case, this License incorporates the limitation as if
|
|
||||||
written in the body of this License.
|
|
||||||
|
|
||||||
13. The Free Software Foundation may publish revised and/or new
|
|
||||||
versions of the Lesser General Public License from time to time.
|
|
||||||
Such new versions will be similar in spirit to the present version,
|
|
||||||
but may differ in detail to address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Library
|
|
||||||
specifies a version number of this License which applies to it and
|
|
||||||
"any later version", you have the option of following the terms and
|
|
||||||
conditions either of that version or of any later version published by
|
|
||||||
the Free Software Foundation. If the Library does not specify a
|
|
||||||
license version number, you may choose any version ever published by
|
|
||||||
the Free Software Foundation.
|
|
||||||
|
|
||||||
14. If you wish to incorporate parts of the Library into other free
|
|
||||||
programs whose distribution conditions are incompatible with these,
|
|
||||||
write to the author to ask for permission. For software which is
|
|
||||||
copyrighted by the Free Software Foundation, write to the Free
|
|
||||||
Software Foundation; we sometimes make exceptions for this. Our
|
|
||||||
decision will be guided by the two goals of preserving the free status
|
|
||||||
of all derivatives of our free software and of promoting the sharing
|
|
||||||
and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
|
||||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
|
||||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
|
||||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
|
||||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
|
||||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
|
||||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
|
||||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
|
||||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
|
||||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
|
||||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
|
||||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
|
||||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
|
||||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
|
||||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
|
||||||
DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Libraries
|
|
||||||
|
|
||||||
If you develop a new library, and you want it to be of the greatest
|
|
||||||
possible use to the public, we recommend making it free software that
|
|
||||||
everyone can redistribute and change. You can do so by permitting
|
|
||||||
redistribution under these terms (or, alternatively, under the terms of the
|
|
||||||
ordinary General Public License).
|
|
||||||
|
|
||||||
To apply these terms, attach the following notices to the library. It is
|
|
||||||
safest to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least the
|
|
||||||
"copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the library's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
|
||||||
USA
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
|
||||||
library `Frob' (a library for tweaking knobs) written by James Random
|
|
||||||
Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1990
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
That's all there is to it!
|
|
|
@ -1,6 +0,0 @@
|
||||||
The LGPLv2.1 license found in [LICENSE](./LICENSE) also applies retroactively to code committed between the dates of Friday 27 September 2024 to Sunday 22 June 2025 (inclusive), via the commit hashes adfc839098ee12cc180cc00cbb362cb232bfb2a1 and 54e1576eb1065b8f7d3b13c98fc6078620921960
|
|
||||||
|
|
||||||
Any forks based on older commits must include a copy of the license file (LICENSE) in addition to this one, provided that the program then complies with
|
|
||||||
the license terms
|
|
||||||
|
|
||||||
Openblocks Copyright (C) 2025 m-doescode / maelstrom071
|
|
|
@ -1,9 +0,0 @@
|
||||||
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
|
|
|
@ -1,565 +0,0 @@
|
||||||
# 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
|
|
|
@ -1,119 +0,0 @@
|
||||||
# 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
|
|
|
@ -1,36 +0,0 @@
|
||||||
# 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
|
|
|
@ -1,137 +0,0 @@
|
||||||
# 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
|
|
|
@ -1,295 +0,0 @@
|
||||||
# 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
|
|
|
@ -1,36 +0,0 @@
|
||||||
# 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
|
|
|
@ -1,16 +0,0 @@
|
||||||
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.
|
|
|
@ -1,102 +0,0 @@
|
||||||
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.
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
Icons transform-move, transform-scale, and transform-rotate were modified from silk icons by maelstrom
|
|
Before Width: | Height: | Size: 625 B |
Before Width: | Height: | Size: 631 B |
Before Width: | Height: | Size: 553 B |
Before Width: | Height: | Size: 666 B |
Before Width: | Height: | Size: 355 B |
Before Width: | Height: | Size: 443 B |
Before Width: | Height: | Size: 512 B |
Before Width: | Height: | Size: 413 B |
|
@ -1,22 +0,0 @@
|
||||||
#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;
|
|
||||||
}
|
|
|
@ -1,12 +0,0 @@
|
||||||
#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,14 +0,0 @@
|
||||||
// https://learnopengl.com/In-Practice/Text-Rendering
|
|
||||||
|
|
||||||
#version 330 core
|
|
||||||
in vec2 TexCoords;
|
|
||||||
out vec4 color;
|
|
||||||
|
|
||||||
uniform sampler2D text;
|
|
||||||
uniform vec3 textColor;
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
vec4 sampled = vec4(1.0, 1.0, 1.0, texture(text, TexCoords).r);
|
|
||||||
color = vec4(textColor, 1.0) * sampled;
|
|
||||||
}
|
|
|
@ -1,13 +0,0 @@
|
||||||
// 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;
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
gl_Position = projection * vec4(vertex.xy, 0.0, 1.0);
|
|
||||||
TexCoords = vertex.zw;
|
|
||||||
}
|
|
|
@ -1,12 +0,0 @@
|
||||||
#version 330 core
|
|
||||||
|
|
||||||
// I/O
|
|
||||||
|
|
||||||
out vec4 fColor;
|
|
||||||
uniform vec4 aColor;
|
|
||||||
|
|
||||||
// Main
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
fColor = aColor;
|
|
||||||
}
|
|
|
@ -1,10 +0,0 @@
|
||||||
#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);
|
|
||||||
}
|
|
|
@ -4,10 +4,10 @@
|
||||||
|
|
||||||
out vec4 FragColor;
|
out vec4 FragColor;
|
||||||
|
|
||||||
uniform vec4 aColor;
|
uniform vec3 aColor;
|
||||||
|
|
||||||
// Main
|
// Main
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
FragColor = aColor;
|
FragColor = vec4(aColor, 1);
|
||||||
}
|
}
|
|
@ -54,14 +54,11 @@ uniform int numPointLights;
|
||||||
uniform DirLight sunLight;
|
uniform DirLight sunLight;
|
||||||
uniform Material material;
|
uniform Material material;
|
||||||
uniform sampler2DArray studs;
|
uniform sampler2DArray studs;
|
||||||
uniform samplerCube skybox;
|
|
||||||
uniform float transparency;
|
uniform float transparency;
|
||||||
uniform float reflectance;
|
|
||||||
uniform vec3 texScale;
|
uniform vec3 texScale;
|
||||||
|
|
||||||
|
|
||||||
// Functions
|
// Functions
|
||||||
vec3 calculateReflection();
|
|
||||||
vec3 calculateDirectionalLight(DirLight light);
|
vec3 calculateDirectionalLight(DirLight light);
|
||||||
vec3 calculatePointLight(PointLight light);
|
vec3 calculatePointLight(PointLight light);
|
||||||
mat3 lookAlong(vec3 pos, vec3 forward, vec3 up);
|
mat3 lookAlong(vec3 pos, vec3 forward, vec3 up);
|
||||||
|
@ -71,7 +68,6 @@ mat3 lookAlong(vec3 pos, vec3 forward, vec3 up);
|
||||||
void main() {
|
void main() {
|
||||||
vec3 result = vec3(0.0);
|
vec3 result = vec3(0.0);
|
||||||
|
|
||||||
result += calculateReflection();
|
|
||||||
result += calculateDirectionalLight(sunLight);
|
result += calculateDirectionalLight(sunLight);
|
||||||
|
|
||||||
for (int i = 0; i < numPointLights; i++) {
|
for (int i = 0; i < numPointLights; i++) {
|
||||||
|
@ -99,25 +95,6 @@ mat3 lookAlong(vec3 pos, vec3 forward, vec3 up) {
|
||||||
return mat3(s, u, f);
|
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) {
|
vec3 calculateDirectionalLight(DirLight light) {
|
||||||
// Calculate diffuse
|
// Calculate diffuse
|
||||||
vec3 norm = normalize(vNormal);
|
vec3 norm = normalize(vNormal);
|
||||||
|
@ -128,13 +105,10 @@ vec3 calculateDirectionalLight(DirLight light) {
|
||||||
vec3 viewDir = normalize(viewPos - vPos);
|
vec3 viewDir = normalize(viewPos - vPos);
|
||||||
vec3 reflectDir = reflect(-lightDir, norm);
|
vec3 reflectDir = reflect(-lightDir, norm);
|
||||||
float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
|
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 ambient = light.ambient * (material.diffuse * (1.0-reflectance));
|
vec3 diffuse = light.diffuse * diff * material.diffuse;
|
||||||
vec3 diffuse = light.diffuse * diff * (material.diffuse * (1.0-reflectance));
|
|
||||||
vec3 specular = light.specular * spec * material.specular;
|
vec3 specular = light.specular * spec * material.specular;
|
||||||
// specular += sampleSkybox() * fresnel * material.specular;
|
|
||||||
|
|
||||||
return (ambient + diffuse + specular);
|
return (ambient + diffuse + specular);
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,6 @@ const int FaceBack = 2;
|
||||||
const int FaceLeft = 3;
|
const int FaceLeft = 3;
|
||||||
const int FaceBottom = 4;
|
const int FaceBottom = 4;
|
||||||
const int FaceFront = 5;
|
const int FaceFront = 5;
|
||||||
const int FaceNone = 6;
|
|
||||||
|
|
||||||
const int SurfaceSmooth = 0;
|
const int SurfaceSmooth = 0;
|
||||||
const int SurfaceGlue = 1;
|
const int SurfaceGlue = 1;
|
||||||
|
@ -32,8 +31,6 @@ uniform mat4 projection;
|
||||||
uniform int surfaces[6];
|
uniform int surfaces[6];
|
||||||
uniform vec3 texScale;
|
uniform vec3 texScale;
|
||||||
|
|
||||||
const float faceThreshold = sqrt(2)/2;
|
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
gl_Position = projection * view * model * vec4(aPos, 1.0);
|
gl_Position = projection * view * model * vec4(aPos, 1.0);
|
||||||
|
@ -41,20 +38,12 @@ void main()
|
||||||
lPos = aPos;
|
lPos = aPos;
|
||||||
vNormal = normalMatrix * aNormal;
|
vNormal = normalMatrix * aNormal;
|
||||||
lNormal = aNormal;
|
lNormal = aNormal;
|
||||||
int vFace = FaceNone;
|
int vFace = aNormal == vec3(0,1,0) ? FaceTop :
|
||||||
|
aNormal == vec3(0, -1, 0) ? FaceBottom :
|
||||||
if (dot(vec3(0, 1, 0), aNormal) > faceThreshold)
|
aNormal == vec3(1, 0, 0) ? FaceRight :
|
||||||
vFace = FaceTop;
|
aNormal == vec3(-1, 0, 0) ? FaceLeft :
|
||||||
else if (dot(vec3(0, -1, 0), aNormal) > faceThreshold)
|
aNormal == vec3(0, 0, -1) ? FaceFront :
|
||||||
vFace = FaceBottom;
|
aNormal == vec3(0, 0, 1) ? FaceBack : -1;
|
||||||
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];
|
vSurfaceZ = surfaces[vFace];
|
||||||
if (surfaces[vFace] > SurfaceUniversal) vSurfaceZ = 0;
|
if (surfaces[vFace] > SurfaceUniversal) vSurfaceZ = 0;
|
||||||
|
|
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 |
|
@ -1 +0,0 @@
|
||||||
debugfnt.bmp is Iosevka NFM Thin generated via CBFG
|
|
Before Width: | Height: | Size: 192 KiB |
|
@ -121,33 +121,6 @@ static void processMethod(CXCursor cur, ClassAnalysis* state) {
|
||||||
state->methods.push_back(anly);
|
state->methods.push_back(anly);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void processOperator(CXCursor cur, ClassAnalysis* state) {
|
|
||||||
std::optional<std::string> operatorDef = findAnnotation(cur, "OB::def_data_op");
|
|
||||||
if (!operatorDef) return;
|
|
||||||
|
|
||||||
OperatorAnalysis anly;
|
|
||||||
|
|
||||||
std::string symbolName = x_clang_toString(clang_getCursorSpelling(cur));
|
|
||||||
if (!symbolName.starts_with("operator"))
|
|
||||||
return;
|
|
||||||
|
|
||||||
std::string opName = symbolName.substr(8);
|
|
||||||
|
|
||||||
// Special case: Unary minus gets its own type
|
|
||||||
if (clang_Cursor_getNumArguments(cur) == 0)
|
|
||||||
opName = "-()";
|
|
||||||
|
|
||||||
anly.type = opName;
|
|
||||||
|
|
||||||
if (clang_Cursor_getNumArguments(cur) != 0) {
|
|
||||||
CXCursor arg = clang_Cursor_getArgument(cur, 0);
|
|
||||||
CXType type = clang_getCursorType(arg);
|
|
||||||
anly.param_type = x_clang_toString(clang_getTypeSpelling(type));
|
|
||||||
}
|
|
||||||
|
|
||||||
state->operators[opName].push_back(anly);
|
|
||||||
}
|
|
||||||
|
|
||||||
// This processes both methods and fields
|
// This processes both methods and fields
|
||||||
static void processProperty(CXCursor cur, ClassAnalysis* state) {
|
static void processProperty(CXCursor cur, ClassAnalysis* state) {
|
||||||
std::optional<std::string> propertyDef = findAnnotation(cur, "OB::def_data_prop");
|
std::optional<std::string> propertyDef = findAnnotation(cur, "OB::def_data_prop");
|
||||||
|
@ -246,7 +219,6 @@ static void processClass(CXCursor cur, AnalysisState* state, std::string classNa
|
||||||
|
|
||||||
if (kind == CXCursor_CXXMethod) {
|
if (kind == CXCursor_CXXMethod) {
|
||||||
processMethod(cur, &anly);
|
processMethod(cur, &anly);
|
||||||
processOperator(cur, &anly);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return CXChildVisit_Continue;
|
return CXChildVisit_Continue;
|
||||||
|
|
|
@ -19,11 +19,6 @@ struct PropertyAnalysis {
|
||||||
std::string valueType;
|
std::string valueType;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct OperatorAnalysis {
|
|
||||||
std::string type;
|
|
||||||
std::string param_type;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct MethodParameter {
|
struct MethodParameter {
|
||||||
std::string name;
|
std::string name;
|
||||||
std::string type;
|
std::string type;
|
||||||
|
@ -48,7 +43,6 @@ struct ClassAnalysis {
|
||||||
std::vector<MethodAnalysis> methods;
|
std::vector<MethodAnalysis> methods;
|
||||||
std::vector<PropertyAnalysis> staticProperties;
|
std::vector<PropertyAnalysis> staticProperties;
|
||||||
std::vector<MethodAnalysis> staticMethods;
|
std::vector<MethodAnalysis> staticMethods;
|
||||||
std::map<std::string, std::vector<OperatorAnalysis>> operators;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct AnalysisState {
|
struct AnalysisState {
|
||||||
|
|
|
@ -33,17 +33,6 @@ static std::map<std::string, std::string> LUA_PUSH_FUNCS = {
|
||||||
// { "std::string", "lua_pushstring" },
|
// { "std::string", "lua_pushstring" },
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::map<std::string, std::string> LUA_OP_NAME = {
|
|
||||||
{ "==", "__eq" },
|
|
||||||
{ "<", "__lt" },
|
|
||||||
{ "<=", "__le" },
|
|
||||||
{ "+", "__add" },
|
|
||||||
{ "-", "__sub" },
|
|
||||||
{ "-()", "__unm" },
|
|
||||||
{ "*", "__mul" },
|
|
||||||
{ "/", "__div" },
|
|
||||||
};
|
|
||||||
|
|
||||||
static std::string getLuaMethodFqn(std::string className, std::string methodName) {
|
static std::string getLuaMethodFqn(std::string className, std::string methodName) {
|
||||||
return "__lua_impl__" + className + "__" + methodName;
|
return "__lua_impl__" + className + "__" + methodName;
|
||||||
}
|
}
|
||||||
|
@ -248,27 +237,14 @@ static void writeLuaMethodImpls(std::ofstream& out, ClassAnalysis& state) {
|
||||||
static void writeLuaValueGenerator(std::ofstream& out, ClassAnalysis& state) {
|
static void writeLuaValueGenerator(std::ofstream& out, ClassAnalysis& state) {
|
||||||
std::string fqn = state.name;
|
std::string fqn = state.name;
|
||||||
|
|
||||||
// Insert additional operators
|
|
||||||
for (auto& [key, ops] : state.operators) {
|
|
||||||
std::string opname = LUA_OP_NAME[key];
|
|
||||||
out << "static int data_" << state.name << opname << "(lua_State*);\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
out << "static int data_" << state.name << "_gc(lua_State*);\n"
|
out << "static int data_" << state.name << "_gc(lua_State*);\n"
|
||||||
"static int data_" << state.name << "_index(lua_State*);\n"
|
"static int data_" << state.name << "_index(lua_State*);\n"
|
||||||
"static int data_" << state.name << "_tostring(lua_State*);\n"
|
"static int data_" << state.name << "_tostring(lua_State*);\n"
|
||||||
"static const struct luaL_Reg " << state.name << "_metatable [] = {\n"
|
"static const struct luaL_Reg " << state.name << "_metatable [] = {\n"
|
||||||
" {\"__gc\", data_" << state.name << "_gc},\n"
|
" {\"__gc\", data_" << state.name << "_gc},\n"
|
||||||
" {\"__index\", data_" << state.name << "_index},\n"
|
" {\"__index\", data_" << state.name << "_index},\n"
|
||||||
" {\"__tostring\", data_" << state.name << "_tostring},\n";
|
" {\"__tostring\", data_" << state.name << "_tostring},\n"
|
||||||
|
" {NULL, NULL} /* end of array */\n"
|
||||||
// Insert additional operators
|
|
||||||
for (auto& [key, ops] : state.operators) {
|
|
||||||
std::string opname = LUA_OP_NAME[key];
|
|
||||||
out << " {\"" + opname + "\", data_" << state.name << opname << "},\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
out << " {NULL, NULL} /* end of array */\n"
|
|
||||||
"};\n\n";
|
"};\n\n";
|
||||||
|
|
||||||
out << "void " << state.name << "::PushLuaValue(lua_State* L) const {\n"
|
out << "void " << state.name << "::PushLuaValue(lua_State* L) const {\n"
|
||||||
|
@ -361,55 +337,6 @@ static void writeLuaValueGenerator(std::ofstream& out, ClassAnalysis& state) {
|
||||||
"}\n\n";
|
"}\n\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
static void writeLuaOperatorImpls(std::ofstream& out, ClassAnalysis& state) {
|
|
||||||
std::string fqn = "" + state.name;
|
|
||||||
|
|
||||||
for (auto& [name, ops] : state.operators) {
|
|
||||||
out << "static int data_" << state.name << LUA_OP_NAME[name] << "(lua_State* L) {\n"
|
|
||||||
" " << fqn << "* this_ = *(" << fqn << "**)luaL_checkudata(L, 1, \"__mt_" << state.name << "\");\n"
|
|
||||||
" int n = lua_gettop(L);\n";
|
|
||||||
out << " ";
|
|
||||||
|
|
||||||
// Support multiple overloads of the same function
|
|
||||||
bool first = true;
|
|
||||||
for (OperatorAnalysis op : ops) {
|
|
||||||
if (!first) out << " else ";
|
|
||||||
first = false;
|
|
||||||
|
|
||||||
// Check to see if the arguments possibly match this implementation's parameter types
|
|
||||||
out << "if (";
|
|
||||||
|
|
||||||
// Check number of arguments
|
|
||||||
out << "n == " << std::to_string(name == "-()" ? 2 : op.param_type == "" ? 1 : 2); // Account for first argument as 'this'
|
|
||||||
|
|
||||||
if (op.param_type != "") {
|
|
||||||
out << " && ";
|
|
||||||
writeLuaTestArgument(out, op.param_type, 0, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
out << ") {\n"; // End if condition, start if body
|
|
||||||
|
|
||||||
if (op.param_type != "") {
|
|
||||||
writeLuaGetArgument(out, op.param_type, 0, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name == "-()") {
|
|
||||||
out << " Variant(-*this_).PushLuaValue(L);\n";
|
|
||||||
} else {
|
|
||||||
out << " Variant(*this_ " << name << " arg0).PushLuaValue(L);\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
out << " return 1;\n"
|
|
||||||
" }";
|
|
||||||
}
|
|
||||||
|
|
||||||
// No function implementation matched
|
|
||||||
out << "\n\n return luaL_error(L, \"Cannot apply '" << name << "' to values of type " << state.name << " and %s \", x_luaL_udatatname(L, 2));\n";
|
|
||||||
|
|
||||||
out << "}\n\n"; // End function
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void writeLuaLibraryGenerator(std::ofstream& out, ClassAnalysis& state) {
|
static void writeLuaLibraryGenerator(std::ofstream& out, ClassAnalysis& state) {
|
||||||
std::string fqn = state.name;
|
std::string fqn = state.name;
|
||||||
|
|
||||||
|
@ -524,6 +451,5 @@ void data::writeCodeForClass(std::ofstream& out, std::string headerPath, ClassAn
|
||||||
|
|
||||||
writeLuaMethodImpls(out, state);
|
writeLuaMethodImpls(out, state);
|
||||||
writeLuaValueGenerator(out, state);
|
writeLuaValueGenerator(out, state);
|
||||||
writeLuaOperatorImpls(out, state);
|
|
||||||
writeLuaLibraryGenerator(out, state);
|
writeLuaLibraryGenerator(out, state);
|
||||||
}
|
}
|
|
@ -26,7 +26,6 @@ int processHeader(fs::path srcRoot, fs::path srcPath, fs::path outPath) {
|
||||||
std::string srcRootStr = string_of(srcRoot);
|
std::string srcRootStr = string_of(srcRoot);
|
||||||
std::string srcPathStr = string_of(srcPath);
|
std::string srcPathStr = string_of(srcPath);
|
||||||
std::string outPathStr = string_of(outPath);
|
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 };
|
const char* cargs[] = { "-xc++", "-std=c++17", "-I", srcRootStr.c_str(), "-D__AUTOGEN__", 0 };
|
||||||
// THANK YOU SO MUCH THIS STACKOVERFLOW ANSWER IS SO HELPFUL
|
// THANK YOU SO MUCH THIS STACKOVERFLOW ANSWER IS SO HELPFUL
|
||||||
|
@ -43,26 +42,17 @@ int processHeader(fs::path srcRoot, fs::path srcPath, fs::path outPath) {
|
||||||
return 1;
|
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
|
// Print errors
|
||||||
int ndiags = clang_getNumDiagnostics(unit);
|
int ndiags = clang_getNumDiagnostics(unit);
|
||||||
for (int i = 0; i < ndiags; i++) {
|
for (int i = 0; i < ndiags; i++) {
|
||||||
CXDiagnostic diag = clang_getDiagnostic(unit, i);
|
CXDiagnostic diag = clang_getDiagnostic(unit, i);
|
||||||
CXString str = clang_formatDiagnostic(diag, 0);
|
CXString str = clang_formatDiagnostic(diag, 0);
|
||||||
fprintf(logout, "diag: %s\n", clang_getCString(str));
|
fprintf(stderr, "diag: %s\n", clang_getCString(str));
|
||||||
|
|
||||||
clang_disposeString(str);
|
clang_disposeString(str);
|
||||||
clang_disposeDiagnostic(diag);
|
clang_disposeDiagnostic(diag);
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(logout);
|
|
||||||
|
|
||||||
CXCursor cursor = clang_getTranslationUnitCursor(unit);
|
CXCursor cursor = clang_getTranslationUnitCursor(unit);
|
||||||
|
|
||||||
object::AnalysisState objectAnlyState;
|
object::AnalysisState objectAnlyState;
|
||||||
|
@ -76,6 +66,8 @@ int processHeader(fs::path srcRoot, fs::path srcPath, fs::path outPath) {
|
||||||
data::analyzeClasses(cursor, srcRootStr, &dataAnlyState);
|
data::analyzeClasses(cursor, srcRootStr, &dataAnlyState);
|
||||||
enum_::analyzeClasses(cursor, srcRootStr, &enumAnlyState);
|
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());
|
printf("[AUTOGEN] Generating file %s...\n", relpathStr.c_str());
|
||||||
std::ofstream outStream(outPathStr);
|
std::ofstream outStream(outPathStr);
|
||||||
|
|
||||||
|
@ -112,7 +104,5 @@ int main(int argc, char** argv) {
|
||||||
fs::path srcPath = argv[2];
|
fs::path srcPath = argv[2];
|
||||||
fs::path outPath = argv[3];
|
fs::path outPath = argv[3];
|
||||||
|
|
||||||
// fprintf(stderr, "Some error here\n");
|
|
||||||
// return 0;
|
|
||||||
return processHeader(srcRoot, srcPath, outPath);
|
return processHeader(srcRoot, srcPath, outPath);
|
||||||
}
|
}
|
|
@ -1,24 +1,8 @@
|
||||||
include(${CMAKE_CURRENT_SOURCE_DIR}/deps.cmake)
|
find_package(SDL2 REQUIRED)
|
||||||
|
include_directories(${SDL2_INCLUDE_DIRS})
|
||||||
|
|
||||||
|
find_package(glfw3 REQUIRED)
|
||||||
|
|
||||||
add_executable(client "src/main.cpp")
|
add_executable(client "src/main.cpp")
|
||||||
target_link_libraries(client PRIVATE openblocks glfw)
|
target_link_libraries(client PRIVATE ${SDL2_LIBRARIES} openblocks glfw)
|
||||||
add_dependencies(client openblocks)
|
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()
|
|
|
@ -1,12 +0,0 @@
|
||||||
# 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,12 +1,8 @@
|
||||||
#include <glad/gl.h>
|
#include <GL/glew.h>
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
#include "logger.h"
|
#include "objects/part.h"
|
||||||
#include "objects/part/part.h"
|
|
||||||
#include "panic.h"
|
|
||||||
#include "physics/world.h"
|
|
||||||
#include "rendering/renderer.h"
|
#include "rendering/renderer.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "version.h"
|
|
||||||
|
|
||||||
void errorCatcher(int id, const char* str);
|
void errorCatcher(int id, const char* str);
|
||||||
|
|
||||||
|
@ -19,38 +15,25 @@ void mouseCallback(GLFWwindow* window, double xpos, double ypos);
|
||||||
void mouseButtonCallback(GLFWwindow* window, int button, int action, int mods);
|
void mouseButtonCallback(GLFWwindow* window, int button, int action, int mods);
|
||||||
void resizeCallback(GLFWwindow* window, int width, int height);
|
void resizeCallback(GLFWwindow* window, int width, int height);
|
||||||
|
|
||||||
std::shared_ptr<BasePart> lastPart;
|
std::shared_ptr<Part> lastPart;
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
Logger::init();
|
Logger::init();
|
||||||
|
|
||||||
glfwSetErrorCallback(errorCatcher);
|
glfwSetErrorCallback(errorCatcher);
|
||||||
|
|
||||||
std::string title = std::string() + "Openblocks Client " + BUILD_VERSION;
|
|
||||||
|
|
||||||
glfwInit();
|
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);
|
glfwSetKeyCallback(window, keyCallback);
|
||||||
glfwSetMouseButtonCallback(window, mouseButtonCallback);
|
glfwSetMouseButtonCallback(window, mouseButtonCallback);
|
||||||
glfwSetCursorPosCallback(window, mouseCallback);
|
glfwSetCursorPosCallback(window, mouseCallback);
|
||||||
glfwSetFramebufferSizeCallback(window, resizeCallback);
|
glfwSetFramebufferSizeCallback(window, resizeCallback);
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
int version = gladLoadGL(glfwGetProcAddress);
|
glewInit();
|
||||||
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));
|
|
||||||
}
|
|
||||||
|
|
||||||
physicsInit();
|
|
||||||
gDataModel->Init();
|
gDataModel->Init();
|
||||||
renderInit(1200, 900);
|
renderInit(window, 1200, 900);
|
||||||
|
|
||||||
// Baseplate
|
// Baseplate
|
||||||
gWorkspace()->AddChild(Part::New({
|
gWorkspace()->AddChild(Part::New({
|
||||||
|
@ -71,7 +54,7 @@ int main() {
|
||||||
|
|
||||||
for (std::shared_ptr<Instance> inst : gWorkspace()->GetChildren()) {
|
for (std::shared_ptr<Instance> inst : gWorkspace()->GetChildren()) {
|
||||||
if (inst->GetClass()->className != "Part") continue;
|
if (inst->GetClass()->className != "Part") continue;
|
||||||
std::shared_ptr<BasePart> part = std::dynamic_pointer_cast<BasePart>(inst);
|
std::shared_ptr<Part> part = std::dynamic_pointer_cast<Part>(inst);
|
||||||
gWorkspace()->SyncPartPhysics(part);
|
gWorkspace()->SyncPartPhysics(part);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,19 +65,18 @@ int main() {
|
||||||
|
|
||||||
processInput(window);
|
processInput(window);
|
||||||
gWorkspace()->PhysicsStep(deltaTime);
|
gWorkspace()->PhysicsStep(deltaTime);
|
||||||
render();
|
render(window);
|
||||||
|
|
||||||
glfwSwapBuffers(window);
|
glfwSwapBuffers(window);
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
} while(!glfwWindowShouldClose(window));
|
} while(!glfwWindowShouldClose(window));
|
||||||
|
|
||||||
physicsDeinit();
|
|
||||||
glfwTerminate();
|
glfwTerminate();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void errorCatcher(int id, const char* str) {
|
void errorCatcher(int id, const char* str) {
|
||||||
Logger::fatalErrorf("GLFW Error: [%d] %s", id, str);
|
Logger::fatalError(std::format("GLFW Error: [{}] {}", id, str));
|
||||||
}
|
}
|
||||||
|
|
||||||
float lastTime;
|
float lastTime;
|
||||||
|
@ -110,10 +92,6 @@ void processInput(GLFWwindow* window) {
|
||||||
camera.processMovement(DIRECTION_LEFT, deltaTime);
|
camera.processMovement(DIRECTION_LEFT, deltaTime);
|
||||||
if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS)
|
if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS)
|
||||||
camera.processMovement(DIRECTION_RIGHT, deltaTime);
|
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)
|
if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS)
|
||||||
camera.processMovement(DIRECTION_UP, deltaTime);
|
camera.processMovement(DIRECTION_UP, deltaTime);
|
||||||
if (glfwGetKey(window, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS)
|
if (glfwGetKey(window, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS)
|
||||||
|
@ -165,7 +143,6 @@ 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) {
|
void keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) {
|
||||||
if (key == GLFW_KEY_F && action == GLFW_PRESS) {
|
if (key == GLFW_KEY_F && action == GLFW_PRESS) {
|
||||||
gWorkspace()->AddChild(lastPart = Part::New({
|
gWorkspace()->AddChild(lastPart = Part::New({
|
||||||
|
@ -209,8 +186,6 @@ 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_M && action == GLFW_PRESS) mode = 0;
|
||||||
if (key == GLFW_KEY_E && action == GLFW_PRESS) mode = 1; // Enlarge
|
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_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) {
|
void resizeCallback(GLFWwindow* window, int width, int height) {
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
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})
|
|
|
@ -1,60 +0,0 @@
|
||||||
# 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
|
|
||||||
)
|
|
30
cmake/FindStb.cmake
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
# 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)
|
|
@ -1,40 +0,0 @@
|
||||||
|
|
||||||
# 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,177 +1,28 @@
|
||||||
include(${CMAKE_CURRENT_SOURCE_DIR}/deps.cmake)
|
find_package(OpenGL REQUIRED COMPONENTS OpenGL)
|
||||||
|
|
||||||
## Sources
|
find_package(GLEW REQUIRED)
|
||||||
set(SOURCES
|
include_directories(${GLEW_INCLUDE_DIRS})
|
||||||
src/stb.cpp
|
|
||||||
src/glad.cpp
|
|
||||||
|
|
||||||
src/ptr_helpers.h
|
find_package(OpenGL)
|
||||||
src/enum/part.h
|
find_package(glm CONFIG REQUIRED)
|
||||||
src/enum/surface.cpp
|
find_package(ReactPhysics3D REQUIRED)
|
||||||
src/enum/meta.h
|
find_package(pugixml 1.15 REQUIRED)
|
||||||
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/physics/world.h
|
|
||||||
src/physics/world.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/luaapis.h
|
|
||||||
src/math_helper.h
|
|
||||||
)
|
|
||||||
|
|
||||||
set(AUTOGEN_SOURCES
|
find_package(Stb REQUIRED)
|
||||||
# Objects
|
include_directories(${Stb_INCLUDE_DIR})
|
||||||
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
|
|
||||||
)
|
|
||||||
|
|
||||||
### Autogen
|
# 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")
|
||||||
|
|
||||||
# https://cmake.org/cmake/help/book/mastering-cmake/chapter/Custom%20Commands.html
|
# https://cmake.org/cmake/help/book/mastering-cmake/chapter/Custom%20Commands.html
|
||||||
foreach (SRC ${AUTOGEN_SOURCES})
|
foreach (SRC ${AUTOGEN_SOURCES})
|
||||||
string(REGEX REPLACE "[.]h$" ".cpp" OUT_SRC_NAME ${SRC})
|
string(REGEX REPLACE "[.]h$" ".cpp" OUT_SRC_NAME ${SRC})
|
||||||
set(SRC_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${SRC}")
|
set(SRC_PATH "${CMAKE_CURRENT_SOURCE_DIR}/src/${SRC}")
|
||||||
set(OUT_PATH "${CMAKE_BINARY_DIR}/generated/${OUT_SRC_NAME}")
|
set(OUT_PATH "${CMAKE_BINARY_DIR}/generated/${OUT_SRC_NAME}")
|
||||||
|
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
|
@ -184,22 +35,17 @@ foreach (SRC ${AUTOGEN_SOURCES})
|
||||||
list(APPEND AUTOGEN_OUTS "${OUT_PATH}")
|
list(APPEND AUTOGEN_OUTS "${OUT_PATH}")
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
### /Autogen
|
|
||||||
|
|
||||||
# Add version info into the build
|
|
||||||
include(gitversion)
|
|
||||||
|
|
||||||
add_custom_target(autogen_build ALL
|
add_custom_target(autogen_build ALL
|
||||||
DEPENDS ${AUTOGEN_OUTS}
|
DEPENDS ${AUTOGEN_OUTS}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
file(GLOB_RECURSE SOURCES "src/*.cpp" "src/*.h")
|
||||||
list(APPEND SOURCES ${AUTOGEN_OUTS})
|
list(APPEND SOURCES ${AUTOGEN_OUTS})
|
||||||
list(APPEND SOURCES ${CMAKE_CURRENT_BINARY_DIR}/src/version.cpp)
|
|
||||||
add_library(openblocks STATIC ${SOURCES})
|
add_library(openblocks STATIC ${SOURCES})
|
||||||
set_target_properties(openblocks PROPERTIES OUTPUT_NAME "openblocks")
|
set_target_properties(openblocks PROPERTIES OUTPUT_NAME "openblocks")
|
||||||
target_link_directories(openblocks PUBLIC ${LUAJIT_LIBRARY_DIRS})
|
target_link_directories(openblocks PUBLIC ${LUAJIT_LIBRARY_DIRS})
|
||||||
target_link_libraries(openblocks Jolt pugixml::pugixml Freetype::Freetype glm::glm libluajit ${LuaJIT_LIBRARIES})
|
target_link_libraries(openblocks ${GLEW_LIBRARIES} ${LUAJIT_LIBRARIES} OpenGL::GL ReactPhysics3D::ReactPhysics3D pugixml::pugixml)
|
||||||
target_include_directories(openblocks PUBLIC "src" "../include" "${CMAKE_SOURCE_DIR}/external/glad" ${LUAJIT_INCLUDE_DIRS} ${stb_SOURCE_DIR})
|
target_include_directories(openblocks PUBLIC "src" "../include" ${LUAJIT_INCLUDE_DIRS})
|
||||||
add_dependencies(openblocks autogen_build autogen)
|
add_dependencies(openblocks autogen_build autogen)
|
||||||
|
|
||||||
# Windows-specific dependencies
|
# Windows-specific dependencies
|
||||||
|
|
|
@ -1,30 +0,0 @@
|
||||||
|
|
||||||
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 Jolt GIT_REPOSITORY "https://github.com/jrouwe/JoltPhysics" VERSION 5.3.0 SOURCE_SUBDIR "Build")
|
|
||||||
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})
|
|
|
@ -15,8 +15,24 @@ Handles editorToolHandles;
|
||||||
|
|
||||||
|
|
||||||
std::vector<std::shared_ptr<Instance>> currentSelection;
|
std::vector<std::shared_ptr<Instance>> currentSelection;
|
||||||
|
std::vector<SelectionUpdateHandler> selectionUpdateListeners;
|
||||||
std::vector<PropertyUpdateHandler> propertyUpdatelisteners;
|
std::vector<PropertyUpdateHandler> propertyUpdatelisteners;
|
||||||
|
|
||||||
|
void setSelection(std::vector<std::shared_ptr<Instance>> newSelection, bool fromExplorer) {
|
||||||
|
for (SelectionUpdateHandler handler : selectionUpdateListeners) {
|
||||||
|
handler(currentSelection, newSelection, fromExplorer);
|
||||||
|
}
|
||||||
|
|
||||||
|
currentSelection = newSelection;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::vector<std::shared_ptr<Instance>> getSelection() {
|
||||||
|
return currentSelection;
|
||||||
|
}
|
||||||
|
|
||||||
|
void addSelectionListener(SelectionUpdateHandler handler) {
|
||||||
|
selectionUpdateListeners.push_back(handler);
|
||||||
|
}
|
||||||
|
|
||||||
void sendPropertyUpdatedSignal(std::shared_ptr<Instance> instance, std::string property, Variant newValue) {
|
void sendPropertyUpdatedSignal(std::shared_ptr<Instance> instance, std::string property, Variant newValue) {
|
||||||
for (PropertyUpdateHandler handler : propertyUpdatelisteners) {
|
for (PropertyUpdateHandler handler : propertyUpdatelisteners) {
|
||||||
|
|
|
@ -1,15 +1,17 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "objects/base/instance.h"
|
#include "objects/base/instance.h"
|
||||||
#include "handles.h"
|
#include "handles.h"
|
||||||
#include "objects/service/workspace.h"
|
#include "objects/workspace.h"
|
||||||
#include "objects/datamodel.h"
|
#include "objects/datamodel.h"
|
||||||
#include "camera.h"
|
#include "camera.h"
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
class Instance;
|
class Instance;
|
||||||
typedef std::function<void(std::shared_ptr<Instance> object, nullable std::shared_ptr<Instance> oldParent, nullable std::shared_ptr<Instance> newParent)> HierarchyPreUpdateHandler;
|
// typedef std::function<void(std::shared_ptr<Instance> element, std::optional<std::shared_ptr<Instance>> newParent)> HierarchyUpdateHandler;
|
||||||
typedef std::function<void(std::shared_ptr<Instance> object, nullable std::shared_ptr<Instance> oldParent, nullable std::shared_ptr<Instance> newParent)> HierarchyPostUpdateHandler;
|
typedef std::function<void(std::shared_ptr<Instance> object, std::optional<std::shared_ptr<Instance>> oldParent, std::optional<std::shared_ptr<Instance>> newParent)> HierarchyPreUpdateHandler;
|
||||||
|
typedef std::function<void(std::shared_ptr<Instance> object, std::optional<std::shared_ptr<Instance>> oldParent, std::optional<std::shared_ptr<Instance>> newParent)> HierarchyPostUpdateHandler;
|
||||||
|
typedef std::function<void(std::vector<std::shared_ptr<Instance>> oldSelection, std::vector<std::shared_ptr<Instance>> newSelection, bool fromExplorer)> SelectionUpdateHandler;
|
||||||
typedef std::function<void(std::shared_ptr<Instance> instance, std::string property, Variant newValue)> PropertyUpdateHandler;
|
typedef std::function<void(std::shared_ptr<Instance> instance, std::string property, Variant newValue)> PropertyUpdateHandler;
|
||||||
|
|
||||||
// TEMPORARY COMMON DATA FOR VARIOUS INTERNAL COMPONENTS
|
// TEMPORARY COMMON DATA FOR VARIOUS INTERNAL COMPONENTS
|
||||||
|
@ -22,5 +24,9 @@ extern std::optional<HierarchyPreUpdateHandler> hierarchyPreUpdateHandler;
|
||||||
extern std::optional<HierarchyPostUpdateHandler> hierarchyPostUpdateHandler;
|
extern std::optional<HierarchyPostUpdateHandler> hierarchyPostUpdateHandler;
|
||||||
extern Handles editorToolHandles;
|
extern Handles editorToolHandles;
|
||||||
|
|
||||||
|
void setSelection(std::vector<std::shared_ptr<Instance>> newSelection, bool fromExplorer = false);
|
||||||
|
const std::vector<std::shared_ptr<Instance>> getSelection();
|
||||||
|
void addSelectionListener(SelectionUpdateHandler handler);
|
||||||
|
|
||||||
void sendPropertyUpdatedSignal(std::shared_ptr<Instance> instance, std::string property, Variant newValue);
|
void sendPropertyUpdatedSignal(std::shared_ptr<Instance> instance, std::string property, Variant newValue);
|
||||||
void addPropertyUpdateListener(PropertyUpdateHandler handler);
|
void addPropertyUpdateListener(PropertyUpdateHandler handler);
|
|
@ -8,7 +8,6 @@
|
||||||
#define def_data_prop(...) clang::annotate("OB::def_data_prop", #__VA_ARGS__)
|
#define def_data_prop(...) clang::annotate("OB::def_data_prop", #__VA_ARGS__)
|
||||||
#define def_data_method(...) clang::annotate("OB::def_data_method", #__VA_ARGS__)
|
#define def_data_method(...) clang::annotate("OB::def_data_method", #__VA_ARGS__)
|
||||||
#define def_data_ctor(...) clang::annotate("OB::def_data_ctor", #__VA_ARGS__)
|
#define def_data_ctor(...) clang::annotate("OB::def_data_ctor", #__VA_ARGS__)
|
||||||
#define def_data_op(...) clang::annotate("OB::def_data_op", #__VA_ARGS__)
|
|
||||||
#else
|
#else
|
||||||
#define def_data(...)
|
#define def_data(...)
|
||||||
#define def_data_prop(...)
|
#define def_data_prop(...)
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
#include "cframe.h"
|
#include "cframe.h"
|
||||||
#include "datatypes/vector.h"
|
#include "datatypes/vector.h"
|
||||||
#include "error/data.h"
|
#include "error/data.h"
|
||||||
|
#include "physics/util.h"
|
||||||
#include <glm/ext/matrix_transform.hpp>
|
#include <glm/ext/matrix_transform.hpp>
|
||||||
#include <glm/gtc/matrix_inverse.hpp>
|
#include <glm/gtc/matrix_inverse.hpp>
|
||||||
#include <glm/gtc/quaternion.hpp>
|
#include <glm/gtc/quaternion.hpp>
|
||||||
#include <glm/matrix.hpp>
|
#include <glm/matrix.hpp>
|
||||||
|
#include <reactphysics3d/mathematics/Transform.h>
|
||||||
#include "datatypes/variant.h"
|
#include "datatypes/variant.h"
|
||||||
#include <pugixml.hpp>
|
#include <pugixml.hpp>
|
||||||
#define GLM_ENABLE_EXPERIMENTAL
|
#define GLM_ENABLE_EXPERIMENTAL
|
||||||
|
@ -38,6 +40,9 @@ CFrame::CFrame(Vector3 position, glm::quat quat)
|
||||||
, rotation(quat) {
|
, rotation(quat) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CFrame::CFrame(const rp::Transform& transform) : CFrame::CFrame(rpToGlm(transform.getPosition()), rpToGlm(transform.getOrientation())) {
|
||||||
|
}
|
||||||
|
|
||||||
glm::mat3 lookAt(Vector3 position, Vector3 lookAt, Vector3 up) {
|
glm::mat3 lookAt(Vector3 position, Vector3 lookAt, Vector3 up) {
|
||||||
// https://github.com/sgorsten/linalg/issues/29#issuecomment-743989030
|
// https://github.com/sgorsten/linalg/issues/29#issuecomment-743989030
|
||||||
Vector3 f = (lookAt - position).Unit(); // Forward/Look
|
Vector3 f = (lookAt - position).Unit(); // Forward/Look
|
||||||
|
@ -72,6 +77,10 @@ CFrame::operator glm::mat4() const {
|
||||||
return glm::translate(glm::mat4(1.0f), this->translation) * glm::mat4(this->rotation);
|
return glm::translate(glm::mat4(1.0f), this->translation) * glm::mat4(this->rotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CFrame::operator rp::Transform() const {
|
||||||
|
return rp::Transform(glmToRp(translation), glmToRp(rotation));
|
||||||
|
}
|
||||||
|
|
||||||
Vector3 CFrame::ToEulerAnglesXYZ() {
|
Vector3 CFrame::ToEulerAnglesXYZ() {
|
||||||
float x;
|
float x;
|
||||||
float y;
|
float y;
|
||||||
|
@ -108,10 +117,6 @@ CFrame CFrame::operator -(Vector3 vector) const {
|
||||||
return *this + -vector;
|
return *this + -vector;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CFrame::operator ==(CFrame other) const {
|
|
||||||
return this->Position() == other.Position() && this->rotation == other.rotation;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Serialization
|
// Serialization
|
||||||
|
|
||||||
void CFrame::Serialize(pugi::xml_node node) const {
|
void CFrame::Serialize(pugi::xml_node node) const {
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
#include <glm/gtc/matrix_access.hpp>
|
#include <glm/gtc/matrix_access.hpp>
|
||||||
#include <glm/matrix.hpp>
|
#include <glm/matrix.hpp>
|
||||||
|
|
||||||
|
namespace reactphysics3d { class Transform; };
|
||||||
|
|
||||||
class DEF_DATA_(name="CoordinateFrame") CFrame {
|
class DEF_DATA_(name="CoordinateFrame") CFrame {
|
||||||
AUTOGEN_PREAMBLE_DATA
|
AUTOGEN_PREAMBLE_DATA
|
||||||
|
|
||||||
|
@ -22,6 +24,7 @@ public:
|
||||||
DEF_DATA_CTOR CFrame();
|
DEF_DATA_CTOR CFrame();
|
||||||
DEF_DATA_CTOR CFrame(float x, float y, float z, float R00, float R01, float R02, float R10, float R11, float R12, float R20, float R21, float R22);
|
DEF_DATA_CTOR CFrame(float x, float y, float z, float R00, float R01, float R02, float R10, float R11, float R12, float R20, float R21, float R22);
|
||||||
DEF_DATA_CTOR CFrame(Vector3 , Vector3 lookAt, Vector3 up = Vector3(0, 1, 0));
|
DEF_DATA_CTOR CFrame(Vector3 , Vector3 lookAt, Vector3 up = Vector3(0, 1, 0));
|
||||||
|
CFrame(const reactphysics3d::Transform&);
|
||||||
CFrame(Vector3 position, glm::quat quat);
|
CFrame(Vector3 position, glm::quat quat);
|
||||||
virtual ~CFrame();
|
virtual ~CFrame();
|
||||||
|
|
||||||
|
@ -43,11 +46,11 @@ public:
|
||||||
static void PushLuaLibrary(lua_State*);
|
static void PushLuaLibrary(lua_State*);
|
||||||
|
|
||||||
operator glm::mat4() const;
|
operator glm::mat4() const;
|
||||||
|
operator reactphysics3d::Transform() const;
|
||||||
|
|
||||||
//inline static CFrame identity() { }
|
//inline static CFrame identity() { }
|
||||||
DEF_DATA_PROP inline Vector3 Position() const { return translation; }
|
DEF_DATA_PROP inline Vector3 Position() const { return translation; }
|
||||||
DEF_DATA_PROP inline CFrame Rotation() const { return CFrame { glm::vec3(0, 0, 0), rotation }; }
|
DEF_DATA_PROP inline CFrame Rotation() const { return CFrame { glm::vec3(0, 0, 0), rotation }; }
|
||||||
inline glm::mat3 RotMatrix() const { return rotation; }
|
|
||||||
DEF_DATA_METHOD CFrame Inverse() const;
|
DEF_DATA_METHOD CFrame Inverse() const;
|
||||||
DEF_DATA_PROP inline float X() const { return translation.x; }
|
DEF_DATA_PROP inline float X() const { return translation.x; }
|
||||||
DEF_DATA_PROP inline float Y() const { return translation.y; }
|
DEF_DATA_PROP inline float Y() const { return translation.y; }
|
||||||
|
@ -65,10 +68,4 @@ public:
|
||||||
DEF_DATA_OP Vector3 operator *(Vector3) const;
|
DEF_DATA_OP Vector3 operator *(Vector3) const;
|
||||||
DEF_DATA_OP CFrame operator +(Vector3) const;
|
DEF_DATA_OP CFrame operator +(Vector3) const;
|
||||||
DEF_DATA_OP CFrame operator -(Vector3) const;
|
DEF_DATA_OP CFrame operator -(Vector3) const;
|
||||||
|
|
||||||
inline CFrame operator *=(CFrame otherFrame) { return *this = *this * otherFrame; }
|
|
||||||
inline CFrame operator +=(Vector3 offset) { return *this = *this + offset; }
|
|
||||||
inline CFrame operator -=(Vector3 offset) { return *this = *this - offset; }
|
|
||||||
|
|
||||||
DEF_DATA_OP bool operator ==(CFrame) const;
|
|
||||||
};
|
};
|
|
@ -6,14 +6,13 @@
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <algorithm>
|
#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(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(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;
|
Color3::~Color3() = default;
|
||||||
|
|
||||||
const std::string Color3::ToString() const {
|
const std::string Color3::ToString() const {
|
||||||
return std::to_string(int(r*255)) + ", " + std::to_string(int(g*255)) + ", " + std::to_string(int(b*255));
|
return std::to_string(int(r*256)) + ", " + std::to_string(int(g*256)) + ", " + std::to_string(int(b*256));
|
||||||
}
|
}
|
||||||
|
|
||||||
Color3::operator glm::vec3() const { return glm::vec3(r, g, b); };
|
Color3::operator glm::vec3() const { return glm::vec3(r, g, b); };
|
||||||
|
@ -36,10 +35,6 @@ Color3 Color3::FromHex(std::string hex) {
|
||||||
return Color3(r, g, b);
|
return Color3(r, g, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Color3::operator ==(Color3 other) const {
|
|
||||||
return this->r == other.r && this->g == other.g && this->b == other.b;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Serialization
|
// Serialization
|
||||||
|
|
||||||
void Color3::Serialize(pugi::xml_node node) const {
|
void Color3::Serialize(pugi::xml_node node) const {
|
||||||
|
|
|
@ -14,7 +14,6 @@ class DEF_DATA Color3 {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
DEF_DATA_CTOR Color3(float r, float g, float b);
|
DEF_DATA_CTOR Color3(float r, float g, float b);
|
||||||
Color3();
|
|
||||||
Color3(const glm::vec3&);
|
Color3(const glm::vec3&);
|
||||||
virtual ~Color3();
|
virtual ~Color3();
|
||||||
|
|
||||||
|
@ -32,6 +31,4 @@ public:
|
||||||
DEF_DATA_PROP inline float R() const { return r; }
|
DEF_DATA_PROP inline float R() const { return r; }
|
||||||
DEF_DATA_PROP inline float G() const { return g; }
|
DEF_DATA_PROP inline float G() const { return g; }
|
||||||
DEF_DATA_PROP inline float B() const { return b; }
|
DEF_DATA_PROP inline float B() const { return b; }
|
||||||
|
|
||||||
DEF_DATA_OP bool operator ==(Color3) const;
|
|
||||||
};
|
};
|
|
@ -40,18 +40,16 @@ EnumItem Enum::FromValueInternal(int value) const {
|
||||||
return result.value();
|
return result.value();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EnumItem::EnumItem(_EnumData* parentData, std::string name, int value) : parentData(parentData), name(name), value(value) {}
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
std::string Enum::ToString() const {
|
std::string Enum::ToString() const {
|
||||||
return "Enum." + this->data->name;
|
return "Enum." + this->data->name;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Enum::operator ==(Enum other) const {
|
|
||||||
return this->data == other.data;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
||||||
EnumItem::EnumItem(_EnumData* parentData, std::string name, int value) : parentData(parentData), name(name), value(value) {}
|
|
||||||
|
|
||||||
std::string EnumItem::ToString() const {
|
std::string EnumItem::ToString() const {
|
||||||
return "Enum." + parentData->name + "." + name;
|
return "Enum." + parentData->name + "." + name;
|
||||||
}
|
}
|
||||||
|
@ -72,7 +70,3 @@ result<EnumItem, DataParseError> EnumItem::FromString(std::string string, const
|
||||||
if (result.has_value()) return result.value();
|
if (result.has_value()) return result.value();
|
||||||
return DataParseError(string, "EnumItem");
|
return DataParseError(string, "EnumItem");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EnumItem::operator ==(EnumItem other) const {
|
|
||||||
return this->parentData == other.parentData && this->value == other.value;
|
|
||||||
}
|
|
|
@ -6,7 +6,7 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "datatypes/annotation.h"
|
#include "datatypes/annotation.h"
|
||||||
#include "error/data.h"
|
#include "error/data.h"
|
||||||
#include "luaapis.h" // IWYU pragma: keep
|
#include "lua.h" // IWYU pragma: keep
|
||||||
|
|
||||||
struct _EnumData {
|
struct _EnumData {
|
||||||
std::string name;
|
std::string name;
|
||||||
|
@ -31,8 +31,6 @@ public:
|
||||||
|
|
||||||
EnumItem FromValueInternal(int) const;
|
EnumItem FromValueInternal(int) const;
|
||||||
|
|
||||||
DEF_DATA_OP bool operator ==(Enum) const;
|
|
||||||
|
|
||||||
std::string ToString() const;
|
std::string ToString() const;
|
||||||
void PushLuaValue(lua_State*) const;
|
void PushLuaValue(lua_State*) const;
|
||||||
static result<Variant, LuaCastError> FromLuaValue(lua_State*, int);
|
static result<Variant, LuaCastError> FromLuaValue(lua_State*, int);
|
||||||
|
@ -52,8 +50,6 @@ public:
|
||||||
inline int Value() const { return this->value; }
|
inline int Value() const { return this->value; }
|
||||||
inline Enum EnumType() const { return Enum(this->parentData); }
|
inline Enum EnumType() const { return Enum(this->parentData); }
|
||||||
|
|
||||||
DEF_DATA_OP bool operator ==(EnumItem) const;
|
|
||||||
|
|
||||||
static result<EnumItem, DataParseError> FromString(std::string, const TypeMeta);
|
static result<EnumItem, DataParseError> FromString(std::string, const TypeMeta);
|
||||||
std::string ToString() const;
|
std::string ToString() const;
|
||||||
void Serialize(pugi::xml_node) const;
|
void Serialize(pugi::xml_node) const;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#include "error/data.h"
|
#include "error/data.h"
|
||||||
#include "variant.h"
|
#include "variant.h"
|
||||||
#include <pugixml.hpp>
|
#include <pugixml.hpp>
|
||||||
#include "luaapis.h" // IWYU pragma: keep
|
#include "lua.h" // IWYU pragma: keep
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
// null
|
// null
|
||||||
|
@ -68,7 +68,7 @@ void Bool_PushLuaValue(Variant self, lua_State* L) {
|
||||||
result<Variant, LuaCastError> Bool_FromLuaValue(lua_State* L, int idx) {
|
result<Variant, LuaCastError> Bool_FromLuaValue(lua_State* L, int idx) {
|
||||||
if (!lua_isboolean(L, idx))
|
if (!lua_isboolean(L, idx))
|
||||||
return LuaCastError(lua_typename(L, idx), "boolean");
|
return LuaCastError(lua_typename(L, idx), "boolean");
|
||||||
return Variant((bool)lua_toboolean(L, idx));
|
return Variant(lua_toboolean(L, idx));
|
||||||
}
|
}
|
||||||
|
|
||||||
const TypeDesc BOOL_TYPE {
|
const TypeDesc BOOL_TYPE {
|
||||||
|
|
|
@ -6,14 +6,14 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include "objects/base/instance.h"
|
#include "objects/base/instance.h"
|
||||||
#include "luaapis.h" // IWYU pragma: keep
|
#include "lua.h" // IWYU pragma: keep
|
||||||
#include "objects/base/member.h"
|
#include "objects/base/member.h"
|
||||||
#include <pugixml.hpp>
|
#include <pugixml.hpp>
|
||||||
|
|
||||||
TypeMeta::TypeMeta(const InstanceType* instType) : descriptor(&InstanceRef::TYPE), instType(instType) {}
|
TypeMeta::TypeMeta(const InstanceType* instType) : descriptor(&InstanceRef::TYPE), instType(instType) {}
|
||||||
|
|
||||||
InstanceRef::InstanceRef() : ref(nullptr) {};
|
InstanceRef::InstanceRef() {};
|
||||||
InstanceRef::InstanceRef(std::weak_ptr<Instance> instance) : ref(instance.expired() ? nullptr : instance.lock()) {};
|
InstanceRef::InstanceRef(std::weak_ptr<Instance> instance) : ref(instance) {};
|
||||||
InstanceRef::~InstanceRef() = default;
|
InstanceRef::~InstanceRef() = default;
|
||||||
|
|
||||||
const TypeDesc InstanceRef::TYPE = {
|
const TypeDesc InstanceRef::TYPE = {
|
||||||
|
@ -27,21 +27,13 @@ const TypeDesc InstanceRef::TYPE = {
|
||||||
};
|
};
|
||||||
|
|
||||||
const std::string InstanceRef::ToString() const {
|
const std::string InstanceRef::ToString() const {
|
||||||
return ref == nullptr ? "NULL" : ref->name;
|
return ref.expired() ? "" : ref.lock()->name;
|
||||||
}
|
|
||||||
|
|
||||||
InstanceRef::operator std::shared_ptr<Instance>() {
|
|
||||||
return ref;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
InstanceRef::operator std::weak_ptr<Instance>() {
|
InstanceRef::operator std::weak_ptr<Instance>() {
|
||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InstanceRef::operator ==(InstanceRef other) const {
|
|
||||||
return this->ref == other.ref;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Serialization
|
// Serialization
|
||||||
|
|
||||||
void InstanceRef::Serialize(pugi::xml_node node) const {
|
void InstanceRef::Serialize(pugi::xml_node node) const {
|
||||||
|
@ -58,43 +50,16 @@ static int inst_gc(lua_State*);
|
||||||
static int inst_index(lua_State*);
|
static int inst_index(lua_State*);
|
||||||
static int inst_newindex(lua_State*);
|
static int inst_newindex(lua_State*);
|
||||||
static int inst_tostring(lua_State*);
|
static int inst_tostring(lua_State*);
|
||||||
static int inst_eq(lua_State*);
|
|
||||||
static const struct luaL_Reg metatable [] = {
|
static const struct luaL_Reg metatable [] = {
|
||||||
{"__gc", inst_gc},
|
{"__gc", inst_gc},
|
||||||
{"__index", inst_index},
|
{"__index", inst_index},
|
||||||
{"__newindex", inst_newindex},
|
{"__newindex", inst_newindex},
|
||||||
{"__tostring", inst_tostring},
|
{"__tostring", inst_tostring},
|
||||||
{"__eq", inst_eq},
|
|
||||||
{NULL, NULL} /* end of array */
|
{NULL, NULL} /* end of array */
|
||||||
};
|
};
|
||||||
|
|
||||||
void InstanceRef::PushLuaValue(lua_State* L) const {
|
void InstanceRef::PushLuaValue(lua_State* L) const {
|
||||||
if (ref == nullptr) return lua_pushnil(L);
|
if (ref.expired()) return lua_pushnil(L);
|
||||||
|
|
||||||
// Get or create InstanceRef table
|
|
||||||
lua_getfield(L, LUA_REGISTRYINDEX, "__instances");
|
|
||||||
if (lua_isnil(L, -1)) {
|
|
||||||
lua_pop(L, 1);
|
|
||||||
lua_newtable(L);
|
|
||||||
|
|
||||||
// Set metatable
|
|
||||||
lua_newtable(L);
|
|
||||||
lua_pushstring(L, "kv");
|
|
||||||
lua_setfield(L, -2, "__mode");
|
|
||||||
lua_setmetatable(L, -2);
|
|
||||||
|
|
||||||
lua_pushvalue(L, -1);
|
|
||||||
lua_setfield(L, LUA_REGISTRYINDEX, "__instances");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if value already exists, and if so, return that instead
|
|
||||||
lua_pushlightuserdata(L, ref.get());
|
|
||||||
lua_rawget(L, -2);
|
|
||||||
if (!lua_isnil(L, -1)) {
|
|
||||||
lua_remove(L, -2); // Remove __instances
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
lua_pop(L, 1);
|
|
||||||
|
|
||||||
int n = lua_gettop(L);
|
int n = lua_gettop(L);
|
||||||
|
|
||||||
|
@ -107,13 +72,8 @@ void InstanceRef::PushLuaValue(lua_State* L) const {
|
||||||
// Create the instance's metatable
|
// Create the instance's metatable
|
||||||
luaL_newmetatable(L, "__mt_instance");
|
luaL_newmetatable(L, "__mt_instance");
|
||||||
luaL_register(L, NULL, metatable);
|
luaL_register(L, NULL, metatable);
|
||||||
lua_setmetatable(L, n+1);
|
|
||||||
|
|
||||||
// Add instance to __instances
|
lua_setmetatable(L, n+1);
|
||||||
lua_pushlightuserdata(L, ref.get());
|
|
||||||
lua_pushvalue(L, -2); // Push userdata
|
|
||||||
lua_rawset(L, -4); // Put into __instance
|
|
||||||
lua_remove(L, -2); // Remove __instance
|
|
||||||
}
|
}
|
||||||
|
|
||||||
result<Variant, LuaCastError> InstanceRef::FromLuaValue(lua_State* L, int idx) {
|
result<Variant, LuaCastError> InstanceRef::FromLuaValue(lua_State* L, int idx) {
|
||||||
|
@ -145,15 +105,15 @@ static int inst_index(lua_State* L) {
|
||||||
// Read property
|
// Read property
|
||||||
std::optional<PropertyMeta> meta = inst->GetPropertyMeta(key);
|
std::optional<PropertyMeta> meta = inst->GetPropertyMeta(key);
|
||||||
if (meta) {
|
if (meta) {
|
||||||
Variant value = inst->GetProperty(key).expect();
|
Variant value = inst->GetPropertyValue(key).expect();
|
||||||
value.PushLuaValue(L);
|
value.PushLuaValue(L);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Look for child
|
// Look for child
|
||||||
nullable std::shared_ptr<Instance> child = inst->FindFirstChild(key);
|
std::optional<std::shared_ptr<Instance>> child = inst->FindFirstChild(key);
|
||||||
if (child) {
|
if (child) {
|
||||||
InstanceRef(child).PushLuaValue(L);
|
InstanceRef(child.value()).PushLuaValue(L);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,7 +133,7 @@ static int inst_newindex(lua_State* L) {
|
||||||
if (meta->flags & PROP_READONLY)
|
if (meta->flags & PROP_READONLY)
|
||||||
return luaL_error(L, "'%s' of %s is read-only", key.c_str(), inst->GetClass()->className.c_str());
|
return luaL_error(L, "'%s' of %s is read-only", key.c_str(), inst->GetClass()->className.c_str());
|
||||||
if (key == "Parent" && inst->IsParentLocked())
|
if (key == "Parent" && inst->IsParentLocked())
|
||||||
return luaL_error(L, "Cannot set property Parent (%s) of %s, parent is locked", inst->GetParent() ? inst->GetParent()->name.c_str() : "NULL", inst->GetClass()->className.c_str());
|
return luaL_error(L, "Cannot set property Parent (%s) of %s, parent is locked", inst->GetParent() ? inst->GetParent().value()->name.c_str() : "NULL", inst->GetClass()->className.c_str());
|
||||||
|
|
||||||
// TODO: Make this work for enums, this is not a solution!!
|
// TODO: Make this work for enums, this is not a solution!!
|
||||||
result<Variant, LuaCastError> value = meta->type.descriptor->fromLuaValue(L, -1);
|
result<Variant, LuaCastError> value = meta->type.descriptor->fromLuaValue(L, -1);
|
||||||
|
@ -181,7 +141,7 @@ static int inst_newindex(lua_State* L) {
|
||||||
|
|
||||||
if (value.isError())
|
if (value.isError())
|
||||||
return luaL_error(L, "%s", value.errorMessage().value().c_str());
|
return luaL_error(L, "%s", value.errorMessage().value().c_str());
|
||||||
inst->SetProperty(key, value.expect()).expect();
|
inst->SetPropertyValue(key, value.expect()).expect();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,13 +153,3 @@ static int inst_tostring(lua_State* L) {
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int inst_eq(lua_State* L) {
|
|
||||||
auto userdata = (std::shared_ptr<Instance>**)lua_touserdata(L, 1);
|
|
||||||
std::shared_ptr<Instance> inst = **userdata;
|
|
||||||
auto userdata2 = (std::shared_ptr<Instance>**)luaL_checkudata(L, 2, "__mt_instance");
|
|
||||||
std::shared_ptr<Instance> inst2 = **userdata2;
|
|
||||||
|
|
||||||
lua_pushboolean(L, inst == inst2);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
|
@ -2,13 +2,12 @@
|
||||||
|
|
||||||
#include "base.h"
|
#include "base.h"
|
||||||
#include "error/data.h"
|
#include "error/data.h"
|
||||||
#include "utils.h"
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
class Instance;
|
class Instance;
|
||||||
|
|
||||||
class InstanceRef {
|
class InstanceRef {
|
||||||
nullable std::shared_ptr<Instance> ref;
|
std::weak_ptr<Instance> ref;
|
||||||
public:
|
public:
|
||||||
InstanceRef();
|
InstanceRef();
|
||||||
InstanceRef(std::weak_ptr<Instance>);
|
InstanceRef(std::weak_ptr<Instance>);
|
||||||
|
@ -16,7 +15,6 @@ public:
|
||||||
|
|
||||||
static const TypeDesc TYPE;
|
static const TypeDesc TYPE;
|
||||||
|
|
||||||
operator std::shared_ptr<Instance>();
|
|
||||||
operator std::weak_ptr<Instance>();
|
operator std::weak_ptr<Instance>();
|
||||||
|
|
||||||
virtual const std::string ToString() const;
|
virtual const std::string ToString() const;
|
||||||
|
@ -24,6 +22,4 @@ public:
|
||||||
virtual void PushLuaValue(lua_State*) const;
|
virtual void PushLuaValue(lua_State*) const;
|
||||||
static result<InstanceRef, DataParseError> Deserialize(pugi::xml_node node);
|
static result<InstanceRef, DataParseError> Deserialize(pugi::xml_node node);
|
||||||
static result<Variant, LuaCastError> FromLuaValue(lua_State*, int idx);
|
static result<Variant, LuaCastError> FromLuaValue(lua_State*, int idx);
|
||||||
|
|
||||||
bool operator ==(InstanceRef) const;
|
|
||||||
};
|
};
|
|
@ -1,14 +1,12 @@
|
||||||
#include "signal.h"
|
#include "signal.h"
|
||||||
#include "datatypes/base.h"
|
#include "datatypes/base.h"
|
||||||
#include "variant.h"
|
#include "variant.h"
|
||||||
#include "luaapis.h" // IWYU pragma: keep
|
#include "lua.h" // IWYU pragma: keep
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <pugixml.hpp>
|
#include <pugixml.hpp>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
int script_errhandler(lua_State*); // extern
|
|
||||||
|
|
||||||
SignalSource::SignalSource() : std::shared_ptr<Signal>(std::make_shared<Signal>()) {}
|
SignalSource::SignalSource() : std::shared_ptr<Signal>(std::make_shared<Signal>()) {}
|
||||||
SignalSource::~SignalSource() = default;
|
SignalSource::~SignalSource() = default;
|
||||||
|
|
||||||
|
@ -27,8 +25,6 @@ LuaSignalConnection::LuaSignalConnection(lua_State* L, std::weak_ptr<Signal> par
|
||||||
// Save function and current thread so they don't get GC'd
|
// Save function and current thread so they don't get GC'd
|
||||||
function = luaL_ref(L, LUA_REGISTRYINDEX);
|
function = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||||
lua_pushthread(L);
|
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);
|
thread = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,24 +34,40 @@ LuaSignalConnection::~LuaSignalConnection() {
|
||||||
luaL_unref(state, LUA_REGISTRYINDEX, thread);
|
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) {
|
void LuaSignalConnection::Call(std::vector<Variant> args) {
|
||||||
lua_State* thread = lua_newthread(state);
|
lua_State* thread = lua_newthread(state);
|
||||||
|
|
||||||
// Push wrapepr as thread function
|
// Push function
|
||||||
lua_getfield(thread, LUA_REGISTRYINDEX, "LuaPCallWrapper");
|
|
||||||
|
|
||||||
// Push function as upvalue for wrapper
|
|
||||||
lua_rawgeti(thread, LUA_REGISTRYINDEX, function);
|
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) {
|
for (Variant arg : args) {
|
||||||
arg.PushLuaValue(thread);
|
arg.PushLuaValue(thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
lua_resume(thread, args.size());
|
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_pop(state, 1); // Pop thread
|
lua_pop(state, 1); // Pop thread
|
||||||
}
|
}
|
||||||
|
@ -140,7 +152,11 @@ void Signal::Fire(std::vector<Variant> args) {
|
||||||
arg.PushLuaValue(thread);
|
arg.PushLuaValue(thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
lua_resume(thread, args.size());
|
int status = lua_resume(thread, args.size());
|
||||||
|
if (status > LUA_YIELD) {
|
||||||
|
Logger::error(lua_tostring(thread, -1));
|
||||||
|
lua_pop(thread, 1); // Pop return value
|
||||||
|
}
|
||||||
|
|
||||||
// Remove thread from registry
|
// Remove thread from registry
|
||||||
luaL_unref(thread, LUA_REGISTRYINDEX, threadId);
|
luaL_unref(thread, LUA_REGISTRYINDEX, threadId);
|
||||||
|
|
|
@ -117,8 +117,6 @@ public:
|
||||||
|
|
||||||
operator std::weak_ptr<Signal>();
|
operator std::weak_ptr<Signal>();
|
||||||
|
|
||||||
DEF_DATA_OP bool operator ==(SignalRef) const;
|
|
||||||
|
|
||||||
virtual const std::string ToString() const;
|
virtual const std::string ToString() const;
|
||||||
virtual void Serialize(pugi::xml_node node) const;
|
virtual void Serialize(pugi::xml_node node) const;
|
||||||
virtual void PushLuaValue(lua_State*) const;
|
virtual void PushLuaValue(lua_State*) const;
|
||||||
|
@ -136,8 +134,6 @@ public:
|
||||||
|
|
||||||
operator std::weak_ptr<SignalConnection>();
|
operator std::weak_ptr<SignalConnection>();
|
||||||
|
|
||||||
DEF_DATA_OP bool operator ==(SignalConnectionRef) const;
|
|
||||||
|
|
||||||
virtual const std::string ToString() const;
|
virtual const std::string ToString() const;
|
||||||
virtual void Serialize(pugi::xml_node node) const;
|
virtual void Serialize(pugi::xml_node node) const;
|
||||||
virtual void PushLuaValue(lua_State*) const;
|
virtual void PushLuaValue(lua_State*) const;
|
||||||
|
|
|
@ -12,12 +12,12 @@
|
||||||
#include "vector.h"
|
#include "vector.h"
|
||||||
#include "cframe.h"
|
#include "cframe.h"
|
||||||
|
|
||||||
// #define __VARIANT_TYPE std::variant< \_
|
// #define __VARIANT_TYPE std::variant< \
|
||||||
// Null, \_
|
// Null, \
|
||||||
// Bool, \_
|
// Bool, \
|
||||||
// Int, \_
|
// Int, \
|
||||||
// Float, \_
|
// Float, \
|
||||||
// String \_
|
// String \
|
||||||
// >
|
// >
|
||||||
|
|
||||||
typedef std::variant<
|
typedef std::variant<
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <glm/ext/quaternion_geometric.hpp>
|
#include <glm/ext/quaternion_geometric.hpp>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
|
#include <reactphysics3d/mathematics/Vector3.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <pugixml.hpp>
|
#include <pugixml.hpp>
|
||||||
#include "datatypes/base.h"
|
#include "datatypes/base.h"
|
||||||
|
@ -10,8 +11,11 @@
|
||||||
#include "error/data.h"
|
#include "error/data.h"
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
|
namespace rp = reactphysics3d;
|
||||||
|
|
||||||
Vector3::Vector3() : vector(glm::vec3(0, 0, 0)) {};
|
Vector3::Vector3() : vector(glm::vec3(0, 0, 0)) {};
|
||||||
Vector3::Vector3(const glm::vec3& src) : vector(src) {};
|
Vector3::Vector3(const glm::vec3& src) : vector(src) {};
|
||||||
|
Vector3::Vector3(const rp::Vector3& src) : vector(glm::vec3(src.x, src.y, src.z)) {};
|
||||||
Vector3::Vector3(float x, const float y, float z) : vector(glm::vec3(x, y, z)) {};
|
Vector3::Vector3(float x, const float y, float z) : vector(glm::vec3(x, y, z)) {};
|
||||||
|
|
||||||
Vector3::~Vector3() = default;
|
Vector3::~Vector3() = default;
|
||||||
|
@ -27,6 +31,7 @@ const std::string Vector3::ToString() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3::operator glm::vec3() const { return vector; };
|
Vector3::operator glm::vec3() const { return vector; };
|
||||||
|
Vector3::operator rp::Vector3() const { return rp::Vector3(X(), Y(), Z()); };
|
||||||
|
|
||||||
// Operators
|
// Operators
|
||||||
|
|
||||||
|
@ -67,18 +72,10 @@ bool Vector3::operator <(Vector3 other) const {
|
||||||
return X() < other.X() && Y() < other.Y() && Z() < other.Z();
|
return X() < other.X() && Y() < other.Y() && Z() < other.Z();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Vector3::operator <=(Vector3 other) const {
|
|
||||||
return X() <= other.X() && Y() <= other.Y() && Z() <= other.Z();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Vector3::operator >(Vector3 other) const {
|
bool Vector3::operator >(Vector3 other) const {
|
||||||
return X() > other.X() && Y() > other.Y() && Z() > other.Z();
|
return X() > other.X() && Y() > other.Y() && Z() > other.Z();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Vector3::operator >=(Vector3 other) const {
|
|
||||||
return X() >= other.X() && Y() >= other.Y() && Z() >= other.Z();
|
|
||||||
}
|
|
||||||
|
|
||||||
Vector3 Vector3::Cross(Vector3 other) const {
|
Vector3 Vector3::Cross(Vector3 other) const {
|
||||||
return glm::cross(this->vector, other.vector);
|
return glm::cross(this->vector, other.vector);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,9 @@
|
||||||
#include "error/data.h"
|
#include "error/data.h"
|
||||||
#include <glm/ext/vector_float3.hpp>
|
#include <glm/ext/vector_float3.hpp>
|
||||||
#include <glm/geometric.hpp>
|
#include <glm/geometric.hpp>
|
||||||
|
#include <reactphysics3d/mathematics/Vector3.h>
|
||||||
|
|
||||||
|
// namespace reactphysics3d { class Vector3; };
|
||||||
|
|
||||||
class DEF_DATA Vector3 {
|
class DEF_DATA Vector3 {
|
||||||
AUTOGEN_PREAMBLE_DATA
|
AUTOGEN_PREAMBLE_DATA
|
||||||
|
@ -15,6 +18,7 @@ public:
|
||||||
DEF_DATA_CTOR Vector3(float x, float y, float z);
|
DEF_DATA_CTOR Vector3(float x, float y, float z);
|
||||||
inline Vector3(float value) : Vector3(value, value, value) {}
|
inline Vector3(float value) : Vector3(value, value, value) {}
|
||||||
Vector3(const glm::vec3&);
|
Vector3(const glm::vec3&);
|
||||||
|
Vector3(const reactphysics3d::Vector3&);
|
||||||
virtual ~Vector3();
|
virtual ~Vector3();
|
||||||
|
|
||||||
DEF_DATA_PROP static Vector3 ZERO;
|
DEF_DATA_PROP static Vector3 ZERO;
|
||||||
|
@ -29,6 +33,7 @@ public:
|
||||||
static void PushLuaLibrary(lua_State*);
|
static void PushLuaLibrary(lua_State*);
|
||||||
|
|
||||||
operator glm::vec3() const;
|
operator glm::vec3() const;
|
||||||
|
operator reactphysics3d::Vector3() const;
|
||||||
|
|
||||||
DEF_DATA_PROP inline float X() const { return vector.x; }
|
DEF_DATA_PROP inline float X() const { return vector.x; }
|
||||||
DEF_DATA_PROP inline float Y() const { return vector.y; }
|
DEF_DATA_PROP inline float Y() const { return vector.y; }
|
||||||
|
@ -50,18 +55,17 @@ public:
|
||||||
DEF_DATA_OP Vector3 operator -() const;
|
DEF_DATA_OP Vector3 operator -() const;
|
||||||
|
|
||||||
DEF_DATA_OP bool operator <(Vector3) const;
|
DEF_DATA_OP bool operator <(Vector3) const;
|
||||||
DEF_DATA_OP bool operator <=(Vector3) const;
|
DEF_DATA_OP bool operator >(Vector3) const;
|
||||||
bool operator >(Vector3) const;
|
|
||||||
bool operator >=(Vector3) const;
|
|
||||||
DEF_DATA_OP bool operator ==(Vector3) const;
|
DEF_DATA_OP bool operator ==(Vector3) const;
|
||||||
|
|
||||||
// Augmented shorthands
|
// Augmented shorthands
|
||||||
inline Vector3 operator *=(float factor) { return *this = *this * factor; }
|
inline Vector3 operator *=(float factor) const { return *this * factor; }
|
||||||
inline Vector3 operator /=(float factor) { return *this = *this / factor; }
|
inline Vector3 operator /=(float factor) const { return *this / factor; }
|
||||||
inline Vector3 operator *=(Vector3 factor) { return *this = *this * factor; }
|
inline Vector3 operator *=(Vector3 factor) const { return *this * factor; }
|
||||||
inline Vector3 operator /=(Vector3 factor) { return *this = *this / factor; }
|
inline Vector3 operator /=(Vector3 factor) const { return *this / factor; }
|
||||||
inline Vector3 operator +=(Vector3 vector) { return *this = *this + vector; }
|
inline Vector3 operator +=(Vector3 vector) const { return *this + vector; }
|
||||||
inline Vector3 operator -=(Vector3 vector) { return *this = *this + vector; }
|
inline Vector3 operator -=(Vector3 vector) const { return *this + vector; }
|
||||||
};
|
};
|
||||||
|
|
||||||
inline void printVec(Vector3 vec) {
|
inline void printVec(Vector3 vec) {
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "datatypes/enum.h"
|
|
||||||
#include "enum/annotation.h"
|
|
||||||
|
|
||||||
|
|
||||||
enum class DEF_ENUM PartType {
|
|
||||||
Ball = 0,
|
|
||||||
Block = 1,
|
|
||||||
Cylinder = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace EnumType {
|
|
||||||
extern const Enum PartType;
|
|
||||||
};
|
|
|
@ -1,2 +0,0 @@
|
||||||
#define GLAD_GL_IMPLEMENTATION
|
|
||||||
#include <glad/gl.h>
|
|
|
@ -3,11 +3,13 @@
|
||||||
#include "datatypes/cframe.h"
|
#include "datatypes/cframe.h"
|
||||||
#include "datatypes/vector.h"
|
#include "datatypes/vector.h"
|
||||||
#include "math_helper.h"
|
#include "math_helper.h"
|
||||||
#include "objects/service/selection.h"
|
|
||||||
#include "partassembly.h"
|
|
||||||
#include <glm/ext/scalar_common.hpp>
|
#include <glm/ext/scalar_common.hpp>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
#include <reactphysics3d/collision/RaycastInfo.h>
|
||||||
|
#include <reactphysics3d/engine/PhysicsCommon.h>
|
||||||
|
#include <reactphysics3d/engine/PhysicsWorld.h>
|
||||||
|
#include <reactphysics3d/mathematics/Transform.h>
|
||||||
|
|
||||||
HandleFace HandleFace::XPos(0, glm::vec3(1,0,0));
|
HandleFace HandleFace::XPos(0, glm::vec3(1,0,0));
|
||||||
HandleFace HandleFace::XNeg(1, glm::vec3(-1,0,0));
|
HandleFace HandleFace::XNeg(1, glm::vec3(-1,0,0));
|
||||||
|
@ -19,11 +21,14 @@ std::array<HandleFace, 6> HandleFace::Faces { HandleFace::XPos, HandleFace::XNeg
|
||||||
|
|
||||||
static CFrame XYZToZXY(glm::vec3(0, 0, 0), -glm::vec3(1, 0, 0), glm::vec3(0, 0, 1));
|
static CFrame XYZToZXY(glm::vec3(0, 0, 0), -glm::vec3(1, 0, 0), glm::vec3(0, 0, 1));
|
||||||
|
|
||||||
std::shared_ptr<BasePart> getHandleAdornee() {
|
// Shitty solution
|
||||||
std::shared_ptr<Selection> selection = gDataModel->GetService<Selection>();
|
static rp3d::PhysicsCommon common;
|
||||||
for (std::weak_ptr<Instance> inst : selection->Get()) {
|
static rp3d::PhysicsWorld* world = common.createPhysicsWorld();
|
||||||
if (!inst.expired() && inst.lock()->IsA<BasePart>())
|
|
||||||
return inst.lock()->CastTo<BasePart>().expect();
|
std::shared_ptr<Part> getHandleAdornee() {
|
||||||
|
for (std::weak_ptr<Instance> inst : getSelection()) {
|
||||||
|
if (!inst.expired() && inst.lock()->IsA<Part>())
|
||||||
|
return inst.lock()->CastTo<Part>().expect();
|
||||||
}
|
}
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
|
@ -44,25 +49,24 @@ CFrame partCFrameFromHandlePos(HandleFace face, Vector3 newPos) {
|
||||||
return adornee->cframe.Rotation() + newPartPos;
|
return adornee->cframe.Rotation() + newPartPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<HandleFace> raycastHandle(Vector3 rayStart, Vector3 rayEnd) {
|
std::optional<HandleFace> raycastHandle(rp3d::Ray ray) {
|
||||||
std::optional<HandleFace> closestFace = {};
|
|
||||||
float closestDistance = -1;
|
|
||||||
|
|
||||||
for (HandleFace face : HandleFace::Faces) {
|
for (HandleFace face : HandleFace::Faces) {
|
||||||
CFrame cframe = getHandleCFrame(face);
|
CFrame cframe = getHandleCFrame(face);
|
||||||
|
// 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());
|
||||||
|
|
||||||
Vector3 halfSize = (cframe.Rotation() * Vector3(handleSize(face) / 2.f)).Abs();
|
rp3d::RaycastInfo info;
|
||||||
Vector3 minB = cframe.Position() - halfSize, maxB = cframe.Position() + halfSize;
|
if (body->raycast(ray, info)) {
|
||||||
|
world->destroyRigidBody(body);
|
||||||
|
return face;
|
||||||
|
}
|
||||||
|
|
||||||
glm::vec3 hitPoint;
|
world->destroyRigidBody(body);
|
||||||
bool hit = HitBoundingBox(minB, maxB, rayStart, (rayEnd - rayStart).Unit(), hitPoint);
|
|
||||||
float distance = ((Vector3)hitPoint - rayStart).Magnitude();
|
|
||||||
|
|
||||||
if (hit && (closestDistance == -1 || distance < closestDistance))
|
|
||||||
closestFace = face, closestDistance = distance;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return closestFace;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 handleSize(HandleFace face) {
|
Vector3 handleSize(HandleFace face) {
|
||||||
|
@ -73,10 +77,9 @@ Vector3 handleSize(HandleFace face) {
|
||||||
|
|
||||||
static int getAABBOfSelection(glm::vec3& pos, glm::vec3& size, glm::vec3& min, glm::vec3& max) {
|
static int getAABBOfSelection(glm::vec3& pos, glm::vec3& size, glm::vec3& min, glm::vec3& max) {
|
||||||
int count = 0;
|
int count = 0;
|
||||||
std::shared_ptr<Selection> selection = gDataModel->GetService<Selection>();
|
for (std::weak_ptr<Instance> inst : getSelection()) {
|
||||||
for (std::weak_ptr<Instance> inst : selection->Get()) {
|
if (inst.expired() || !inst.lock()->IsA<Part>()) continue;
|
||||||
if (inst.expired() || !inst.lock()->IsA<BasePart>()) continue;
|
std::shared_ptr<Part> part = inst.lock()->CastTo<Part>().expect();
|
||||||
std::shared_ptr<BasePart> part = inst.lock()->CastTo<BasePart>().expect();
|
|
||||||
|
|
||||||
if (count == 0)
|
if (count == 0)
|
||||||
min = part->position(), max = part->position();
|
min = part->position(), max = part->position();
|
||||||
|
@ -92,25 +95,25 @@ static int getAABBOfSelection(glm::vec3& pos, glm::vec3& size, glm::vec3& min, g
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::shared_ptr<BasePart> getFirstSelectedPart() {
|
static std::shared_ptr<Part> getFirstSelectedPart() {
|
||||||
std::shared_ptr<Selection> selection = gDataModel->GetService<Selection>();
|
for (std::weak_ptr<Instance> inst : getSelection()) {
|
||||||
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<BasePart>().expect();
|
return inst.lock()->CastTo<Part>().expect();
|
||||||
}
|
}
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
CFrame getLocalHandleCFrame(HandleFace face) {
|
CFrame getLocalHandleCFrame(HandleFace face) {
|
||||||
PartAssembly assembly = PartAssembly::FromSelection(gDataModel->GetService<Selection>());
|
glm::vec3 _boxPos, boxSize, _boxMin, _boxMax;
|
||||||
|
int count = getAABBOfSelection(_boxPos, boxSize, _boxMin, _boxMax);
|
||||||
|
|
||||||
Vector3 size;
|
Vector3 size;
|
||||||
if (editorToolHandles.worldMode)
|
if (count == 1 && !editorToolHandles.worldMode)
|
||||||
size = assembly.bounds();
|
size = getFirstSelectedPart()->size;
|
||||||
else
|
else
|
||||||
size = assembly.size();
|
size = boxSize;
|
||||||
|
|
||||||
// Since rotation displays rings, all handles must be the same distance from origin in order for the
|
// Since rotation displays rings, all handles must be the same distance from origin in order for the
|
||||||
// rings to be circular
|
// rings to be circular
|
||||||
|
@ -122,10 +125,12 @@ CFrame getLocalHandleCFrame(HandleFace face) {
|
||||||
}
|
}
|
||||||
|
|
||||||
CFrame getHandleCFrame(HandleFace face) {
|
CFrame getHandleCFrame(HandleFace face) {
|
||||||
PartAssembly assembly = PartAssembly::FromSelection(gDataModel->GetService<Selection>());
|
glm::vec3 boxPos, boxSize, _boxMin, _boxMax;
|
||||||
|
int count = getAABBOfSelection(boxPos, boxSize, _boxMin, _boxMax);
|
||||||
|
|
||||||
if (editorToolHandles.worldMode) {
|
if (count == 1 && !editorToolHandles.worldMode) {
|
||||||
return getLocalHandleCFrame(face) + assembly.assemblyOrigin().Position();
|
auto part = getFirstSelectedPart();
|
||||||
|
return part->cframe * getLocalHandleCFrame(face);
|
||||||
} else
|
} else
|
||||||
return assembly.assemblyOrigin() * getLocalHandleCFrame(face);
|
return getLocalHandleCFrame(face) + boxPos;
|
||||||
}
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "datatypes/cframe.h"
|
#include "datatypes/cframe.h"
|
||||||
#include "objects/part/part.h"
|
#include "objects/part.h"
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
@ -36,11 +36,11 @@ struct Handles {
|
||||||
bool worldMode = false;
|
bool worldMode = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::shared_ptr<BasePart> getHandleAdornee();
|
std::shared_ptr<Part> getHandleAdornee();
|
||||||
CFrame getHandleCFrame(HandleFace face);
|
CFrame getHandleCFrame(HandleFace face);
|
||||||
CFrame partCFrameFromHandlePos(HandleFace face, Vector3 newPos);
|
CFrame partCFrameFromHandlePos(HandleFace face, Vector3 newPos);
|
||||||
Vector3 handleSize(HandleFace face);
|
Vector3 handleSize(HandleFace face);
|
||||||
std::optional<HandleFace> raycastHandle(Vector3 rayStart, Vector3 rayEnd);
|
std::optional<HandleFace> raycastHandle(rp3d::Ray ray);
|
||||||
|
|
||||||
// Gets the cframe of the handle local to the center of the selected objects
|
// Gets the cframe of the handle local to the center of the selected objects
|
||||||
CFrame getLocalHandleCFrame(HandleFace face);
|
CFrame getLocalHandleCFrame(HandleFace face);
|
||||||
|
|
|
@ -9,33 +9,26 @@
|
||||||
|
|
||||||
static std::ofstream logStream;
|
static std::ofstream logStream;
|
||||||
static std::vector<Logger::LogListener> logListeners;
|
static std::vector<Logger::LogListener> logListeners;
|
||||||
|
static std::vector<Logger::TraceLogListener> traceLogListeners;
|
||||||
std::string Logger::currentLogDir = "NULL";
|
std::string Logger::currentLogDir = "NULL";
|
||||||
static std::stringstream* rawOutputBuffer = nullptr;
|
|
||||||
|
|
||||||
void Logger::init() {
|
void Logger::init() {
|
||||||
initProgramLogsDir();
|
initProgramLogsDir();
|
||||||
|
|
||||||
const auto now = std::chrono::system_clock::now();
|
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", nows);
|
std::string fileName = std::format("log_{0:%Y%m%d}_{0:%H%M%S}.txt", now);
|
||||||
|
|
||||||
logStream = std::ofstream(currentLogDir = (getProgramLogsDir() + "/" + fileName));
|
logStream = std::ofstream(currentLogDir = (getProgramLogsDir() + "/" + fileName));
|
||||||
Logger::debug("Logger initialized");
|
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() {
|
void Logger::finish() {
|
||||||
Logger::debug("Closing logger...");
|
Logger::debug("Closing logger...");
|
||||||
logStream.close();
|
logStream.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Logger::log(std::string message, Logger::LogLevel logLevel, ScriptSource source) {
|
void Logger::log(std::string message, Logger::LogLevel logLevel) {
|
||||||
std::string logLevelStr = logLevel == Logger::LogLevel::INFO ? "INFO" :
|
std::string logLevelStr = logLevel == Logger::LogLevel::INFO ? "INFO" :
|
||||||
logLevel == Logger::LogLevel::DEBUG ? "DEBUG" :
|
logLevel == Logger::LogLevel::DEBUG ? "DEBUG" :
|
||||||
logLevel == Logger::LogLevel::TRACE ? "TRACE" :
|
logLevel == Logger::LogLevel::TRACE ? "TRACE" :
|
||||||
|
@ -49,10 +42,9 @@ void Logger::log(std::string message, Logger::LogLevel logLevel, ScriptSource so
|
||||||
|
|
||||||
logStream << formattedLogLine << std::endl;
|
logStream << formattedLogLine << std::endl;
|
||||||
printf("%s\n", formattedLogLine.c_str());
|
printf("%s\n", formattedLogLine.c_str());
|
||||||
if (rawOutputBuffer != nullptr) *rawOutputBuffer << logLevelStr << ": " << message << "\n";
|
|
||||||
|
|
||||||
for (Logger::LogListener listener : logListeners) {
|
for (Logger::LogListener listener : logListeners) {
|
||||||
listener(logLevel, message, source);
|
listener(logLevel, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (logLevel == Logger::LogLevel::FATAL_ERROR) {
|
if (logLevel == Logger::LogLevel::FATAL_ERROR) {
|
||||||
|
@ -60,10 +52,20 @@ void Logger::log(std::string message, Logger::LogLevel logLevel, ScriptSource so
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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) {
|
void Logger::addLogListener(Logger::LogListener listener) {
|
||||||
logListeners.push_back(listener);
|
logListeners.push_back(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Logger::resetLogListeners() {
|
void Logger::addLogListener(Logger::TraceLogListener listener) {
|
||||||
logListeners.clear();
|
traceLogListeners.push_back(listener);
|
||||||
}
|
}
|
|
@ -1,12 +1,9 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <format>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <memory>
|
|
||||||
#include <ostream>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
class Script;
|
|
||||||
|
|
||||||
namespace Logger {
|
namespace Logger {
|
||||||
enum class LogLevel {
|
enum class LogLevel {
|
||||||
INFO,
|
INFO,
|
||||||
|
@ -17,39 +14,32 @@ namespace Logger {
|
||||||
FATAL_ERROR,
|
FATAL_ERROR,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ScriptSource {
|
typedef std::function<void(LogLevel logLevel, std::string message)> LogListener;
|
||||||
std::shared_ptr<Script> script;
|
typedef std::function<void(std::string message, std::string source, int line, void* userData)> TraceLogListener;
|
||||||
int line;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef std::function<void(LogLevel logLevel, std::string message, ScriptSource source)> LogListener;
|
|
||||||
|
|
||||||
extern std::string currentLogDir;
|
extern std::string currentLogDir;
|
||||||
|
|
||||||
void init();
|
void init();
|
||||||
void initTest(std::stringstream* out); // Testing only!
|
|
||||||
void finish();
|
void finish();
|
||||||
void addLogListener(LogListener);
|
void addLogListener(LogListener);
|
||||||
void resetLogListeners(); // Testing only!
|
void addLogListener(TraceLogListener);
|
||||||
|
|
||||||
void log(std::string message, LogLevel logLevel, ScriptSource source = {});
|
void log(std::string message, LogLevel logLevel);
|
||||||
inline void info(std::string message) { log(message, LogLevel::INFO); }
|
inline void info(std::string message) { log(message, LogLevel::INFO); }
|
||||||
inline void debug(std::string message) { log(message, LogLevel::DEBUG); }
|
inline void debug(std::string message) { log(message, LogLevel::DEBUG); }
|
||||||
inline void warning(std::string message) { log(message, LogLevel::WARNING); }
|
inline void warning(std::string message) { log(message, LogLevel::WARNING); }
|
||||||
inline void error(std::string message) { log(message, LogLevel::ERROR); }
|
inline void error(std::string message) { log(message, LogLevel::ERROR); }
|
||||||
inline void fatalError(std::string message) { log(message, LogLevel::FATAL_ERROR); }
|
inline void fatalError(std::string message) { log(message, LogLevel::FATAL_ERROR); }
|
||||||
inline void trace(std::string message) { log(message, LogLevel::TRACE); };
|
|
||||||
|
|
||||||
template <typename ...Args>
|
inline void traceStart() { log("Stack start", LogLevel::TRACE); }
|
||||||
void scriptLogf(std::string format, LogLevel logLevel, ScriptSource source, Args&&... args) {
|
inline void traceEnd() { log("Stack end", LogLevel::TRACE); }
|
||||||
char message[200];
|
void trace(std::string source, int line, void* userData = nullptr);
|
||||||
sprintf(message, format.c_str(), args...);
|
|
||||||
log(message, logLevel, source);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ...Args>
|
template <typename ...Args>
|
||||||
void logf(std::string format, LogLevel logLevel, Args&&... args) {
|
void logf(std::string format, LogLevel logLevel, Args&&... args) {
|
||||||
scriptLogf(format, logLevel, {}, args...);
|
char message[200];
|
||||||
|
sprintf(message, format.c_str(), args...);
|
||||||
|
log(message, logLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename ...Args> inline void infof(std::string format, Args&&... args) { logf(format, LogLevel::INFO, args...); }
|
template <typename ...Args> inline void infof(std::string format, Args&&... args) { logf(format, LogLevel::INFO, args...); }
|
||||||
|
|
7
core/src/lua.h
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
#pragma once
|
||||||
|
extern "C" {
|
||||||
|
#include <luajit.h>
|
||||||
|
#include <lauxlib.h>
|
||||||
|
#include <lualib.h>
|
||||||
|
#include <lua.h>
|
||||||
|
}
|
|
@ -1,77 +0,0 @@
|
||||||
#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");
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
#pragma once
|
|
||||||
extern "C" {
|
|
||||||
#include <luajit.h>
|
|
||||||
#include <lauxlib.h>
|
|
||||||
#include <lualib.h>
|
|
||||||
#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) {
|
|
||||||
lua_getmetatable(L, ud);
|
|
||||||
lua_getfield(L, -1, "__name");
|
|
||||||
const char* str = lua_tostring(L, -1);
|
|
||||||
lua_pop(L, 2);
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define LUA_OK 0
|
|
|
@ -2,65 +2,9 @@
|
||||||
|
|
||||||
#define CMP_EPSILON 0.00001
|
#define CMP_EPSILON 0.00001
|
||||||
|
|
||||||
|
|
||||||
void expandAABB(glm::vec3& min, glm::vec3& max, glm::vec3 point) {
|
|
||||||
min = glm::vec3(glm::min(min.x, point.x), glm::min(min.y, point.y), glm::min(min.z, point.z));
|
|
||||||
max = glm::vec3(glm::max(max.x, point.x), glm::max(max.y, point.y), glm::max(max.z, point.z));
|
|
||||||
}
|
|
||||||
|
|
||||||
void computeAABBFromPoints(glm::vec3& min, glm::vec3& max, glm::vec3* points, int count) {
|
|
||||||
if (count == 0) return;
|
|
||||||
|
|
||||||
min = points[0];
|
|
||||||
max = points[0];
|
|
||||||
|
|
||||||
for (int i = 0; i < count; i++) {
|
|
||||||
min = glm::vec3(glm::min(min.x, points[i].x), glm::min(min.y, points[i].y), glm::min(min.z, points[i].z));
|
|
||||||
max = glm::vec3(glm::max(max.x, points[i].x), glm::max(max.y, points[i].y), glm::max(max.z, points[i].z));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void getAABBCoords(glm::vec3 &pos, glm::vec3 &size, glm::vec3 min, glm::vec3 max) {
|
|
||||||
pos = (max + min) / 2.f;
|
|
||||||
size = (max - min);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ==================== THIRD-PARTY SOURCE CODE ==================== //
|
|
||||||
|
|
||||||
// After a long time researching, I was able to use and adapt Godot's implementation of movable handles (godot/editor/plugins/gizmos/gizmo_3d_helper.cpp)
|
// After a long time researching, I was able to use and adapt Godot's implementation of movable handles (godot/editor/plugins/gizmos/gizmo_3d_helper.cpp)
|
||||||
// All thanks goes to them and David Eberly for his algorithm.
|
// All thanks goes to them and David Eberly for his algorithm.
|
||||||
|
|
||||||
/**************************************************************************/
|
|
||||||
/* geometry_3d.cpp */
|
|
||||||
/**************************************************************************/
|
|
||||||
/* This file is part of: */
|
|
||||||
/* GODOT ENGINE */
|
|
||||||
/* https://godotengine.org */
|
|
||||||
/**************************************************************************/
|
|
||||||
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
|
|
||||||
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
|
|
||||||
/* */
|
|
||||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
|
||||||
/* a copy of this software and associated documentation files (the */
|
|
||||||
/* "Software"), to deal in the Software without restriction, including */
|
|
||||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
|
||||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
|
||||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
|
||||||
/* the following conditions: */
|
|
||||||
/* */
|
|
||||||
/* The above copyright notice and this permission notice shall be */
|
|
||||||
/* included in all copies or substantial portions of the Software. */
|
|
||||||
/* */
|
|
||||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
|
||||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
|
||||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
|
|
||||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
|
||||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
|
||||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
|
||||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
void get_closest_points_between_segments(const glm::vec3 &p_p0, const glm::vec3 &p_p1, const glm::vec3 &p_q0, const glm::vec3 &p_q1, glm::vec3 &r_ps, glm::vec3 &r_qt) {
|
void get_closest_points_between_segments(const glm::vec3 &p_p0, const glm::vec3 &p_p1, const glm::vec3 &p_q0, const glm::vec3 &p_q1, glm::vec3 &r_ps, glm::vec3 &r_qt) {
|
||||||
// Based on David Eberly's Computation of Distance Between Line Segments algorithm.
|
// Based on David Eberly's Computation of Distance Between Line Segments algorithm.
|
||||||
|
|
||||||
|
@ -158,83 +102,24 @@ void get_closest_points_between_segments(const glm::vec3 &p_p0, const glm::vec3
|
||||||
r_qt = (1 - t) * p_q0 + t * p_q1;
|
r_qt = (1 - t) * p_q0 + t * p_q1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://github.com/erich666/GraphicsGems/tree/master?tab=License-1-ov-file#readme
|
void expandAABB(glm::vec3& min, glm::vec3& max, glm::vec3 point) {
|
||||||
// Note: The code below predates open source
|
min = glm::vec3(glm::min(min.x, point.x), glm::min(min.y, point.y), glm::min(min.z, point.z));
|
||||||
|
max = glm::vec3(glm::max(max.x, point.x), glm::max(max.y, point.y), glm::max(max.z, point.z));
|
||||||
/*
|
}
|
||||||
* EULA: The Graphics Gems code is copyright-protected. In other words, you cannot claim the text of the code as your own
|
|
||||||
* and resell it. Using the code is permitted in any program, product, or library, non-commercial or commercial. Giving
|
void computeAABBFromPoints(glm::vec3& min, glm::vec3& max, glm::vec3* points, int count) {
|
||||||
* credit is not required, though is a nice gesture. The code comes as-is, and if there are any flaws or problems with
|
if (count == 0) return;
|
||||||
* any Gems code, nobody involved with Gems - authors, editors, publishers, or webmasters - are to be held responsible.
|
|
||||||
* Basically, don't be a jerk, and remember that anything free comes with no guarantee.
|
min = points[0];
|
||||||
*/
|
max = points[0];
|
||||||
|
|
||||||
/*
|
for (int i = 0; i < count; i++) {
|
||||||
Fast Ray-Box Intersection
|
min = glm::vec3(glm::min(min.x, points[i].x), glm::min(min.y, points[i].y), glm::min(min.z, points[i].z));
|
||||||
by Andrew Woo
|
max = glm::vec3(glm::max(max.x, points[i].x), glm::max(max.y, points[i].y), glm::max(max.z, points[i].z));
|
||||||
from "Graphics Gems", Academic Press, 1990
|
}
|
||||||
*/
|
}
|
||||||
|
|
||||||
#define RIGHT 0
|
void getAABBCoords(glm::vec3 &pos, glm::vec3 &size, glm::vec3 min, glm::vec3 max) {
|
||||||
#define LEFT 1
|
pos = (max + min) / 2.f;
|
||||||
#define MIDDLE 2
|
size = (max - min);
|
||||||
|
|
||||||
bool HitBoundingBox(
|
|
||||||
glm::vec3 minB, glm::vec3 maxB, /*box */
|
|
||||||
glm::vec3 origin, glm::vec3 dir, /*ray */
|
|
||||||
glm::vec3 &coord /* hit point */
|
|
||||||
) {
|
|
||||||
bool inside = true;
|
|
||||||
glm::vec3 quadrant;
|
|
||||||
int i;
|
|
||||||
int whichPlane;
|
|
||||||
glm::vec3 maxT;
|
|
||||||
glm::vec3 candidatePlane;
|
|
||||||
|
|
||||||
/* Find candidate planes; this loop can be avoided if
|
|
||||||
rays cast all from the eye(assume perpsective view) */
|
|
||||||
for (i = 0; i < 3; i++)
|
|
||||||
if(origin[i] < minB[i]) {
|
|
||||||
quadrant[i] = LEFT;
|
|
||||||
candidatePlane[i] = minB[i];
|
|
||||||
inside = false;
|
|
||||||
}else if (origin[i] > maxB[i]) {
|
|
||||||
quadrant[i] = RIGHT;
|
|
||||||
candidatePlane[i] = maxB[i];
|
|
||||||
inside = false;
|
|
||||||
}else {
|
|
||||||
quadrant[i] = MIDDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Ray origin inside bounding box */
|
|
||||||
if (inside) {
|
|
||||||
coord = origin;
|
|
||||||
return (true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Calculate T distances to candidate planes */
|
|
||||||
for (i = 0; i < 3; i++)
|
|
||||||
if (quadrant[i] != MIDDLE && dir[i] !=0.)
|
|
||||||
maxT[i] = (candidatePlane[i]-origin[i]) / dir[i];
|
|
||||||
else
|
|
||||||
maxT[i] = -1.;
|
|
||||||
|
|
||||||
/* Get largest of the maxT's for final choice of intersection */
|
|
||||||
whichPlane = 0;
|
|
||||||
for (i = 1; i < 3; i++)
|
|
||||||
if (maxT[whichPlane] < maxT[i])
|
|
||||||
whichPlane = i;
|
|
||||||
|
|
||||||
/* Check final candidate actually inside box */
|
|
||||||
if (maxT[whichPlane] < 0.) return (false);
|
|
||||||
for (i = 0; i < 3; i++)
|
|
||||||
if (whichPlane != i) {
|
|
||||||
coord[i] = origin[i] + maxT[whichPlane] * dir[i];
|
|
||||||
if (coord[i] < minB[i] || coord[i] > maxB[i])
|
|
||||||
return (false);
|
|
||||||
} else {
|
|
||||||
coord[i] = candidatePlane[i];
|
|
||||||
}
|
|
||||||
return true; /* ray hits box */
|
|
||||||
}
|
}
|
|
@ -1,20 +1,9 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <glm/glm.hpp>
|
#include <glm/glm.hpp>
|
||||||
|
|
||||||
void expandAABB(glm::vec3& min, glm::vec3& max, glm::vec3 point);
|
|
||||||
void computeAABBFromPoints(glm::vec3& min, glm::vec3& max, glm::vec3* points, int count);
|
|
||||||
void getAABBCoords(glm::vec3& pos, glm::vec3& size, glm::vec3 min, glm::vec3 max);
|
|
||||||
|
|
||||||
// From godot/editor/plugins/gizmos/gizmo_3d_helper.h
|
// From godot/editor/plugins/gizmos/gizmo_3d_helper.h
|
||||||
void get_closest_points_between_segments(const glm::vec3 &p_p0, const glm::vec3 &p_p1, const glm::vec3 &p_q0, const glm::vec3 &p_q1, glm::vec3 &r_ps, glm::vec3 &r_qt);
|
void get_closest_points_between_segments(const glm::vec3 &p_p0, const glm::vec3 &p_p1, const glm::vec3 &p_q0, const glm::vec3 &p_q1, glm::vec3 &r_ps, glm::vec3 &r_qt);
|
||||||
|
|
||||||
/*
|
void expandAABB(glm::vec3& min, glm::vec3& max, glm::vec3 point);
|
||||||
Fast Ray-Box Intersection
|
void computeAABBFromPoints(glm::vec3& min, glm::vec3& max, glm::vec3* points, int count);
|
||||||
by Andrew Woo
|
void getAABBCoords(glm::vec3& pos, glm::vec3& size, glm::vec3 min, glm::vec3 max);
|
||||||
from "Graphics Gems", Academic Press, 1990
|
|
||||||
*/
|
|
||||||
bool HitBoundingBox(
|
|
||||||
glm::vec3 minB, glm::vec3 maxB, /*box */
|
|
||||||
glm::vec3 origin, glm::vec3 dir, /*ray */
|
|
||||||
glm::vec3 &coord /* hit point */
|
|
||||||
);
|
|
|
@ -44,16 +44,21 @@ Instance::Instance(const InstanceType* type) {
|
||||||
Instance::~Instance () {
|
Instance::~Instance () {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
std::weak_ptr<T> optional_to_weak(std::optional<std::shared_ptr<T>> a) {
|
||||||
|
return a ? a.value() : std::weak_ptr<T>();
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Test this
|
// TODO: Test this
|
||||||
bool Instance::ancestryContinuityCheck(nullable std::shared_ptr<Instance> newParent) {
|
bool Instance::ancestryContinuityCheck(std::optional<std::shared_ptr<Instance>> newParent) {
|
||||||
for (std::shared_ptr<Instance> currentParent = newParent; currentParent != nullptr; currentParent = currentParent->GetParent()) {
|
for (std::optional<std::shared_ptr<Instance>> currentParent = newParent; currentParent.has_value(); currentParent = currentParent.value()->GetParent()) {
|
||||||
if (currentParent == this->shared_from_this())
|
if (currentParent.value() == this->shared_from_this())
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Instance::SetParent(nullable std::shared_ptr<Instance> newParent) {
|
bool Instance::SetParent(std::optional<std::shared_ptr<Instance>> newParent) {
|
||||||
if (this->parentLocked || !ancestryContinuityCheck(newParent))
|
if (this->parentLocked || !ancestryContinuityCheck(newParent))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -65,10 +70,10 @@ bool Instance::SetParent(nullable std::shared_ptr<Instance> newParent) {
|
||||||
oldParent->children.erase(std::find(oldParent->children.begin(), oldParent->children.end(), this->shared_from_this()));
|
oldParent->children.erase(std::find(oldParent->children.begin(), oldParent->children.end(), this->shared_from_this()));
|
||||||
}
|
}
|
||||||
// Add ourselves to the new parent
|
// Add ourselves to the new parent
|
||||||
if (newParent != nullptr) {
|
if (newParent.has_value()) {
|
||||||
newParent->children.push_back(this->shared_from_this());
|
newParent.value()->children.push_back(this->shared_from_this());
|
||||||
}
|
}
|
||||||
this->parent = newParent;
|
this->parent = optional_to_weak(newParent);
|
||||||
// TODO: Add code for sending signals for parent updates
|
// TODO: Add code for sending signals for parent updates
|
||||||
// TODO: Yeahhh maybe this isn't the best way of doing this?
|
// TODO: Yeahhh maybe this isn't the best way of doing this?
|
||||||
if (hierarchyPostUpdateHandler.has_value()) hierarchyPostUpdateHandler.value()(this->shared_from_this(), lastParent, newParent);
|
if (hierarchyPostUpdateHandler.has_value()) hierarchyPostUpdateHandler.value()(this->shared_from_this(), lastParent, newParent);
|
||||||
|
@ -80,21 +85,21 @@ bool Instance::SetParent(nullable std::shared_ptr<Instance> newParent) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Instance::updateAncestry(nullable std::shared_ptr<Instance> updatedChild, nullable std::shared_ptr<Instance> newParent) {
|
void Instance::updateAncestry(std::optional<std::shared_ptr<Instance>> updatedChild, std::optional<std::shared_ptr<Instance>> newParent) {
|
||||||
auto oldDataModel = _dataModel;
|
auto oldDataModel = _dataModel;
|
||||||
auto oldWorkspace = _workspace;
|
auto oldWorkspace = _workspace;
|
||||||
|
|
||||||
// Update parent data model and workspace, if applicable
|
// Update parent data model and workspace, if applicable
|
||||||
if (GetParent() != nullptr) {
|
if (GetParent()) {
|
||||||
this->_dataModel = GetParent()->GetClass() == &DataModel::TYPE ? std::dynamic_pointer_cast<DataModel>(GetParent()) : GetParent()->_dataModel;
|
this->_dataModel = GetParent().value()->GetClass() == &DataModel::TYPE ? std::dynamic_pointer_cast<DataModel>(GetParent().value()) : GetParent().value()->_dataModel;
|
||||||
this->_workspace = GetParent()->GetClass() == &Workspace::TYPE ? std::dynamic_pointer_cast<Workspace>(GetParent()) : GetParent()->_workspace;
|
this->_workspace = GetParent().value()->GetClass() == &Workspace::TYPE ? std::dynamic_pointer_cast<Workspace>(GetParent().value()) : GetParent().value()->_workspace;
|
||||||
} else {
|
} else {
|
||||||
this->_dataModel = {};
|
this->_dataModel = {};
|
||||||
this->_workspace = {};
|
this->_workspace = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
OnAncestryChanged(updatedChild, newParent);
|
OnAncestryChanged(updatedChild, newParent);
|
||||||
AncestryChanged->Fire({updatedChild != nullptr ? InstanceRef(updatedChild) : InstanceRef(), newParent != nullptr ? InstanceRef(newParent) : InstanceRef()});
|
AncestryChanged->Fire({updatedChild.has_value() ? InstanceRef(updatedChild.value()) : InstanceRef(), newParent.has_value() ? InstanceRef(newParent.value()) : InstanceRef()});
|
||||||
|
|
||||||
// Old workspace used to exist, and workspaces differ
|
// Old workspace used to exist, and workspaces differ
|
||||||
if (!oldWorkspace.expired() && oldWorkspace != _workspace) {
|
if (!oldWorkspace.expired() && oldWorkspace != _workspace) {
|
||||||
|
@ -103,7 +108,7 @@ void Instance::updateAncestry(nullable std::shared_ptr<Instance> updatedChild, n
|
||||||
|
|
||||||
// New workspace exists, and workspaces differ
|
// New workspace exists, and workspaces differ
|
||||||
if (!_workspace.expired() && (_workspace != oldWorkspace)) {
|
if (!_workspace.expired() && (_workspace != oldWorkspace)) {
|
||||||
OnWorkspaceAdded(oldWorkspace.expired() ? nullptr : oldWorkspace.lock(), _workspace.lock());
|
OnWorkspaceAdded(!oldWorkspace.expired() ? std::make_optional(oldWorkspace.lock()) : std::nullopt, _workspace.lock());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update ancestry in descendants
|
// Update ancestry in descendants
|
||||||
|
@ -112,22 +117,23 @@ void Instance::updateAncestry(nullable std::shared_ptr<Instance> updatedChild, n
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nullable std::shared_ptr<DataModel> Instance::dataModel() {
|
std::optional<std::shared_ptr<DataModel>> Instance::dataModel() {
|
||||||
return _dataModel.expired() ? nullptr : _dataModel.lock();
|
return (_dataModel.expired()) ? std::nullopt : std::make_optional(_dataModel.lock());
|
||||||
}
|
}
|
||||||
|
|
||||||
nullable std::shared_ptr<Workspace> Instance::workspace() {
|
std::optional<std::shared_ptr<Workspace>> Instance::workspace() {
|
||||||
return _workspace.expired() ? nullptr : _workspace.lock();
|
return (_workspace.expired()) ? std::nullopt : std::make_optional(_workspace.lock());
|
||||||
}
|
}
|
||||||
|
|
||||||
nullable std::shared_ptr<Instance> Instance::GetParent() {
|
std::optional<std::shared_ptr<Instance>> Instance::GetParent() {
|
||||||
return parent.expired() ? nullptr : parent.lock();
|
if (parent.expired()) return std::nullopt;
|
||||||
|
return parent.lock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Instance::Destroy() {
|
void Instance::Destroy() {
|
||||||
if (parentLocked) return;
|
if (parentLocked) return;
|
||||||
// TODO: Implement proper distruction stuff
|
// TODO: Implement proper distruction stuff
|
||||||
SetParent(nullptr);
|
SetParent(std::nullopt);
|
||||||
parentLocked = true;
|
parentLocked = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,12 +143,12 @@ bool Instance::IsA(std::string className) {
|
||||||
return cur != nullptr;
|
return cur != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
nullable std::shared_ptr<Instance> Instance::FindFirstChild(std::string name) {
|
std::optional<std::shared_ptr<Instance>> Instance::FindFirstChild(std::string name) {
|
||||||
for (auto child : children) {
|
for (auto child : children) {
|
||||||
if (child->name == name)
|
if (child->name == name)
|
||||||
return child;
|
return child;
|
||||||
}
|
}
|
||||||
return nullptr;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::shared_ptr<Instance> DUMMY_INSTANCE;
|
static std::shared_ptr<Instance> DUMMY_INSTANCE;
|
||||||
|
@ -158,15 +164,15 @@ bool Instance::IsParentLocked() {
|
||||||
return this->parentLocked;
|
return this->parentLocked;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Instance::OnParentUpdated(nullable std::shared_ptr<Instance> oldParent, nullable std::shared_ptr<Instance> newParent) {
|
void Instance::OnParentUpdated(std::optional<std::shared_ptr<Instance>> oldParent, std::optional<std::shared_ptr<Instance>> newParent) {
|
||||||
// Empty stub
|
// Empty stub
|
||||||
}
|
}
|
||||||
|
|
||||||
void Instance::OnAncestryChanged(nullable std::shared_ptr<Instance> child, nullable std::shared_ptr<Instance> newParent) {
|
void Instance::OnAncestryChanged(std::optional<std::shared_ptr<Instance>> child, std::optional<std::shared_ptr<Instance>> newParent) {
|
||||||
// Empty stub
|
// Empty stub
|
||||||
}
|
}
|
||||||
|
|
||||||
void Instance::OnWorkspaceAdded(nullable std::shared_ptr<Workspace> oldWorkspace, std::shared_ptr<Workspace> newWorkspace) {
|
void Instance::OnWorkspaceAdded(std::optional<std::shared_ptr<Workspace>> oldWorkspace, std::shared_ptr<Workspace> newWorkspace) {
|
||||||
// Empty stub
|
// Empty stub
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -176,12 +182,12 @@ void Instance::OnWorkspaceRemoved(std::shared_ptr<Workspace> oldWorkspace) {
|
||||||
|
|
||||||
// Properties
|
// Properties
|
||||||
|
|
||||||
result<Variant, MemberNotFound> Instance::GetProperty(std::string name) {
|
result<Variant, MemberNotFound> Instance::GetPropertyValue(std::string name) {
|
||||||
name[0] = toupper(name[0]); // Ignore case of first character
|
name[0] = toupper(name[0]); // Ignore case of first character
|
||||||
return InternalGetPropertyValue(name);
|
return InternalGetPropertyValue(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
fallible<MemberNotFound, AssignToReadOnlyMember> Instance::SetProperty(std::string name, Variant value, bool sendUpdateEvent) {
|
fallible<MemberNotFound, AssignToReadOnlyMember> Instance::SetPropertyValue(std::string name, Variant value, bool sendUpdateEvent) {
|
||||||
name[0] = toupper(name[0]); // Ignore case of first character
|
name[0] = toupper(name[0]); // Ignore case of first character
|
||||||
auto result = InternalSetPropertyValue(name, value);
|
auto result = InternalSetPropertyValue(name, value);
|
||||||
if (result.isSuccess() && sendUpdateEvent) {
|
if (result.isSuccess() && sendUpdateEvent) {
|
||||||
|
@ -224,7 +230,7 @@ fallible<MemberNotFound, AssignToReadOnlyMember> Instance::InternalSetPropertyVa
|
||||||
this->name = (std::string)value.get<std::string>();
|
this->name = (std::string)value.get<std::string>();
|
||||||
} else if (name == "Parent") {
|
} else if (name == "Parent") {
|
||||||
std::weak_ptr<Instance> ref = value.get<InstanceRef>();
|
std::weak_ptr<Instance> ref = value.get<InstanceRef>();
|
||||||
SetParent(ref.expired() ? nullptr : ref.lock());
|
SetParent(ref.expired() ? std::nullopt : std::make_optional(ref.lock()));
|
||||||
} else if (name == "ClassName") {
|
} else if (name == "ClassName") {
|
||||||
return AssignToReadOnlyMember(GetClass()->className, name);
|
return AssignToReadOnlyMember(GetClass()->className, name);
|
||||||
} else {
|
} else {
|
||||||
|
@ -284,7 +290,7 @@ void Instance::Serialize(pugi::xml_node parent, RefStateSerialize state) {
|
||||||
|
|
||||||
// Update std::shared_ptr<Instance> properties using map above
|
// Update std::shared_ptr<Instance> properties using map above
|
||||||
if (meta.type.descriptor == &InstanceRef::TYPE) {
|
if (meta.type.descriptor == &InstanceRef::TYPE) {
|
||||||
std::weak_ptr<Instance> refWeak = GetProperty(name).expect("Declared property is missing").get<InstanceRef>();
|
std::weak_ptr<Instance> refWeak = GetPropertyValue(name).expect("Declared property is missing").get<InstanceRef>();
|
||||||
if (refWeak.expired()) continue;
|
if (refWeak.expired()) continue;
|
||||||
|
|
||||||
auto ref = refWeak.lock();
|
auto ref = refWeak.lock();
|
||||||
|
@ -300,7 +306,7 @@ void Instance::Serialize(pugi::xml_node parent, RefStateSerialize state) {
|
||||||
state->refsAwaitingRemap[ref] = refs;
|
state->refsAwaitingRemap[ref] = refs;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
GetProperty(name).expect("Declared property is missing").Serialize(propertyNode);
|
GetPropertyValue(name).expect("Declared property is missing").Serialize(propertyNode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -354,14 +360,14 @@ result<std::shared_ptr<Instance>, NoSuchInstance> Instance::Deserialize(pugi::xm
|
||||||
|
|
||||||
if (remappedRef) {
|
if (remappedRef) {
|
||||||
// If the instance has already been remapped, set the new value
|
// If the instance has already been remapped, set the new value
|
||||||
object->SetProperty(propertyName, InstanceRef(remappedRef)).expect();
|
object->SetPropertyValue(propertyName, InstanceRef(remappedRef)).expect();
|
||||||
} else {
|
} else {
|
||||||
// Otheriise, queue this property to be updated later, and keep its current value
|
// Otheriise, queue this property to be updated later, and keep its current value
|
||||||
auto& refs = state->refsAwaitingRemap[refId];
|
auto& refs = state->refsAwaitingRemap[refId];
|
||||||
refs.push_back(std::make_pair(object, propertyName));
|
refs.push_back(std::make_pair(object, propertyName));
|
||||||
state->refsAwaitingRemap[refId] = refs;
|
state->refsAwaitingRemap[refId] = refs;
|
||||||
|
|
||||||
object->SetProperty(propertyName, InstanceRef()).expect();
|
object->SetPropertyValue(propertyName, InstanceRef()).expect();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
auto valueResult = Variant::Deserialize(propertyNode, meta.type);
|
auto valueResult = Variant::Deserialize(propertyNode, meta.type);
|
||||||
|
@ -370,7 +376,7 @@ result<std::shared_ptr<Instance>, NoSuchInstance> Instance::Deserialize(pugi::xm
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
auto value = valueResult.expect();
|
auto value = valueResult.expect();
|
||||||
object->SetProperty(propertyName, value).expect("Declared property was missing");
|
object->SetPropertyValue(propertyName, value).expect("Declared property was missing");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -380,7 +386,7 @@ result<std::shared_ptr<Instance>, NoSuchInstance> Instance::Deserialize(pugi::xm
|
||||||
|
|
||||||
// Remap queued properties
|
// Remap queued properties
|
||||||
for (std::pair<std::shared_ptr<Instance>, std::string> ref : state->refsAwaitingRemap[remappedId]) {
|
for (std::pair<std::shared_ptr<Instance>, std::string> ref : state->refsAwaitingRemap[remappedId]) {
|
||||||
ref.first->SetProperty(ref.second, InstanceRef(object)).expect();
|
ref.first->SetPropertyValue(ref.second, InstanceRef(object)).expect();
|
||||||
}
|
}
|
||||||
state->refsAwaitingRemap[remappedId].clear();
|
state->refsAwaitingRemap[remappedId].clear();
|
||||||
|
|
||||||
|
@ -424,9 +430,9 @@ DescendantsIterator::self_type DescendantsIterator::operator++(int _) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we've hit the end of this item's children, move one up
|
// If we've hit the end of this item's children, move one up
|
||||||
while (current->GetParent() != nullptr && current->GetParent()->GetChildren().size() <= size_t(siblingIndex.back() + 1)) {
|
while (current->GetParent() && current->GetParent().value()->GetChildren().size() <= size_t(siblingIndex.back() + 1)) {
|
||||||
siblingIndex.pop_back();
|
siblingIndex.pop_back();
|
||||||
current = current->GetParent();
|
current = current->GetParent().value();
|
||||||
|
|
||||||
// But not if one up is null or the root element
|
// But not if one up is null or the root element
|
||||||
if (!current->GetParent() || current == root) {
|
if (!current->GetParent() || current == root) {
|
||||||
|
@ -437,12 +443,12 @@ DescendantsIterator::self_type DescendantsIterator::operator++(int _) {
|
||||||
|
|
||||||
// Now move to the next sibling
|
// Now move to the next sibling
|
||||||
siblingIndex.back()++;
|
siblingIndex.back()++;
|
||||||
current = current->GetParent()->GetChildren()[siblingIndex.back()];
|
current = current->GetParent().value()->GetChildren()[siblingIndex.back()];
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
nullable std::shared_ptr<Instance> Instance::Clone(RefStateClone state) {
|
std::optional<std::shared_ptr<Instance>> Instance::Clone(RefStateClone state) {
|
||||||
if (state == nullptr) state = std::make_shared<__RefStateClone>();
|
if (state == nullptr) state = std::make_shared<__RefStateClone>();
|
||||||
std::shared_ptr<Instance> newInstance = GetClass()->constructor();
|
std::shared_ptr<Instance> newInstance = GetClass()->constructor();
|
||||||
|
|
||||||
|
@ -454,7 +460,7 @@ nullable std::shared_ptr<Instance> Instance::Clone(RefStateClone state) {
|
||||||
|
|
||||||
// Update std::shared_ptr<Instance> properties using map above
|
// Update std::shared_ptr<Instance> properties using map above
|
||||||
if (meta.type.descriptor == &InstanceRef::TYPE) {
|
if (meta.type.descriptor == &InstanceRef::TYPE) {
|
||||||
std::weak_ptr<Instance> refWeak = GetProperty(property).expect().get<InstanceRef>();
|
std::weak_ptr<Instance> refWeak = GetPropertyValue(property).expect().get<InstanceRef>();
|
||||||
if (refWeak.expired()) continue;
|
if (refWeak.expired()) continue;
|
||||||
|
|
||||||
auto ref = refWeak.lock();
|
auto ref = refWeak.lock();
|
||||||
|
@ -462,18 +468,18 @@ nullable std::shared_ptr<Instance> Instance::Clone(RefStateClone state) {
|
||||||
|
|
||||||
if (remappedRef) {
|
if (remappedRef) {
|
||||||
// If the instance has already been remapped, set the new value
|
// If the instance has already been remapped, set the new value
|
||||||
newInstance->SetProperty(property, InstanceRef(remappedRef)).expect();
|
newInstance->SetPropertyValue(property, InstanceRef(remappedRef)).expect();
|
||||||
} else {
|
} else {
|
||||||
// Otheriise, queue this property to be updated later, and keep its current value
|
// Otheriise, queue this property to be updated later, and keep its current value
|
||||||
auto& refs = state->refsAwaitingRemap[ref];
|
auto& refs = state->refsAwaitingRemap[ref];
|
||||||
refs.push_back(std::make_pair(newInstance, property));
|
refs.push_back(std::make_pair(newInstance, property));
|
||||||
state->refsAwaitingRemap[ref] = refs;
|
state->refsAwaitingRemap[ref] = refs;
|
||||||
|
|
||||||
newInstance->SetProperty(property, InstanceRef(ref)).expect();
|
newInstance->SetPropertyValue(property, InstanceRef(ref)).expect();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Variant value = GetProperty(property).expect();
|
Variant value = GetPropertyValue(property).expect();
|
||||||
newInstance->SetProperty(property, value).expect();
|
newInstance->SetPropertyValue(property, value).expect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -482,15 +488,15 @@ nullable std::shared_ptr<Instance> Instance::Clone(RefStateClone state) {
|
||||||
|
|
||||||
// Remap queued properties
|
// Remap queued properties
|
||||||
for (std::pair<std::shared_ptr<Instance>, std::string> ref : state->refsAwaitingRemap[shared_from_this()]) {
|
for (std::pair<std::shared_ptr<Instance>, std::string> ref : state->refsAwaitingRemap[shared_from_this()]) {
|
||||||
ref.first->SetProperty(ref.second, InstanceRef(newInstance)).expect();
|
ref.first->SetPropertyValue(ref.second, InstanceRef(newInstance)).expect();
|
||||||
}
|
}
|
||||||
state->refsAwaitingRemap[shared_from_this()].clear();
|
state->refsAwaitingRemap[shared_from_this()].clear();
|
||||||
|
|
||||||
// Clone children
|
// Clone children
|
||||||
for (std::shared_ptr<Instance> child : GetChildren()) {
|
for (std::shared_ptr<Instance> child : GetChildren()) {
|
||||||
nullable std::shared_ptr<Instance> clonedChild = child->Clone(state);
|
std::optional<std::shared_ptr<Instance>> clonedChild = child->Clone(state);
|
||||||
if (clonedChild)
|
if (clonedChild)
|
||||||
newInstance->AddChild(clonedChild);
|
newInstance->AddChild(clonedChild.value());
|
||||||
}
|
}
|
||||||
|
|
||||||
return newInstance;
|
return newInstance;
|
||||||
|
@ -505,7 +511,7 @@ std::vector<std::pair<std::string, std::shared_ptr<Instance>>> Instance::GetRefe
|
||||||
PropertyMeta meta = GetPropertyMeta(property).expect();
|
PropertyMeta meta = GetPropertyMeta(property).expect();
|
||||||
if (meta.type.descriptor != &InstanceRef::TYPE) continue;
|
if (meta.type.descriptor != &InstanceRef::TYPE) continue;
|
||||||
|
|
||||||
std::weak_ptr<Instance> ref = GetProperty(property).expect().get<InstanceRef>();
|
std::weak_ptr<Instance> ref = GetPropertyValue(property).expect().get<InstanceRef>();
|
||||||
if (ref.expired()) continue;
|
if (ref.expired()) continue;
|
||||||
referenceProperties.push_back(std::make_pair(property, ref.lock()));
|
referenceProperties.push_back(std::make_pair(property, ref.lock()));
|
||||||
}
|
}
|
||||||
|
@ -515,12 +521,12 @@ std::vector<std::pair<std::string, std::shared_ptr<Instance>>> Instance::GetRefe
|
||||||
|
|
||||||
std::string Instance::GetFullName() {
|
std::string Instance::GetFullName() {
|
||||||
std::string currentName = name;
|
std::string currentName = name;
|
||||||
nullable std::shared_ptr<Instance> currentParent = GetParent();
|
std::optional<std::shared_ptr<Instance>> currentParent = GetParent();
|
||||||
|
|
||||||
while (currentParent && !currentParent->IsA("DataModel")) {
|
while (currentParent.has_value() && !currentParent.value()->IsA("DataModel")) {
|
||||||
currentName = currentParent->name + "." + currentName;
|
currentName = currentParent.value()->name + "." + currentName;
|
||||||
|
|
||||||
currentParent = currentParent->GetParent();
|
currentParent = currentParent.value()->GetParent();
|
||||||
}
|
}
|
||||||
|
|
||||||
return currentName;
|
return currentName;
|
||||||
|
|