Move view-model matrix computation to the CPU
This commit is contained in:
@@ -23,8 +23,7 @@ public class DefaultRenderer implements Renderer {
|
|||||||
shaderManager
|
shaderManager
|
||||||
.createShader("default", "/shaders/default.vs", "/shaders/default.fs")
|
.createShader("default", "/shaders/default.vs", "/shaders/default.fs")
|
||||||
.selectShader("default")
|
.selectShader("default")
|
||||||
.createUniform(UniformName.UNI_MODEL_MATRIX)
|
.createUniform(UniformName.UNI_VIEW_MODEL_MATRIX)
|
||||||
.createUniform(UniformName.UNI_VIEW_MATRIX)
|
|
||||||
.createUniform(UniformName.UNI_PROJECTION_MATRIX)
|
.createUniform(UniformName.UNI_PROJECTION_MATRIX)
|
||||||
.createUniform(UniformName.UNI_OBJECT_COLOR)
|
.createUniform(UniformName.UNI_OBJECT_COLOR)
|
||||||
.createUniform(UniformName.UNI_HAS_OBJECT_TEXTURE)
|
.createUniform(UniformName.UNI_HAS_OBJECT_TEXTURE)
|
||||||
@@ -40,6 +39,10 @@ public class DefaultRenderer implements Renderer {
|
|||||||
|
|
||||||
shaderManager.selectShader("default").useSelectedShader();
|
shaderManager.selectShader("default").useSelectedShader();
|
||||||
|
|
||||||
|
// Important note:
|
||||||
|
// The camera render method must be invoked **before** each consecutive item renders
|
||||||
|
// due to the fact, that the method updates projection and view matrices, that
|
||||||
|
// are used to compute proper vertex coordinates of rendered objects (renderables).
|
||||||
camera.render(window, shaderManager);
|
camera.render(window, shaderManager);
|
||||||
renderable.render(window, camera, shaderManager);
|
renderable.render(window, camera, shaderManager);
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
package com.bartlomiejpluta.base.core.gl.shader.constant;
|
package com.bartlomiejpluta.base.core.gl.shader.constant;
|
||||||
|
|
||||||
public interface UniformName {
|
public interface UniformName {
|
||||||
String UNI_MODEL_MATRIX = "modelMatrix";
|
String UNI_VIEW_MODEL_MATRIX = "viewModelMatrix";
|
||||||
String UNI_VIEW_MATRIX = "viewMatrix";
|
|
||||||
String UNI_PROJECTION_MATRIX = "projectionMatrix";
|
String UNI_PROJECTION_MATRIX = "projectionMatrix";
|
||||||
String UNI_OBJECT_COLOR = "objectColor";
|
String UNI_OBJECT_COLOR = "objectColor";
|
||||||
String UNI_HAS_OBJECT_TEXTURE = "hasTexture";
|
String UNI_HAS_OBJECT_TEXTURE = "hasTexture";
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.bartlomiejpluta.base.core.world.camera;
|
package com.bartlomiejpluta.base.core.world.camera;
|
||||||
|
|
||||||
import com.bartlomiejpluta.base.core.gl.render.Renderable;
|
|
||||||
import com.bartlomiejpluta.base.core.gl.shader.constant.UniformName;
|
import com.bartlomiejpluta.base.core.gl.shader.constant.UniformName;
|
||||||
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
|
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
|
||||||
import com.bartlomiejpluta.base.core.ui.Window;
|
import com.bartlomiejpluta.base.core.ui.Window;
|
||||||
@@ -11,20 +10,20 @@ public class Camera extends PositionableObject {
|
|||||||
private final Matrix4f projectionMatrix = new Matrix4f();
|
private final Matrix4f projectionMatrix = new Matrix4f();
|
||||||
private final Matrix4f viewMatrix = new Matrix4f();
|
private final Matrix4f viewMatrix = new Matrix4f();
|
||||||
|
|
||||||
public Matrix4f getProjectionMatrix(Window window) {
|
public Matrix4f computeViewModelMatrix(Matrix4f modelMatrix) {
|
||||||
return projectionMatrix
|
return new Matrix4f(viewMatrix).mul(modelMatrix);
|
||||||
.identity()
|
|
||||||
.setOrtho2D(0, window.getWidth(), window.getHeight(), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Matrix4f getViewMatrix() {
|
|
||||||
return viewMatrix
|
|
||||||
.identity()
|
|
||||||
.translate(-position.x, -position.y, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void render(Window window, ShaderManager shaderManager) {
|
public void render(Window window, ShaderManager shaderManager) {
|
||||||
shaderManager.setUniform(UniformName.UNI_PROJECTION_MATRIX, getProjectionMatrix(window));
|
// Update matrices
|
||||||
shaderManager.setUniform(UniformName.UNI_VIEW_MATRIX, getViewMatrix());
|
projectionMatrix
|
||||||
|
.identity()
|
||||||
|
.setOrtho2D(0, window.getWidth(), window.getHeight(), 0);
|
||||||
|
|
||||||
|
viewMatrix
|
||||||
|
.identity()
|
||||||
|
.translate(-position.x, -position.y, 0);
|
||||||
|
|
||||||
|
shaderManager.setUniform(UniformName.UNI_PROJECTION_MATRIX, projectionMatrix);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ public class ImageLayer implements Layer {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
shaderManager.setUniform(UniformName.UNI_MODEL_MATRIX, image.getModelMatrix());
|
shaderManager.setUniform(UniformName.UNI_VIEW_MODEL_MATRIX, camera.computeViewModelMatrix(image.getModelMatrix()));
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case FIT_SCREEN -> image.setScale(window.getWidth() / imageInitialWidth, window.getHeight() / imageInitialHeight);
|
case FIT_SCREEN -> image.setScale(window.getWidth() / imageInitialWidth, window.getHeight() / imageInitialHeight);
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ public abstract class RenderableObject extends PositionableObject implements Ren
|
|||||||
public void render(Window window, Camera camera, ShaderManager shaderManager) {
|
public void render(Window window, Camera camera, ShaderManager shaderManager) {
|
||||||
material.activateTextureIfExists();
|
material.activateTextureIfExists();
|
||||||
|
|
||||||
shaderManager.setUniform(UniformName.UNI_MODEL_MATRIX, getModelMatrix());
|
shaderManager.setUniform(UniformName.UNI_VIEW_MODEL_MATRIX, camera.computeViewModelMatrix(getModelMatrix()));
|
||||||
shaderManager.setUniform(UniformName.UNI_OBJECT_COLOR, material.getColor());
|
shaderManager.setUniform(UniformName.UNI_OBJECT_COLOR, material.getColor());
|
||||||
shaderManager.setUniform(UniformName.UNI_HAS_OBJECT_TEXTURE, material.hasTexture());
|
shaderManager.setUniform(UniformName.UNI_HAS_OBJECT_TEXTURE, material.hasTexture());
|
||||||
shaderManager.setUniform(UniformName.UNI_TEXTURE_SAMPLER, 0);
|
shaderManager.setUniform(UniformName.UNI_TEXTURE_SAMPLER, 0);
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
#version 330
|
#version 330
|
||||||
|
|
||||||
uniform mat4 modelMatrix;
|
uniform mat4 viewModelMatrix;
|
||||||
uniform mat4 viewMatrix;
|
|
||||||
uniform mat4 projectionMatrix;
|
uniform mat4 projectionMatrix;
|
||||||
|
|
||||||
layout(location=0) in vec2 position;
|
layout(location=0) in vec2 position;
|
||||||
@@ -11,6 +10,6 @@ out vec2 fragmentTexCoord;
|
|||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 0.0, 1.0);
|
gl_Position = projectionMatrix * viewModelMatrix * vec4(position, 0.0, 1.0);
|
||||||
fragmentTexCoord = texCoord;
|
fragmentTexCoord = texCoord;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user