Skip to content

Commit 7691068

Browse files
committed
Fix various stuff v3
1 parent 055f45c commit 7691068

File tree

11 files changed

+73
-45
lines changed

11 files changed

+73
-45
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ public MaterialReference deserialize(JsonElement json, Type typeOfT, JsonDeseria
124124

125125
images.setDiffuse(texture);
126126

127-
if (type.equals("masked")) {
127+
if (type.contains("masked")) {
128128
var color = jsonObject.has("color") ? color(jsonObject.get("color")) : new Vector3f(1.0f, 1.0f, 1.0f);
129129
shader = "masked";
130130
values.setBaseColor1(color);

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

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,8 @@ public void close() throws IOException {
164164

165165
GL43.glDeleteBuffers(modelBuffer);
166166
GL43.glDeleteBuffers(destBuffer);
167+
this.uvTransformBuffer.delete();
168+
this.instanceBuffer.delete();
167169
}
168170

169171
public boolean isEmpty() {
@@ -198,12 +200,13 @@ public void updateSSBOs() {
198200
transform = Transform.DEFAULT;
199201
}
200202

201-
transform.upload(i * meshes.length + meshId * Float.BYTES * 4, uvTransformBuffer);
202-
}
203-
204-
instanceBuffer.upload();
205-
uvTransformBuffer.upload();
203+
int stride = Float.BYTES * 4; // 16
204+
int index = i * meshes.length + meshId;
205+
transform.upload(index * stride, uvTransformBuffer); }
206206
}
207+
208+
instanceBuffer.upload();
209+
uvTransformBuffer.upload();
207210
}
208211

