diff --git a/engine-tests/src/test/java/org/terasology/rendering/cameras/PerspectiveCameraTest.java b/engine-tests/src/test/java/org/terasology/rendering/cameras/PerspectiveCameraTest.java index e957e9fca9f..8f71809fae8 100644 --- a/engine-tests/src/test/java/org/terasology/rendering/cameras/PerspectiveCameraTest.java +++ b/engine-tests/src/test/java/org/terasology/rendering/cameras/PerspectiveCameraTest.java @@ -15,14 +15,15 @@ */ package org.terasology.rendering.cameras; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; +import org.joml.Matrix4f; +import org.joml.Quaternionf; +import org.junit.Before; +import org.junit.Test; import org.terasology.config.Config; import org.terasology.config.RenderingConfig; import org.terasology.context.internal.ContextImpl; import org.terasology.context.internal.MockContext; import org.terasology.engine.subsystem.DisplayDevice; -import org.terasology.math.geom.Matrix4f; import org.terasology.math.geom.Quat4f; import org.terasology.registry.CoreRegistry; import org.terasology.world.WorldProvider; @@ -33,7 +34,7 @@ public class PerspectiveCameraTest { - @BeforeEach + @Before public void setUp() { Config config = new Config(new MockContext()); config.loadDefaults(); @@ -62,16 +63,16 @@ public void testPerspectiveCamera() { , 0.0f, 8.937492f, 0.0f, 0.0f , 0.0f, 0.0f, -1.00004f, -0.20000401f , 0.0f, 0.0f, -1.0f, 0.0f); - Matrix4f normViewMatrix = new Matrix4f(0.27303523f, 0.0f, -0.962004f, -0.0f - , -0.96200305f, 0.0014514439f, -0.27303496f, -0.0f, - 0.0013962948f, 0.99999887f, 3.962953f, -0.0f, - 0.0f, 0.0f, 0.0f, 1.0f); + Matrix4f normViewMatrix = new Matrix4f(0.27303523f,0.0f,-0.962004f,-0.0f + ,-0.96200305f,0.0014514439f,-0.27303496f,-0.0f, + 0.0013962948f,0.99999887f,3.962953f,-0.0f, + 0.0f,0.0f,0.0f,1.0f); - camera.getViewMatrix().epsilonEquals(viewMatrix, 0.5f); - camera.getProjectionMatrix().epsilonEquals(projectionMatrix, 0.5f); - camera.getNormViewMatrix().epsilonEquals(normViewMatrix, 0.5f); + camera.getViewMatrix().equals(viewMatrix, 0.5f); + camera.getProjectionMatrix().equals(projectionMatrix, 0.5f); + camera.getNormViewMatrix().equals(normViewMatrix,0.5f); camera.setReflected(true); - camera.getNormViewMatrix().epsilonEquals(normViewMatrix, 0.5f); + camera.getNormViewMatrix().equals(normViewMatrix,0.5f); } } diff --git a/engine/build.gradle b/engine/build.gradle index e3b0b6ae92b..5520932ad59 100644 --- a/engine/build.gradle +++ b/engine/build.gradle @@ -103,7 +103,6 @@ dependencies { compile group: 'org.lwjgl.lwjgl', name: 'lwjgl', version: LwjglVersion compile group: 'org.lwjgl.lwjgl', name: 'lwjgl_util', version: LwjglVersion compile group: 'java3d', name: 'vecmath', version: '1.3.1' // Note: Downgraded to this release until TeraMath ready - compile "org.joml:joml:1.8.1" compile group: 'org.abego.treelayout', name: 'org.abego.treelayout.core', version: '1.0.3' compile group: 'com.miglayout', name: 'miglayout-core', version: '5.0' compile group: 'de.matthiasmann.twl', name: 'PNGDecoder', version: '1111' @@ -136,6 +135,7 @@ dependencies { compile group: 'org.terasology', name: 'gestalt-module', version: '5.1.5' compile group: 'org.terasology', name: 'gestalt-asset-core', version: '5.1.5' compile group: 'org.terasology', name: 'TeraMath', version: '1.4.0' + compile group: 'org.joml', name: 'joml', version: '1.9.19' compile group: 'org.terasology.bullet', name: 'tera-bullet', version: '1.3.1' compile group: 'org.terasology', name: 'splash-screen', version: '1.0.2' compile group: 'org.terasology.jnlua', name: 'JNLua', version: '0.1.0-SNAPSHOT' diff --git a/engine/src/main/java/org/terasology/engine/subsystem/headless/assets/HeadlessMaterial.java b/engine/src/main/java/org/terasology/engine/subsystem/headless/assets/HeadlessMaterial.java index 553601261c4..9ed61be11f3 100644 --- a/engine/src/main/java/org/terasology/engine/subsystem/headless/assets/HeadlessMaterial.java +++ b/engine/src/main/java/org/terasology/engine/subsystem/headless/assets/HeadlessMaterial.java @@ -15,6 +15,8 @@ */ package org.terasology.engine.subsystem.headless.assets; +import org.joml.Matrix3fc; +import org.joml.Matrix4fc; import org.terasology.assets.AssetType; import org.terasology.assets.ResourceUrn; import org.terasology.math.geom.Matrix3f; @@ -110,6 +112,11 @@ public void setMatrix3(String name, Matrix3f matrix, boolean currentOnly) { // Do nothing } + @Override + public void setMatrix3(String name, Matrix3fc matrix, boolean currentOnly) { + + } + @Override public void setMatrix3(String name, FloatBuffer buffer, boolean currentOnly) { // Do nothing @@ -120,6 +127,11 @@ public void setMatrix4(String name, Matrix4f matrix, boolean currentOnly) { // Do nothing } + @Override + public void setMatrix4(String name, Matrix4fc matrix, boolean currentOnly) { + + } + @Override public void setMatrix4(String name, FloatBuffer buffer, boolean currentOnly) { // Do nothing diff --git a/engine/src/main/java/org/terasology/engine/subsystem/headless/renderer/HeadlessWorldRenderer.java b/engine/src/main/java/org/terasology/engine/subsystem/headless/renderer/HeadlessWorldRenderer.java index ccd48915ded..25a677ca166 100644 --- a/engine/src/main/java/org/terasology/engine/subsystem/headless/renderer/HeadlessWorldRenderer.java +++ b/engine/src/main/java/org/terasology/engine/subsystem/headless/renderer/HeadlessWorldRenderer.java @@ -273,7 +273,7 @@ private Vector3i calcCamChunkOffset() { private float distanceToCamera(RenderableChunk chunk) { Vector3f result = new Vector3f((chunk.getPosition().x + 0.5f) * ChunkConstants.SIZE_X, 0, (chunk.getPosition().z + 0.5f) * ChunkConstants.SIZE_Z); - Vector3f cameraPos = getActiveCamera().getPosition(); + org.joml.Vector3f cameraPos = getActiveCamera().getPosition(); result.x -= cameraPos.x; result.z -= cameraPos.z; diff --git a/engine/src/main/java/org/terasology/logic/players/LocalPlayerSystem.java b/engine/src/main/java/org/terasology/logic/players/LocalPlayerSystem.java index c875c69c4bd..f4f2633480a 100644 --- a/engine/src/main/java/org/terasology/logic/players/LocalPlayerSystem.java +++ b/engine/src/main/java/org/terasology/logic/players/LocalPlayerSystem.java @@ -15,6 +15,7 @@ */ package org.terasology.logic.players; +import org.joml.Quaternionf; import org.terasology.assets.ResourceUrn; import org.terasology.config.Config; import org.terasology.engine.SimpleUri; @@ -61,6 +62,7 @@ import org.terasology.logic.players.event.OnPlayerSpawnedEvent; import org.terasology.math.AABB; import org.terasology.math.Direction; +import org.terasology.math.JomlUtil; import org.terasology.math.TeraMath; import org.terasology.math.geom.Quat4f; import org.terasology.math.geom.Vector3f; @@ -148,7 +150,7 @@ public void update(float delta) { CharacterMovementComponent characterMovementComponent = entity.getComponent(CharacterMovementComponent.class); processInput(entity, characterMovementComponent); - updateCamera(characterMovementComponent, localPlayer.getViewPosition(), localPlayer.getViewRotation()); + updateCamera(characterMovementComponent, localPlayer.getViewPosition(), JomlUtil.from(localPlayer.getViewRotation())); } private void processInput(EntityRef entity, CharacterMovementComponent characterMovementComponent) { @@ -412,10 +414,10 @@ public void setAABBRenderer(BlockOverlayRenderer newAABBRender) { aabbRenderer = newAABBRender; } - private void updateCamera(CharacterMovementComponent charMovementComp, Vector3f position, Quat4f rotation) { - playerCamera.getPosition().set(position); + private void updateCamera(CharacterMovementComponent charMovementComp, Vector3f position, Quaternionf rotation) { + playerCamera.getPosition().set(JomlUtil.from(position)); Vector3f viewDir = Direction.FORWARD.getVector3f(); - rotation.rotate(viewDir, playerCamera.getViewingDirection()); + rotation.transform(JomlUtil.from(viewDir), playerCamera.getViewingDirection()); float stepDelta = charMovementComp.footstepDelta - lastStepDelta; if (stepDelta < 0) { diff --git a/engine/src/main/java/org/terasology/math/Direction.java b/engine/src/main/java/org/terasology/math/Direction.java index ea11ba3ee27..f6d88258c60 100644 --- a/engine/src/main/java/org/terasology/math/Direction.java +++ b/engine/src/main/java/org/terasology/math/Direction.java @@ -17,6 +17,7 @@ package org.terasology.math; import com.google.common.collect.Maps; +import org.joml.Vector3fc; import org.terasology.math.geom.Vector3f; import org.terasology.math.geom.Vector3i; diff --git a/engine/src/main/java/org/terasology/math/JomlUtil.java b/engine/src/main/java/org/terasology/math/JomlUtil.java new file mode 100644 index 00000000000..ef24af1d828 --- /dev/null +++ b/engine/src/main/java/org/terasology/math/JomlUtil.java @@ -0,0 +1,112 @@ +/* + * Copyright 2017 MovingBlocks + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.terasology.math; + +import org.joml.Matrix3f; +import org.joml.Matrix3fc; +import org.joml.Matrix4f; +import org.joml.Matrix4fc; +import org.joml.Quaternionf; +import org.joml.Vector2f; +import org.joml.Vector2fc; +import org.joml.Vector2ic; +import org.joml.Vector3fc; +import org.joml.Vector3ic; +import org.joml.Vector4f; +import org.joml.Vector4fc; +import org.terasology.math.geom.BaseMatrix3f; +import org.terasology.math.geom.BaseMatrix4f; +import org.terasology.math.geom.BaseQuat4f; +import org.terasology.math.geom.BaseVector2f; +import org.terasology.math.geom.BaseVector3f; +import org.terasology.math.geom.BaseVector3i; +import org.terasology.math.geom.BaseVector4f; +import org.terasology.math.geom.Quat4f; + +public class JomlUtil { + + + public static org.terasology.math.geom.Matrix4f from(Matrix4fc mat) { + return new org.terasology.math.geom.Matrix4f(mat.m00(), mat.m01(), mat.m02(), mat.m03(), + mat.m10(), mat.m11(), mat.m12(), mat.m13(), + mat.m20(), mat.m21(), mat.m22(), mat.m23(), + mat.m30(), mat.m31(), mat.m32(), mat.m33()); + } + + public static org.terasology.math.geom.Matrix3f from(Matrix3fc mat) { + return new org.terasology.math.geom.Matrix3f(mat.m00(), mat.m01(), mat.m02(), + mat.m10(), mat.m11(), mat.m12(), + mat.m20(), mat.m21(), mat.m22()); + } + + public static org.joml.Matrix4f from(BaseMatrix4f mat) { + return new org.joml.Matrix4f(mat.getM00(), mat.getM01(), mat.getM02(), mat.getM03(), + mat.getM10(), mat.getM11(), mat.getM12(), mat.getM13(), + mat.getM20(), mat.getM21(), mat.getM22(), mat.getM23(), + mat.getM30(), mat.getM31(), mat.getM32(), mat.getM33()); + } + + + public static Matrix3f from(BaseMatrix3f mat) { + return new Matrix3f(mat.getM00(), mat.getM01(), mat.getM02(), + mat.getM10(), mat.getM11(), mat.getM12(), + mat.getM20(), mat.getM21(), mat.getM22()); + } + + public static org.terasology.math.geom.Vector4f from(Vector4fc vec) { + return new org.terasology.math.geom.Vector4f(vec.x(), vec.y(), vec.z(), vec.w()); + } + + public static org.terasology.math.geom.Vector3f from(Vector3fc vec) { + return new org.terasology.math.geom.Vector3f(vec.x(), vec.y(), vec.z()); + } + + public static org.terasology.math.geom.Vector2f from(Vector2fc vec) { + return new org.terasology.math.geom.Vector2f(vec.x(), vec.y()); + } + + public static org.terasology.math.geom.Vector3i from(Vector3ic vec) { + return new org.terasology.math.geom.Vector3i(vec.x(), vec.y(), vec.z()); + } + + public static org.terasology.math.geom.Vector2i from(Vector2ic vec) { + return new org.terasology.math.geom.Vector2i(vec.x(), vec.y()); + } + + public static org.joml.Vector4f from(BaseVector4f vec) { + return new Vector4f(vec.x(), vec.y(), vec.z(), vec.w()); + } + + public static org.joml.Vector3f from(BaseVector3f vec) { + return new org.joml.Vector3f(vec.x(), vec.y(), vec.z()); + } + + public static org.joml.Vector2f from(BaseVector2f vec) { + return new org.joml.Vector2f(vec.x(), vec.y()); + } + + public static org.joml.Vector3i from(BaseVector3i vec) { + return new org.joml.Vector3i(vec.x(), vec.y(), vec.z()); + } + + public static Quat4f from(Quaternionf quat) { + return new Quat4f(quat.x(), quat.y(), quat.z(), quat.w()); + } + + public static Quaternionf from(BaseQuat4f quat) { + return new Quaternionf(quat.getX(), quat.getY(), quat.getZ(), quat.getW()); + } +} diff --git a/engine/src/main/java/org/terasology/math/MatrixUtils.java b/engine/src/main/java/org/terasology/math/MatrixUtils.java index 474b33911cf..98bb1fd843e 100644 --- a/engine/src/main/java/org/terasology/math/MatrixUtils.java +++ b/engine/src/main/java/org/terasology/math/MatrixUtils.java @@ -16,6 +16,8 @@ package org.terasology.math; +import org.joml.Matrix3fc; +import org.joml.Matrix4fc; import org.lwjgl.BufferUtils; import org.terasology.math.geom.Matrix3f; import org.terasology.math.geom.Matrix4f; @@ -38,6 +40,7 @@ private MatrixUtils() { * * @param m the matrix to copy * @return A new FloatBuffer containing the matrix in column-major form. + * @deprecated used JOML method that uses Matrix4fc */ public static FloatBuffer matrixToFloatBuffer(Matrix4f m) { FloatBuffer buffer = BufferUtils.createFloatBuffer(16); @@ -45,12 +48,18 @@ public static FloatBuffer matrixToFloatBuffer(Matrix4f m) { return buffer; } + public static FloatBuffer matrixToFloatBuffer(Matrix4fc m) { + return m.getTransposed(BufferUtils.createFloatBuffer(16)); + } + + /** * Copies the given matrix into a newly allocated FloatBuffer. * The order of the elements is column major (as used by OpenGL). * * @param m the matrix to copy * @return A new FloatBuffer containing the matrix in column-major form. + * @deprecated used JOML method that uses Matrix3fc */ public static FloatBuffer matrixToFloatBuffer(Matrix3f m) { FloatBuffer buffer = BufferUtils.createFloatBuffer(9); @@ -58,6 +67,10 @@ public static FloatBuffer matrixToFloatBuffer(Matrix3f m) { return buffer; } + public static FloatBuffer matrixToFloatBuffer(Matrix3fc m) { + return m.getTransposed(BufferUtils.createFloatBuffer(9)); + } + /** * Copies the given matrix into an existing FloatBuffer. * The order of the elements is column major (as used by OpenGL). @@ -111,55 +124,56 @@ public static FloatBuffer matrixToFloatBuffer(Matrix4f m, FloatBuffer fb) { return fb; } - public static Matrix4f createViewMatrix(float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ) { - return createViewMatrix(new Vector3f(eyeX, eyeY, eyeZ), new Vector3f(centerX, centerY, centerZ), new Vector3f(upX, upY, upZ)); + public static org.joml.Matrix4f createViewMatrix(float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ) { + return createViewMatrix(new org.joml.Vector3f(eyeX, eyeY, eyeZ), new org.joml.Vector3f(centerX, centerY, centerZ), new org.joml.Vector3f(upX, upY, upZ)); } - public static Matrix4f createViewMatrix(Vector3f eye, Vector3f center, Vector3f up) { - Matrix4f m = new Matrix4f(); + public static org.joml.Matrix4f createViewMatrix(org.joml.Vector3f eye, org.joml.Vector3f center, org.joml.Vector3f up) { + org.joml.Matrix4f m = new org.joml.Matrix4f(); - Vector3f f = new Vector3f(); - f.sub(center, eye); + org.joml.Vector3f f = new org.joml.Vector3f(); + center.sub(eye,f); f.normalize(); up.normalize(); - Vector3f s = new Vector3f(); - s.cross(f, up); + org.joml.Vector3f s = new org.joml.Vector3f(); + f.cross(up,s); s.normalize(); - Vector3f u = new Vector3f(); - u.cross(s, f); + org.joml.Vector3f u = new org.joml.Vector3f(); + s.cross(f,u); u.normalize(); - m.m00 = s.x; - m.m10 = s.y; - m.m20 = s.z; - m.m30 = 0; - m.m01 = u.x; - m.m11 = u.y; - m.m21 = u.z; - m.m31 = 0; - m.m02 = -f.x; - m.m12 = -f.y; - m.m22 = -f.z; - m.m32 = 0; - m.m03 = 0; - m.m13 = 0; - m.m23 = 0; - m.m33 = 1; - - m.m30 = -eye.x; - m.m31 = -eye.y; - m.m32 = -eye.z; + m.m00(s.x); + m.m10(s.y); + m.m20(s.z); + m.m30(0); + m.m01(u.x); + m.m11(u.y); + m.m21(u.z); + m.m31(0); + m.m02(-f.x); + m.m12(-f.y); + m.m22(-f.z); + m.m32(0); + m.m03(0); + m.m13(0); + m.m23(0); + m.m33(1); + + m.m30(-eye.x); + m.m31(-eye.y); + m.m32(-eye.z); m.transpose(); return m; } - public static Matrix4f createOrthogonalProjectionMatrix(float left, float right, float top, float bottom, float near, float far) { - Matrix4f m = new Matrix4f(); + + public static org.joml.Matrix4f createOrthogonalProjectionMatrix(float left, float right, float top, float bottom, float near, float far) { + org.joml.Matrix4f m = new org.joml.Matrix4f(); float lateral = right - left; float vertical = top - bottom; @@ -168,59 +182,57 @@ public static Matrix4f createOrthogonalProjectionMatrix(float left, float right, float ty = -(top + bottom) / (top - bottom); float tz = -(far + near) / (far - near); - m.m00 = 2.0f / lateral; - m.m10 = 0.0f; - m.m20 = 0.0f; - m.m30 = tx; - m.m01 = 0.0f; - m.m11 = 2.0f / vertical; - m.m21 = 0.0f; - m.m31 = ty; - m.m02 = 0.0f; - m.m12 = 0.0f; - m.m22 = -2.0f / forward; - m.m32 = tz; - m.m03 = 0.0f; - m.m13 = 0.0f; - m.m23 = 0.0f; - m.m33 = 1.0f; + m.m00(2.0f / lateral); + m.m10(0.0f); + m.m20(0.0f); + m.m30(tx); + m.m01(0.0f); + m.m11(2.0f / vertical); + m.m21(0.0f); + m.m31(ty); + m.m02(0.0f); + m.m12(0.0f); + m.m22(-2.0f / forward); + m.m32(tz); + m.m03(0.0f); + m.m13(0.0f); + m.m23(0.0f); + m.m33(1.0f); m.transpose(); return m; } - public static Matrix4f createPerspectiveProjectionMatrix(float fovY, float aspectRatio, float zNear, float zFar) { - Matrix4f m = new Matrix4f(); + public static org.joml.Matrix4f createPerspectiveProjectionMatrix(float fovY, float aspectRatio, float zNear, float zFar) { + org.joml.Matrix4f m = new org.joml.Matrix4f(); float f = 1.0f / (float) Math.tan((double) fovY * 0.5f); - m.m00 = f / aspectRatio; - m.m10 = 0; - m.m20 = 0; - m.m30 = 0; - m.m01 = 0; - m.m11 = f; - m.m21 = 0; - m.m31 = 0; - m.m02 = 0; - m.m12 = 0; - m.m22 = (zFar + zNear) / (zNear - zFar); - m.m32 = (2 * zFar * zNear) / (zNear - zFar); - m.m03 = 0; - m.m13 = 0; - m.m23 = -1; - m.m33 = 0; + m.m00(f / aspectRatio); + m.m10(0); + m.m20(0); + m.m30(0); + m.m01(0); + m.m11(f); + m.m21(0); + m.m31(0); + m.m02(0); + m.m12(0); + m.m22((zFar + zNear) / (zNear - zFar)); + m.m32((2 * zFar * zNear) / (zNear - zFar)); + m.m03(0); + m.m13(0); + m.m23(-1); + m.m33(0); m.transpose(); return m; } - public static Matrix4f calcViewProjectionMatrix(Matrix4f vm, Matrix4f p) { - Matrix4f result = new Matrix4f(); - result.mul(p, vm); - return result; + public static org.joml.Matrix4f calcViewProjectionMatrix(org.joml.Matrix4f vm, org.joml.Matrix4f p) { + return new org.joml.Matrix4f(p).mul(vm); } public static Matrix4f calcModelViewMatrix(Matrix4f m, Matrix4f vm) { diff --git a/engine/src/main/java/org/terasology/particles/rendering/SpriteParticleRenderer.java b/engine/src/main/java/org/terasology/particles/rendering/SpriteParticleRenderer.java index d35255fcacf..3ae1c632b73 100644 --- a/engine/src/main/java/org/terasology/particles/rendering/SpriteParticleRenderer.java +++ b/engine/src/main/java/org/terasology/particles/rendering/SpriteParticleRenderer.java @@ -22,6 +22,7 @@ import org.terasology.entitySystem.systems.RegisterMode; import org.terasology.entitySystem.systems.RegisterSystem; import org.terasology.entitySystem.systems.RenderSystem; +import org.terasology.math.JomlUtil; import org.terasology.math.geom.Vector3f; import org.terasology.particles.ParticlePool; import org.terasology.particles.ParticleSystemManager; @@ -149,9 +150,9 @@ public void renderOpaque() { public void renderAlphaBlend() { Material material = Assets.getMaterial(PARTICLE_MATERIAL_URI).get(); material.enable(); - Vector3f camPos = worldRenderer.getActiveCamera().getPosition(); + org.joml.Vector3f camPos = worldRenderer.getActiveCamera().getPosition(); - particleSystemManager.getParticleEmittersByDataComponent(ParticleDataSpriteComponent.class).forEach(p -> drawParticles(material, p, camPos)); + particleSystemManager.getParticleEmittersByDataComponent(ParticleDataSpriteComponent.class).forEach(p -> drawParticles(material, p, JomlUtil.from(camPos))); } @Override diff --git a/engine/src/main/java/org/terasology/rendering/assets/material/BaseMaterial.java b/engine/src/main/java/org/terasology/rendering/assets/material/BaseMaterial.java index a6d79362f41..71f3986e187 100644 --- a/engine/src/main/java/org/terasology/rendering/assets/material/BaseMaterial.java +++ b/engine/src/main/java/org/terasology/rendering/assets/material/BaseMaterial.java @@ -15,6 +15,11 @@ */ package org.terasology.rendering.assets.material; +import org.joml.Matrix3fc; +import org.joml.Matrix4fc; +import org.joml.Vector2fc; +import org.joml.Vector3fc; +import org.joml.Vector4fc; import org.terasology.assets.AssetType; import org.terasology.assets.ResourceUrn; import org.terasology.math.geom.Matrix3f; @@ -125,6 +130,16 @@ public void setFloat2(String name, Vector2f value, boolean currentOnly) { setFloat2(name, value.x, value.y, currentOnly); } + @Override + public void setFloat2(String name, Vector2fc value) { + setFloat2(name, value.x(), value.y()); + } + + @Override + public void setFloat2(String name, Vector2fc value, boolean currentOnly) { + setFloat2(name, value.x(), value.y(), currentOnly); + } + @Override public void setFloat2(String name, FloatBuffer buffer) { setFloat2(name, buffer, false); @@ -145,6 +160,16 @@ public void setFloat3(String name, Vector3f value, boolean currentOnly) { setFloat3(name, value.x, value.y, value.z, currentOnly); } + @Override + public void setFloat3(String name, Vector3fc value) { + setFloat3(name, value.x(), value.y(), value.z()); + } + + @Override + public void setFloat3(String name, Vector3fc value, boolean currentOnly) { + setFloat3(name, value.x(), value.y(), value.z(), currentOnly); + } + @Override public void setFloat3(String name, FloatBuffer buffer) { setFloat3(name, buffer, false); @@ -165,6 +190,16 @@ public void setFloat4(String name, Vector4f value, boolean currentOnly) { setFloat4(name, value.x, value.y, value.z, value.w, currentOnly); } + @Override + public void setFloat4(String name, Vector4fc value) { + setFloat4(name, value.x(), value.y(), value.z(), value.w()); + } + + @Override + public void setFloat4(String name, Vector4fc value, boolean currentOnly) { + setFloat4(name, value.x(), value.y(), value.z(), value.w(), currentOnly); + } + @Override public void setFloat4(String name, FloatBuffer buffer) { setFloat4(name, buffer, false); @@ -185,6 +220,11 @@ public void setMatrix3(String name, Matrix3f matrix) { setMatrix3(name, matrix, false); } + @Override + public void setMatrix3(String name, Matrix3fc matrix) { + setMatrix3(name, matrix, false); + } + @Override public void setMatrix3(String name, FloatBuffer buffer) { setMatrix3(name, buffer, false); @@ -195,6 +235,11 @@ public void setMatrix4(String name, Matrix4f matrix) { setMatrix4(name, matrix, false); } + @Override + public void setMatrix4(String name, Matrix4fc matrix) { + setMatrix4(name, matrix, false); + } + @Override public void setMatrix4(String name, FloatBuffer buffer) { setMatrix3(name, buffer, false); diff --git a/engine/src/main/java/org/terasology/rendering/assets/material/Material.java b/engine/src/main/java/org/terasology/rendering/assets/material/Material.java index 16d112f7d6a..3a430af99b8 100644 --- a/engine/src/main/java/org/terasology/rendering/assets/material/Material.java +++ b/engine/src/main/java/org/terasology/rendering/assets/material/Material.java @@ -16,6 +16,11 @@ package org.terasology.rendering.assets.material; +import org.joml.Matrix3fc; +import org.joml.Matrix4fc; +import org.joml.Vector2fc; +import org.joml.Vector3fc; +import org.joml.Vector4fc; import org.terasology.assets.Asset; import org.terasology.assets.AssetType; import org.terasology.assets.ResourceUrn; @@ -86,11 +91,24 @@ protected Material(ResourceUrn urn, AssetType assetType) { * * @param name * @param value + * @deprecated use Vector2fc method */ public abstract void setFloat2(String name, Vector2f value); + /** + * + * @param name + * @param value + * @param currentOnly + * @deprecated use Vector2fc method + */ public abstract void setFloat2(String name, Vector2f value, boolean currentOnly); + public abstract void setFloat2(String name, Vector2fc value); + + public abstract void setFloat2(String name, Vector2fc value, boolean currentOnly); + + /** * Sets a float2 uniform parameter (for all feature permutations) * @@ -118,11 +136,24 @@ protected Material(ResourceUrn urn, AssetType assetType) { * * @param name * @param value + * @deprecated use Vector3fc method */ public abstract void setFloat3(String name, Vector3f value); + /** + * + * @param name + * @param value + * @param currentOnly + * @deprecated use Vector3fc method + */ public abstract void setFloat3(String name, Vector3f value, boolean currentOnly); + public abstract void setFloat3(String name, Vector3fc value); + + public abstract void setFloat3(String name, Vector3fc value, boolean currentOnly); + + /** * Sets a float3 uniform parameter (for all feature permutations) * @@ -151,11 +182,24 @@ protected Material(ResourceUrn urn, AssetType assetType) { * * @param name * @param value + * @deprecated use Vector4fc method */ public abstract void setFloat4(String name, Vector4f value); + /** + * + * @param name + * @param value + * @param currentOnly + * @deprecated use Vector4fc method + */ public abstract void setFloat4(String name, Vector4f value, boolean currentOnly); + public abstract void setFloat4(String name, Vector4fc value); + + public abstract void setFloat4(String name, Vector4fc value, boolean currentOnly); + + /** * Sets a float4 uniform parameter (for all feature permutations) * @@ -191,11 +235,37 @@ protected Material(ResourceUrn urn, AssetType assetType) { * * @param name * @param matrix + * @deprecated */ public abstract void setMatrix3(String name, Matrix3f matrix); + /** + * Sets a matrix3 uniform parameter (for all feature permutations) + * @param name + * @param matrix + * @param currentOnly + * @deprecated + */ public abstract void setMatrix3(String name, Matrix3f matrix, boolean currentOnly); + + /** + * Sets a matrix3 uniform parameter (for all feature permutations) + * + * @param name + * @param matrix + */ + public abstract void setMatrix3(String name, Matrix3fc matrix); + + /** + * Sets a matrix3 uniform parameter (for all feature permutations) + * + * @param name + * @param matrix + */ + public abstract void setMatrix3(String name, Matrix3fc matrix, boolean currentOnly); + + /** * Sets a matrix3 uniform parameter (for all feature permutations) * @@ -211,11 +281,30 @@ protected Material(ResourceUrn urn, AssetType assetType) { * * @param name * @param matrix + * @deprecated */ public abstract void setMatrix4(String name, Matrix4f matrix); public abstract void setMatrix4(String name, Matrix4f matrix, boolean currentOnly); + /** + * Sets a matrix4 uniform parameter (for all feature permutations) + * + * @param name + * @param matrix + * @deprecated + */ + public abstract void setMatrix4(String name, Matrix4fc matrix); + + + /** + * Sets a matrix4 uniform parameter (for all feature permutations) + * + * @param name + * @param matrix + */ + public abstract void setMatrix4(String name, Matrix4fc matrix,boolean currentOnly); + /** * Sets a matrix3 uniform parameter (for all feature permutations) * diff --git a/engine/src/main/java/org/terasology/rendering/cameras/Camera.java b/engine/src/main/java/org/terasology/rendering/cameras/Camera.java index 7754e7c2db3..df9405c31a7 100644 --- a/engine/src/main/java/org/terasology/rendering/cameras/Camera.java +++ b/engine/src/main/java/org/terasology/rendering/cameras/Camera.java @@ -15,13 +15,14 @@ */ package org.terasology.rendering.cameras; +import org.joml.Matrix4f; +import org.joml.Vector3f; import org.terasology.config.Config; import org.terasology.math.AABB; +import org.terasology.math.JomlUtil; import org.terasology.math.geom.Quat4f; import org.terasology.registry.CoreRegistry; import org.terasology.math.MatrixUtils; -import org.terasology.math.geom.Matrix4f; -import org.terasology.math.geom.Vector3f; /** * Provides global access to fonts. @@ -205,7 +206,7 @@ public Vector3f getViewingDirection() { * @return the orientation direction, a quaternion. */ public Quat4f getOrientation() { - return new Quat4f(viewingDirection, viewingAngle); + return new Quat4f(JomlUtil.from(viewingDirection), viewingAngle); } /** @@ -213,7 +214,7 @@ public Quat4f getOrientation() { * @param direction */ public void setOrientation(Quat4f direction) { - viewingDirection = direction.getAxis(); + viewingDirection = new Vector3f(direction.x,direction.y,direction.z); viewingAngle = direction.getAngle(); } diff --git a/engine/src/main/java/org/terasology/rendering/cameras/OpenVRStereoCamera.java b/engine/src/main/java/org/terasology/rendering/cameras/OpenVRStereoCamera.java index e3e0908a43e..542b25413b8 100644 --- a/engine/src/main/java/org/terasology/rendering/cameras/OpenVRStereoCamera.java +++ b/engine/src/main/java/org/terasology/rendering/cameras/OpenVRStereoCamera.java @@ -15,15 +15,15 @@ */ package org.terasology.rendering.cameras; +import org.joml.Matrix4f; import org.joml.Quaternionf; +import org.joml.Vector3f; import org.joml.Vector4f; import org.terasology.math.geom.Quat4f; import org.terasology.rendering.openvrprovider.OpenVRProvider; import org.lwjgl.opengl.GL11; import org.terasology.config.RenderingConfig; import org.terasology.math.MatrixUtils; -import org.terasology.math.geom.Matrix4f; -import org.terasology.math.geom.Vector3f; import org.terasology.registry.CoreRegistry; import org.terasology.rendering.openvrprovider.OpenVRUtil; import org.terasology.rendering.world.WorldRenderer; @@ -217,7 +217,7 @@ public void updateMatrices() { updateMatrices(activeFov); } - private void jomlMatrix4f(org.joml.Matrix4f matrixInput, org.terasology.math.geom.Matrix4f matrixOut) { + private void jomlMatrix4f(Matrix4f matrixInput, org.terasology.math.geom.Matrix4f matrixOut) { matrixOut.set(0, 0, matrixInput.m00()); matrixOut.set(0, 1, matrixInput.m10()); matrixOut.set(0, 2, matrixInput.m20()); @@ -240,10 +240,10 @@ private void jomlMatrix4f(org.joml.Matrix4f matrixInput, org.terasology.math.geo public void updateMatrices(float fov) { prevViewProjectionMatrix.set(viewProjectionMatrix); - org.joml.Matrix4f leftEyeProjection = vrProvider.getState().getEyeProjectionMatrix(0); - org.joml.Matrix4f rightEyeProjection = vrProvider.getState().getEyeProjectionMatrix(1); - org.joml.Matrix4f leftEyePose = vrProvider.getState().getEyePose(0); - org.joml.Matrix4f rightEyePose = vrProvider.getState().getEyePose(1); + Matrix4f leftEyeProjection = vrProvider.getState().getEyeProjectionMatrix(0); + Matrix4f rightEyeProjection = vrProvider.getState().getEyeProjectionMatrix(1); + Matrix4f leftEyePose = vrProvider.getState().getEyePose(0); + Matrix4f rightEyePose = vrProvider.getState().getEyePose(1); float halfIPD = (float) Math.sqrt(Math.pow(leftEyePose.m30() - rightEyePose.m30(), 2) + Math.pow(leftEyePose.m31() - rightEyePose.m31(), 2) + Math.pow(leftEyePose.m32() - rightEyePose.m32(), 2)) / 2.0f; @@ -261,36 +261,36 @@ public void updateMatrices(float fov) { if (Math.sqrt(Math.pow(leftEyePose.m30(), 2) + Math.pow(leftEyePose.m31(), 2) + Math.pow(leftEyePose.m32(), 2)) < 0.25) { return; } - jomlMatrix4f(leftEyeProjection, projectionMatrixLeftEye); - jomlMatrix4f(rightEyeProjection, projectionMatrixRightEye); + projectionMatrixLeftEye.set(leftEyeProjection); + projectionMatrixRightEye.set(rightEyeProjection); projectionMatrix = projectionMatrixLeftEye; - jomlMatrix4f(leftEyePose, viewMatrixLeftEye); - jomlMatrix4f(rightEyePose, viewMatrixRightEye); + viewMatrixLeftEye.set(leftEyePose); + viewMatrixRightEye.set(rightEyePose); viewMatrix = viewMatrixLeftEye; normViewMatrix = viewMatrixLeftEye; - reflectionMatrix.setRow(0, 1.0f, 0.0f, 0.0f, 0.0f); - reflectionMatrix.setRow(1, 0.0f, -1.0f, 0.0f, 2f * (-position.y + 32f)); - reflectionMatrix.setRow(2, 0.0f, 0.0f, 1.0f, 0.0f); - reflectionMatrix.setRow(3, 0.0f, 0.0f, 0.0f, 1.0f); + reflectionMatrix.setRow(0, new Vector4f(1.0f, 0.0f, 0.0f, 0.0f)); + reflectionMatrix.setRow(1, new Vector4f(0.0f, -1.0f, 0.0f, 2f * (-position.y + 32f))); + reflectionMatrix.setRow(2, new Vector4f(0.0f, 0.0f, 1.0f, 0.0f)); + reflectionMatrix.setRow(3, new Vector4f(0.0f, 0.0f, 0.0f, 1.0f)); - viewMatrixReflected.mul(viewMatrix, reflectionMatrix); + viewMatrix.mul(reflectionMatrix,viewMatrixReflected); - reflectionMatrix.setRow(1, 0.0f, -1.0f, 0.0f, 0.0f); + reflectionMatrix.setRow(1, new Vector4f(0.0f, -1.0f, 0.0f, 0.0f)); normViewMatrixReflected.mul(normViewMatrix, reflectionMatrix); - viewTranslationLeftEye.setIdentity(); + viewTranslationLeftEye.identity(); viewTranslationLeftEye.setTranslation(new Vector3f(halfIPD, 0.0f, 0.0f)); - viewTranslationRightEye.setIdentity(); + viewTranslationRightEye.identity(); viewTranslationRightEye.setTranslation(new Vector3f(-halfIPD, 0.0f, 0.0f)); - viewMatrixReflectedLeftEye.mul(viewMatrixReflected, viewTranslationLeftEye); - viewMatrixReflectedRightEye.mul(viewMatrixReflected, viewTranslationRightEye); + viewMatrixReflected.mul(viewTranslationLeftEye,viewMatrixReflectedLeftEye); + viewMatrixReflected.mul(viewTranslationRightEye,viewMatrixReflectedRightEye); viewProjectionMatrixLeftEye = MatrixUtils.calcViewProjectionMatrix(viewMatrixLeftEye, projectionMatrixLeftEye); viewProjectionMatrixRightEye = MatrixUtils.calcViewProjectionMatrix(viewMatrixRightEye, projectionMatrixRightEye); diff --git a/engine/src/main/java/org/terasology/rendering/cameras/OrthographicCamera.java b/engine/src/main/java/org/terasology/rendering/cameras/OrthographicCamera.java index 5ba8a84d638..c08d16d4f54 100644 --- a/engine/src/main/java/org/terasology/rendering/cameras/OrthographicCamera.java +++ b/engine/src/main/java/org/terasology/rendering/cameras/OrthographicCamera.java @@ -15,7 +15,9 @@ */ package org.terasology.rendering.cameras; +import org.joml.Matrix4f; import org.lwjgl.opengl.GL11; +import org.terasology.math.JomlUtil; import org.terasology.math.MatrixUtils; import static org.lwjgl.opengl.GL11.GL_PROJECTION; @@ -92,8 +94,9 @@ public void updateMatrices(float fov) { viewMatrix = MatrixUtils.createViewMatrix(0f, 0.0f, 0f, viewingDirection.x, viewingDirection.y, viewingDirection.z, up.x, up.y, up.z); normViewMatrix = MatrixUtils.createViewMatrix(0f, 0f, 0f, viewingDirection.x, viewingDirection.y, viewingDirection.z, up.x, up.y, up.z); - viewProjectionMatrix = MatrixUtils.calcViewProjectionMatrix(viewMatrix, projectionMatrix); - inverseViewProjectionMatrix.invert(viewProjectionMatrix); + + viewProjectionMatrix = new Matrix4f(viewMatrix).mul(projectionMatrix); + viewProjectionMatrix.invert(inverseViewProjectionMatrix); // Used for dirty checks cachedPosition.set(getPosition()); diff --git a/engine/src/main/java/org/terasology/rendering/cameras/PerspectiveCamera.java b/engine/src/main/java/org/terasology/rendering/cameras/PerspectiveCamera.java index d4ecb844527..469777616a6 100644 --- a/engine/src/main/java/org/terasology/rendering/cameras/PerspectiveCamera.java +++ b/engine/src/main/java/org/terasology/rendering/cameras/PerspectiveCamera.java @@ -15,13 +15,14 @@ */ package org.terasology.rendering.cameras; +import org.joml.Matrix4f; +import org.joml.Vector3f; +import org.joml.Vector4f; import org.lwjgl.opengl.GL11; import org.terasology.config.RenderingConfig; import org.terasology.engine.subsystem.DisplayDevice; import org.terasology.math.MatrixUtils; import org.terasology.math.TeraMath; -import org.terasology.math.geom.Matrix4f; -import org.terasology.math.geom.Vector3f; import org.terasology.rendering.nui.layers.mainMenu.videoSettings.CameraSetting; import org.terasology.world.WorldProvider; @@ -143,10 +144,10 @@ public void updateMatrices(float fov) { return; } - tempRightVector.cross(viewingDirection, up); - tempRightVector.scale(bobbingRotationOffsetFactor); + viewingDirection.cross(up,tempRightVector); + tempRightVector.mul(bobbingRotationOffsetFactor); - projectionMatrix = createPerspectiveProjectionMatrix(fov, getzNear(), getzFar(), this.displayDevice); + projectionMatrix = createPerspectiveProjectionMatrix(fov, getzNear(), getzFar(),this.displayDevice); viewMatrix = MatrixUtils.createViewMatrix(0f, bobbingVerticalOffsetFactor * 2.0f, 0f, viewingDirection.x, viewingDirection.y + bobbingVerticalOffsetFactor * 2.0f, viewingDirection.z, up.x + tempRightVector.x, up.y + tempRightVector.y, up.z + tempRightVector.z); @@ -154,19 +155,20 @@ public void updateMatrices(float fov) { normViewMatrix = MatrixUtils.createViewMatrix(0f, 0f, 0f, viewingDirection.x, viewingDirection.y, viewingDirection.z, up.x + tempRightVector.x, up.y + tempRightVector.y, up.z + tempRightVector.z); - reflectionMatrix.setRow(0, 1.0f, 0.0f, 0.0f, 0.0f); - reflectionMatrix.setRow(1, 0.0f, -1.0f, 0.0f, 2f * (-position.y + getReflectionHeight())); - reflectionMatrix.setRow(2, 0.0f, 0.0f, 1.0f, 0.0f); - reflectionMatrix.setRow(3, 0.0f, 0.0f, 0.0f, 1.0f); - viewMatrixReflected.mul(viewMatrix, reflectionMatrix); + reflectionMatrix.setColumn(0, new Vector4f(1.0f, 0.0f, 0.0f, 0.0f)); + reflectionMatrix.setColumn(1, new Vector4f(0.0f, -1.0f, 0.0f, 2f * (-position.y + getReflectionHeight()))); + reflectionMatrix.setColumn(2, new Vector4f(0.0f, 0.0f, 1.0f, 0.0f)); + reflectionMatrix.setColumn(3, new Vector4f(0.0f, 0.0f, 0.0f, 1.0f)); + reflectionMatrix.mul(viewMatrix, viewMatrixReflected); - reflectionMatrix.setRow(1, 0.0f, -1.0f, 0.0f, 0.0f); - normViewMatrixReflected.mul(normViewMatrix, reflectionMatrix); + reflectionMatrix.setColumn(1, new Vector4f(0.0f, -1.0f, 0.0f, 0.0f)); + reflectionMatrix.mul(normViewMatrix,normViewMatrixReflected); - viewProjectionMatrix = MatrixUtils.calcViewProjectionMatrix(viewMatrix, projectionMatrix); +// viewProjectionMatrix = MatrixUtils.calcViewProjectionMatrix(viewMatrix, projectionMatrix); + viewProjectionMatrix = new Matrix4f(viewMatrix).mul(projectionMatrix); - inverseProjectionMatrix.invert(projectionMatrix); - inverseViewProjectionMatrix.invert(viewProjectionMatrix); + projectionMatrix.invert(inverseProjectionMatrix); + viewProjectionMatrix.invert(inverseViewProjectionMatrix); // Used for dirty checks cachedPosition.set(getPosition()); @@ -191,7 +193,7 @@ public void setBobbingVerticalOffsetFactor(float f) { // TODO: Move the dependency on LWJGL (Display) elsewhere private static Matrix4f createPerspectiveProjectionMatrix(float fov, float zNear, float zFar, DisplayDevice displayDevice) { - float aspectRatio = (float) displayDevice.getDisplayWidth() / displayDevice.getDisplayHeight(); + float aspectRatio = (float) displayDevice.getDisplayWidth()/ displayDevice.getDisplayHeight(); float fovY = (float) (2 * Math.atan2(Math.tan(0.5 * fov * TeraMath.DEG_TO_RAD), aspectRatio)); return MatrixUtils.createPerspectiveProjectionMatrix(fovY, aspectRatio, zNear, zFar); diff --git a/engine/src/main/java/org/terasology/rendering/cameras/SubmersibleCamera.java b/engine/src/main/java/org/terasology/rendering/cameras/SubmersibleCamera.java index d455a1d8aa7..adbd6d9ef7a 100644 --- a/engine/src/main/java/org/terasology/rendering/cameras/SubmersibleCamera.java +++ b/engine/src/main/java/org/terasology/rendering/cameras/SubmersibleCamera.java @@ -16,6 +16,7 @@ package org.terasology.rendering.cameras; import org.terasology.config.RenderingConfig; +import org.terasology.math.JomlUtil; import org.terasology.math.geom.Vector3f; import org.terasology.rendering.RenderHelper; import org.terasology.world.WorldProvider; @@ -41,7 +42,7 @@ public SubmersibleCamera(WorldProvider worldProvider, RenderingConfig renderingC public boolean isUnderWater() { // TODO: Making this as a subscribable value especially for node "ChunksRefractiveReflectiveNode", // TODO: glDisable and glEnable state changes on that node will be dynamically added/removed based on this value. - Vector3f cameraPosition = new Vector3f(this.getPosition()); + Vector3f cameraPosition = new Vector3f(JomlUtil.from(this.getPosition())); // Compensate for waves if (renderingConfig.isAnimateWater()) { diff --git a/engine/src/main/java/org/terasology/rendering/dag/nodes/AlphaRejectBlocksNode.java b/engine/src/main/java/org/terasology/rendering/dag/nodes/AlphaRejectBlocksNode.java index 7fca682e413..7018e811921 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/nodes/AlphaRejectBlocksNode.java +++ b/engine/src/main/java/org/terasology/rendering/dag/nodes/AlphaRejectBlocksNode.java @@ -15,12 +15,13 @@ */ package org.terasology.rendering.dag.nodes; +import org.joml.Vector3f; import org.terasology.assets.ResourceUrn; import org.terasology.config.Config; import org.terasology.config.RenderingConfig; import org.terasology.config.RenderingDebugConfig; import org.terasology.context.Context; -import org.terasology.math.geom.Vector3f; +import org.terasology.math.JomlUtil; import org.terasology.monitoring.PerformanceMonitor; import org.terasology.rendering.assets.material.Material; import org.terasology.rendering.assets.shader.ShaderProgramFeature; @@ -178,7 +179,7 @@ public void process() { // Actual Node Processing - final Vector3f cameraPosition = activeCamera.getPosition(); + final org.joml.Vector3f cameraPosition = activeCamera.getPosition(); int numberOfRenderedTriangles = 0; int numberOfChunksThatAreNotReadyYet = 0; @@ -188,7 +189,7 @@ public void process() { if (chunk.hasMesh()) { final ChunkMesh chunkMesh = chunk.getMesh(); - final Vector3f chunkPosition = chunk.getPosition().toVector3f(); + final Vector3f chunkPosition = JomlUtil.from(chunk.getPosition().toVector3f()); chunkMesh.updateMaterial(chunkMaterial, chunkPosition, chunk.isAnimated()); numberOfRenderedTriangles += chunkMesh.render(ALPHA_REJECT, chunkPosition, cameraPosition); diff --git a/engine/src/main/java/org/terasology/rendering/dag/nodes/DeferredMainLightNode.java b/engine/src/main/java/org/terasology/rendering/dag/nodes/DeferredMainLightNode.java index 5d27b59c503..86d186ca353 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/nodes/DeferredMainLightNode.java +++ b/engine/src/main/java/org/terasology/rendering/dag/nodes/DeferredMainLightNode.java @@ -15,11 +15,12 @@ */ package org.terasology.rendering.dag.nodes; +import org.joml.Vector3f; import org.terasology.assets.ResourceUrn; import org.terasology.config.Config; import org.terasology.config.RenderingConfig; import org.terasology.context.Context; -import org.terasology.math.geom.Vector3f; +import org.terasology.math.JomlUtil; import org.terasology.monitoring.PerformanceMonitor; import org.terasology.rendering.assets.material.Material; import org.terasology.rendering.assets.shader.ShaderProgramFeature; @@ -149,9 +150,10 @@ public void process() { // Specific Shader Parameters cameraPosition = activeCamera.getPosition(); - activeCameraToLightSpace.sub(cameraPosition, lightCamera.getPosition()); - mainLightInViewSpace = backdropProvider.getSunDirection(true); - activeCamera.getViewMatrix().transformPoint(mainLightInViewSpace); + cameraPosition.sub(lightCamera.getPosition(),activeCameraToLightSpace); +// activeCameraToLightSpace.sub(cameraPosition, JomlUtil.from(lightCamera.getPosition())); + mainLightInViewSpace = JomlUtil.from(backdropProvider.getSunDirection(true)); + activeCamera.getViewMatrix().transformPosition(mainLightInViewSpace); // TODO: This is necessary right now because activateFeature removes all material parameters. // TODO: Remove this explicit binding once we get rid of activateFeature, or find a way to retain parameters through it. diff --git a/engine/src/main/java/org/terasology/rendering/dag/nodes/DeferredPointLightsNode.java b/engine/src/main/java/org/terasology/rendering/dag/nodes/DeferredPointLightsNode.java index e9461fff1db..e3c00cbdd45 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/nodes/DeferredPointLightsNode.java +++ b/engine/src/main/java/org/terasology/rendering/dag/nodes/DeferredPointLightsNode.java @@ -24,6 +24,7 @@ import org.terasology.entitySystem.entity.EntityManager; import org.terasology.entitySystem.entity.EntityRef; import org.terasology.logic.location.LocationComponent; +import org.terasology.math.JomlUtil; import org.terasology.math.geom.Matrix4f; import org.terasology.math.geom.Vector3f; import org.terasology.monitoring.PerformanceMonitor; @@ -158,7 +159,7 @@ public void process() { // Specific Shader Parameters - cameraPosition = activeCamera.getPosition(); + cameraPosition = JomlUtil.from(activeCamera.getPosition()); // TODO: This is necessary right now because activateFeature removes all material parameters. // TODO: Remove this explicit binding once we get rid of activateFeature, or find a way to retain parameters through it. @@ -176,7 +177,7 @@ public void process() { lightGeometryMaterial.setMatrix4("lightViewProjMatrix", lightCamera.getViewProjectionMatrix(), true); lightGeometryMaterial.setMatrix4("invViewProjMatrix", activeCamera.getInverseViewProjectionMatrix(), true); - activeCameraToLightSpace.sub(cameraPosition, lightCamera.getPosition()); + activeCameraToLightSpace.sub(cameraPosition, JomlUtil.from(lightCamera.getPosition())); lightGeometryMaterial.setFloat3("activeCameraToLightSpace", activeCameraToLightSpace.x, activeCameraToLightSpace.y, activeCameraToLightSpace.z, true); } @@ -190,7 +191,7 @@ public void process() { final Vector3f lightPositionInTeraCoords = locationComponent.getWorldPosition(); Vector3f lightPositionRelativeToCamera = new Vector3f(); - lightPositionRelativeToCamera.sub(lightPositionInTeraCoords, activeCamera.getPosition()); + lightPositionRelativeToCamera.sub(lightPositionInTeraCoords, JomlUtil.from(activeCamera.getPosition())); if (lightIsRenderable(lightComponent, lightPositionRelativeToCamera)) { lightGeometryMaterial.setCamera(activeCamera); @@ -207,7 +208,7 @@ public void process() { // setting shader parameters for the light position in camera space Vector3f lightPositionInViewSpace = new Vector3f(lightPositionRelativeToCamera); - activeCamera.getViewMatrix().transformPoint(lightPositionInViewSpace); + JomlUtil.from(activeCamera.getViewMatrix()).transformPoint(lightPositionInViewSpace); lightGeometryMaterial.setFloat3("lightViewPos", lightPositionInViewSpace.x, lightPositionInViewSpace.y, lightPositionInViewSpace.z, true); // set the size and location of the sphere to be rendered via shader parameters diff --git a/engine/src/main/java/org/terasology/rendering/dag/nodes/InitialPostProcessingNode.java b/engine/src/main/java/org/terasology/rendering/dag/nodes/InitialPostProcessingNode.java index 31470b78831..7ab402a8d3a 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/nodes/InitialPostProcessingNode.java +++ b/engine/src/main/java/org/terasology/rendering/dag/nodes/InitialPostProcessingNode.java @@ -20,6 +20,7 @@ import org.terasology.config.RenderingConfig; import org.terasology.context.Context; import org.terasology.engine.SimpleUri; +import org.terasology.math.JomlUtil; import org.terasology.monitoring.PerformanceMonitor; import org.terasology.rendering.assets.material.Material; import org.terasology.rendering.cameras.SubmersibleCamera; @@ -133,7 +134,7 @@ public void process() { // Shader Parameters - initialPostMaterial.setFloat3("inLiquidTint", worldProvider.getBlock(activeCamera.getPosition()).getTint(), true); + initialPostMaterial.setFloat3("inLiquidTint", worldProvider.getBlock(JomlUtil.from(activeCamera.getPosition())).getTint(), true); if (bloomIsEnabled) { initialPostMaterial.setFloat("bloomFactor", bloomFactor, true); diff --git a/engine/src/main/java/org/terasology/rendering/dag/nodes/LightShaftsNode.java b/engine/src/main/java/org/terasology/rendering/dag/nodes/LightShaftsNode.java index 6ea34228bb0..77578b78eaa 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/nodes/LightShaftsNode.java +++ b/engine/src/main/java/org/terasology/rendering/dag/nodes/LightShaftsNode.java @@ -15,13 +15,14 @@ */ package org.terasology.rendering.dag.nodes; +import org.joml.Vector3f; +import org.joml.Vector4f; import org.terasology.assets.ResourceUrn; import org.terasology.config.Config; import org.terasology.config.RenderingConfig; import org.terasology.context.Context; import org.terasology.engine.SimpleUri; -import org.terasology.math.geom.Vector3f; -import org.terasology.math.geom.Vector4f; +import org.terasology.math.JomlUtil; import org.terasology.monitoring.PerformanceMonitor; import org.terasology.rendering.assets.material.Material; import org.terasology.rendering.backdrop.BackdropProvider; @@ -129,10 +130,10 @@ public void process() { // This is a temporary solution to sun causing light shafts even at night. if (days < 0.25f || days > 0.75f) { - sunDirection = backdropProvider.getSunDirection(true); + sunDirection = JomlUtil.from(backdropProvider.getSunDirection(true)); exposure = exposureNight; } else { - sunDirection = backdropProvider.getSunDirection(false); + sunDirection = JomlUtil.from(backdropProvider.getSunDirection(false)); exposure = exposureDay; } diff --git a/engine/src/main/java/org/terasology/rendering/dag/nodes/OpaqueBlocksNode.java b/engine/src/main/java/org/terasology/rendering/dag/nodes/OpaqueBlocksNode.java index 24803ad58d2..2b70ea41135 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/nodes/OpaqueBlocksNode.java +++ b/engine/src/main/java/org/terasology/rendering/dag/nodes/OpaqueBlocksNode.java @@ -15,13 +15,15 @@ */ package org.terasology.rendering.dag.nodes; +import org.joml.Vector3f; +import org.joml.Vector3fc; import org.lwjgl.opengl.GL11; import org.terasology.assets.ResourceUrn; import org.terasology.config.Config; import org.terasology.config.RenderingConfig; import org.terasology.config.RenderingDebugConfig; import org.terasology.context.Context; -import org.terasology.math.geom.Vector3f; +import org.terasology.math.JomlUtil; import org.terasology.monitoring.PerformanceMonitor; import org.terasology.rendering.AABBRenderer; import org.terasology.rendering.assets.material.Material; @@ -182,7 +184,7 @@ public void process() { // Actual Node Processing - final Vector3f cameraPosition = activeCamera.getPosition(); + final org.joml.Vector3f cameraPosition = activeCamera.getPosition(); int numberOfRenderedTriangles = 0; int numberOfChunksThatAreNotReadyYet = 0; @@ -192,7 +194,7 @@ public void process() { if (chunk.hasMesh()) { final ChunkMesh chunkMesh = chunk.getMesh(); - final Vector3f chunkPosition = chunk.getPosition().toVector3f(); + final Vector3f chunkPosition = JomlUtil.from(chunk.getPosition().toVector3f()); chunkMesh.updateMaterial(chunkMaterial, chunkPosition, chunk.isAnimated()); numberOfRenderedTriangles += chunkMesh.render(OPAQUE, chunkPosition, cameraPosition); @@ -212,14 +214,14 @@ public void process() { PerformanceMonitor.endActivity(); } - private void renderChunkBoundingBox(RenderableChunk chunk, Vector3f chunkPosition, Vector3f cameraPosition) { + private void renderChunkBoundingBox(RenderableChunk chunk, Vector3f chunkPosition, Vector3fc cameraPosition) { GL11.glPushMatrix(); // chunkPositionRelativeToCamera = chunkCoordinates * chunkDimensions - cameraCoordinate final Vector3f chunkPositionRelativeToCamera = - new Vector3f(chunkPosition.x * ChunkConstants.SIZE_X - cameraPosition.x, - chunkPosition.y * ChunkConstants.SIZE_Y - cameraPosition.y, - chunkPosition.z * ChunkConstants.SIZE_Z - cameraPosition.z); + new Vector3f(chunkPosition.x * ChunkConstants.SIZE_X - cameraPosition.x(), + chunkPosition.y * ChunkConstants.SIZE_Y - cameraPosition.y(), + chunkPosition.z * ChunkConstants.SIZE_Z - cameraPosition.z()); GL11.glTranslatef(chunkPositionRelativeToCamera.x, chunkPositionRelativeToCamera.y, chunkPositionRelativeToCamera.z); new AABBRenderer(chunk.getAABB()).renderLocally(); diff --git a/engine/src/main/java/org/terasology/rendering/dag/nodes/RefractiveReflectiveBlocksNode.java b/engine/src/main/java/org/terasology/rendering/dag/nodes/RefractiveReflectiveBlocksNode.java index 368a08c1c2a..e4b859c6854 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/nodes/RefractiveReflectiveBlocksNode.java +++ b/engine/src/main/java/org/terasology/rendering/dag/nodes/RefractiveReflectiveBlocksNode.java @@ -15,12 +15,13 @@ */ package org.terasology.rendering.dag.nodes; +import org.joml.Vector3f; import org.terasology.assets.ResourceUrn; import org.terasology.config.Config; import org.terasology.config.RenderingConfig; import org.terasology.context.Context; import org.terasology.engine.SimpleUri; -import org.terasology.math.geom.Vector3f; +import org.terasology.math.JomlUtil; import org.terasology.monitoring.PerformanceMonitor; import org.terasology.rendering.assets.material.Material; import org.terasology.rendering.assets.shader.ShaderProgramFeature; @@ -95,7 +96,7 @@ public class RefractiveReflectiveBlocksNode extends AbstractNode implements Prop public static float waterOffsetY; private static final ResourceUrn CHUNK_MATERIAL_URN = new ResourceUrn("engine:prog.chunk"); - + private RenderQueuesHelper renderQueues; private WorldRenderer worldRenderer; private BackdropProvider backdropProvider; @@ -217,7 +218,7 @@ public void process() { // Common Shader Parameters - sunDirection = backdropProvider.getSunDirection(false); + sunDirection = JomlUtil.from(backdropProvider.getSunDirection(false)); chunkMaterial.setFloat("daylight", backdropProvider.getDaylight(), true); chunkMaterial.setFloat("swimming", activeCamera.isUnderWater() ? 1.0f : 0.0f, true); @@ -270,7 +271,7 @@ public void process() { if (chunk.hasMesh()) { final ChunkMesh chunkMesh = chunk.getMesh(); - final Vector3f chunkPosition = chunk.getPosition().toVector3f(); + final Vector3f chunkPosition = new Vector3f(JomlUtil.from(chunk.getPosition())); chunkMesh.updateMaterial(chunkMaterial, chunkPosition, chunk.isAnimated()); numberOfRenderedTriangles += chunkMesh.render(REFRACTIVE, chunkPosition, cameraPosition); diff --git a/engine/src/main/java/org/terasology/rendering/dag/nodes/ShadowMapNode.java b/engine/src/main/java/org/terasology/rendering/dag/nodes/ShadowMapNode.java index b2ecb88339b..6b3ded98cf4 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/nodes/ShadowMapNode.java +++ b/engine/src/main/java/org/terasology/rendering/dag/nodes/ShadowMapNode.java @@ -15,13 +15,14 @@ */ package org.terasology.rendering.dag.nodes; +import org.joml.Vector3f; import org.terasology.assets.ResourceUrn; import org.terasology.config.Config; import org.terasology.config.RenderingConfig; import org.terasology.context.Context; import org.terasology.engine.SimpleUri; +import org.terasology.math.JomlUtil; import org.terasology.math.TeraMath; -import org.terasology.math.geom.Vector3f; import org.terasology.monitoring.PerformanceMonitor; import org.terasology.rendering.backdrop.BackdropProvider; import org.terasology.rendering.cameras.Camera; @@ -167,7 +168,7 @@ public void process() { if (chunk.hasMesh()) { final ChunkMesh chunkMesh = chunk.getMesh(); - final Vector3f chunkPosition = chunk.getPosition().toVector3f(); + final Vector3f chunkPosition = new Vector3f(JomlUtil.from(chunk.getPosition())); numberOfRenderedTriangles += chunkMesh.render(OPAQUE, chunkPosition, cameraPosition); @@ -189,10 +190,10 @@ private void positionShadowMapCamera() { // The shadow projected onto the ground must move in in light-space texel-steps, to avoid causing flickering. // That's why we first convert it to the previous frame's light-space coordinates and then back to world-space. - shadowMapCamera.getViewProjectionMatrix().transformPoint(mainLightPosition); // to light-space + shadowMapCamera.getViewProjectionMatrix().transformPosition(mainLightPosition); // to light-space mainLightPosition.set(TeraMath.fastFloor(mainLightPosition.x / texelSize) * texelSize, 0.0f, TeraMath.fastFloor(mainLightPosition.z / texelSize) * texelSize); - shadowMapCamera.getInverseViewProjectionMatrix().transformPoint(mainLightPosition); // back to world-space + shadowMapCamera.getInverseViewProjectionMatrix().transformPosition(mainLightPosition); // back to world-space // This is what causes the shadow map to change infrequently, to prevent flickering. // Notice that this is different from what is done above, which is about spatial steps @@ -201,13 +202,13 @@ private void positionShadowMapCamera() { // The shadow map camera is placed away from the player, in the direction of the main light. Vector3f offsetFromPlayer = new Vector3f(quantizedMainLightDirection); - offsetFromPlayer.scale(256.0f + 64.0f); // these hardcoded numbers are another mystery. + offsetFromPlayer.mul(256.0f + 64.0f); // these hardcoded numbers are another mystery. mainLightPosition.add(offsetFromPlayer); shadowMapCamera.getPosition().set(mainLightPosition); // Finally, we adjust the shadow map camera to look toward the player Vector3f fromLightToPlayerDirection = new Vector3f(quantizedMainLightDirection); - fromLightToPlayerDirection.scale(-1.0f); + fromLightToPlayerDirection.mul(-1.0f); shadowMapCamera.getViewingDirection().set(fromLightToPlayerDirection); shadowMapCamera.update(worldRenderer.getSecondsSinceLastFrame()); @@ -219,7 +220,7 @@ private Vector3f getQuantizedMainLightDirection(float stepSize) { // When the sun goes under the horizon we flip the vector, to provide the moon direction, and viceversa. if (mainLightDirection.y < 0.0f) { - mainLightDirection.scale(-1.0f); + mainLightDirection.mul(-1.0f); } return mainLightDirection; diff --git a/engine/src/main/java/org/terasology/rendering/dag/nodes/WorldReflectionNode.java b/engine/src/main/java/org/terasology/rendering/dag/nodes/WorldReflectionNode.java index f7b22f2e8d0..c2fc76e3717 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/nodes/WorldReflectionNode.java +++ b/engine/src/main/java/org/terasology/rendering/dag/nodes/WorldReflectionNode.java @@ -15,11 +15,12 @@ */ package org.terasology.rendering.dag.nodes; +import org.joml.Vector3f; import org.terasology.assets.ResourceUrn; import org.terasology.config.Config; import org.terasology.config.RenderingConfig; import org.terasology.context.Context; -import org.terasology.math.geom.Vector3f; +import org.terasology.math.JomlUtil; import org.terasology.monitoring.PerformanceMonitor; import org.terasology.rendering.assets.material.Material; import org.terasology.rendering.assets.shader.ShaderProgramFeature; @@ -192,7 +193,7 @@ public void process() { if (chunk.hasMesh()) { final ChunkMesh chunkMesh = chunk.getMesh(); - final Vector3f chunkPosition = chunk.getPosition().toVector3f(); + final Vector3f chunkPosition = JomlUtil.from(chunk.getPosition().toVector3f()); chunkMesh.updateMaterial(chunkMaterial, chunkPosition, chunk.isAnimated()); numberOfRenderedTriangles += chunkMesh.render(OPAQUE, chunkPosition, cameraPosition); diff --git a/engine/src/main/java/org/terasology/rendering/logic/FloatingTextRenderer.java b/engine/src/main/java/org/terasology/rendering/logic/FloatingTextRenderer.java index a828baf0fc5..51fe3f44c2e 100644 --- a/engine/src/main/java/org/terasology/rendering/logic/FloatingTextRenderer.java +++ b/engine/src/main/java/org/terasology/rendering/logic/FloatingTextRenderer.java @@ -28,6 +28,7 @@ import org.terasology.entitySystem.systems.RegisterSystem; import org.terasology.entitySystem.systems.RenderSystem; import org.terasology.logic.location.LocationComponent; +import org.terasology.math.JomlUtil; import org.terasology.math.geom.Vector3f; import org.terasology.registry.In; import org.terasology.rendering.assets.font.Font; @@ -82,7 +83,7 @@ public void initialise() { } private void render(Iterable floatingTextEntities) { - Vector3f cameraPosition = camera.getPosition(); + Vector3f cameraPosition = JomlUtil.from(camera.getPosition()); for (EntityRef entity : floatingTextEntities) { LocationComponent location = entity.getComponent(LocationComponent.class); diff --git a/engine/src/main/java/org/terasology/rendering/logic/MeshRenderer.java b/engine/src/main/java/org/terasology/rendering/logic/MeshRenderer.java index 13c9e878da4..1b2bd77497e 100644 --- a/engine/src/main/java/org/terasology/rendering/logic/MeshRenderer.java +++ b/engine/src/main/java/org/terasology/rendering/logic/MeshRenderer.java @@ -15,6 +15,7 @@ */ package org.terasology.rendering.logic; +import org.terasology.math.JomlUtil; import org.terasology.math.Transform; import com.google.common.collect.HashMultimap; import com.google.common.collect.SetMultimap; @@ -167,7 +168,7 @@ private void renderEntities(Iterable entityRefs) { } private void renderEntitiesByMaterial(SetMultimap meshByMaterial) { - Vector3f cameraPosition = worldRenderer.getActiveCamera().getPosition(); + Vector3f cameraPosition = JomlUtil.from(worldRenderer.getActiveCamera().getPosition()); Quat4f worldRot = new Quat4f(); Vector3f worldPos = new Vector3f(); @@ -218,7 +219,7 @@ private void renderEntitiesByMaterial(SetMultimap meshByMat lastMesh.preRender(); } - Matrix4f modelViewMatrix = MatrixUtils.calcModelViewMatrix(worldRenderer.getActiveCamera().getViewMatrix(), matrixCameraSpace); + Matrix4f modelViewMatrix = MatrixUtils.calcModelViewMatrix(JomlUtil.from(worldRenderer.getActiveCamera().getViewMatrix()), matrixCameraSpace); MatrixUtils.matrixToFloatBuffer(modelViewMatrix, tempMatrixBuffer44); MatrixUtils.matrixToFloatBuffer(MatrixUtils.calcNormalMatrix(modelViewMatrix), tempMatrixBuffer33); diff --git a/engine/src/main/java/org/terasology/rendering/logic/NearestSortingList.java b/engine/src/main/java/org/terasology/rendering/logic/NearestSortingList.java index 92d6fdd4ac6..e6949c7fbdc 100644 --- a/engine/src/main/java/org/terasology/rendering/logic/NearestSortingList.java +++ b/engine/src/main/java/org/terasology/rendering/logic/NearestSortingList.java @@ -21,6 +21,7 @@ import org.terasology.entitySystem.entity.EntityRef; import org.terasology.logic.location.DistanceComparator; import org.terasology.logic.location.LocationComponent; +import org.terasology.math.JomlUtil; import org.terasology.rendering.cameras.Camera; import java.util.Collections; @@ -433,7 +434,7 @@ public void run() { * with the other operations on this container. */ private void sort() { - comparator.setOrigin(originCamera.getPosition()); + comparator.setOrigin(JomlUtil.from(originCamera.getPosition())); if (!commands.isEmpty()) { logger.warn("The commands list was not emptied properly!"); commands.clear(); diff --git a/engine/src/main/java/org/terasology/rendering/logic/RegionOutlineRenderer.java b/engine/src/main/java/org/terasology/rendering/logic/RegionOutlineRenderer.java index ccc6ab62afe..0d906ac2837 100644 --- a/engine/src/main/java/org/terasology/rendering/logic/RegionOutlineRenderer.java +++ b/engine/src/main/java/org/terasology/rendering/logic/RegionOutlineRenderer.java @@ -30,6 +30,7 @@ import org.terasology.entitySystem.systems.RegisterMode; import org.terasology.entitySystem.systems.RegisterSystem; import org.terasology.entitySystem.systems.RenderSystem; +import org.terasology.math.JomlUtil; import org.terasology.math.MatrixUtils; import org.terasology.math.Region3i; import org.terasology.math.geom.Matrix4f; @@ -95,7 +96,7 @@ public void renderOverlay() { return; // skip everything if there is nothing to do to avoid possibly costly draw mode changes } glDisable(GL_DEPTH_TEST); - Vector3f cameraPosition = worldRenderer.getActiveCamera().getPosition(); + Vector3f cameraPosition = JomlUtil.from(worldRenderer.getActiveCamera().getPosition()); FloatBuffer tempMatrixBuffer44 = BufferUtils.createFloatBuffer(16); FloatBuffer tempMatrixBuffer33 = BufferUtils.createFloatBuffer(12); @@ -110,7 +111,7 @@ public void renderOverlay() { Matrix4f matrixCameraSpace = new Matrix4f(new Quat4f(0, 0, 0, 1), worldPositionCameraSpace, 1.0f); - Matrix4f modelViewMatrix = MatrixUtils.calcModelViewMatrix(worldRenderer.getActiveCamera().getViewMatrix(), matrixCameraSpace); + Matrix4f modelViewMatrix = MatrixUtils.calcModelViewMatrix(JomlUtil.from(worldRenderer.getActiveCamera().getViewMatrix()), matrixCameraSpace); MatrixUtils.matrixToFloatBuffer(modelViewMatrix, tempMatrixBuffer44); material.setMatrix4("worldViewMatrix", tempMatrixBuffer44, true); diff --git a/engine/src/main/java/org/terasology/rendering/logic/SkeletonRenderer.java b/engine/src/main/java/org/terasology/rendering/logic/SkeletonRenderer.java index 1a5d65e92ae..f0ba9dd080d 100644 --- a/engine/src/main/java/org/terasology/rendering/logic/SkeletonRenderer.java +++ b/engine/src/main/java/org/terasology/rendering/logic/SkeletonRenderer.java @@ -35,6 +35,7 @@ import org.terasology.logic.location.Location; import org.terasology.logic.location.LocationComponent; import org.terasology.math.AABB; +import org.terasology.math.JomlUtil; import org.terasology.math.MatrixUtils; import org.terasology.math.geom.BaseQuat4f; import org.terasology.math.geom.BaseVector3f; @@ -209,7 +210,7 @@ private void updateSkeleton(SkeletalMeshComponent skeletalMeshComp, MeshAnimatio @Override public void renderOpaque() { - Vector3f cameraPosition = worldRenderer.getActiveCamera().getPosition(); + Vector3f cameraPosition = JomlUtil.from(worldRenderer.getActiveCamera().getPosition()); Quat4f worldRot = new Quat4f(); Vector3f worldPos = new Vector3f(); @@ -258,7 +259,7 @@ public void renderOpaque() { Matrix4f matrixCameraSpace = new Matrix4f(worldRot, worldPositionCameraSpace, worldScale); - Matrix4f modelViewMatrix = MatrixUtils.calcModelViewMatrix(worldRenderer.getActiveCamera().getViewMatrix(), matrixCameraSpace); + Matrix4f modelViewMatrix = MatrixUtils.calcModelViewMatrix(JomlUtil.from(worldRenderer.getActiveCamera().getViewMatrix()), matrixCameraSpace); MatrixUtils.matrixToFloatBuffer(modelViewMatrix, tempMatrixBuffer44); skeletalMesh.material.setMatrix4("worldViewMatrix", tempMatrixBuffer44, true); @@ -304,7 +305,7 @@ public void renderAlphaBlend() { public void renderOverlay() { if (config.getRendering().getDebug().isRenderSkeletons()) { glDisable(GL_DEPTH_TEST); - Vector3f cameraPosition = worldRenderer.getActiveCamera().getPosition(); + Vector3f cameraPosition = JomlUtil.from(worldRenderer.getActiveCamera().getPosition()); Material material = Assets.getMaterial("engine:white").get(); material.setFloat("sunlight", 1.0f, true); material.setFloat("blockLight", 1.0f, true); @@ -326,7 +327,7 @@ public void renderOverlay() { float worldScale = location.getWorldScale(); Matrix4f matrixCameraSpace = new Matrix4f(new Quat4f(0, 0, 0, 1), worldPositionCameraSpace, worldScale); - Matrix4f modelViewMatrix = MatrixUtils.calcModelViewMatrix(worldRenderer.getActiveCamera().getViewMatrix(), matrixCameraSpace); + Matrix4f modelViewMatrix = MatrixUtils.calcModelViewMatrix(JomlUtil.from(worldRenderer.getActiveCamera().getViewMatrix()), matrixCameraSpace); MatrixUtils.matrixToFloatBuffer(modelViewMatrix, tempMatrixBuffer44); material.setMatrix4("worldViewMatrix", tempMatrixBuffer44, true); diff --git a/engine/src/main/java/org/terasology/rendering/opengl/GLSLMaterial.java b/engine/src/main/java/org/terasology/rendering/opengl/GLSLMaterial.java index c8ce89d81b8..6cde71408ff 100644 --- a/engine/src/main/java/org/terasology/rendering/opengl/GLSLMaterial.java +++ b/engine/src/main/java/org/terasology/rendering/opengl/GLSLMaterial.java @@ -25,6 +25,8 @@ import gnu.trove.map.hash.TIntIntHashMap; import gnu.trove.map.hash.TIntObjectHashMap; import gnu.trove.map.hash.TObjectIntHashMap; +import org.joml.Matrix3fc; +import org.joml.Matrix4fc; import org.lwjgl.opengl.GL13; import org.lwjgl.opengl.GL20; import org.slf4j.Logger; @@ -503,6 +505,29 @@ public void setMatrix3(String desc, Matrix3f value, boolean currentOnly) { } } + @Override + public void setMatrix3(String desc, Matrix3fc value, boolean currentOnly) { + if (isDisposed()) { + return; + } + if (currentOnly) { + enable(); + int id = getUniformLocation(getActiveShaderProgramId(), desc); + GL20.glUniformMatrix3(id, false, MatrixUtils.matrixToFloatBuffer(value)); + } else { + TIntIntIterator it = disposalAction.shaderPrograms.iterator(); + while (it.hasNext()) { + it.advance(); + + GL20.glUseProgram(it.value()); + int id = getUniformLocation(it.value(), desc); + GL20.glUniformMatrix3(id, false, MatrixUtils.matrixToFloatBuffer(value)); + } + + restoreStateAfterUniformsSet(); + } + } + @Override public void setMatrix3(String desc, FloatBuffer value, boolean currentOnly) { if (isDisposed()) { @@ -549,6 +574,29 @@ public void setMatrix4(String desc, Matrix4f value, boolean currentOnly) { } } + @Override + public void setMatrix4(String desc, Matrix4fc value, boolean currentOnly) { + if (isDisposed()) { + return; + } + if (currentOnly) { + enable(); + int id = getUniformLocation(getActiveShaderProgramId(), desc); + GL20.glUniformMatrix4(id, false, MatrixUtils.matrixToFloatBuffer(value)); + } else { + TIntIntIterator it = disposalAction.shaderPrograms.iterator(); + while (it.hasNext()) { + it.advance(); + + GL20.glUseProgram(it.value()); + int id = getUniformLocation(it.value(), desc); + GL20.glUniformMatrix4(id, false, MatrixUtils.matrixToFloatBuffer(value)); + } + + restoreStateAfterUniformsSet(); + } + } + @Override public void setMatrix4(String desc, FloatBuffer value, boolean currentOnly) { if (isDisposed()) { @@ -653,6 +701,4 @@ public void run() { } } } - - } diff --git a/engine/src/main/java/org/terasology/rendering/opengl/GLSLShader.java b/engine/src/main/java/org/terasology/rendering/opengl/GLSLShader.java index 3fdfb5fc85f..d0d85649f4e 100644 --- a/engine/src/main/java/org/terasology/rendering/opengl/GLSLShader.java +++ b/engine/src/main/java/org/terasology/rendering/opengl/GLSLShader.java @@ -265,6 +265,9 @@ private void registerAllShaderPermutations() { disposalAction.fragmentPrograms.put(featureHash, fragShaderId); disposalAction.vertexPrograms.put(featureHash, vertShaderId); } else { + dumpCode(GL20.GL_FRAGMENT_SHADER,permutation,assembleShader(GL20.GL_FRAGMENT_SHADER,permutation)); + dumpCode(GL20.GL_VERTEX_SHADER,permutation,assembleShader(GL20.GL_VERTEX_SHADER,permutation)); + throw new RuntimeException(String.format("Shader '%s' failed to compile for features '%s'.%n%n" + "Vertex Shader Info: %n%s%n" + "Fragment Shader Info: %n%s", @@ -317,6 +320,7 @@ private void dumpCode(int type, Set features, String sourc // example: fragment_shader-engine-font_0.glsl String fname = debugShaderType.toLowerCase() + "_" + strippedTitle + "_" + featureHash + ".glsl"; Path path = PathManager.getInstance().getShaderLogPath().resolve(fname); + logger.info("Dumped Shader Path: {}", path); try (BufferedWriter writer = Files.newBufferedWriter(path, TerasologyConstants.CHARSET)) { writer.write(sourceCode); } catch (IOException e) { diff --git a/engine/src/main/java/org/terasology/rendering/primitives/ChunkMesh.java b/engine/src/main/java/org/terasology/rendering/primitives/ChunkMesh.java index f0dc0764e30..ceefb101aea 100644 --- a/engine/src/main/java/org/terasology/rendering/primitives/ChunkMesh.java +++ b/engine/src/main/java/org/terasology/rendering/primitives/ChunkMesh.java @@ -20,6 +20,7 @@ import gnu.trove.list.TIntList; import gnu.trove.list.array.TFloatArrayList; import gnu.trove.list.array.TIntArrayList; +import org.joml.Vector3fc; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL13; import org.lwjgl.opengl.GL15; @@ -232,11 +233,11 @@ private void renderVbo(int id) { * @param chunkPosition a Vector3f instance holding the world coordinates of a chunk * @param chunkIsAnimated a boolean: true if the chunk is animated, false otherwise */ - public void updateMaterial(Material chunkMaterial, Vector3f chunkPosition, boolean chunkIsAnimated) { + public void updateMaterial(Material chunkMaterial, Vector3fc chunkPosition, boolean chunkIsAnimated) { chunkMaterial.setFloat3("chunkPositionWorld", - chunkPosition.x * ChunkConstants.SIZE_X, - chunkPosition.y * ChunkConstants.SIZE_Y, - chunkPosition.z * ChunkConstants.SIZE_Z, + chunkPosition.x() * ChunkConstants.SIZE_X, + chunkPosition.y() * ChunkConstants.SIZE_Y, + chunkPosition.z() * ChunkConstants.SIZE_Z, true); chunkMaterial.setFloat("animated", chunkIsAnimated ? 1.0f : 0.0f, true); } @@ -250,14 +251,14 @@ public void updateMaterial(Material chunkMaterial, Vector3f chunkPosition, boole * @param cameraPosition a Vector3f storing the world position of the point of view from which the chunk is rendered. * @return Returns an integer representing the number of triangles rendered. */ - public int render(ChunkMesh.RenderPhase phase, Vector3f chunkPosition, Vector3f cameraPosition) { + public int render(ChunkMesh.RenderPhase phase, Vector3fc chunkPosition, Vector3fc cameraPosition) { GL11.glPushMatrix(); // chunkPositionRelativeToCamera = chunkCoordinates * chunkDimensions - cameraCoordinate final Vector3f chunkPositionRelativeToCamera = - new Vector3f(chunkPosition.x * ChunkConstants.SIZE_X - cameraPosition.x, - chunkPosition.y * ChunkConstants.SIZE_Y - cameraPosition.y, - chunkPosition.z * ChunkConstants.SIZE_Z - cameraPosition.z); + new Vector3f(chunkPosition.x() * ChunkConstants.SIZE_X - cameraPosition.x(), + chunkPosition.y() * ChunkConstants.SIZE_Y - cameraPosition.y(), + chunkPosition.z() * ChunkConstants.SIZE_Z - cameraPosition.z()); GL11.glTranslatef(chunkPositionRelativeToCamera.x, chunkPositionRelativeToCamera.y, chunkPositionRelativeToCamera.z); render(phase); // this is where the chunk is actually rendered diff --git a/engine/src/main/java/org/terasology/rendering/world/RenderableWorldImpl.java b/engine/src/main/java/org/terasology/rendering/world/RenderableWorldImpl.java index a39fd59fc6c..6fbbd0778f4 100644 --- a/engine/src/main/java/org/terasology/rendering/world/RenderableWorldImpl.java +++ b/engine/src/main/java/org/terasology/rendering/world/RenderableWorldImpl.java @@ -22,6 +22,7 @@ import org.terasology.config.Config; import org.terasology.config.RenderingConfig; import org.terasology.engine.subsystem.lwjgl.GLBufferPool; +import org.terasology.math.JomlUtil; import org.terasology.math.Region3i; import org.terasology.math.TeraMath; import org.terasology.math.geom.Vector3f; @@ -264,17 +265,17 @@ private Region3i calculateRenderableRegion(ViewDistance newViewDistance) { * @return The player offset chunk */ private Vector3i calcCameraCoordinatesInChunkUnits() { - Vector3f cameraCoordinates = playerCamera.getPosition(); - return new Vector3i((int) (cameraCoordinates.x / ChunkConstants.SIZE_X), - (int) (cameraCoordinates.y / ChunkConstants.SIZE_Y), - (int) (cameraCoordinates.z / ChunkConstants.SIZE_Z)); + org.joml.Vector3f cameraCoordinates = playerCamera.getPosition(); + return new Vector3i((int) (cameraCoordinates.x() / ChunkConstants.SIZE_X), + (int) (cameraCoordinates.y() / ChunkConstants.SIZE_Y), + (int) (cameraCoordinates.z() / ChunkConstants.SIZE_Z)); } @Override public void generateVBOs() { PerformanceMonitor.startActivity("Building Mesh VBOs"); ChunkMesh pendingMesh; - chunkMeshUpdateManager.setCameraPosition(playerCamera.getPosition()); + chunkMeshUpdateManager.setCameraPosition(JomlUtil.from(playerCamera.getPosition())); for (RenderableChunk chunk : chunkMeshUpdateManager.availableChunksForUpdate()) { if (chunk.hasPendingMesh() && chunksInProximityOfCamera.contains(chunk)) { @@ -460,7 +461,7 @@ private static class ChunkFrontToBackComparator implements Comparator