Skip to content

Commit 9b4ced3

Browse files
feat: final edits and design patterns
1 parent edf536c commit 9b4ced3

21 files changed

+274
-134
lines changed

miniengine.png

55.6 KB
Loading

readme.md

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
### Mini Engine (exploratory)
2+
3+
Mini Engine is a very tiny and lightweight OpenGL based rendering engine which can be used very flexibly and with ease.
4+
Mini Engine can be used for quickly writing prototypes of games where you can use your own physics and entity component system etc. It can even be used for
5+
writing any OpenGL accelerated graphical programs like a picture drawing program or a terminal emulator.
6+
7+
### How do you write prototypes?
8+
9+
Writing prototypes is as simple as this:
10+
11+
```java
12+
import engine.Init;
13+
import engine.models.*;
14+
import org.lwjgl.glfw.GLFW;
15+
16+
import java.util.ArrayList;
17+
18+
public class Application {
19+
20+
public static void main(String[] args) {
21+
System.out.println("Running game");
22+
Init.init();
23+
ArrayList<IRenderData> coloredRectangles = new ArrayList<>();
24+
coloredRectangles.add(GradientQuad.builder().x(-400).y(-400)
25+
.width(400).height(400).rgb(new RGBWrapper(120, 150, 120)).build());
26+
coloredRectangles.add(ColoredQuad.builder().x(100).y(0)
27+
.width(250).height(150).rgb(new RGBWrapper(0, 255, 180)).build());
28+
coloredRectangles.add(TextureQuad.builder().x(-100).y(100)
29+
.width(300).height(300).image("doge.jpg").build());
30+
while (true) {
31+
coloredRectangles.forEach(rectangle -> {
32+
rectangle.getRenderType().getRenderingStrategy().execute(rectangle);
33+
});
34+
GLFW.glfwSwapBuffers(Init.window);
35+
GLFW.glfwPollEvents();
36+
}
37+
}
38+
}
39+
```
40+
41+
### What does the above program look like?
42+
43+
The above program gives the following output
44+
45+
![MiniEngine simple program](miniengine.png)
46+
47+
48+
### Installation and Running
49+
50+
- Install Maven (Maven 3 is recommended)
51+
- Install Java JRE and JDK (At least Java 11)
52+
- ```mvn package```
53+
- java -jar target/<jar>

src/main/java/Application.java

+11-20
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,25 @@
11
import engine.Init;
2-
import engine.strategy.RectColorRenderingStrategy;
3-
import engine.strategy.RectTextureRenderingStrategy;
2+
import engine.models.*;
43
import org.lwjgl.glfw.GLFW;
5-
import org.lwjgl.opengl.GL30;
64

7-
import java.net.URISyntaxException;
85
import java.util.ArrayList;
96

