Create basic Sprite shape
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -27,13 +27,13 @@ public class DefaultRenderer implements Renderer {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(Window window) {
|
||||
public void render(Window window, Renderable renderable) {
|
||||
clear();
|
||||
updateViewport(window);
|
||||
|
||||
shaderManager.selectShader("default").useSelectedShader();
|
||||
|
||||
// here the objects will be rendered with the default shader
|
||||
renderable.render();
|
||||
|
||||
shaderManager.detachCurrentShader();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
package com.bartlomiejpluta.samplegame.core.gl.render;
|
||||
|
||||
public interface Renderable {
|
||||
void render();
|
||||
void cleanUp();
|
||||
}
|
||||
@@ -5,7 +5,7 @@ import com.bartlomiejpluta.samplegame.core.ui.Window;
|
||||
public interface Renderer {
|
||||
void init();
|
||||
|
||||
void render(Window window);
|
||||
void render(Window window, Renderable renderable);
|
||||
|
||||
void cleanUp();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
27
app/src/main/java/com/bartlomiejpluta/samplegame/core/world/scene/Scene.java
Executable file
27
app/src/main/java/com/bartlomiejpluta/samplegame/core/world/scene/Scene.java
Executable 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);
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,8 @@ package com.bartlomiejpluta.samplegame.game.logic;
|
||||
import com.bartlomiejpluta.samplegame.core.gl.render.Renderer;
|
||||
import com.bartlomiejpluta.samplegame.core.logic.GameLogic;
|
||||
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.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@@ -13,11 +15,14 @@ import org.springframework.stereotype.Component;
|
||||
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
|
||||
public class DefaultGameLogic implements GameLogic {
|
||||
private final Renderer renderer;
|
||||
private final Scene scene = new Scene();
|
||||
|
||||
@Override
|
||||
public void init(Window window) {
|
||||
log.info("Initializing game logic");
|
||||
renderer.init();
|
||||
|
||||
scene.add(new Sprite());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -32,7 +37,7 @@ public class DefaultGameLogic implements GameLogic {
|
||||
|
||||
@Override
|
||||
public void render(Window window) {
|
||||
renderer.render(window);
|
||||
renderer.render(window, scene);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user