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
|
@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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
public interface Renderer {
|
||||||
void init();
|
void init();
|
||||||
|
|
||||||
void render(Window window);
|
void render(Window window, Renderable renderable);
|
||||||
|
|
||||||
void cleanUp();
|
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.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
|
||||||
|
|||||||
Reference in New Issue
Block a user