Skip to content

Commit 0fe0e07

Browse files
committed
Seperated transparent and solid stages
1 parent e455465 commit 0fe0e07

File tree

17 files changed

+105
-86
lines changed

17 files changed

+105
-86
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ plugins {
1111
}
1212

1313
group = "gg.generations"
14-
version = "2.11.21"
14+
version = "2.11.22"
1515

1616
java.toolchain.languageVersion.set(JavaLanguageVersion.of(17))
1717

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,27 @@
11
package gg.generations.rarecandy.pokeutils;
22

33
import org.lwjgl.opengl.GL11;
4+
import org.lwjgl.opengl.GL20;
45

56
public enum BlendType {
6-
None(-1, -1), Regular(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
7-
8-
private final int src;
9-
private final int dst;
10-
11-
BlendType(int src, int dst) {
12-
this.src = src;
13-
this.dst = dst;
7+
None(-1, -1, -1, -1), Regular(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA);
8+
9+
private final int rgbSrc;
10+
private final int rgbDst;
11+
private final int alphaSrc;
12+
private final int alphaDst;
13+
14+
BlendType(int rgbSrc, int rgbDst, int alphaSrc, int alphaDst) {
15+
this.rgbSrc = rgbSrc;
16+
this.rgbDst = rgbDst;
17+
this.alphaSrc = alphaSrc;
18+
this.alphaDst = alphaDst;
1419
}
1520

1621
public void enable() {
22+
if(this != BlendType.Regular) return;
23+
GL20.glBlendFuncSeparate(rgbSrc, rgbDst, alphaSrc, alphaDst);
1724
GL11.glEnable(GL11.GL_BLEND);
18-
GL11.glBlendFunc(src, dst);
1925
}
2026

2127
public static BlendType from(String cull) {
@@ -29,6 +35,7 @@ public static BlendType from(String cull) {
2935

3036

3137
public void disable() {
38+
if(this != BlendType.Regular) return;
3239
GL11.glDisable(GL11.GL_BLEND);
3340
}
3441
}

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

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,10 @@ public class MaterialReference {
3737

3838
public Map<String, Object> values;
3939

40-
public MaterialReference(String parent, String shader, CullType cull, BlendType blend, Map<String, String> images, Map<String, Object> values) {
40+
public MaterialReference(String parent, String shader, String effect, CullType cull, BlendType blend, Map<String, String> images, Map<String, Object> values) {
4141
this.parent = parent;
4242
this.shader = shader;
43+
this.effect = effect;
4344
this.cull = cull;
4445
this.blend = blend;
4546
this.images = images;
@@ -52,6 +53,7 @@ public static Material process(String name, @NotNull Map<String, MaterialReferen
5253
var cull = reference.cull;
5354
var blend = reference.blend;
5455
var shader = reference.shader;
56+
var effect = reference.effect;
5557
var images = new HashMap<>(reference.images);
5658
var values = new HashMap<>(reference.values);
5759
var parent = reference.parent;
@@ -62,18 +64,25 @@ public static Material process(String name, @NotNull Map<String, MaterialReferen
6264
if(reference == null) parent = null;
6365
else {
6466

65-
if (!shader.equals(reference.shader)) {
67+
if (shader == null) {
6668
shader = reference.shader;
6769
}
6870

69-
if (!cull.equals(reference.cull)) {
71+
if (effect == null) {
72+
effect = reference.effect;
73+
}
74+
75+
76+
if (cull == null) {
7077
cull = reference.cull;
7178
}
7279

73-
if (!blend.equals(reference.blend)) {
80+
if (blend == null) {
7481
blend = reference.blend;
7582
}
7683

84+
85+
//TODO: Check if the parent's values are overriden vs it overriding child.
7786
reference.images.forEach((key, value) -> images.merge(key, value, (old, value1) -> old));
7887
reference.values.forEach((key, value) -> values.merge(key, value, (old, value1) -> old));
7988

@@ -91,7 +100,7 @@ public static Material process(String name, @NotNull Map<String, MaterialReferen
91100
map.put(a.getKey(), a.getValue());
92101
}
93102
}
94-
return new Material(name, map, values, cull, blend, shader);
103+
return new Material(name, map, values, cull, blend, shader + (effect != null ? "_" + effect : ""));
95104
}
96105
public static final class Serializer implements JsonDeserializer<MaterialReference> {
97106
@Override
@@ -111,7 +120,7 @@ public MaterialReference deserialize(JsonElement json, Type typeOfT, JsonDeseria
111120

112121
var jsonObject = json.getAsJsonObject();
113122

114-
String parent = jsonObject.has("inherits") ? jsonObject.get("inherits").getAsString() : null;
123+
String parent = jsonObject.has("inherits") ? jsonObject.get("inherits").getAsString() : jsonObject.has("parent") ? jsonObject.get("parent").getAsString() : null;
115124

116125
if(jsonObject.has("type")) {
117126

@@ -156,7 +165,7 @@ public MaterialReference deserialize(JsonElement json, Type typeOfT, JsonDeseria
156165
values = jsonObject.has("values") ? values(jsonObject.getAsJsonObject("values")) : new HashMap<>();
157166
}
158167

159-
return new MaterialReference(parent, shader + (effect != null ? "_" + effect : ""), cull, blend, images, values);
168+
return new MaterialReference(parent, shader, effect, cull, blend, images, values);
160169

161170
// throw new JsonParseException("Material type %s invalid".formatted(type));
162171
}
@@ -239,6 +248,7 @@ public boolean equals(Object o) {
239248
// Compare simple fields
240249
if (!Objects.equals(parent, that.parent)) return false;
241250
if (!Objects.equals(shader, that.shader)) return false;
251+
if (!Objects.equals(effect, that.effect)) return false;
242252
if (!Objects.equals(cull, that.cull)) return false;
243253
if (!Objects.equals(blend, that.blend)) return false;
244254

@@ -253,7 +263,7 @@ public boolean equals(Object o) {
253263

254264
@Override
255265
public int hashCode() {
256-
int result = Objects.hash(parent, shader, cull, blend);
266+
int result = Objects.hash(parent, shader, effect, cull, blend);
257267
result = 31 * result + hashImages(images);
258268
result = 31 * result + hashValues(values);
259269
return result;

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ public VariantParent deserialize(JsonElement json, Type typeOfT, JsonDeserializa
1818

1919
if(jsonObject.has("inherits")) {
2020
inherits = jsonObject.remove("inherits").getAsJsonPrimitive().getAsString();
21+
} else if(jsonObject.has("parent")) {
22+
inherits = jsonObject.remove("parent").getAsJsonPrimitive().getAsString();
2123
}
2224

2325
try {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package gg.generations.rarecandy.renderer.components;
22

33
import gg.generations.rarecandy.renderer.rendering.ObjectInstance;
4+
import gg.generations.rarecandy.renderer.rendering.RenderStage;
45

56
import java.util.List;
67

78
public class GuiObject extends RenderObject {
89

910
@Override
10-
public <T extends RenderObject> void render(List<ObjectInstance> instances) {
11+
public <T extends RenderObject> void render(RenderStage stage, List<ObjectInstance> instances) {
1112

1213
}
1314

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import gg.generations.rarecandy.renderer.model.RenderModel;
44
import gg.generations.rarecandy.renderer.model.Variant;
55
import gg.generations.rarecandy.renderer.rendering.ObjectInstance;
6+
import gg.generations.rarecandy.renderer.rendering.RenderStage;
67

78
import java.io.IOException;
89
import java.util.ArrayList;
@@ -21,8 +22,8 @@ public void setup(Map<String, Variant> variants, RenderModel model, String name)
2122
this.ready = true;
2223
}
2324

24-
public <T extends RenderObject> void render(List<ObjectInstance> instances) {
25-
model.render(instances, this);
25+
public <T extends RenderObject> void render(RenderStage stage, List<ObjectInstance> instances) {
26+
model.render(stage, instances, this);
2627
}
2728

2829
public <T extends RenderObject> void render(ObjectInstance instance) {

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import gg.generations.rarecandy.renderer.model.material.Material;
44
import gg.generations.rarecandy.renderer.rendering.ObjectInstance;
5+
import gg.generations.rarecandy.renderer.rendering.RenderStage;
56
import org.jetbrains.annotations.Nullable;
67
import org.joml.Matrix4f;
78
import org.joml.Vector3f;
@@ -96,10 +97,10 @@ public Material getMaterial(@Nullable String materialId) {
9697
}
9798

9899
@Override
99-
public <V extends RenderObject> void render(List<ObjectInstance> instances) {
100+
public <V extends RenderObject> void render(RenderStage stage, List<ObjectInstance> instances) {
100101
for (T object : this.objects) {
101102
if (object != null && object.isReady()) {
102-
object.render(instances);
103+
object.render(stage, instances);
103104
}
104105
}
105106
}

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import gg.generations.rarecandy.renderer.model.Variant;
66
import gg.generations.rarecandy.renderer.model.material.Material;
77
import gg.generations.rarecandy.renderer.rendering.ObjectInstance;
8+
import gg.generations.rarecandy.renderer.rendering.RenderStage;
89
import org.jetbrains.annotations.Nullable;
910

1011
import java.io.Closeable;
@@ -42,7 +43,7 @@ public Transform getTransform(@Nullable String variantId) {
4243
return variant != null && variant.offset() != null ? variant.offset() : AnimationController.NO_OFFSET;
4344
}
4445

45-
public abstract <T extends RenderObject> void render(List<ObjectInstance> instances);
46+
public abstract <T extends RenderObject> void render(RenderStage stage, List<ObjectInstance> instances);
4647

4748
public abstract <T extends RenderObject> void render(ObjectInstance instance);
4849

@@ -65,7 +66,9 @@ public Variant getVariant(String variant) {
6566
public void close() throws IOException {
6667
for (var a : variants.values()) {
6768
if(a != null) {
68-
a.material().close();
69+
var material = a.material();
70+
71+
if(material != null) material.close();
6972
}
7073
}
7174
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ private static Map<String, Map<String, Variant>> processVariants(ModelConfig con
221221
});
222222
}
223223

224-
return variants;
224+
return variants;
225225
}
226226

227227
private static <T extends MeshObject> void traverseTree(Matrix4f transform, ModelNode node, MultiRenderObject<T> objects) {

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

Lines changed: 29 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,7 @@ public Vector3f getDimensions() {
9393

9494
private Map<Material, List<Consumer<Pipeline>>> EMPTY = Collections.emptyMap();
9595

96-
public <T extends RenderObject> void render(List<ObjectInstance> instances, T object) {
97-
98-
99-
Map<RenderStage, Map<Material, List<Consumer<Pipeline>>>> map = new HashMap<>();
96+
public <T extends RenderObject> void render(RenderStage stage, List<ObjectInstance> instances, T object) {
10097

10198
for (var instance : instances) {
10299
if (object.shouldRender(instance)) {
@@ -105,55 +102,46 @@ public <T extends RenderObject> void render(List<ObjectInstance> instances, T ob
105102

106103
var material = object.getMaterial(instance.variant());
107104

108-
var stage = RenderStage.SOLID;
109-
110-
if(material.blendType() != BlendType.None) stage = RenderStage.TRANSPARENT;
111-
112-
var stages = map.computeIfAbsent(stage, s -> new HashMap<>());
105+
var transparent = material.blendType() != BlendType.None;
113106

114-
stages.computeIfAbsent(material, a -> new ArrayList<>()).add(pipeline -> {
115-
pipeline.updateOtherUniforms(instance, object);
116-
pipeline.updateTexUniforms(instance, object);
117-
runDrawCalls();
118-
});
107+
if(transparent && stage == RenderStage.TRANSPARENT || stage == RenderStage.SOLID) {
108+
render(material, instance, object);
109+
}
119110
}
120-
121-
122-
123-
map.getOrDefault(RenderStage.SOLID, EMPTY).forEach(GLModel::render);
124-
map.getOrDefault(RenderStage.TRANSPARENT, EMPTY).forEach(GLModel::render);
125111
}
126112

127113
public <T extends RenderObject> void render(ObjectInstance instance, T object) {
128-
Map<Material, List<Consumer<Pipeline>>> solidMap = new HashMap<>();
129-
Map<Material, List<Consumer<Pipeline>>> transparentMap = new HashMap<>();
130-
131-
if (object.shouldRender(instance)) return;
132-
133-
var material = object.getMaterial(instance.variant());
134-
135-
var stage = RenderStage.SOLID;
136-
137-
if(material.blendType() != BlendType.None) stage = RenderStage.TRANSPARENT;
138-
var stages = stage == RenderStage.SOLID ? solidMap : transparentMap;
139-
140-
stages.computeIfAbsent(material, a -> new ArrayList<>()).add(pipeline -> {
141-
pipeline.updateOtherUniforms(instance, object);
142-
pipeline.updateTexUniforms(instance, object);
143-
runDrawCalls();
144-
});
145-
146-
solidMap.forEach(GLModel::render);
147-
transparentMap.forEach(GLModel::render);
114+
// Map<Material, List<Consumer<Pipeline>>> solidMap = new HashMap<>();
115+
// Map<Material, List<Consumer<Pipeline>>> transparentMap = new HashMap<>();
116+
//
117+
// if (object.shouldRender(instance)) return;
118+
//
119+
// var material = object.getMaterial(instance.variant());
120+
//
121+
// var stage = RenderStage.SOLID;
122+
//
123+
// if(material.blendType() != BlendType.None) stage = RenderStage.TRANSPARENT;
124+
// var stages = stage == RenderStage.SOLID ? solidMap : transparentMap;
125+
//
126+
// stages.computeIfAbsent(material, a -> new ArrayList<>()).add(pipeline -> {
127+
// pipeline.updateOtherUniforms(instance, object);
128+
// pipeline.updateTexUniforms(instance, object);
129+
// runDrawCalls();
130+
// });
131+
//
132+
// solidMap.forEach(GLModel::render);
133+
// transparentMap.forEach(GLModel::render);
148134
}
149135

150-
private static void render(Material k, List<Consumer<Pipeline>> v) {
136+
private <T extends RenderObject> void render(Material k, ObjectInstance instance, T object) {
151137
var pl = PipelineRegistry.get(k.getPipeline());
152138

153139
if(pl == null) return;
154140

155141
pl.bind(k);
156-
v.forEach(a -> a.accept(pl));
142+
pl.updateOtherUniforms(instance, object);
143+
pl.updateTexUniforms(instance, object);
144+
runDrawCalls();
157145
pl.unbind(k);
158146
}
159147

0 commit comments

Comments
 (0)