22
33import com .google .gson .*;
44import gg .generations .rarecandy .renderer .model .material .Material ;
5+ import gg .generations .rarecandy .renderer .model .material .MaterialImages ;
56import gg .generations .rarecandy .renderer .model .material .MaterialValues ;
67import org .jetbrains .annotations .NotNull ;
78import 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
0 commit comments