mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-17 19:35:00 -04:00
collision with ground
This commit is contained in:
parent
6ec0b76d33
commit
ace545ddae
394
pom.xml
394
pom.xml
@ -1,22 +1,23 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!--
|
|
||||||
~ Codename Minosoft
|
|
||||||
~ Copyright (C) 2020 Moritz Zwerger
|
|
||||||
~
|
|
||||||
~ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
|
||||||
~
|
|
||||||
~ This program 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 General Public License for more details.
|
|
||||||
~
|
|
||||||
~ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
~
|
|
||||||
~ This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<!--~ Codename Minosoft~ Copyright (C) 2020 Lukas Eisenhauer~~
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
This program is free software: you can redistribute it and/or
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
modify it under the terms of the GNU General Public License as
|
||||||
|
published by the Free Software Foundation, either version 3 of
|
||||||
|
the License, or (at your option) any later version.~~ This
|
||||||
|
program 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 General Public License for more details.~~ You should have
|
||||||
|
received a copy of the GNU General Public License along with
|
||||||
|
this program. If not, see <https://www.gnu.org/licenses/>.~~
|
||||||
|
This software is not affiliated with Mojang AB, the original
|
||||||
|
developer of Minecraft. -->
|
||||||
|
|
||||||
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
|
||||||
|
xmlns="http://maven.apache.org/POM/4.0.0">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<groupId>de.bixilon</groupId>
|
<groupId>de.bixilon</groupId>
|
||||||
<artifactId>Minosoft</artifactId>
|
<artifactId>Minosoft</artifactId>
|
||||||
<version>0.1</version>
|
<version>0.1</version>
|
||||||
@ -30,42 +31,18 @@
|
|||||||
<target>11</target>
|
<target>11</target>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
|
||||||
<groupId>org.openjfx</groupId>
|
|
||||||
<artifactId>javafx-maven-plugin</artifactId>
|
|
||||||
<version>0.0.4</version>
|
|
||||||
<configuration>
|
|
||||||
<mainClass>HelloFX</mainClass>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<maven.compiler.source>14</maven.compiler.source>
|
<maven.compiler.source>14</maven.compiler.source>
|
||||||
<maven.compiler.target>14</maven.compiler.target>
|
<maven.compiler.target>14</maven.compiler.target>
|
||||||
<lwjgl.version>3.2.3</lwjgl.version>
|
<lwjgl.version>3.2.3</lwjgl.version>
|
||||||
<lwjgl.natives>natives-windows</lwjgl.natives>
|
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencyManagement>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-bom</artifactId>
|
|
||||||
<version>${lwjgl.version}</version>
|
|
||||||
<scope>import</scope>
|
|
||||||
<type>pom</type>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</dependencyManagement>
|
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.googlecode.json-simple</groupId>
|
<groupId>org.openjfx</groupId>
|
||||||
<artifactId>json-simple</artifactId>
|
<artifactId>javafx-controls</artifactId>
|
||||||
<version>1.1</version>
|
<version>14</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.joda</groupId>
|
<groupId>org.joda</groupId>
|
||||||
@ -77,16 +54,6 @@
|
|||||||
<artifactId>commons-primitives</artifactId>
|
<artifactId>commons-primitives</artifactId>
|
||||||
<version>1.0</version>
|
<version>1.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.l33tlabs.twl</groupId>
|
|
||||||
<artifactId>pngdecoder</artifactId>
|
|
||||||
<version>1.0</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.openjfx</groupId>
|
|
||||||
<artifactId>javafx-controls</artifactId>
|
|
||||||
<version>14</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.json</groupId>
|
<groupId>org.json</groupId>
|
||||||
<artifactId>json</artifactId>
|
<artifactId>json</artifactId>
|
||||||
@ -98,327 +65,60 @@
|
|||||||
<version>1.25</version>
|
<version>1.25</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.openjfx</groupId>
|
<groupId>org.lwjgl</groupId>
|
||||||
<artifactId>javafx-fxml</artifactId>
|
<artifactId>lwjgl</artifactId>
|
||||||
<version>14</version>
|
<classifier>natives-windows</classifier>
|
||||||
|
<version>${lwjgl.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.lwjgl</groupId>
|
<groupId>org.lwjgl</groupId>
|
||||||
<artifactId>lwjgl</artifactId>
|
<artifactId>lwjgl</artifactId>
|
||||||
</dependency>
|
<classifier>natives-linux</classifier>
|
||||||
<dependency>
|
<version>${lwjgl.version}</version>
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-assimp</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-bgfx</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-cuda</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-egl</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-glfw</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-jawt</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-jemalloc</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-libdivide</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-llvm</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-lmdb</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-lz4</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-meow</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-nanovg</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-nfd</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-nuklear</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-odbc</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-openal</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-opencl</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-opengl</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-opengles</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-openvr</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-opus</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-ovr</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-par</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-remotery</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-rpmalloc</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-shaderc</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-sse</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-stb</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-tinyexr</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-tinyfd</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-tootle</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-vma</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-vulkan</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-xxhash</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-yoga</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-zstd</artifactId>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.lwjgl</groupId>
|
<groupId>org.lwjgl</groupId>
|
||||||
<artifactId>lwjgl</artifactId>
|
<artifactId>lwjgl</artifactId>
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
<version>${lwjgl.version}</version>
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-assimp</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-bgfx</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-glfw</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-jemalloc</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-libdivide</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-llvm</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-lmdb</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-lz4</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-meow</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-nanovg</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-nfd</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-nuklear</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-openal</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.lwjgl</groupId>
|
<groupId>org.lwjgl</groupId>
|
||||||
<artifactId>lwjgl-opengl</artifactId>
|
<artifactId>lwjgl-opengl</artifactId>
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
<version>${lwjgl.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.lwjgl</groupId>
|
<groupId>org.lwjgl</groupId>
|
||||||
<artifactId>lwjgl-opengles</artifactId>
|
<artifactId>lwjgl-opengl</artifactId>
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
<classifier>natives-linux</classifier>
|
||||||
|
<version>${lwjgl.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.lwjgl</groupId>
|
<groupId>org.lwjgl</groupId>
|
||||||
<artifactId>lwjgl-openvr</artifactId>
|
<artifactId>lwjgl-opengl</artifactId>
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
<classifier>natives-windows</classifier>
|
||||||
|
<version>${lwjgl.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.l33tlabs.twl</groupId>
|
||||||
|
<artifactId>pngdecoder</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.lwjgl</groupId>
|
<groupId>org.lwjgl</groupId>
|
||||||
<artifactId>lwjgl-opus</artifactId>
|
<artifactId>lwjgl-glfw</artifactId>
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
<version>${lwjgl.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.lwjgl</groupId>
|
<groupId>org.lwjgl</groupId>
|
||||||
<artifactId>lwjgl-ovr</artifactId>
|
<artifactId>lwjgl-glfw</artifactId>
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
<classifier>natives-windows</classifier>
|
||||||
|
<version>${lwjgl.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.lwjgl</groupId>
|
<groupId>org.lwjgl</groupId>
|
||||||
<artifactId>lwjgl-par</artifactId>
|
<artifactId>lwjgl-glfw</artifactId>
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
<classifier>natives-linux</classifier>
|
||||||
</dependency>
|
<version>${lwjgl.version}</version>
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-remotery</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-rpmalloc</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-shaderc</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-sse</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-stb</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-tinyexr</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-tinyfd</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-tootle</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-vma</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-xxhash</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-yoga</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.lwjgl</groupId>
|
|
||||||
<artifactId>lwjgl-zstd</artifactId>
|
|
||||||
<classifier>${lwjgl.natives}</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.jetbrains</groupId>
|
|
||||||
<artifactId>annotations</artifactId>
|
|
||||||
<version>18.0.0</version>
|
|
||||||
<scope>compile</scope>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
@ -13,6 +13,8 @@
|
|||||||
|
|
||||||
package de.bixilon.minosoft.game.datatypes.world;
|
package de.bixilon.minosoft.game.datatypes.world;
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.render.utility.Vec3;
|
||||||
|
|
||||||
public class BlockPosition {
|
public class BlockPosition {
|
||||||
final int x;
|
final int x;
|
||||||
final int y;
|
final int y;
|
||||||
@ -25,6 +27,12 @@ public class BlockPosition {
|
|||||||
this.z = z;
|
this.z = z;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BlockPosition(Vec3 testPosition) {
|
||||||
|
x = (int) testPosition.x;
|
||||||
|
y = (short) testPosition.y;
|
||||||
|
z = (int) testPosition.z;
|
||||||
|
}
|
||||||
|
|
||||||
public int getX() {
|
public int getX() {
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,9 @@ public class Chunk {
|
|||||||
throw new IllegalArgumentException(String.format("Invalid chunk location %s %s %s", x, y, z));
|
throw new IllegalArgumentException(String.format("Invalid chunk location %s %s %s", x, y, z));
|
||||||
}
|
}
|
||||||
byte section = (byte) (y / 16);
|
byte section = (byte) (y / 16);
|
||||||
|
if (nibbles.get(section) == null) {
|
||||||
|
return Blocks.AIR;
|
||||||
|
}
|
||||||
return nibbles.get(section).getBlock(x, y % 16, z);
|
return nibbles.get(section).getBlock(x, y % 16, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,6 +57,9 @@ public class World {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Blocks getBlock(BlockPosition pos) {
|
public Blocks getBlock(BlockPosition pos) {
|
||||||
|
if (pos.y < 1) {
|
||||||
|
return Blocks.AIR;
|
||||||
|
}
|
||||||
ChunkLocation loc = pos.getChunkLocation();
|
ChunkLocation loc = pos.getChunkLocation();
|
||||||
if (getChunk(loc) != null) {
|
if (getChunk(loc) != null) {
|
||||||
return getChunk(loc).getBlock(pos.getInChunkLocation());
|
return getChunk(loc).getBlock(pos.getInChunkLocation());
|
||||||
|
@ -0,0 +1,77 @@
|
|||||||
|
/*
|
||||||
|
* Codename Minosoft
|
||||||
|
* Copyright (C) 2020 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.movement;
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.render.utility.Vec3;
|
||||||
|
|
||||||
|
import static de.bixilon.minosoft.render.utility.Vec3.normalize;
|
||||||
|
import static java.lang.StrictMath.*;
|
||||||
|
import static org.lwjgl.opengl.GL11.glRotatef;
|
||||||
|
|
||||||
|
public class CameraMovement {
|
||||||
|
Vec3 cameraFront = new Vec3(0.0f, 0.0f, -1.0f);
|
||||||
|
|
||||||
|
private boolean firstMouse = false;
|
||||||
|
private float lastX;
|
||||||
|
private float lastY;
|
||||||
|
private float yaw;
|
||||||
|
private float pitch;
|
||||||
|
|
||||||
|
public void mouseCallback(long l, double xPos, double yPos) {
|
||||||
|
// variable l is unused but always given by openGL so we need it in the method signature
|
||||||
|
if (firstMouse) {
|
||||||
|
lastX = (float) xPos;
|
||||||
|
lastY = (float) yPos;
|
||||||
|
firstMouse = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
float xoffset = (float) (xPos - lastX);
|
||||||
|
float yoffset = (float) (lastY - yPos); // reversed since y-coordinates go from bottom to top
|
||||||
|
lastX = (float) xPos;
|
||||||
|
lastY = (float) yPos;
|
||||||
|
|
||||||
|
float sensitivity = 0.1f; // change this value to your liking
|
||||||
|
xoffset *= sensitivity;
|
||||||
|
yoffset *= sensitivity;
|
||||||
|
|
||||||
|
yaw += xoffset;
|
||||||
|
pitch += yoffset;
|
||||||
|
|
||||||
|
// make sure that pitch does not get out of bounds
|
||||||
|
if (pitch > 89.0f)
|
||||||
|
pitch = 89.0f;
|
||||||
|
if (pitch < -89.0f)
|
||||||
|
pitch = -89.0f;
|
||||||
|
|
||||||
|
Vec3 front = new Vec3();
|
||||||
|
front.x = (float) -(sin(toRadians(yaw)) * cos(toRadians(pitch)));
|
||||||
|
front.y = 0;
|
||||||
|
front.z = (float) ((cos(toRadians(yaw))) * cos(toRadians(pitch)));
|
||||||
|
cameraFront = normalize(front);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void loop() {
|
||||||
|
glRotatef(pitch, 1, 0, 0);
|
||||||
|
glRotatef(yaw, 0, 1, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRotation(float pitch, float yaw) {
|
||||||
|
this.pitch = pitch;
|
||||||
|
this.yaw = yaw;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vec3 getCameraFront() {
|
||||||
|
return cameraFront;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,133 @@
|
|||||||
|
/*
|
||||||
|
* Codename Minosoft
|
||||||
|
* Copyright (C) 2020 Lukas Eisenhauer
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.movement;
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.game.datatypes.world.BlockPosition;
|
||||||
|
import de.bixilon.minosoft.game.datatypes.world.World;
|
||||||
|
import de.bixilon.minosoft.render.blockModels.BlockModelLoader;
|
||||||
|
import de.bixilon.minosoft.render.utility.Vec3;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static de.bixilon.minosoft.render.utility.AdditionalMath.betterRound;
|
||||||
|
import static de.bixilon.minosoft.render.utility.AdditionalMath.valuesBetween;
|
||||||
|
|
||||||
|
public class CollisionHandling {
|
||||||
|
private static Vec3 lastPosInverted;
|
||||||
|
private static Vec3 posDifference;
|
||||||
|
|
||||||
|
public static void handleCollisions(World world, PlayerController controller, BlockModelLoader modelLoader, Vec3 deltaPos) {
|
||||||
|
|
||||||
|
groundCollision(world, controller, modelLoader, deltaPos);
|
||||||
|
if (!controller.isOnGround()) {
|
||||||
|
// if we are stuck in a block, just stay there, otherwise, we would fall through the world
|
||||||
|
//topCollision(world, controller, modelLoader);
|
||||||
|
}
|
||||||
|
//xAxisCollision(world, controller, modelLoader, deltaPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void xAxisCollision(World world, PlayerController controller, BlockModelLoader modelLoader, Vec3 deltaPos) {
|
||||||
|
Vec3 playerPos = controller.getPlayerPos();
|
||||||
|
int xVelocityDirection = deltaPos.getXNormalized();
|
||||||
|
if (xVelocityDirection == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockPosition[] testPositions = getXAxisTestPositions(controller, playerPos, xVelocityDirection);
|
||||||
|
|
||||||
|
for (BlockPosition position : testPositions) {
|
||||||
|
if (modelLoader.isFull(world.getBlock(position))) {
|
||||||
|
playerPos.x = position.getX() - xVelocityDirection * controller.getPlayerWidth();
|
||||||
|
controller.playerVelocity.x = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void topCollision(World world, PlayerController controller, BlockModelLoader modelLoader) {
|
||||||
|
Vec3 headTop = controller.getPlayerPos().copy();
|
||||||
|
headTop.y += controller.getPlayerHeight();
|
||||||
|
|
||||||
|
BlockPosition[] testPositions = getVerticalTestPositions(controller, headTop);
|
||||||
|
|
||||||
|
for (BlockPosition position : testPositions) {
|
||||||
|
if (modelLoader.isFull(world.getBlock(position))) {
|
||||||
|
controller.playerVelocity.y = 0;
|
||||||
|
controller.playerPos.y = position.getY() - controller.getPlayerHeight();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void groundCollision(World world, PlayerController controller, BlockModelLoader modelLoader, Vec3 deltaPos) {
|
||||||
|
Vec3 playerPos = controller.playerPos.copy();
|
||||||
|
playerPos.y++;
|
||||||
|
BlockPosition[] testPositions = getVerticalTestPositions(controller, playerPos);
|
||||||
|
|
||||||
|
for (BlockPosition position : testPositions) {
|
||||||
|
if (modelLoader.isFull(world.getBlock(position))) {
|
||||||
|
controller.playerVelocity.y = 0;
|
||||||
|
controller.playerPos.y = position.getY();
|
||||||
|
controller.onGround = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static BlockPosition[] getVerticalTestPositions(PlayerController controller, Vec3 testPos) {
|
||||||
|
List<BlockPosition> result = new ArrayList<>();
|
||||||
|
float width = controller.getPlayerWidth();
|
||||||
|
|
||||||
|
List<Integer> xPositions = new ArrayList<>();
|
||||||
|
for (int xCoordinate : valuesBetween(betterRound(testPos.x + 0.5 * width), betterRound(testPos.x - 0.5 * width))) {
|
||||||
|
xPositions.add(xCoordinate);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Integer> zPositions = new ArrayList<>();
|
||||||
|
for (int xCoordinate : valuesBetween(betterRound(testPos.z + 0.5 * width), betterRound(testPos.z - 0.5 * width))) {
|
||||||
|
zPositions.add(xCoordinate);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int xPos : xPositions) {
|
||||||
|
for (int zPos : zPositions) {
|
||||||
|
result.add(new BlockPosition(xPos, (short) testPos.y, zPos));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.toArray(new BlockPosition[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static BlockPosition[] getXAxisTestPositions(PlayerController controller, Vec3 testPos, int xVelocityDirection) {
|
||||||
|
List<BlockPosition> result = new ArrayList<>();
|
||||||
|
float width = controller.getPlayerWidth();
|
||||||
|
|
||||||
|
List<Integer> yPositions = new ArrayList<>();
|
||||||
|
|
||||||
|
for (int yCoordinate : valuesBetween(betterRound(testPos.y + 1), betterRound(testPos.y + controller.getPlayerHeight()))) {
|
||||||
|
yPositions.add(yCoordinate);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Integer> zPositions = new ArrayList<>();
|
||||||
|
for (int zCoordinate : valuesBetween(betterRound(testPos.z + 0.5 * width), betterRound(testPos.z - 0.5 * width))) {
|
||||||
|
zPositions.add(zCoordinate);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int yPos : yPositions) {
|
||||||
|
for (int zPos : zPositions) {
|
||||||
|
result.add(new BlockPosition(betterRound(testPos.x), (short) yPos, zPos));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.toArray(new BlockPosition[0]);
|
||||||
|
}
|
||||||
|
}
|
110
src/main/java/de/bixilon/minosoft/movement/PlayerController.java
Normal file
110
src/main/java/de/bixilon/minosoft/movement/PlayerController.java
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
/*
|
||||||
|
* Codename Minosoft
|
||||||
|
* Copyright (C) 2020 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.movement;
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.game.datatypes.GameMode;
|
||||||
|
import de.bixilon.minosoft.game.datatypes.world.World;
|
||||||
|
import de.bixilon.minosoft.render.MainWindow;
|
||||||
|
import de.bixilon.minosoft.render.blockModels.BlockModelLoader;
|
||||||
|
import de.bixilon.minosoft.render.utility.Vec3;
|
||||||
|
|
||||||
|
import static org.lwjgl.opengl.GL11.glTranslatef;
|
||||||
|
|
||||||
|
public class PlayerController {
|
||||||
|
private final float playerHeight = 1.8f;
|
||||||
|
private final float playerWidth = 0.5f;
|
||||||
|
CameraMovement cameraMovement;
|
||||||
|
PlayerMovement playerMovement;
|
||||||
|
Vec3 playerPos = new Vec3(0, 1, 0); // the feet position of the player
|
||||||
|
Vec3 playerVelocity = new Vec3();
|
||||||
|
float gravity = 9.81f;
|
||||||
|
boolean onGround;
|
||||||
|
private boolean enableGravity;
|
||||||
|
|
||||||
|
public PlayerController(long window) {
|
||||||
|
cameraMovement = new CameraMovement();
|
||||||
|
playerMovement = new PlayerMovement(window);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void loop(float deltaTime) {
|
||||||
|
GameMode gameMode = MainWindow.getConnection().getPlayer().getGameMode();
|
||||||
|
enableGravity = gameMode == GameMode.CREATIVE || gameMode == GameMode.SPECTATOR;
|
||||||
|
handleGravity(deltaTime);
|
||||||
|
cameraMovement.loop();
|
||||||
|
playerMovement.loop(deltaTime);
|
||||||
|
applyVelocity(deltaTime);
|
||||||
|
|
||||||
|
if (gameMode == GameMode.SPECTATOR) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
handleCollisions(MainWindow.getConnection().getPlayer().getWorld());
|
||||||
|
|
||||||
|
glTranslatef(-playerPos.x, -(playerPos.y + playerHeight - 0.2f), -playerPos.z);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleCollisions(World world) {
|
||||||
|
onGround = false;
|
||||||
|
if (world == null) {
|
||||||
|
playerVelocity.zero();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
BlockModelLoader modelLoader = MainWindow.getRenderer().getModelLoader();
|
||||||
|
CollisionHandling.handleCollisions(world, this, modelLoader, playerMovement.deltaPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isEnableGravity() {
|
||||||
|
return enableGravity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vec3 getPlayerPos() {
|
||||||
|
return playerPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPlayerPos(Vec3 playerPos) {
|
||||||
|
this.playerPos = playerPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void applyVelocity(float deltaTime) {
|
||||||
|
playerPos.add(Vec3.mul(playerVelocity, deltaTime));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleGravity(float deltaTime) {
|
||||||
|
if (!enableGravity) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// a rather accurate model for the real world, but minecraft probably does it differently
|
||||||
|
playerVelocity.y -= gravity * deltaTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CameraMovement getCameraMovement() {
|
||||||
|
return cameraMovement;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isOnGround() {
|
||||||
|
return onGround;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void jump() {
|
||||||
|
playerVelocity.y = 10;
|
||||||
|
onGround = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getPlayerWidth() {
|
||||||
|
return playerWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getPlayerHeight() {
|
||||||
|
return playerHeight;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* Codename Minosoft
|
||||||
|
* Copyright (C) 2020 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A simple camera controller to fly around the scene
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.movement;
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.render.MainWindow;
|
||||||
|
import de.bixilon.minosoft.render.utility.Vec3;
|
||||||
|
|
||||||
|
import static de.bixilon.minosoft.render.utility.Vec3.*;
|
||||||
|
import static org.lwjgl.glfw.GLFW.*;
|
||||||
|
|
||||||
|
public class PlayerMovement {
|
||||||
|
private final long window;
|
||||||
|
Vec3 cameraFront;
|
||||||
|
Vec3 cameraUp = new Vec3(0f, 1f, 0f);
|
||||||
|
|
||||||
|
float flySpeed = 0.1f;
|
||||||
|
|
||||||
|
Vec3 playerPos;
|
||||||
|
Vec3 deltaPos;
|
||||||
|
|
||||||
|
public PlayerMovement(long window) {
|
||||||
|
this.window = window;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processInput(float deltaTime) {
|
||||||
|
Vec3 posBefore = playerPos.copy();
|
||||||
|
float cameraSpeed = flySpeed / deltaTime;
|
||||||
|
|
||||||
|
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
|
||||||
|
MainWindow.pause();
|
||||||
|
}
|
||||||
|
if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) {
|
||||||
|
playerPos.add(mul(cameraFront, -cameraSpeed * deltaTime));
|
||||||
|
}
|
||||||
|
if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) {
|
||||||
|
playerPos.add(mul(cameraFront, cameraSpeed * deltaTime));
|
||||||
|
}
|
||||||
|
if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) {
|
||||||
|
playerPos.add(mul(cross(cameraUp, cameraFront), -cameraSpeed * deltaTime));
|
||||||
|
}
|
||||||
|
if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) {
|
||||||
|
playerPos.add(mul(cross(cameraUp, cameraFront), cameraSpeed * deltaTime));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) {
|
||||||
|
if (!MainWindow.getPlayerMovement().isEnableGravity()) {
|
||||||
|
playerPos.add(0, cameraSpeed * deltaTime, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) {
|
||||||
|
if (!MainWindow.getPlayerMovement().isEnableGravity()) {
|
||||||
|
playerPos.add(0, -cameraSpeed * deltaTime, 0);
|
||||||
|
}
|
||||||
|
if (MainWindow.getPlayerMovement().isOnGround()) {
|
||||||
|
|
||||||
|
MainWindow.getPlayerMovement().jump();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
deltaPos = add(playerPos, mul(posBefore, -1));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void loop(float deltaTime) {
|
||||||
|
cameraFront = MainWindow.getPlayerMovement().getCameraMovement().getCameraFront();
|
||||||
|
playerPos = MainWindow.getPlayerMovement().getPlayerPos();
|
||||||
|
processInput(deltaTime);
|
||||||
|
}
|
||||||
|
}
|
@ -35,6 +35,8 @@ import de.bixilon.minosoft.protocol.packets.serverbound.login.PacketEncryptionRe
|
|||||||
import de.bixilon.minosoft.protocol.packets.serverbound.play.PacketKeepAliveResponse;
|
import de.bixilon.minosoft.protocol.packets.serverbound.play.PacketKeepAliveResponse;
|
||||||
import de.bixilon.minosoft.protocol.packets.serverbound.play.PacketPlayerPositionAndRotationSending;
|
import de.bixilon.minosoft.protocol.packets.serverbound.play.PacketPlayerPositionAndRotationSending;
|
||||||
import de.bixilon.minosoft.protocol.packets.serverbound.play.PacketResourcePackStatus;
|
import de.bixilon.minosoft.protocol.packets.serverbound.play.PacketResourcePackStatus;
|
||||||
|
import de.bixilon.minosoft.render.MainWindow;
|
||||||
|
import de.bixilon.minosoft.render.utility.Vec3;
|
||||||
|
|
||||||
import javax.crypto.SecretKey;
|
import javax.crypto.SecretKey;
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
@ -344,7 +346,10 @@ public class PacketHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void handle(PacketPlayerPositionAndRotation pkg) {
|
public void handle(PacketPlayerPositionAndRotation pkg) {
|
||||||
//ToDo handle with gui
|
MainWindow.getPlayerMovement().getCameraMovement().setRotation(pkg.getPitch(), pkg.getYaw());
|
||||||
|
MainWindow.getPlayerMovement().setPlayerPos(new Vec3(pkg.getLocation()));
|
||||||
|
//TODO: location
|
||||||
|
|
||||||
if (!connection.getPlayer().isSpawnConfirmed()) {
|
if (!connection.getPlayer().isSpawnConfirmed()) {
|
||||||
// oops, not spawned yet, confirming position
|
// oops, not spawned yet, confirming position
|
||||||
//ToDo feet position
|
//ToDo feet position
|
||||||
|
@ -1,115 +0,0 @@
|
|||||||
/*
|
|
||||||
* Codename Minosoft
|
|
||||||
* Copyright (C) 2020 Lukas Eisenhauer
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program 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 General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A simple camera controller to fly around the scene
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.bixilon.minosoft.render;
|
|
||||||
|
|
||||||
import de.bixilon.minosoft.render.utility.Vec3;
|
|
||||||
|
|
||||||
import static de.bixilon.minosoft.render.utility.Vec3.*;
|
|
||||||
import static java.lang.StrictMath.*;
|
|
||||||
import static org.lwjgl.glfw.GLFW.*;
|
|
||||||
import static org.lwjgl.opengl.GL11.*;
|
|
||||||
|
|
||||||
public class FlyController {
|
|
||||||
private final long window;
|
|
||||||
Vec3 cameraPos = new Vec3(0.0f, 0.0f, 0.0f);
|
|
||||||
Vec3 cameraFront = new Vec3(0.0f, 0.0f, -1.0f);
|
|
||||||
Vec3 cameraUp = new Vec3(0.0f, 1.0f, 0.0f);
|
|
||||||
float lastX;
|
|
||||||
float lastY;
|
|
||||||
|
|
||||||
float yaw = 0f;
|
|
||||||
float pitch = 0f;
|
|
||||||
|
|
||||||
float flySpeed = 0.1f;
|
|
||||||
private boolean firstMouse = true;
|
|
||||||
|
|
||||||
public FlyController(long window) {
|
|
||||||
this.window = window;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void processInput(long window, float deltaTime) {
|
|
||||||
float cameraSpeed = flySpeed / deltaTime;
|
|
||||||
|
|
||||||
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
|
|
||||||
MainWindow.pause();
|
|
||||||
}
|
|
||||||
if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) {
|
|
||||||
cameraPos.add(mul(cameraFront, cameraSpeed * deltaTime));
|
|
||||||
}
|
|
||||||
if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) {
|
|
||||||
cameraPos.add(mul(cameraFront, -cameraSpeed * deltaTime));
|
|
||||||
}
|
|
||||||
if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) {
|
|
||||||
cameraPos.add(mul(cross(cameraUp, cameraFront), cameraSpeed * deltaTime));
|
|
||||||
}
|
|
||||||
if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) {
|
|
||||||
cameraPos.add(mul(cross(cameraUp, cameraFront), -cameraSpeed * deltaTime));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) {
|
|
||||||
cameraPos.add(0, cameraSpeed * deltaTime, 0);
|
|
||||||
}
|
|
||||||
if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) {
|
|
||||||
cameraPos.add(0, -cameraSpeed * deltaTime, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void loop(float deltaTime) {
|
|
||||||
processInput(window, deltaTime);
|
|
||||||
//glLoadIdentity();
|
|
||||||
//glTranslatef(cameraPos.x, cameraPos.y, cameraPos.z);
|
|
||||||
//glPushMatrix();
|
|
||||||
//glTranslatef(-cameraPos.x, -cameraPos.y, -cameraPos.z);
|
|
||||||
glRotatef(pitch, 1, 0, 0);
|
|
||||||
glRotatef(yaw, 0, 1, 0);
|
|
||||||
glTranslatef(cameraPos.x, cameraPos.y, cameraPos.z);
|
|
||||||
glPushMatrix();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void mouseCallback(long l, double xPos, double yPos) {
|
|
||||||
if (firstMouse) {
|
|
||||||
lastX = (float) xPos;
|
|
||||||
lastY = (float) yPos;
|
|
||||||
firstMouse = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
float xoffset = (float) (xPos - lastX);
|
|
||||||
float yoffset = (float) (lastY - yPos); // reversed since y-coordinates go from bottom to top
|
|
||||||
lastX = (float) xPos;
|
|
||||||
lastY = (float) yPos;
|
|
||||||
|
|
||||||
float sensitivity = 0.1f; // change this value to your liking
|
|
||||||
xoffset *= sensitivity;
|
|
||||||
yoffset *= sensitivity;
|
|
||||||
|
|
||||||
yaw += xoffset;
|
|
||||||
pitch += yoffset;
|
|
||||||
|
|
||||||
// make sure that when pitch is out of bounds, screen doesn't get flipped
|
|
||||||
if (pitch > 89.0f)
|
|
||||||
pitch = 89.0f;
|
|
||||||
if (pitch < -89.0f)
|
|
||||||
pitch = -89.0f;
|
|
||||||
|
|
||||||
Vec3 front = new Vec3();
|
|
||||||
front.x = (float) -(sin(toRadians(yaw)) * cos(toRadians(pitch)));
|
|
||||||
front.y = 0;//(float) sin(toRadians(pitch));
|
|
||||||
front.z = (float) ((cos(toRadians(yaw))) * cos(toRadians(pitch)));
|
|
||||||
cameraFront = normalize(front);
|
|
||||||
}
|
|
||||||
}
|
|
@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
package de.bixilon.minosoft.render;
|
package de.bixilon.minosoft.render;
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.movement.PlayerController;
|
||||||
import de.bixilon.minosoft.protocol.network.Connection;
|
import de.bixilon.minosoft.protocol.network.Connection;
|
||||||
import de.bixilon.minosoft.render.MainMenu.MainMenu;
|
import de.bixilon.minosoft.render.MainMenu.MainMenu;
|
||||||
import de.bixilon.minosoft.render.utility.RenderMode;
|
import de.bixilon.minosoft.render.utility.RenderMode;
|
||||||
@ -33,7 +34,8 @@ public class MainWindow {
|
|||||||
static MainMenu mainMenu;
|
static MainMenu mainMenu;
|
||||||
static WorldRenderer renderer;
|
static WorldRenderer renderer;
|
||||||
static Connection connection;
|
static Connection connection;
|
||||||
static FlyController flyController;
|
private static PlayerController playerMovement;
|
||||||
|
|
||||||
|
|
||||||
public static void start(Connection serverConnection) {
|
public static void start(Connection serverConnection) {
|
||||||
Thread guiThread = new Thread(() -> {
|
Thread guiThread = new Thread(() -> {
|
||||||
@ -42,15 +44,15 @@ public class MainWindow {
|
|||||||
openGLWindow.init();
|
openGLWindow.init();
|
||||||
renderer = new WorldRenderer();
|
renderer = new WorldRenderer();
|
||||||
renderer.init();
|
renderer.init();
|
||||||
flyController = new FlyController(openGLWindow.getWindow());
|
playerMovement = new PlayerController(openGLWindow.getWindow());
|
||||||
renderMode = MAIN_MENU;
|
renderMode = MAIN_MENU;
|
||||||
mainMenu = new MainMenu(openGLWindow.getWidth(), openGLWindow.getHeight());
|
mainMenu = new MainMenu(openGLWindow.getWidth(), openGLWindow.getHeight());
|
||||||
runWindow();
|
mainLoop();
|
||||||
});
|
});
|
||||||
guiThread.start();
|
guiThread.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void runWindow() {
|
private static void mainLoop() {
|
||||||
while (!glfwWindowShouldClose(openGLWindow.getWindow())) {
|
while (!glfwWindowShouldClose(openGLWindow.getWindow())) {
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
@ -67,7 +69,7 @@ public class MainWindow {
|
|||||||
break;
|
break;
|
||||||
case PLAY:
|
case PLAY:
|
||||||
OpenGLWindow.gluPerspective(FOVY, (float) WIDTH / (float) HEIGHT, 0.1f, 500f);
|
OpenGLWindow.gluPerspective(FOVY, (float) WIDTH / (float) HEIGHT, 0.1f, 500f);
|
||||||
flyController.loop(deltaTime);
|
playerMovement.loop(deltaTime);
|
||||||
renderer.draw();
|
renderer.draw();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -89,7 +91,7 @@ public class MainWindow {
|
|||||||
renderMode = PLAY;
|
renderMode = PLAY;
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
glDepthFunc(GL_LEQUAL);
|
glDepthFunc(GL_LEQUAL);
|
||||||
glfwSetCursorPosCallback(openGLWindow.getWindow(), flyController::mouseCallback);
|
glfwSetCursorPosCallback(openGLWindow.getWindow(), playerMovement.getCameraMovement()::mouseCallback);
|
||||||
glfwSetInputMode(openGLWindow.getWindow(), GLFW_CURSOR, GLFW_CURSOR_DISABLED);
|
glfwSetInputMode(openGLWindow.getWindow(), GLFW_CURSOR, GLFW_CURSOR_DISABLED);
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
connection.connect();
|
connection.connect();
|
||||||
@ -108,4 +110,8 @@ public class MainWindow {
|
|||||||
public static void close() {
|
public static void close() {
|
||||||
System.exit(1);
|
System.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static PlayerController getPlayerMovement() {
|
||||||
|
return playerMovement;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -137,4 +137,8 @@ public class WorldRenderer {
|
|||||||
public TextureLoader getTextureLoader() {
|
public TextureLoader getTextureLoader() {
|
||||||
return textureLoader;
|
return textureLoader;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BlockModelLoader getModelLoader() {
|
||||||
|
return modelLoader;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,6 @@ package de.bixilon.minosoft.render.blockModels;
|
|||||||
import de.bixilon.minosoft.Config;
|
import de.bixilon.minosoft.Config;
|
||||||
import de.bixilon.minosoft.game.datatypes.blocks.Blocks;
|
import de.bixilon.minosoft.game.datatypes.blocks.Blocks;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
import org.json.simple.parser.JSONParser;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -41,7 +40,6 @@ public class BlockModelLoader {
|
|||||||
|
|
||||||
private void loadModels(String path) throws IOException {
|
private void loadModels(String path) throws IOException {
|
||||||
File[] files = new File(path).listFiles();
|
File[] files = new File(path).listFiles();
|
||||||
JSONParser parser = new JSONParser();
|
|
||||||
|
|
||||||
for (File file : files) {
|
for (File file : files) {
|
||||||
String fileName = file.getName().substring(0, file.getName().lastIndexOf('.'));
|
String fileName = file.getName().substring(0, file.getName().lastIndexOf('.'));
|
||||||
@ -59,6 +57,9 @@ public class BlockModelLoader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isFull(Blocks block) {
|
public boolean isFull(Blocks block) {
|
||||||
|
if (block == Blocks.AIR || block == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return drawDescriptionMap.get(block).isFull();
|
return drawDescriptionMap.get(block).isFull();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ public class DrawDescription {
|
|||||||
|
|
||||||
|
|
||||||
Map<FaceOrientation, Pair<Float, Float>> faces;
|
Map<FaceOrientation, Pair<Float, Float>> faces;
|
||||||
boolean full; // is the block a completely filled block
|
boolean full = false; // is the block a completely filled block?
|
||||||
|
|
||||||
public DrawDescription(JSONObject json) {
|
public DrawDescription(JSONObject json) {
|
||||||
if (!(json.has("parent") && json.has("textures"))) return;
|
if (!(json.has("parent") && json.has("textures"))) return;
|
||||||
|
@ -21,6 +21,12 @@ public enum FaceOrientation {
|
|||||||
this.id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static FaceOrientation[] getNotVerticalValues() {
|
||||||
|
return new FaceOrientation[]{
|
||||||
|
EAST, WEST, SOUTH, NORTH
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
public int getId() {
|
public int getId() {
|
||||||
return this.id;
|
return this.id;
|
||||||
}
|
}
|
||||||
|
@ -17,40 +17,40 @@ public class RenderConstants {
|
|||||||
//TODO: fix rotated faces
|
//TODO: fix rotated faces
|
||||||
public static final float[][][] FACE_VERTEX = new float[][][]{
|
public static final float[][][] FACE_VERTEX = new float[][][]{
|
||||||
{
|
{
|
||||||
{0.5f, 0.5f, -0.5f},
|
{1, 0, 0},
|
||||||
{0.5f, -0.5f, -0.5f},
|
{1, -1, 0},
|
||||||
{0.5f, -0.5f, 0.5f},
|
{1, -1, 1},
|
||||||
{0.5f, 0.5f, 0.5f}
|
{1, 0, 1}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{-0.5f, 0.5f, -0.5f},
|
{0, 0, 0},
|
||||||
{-0.5f, -0.5f, -0.5f},
|
{0, -1, 0},
|
||||||
{-0.5f, -0.5f, 0.5f},
|
{0, -1, 1},
|
||||||
{-0.5f, 0.5f, 0.5f}
|
{0, 0, 1}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{0.5f, 0.5f, 0.5f},
|
{0, 0, 0},
|
||||||
{-0.5f, 0.5f, 0.5f},
|
{1, 0, 0},
|
||||||
{-0.5f, 0.5f, -0.5f},
|
{1, 0, 1},
|
||||||
{0.5f, 0.5f, -0.5f},
|
{0, 0, 1}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{0.5f, -0.5f, 0.5f},
|
{0, -1, 0},
|
||||||
{-0.5f, -0.5f, 0.5f},
|
{1, -1, 0},
|
||||||
{-0.5f, -0.5f, -0.5f},
|
{1, -1, 1},
|
||||||
{0.5f, -0.5f, -0.5f},
|
{0, -1, 1}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{0.5f, 0.5f, 0.5f},
|
{1, 0, 1},
|
||||||
{0.5f, -0.5f, 0.5f},
|
{1, -1, 1},
|
||||||
{-0.5f, -0.5f, 0.5f},
|
{0, -1, 1},
|
||||||
{-0.5f, 0.5f, 0.5f},
|
{0, 0, 1},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{0.5f, 0.5f, -0.5f},
|
{1, 0, 0},
|
||||||
{0.5f, -0.5f, -0.5f},
|
{1, -1, 0},
|
||||||
{-0.5f, -0.5f, -0.5f},
|
{0, -1, 0},
|
||||||
{-0.5f, 0.5f, -0.5f},
|
{0, 0, 0}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@ public class TextureLoader {
|
|||||||
BufferedImage img = ImageIO.read(textureInputStream);
|
BufferedImage img = ImageIO.read(textureInputStream);
|
||||||
allTextures.add(new Pair<>(img, textureName));
|
allTextures.add(new Pair<>(img, textureName));
|
||||||
}
|
}
|
||||||
//else we have a .mcmeta file
|
//else we have a .mcmeta file describing animated blocks
|
||||||
}
|
}
|
||||||
|
|
||||||
// CONVERT ALL THE IMAGES INTO A SINGLE, VERY LONG IMAGE
|
// CONVERT ALL THE IMAGES INTO A SINGLE, VERY LONG IMAGE
|
||||||
|
@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* Codename Minosoft
|
||||||
|
* Copyright (C) 2020 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.render.utility;
|
||||||
|
|
||||||
|
import static java.lang.Math.abs;
|
||||||
|
|
||||||
|
public class AdditionalMath {
|
||||||
|
public static int[] valuesBetween(int x, int y) {
|
||||||
|
int[] result = new int[abs(x - y) + 1];
|
||||||
|
if (x > y) {
|
||||||
|
for (int z = y; z <= x; z++) {
|
||||||
|
result[x - z] = z;
|
||||||
|
}
|
||||||
|
} else if (y > x) {
|
||||||
|
for (int z = x; z <= y; z++) {
|
||||||
|
result[y - z] = z;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
result[0] = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int betterRound(double x) {
|
||||||
|
if (x >= 0) {
|
||||||
|
return (int) x;
|
||||||
|
}
|
||||||
|
return (int) x - 1;
|
||||||
|
}
|
||||||
|
}
|
@ -13,6 +13,8 @@
|
|||||||
|
|
||||||
package de.bixilon.minosoft.render.utility;
|
package de.bixilon.minosoft.render.utility;
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.game.datatypes.entities.Location;
|
||||||
|
|
||||||
import static java.lang.Math.pow;
|
import static java.lang.Math.pow;
|
||||||
import static java.lang.Math.sqrt;
|
import static java.lang.Math.sqrt;
|
||||||
|
|
||||||
@ -29,6 +31,12 @@ public class Vec3 {
|
|||||||
z = z_;
|
z = z_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Vec3(Location location) {
|
||||||
|
x = (float) location.getX();
|
||||||
|
y = (float) location.getY();
|
||||||
|
z = (float) location.getZ();
|
||||||
|
}
|
||||||
|
|
||||||
public static Vec3 add(Vec3 v1, Vec3 v2) {
|
public static Vec3 add(Vec3 v1, Vec3 v2) {
|
||||||
return new Vec3(
|
return new Vec3(
|
||||||
v1.x + v2.x,
|
v1.x + v2.x,
|
||||||
@ -92,4 +100,21 @@ public class Vec3 {
|
|||||||
y /= l;
|
y /= l;
|
||||||
z /= l;
|
z /= l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Vec3 copy() {
|
||||||
|
return new Vec3(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void zero() {
|
||||||
|
x = y = z = 0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getXNormalized() {
|
||||||
|
if (x == 0f) {
|
||||||
|
return 0;
|
||||||
|
} else if (x > 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user