107
public class Application {
118

129
public static void main(String[] args) {
1310
System.out.println("Running game");
1411
Init.init();
15-
ArrayList<RectTextureRenderingStrategy> doges = new ArrayList<>();
16-
RectColorRenderingStrategy rect1 = new RectColorRenderingStrategy(0, 0, 50, 50);
17-
RectTextureRenderingStrategy rect2 = new RectTextureRenderingStrategy(-100, 100, 300, 300, "doge.jpg");
18-
for(int i = 0; i < 100; i++) {
19-
doges.add(new RectTextureRenderingStrategy(-100 + i, 100 + i, 300, 300, "doge.jpg"));
20-
}
12+
ArrayList<IRenderData> coloredRectangles = new ArrayList<>();
13+
coloredRectangles.add(GradientQuad.builder().x(-400).y(-400)
14+
.width(400).height(400).rgb(new RGBWrapper(120, 150, 120)).build());
15+
coloredRectangles.add(ColoredQuad.builder().x(100).y(0)
16+
.width(250).height(150).rgb(new RGBWrapper(0, 255, 180)).build());
17+
coloredRectangles.add(TextureQuad.builder().x(-100).y(100)
18+
.width(300).height(300).image("doge.jpg").build());
2119
while (true) {
22-
try {
23-
GL30.glClear(GL30.GL_COLOR_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT);
24-
rect1.execute();
25-
rect2.execute();
26-
for (RectTextureRenderingStrategy doge : doges) {
27-
doge.execute();
28-
}
29-
} catch (URISyntaxException e) {
30-
throw new RuntimeException(e);
31-
}
20+
coloredRectangles.forEach(rectangle -> {
21+
rectangle.getRenderType().getRenderingStrategy().execute(rectangle);
22+
});
3223
GLFW.glfwSwapBuffers(Init.window);
3324
GLFW.glfwPollEvents();
3425
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package engine.models;
2+
3+
import lombok.Builder;
4+
5+
@Builder
6+
public class ColoredQuad implements IRenderData {
7+
8+
public int x;
9+
10+
public int y;
11+
12+
public int width;
13+
14+
public int height;
15+
16+
public RGBWrapper rgb;
17+
18+
@Override
19+
public RenderTypeEnum getRenderType() {
20+
return RenderTypeEnum.COLORED_QUAD;
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package engine.models;
2+
3+
import lombok.Builder;
4+
5+
@Builder
6+
public class GradientQuad implements IRenderData {
7+
8+
public int x;
9+
10+
public int y;
11+
12+
public int width;
13+
14+
public int height;
15+
16+
public RGBWrapper rgb;
17+
18+
@Override
19+
public RenderTypeEnum getRenderType() {
20+
return RenderTypeEnum.GRADIENT_QUAD;
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package engine.models;
2+
3+
// Marker interface
4+
public interface IRenderData {
5+
6+
RenderTypeEnum getRenderType();
7+
}

src/main/java/engine/models/Polygon.java

+2
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,6 @@ public class Polygon {
1010
private float[] textureCoordinates;
1111

1212
private String textureFileName;
13+
14+
private RGBWrapper rgb;
1315
}

src/main/java/engine/models/RenderTypeEnum.java

+11-11
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,20 @@
22

33
import engine.strategy.IRenderingStrategy;
44
import engine.strategy.RectColorRenderingStrategy;
5+
import engine.strategy.RectGradientRenderingStrategy;
56
import engine.strategy.RectTextureRenderingStrategy;
7+
import lombok.Getter;
68

79
public enum RenderTypeEnum {
810

9-
COLORED_QUAD {
10-
public IRenderingStrategy getStrategy(StrategyParams params) {
11-
return new RectColorRenderingStrategy(params);
12-
}
13-
},
14-
TEXTURED_QUAD {
15-
public IRenderingStrategy getStrategy(StrategyParams params) {
16-
return new RectTextureRenderingStrategy(params);
17-
}
18-
};
11+
COLORED_QUAD (new RectColorRenderingStrategy()),
12+
TEXTURE_QUAD (new RectTextureRenderingStrategy()),
13+
GRADIENT_QUAD (new RectGradientRenderingStrategy());
1914

20-
public abstract IRenderingStrategy getStrategy(StrategyParams params);
15+
RenderTypeEnum(IRenderingStrategy renderingStrategy) {
16+
this.renderingStrategy = renderingStrategy;
17+
}
18+
19+
@Getter
20+
private IRenderingStrategy renderingStrategy;
2121
}

src/main/java/engine/models/StrategyParams.java

-18
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package engine.models;
2+
3+
import lombok.Builder;
4+
5+
@Builder
6+
public class TextureQuad implements IRenderData {
7+
8+
public int x;
9+
10+
public int y;
11+
12+
public int width;
13+
14+
public int height;
15+
16+
public String image;
17+
18+
@Override
19+
public RenderTypeEnum getRenderType() {
20+
return RenderTypeEnum.TEXTURE_QUAD;
21+
}
22+
}

src/main/java/engine/models/TextureRenderingStrategyParam.java

-14
This file was deleted.

src/main/java/engine/models/TexturedQuad.java

-14
This file was deleted.

src/main/java/engine/services/GlService.java

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package engine.services;
22

33
import engine.Globals;
4-
import engine.models.BufferEnum;
5-
import engine.models.DrawTypeEnum;
6-
import engine.models.ShaderProgram;
4+
import engine.models.*;
75
import engine.models.Polygon;
86
import org.lwjgl.opengl.GL11;
97
import org.lwjgl.opengl.GL30;
@@ -18,8 +16,12 @@
1816
import java.util.Arrays;
1917
import java.util.Objects;
2018

19+
import static java.sql.Types.FLOAT;
20+
2121
public class GlService {
2222

23+
private static final int dataCountPerColor = 3;
24+
2325
public static void renderObject(BufferEnum bufferType, DrawTypeEnum drawType, Polygon polygon,
2426
int dataCountPerCoordinate, ShaderProgram shaderProgram) {
2527
int program = shaderProgram.getProgram();
@@ -50,6 +52,10 @@ public static void renderObject(BufferEnum bufferType, DrawTypeEnum drawType, Po
5052
GL30.glEnableVertexAttribArray(GL30.glGetAttribLocation(program, "textureCoord"));
5153
GL30.glBufferData(GL30.GL_ARRAY_BUFFER, polygon.getTextureCoordinates(), GL30.GL_STATIC_DRAW);
5254
GL30.glVertexAttribPointer(GL30.glGetAttribLocation(program, "textureCoord"), 2, GL30.GL_FLOAT, false, Float.BYTES * 2, 0);
55+
} else if (polygon.getRgb() != null) {
56+
int uniformLocation = GL30.glGetUniformLocation(program, "colors");
57+
RGBWrapper rgb = polygon.getRgb();
58+
GL30.glUniform3f(uniformLocation, (float) rgb.getR() / 255, (float) rgb.getG() / 255, (float) rgb.getB() / 255);
5359
}
5460
GL30.glDrawArrays(drawType.getGlEnum(), 0, polygon.getCoordinates().length / dataCountPerCoordinate);
5561
}
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package engine.strategy;
22

3+
import engine.models.IRenderData;
4+
35
public interface IRenderingStrategy {
46

5-
void execute();
6-
}
7+
void execute(IRenderData renderData);
8+
}

src/main/java/engine/strategy/RectColorRenderingStrategy.java

+14-26
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import engine.Renderer;
55
import engine.models.*;
66
import engine.services.GlService;
7+
import engine.utils.FileUtil;
78
import engine.utils.ShaderUtil;
89
import lombok.Data;
910
import lombok.NoArgsConstructor;
@@ -14,27 +15,17 @@
1415
@NoArgsConstructor
1516
public class RectColorRenderingStrategy implements IRenderingStrategy {
1617

17-
private int x;
18-
19-
private int y;
20-
21-
private int width;
22-
23-
private int height;
24-
25-
private RGBWrapper rgb;
26-
27-
public RectColorRenderingStrategy(StrategyParams params) {
28-
ColorRenderingStrategyParam param = params.colorStrategyParam;
29-
this.x = param.x;
30-
this.y = param.y;
31-
this.width = param.width;
32-
this.height = param.height;
33-
this.rgb = param.rgb;
34-
}
35-
3618
@Override
37-
public void execute() {
19+
public void execute(IRenderData renderData) {
20+
if (!RenderTypeEnum.COLORED_QUAD.equals(renderData.getRenderType())) {
21+
return;
22+
}
23+
ColoredQuad coloredQuad = (ColoredQuad) renderData;
24+
int x = coloredQuad.x;
25+
int y = coloredQuad.y;
26+
int width = coloredQuad.width;
27+
int height = coloredQuad.height;
28+
RGBWrapper rgb = coloredQuad.rgb;
3829
float[] coordinates = {
3930
(float) x / Globals.screenWidth, (float) y / Globals.screenHeight,
4031
(float) (x + width) / Globals.screenWidth, (float) y / Globals.screenHeight,
@@ -44,20 +35,17 @@ public void execute() {
4435
ShaderProgram shaderProgram;
4536
if (ShaderUtil.shaderMap.get("2d_simple_shader") == null) {
4637
shaderProgram = ShaderProgram.builder()
47-
.addVertexShader(getFile("simple_shaders/2d_simple_vertex_shader.glsl"))
48-
.addFragmentShader(getFile("simple_shaders/2d_simple_fragment_shader.glsl"))
38+
.addVertexShader(FileUtil.getFile("simple_shaders/2d_simple_vertex_shader.glsl"))
39+
.addFragmentShader(FileUtil.getFile("simple_shaders/2d_simple_fragment_shader.glsl"))
4940
.build();
5041
ShaderUtil.shaderMap.put("2d_simple_shader", shaderProgram);
5142
} else {
5243
shaderProgram = ShaderUtil.shaderMap.get("2d_simple_shader");
5344
}
5445
Polygon polygon = new Polygon();
5546
polygon.setCoordinates(coordinates);
47+
polygon.setRgb(rgb);
5648
GlService.renderObject(BufferEnum.SCENE_BUFFER, DrawTypeEnum.QUADS, polygon, 2, shaderProgram);
5749
GlService.resetRenderingContext();
5850
}
59-
60-
private InputStream getFile(String fileName) {
61-
return Renderer.class.getClassLoader().getResourceAsStream(fileName);
62-
}
6351
}

0 commit comments

Comments
 (0)