Skip to content

Commit b6ce984

Browse files
committed
I think I almost got it!
1 parent 7607799 commit b6ce984

25 files changed

Lines changed: 367 additions & 159 deletions

src/library/java/gg/generations/rarecandy/pokeutils/ModelTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ public static void main(String[] args) {
5656
}
5757
""";
5858
var obj = (ModelConfig.GSON.fromJson(json, ModelConfig.class));
59-
System.out.println();
6059

6160

6261
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public void upload(SSBOBuffer buffer) {
2929
}
3030

3131
public void upload(ByteBuffer buffer) {
32-
buffer.putFloat(scale.x()).putFloat(scale.y()).putFloat(offset.x()).putFloat(offset.x());
32+
buffer.putFloat(scale.x()).putFloat(scale.y()).putFloat(offset.x()).putFloat(offset.y());
3333
}
3434

3535
public static JsonElement serialize(Transform transform, JsonSerializationContext ctx) {

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

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import gg.generations.rarecandy.renderer.rendering.ObjectInstance;
1111
import gg.generations.rarecandy.renderer.rendering.RenderStage;
1212
import gg.generations.rarecandy.renderer.storage.AnimatedObjectInstance;
13+
import gg.generations.rarecandy.renderer.storage.DrawBuffer;
1314
import gg.generations.rarecandy.renderer.storage.SSBOBuffer;
1415
import gg.generations.rarecandy.renderer.textures.TextureArray;
1516
import org.jetbrains.annotations.NotNull;
@@ -34,11 +35,14 @@ public abstract class MultiRenderObject {
3435
public Map<String, Integer> materialNameToId;
3536
public Map<String, Integer> variantNameToId;
3637
public Map<String, Integer> imageNameToId;
38+
public Map<Integer, Integer> idToBuffer;
39+
3740
public int[] meshes;
3841
public Material[] materials;
3942
public Variant[] variants;
4043
public TextureArray images;
4144
public int[][] variantRelationships;
45+
public RenderStage[][] stageRelationships;
4246

4347
public SbboOffset vertex;
4448
public SbboOffset index;
@@ -48,7 +52,8 @@ public abstract class MultiRenderObject {
4852

4953
public SSBOBuffer instanceBuffer;
5054
public SSBOBuffer drawInfoBuffer;
51-
public SSBOBuffer drawBuffer;
55+
56+
public EnumMap<RenderStage, DrawBuffer> drawBuffer = new EnumMap<>(RenderStage.class);
5257

5358
public int modelBuffer;
5459

@@ -76,6 +81,7 @@ public MultiRenderObject(ModelLoader.Names names) {
7681
variants = new Variant[names.variants().size()];
7782
variantNameToId = listToMap(names.variants());
7883
variantRelationships = new int[meshes.length][variants.length];
84+
stageRelationships = new RenderStage[meshes.length][variants.length];
7985
imageNameToId = listToMap(names.images());
8086
}
8187

@@ -114,11 +120,12 @@ public void update(double absoluteTime) {
114120
}
115121
queue.clear();
116122

123+
instances.removeIf(a -> !a.isLinked());
117124
for (ObjectInstance instance : instances) {
118125
instance.update(absoluteTime);
119126
}
120127

121-
instances.removeIf(a -> !a.isLinked());
128+
updateSSBOs();
122129
}
123130

124131
public Set<String> availableVariants() {
@@ -168,7 +175,8 @@ public void close() throws IOException {
168175
GL43.glDeleteBuffers(modelBuffer);
169176
this.drawInfoBuffer.delete();
170177
this.instanceBuffer.delete();
171-
this.drawBuffer.delete();
178+
179+
drawBuffer.values().forEach(SSBOBuffer::delete);
172180
}
173181

174182
public boolean isEmpty() {
@@ -179,20 +187,28 @@ public void updateSSBOs() {
179187
ensureCapacity();
180188
resetSSBOs();
181189

190+
var drawId = 0;
191+
182192
for (int instanceId = 0; instanceId < instances.size(); instanceId++) {
183193
ObjectInstance instance = instances.get(instanceId);
184194
instance.update(instanceBuffer);
185195

186196
for (int meshId = 0; meshId < meshes.length; meshId++) {
187197

188-
// var variant = getVariant(meshId, instance.variant());
198+
var stage = stageRelationships[meshId][instance.variant()];
199+
200+
if(!shouldRender(meshId, instance)) continue;
201+
202+
var buffer = drawBuffer.get(stage);
203+
204+
if(buffer == null) continue;
189205

190206
//TODO: Redo material animation
207+
// var variant = getVariant(meshId, instance.variant());
208+
// var material = variant.material();
191209
// Transform animationTransform = Transform.DEFAULT;
192210

193-
// var material = variant.material();
194211

195-
var isRendering = shouldRender(meshId, instance);
196212

197213
// if (instance instanceof AnimatedObjectInstance animatedInstance) {
198214
//
@@ -204,28 +220,29 @@ public void updateSSBOs() {
204220
// }
205221

206222
// Transform.combine(animationTransform).upload(drawInfoBuffer);
223+
224+
225+
207226
drawInfoBuffer.put(variantRelationships[meshId][instance.variant()]);
208227
drawInfoBuffer.put(instanceId);
209-
drawInfoBuffer.put(isRendering);
228+
drawInfoBuffer.put(meshId);
210229
drawInfoBuffer.put(0);
211230

212-
drawBuffer
213-
.put(meshes[meshId])
214-
.put(1)
215-
.put(0)
216-
.put(0);
231+
buffer.putDraw(meshes[meshId], 1, 0, drawId);
232+
drawId++;
217233
}
218234
}
219235

220236
instanceBuffer.upload();
221237
drawInfoBuffer.upload();
222-
drawBuffer.upload();
238+
drawBuffer.values().forEach(SSBOBuffer::upload);
223239
}
224240

225241
private void resetSSBOs() {
226242
instanceBuffer.reset();
227243
drawInfoBuffer.reset();
228-
drawBuffer.reset();
244+
245+
drawBuffer.values().forEach(DrawBuffer::reset);
229246
}
230247

231248
public <T extends ObjectInstance> boolean add(@NotNull T instance) {
@@ -248,7 +265,10 @@ private void ensureCapacity() {
248265
* meshes.length
249266
* TRANSFORM_ENTRY_BYTES
250267
);
251-
drawBuffer.ensureCapacity((long) meshes.length * size * Integer.BYTES * 4);
268+
269+
var drawSize = (long) meshes.length * size * Integer.BYTES * 4;
270+
271+
drawBuffer.values().forEach(buffer -> buffer.ensureCapacity(drawSize));
252272
}
253273

254274
public abstract int targetVertexStride();

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

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import gg.generations.rarecandy.renderer.components.MultiRenderObject;
1313
import gg.generations.rarecandy.renderer.model.*;
1414
import gg.generations.rarecandy.renderer.model.material.Material;
15+
import gg.generations.rarecandy.renderer.rendering.RenderStage;
16+
import gg.generations.rarecandy.renderer.storage.DrawBuffer;
1517
import gg.generations.rarecandy.renderer.storage.SSBOBuffer;
1618
import gg.generations.rarecandy.renderer.textures.Texture;
1719
import gg.generations.rarecandy.renderer.textures.TextureArray;
@@ -20,6 +22,7 @@
2022
import org.joml.Vector3f;
2123
import org.lwjgl.assimp.*;
2224
import org.lwjgl.opengl.*;
25+
import org.lwjgl.stb.STBImage;
2326
import org.lwjgl.system.MemoryUtil;
2427

2528
import java.io.IOException;
@@ -148,7 +151,6 @@ public static void processModel(
148151

149152
objects.drawInfoBuffer = new SSBOBuffer(TRANSFORM_ENTRY_BYTES * objects.meshes.length);
150153
objects.instanceBuffer = new SSBOBuffer(InstanceDetails.size);
151-
objects.drawBuffer = new SSBOBuffer(Integer.BYTES * 4 * objects.meshes.length);
152154

153155
MemoryUtil.memFree(buffer);
154156
MemoryUtil.memFree(vertexBuffer);
@@ -259,8 +261,6 @@ private static void processVariants(MultiRenderObject object, ModelConfig config
259261

260262
});
261263

262-
var variants = object.variantRelationships;
263-
264264
if(config.variants != null) {
265265
config.variants.forEach((variantKey, variantParent) -> {
266266
var variantIndex = names.variants.indexOf(variantKey);
@@ -279,14 +279,13 @@ private static void processVariants(MultiRenderObject object, ModelConfig config
279279

280280
applyVariantDetails(config.defaultVariant, map);
281281

282-
applyVariant(variantIndex, variants, map, aliases, names, variantList);
282+
applyVariant(object, variantIndex, map, aliases, names, variantList);
283283
});
284284
} else {
285285
for (int mesh = 0; mesh < defaultVariant.length; mesh++) {
286286
var variant = defaultVariant[mesh];
287287

288-
variants[mesh][0] = variant;
289-
288+
set(object, mesh, 0, variant, variantList);
290289
}
291290
}
292291

@@ -315,8 +314,8 @@ private static void applyVariantDetails(Map<String, VariantDetails> applied, Map
315314
}
316315

317316
private static void applyVariant(
317+
MultiRenderObject object,
318318
int variantKey,
319-
int[][] variantsMap,
320319
Map<String, VariantDetails> variantMap,
321320
Map<String, List<String>> aliases,
322321
Names names,
@@ -345,15 +344,25 @@ private static void applyVariant(
345344
if(!aliases.isEmpty() && aliases.containsKey(k)) {
346345
for (String s : aliases.get(k)) {
347346
mesh = names.meshes.indexOf(s);
348-
variantsMap[mesh][variantKey] = variant;
347+
348+
set(object, mesh, variantKey, variant, variants);
349349
}
350350
}
351351
else {
352-
variantsMap[mesh][variantKey] = variant;
352+
set(object, mesh, variantKey, variant, variants);
353353
}
354354
});
355355
}
356356

357+
private static void set(MultiRenderObject object, int mesh, int variantKey, int variant, List<Variant> variants) {
358+
var material = object.materials[variants.get(variant).material()];
359+
var stage = RenderStage.from(material);
360+
361+
object.drawBuffer.computeIfAbsent(stage, a -> new DrawBuffer(Integer.BYTES * 4 * object.meshes.length));
362+
object.stageRelationships[mesh][variantKey] = stage;
363+
object.variantRelationships[mesh][variantKey] = variant;
364+
}
365+
357366
private static int addOrGetIndex(List<Variant> variants, Variant variant) {
358367
var index = variants.indexOf(variant);
359368

@@ -463,10 +472,6 @@ private static int processPrimitiveModel(
463472
var tangent = aiTangents.get(i);
464473
var bitangent = aiBitangents.get(i);
465474

466-
if(uv.x() > 1 || uv.y() > 1 || uv.z() > 1) {
467-
System.out.println();
468-
}
469-
470475
vertexBuffer.putFloat(position.x());
471476
vertexBuffer.putFloat(position.y());
472477
vertexBuffer.putFloat(position.z());
@@ -653,11 +658,11 @@ public static TextureArray readImages(ResourceReader asset, List<String> imageNa
653658
var array = new TextureArray(resolution, resolution,imageNames.size(), false);
654659

655660
for (int i = 0; i < imageNames.size(); i++) {
656-
var image = Texture.scaleAndProcess(asset.getFile(imageNames.get(i)), resolution);
661+
var image = Texture.getColorBuffer(asset.getFile(imageNames.get(i)), resolution);
657662

658663
array.fillLayer(i, image);
659664

660-
MemoryUtil.memFree(image);
665+
STBImage.stbi_image_free(image);
661666
}
662667

663668
return array;

src/library/java/gg/generations/rarecandy/renderer/model/Variant.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,17 @@
66
import java.nio.ByteBuffer;
77

88
public record Variant(int material, int effect, boolean paradox, boolean hide, Transform[] transform) {
9-
public static final int SIZE = TransformSet.SIZE + Integer.BYTES * 3;
9+
public static final int SIZE = TransformSet.SIZE + Integer.BYTES * 4;
1010

1111
public void put(ByteBuffer buffer) {
12+
1213
transform[0].upload(buffer);
1314
transform[1].upload(buffer);
1415
transform[2].upload(buffer);
1516
transform[3].upload(buffer);
1617
buffer.putInt(material);
1718
buffer.putInt(effect);
1819
buffer.putInt(paradox ? 1 : 0);
20+
buffer.putInt(0);
1921
}
2022
}

src/library/java/gg/generations/rarecandy/renderer/model/material/Material.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ public void put(ByteBuffer buffer) {
2121
values.put(buffer);
2222
buffer.putInt(colorMethod);
2323
buffer.putInt(blendType() == BlendType.Regular ? 1 : 0);
24-
buffer.putInt(0);
2524
}
2625

2726
@Override

src/library/java/gg/generations/rarecandy/renderer/model/material/MaterialValues.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ public void put(ByteBuffer pointer) {
286286
pointer.putFloat(emiColor2.x).putFloat(emiColor2.y).putFloat(emiColor2.z).putFloat(0f);
287287
pointer.putFloat(emiColor3.x).putFloat(emiColor3.y).putFloat(emiColor3.z).putFloat(0f);
288288
pointer.putFloat(emiColor4.x).putFloat(emiColor4.y).putFloat(emiColor4.z).putFloat(0f);
289-
pointer.putFloat(emiColor5.x).putFloat(emiColor5.y).putFloat(emiColor5.z);
289+
pointer.putFloat(emiColor5.x).putFloat(emiColor5.y).putFloat(emiColor5.z).putFloat(0f);
290290

291291
pointer.putFloat(emiIntensity1);
292292
pointer.putFloat(emiIntensity2);

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

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import gg.generations.rarecandy.renderer.LoggerUtil;
44
import gg.generations.rarecandy.renderer.ThreadSafety;
55
import gg.generations.rarecandy.renderer.components.MultiRenderObject;
6-
import gg.generations.rarecandy.renderer.pipeline.Pipeline;
76
import gg.generations.rarecandy.renderer.pipeline.traditional.TraditionalPipeline;
87
import org.jetbrains.annotations.NotNull;
98

@@ -41,10 +40,10 @@ public void update(double secondsPassed) {
4140
}
4241

4342
for (var object : objects) {
44-
object.update(secondsPassed);
45-
4643
if (object.isEmpty()) {
4744
objectsToRemove.add(object);
45+
} else {
46+
object.update(secondsPassed);
4847
}
4948
}
5049

@@ -55,16 +54,28 @@ public void update(double secondsPassed) {
5554
}
5655
}
5756

58-
public void render(TraditionalPipeline pipeline, RenderStage stage) {
57+
public void render(TraditionalPipeline pipeline, StateManager manager) {
5958
for (var object : objects) {
6059
if (object == null) continue;
6160

62-
pipeline.bindModel(object, stage);
61+
pipeline.bindModel(object, null);
6362

64-
object.render(pipeline, stage);
63+
render(manager, pipeline, object, RenderStage.SOLID_DEPTH_CULL);
64+
render(manager, pipeline, object, RenderStage.SOLID_DEPTH_NOCULL);
65+
render(manager, pipeline, object, RenderStage.SOLID_NODEPTH_CULL);
66+
render(manager, pipeline, object, RenderStage.SOLID_NODEPTH_NOCULL);
67+
render(manager, pipeline, object, RenderStage.TRANSPARENT_DEPTH_CULL);
68+
render(manager, pipeline, object, RenderStage.TRANSPARENT_DEPTH_NOCULL);
69+
render(manager, pipeline, object, RenderStage.TRANSPARENT_NODEPTH_CULL);
70+
render(manager, pipeline, object, RenderStage.TRANSPARENT_NODEPTH_NOCULL);
6571
}
6672
}
6773

74+
private void render(StateManager manager, TraditionalPipeline pipeline, MultiRenderObject object, RenderStage renderStage) {
75+
manager.toggle(renderStage);
76+
object.render(pipeline, renderStage);
77+
}
78+
6879
public void clear() {
6980
for (var obj : objects) {
7081
try {
@@ -85,7 +96,6 @@ public <T extends ObjectInstance> T add(@NotNull MultiRenderObject object, @NotN
8596
return instance;
8697
}
8798

88-
8999
public void end() {
90100
if(!objectsToRemove.isEmpty()) {
91101
for (var renderObject : objectsToRemove) {
@@ -101,6 +111,10 @@ public void end() {
101111
}
102112
}
103113

114+
public List<MultiRenderObject> getObjects() {
115+
return objects;
116+
}
117+
104118
public void remove(MultiRenderObject loadedModel) {
105119
objects.remove(loadedModel);
106120
}

0 commit comments

Comments
 (0)