Move view-model matrix computation to the CPU
This commit is contained in:
@@ -23,8 +23,7 @@ public class DefaultRenderer implements Renderer {
|
||||
shaderManager
|
||||
.createShader("default", "/shaders/default.vs", "/shaders/default.fs")
|
||||
.selectShader("default")
|
||||
.createUniform(UniformName.UNI_MODEL_MATRIX)
|
||||
.createUniform(UniformName.UNI_VIEW_MATRIX)
|
||||
.createUniform(UniformName.UNI_VIEW_MODEL_MATRIX)
|
||||
.createUniform(UniformName.UNI_PROJECTION_MATRIX)
|
||||
.createUniform(UniformName.UNI_OBJECT_COLOR)
|
||||
.createUniform(UniformName.UNI_HAS_OBJECT_TEXTURE)
|
||||
@@ -40,6 +39,10 @@ public class DefaultRenderer implements Renderer {
|
||||
|
||||
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);
|
||||
renderable.render(window, camera, shaderManager);
|
||||
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
package com.bartlomiejpluta.base.core.gl.shader.constant;
|
||||
|
||||
public interface UniformName {
|
||||
String UNI_MODEL_MATRIX = "modelMatrix";
|
||||
String UNI_VIEW_MATRIX = "viewMatrix";
|
||||
String UNI_VIEW_MODEL_MATRIX = "viewModelMatrix";
|
||||
String UNI_PROJECTION_MATRIX = "projectionMatrix";
|
||||
String UNI_OBJECT_COLOR = "objectColor";
|
||||
String UNI_HAS_OBJECT_TEXTURE = "hasTexture";
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
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.manager.ShaderManager;
|
||||
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 viewMatrix = new Matrix4f();
|
||||
|
||||
public Matrix4f getProjectionMatrix(Window window) {
|
||||
return projectionMatrix
|
||||
.identity()
|
||||
.setOrtho2D(0, window.getWidth(), window.getHeight(), 0);
|
||||
}
|
||||
|
||||
public Matrix4f getViewMatrix() {
|
||||
return viewMatrix
|
||||
.identity()
|
||||
.translate(-position.x, -position.y, 0);
|
||||
public Matrix4f computeViewModelMatrix(Matrix4f modelMatrix) {
|
||||
return new Matrix4f(viewMatrix).mul(modelMatrix);
|
||||
}
|
||||
|
||||
public void render(Window window, ShaderManager shaderManager) {
|
||||
shaderManager.setUniform(UniformName.UNI_PROJECTION_MATRIX, getProjectionMatrix(window));
|
||||
shaderManager.setUniform(UniformName.UNI_VIEW_MATRIX, getViewMatrix());
|
||||
// Update matrices
|
||||
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;
|
||||
}
|
||||
|
||||
shaderManager.setUniform(UniformName.UNI_MODEL_MATRIX, image.getModelMatrix());
|
||||
shaderManager.setUniform(UniformName.UNI_VIEW_MODEL_MATRIX, camera.computeViewModelMatrix(image.getModelMatrix()));
|
||||
|
||||
switch (mode) {
|
||||
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) {
|
||||
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_HAS_OBJECT_TEXTURE, material.hasTexture());
|
||||
shaderManager.setUniform(UniformName.UNI_TEXTURE_SAMPLER, 0);
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
#version 330
|
||||
|
||||
uniform mat4 modelMatrix;
|
||||
uniform mat4 viewMatrix;
|
||||
uniform mat4 viewModelMatrix;
|
||||
uniform mat4 projectionMatrix;
|
||||
|
||||
layout(location=0) in vec2 position;
|
||||
@@ -11,6 +10,6 @@ out vec2 fragmentTexCoord;
|
||||
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user