209212
public <T extends ObjectInstance> boolean add(@NotNull T instance) {
@@ -221,6 +224,11 @@ private void ensureCapacity() {
221224
var size = instances.size();
222225

223226
instanceBuffer.ensureCapacity((long) size * InstanceDetails.size);
227+
uvTransformBuffer.ensureCapacity(
228+
(long) instances.size()
229+
* meshes.length
230+
* Float.BYTES * 4
231+
);
224232
}
225233

226234
public abstract int targetVertexStride();

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public static void processModel(
7878
var dimensions = new Vector3f();
7979

8080
var vertexCount = 0;
81-
var indexBytes = 0;
81+
var indexCount = 0;
8282

8383

8484
int alignment = glGetInteger(GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT);
@@ -89,14 +89,14 @@ public static void processModel(
8989
maxVertex = Math.max(maxVertex, mesh.mNumFaces() * 3);
9090

9191
vertexCount += mesh.mNumVertices();
92-
indexBytes += mesh.mNumFaces() * 3;
92+
indexCount += mesh.mNumFaces() * 3;
9393
}
9494

9595
objects.maxVertex = maxVertex;
9696

9797

9898

99-
indexBytes *= Integer.BYTES;
99+
var indexBytes = indexCount *= Integer.BYTES;
100100

101101
int drawBytes = meshes.length * Integer.BYTES * 2;
102102

@@ -115,7 +115,7 @@ public static void processModel(
115115
objects.vertex = new SbboOffset(0, vertexBytes);
116116
objects.index = new SbboOffset(indexOffset, indexBytes);
117117
objects.draw = new SbboOffset(drawOffset, drawBytes);
118-
objects.target = new SbboOffset(0, objects.targetVertexStride() * maxVertex);
118+
objects.target = new SbboOffset(0, objects.targetVertexStride() * indexCount);
119119

120120
int[] counters = new int[2]; // index Count
121121

@@ -148,7 +148,7 @@ public static void processModel(
148148
GL43.glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
149149
objects.destBuffer = bufferId;
150150

151-
objects.uvTransformBuffer = new SSBOBuffer(Float.BYTES * 4);
151+
objects.uvTransformBuffer = new SSBOBuffer(Float.BYTES * 4 * objects.meshes.length);
152152
objects.instanceBuffer = new SSBOBuffer(InstanceDetails.size);
153153

154154
MemoryUtil.memFree(buffer);

src/library/java/gg/generations/rarecandy/renderer/pipeline/util/Uniform.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@ public class Uniform {
1717
private static final FloatBuffer VEC2_TRANSFER_BUFFER = MemoryUtil.memAllocFloat(2);
1818
private static final FloatBuffer VEC3_TRANSFER_BUFFER = MemoryUtil.memAllocFloat(3);
1919
private static final FloatBuffer VEC4_TRANSFER_BUFFER = MemoryUtil.memAllocFloat(4);
20+
protected final String name;
2021
public final int type;
2122
public final int count;
2223
private final int[] locations;
2324

2425
public Uniform(int program, String name, int type, int count) {
26+
this.name = name;
2527
this.type = type;
2628
this.count = count;
2729
this.locations = new int[count];

src/library/java/gg/generations/rarecandy/renderer/pipeline/util/UniformBinding.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,8 @@
77
public record UniformBinding(
88
Uniform uniform,
99
UniformCallback callback
10-
) {}
10+
) {
11+
public String name() {
12+
return uniform.name;
13+
}
14+
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class RareCandy {
1515
private static final Queue<Runnable> TASKS = new ConcurrentLinkedQueue<>();
1616

1717
private final List<MultiRenderObject> objects = new ArrayList<>();
18-
private final List<MultiRenderObject> objectsToRemove = new ArrayList<>();
18+
private final java.util.Set<MultiRenderObject> objectsToRemove = new java.util.HashSet<>();
1919

2020
public RareCandy() {
2121
ThreadSafety.initContextThread();
@@ -96,4 +96,8 @@ public void end() {
9696
objectsToRemove.clear();
9797
}
9898
}
99+
100+
public void remove(MultiRenderObject loadedModel) {
101+
objects.remove(loadedModel);
102+
}
99103
}

src/library/java/gg/generations/rarecandy/renderer/storage/SSBOBuffer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public SSBOBuffer(int capacity) {
3030
public void ensureCapacity(long newCapacity) {
3131
// Resize native buffer if needed
3232
if (pointer == 0 || currentCapacity < newCapacity) {
33-
if(pointer > 0) MemoryUtil.nmemAlloc(pointer);
33+
if(pointer > 0) MemoryUtil.nmemFree(pointer);
3434
pointer = MemoryUtil.nmemAlloc((int) newCapacity);
3535
}
3636

src/main/java/gg/generations/rarecandy/tools/gui/GuiPipelines.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,14 @@ public static void onInitialize(RareCandyCanvas canvas, PokeUtilsGui.Settings se
7171
.addSSBORange(Scope.MODEL, "SrcBuffer", 0, ctx -> ctx.object().modelBuffer, ctx -> ctx.object().vertex)
7272
.addSSBORange(Scope.MODEL, "IndexBuffer", 1, ctx -> ctx.object().modelBuffer, ctx -> ctx.object().index)
7373
.addSSBORange(Scope.MODEL, "DrawCommands", 2, ctx -> ctx.object().modelBuffer, ctx -> ctx.object().draw)
74-
.addSSBO(Scope.MODEL, "InstanceBuffer", 3, ctx -> ctx.object().instanceBuffer.getBufferId())
75-
.addSSBO(Scope.MODEL, "TransformBuffer", 4, ctx -> ctx.object().instanceBuffer.getBufferId())
76-
.addSSBO(Scope.MODEL, "DstBuffer", 5, ctx -> ctx.object().destBuffer)
74+
.addSSBO(Scope.MODEL, "InstanceBuffer", 3, ctx -> {
75+
var id = ctx.object().instanceBuffer.getBufferId();
76+
return id;
77+
})
78+
.addSSBO(Scope.MODEL, "TransformBuffer", 4, ctx -> ctx.object().uvTransformBuffer.getBufferId())
79+
.addSSBO(Scope.MODEL, "DstBuffer", 5, ctx -> {
80+
return ctx.object().destBuffer;
81+
})
7782
.addUniform(Scope.MODEL, "variantSize", (uniform, ctx) -> uniform.uploadInt(ctx.object().meshes.length))
7883
.addUniform(Scope.GLOBAL, "instanceId", (uniform, ctx) -> uniform.uploadInt(instanceId))
7984
.build();
@@ -103,11 +108,11 @@ public static void onInitialize(RareCandyCanvas canvas, PokeUtilsGui.Settings se
103108
SOLID = TraditionalPipeline.builder(builtin("rewrite/solid.vs.glsl"), builtin("rewrite/solid.fs.glsl"))
104109
.apply(builder -> GuiPipelines.common(builder, canvas))
105110
.autoSampler2D(Scope.GLOBAL, "tex", 0, ctx -> textures[1].getId())
106-
// .addUniform(Scope.GLOBAL, "light", (uniform, ctx) -> {
107-
// var light = (int) (RareCandyCanvas.getLightLevel() * 15);
108-
//
109-
// uniform.upload2i(0, light);
110-
// })
111+
.addUniform(Scope.GLOBAL, "light", (uniform, ctx) -> {
112+
var light = (int) (RareCandyCanvas.getLightLevel() * 15);
113+
114+
uniform.upload2i(0, light);
115+
})
111116
.autoSampler2D(Scope.GLOBAL, "lightmap", 1, (ctx) -> ITextureLoader.instance().getTexture("light_map").getId())
112117
.autoVec3(Scope.GLOBAL, "Light0_Direction", (ctx) -> light0)
113118
.autoVec3(Scope.GLOBAL, "Light1_Direction", (ctx) -> light1)

src/main/java/gg/generations/rarecandy/tools/gui/RareCandyCanvas.java

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -97,32 +97,39 @@ public void openFile(PixelAsset pkFile, String name, Runnable runnable, boolean
9797
currentAnimation = null;
9898
rendering = false;
9999

100+
// Detach references immediately so render() will not touch freed objects
101+
final ToggleableMultiRenderObject oldModel = loadedModel;
102+
final AnimatedObjectInstance oldInstance = loadedModelInstance;
103+
final List<AnimatedObjectInstance> oldInstances = new ArrayList<>(instances);
100104

105+
loadedModel = null;
106+
loadedModelInstance = null;
107+
instances.clear();
101108

102-
if(loadedModel != null) {
103-
loadedModel.close();
104-
105-
renderer.clear();
109+
this.fileName = name;
106110

107-
loadedModel = null;
108-
instances.forEach(animatedObjectInstance -> {
111+
// Schedule destruction on the GL/context thread at a safe point
112+
if (oldModel != null) {
113+
RareCandy.runLater(() -> {
109114
try {
110-
animatedObjectInstance.close();
115+
// Ensure renderer no longer references the object BEFORE deleting its GL resources
116+
renderer.remove(oldModel); // must only detach, not close
117+
118+
// Close instances first (if they own per-instance GL objects), then the model
119+
for (var inst : oldInstances) {
120+
inst.close();
121+
}
122+
123+
oldModel.close();
111124
} catch (IOException e) {
112125
throw new RuntimeException(e);
113126
}
114127
});
115-
116-
instances.clear();
117128
}
118129

119-
this.fileName = name;
120-
121-
if(pkFile == null) return;
130+
if (pkFile == null) return;
122131

123132
loadPokemonModel(pkFile, model -> {
124-
var i = 0;
125-
126133
loadedModel = (ToggleableMultiRenderObject) model;
127134

128135
scaleModifier = loadedModel.scale;
@@ -131,18 +138,16 @@ public void openFile(PixelAsset pkFile, String name, Runnable runnable, boolean
131138
handler.fileViewer.scale.reset();
132139

133140
var variants = model.availableVariants();
134-
135141
var variant = !variants.isEmpty() ? variants.iterator().next() : null;
136142

137143
var instance = new AnimatedObjectInstance(new Matrix4f(), loadedModel.variantNameToId.get(variant));
138-
139144
loadedModelInstance = renderer.add(model, instance);
140145
loadedModelInstance.use();
141146

142147
model.updateDimensions();
143148
runnable.run();
144149

145-
if(resetAnimation) setAnimation("idle");
150+
if (resetAnimation) setAnimation("idle");
146151

147152
rendering = true;
148153
});
@@ -210,7 +215,7 @@ public void render() {
210215
}
211216

212217
if(animate) time = (System.currentTimeMillis() - startTime) / 1000f;
213-
renderer.update(time);
218+
// renderer.update(time);
214219

215220
if (runnable != null) runnable.pre();
216221

src/main/resources/shaders/rewrite/solid.vs.glsl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,10 @@ void main() {
6161
Vertex v = vertices[gl_VertexID];
6262

6363
mat4 worldSpace = projectionMatrix * viewMatrix;
64-
vec4 worldPosition = vec4(v.position, 1.0);
64+
vec4 pos = worldSpace * vec4(v.position, 1.0);
6565

6666
texCoord0 = v.texcoord;
67-
gl_Position = worldSpace * worldPosition;
68-
vertexDistance = fog_distance(v.position, FogShape);
67+
gl_Position = pos;
68+
vertexDistance = fog_distance(pos.xyz, FogShape);
6969
vertexColor = getVertexColor(v.normal);
7070
}

0 commit comments

Comments
 (0)