Create model matrix for Object
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package com.bartlomiejpluta.samplegame.core.gl.shader.constant;
|
||||||
|
|
||||||
|
public interface UniformName {
|
||||||
|
public static final String UNI_MODEL_MATRIX = "modelMatrix";
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
@@ -35,6 +34,20 @@ public abstract class Object implements Renderable {
|
|||||||
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;
|
||||||
rotation.y = y;
|
rotation.y = y;
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@ 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,
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user