Skip to content

Commit f317292

Browse files
committed
Refractor phase 2 - Material Images redone (HOnestly I'm just winging these names but a resturcture is in progress)
1 parent 5451601 commit f317292

25 files changed

Lines changed: 577 additions & 201 deletions

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

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

33
import com.google.gson.*;
44
import gg.generations.rarecandy.renderer.model.material.Material;
5+
import gg.generations.rarecandy.renderer.model.material.MaterialImages;
56
import gg.generations.rarecandy.renderer.model.material.MaterialValues;
67
import org.jetbrains.annotations.NotNull;
78
import org.joml.Vector3f;
@@ -34,13 +35,13 @@ public class MaterialReference {
3435

3536
public BlendType blend;
3637

37-
public Map<String, String> images;
38+
public MaterialImages images;
3839

3940
public MaterialValues values;
4041

4142
public boolean useDepthTest = true;
4243

43-
public MaterialReference(String parent, String shader, String effect, CullType cull, BlendType blend, Map<String, String> images, MaterialValues values, boolean useDepthTest) {
44+
public MaterialReference(String parent, String shader, String effect, CullType cull, BlendType blend, MaterialImages images, MaterialValues values, boolean useDepthTest) {
4445
this.parent = parent;
4546
this.shader = shader;
4647
this.effect = effect;
@@ -58,7 +59,7 @@ public static Material process(String name, @NotNull Map<String, MaterialReferen
5859
var blend = reference.blend;
5960
var shader = reference.shader;
6061
var effect = reference.effect;
61-
var images = new HashMap<>(reference.images);
62+
var images = new MaterialImages().fill(reference.images);
6263
var values = new MaterialValues().fill(reference.values);
6364
var useDepthTest = reference.useDepthTest;
6465
var parent = reference.parent;
@@ -77,30 +78,21 @@ public static Material process(String name, @NotNull Map<String, MaterialReferen
7778

7879

7980
//TODO: Check if the parent's values are overriden vs it overriding child.
80-
reference.images.forEach(images::putIfAbsent);
81+
images.fill(reference.images);
8182
values.fill(reference.values);
8283

8384
parent = reference.parent;
8485
}
8586
}
8687

8788
values.complete();
88-
89-
var map = new HashMap<String, String>();
90-
for (Map.Entry<String, String> a : images.entrySet()) {
91-
if (imageMap.containsKey(a.getValue())) {
92-
if (map.put(a.getKey(), imageMap.get(a.getValue())) != null) {
93-
throw new IllegalStateException("Duplicate key");
94-
}
95-
} else {
96-
map.put(a.getKey(), a.getValue());
97-
}
98-
}
89+
images = images.complete().processWithImageMap(imageMap);
9990

10091
if(shader == null) shader = "solid";
10192

102-
return new Material(name, map, values, useDepthTest, cull, blend, shader + (effect != null ? "_" + effect : ""));
93+
return new Material(name, images, values, useDepthTest, cull, blend, shader + (effect != null ? "_" + effect : ""));
10394
}
95+
10496
public static final class Serializer implements JsonDeserializer<MaterialReference> {
10597
@Override
10698
public MaterialReference deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
@@ -113,7 +105,7 @@ public MaterialReference deserialize(JsonElement json, Type typeOfT, JsonDeseria
113105

114106
BlendType blend = BlendType.None;
115107

116-
Map<String, String> images = new HashMap<>();
108+
MaterialImages images = new MaterialImages();
117109

118110
MaterialValues values = new MaterialValues();
119111

@@ -130,13 +122,13 @@ public MaterialReference deserialize(JsonElement json, Type typeOfT, JsonDeseria
130122
if (jsonObject.has("texture")) {
131123
var texture = jsonObject.getAsJsonPrimitive("texture").getAsString();
132124

133-
images.put("diffuse", texture);
125+
images.setDiffuse(texture);
134126

135127
if (type.equals("masked")) {
136128
var color = jsonObject.has("color") ? color(jsonObject.get("color")) : new Vector3f(1.0f, 1.0f, 1.0f);
137129
shader = "masked";
138130
values.setBaseColor1(color);
139-
images.put("mask", jsonObject.getAsJsonPrimitive("mask").getAsString());
131+
images.setMask(jsonObject.getAsJsonPrimitive("mask").getAsString());
140132
// return new MaskReferenceMaterial(texture, jsonObject.getAsJsonPrimitive("mask").getAsString(), color);
141133
} else {
142134

@@ -158,15 +150,15 @@ public MaterialReference deserialize(JsonElement json, Type typeOfT, JsonDeseria
158150
}
159151
}
160152
} else {
161-
shader = jsonObject.has("shader") ? jsonObject.getAsJsonPrimitive("shader").getAsString() : null;
162-
effect = jsonObject.has("effect") ? jsonObject.getAsJsonPrimitive("effect").getAsString() : null;
163-
cull = jsonObject.has("cull") ? CullType.from(jsonObject.getAsJsonPrimitive("cull").getAsString()) : CullType.None;
164-
blend = jsonObject.has("blend") ? BlendType.from(jsonObject.getAsJsonPrimitive("blend").getAsString()) : BlendType.None;
165-
images = jsonObject.has("images") ? images(jsonObject.getAsJsonObject("images")) : new HashMap<>();
153+
if(jsonObject.has("shader")) shader = jsonObject.getAsJsonPrimitive("shader").getAsString();
154+
if(jsonObject.has("effect")) effect = jsonObject.getAsJsonPrimitive("effect").getAsString();
155+
if(jsonObject.has("cull")) cull = CullType.from(jsonObject.getAsJsonPrimitive("cull").getAsString());
156+
if(jsonObject.has("blend")) blend = BlendType.from(jsonObject.getAsJsonPrimitive("blend").getAsString());
157+
if(jsonObject.has("images")) images.fill(jsonObject.getAsJsonObject("images"));
166158

167159
if(jsonObject.has("values")) {
168160
var valuesObj = jsonObject.getAsJsonObject("values");
169-
values(values, valuesObj);
161+
values.fill(valuesObj);
170162
if(valuesObj.has("useDepthTest")) useDepthTest = valuesObj.getAsJsonPrimitive("useDepthTest").getAsBoolean();
171163
}
172164
}
@@ -175,30 +167,6 @@ public MaterialReference deserialize(JsonElement json, Type typeOfT, JsonDeseria
175167
}
176168
}
177169

178-
private static Map<String, String> images(JsonObject images) {
179-
return images.asMap().entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, a -> a.getValue().getAsString()));
180-
}
181-
182-
private static void values(MaterialValues values, JsonObject object) {
183-
if(object.has("color")) values.setBaseColor1(MaterialReference.color(object.get("color")));
184-
if(object.has("baseColor1")) values.setBaseColor1(MaterialReference.color(object.get("baseColor1")));
185-
if(object.has("baseColor2")) values.setBaseColor2(MaterialReference.color(object.get("baseColor2")));
186-
if(object.has("baseColor3")) values.setBaseColor3(MaterialReference.color(object.get("baseColor3")));
187-
if(object.has("baseColor4")) values.setBaseColor4(MaterialReference.color(object.get("baseColor4")));
188-
if(object.has("baseColor5")) values.setBaseColor5(MaterialReference.color(object.get("baseColor5")));
189-
if(object.has("emiColor1")) values.setEmiColor1(MaterialReference.color(object.get("emiColor1")));
190-
if(object.has("emiColor2")) values.setEmiColor2(MaterialReference.color(object.get("emiColor2")));
191-
if(object.has("emiColor3")) values.setEmiColor3(MaterialReference.color(object.get("emiColor3")));
192-
if(object.has("emiColor4")) values.setEmiColor4(MaterialReference.color(object.get("emiColor4")));
193-
if(object.has("emiColor5")) values.setEmiColor5(MaterialReference.color(object.get("emiColor5")));
194-
if(object.has("emiIntensity1")) values.setEmiIntensity1(object.get("emiIntensity1").getAsFloat());
195-
if(object.has("emiIntensity2")) values.setEmiIntensity2(object.get("emiIntensity2").getAsFloat());
196-
if(object.has("emiIntensity3")) values.setEmiIntensity3(object.get("emiIntensity3").getAsFloat());
197-
if(object.has("emiIntensity4")) values.setEmiIntensity4(object.get("emiIntensity4").getAsFloat());
198-
if(object.has("emiIntensity5")) values.setEmiIntensity5(object.get("emiIntensity5").getAsFloat());
199-
if(object.has("useLight")) values.setUseLight(object.get("useLight").getAsBoolean());
200-
201-
202170
// object.asMap().forEach((key, value) -> {
203171
// if(value.isJsonObject()) {
204172
// if(object.has("type")) {
@@ -230,7 +198,7 @@ private static void values(MaterialValues values, JsonObject object) {
230198
// });
231199
//
232200
// return values;
233-
}
201+
// }
234202

235203

236204
public static Vector3f color(JsonElement element) {
@@ -274,18 +242,17 @@ public boolean equals(Object o) {
274242
if (!Objects.equals(blend, that.blend)) return false;
275243

276244
// Compare the images map based on byte content
277-
if (!compareImages(images, that.images)) return false;
245+
if (!Objects.equals(images, that.images)) return false;
278246

279247
// Compare the values map
280248
if (!Objects.equals(values, that.values)) return false;
281249

282-
return true;
250+
return useDepthTest != that.useDepthTest;
283251
}
284252

285253
@Override
286254
public int hashCode() {
287-
int result = Objects.hash(parent, shader, effect, cull, blend, values);
288-
result = 31 * result + hashImages(images);
255+
int result = Objects.hash(parent, shader, effect, cull, blend, values, images, useDepthTest);
289256
return result;
290257
}
291258

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import gg.generations.rarecandy.renderer.model.GLModel;
99
import gg.generations.rarecandy.renderer.model.Variant;
1010
import gg.generations.rarecandy.renderer.model.material.Material;
11+
import gg.generations.rarecandy.renderer.model.material.MaterialImages;
1112
import gg.generations.rarecandy.renderer.model.material.MaterialValues;
1213
import org.lwjgl.opengl.GL11;
1314
import org.lwjgl.system.MemoryUtil;
@@ -47,7 +48,7 @@ public static Pair<List<Runnable>, MultiRenderObject<MeshObject>> generatePlane(
4748
var obj = new MultiRenderObject<MeshObject>();
4849

4950
var mesh = new MeshObject();
50-
mesh.setup(Map.of("plane", new Variant(new Material("plane", new HashMap<>(), new MaterialValues().complete(), false, CullType.None, BlendType.None, "plane"))), model, "plane");
51+
mesh.setup(Map.of("plane", new Variant(new Material("plane", new MaterialImages().complete(), new MaterialValues().complete(), false, CullType.None, BlendType.None, "plane"))), model, "plane");
5152
obj.add(mesh);
5253

5354
return new Pair<>(glCalls, obj);
@@ -145,7 +146,7 @@ public static Pair<List<Runnable>, MultiRenderObject<MeshObject>> generateCube(f
145146
var obj = new MultiRenderObject<MeshObject>();
146147

147148
var mesh = new MeshObject();
148-
mesh.setup(Map.of("cube", new Variant(new Material("cube", Map.of("diffuse", image), new MaterialValues().complete(), false, CullType.None, BlendType.None, "solid"))), model, "cube");
149+
mesh.setup(Map.of("cube", new Variant(new Material("cube", new MaterialImages().setDiffuse(image), new MaterialValues().complete(), false, CullType.None, BlendType.None, "solid"))), model, "cube");
149150
obj.add(mesh);
150151

151152
return new Pair<>(glCalls, obj);

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

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
public class Material implements Closeable {
1313
private final String materialName;
14-
private final Map<String, String> images;
14+
private final MaterialImages images;
1515

1616
private final MaterialValues values;
1717

@@ -21,7 +21,7 @@ public class Material implements Closeable {
2121
private String shader;
2222
private final boolean disableDepth;
2323

24-
public Material(String materialName, Map<String, String> images, MaterialValues values, boolean disableDepth, CullType cullType, BlendType blendType, String shader) {
24+
public Material(String materialName, MaterialImages images, MaterialValues values, boolean disableDepth, CullType cullType, BlendType blendType, String shader) {
2525
this.materialName = materialName;
2626
this.images = images;
2727
this.disableDepth = disableDepth;
@@ -31,10 +31,6 @@ public Material(String materialName, Map<String, String> images, MaterialValues
3131
this.values = values;
3232
}
3333

34-
public ITexture getDiffuseTexture() {
35-
return getTexture("diffuse");
36-
}
37-
3834
public String getPipeline() {
3935
return shader;
4036
}
@@ -47,8 +43,8 @@ public BlendType blendType() {
4743
return blendType;
4844
}
4945

50-
public ITexture getTexture(String imageType) {
51-
return ITextureLoader.instance().getTexture(images.get(imageType));
46+
public MaterialImages images() {
47+
return images;
5248
}
5349

5450
public String getMaterialName() {
@@ -63,18 +59,15 @@ public String toString() {
6359
@Override
6460
public void close() throws IOException {
6561
if(images != null) {
66-
for (var texture : images.values()) {
67-
if(texture.contains(".")) ITextureLoader.instance().remove(texture);
68-
}
62+
if(images.getDiffuse().contains(".")) ITextureLoader.instance().remove(images.getDiffuse());
63+
if(images.getEmission().contains(".")) ITextureLoader.instance().remove(images.getDiffuse());
64+
if(images.getLayer().contains(".")) ITextureLoader.instance().remove(images.getLayer());
65+
if(images.getMask().contains(".")) ITextureLoader.instance().remove(images.getMask());
6966
}
7067
}
7168

72-
public Map<String, String> getImages() {
73-
return images;
74-
}
75-
7669
public int maxTextureSize() {
77-
return images.values().stream().map(ITextureLoader.instance()::getTexture).mapToInt(ITexture::width).max().getAsInt();
70+
return images.stream().map(ITextureLoader.instance()::getTexture).mapToInt(ITexture::width).max().getAsInt();
7871
}
7972

8073
public void setShader(String solid) {
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package gg.generations.rarecandy.renderer.model.material;
2+
3+
import com.google.gson.JsonObject;
4+
5+
import java.util.Map;
6+
import java.util.stream.Stream;
7+
8+
public class MaterialImages {
9+
private String diffuse;
10+
private String layer;
11+
private String mask;
12+
private String emission;
13+
14+
public String getDiffuse() {
15+
return diffuse;
16+
}
17+
18+
public MaterialImages setDiffuse(String diffuse) {
19+
this.diffuse = diffuse;
20+
return this;
21+
}
22+
23+
public String getLayer() {
24+
return layer;
25+
}
26+
27+
public void setLayer(String layer) {
28+
this.layer = layer;
29+
}
30+
31+
public String getMask() {
32+
return mask;
33+
}
34+
35+
public void setMask(String mask) {
36+
this.mask = mask;
37+
}
38+
39+
public String getEmission() {
40+
return emission;
41+
}
42+
43+
public void setEmission(String emission) {
44+
this.emission = emission;
45+
}
46+
47+
public MaterialImages fill(MaterialImages images) {
48+
if(images.diffuse != null) this.diffuse = images.diffuse;
49+
if(images.layer != null) this.layer = images.layer;
50+
if(images.mask != null) this.mask = images.mask;
51+
if(images.emission != null) this.emission = images.emission;
52+
53+
return this;
54+
}
55+
56+
public MaterialImages fill(JsonObject images) {
57+
if(images.has("diffuse")) this.diffuse = images.getAsJsonPrimitive("diffuse").getAsString();
58+
if(images.has("layer")) this.layer = images.getAsJsonPrimitive("layer").getAsString();
59+
if(images.has("mask")) this.mask = images.getAsJsonPrimitive("mask").getAsString();
60+
if(images.has("emission")) this.emission = images.getAsJsonPrimitive("emission").getAsString();
61+
62+
return this;
63+
}
64+
65+
public MaterialImages complete() {
66+
if(this.diffuse == null) this.diffuse = "bright";
67+
if(this.layer == null) this.layer = "dark";
68+
if(this.mask == null) this.mask = "dark";
69+
if(this.emission == null) this.emission = "dark";
70+
71+
return this;
72+
}
73+
74+
public MaterialImages processWithImageMap(Map<String, String> imageMap) {
75+
var out = new MaterialImages();
76+
77+
out.diffuse = imageMap.getOrDefault(diffuse, diffuse);
78+
out.layer = imageMap.getOrDefault(layer, layer);
79+
out.mask = imageMap.getOrDefault(mask, mask);
80+
out.emission = imageMap.getOrDefault(emission, emission);
81+
82+
return out;
83+
}
84+
85+
public Stream<String> stream() {
86+
return Stream.of(diffuse, emission, layer, mask);
87+
}
88+
}

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

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

3+
import com.google.gson.JsonObject;
4+
import gg.generations.rarecandy.pokeutils.MaterialReference;
35
import org.joml.Vector3f;
46

57
import java.util.Objects;
@@ -153,6 +155,26 @@ public void setUseLight(boolean useLight) {
153155
this.useLight = useLight;
154156
}
155157

158+
public void fill(JsonObject object) {
159+
if (object.has("color")) baseColor1 = MaterialReference.color(object.get("color"));
160+
if (object.has("baseColor1")) baseColor1 = MaterialReference.color(object.get("baseColor1"));
161+
if (object.has("baseColor2")) baseColor2 = MaterialReference.color(object.get("baseColor2"));
162+
if (object.has("baseColor3")) baseColor3 = MaterialReference.color(object.get("baseColor3"));
163+
if (object.has("baseColor4")) baseColor4 = MaterialReference.color(object.get("baseColor4"));
164+
if (object.has("baseColor5")) baseColor5 = MaterialReference.color(object.get("baseColor5"));
165+
if (object.has("emiColor1")) emiColor1 = MaterialReference.color(object.get("emiColor1"));
166+
if (object.has("emiColor2")) emiColor2 = MaterialReference.color(object.get("emiColor2"));
167+
if (object.has("emiColor3")) emiColor3 = MaterialReference.color(object.get("emiColor3"));
168+
if (object.has("emiColor4")) emiColor4 = MaterialReference.color(object.get("emiColor4"));
169+
if (object.has("emiColor5")) emiColor5 = MaterialReference.color(object.get("emiColor5"));
170+
if (object.has("emiIntensity1")) emiIntensity1 = object.get("emiIntensity1").getAsFloat();
171+
if (object.has("emiIntensity2")) emiIntensity2 = object.get("emiIntensity2").getAsFloat();
172+
if (object.has("emiIntensity3")) emiIntensity3 = object.get("emiIntensity3").getAsFloat();
173+
if (object.has("emiIntensity4")) emiIntensity4 = object.get("emiIntensity4").getAsFloat();
174+
if (object.has("emiIntensity5")) emiIntensity5 = object.get("emiIntensity5").getAsFloat();
175+
if (object.has("useLight")) useLight = object.get("useLight").getAsBoolean();
176+
}
177+
156178
public MaterialValues fill(MaterialValues values) {
157179
if(values.baseColor1 != null) this.baseColor1 = values.baseColor1;
158180
if(values.baseColor2 != null) this.baseColor2 = values.baseColor2;

0 commit comments

Comments
 (0)