Skip to content

Commit 055f45c

Browse files
committed
Current progress v2
1 parent 305f397 commit 055f45c

File tree

18 files changed

+371
-273
lines changed

18 files changed

+371
-273
lines changed

src/library/java/gg/generations/rarecandy/renderer/animation/AnimationInstance.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ public void update(double secondsPassed) {
4444
currentTime = animation.getAnimationTime(secondsPassed - timeAtUnpause);
4545
if (prevTime > currentTime) onLoop();
4646
} else if (timeAtPause == -1) timeAtPause = secondsPassed;
47+
48+
if(animation == null) return;
49+
matrixTransforms = animation.getFrameTransform(secondsPassed);
4750
}
4851

4952
public void updateStart(double secondsPassed) {

src/library/java/gg/generations/rarecandy/renderer/animation/Transform.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package gg.generations.rarecandy.renderer.animation;
22

3+
import gg.generations.rarecandy.renderer.storage.SSBOBuffer;
34
import org.joml.Vector2f;
45

56
public record Transform(Vector2f scale, Vector2f offset) {
@@ -19,6 +20,11 @@ public Transform(Vector2f offset) {
1920
public boolean isUnit() {
2021
return offset.x == 0f && offset.y == 0f && scale.x == 1f && scale.y == 1f;
2122
}
23+
24+
public void upload(int pos, SSBOBuffer buffer) {
25+
buffer.put(pos, scale);
26+
buffer.put(pos + Float.BYTES * 2, offset);
27+
}
2228
}
2329

2430

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package gg.generations.rarecandy.renderer.components;
2+
3+
import gg.generations.rarecandy.renderer.storage.AnimatedObjectInstance;
4+
5+
public class InstanceDetails {
6+
public static int size = AnimatedObjectInstance.ANIMATED_SIZE;
7+
}

src/library/java/gg/generations/rarecandy/renderer/components/MultiRenderObject.java

Lines changed: 91 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,19 @@
11
package gg.generations.rarecandy.renderer.components;
22

3-
import com.google.errorprone.annotations.Var;
4-
import gg.generations.rarecandy.pokeutils.BlendType;
5-
import gg.generations.rarecandy.pokeutils.ModelConfig;
63
import gg.generations.rarecandy.renderer.animation.Animation;
4+
import gg.generations.rarecandy.renderer.animation.Transform;
75
import gg.generations.rarecandy.renderer.loading.ModelLoader;
86
import gg.generations.rarecandy.renderer.loading.SbboOffset;
9-
import gg.generations.rarecandy.renderer.model.RenderModel;
107
import gg.generations.rarecandy.renderer.model.Variant;
118
import gg.generations.rarecandy.renderer.model.material.Material;
12-
import gg.generations.rarecandy.renderer.pipeline.traditional.TraditionalPipeline;
139
import gg.generations.rarecandy.renderer.rendering.ObjectInstance;
1410
import gg.generations.rarecandy.renderer.rendering.RenderStage;
1511
import gg.generations.rarecandy.renderer.storage.AnimatedObjectInstance;
16-
import gg.generations.rarecandy.renderer.textures.TextureArray;
17-
import org.jetbrains.annotations.Nullable;
12+
import gg.generations.rarecandy.renderer.storage.SSBOBuffer;
13+
import org.jetbrains.annotations.NotNull;
1814
import org.joml.Matrix4f;
1915
import org.joml.Vector3f;
16+
import org.lwjgl.opengl.GL43;
2017
import org.lwjgl.opengl.GL43C;
2118

2219
import java.io.IOException;
@@ -25,7 +22,6 @@
2522
import java.util.function.Function;
2623
import java.util.stream.Collectors;
2724
import java.util.stream.IntStream;
28-
import java.util.stream.Stream;
2925

3026
/**
3127
*
@@ -43,8 +39,16 @@ public abstract class MultiRenderObject {
4339

4440
public SbboOffset vertex;
4541
public SbboOffset index;
42+
public SbboOffset draw;
43+
public SbboOffset target;
4644

47-
public int bufferSize;
45+
public SSBOBuffer instanceBuffer;
46+
public SSBOBuffer uvTransformBuffer;
47+
48+
public int modelBuffer;
49+
public int destBuffer;
50+
51+
public int maxVertex;
4852

4953
public Animation[] animations = new Animation[0];
5054
public String[] animationNames = new String[0];
@@ -55,10 +59,11 @@ public abstract class MultiRenderObject {
5559

5660
public final Vector3f dimensions = new Vector3f();
5761
public float scale = 1.0f;
58-
public int buffer;
5962

6063
private Matrix4f rootTransformation = new Matrix4f();
6164

65+
private final List<ObjectInstance> instances = new ArrayList<>();
66+
6267
public MultiRenderObject(ModelLoader.Names names) {
6368
meshes = new DrawRecord[names.meshes().size()];
6469
meshNameToId = listToMap(names.meshes());
@@ -100,11 +105,17 @@ public Vector3f getDimensions() {
100105
return dimensions;
101106
}
102107

103-
public void update() {
108+
public void update(double absoluteTime) {
104109
for (var consumer : queue) {
105110
consumer.accept(this);
106111
}
107112
queue.clear();
113+
114+
for (ObjectInstance instance : instances) {
115+
instance.update(absoluteTime);
116+
}
117+
118+
instances.removeIf(a -> !a.isLinked());
108119
}
109120

110121
public Set<String> availableVariants() {
@@ -117,6 +128,10 @@ public Material getMaterial(int mesh, int variant) {
117128

118129
abstract public void render(RenderStage stage, List<ObjectInstance> instances);
119130

131+
public void render(RenderStage stage) {
132+
render(stage, instances);
133+
}
134+
120135
public boolean shouldRender(int mesh, ObjectInstance instance) {
121136
if(instance instanceof AnimatedObjectInstance animationInstance) {
122137
var animation = animationInstance.currentAnimation;
@@ -147,6 +162,70 @@ public void close() throws IOException {
147162
material.close();
148163
}
149164

150-
GL43C.glDeleteBuffers(buffer);
165+
GL43.glDeleteBuffers(modelBuffer);
166+
GL43.glDeleteBuffers(destBuffer);
167+
}
168+
169+
public boolean isEmpty() {
170+
return instances.isEmpty();
171+
}
172+
173+
public void updateSSBOs() {
174+
ensureCapacity();
175+
for (int i = 0; i < instances.size(); i++) {
176+
var instance = instances.get(i);
177+
178+
instance.update(i * InstanceDetails.size, instanceBuffer);
179+
180+
for (int meshId = 0; meshId < meshes.length; meshId++) {
181+
182+
var variant = getVariant(meshId, instance.variant());
183+
184+
Transform transform = variant.offset();
185+
186+
if (instance instanceof AnimatedObjectInstance animatedInstance) {
187+
188+
var material = variant.material();
189+
190+
var t = animatedInstance.getTransform(material);
191+
192+
if (t != null && !t.isUnit()) {
193+
transform = t;
194+
}
195+
}
196+
197+
if(transform == null) {
198+
transform = Transform.DEFAULT;
199+
}
200+
201+
transform.upload(i * meshes.length + meshId * Float.BYTES * 4, uvTransformBuffer);
202+
}
203+
204+
instanceBuffer.upload();
205+
uvTransformBuffer.upload();
206+
}
207+
}
208+
209+
public <T extends ObjectInstance> boolean add(@NotNull T instance) {
210+
if(!instance.isLinked()) {
211+
instance.link(this);
212+
instances.add(instance);
213+
214+
return true;
215+
}
216+
217+
return false;
218+
}
219+
220+
private void ensureCapacity() {
221+
var size = instances.size();
222+
223+
instanceBuffer.ensureCapacity((long) size * InstanceDetails.size);
224+
}
225+
226+
public abstract int targetVertexStride();
227+
228+
public int numOfInstances() {
229+
return instances.size();
151230
}
152231
}

src/library/java/gg/generations/rarecandy/renderer/loading/ModelLoader.java

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55
import gg.generations.rarecandy.renderer.animation.Animation;
66
import gg.generations.rarecandy.renderer.animation.Skeleton;
77
import gg.generations.rarecandy.renderer.components.DrawRecord;
8+
import gg.generations.rarecandy.renderer.components.InstanceDetails;
89
import gg.generations.rarecandy.renderer.components.MultiRenderObject;
910
import gg.generations.rarecandy.renderer.model.*;
1011
import gg.generations.rarecandy.renderer.model.material.Material;
12+
import gg.generations.rarecandy.renderer.storage.SSBOBuffer;
1113
import gg.generations.rarecandy.renderer.textures.Texture;
12-
import gg.generations.rarecandy.renderer.textures.TextureArray;
1314
import org.jetbrains.annotations.NotNull;
1415
import org.joml.Matrix4f;
1516
import org.joml.Quaternionf;
@@ -27,8 +28,7 @@
2728

2829
import static java.util.Objects.requireNonNull;
2930
import static org.lwjgl.opengl.GL30C.*;
30-
import static org.lwjgl.opengl.GL43C.GL_SHADER_STORAGE_BUFFER;
31-
import static org.lwjgl.opengl.GL43C.GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT;
31+
import static org.lwjgl.opengl.GL43C.*;
3232

3333
public class ModelLoader {
3434
public static int byteAmount;
@@ -83,25 +83,39 @@ public static void processModel(
8383

8484
int alignment = glGetInteger(GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT);
8585

86+
int maxVertex = 0;
87+
8688
for (var mesh : meshes) {
89+
maxVertex = Math.max(maxVertex, mesh.mNumFaces() * 3);
90+
8791
vertexCount += mesh.mNumVertices();
8892
indexBytes += mesh.mNumFaces() * 3;
8993
}
9094

95+
objects.maxVertex = maxVertex;
96+
97+
98+
9199
indexBytes *= Integer.BYTES;
92100

101+
int drawBytes = meshes.length * Integer.BYTES * 2;
102+
93103
int vertexBytes = vertexCount * 80;
94104

95105
int indexOffset = alignUp(vertexBytes, alignment);
96-
int totalBytes = indexOffset + indexBytes;
106+
int drawOffset = indexOffset + alignUp(indexBytes, alignment);
107+
int totalBytes = drawOffset + drawBytes;
97108

98109
var vertexBuffer = MemoryUtil.memAlloc(vertexBytes);
99110

100111
var indexBuffer = MemoryUtil.memAlloc(indexBytes);
101112

113+
var drawBuffer = MemoryUtil.memAlloc(drawBytes);
114+
102115
objects.vertex = new SbboOffset(0, vertexBytes);
103116
objects.index = new SbboOffset(indexOffset, indexBytes);
104-
117+
objects.draw = new SbboOffset(drawOffset, drawBytes);
118+
objects.target = new SbboOffset(0, objects.targetVertexStride() * maxVertex);
105119

106120
int[] counters = new int[2]; // index Count
107121

@@ -110,30 +124,37 @@ public static void processModel(
110124
for (int i = 0; i < names.meshes.size(); i++) {
111125
var mesh = list.get(i);
112126

113-
var drawRecord = processPrimitiveModel(
127+
objects.meshes[i] = processPrimitiveModel(
114128
vertexBuffer,
115129
indexBuffer,
130+
drawBuffer,
116131
counters, skeleton, mesh, config.modelOptions != null ? config.modelOptions : Collections.emptyMap(), dimensions);
117-
118-
objects.meshes[i] = drawRecord;
119132
}
120133

121134
var buffer = MemoryUtil.memAlloc(totalBytes);
122135
objects.vertex.put(buffer, vertexBuffer.flip());
123136
objects.index.put(buffer, indexBuffer.flip());
124-
// System.out.println("totalBytes = " + totalBytes/1024f + "kb");
125-
System.out.println("buffer.limit() = " + (vertexBuffer.limit() + indexBuffer.limit()) + " " + buffer.limit());
137+
objects.draw.put(buffer, drawBuffer.flip());
126138

127139
var bufferId = GL43C.glGenBuffers();
128140
GL43C.glBindBuffer(GL_SHADER_STORAGE_BUFFER, bufferId);
129141
glBufferData(GL43C.GL_SHADER_STORAGE_BUFFER, buffer, GL43C.GL_STATIC_READ);
130142
GL43C.glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
143+
objects.modelBuffer = bufferId;
131144

132-
objects.buffer = bufferId;
145+
bufferId = GL43.glGenBuffers();
146+
GL43.glBindBuffer(GL_SHADER_STORAGE_BUFFER, bufferId);
147+
glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, objects.target.size(), GL43.GL_DYNAMIC_DRAW);
148+
GL43.glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
149+
objects.destBuffer = bufferId;
150+
151+
objects.uvTransformBuffer = new SSBOBuffer(Float.BYTES * 4);
152+
objects.instanceBuffer = new SSBOBuffer(InstanceDetails.size);
133153

134154
MemoryUtil.memFree(buffer);
135155
MemoryUtil.memFree(vertexBuffer);
136156
MemoryUtil.memFree(indexBuffer);
157+
MemoryUtil.memFree(drawBuffer);
137158

138159

139160
var transform = new Matrix4f();
@@ -389,7 +410,9 @@ private static void applyTransforms(Matrix4f transform, ModelNode node) {
389410

390411
private static DrawRecord processPrimitiveModel(
391412
ByteBuffer vertexBuffer,
392-
ByteBuffer indexBuffer, int[] counters, Skeleton skeleton, AIMesh mesh, Map<String, MeshOptions> options, Vector3f dimensions) {
413+
ByteBuffer indexBuffer,
414+
ByteBuffer drawBuffer,
415+
int[] counters, Skeleton skeleton, AIMesh mesh, Map<String, MeshOptions> options, Vector3f dimensions) {
393416
var name = mesh.mName().dataString();
394417

395418
var faceArray = options.containsKey(name) && options.get(name).invert() ? INVERT_FACE : NORMAL_FACE;
@@ -404,6 +427,8 @@ private static DrawRecord processPrimitiveModel(
404427
var numFaces = mesh.mNumFaces();
405428
var indexAmount = numFaces * 3;
406429

430+
drawBuffer.putInt(indexOffset).putInt(indexAmount);
431+
407432
var drawRecord = new DrawRecord(indexOffset, indexAmount);
408433

409434
counters[0] += indexAmount;

src/library/java/gg/generations/rarecandy/renderer/rendering/ObjectInstance.java

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package gg.generations.rarecandy.renderer.rendering;
22

33
import gg.generations.rarecandy.renderer.components.MultiRenderObject;
4+
import gg.generations.rarecandy.renderer.storage.SSBOBuffer;
45
import org.joml.Matrix4f;
56
import org.lwjgl.system.MemoryUtil;
67

@@ -11,27 +12,20 @@ public class ObjectInstance implements Closeable {
1112
public static final int MAT4_SIZE = 16 * Float.BYTES;
1213

1314
private final Matrix4f transformationMatrix;
14-
public final long pointer;
1515
private int variant;
1616
private MultiRenderObject object;
1717
private boolean used = false;
1818
private double secondsPassed = 0f;
1919
public static final float DELINK_THRESHOLD = 0.1f; // Seconds before delinking
2020

21-
public ObjectInstance(Matrix4f transformationMatrix, int variant) {
22-
this(MAT4_SIZE, transformationMatrix, variant);
23-
}
2421

25-
public ObjectInstance(int size, Matrix4f transformationMatrix, int variant) {
22+
public ObjectInstance(Matrix4f transformationMatrix, int variant) {
2623
this.transformationMatrix = transformationMatrix;
2724
this.variant = variant;
28-
29-
this.pointer = MemoryUtil.nmemAlloc(size);
30-
update();
3125
}
3226

33-
public void update() {
34-
transformationMatrix.getToAddress(pointer);
27+
public void update(int pos, SSBOBuffer instanceBuffer) {
28+
instanceBuffer.put(pos, transformationMatrix);
3529
}
3630

3731
public void link(MultiRenderObject object) {
@@ -60,7 +54,6 @@ public void setVariant(int variant) {
6054

6155
@Override
6256
public void close() throws IOException {
63-
MemoryUtil.nmemFree(pointer);
6457
}
6558

6659
public boolean isLinked() {

0 commit comments

Comments
 (0)