@@ -12,11 +12,15 @@ var _managed_materials: Dictionary = {}
1212
1313enum Transparency { Disabled , Alpha , AlphaScissor }
1414
15- const _transparency_codes = {
16- Transparency .Disabled : "0" ,
17- Transparency .Alpha : "a" ,
18- Transparency .AlphaScissor : "s" ,
19- }
15+
16+ class MaterialOptions :
17+ var diffuse_color : Color = Color .WHITE
18+ var selfillum_color : Color = Color .WHITE
19+ var selfillum_energy : float = 1.0
20+ var selfillum_enabled : bool = false
21+ var force_transparent : bool = false # TODO: AphaCut/Alpha modes support
22+ var alpha_scissor_threshold : float = 0.5
23+
2024
2125@export var season : Season = Season .SEASON_SUMMER :
2226 set (x ):
@@ -41,31 +45,29 @@ func load_material(model_path:String, material_name:String) -> MaszynaMaterial:
4145func get_material (
4246 model_path :String ,
4347 material_path :String ,
44- transparent :Transparency = Transparency .Disabled ,
45- diffuse_color : Color = Color (1.0 , 1.0 , 1.0 )
48+ options : MaterialOptions = MaterialOptions .new (),
4649) -> Material :
47- var cache_hash : String = _compute_cache_hash (model_path , material_path , transparent , diffuse_color )
50+ var cache_hash : String = _compute_cache_hash (model_path , material_path , options )
4851 var managed_material : Dictionary = _managed_materials .get (cache_hash , {})
4952 if managed_material :
5053 var material_ref : WeakRef = managed_material .get ("material_ref" ) as WeakRef
5154 var material : ShaderMaterial = material_ref .get_ref () as ShaderMaterial if material_ref else null
5255 if material :
5356 return material
5457 _managed_materials .erase (cache_hash )
55- var force_transparent := not transparent == Transparency . Disabled # TODO: ALPHA
58+ var force_transparent = options . force_transparent # TODO: ALPHA
5659 var output : ShaderMaterial = _materials_cache .get (cache_hash ) as ShaderMaterial
5760 if not output :
5861 var mmat : MaszynaMaterial = load_material (model_path , material_path )
59- output = MaterialFactory .create (mmat , model_path , season , weather , force_transparent , diffuse_color )
62+ output = MaterialFactory .create (mmat , model_path , season , weather , options )
6063 else :
6164 var mmat : MaszynaMaterial = load_material (model_path , material_path )
62- MaterialFactory .apply (output , mmat , model_path , season , weather , force_transparent , diffuse_color )
65+ MaterialFactory .apply (output , mmat , model_path , season , weather , options )
6366 _managed_materials [cache_hash ] = {
6467 "material_ref" : weakref (output ),
6568 "model_path" : model_path ,
6669 "material_path" : material_path ,
67- "force_transparent" : force_transparent ,
68- "diffuse_color" : diffuse_color ,
70+ "options" : options ,
6971 }
7072 _materials_cache .set (cache_hash , output )
7173 return output
@@ -107,14 +109,18 @@ func load_texture(model_path:String, material_name:String, normal:bool = false)
107109func _compute_cache_hash (
108110 model_path : String ,
109111 material_path : String ,
110- transparent : Transparency ,
111- diffuse_color : Color ,
112+ options : MaterialOptions ,
112113) -> String :
113- return model_path .path_join (("%s _t%s _%s .res" % [
114- material_path ,
115- _transparency_codes [transparent ],
116- "%x%x%x " % [diffuse_color .r8 , diffuse_color .g8 , diffuse_color .b8 ],
117- ]))
114+ var options_hash = ":" .join ([
115+ options .force_transparent ,
116+ options .diffuse_color .to_html (true ),
117+ options .alpha_scissor_threshold ,
118+ options .selfillum_enabled ,
119+ options .selfillum_color .to_html (true ),
120+ options .selfillum_energy ,
121+ ].map (str )).md5_text ()
122+ return model_path .path_join ("%s _%s .res" % [material_path , options_hash ])
123+
118124
119125func _refresh_managed_materials () -> void :
120126 var cache_hashes : Array = _managed_materials .keys ()
@@ -134,7 +140,8 @@ func _refresh_managed_material(cache_hash: String) -> void:
134140 var material_path : String = managed_material .get ("material_path" , "" )
135141 var force_transparent : Transparency = managed_material .get ("force_transparent" , false )
136142 var diffuse_color : Color = managed_material .get ("diffuse_color" , Color .WHITE )
143+ var options :MaterialOptions = managed_material .get ("options" )
137144 var mmat : MaszynaMaterial = load_material (model_path , material_path )
138145 mmat .transparent = mmat .transparent or force_transparent
139- MaterialFactory .apply (material , mmat , model_path , season , weather , force_transparent , diffuse_color )
146+ MaterialFactory .apply (material , mmat , model_path , season , weather , options )
140147 _materials_cache .set (cache_hash , material )
0 commit comments