Create basic Sprite shape

This commit is contained in:
2021-01-30 12:55:16 +01:00
parent 17d8c9406f
commit 0594c87f77
8 changed files with 190 additions and 4 deletions

View File

@@ -0,0 +1,66 @@
package com.bartlomiejpluta.samplegame.core.gl.object.mesh;
import com.bartlomiejpluta.samplegame.core.gl.render.Renderable;
import org.lwjgl.opengl.GL15;
import org.lwjgl.system.MemoryStack;
import java.util.ArrayList;
import java.util.List;
import static org.lwjgl.opengl.GL15.*;
import static org.lwjgl.opengl.GL20.*;
import static org.lwjgl.opengl.GL30.*;
public class Mesh implements Renderable {
private final int vaoId;
private final List<Integer> vboIds = new ArrayList<>(2);
private final int elementsCount;
public Mesh(float[] vertices, int[] elements) {
try(var stack = MemoryStack.stackPush()) {
elementsCount = elements.length;
var verticesBuffer = stack.mallocFloat(vertices.length);
var elementsBuffer = stack.mallocInt(elementsCount);
verticesBuffer.put(vertices).flip();
elementsBuffer.put(elements).flip();
vaoId = glGenVertexArrays();
glBindVertexArray(vaoId);
int vboId = glGenBuffers();
vboIds.add(vboId);
glBindBuffer(GL_ARRAY_BUFFER, vboId);
glBufferData(GL_ARRAY_BUFFER, verticesBuffer, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
vboId = glGenBuffers();
vboIds.add(vboId);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, elementsBuffer, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}
}
@Override
public void render() {
glBindVertexArray(vaoId);
glEnableVertexAttribArray(0);
glDrawElements(GL_TRIANGLES, elementsCount, GL_UNSIGNED_INT, 0);
glDisableVertexAttribArray(0);
glBindVertexArray(0);
}
@Override
public void cleanUp() {
glDisableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
vboIds.forEach(GL15::glDeleteBuffers);
glBindVertexArray(0);
glDeleteVertexArrays(vaoId);
}
}

View File

@@ -27,13 +27,13 @@ public class DefaultRenderer implements Renderer {
} }
@Override @Override
public void render(Window window) { public void render(Window window, Renderable renderable) {
clear(); clear();
updateViewport(window); updateViewport(window);
shaderManager.selectShader("default").useSelectedShader(); shaderManager.selectShader("default").useSelectedShader();
// here the objects will be rendered with the default shader renderable.render();
shaderManager.detachCurrentShader(); shaderManager.detachCurrentShader();
} }

View File

@@ -0,0 +1,6 @@
package com.bartlomiejpluta.samplegame.core.gl.render;
public interface Renderable {
void render();
void cleanUp();
}

View File

@@ -5,7 +5,7 @@ import com.bartlomiejpluta.samplegame.core.ui.Window;
public interface Renderer { public interface Renderer {
void init(); void init();
void render(Window window); void render(Window window, Renderable renderable);
void cleanUp(); void cleanUp();
} }

View File

@@ -0,0 +1,61 @@
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.RequiredArgsConstructor;
import lombok.Setter;
import org.joml.Vector3f;
@RequiredArgsConstructor
public abstract class Object implements Renderable {
private final Mesh mesh;
@Getter
private final Vector3f position = new Vector3f(0, 0, 0);
@Getter
private final Vector3f rotation = new Vector3f(0, 0, 0);
@Getter
@Setter
private float scale = 1.0f;
public Object setPosition(float x, float y, float z) {
position.x = x;
position.y = y;
position.z = z;
return this;
}
public Object setPosition(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) {
rotation.x = x;
rotation.y = y;
rotation.z = z;
return this;
}
public Object setRotation(Vector3f rotation) {
this.rotation.x = rotation.x;
this.rotation.y = rotation.y;
this.rotation.z = rotation.z;
return this;
}
@Override
public void render() {
mesh.render();
}
@Override
public void cleanUp() {
mesh.cleanUp();
}
}

View File

@@ -0,0 +1,21 @@
package com.bartlomiejpluta.samplegame.core.world.object;
import com.bartlomiejpluta.samplegame.core.gl.object.mesh.Mesh;
public class Sprite extends Object {
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
};
private static final int[] ELEMENTS = new int[]{
0, 1, 2,
2, 3, 0
};
public Sprite() {
super(new Mesh(VERTICES, ELEMENTS));
}
}

View File

@@ -0,0 +1,27 @@
package com.bartlomiejpluta.samplegame.core.world.scene;
import com.bartlomiejpluta.samplegame.core.gl.render.Renderable;
import java.util.ArrayList;
import java.util.List;
public class Scene implements Renderable {
private final List<Renderable> renderables = new ArrayList<>();
public Scene add(Renderable renderable) {
renderables.add(renderable);
return this;
}
@Override
public void render() {
for(var renderable : renderables) {
renderable.render();
}
}
@Override
public void cleanUp() {
renderables.forEach(Renderable::cleanUp);
}
}

View File

@@ -3,6 +3,8 @@ package com.bartlomiejpluta.samplegame.game.logic;
import com.bartlomiejpluta.samplegame.core.gl.render.Renderer; import com.bartlomiejpluta.samplegame.core.gl.render.Renderer;
import com.bartlomiejpluta.samplegame.core.logic.GameLogic; import com.bartlomiejpluta.samplegame.core.logic.GameLogic;
import com.bartlomiejpluta.samplegame.core.ui.Window; import com.bartlomiejpluta.samplegame.core.ui.Window;
import com.bartlomiejpluta.samplegame.core.world.object.Sprite;
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.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -13,11 +15,14 @@ import org.springframework.stereotype.Component;
@RequiredArgsConstructor(onConstructor = @__(@Autowired)) @RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class DefaultGameLogic implements GameLogic { public class DefaultGameLogic implements GameLogic {
private final Renderer renderer; private final Renderer renderer;
private final Scene scene = new Scene();
@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());
} }
@Override @Override
@@ -32,7 +37,7 @@ public class DefaultGameLogic implements GameLogic {
@Override @Override
public void render(Window window) { public void render(Window window) {
renderer.render(window); renderer.render(window, scene);
} }
@Override @Override