Create model matrix for Object

This commit is contained in:
2021-01-30 13:15:36 +01:00
parent 0594c87f77
commit 89ed1b9571
10 changed files with 100 additions and 33 deletions

View File

@@ -1,6 +1,8 @@
package com.bartlomiejpluta.samplegame.core.gl.object.mesh; package com.bartlomiejpluta.samplegame.core.gl.object.mesh;
import com.bartlomiejpluta.samplegame.core.gl.render.Renderable; import com.bartlomiejpluta.samplegame.core.gl.render.Renderable;
import com.bartlomiejpluta.samplegame.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.samplegame.core.gl.shader.program.ShaderProgram;
import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL15;
import org.lwjgl.system.MemoryStack; import org.lwjgl.system.MemoryStack;
@@ -44,7 +46,7 @@ public class Mesh implements Renderable {
} }
@Override @Override
public void render() { public void render(ShaderManager shaderManager) {
glBindVertexArray(vaoId); glBindVertexArray(vaoId);
glEnableVertexAttribArray(0); glEnableVertexAttribArray(0);
glDrawElements(GL_TRIANGLES, elementsCount, GL_UNSIGNED_INT, 0); glDrawElements(GL_TRIANGLES, elementsCount, GL_UNSIGNED_INT, 0);

View File

@@ -1,18 +1,14 @@
package com.bartlomiejpluta.samplegame.core.gl.render; package com.bartlomiejpluta.samplegame.core.gl.render;
import com.bartlomiejpluta.samplegame.core.ui.Window; import com.bartlomiejpluta.samplegame.core.gl.shader.constant.UniformName;
import com.bartlomiejpluta.samplegame.core.gl.shader.manager.ShaderManager; import com.bartlomiejpluta.samplegame.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.samplegame.core.ui.Window;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.lwjgl.system.MemoryStack;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import static org.lwjgl.opengl.GL15.*; import static org.lwjgl.opengl.GL15.*;
import static org.lwjgl.opengl.GL20.glEnableVertexAttribArray;
import static org.lwjgl.opengl.GL20.glVertexAttribPointer;
import static org.lwjgl.opengl.GL30.glBindVertexArray;
import static org.lwjgl.opengl.GL30.glGenVertexArrays;
@Slf4j @Slf4j
@Component @Component
@@ -23,7 +19,10 @@ public class DefaultRenderer implements Renderer {
@Override @Override
public void init() { public void init() {
log.info("Initializing renderer"); log.info("Initializing renderer");
shaderManager.createShader("default", "/shaders/default.vs", "/shaders/default.fs"); shaderManager
.createShader("default", "/shaders/default.vs", "/shaders/default.fs")
.selectShader("default")
.createUniform(UniformName.UNI_MODEL_MATRIX);
} }
@Override @Override
@@ -33,7 +32,7 @@ public class DefaultRenderer implements Renderer {
shaderManager.selectShader("default").useSelectedShader(); shaderManager.selectShader("default").useSelectedShader();
renderable.render(); renderable.render(shaderManager);
shaderManager.detachCurrentShader(); shaderManager.detachCurrentShader();
} }

View File

@@ -1,6 +1,9 @@
package com.bartlomiejpluta.samplegame.core.gl.render; package com.bartlomiejpluta.samplegame.core.gl.render;
import com.bartlomiejpluta.samplegame.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.samplegame.core.gl.shader.program.ShaderProgram;
public interface Renderable { public interface Renderable {
void render(); void render(ShaderManager shaderManager);
void cleanUp(); void cleanUp();
} }

View File

@@ -0,0 +1,5 @@
package com.bartlomiejpluta.samplegame.core.gl.shader.constant;
public interface UniformName {
public static final String UNI_MODEL_MATRIX = "modelMatrix";
}

View File

@@ -1,15 +1,14 @@
package com.bartlomiejpluta.samplegame.core.world.object; package com.bartlomiejpluta.samplegame.core.world.object;
import com.bartlomiejpluta.samplegame.core.gl.object.mesh.Mesh;
import com.bartlomiejpluta.samplegame.core.gl.render.Renderable;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter; import lombok.Setter;
import org.joml.Matrix4f;
import org.joml.Vector3f; import org.joml.Vector3f;
@RequiredArgsConstructor import static java.lang.Math.toRadians;
public abstract class Object implements Renderable {
private final Mesh mesh; public abstract class Object {
private final Matrix4f modelMatrix = new Matrix4f();
@Getter @Getter
private final Vector3f position = new Vector3f(0, 0, 0); private final Vector3f position = new Vector3f(0, 0, 0);
@@ -34,6 +33,20 @@ public abstract class Object implements Renderable {
this.position.z = position.z; this.position.z = position.z;
return this; return this;
} }
public Object movePosition(float x, float y, float z) {
position.x += x;
position.y += y;
position.z += z;
return this;
}
public Object movePosition(Vector3f position) {
this.position.x += position.x;
this.position.y += position.y;
this.position.z += position.z;
return this;
}
public Object setRotation(float x, float y, float z) { public Object setRotation(float x, float y, float z) {
rotation.x = x; rotation.x = x;
@@ -49,13 +62,27 @@ public abstract class Object implements Renderable {
return this; return this;
} }
@Override public Object moveRotation(float x, float y, float z) {
public void render() { rotation.x += x;
mesh.render(); rotation.y += y;
rotation.z += z;
return this;
} }
@Override public Object moveRotation(Vector3f rotation) {
public void cleanUp() { this.rotation.x += rotation.x;
mesh.cleanUp(); this.rotation.y += rotation.y;
this.rotation.z += rotation.z;
return this;
}
public Matrix4f getModelMatrix() {
return modelMatrix
.identity()
.translate(position)
.rotateX((float) toRadians(-rotation.x))
.rotateY((float) toRadians(-rotation.y))
.rotateZ((float) toRadians(-rotation.z))
.scale(scale);
} }
} }

View File

@@ -0,0 +1,21 @@
package com.bartlomiejpluta.samplegame.core.world.object;
import com.bartlomiejpluta.samplegame.core.gl.object.mesh.Mesh;
import com.bartlomiejpluta.samplegame.core.gl.render.Renderable;
import com.bartlomiejpluta.samplegame.core.gl.shader.manager.ShaderManager;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public abstract class RenderableObject extends Object implements Renderable {
private final Mesh mesh;
@Override
public void render(ShaderManager shaderManager) {
mesh.render(shaderManager);
}
@Override
public void cleanUp() {
mesh.cleanUp();
}
}

View File

@@ -2,14 +2,14 @@ package com.bartlomiejpluta.samplegame.core.world.object;
import com.bartlomiejpluta.samplegame.core.gl.object.mesh.Mesh; import com.bartlomiejpluta.samplegame.core.gl.object.mesh.Mesh;
public class Sprite extends Object { public class Sprite extends RenderableObject {
private static final float[] VERTICES = new float[]{ private static final float[] VERTICES = new float[]{
-0.5f, 0.5f, 0.0f, -0.5f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f, -0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f,
0.5f, 0.5f, 0.0f 0.5f, 0.5f, 0.0f
}; };
private static final int[] ELEMENTS = new int[]{ private static final int[] ELEMENTS = new int[]{
0, 1, 2, 0, 1, 2,
2, 3, 0 2, 3, 0

View File

@@ -1,27 +1,31 @@
package com.bartlomiejpluta.samplegame.core.world.scene; package com.bartlomiejpluta.samplegame.core.world.scene;
import com.bartlomiejpluta.samplegame.core.gl.render.Renderable; import com.bartlomiejpluta.samplegame.core.gl.render.Renderable;
import com.bartlomiejpluta.samplegame.core.gl.shader.constant.UniformName;
import com.bartlomiejpluta.samplegame.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.samplegame.core.world.object.RenderableObject;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class Scene implements Renderable { public class Scene implements Renderable {
private final List<Renderable> renderables = new ArrayList<>(); private final List<RenderableObject> objects = new ArrayList<>();
public Scene add(Renderable renderable) { public Scene add(RenderableObject object) {
renderables.add(renderable); objects.add(object);
return this; return this;
} }
@Override @Override
public void render() { public void render(ShaderManager shaderManager) {
for(var renderable : renderables) { for(var object : objects) {
renderable.render(); shaderManager.setUniform(UniformName.UNI_MODEL_MATRIX, object.getModelMatrix());
object.render(shaderManager);
} }
} }
@Override @Override
public void cleanUp() { public void cleanUp() {
renderables.forEach(Renderable::cleanUp); objects.forEach(Renderable::cleanUp);
} }
} }

View File

@@ -7,6 +7,7 @@ import com.bartlomiejpluta.samplegame.core.world.object.Sprite;
import com.bartlomiejpluta.samplegame.core.world.scene.Scene; import com.bartlomiejpluta.samplegame.core.world.scene.Scene;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.joml.Vector3f;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -17,12 +18,15 @@ public class DefaultGameLogic implements GameLogic {
private final Renderer renderer; private final Renderer renderer;
private final Scene scene = new Scene(); private final Scene scene = new Scene();
Sprite sprite;
@Override @Override
public void init(Window window) { public void init(Window window) {
log.info("Initializing game logic"); log.info("Initializing game logic");
renderer.init(); renderer.init();
scene.add(new Sprite()); sprite = new Sprite();
scene.add(sprite);
} }
@Override @Override

View File

@@ -1,8 +1,10 @@
#version 330 #version 330
uniform mat4 modelMatrix;
layout(location=0) in vec3 position; layout(location=0) in vec3 position;
void main() void main()
{ {
gl_Position = vec4(position, 1.0); gl_Position = modelMatrix * vec4(position, 1.0);
} }