@@ -79,35 +79,38 @@ public MaterialDef(ConfigNode node)
79
79
isValid = false ;
80
80
}
81
81
82
- keywords = LoadDictionary < bool > ( node . GetNode ( "Keyword" ) ) ;
83
- floats = LoadDictionary < float > ( node . GetNode ( "Float" ) ) ;
82
+ keywords = LoadDictionary < bool > ( node , "KEYWORD" ) ;
83
+ floats = LoadDictionary < float > ( node , "FLOAT" ) ;
84
84
colors = LoadDictionary < Color > (
85
- node . GetNode ( "Color" ) ,
85
+ node , "COLOR" ,
86
86
value => ParseColor ( value , out var color ) ? ( object ) color : null ) ;
87
- vectors = LoadDictionary < Vector4 > ( node . GetNode ( "Vector" ) ) ;
87
+ vectors = LoadDictionary < Vector4 > ( node , "VECTOR" ) ;
88
88
textures = LoadDictionary < Texture > (
89
- node . GetNode ( "Texture" ) ,
89
+ node , "TEXTURE" ,
90
90
value => GameDatabase . Instance . GetTexture ( value , asNormalMap : false ) ) ;
91
91
}
92
92
93
93
static readonly Func < Type , string , object > ReadValue =
94
94
AccessTools . MethodDelegate < Func < Type , string , object > > (
95
95
AccessTools . DeclaredMethod ( typeof ( ConfigNode ) , "ReadValue" ) ) ;
96
96
97
- Dictionary < string , T > LoadDictionary < T > ( ConfigNode node , Func < string , object > parser = null )
97
+ Dictionary < string , T > LoadDictionary < T > ( ConfigNode defNode , string propKind , Func < string , object > parser = null )
98
98
{
99
99
var items = new Dictionary < string , T > ( ) ;
100
- if ( node == null ) return items ;
101
100
102
- foreach ( ConfigNode . Value item in node . values ) {
101
+ var propNode = defNode . GetNode ( propKind ) ;
102
+ if ( propNode == null ) return items ;
103
+
104
+ foreach ( ConfigNode . Value item in propNode . values ) {
103
105
object value = parser != null ? parser ( item . value ) : ReadValue ( typeof ( T ) , item . value ) ;
104
106
if ( value is T parsed ) {
105
107
items [ item . name ] = parsed ;
106
108
} else {
107
- Debug . LogError ( $ "[Shabby][MaterialDef { name } ] failed to load { typeof ( T ) . Name } property { item . name } = { item . value } ") ;
109
+ Debug . LogError ( $ "[Shabby][MaterialDef { name } ] failed to load { propKind } property { item . name } = { item . value } ") ;
108
110
}
109
111
}
110
112
113
+ Debug . Log ( $ "[Shabby][MaterialDef { name } ] loaded { items . Count } { propKind } properties") ;
111
114
return items ;
112
115
}
113
116
@@ -118,6 +121,13 @@ public static bool ParseColor(string value, out Color color)
118
121
return false ;
119
122
}
120
123
124
+ static bool CheckProperty ( Material mat , string propName )
125
+ {
126
+ var exists = mat . HasProperty ( propName ) ;
127
+ if ( ! exists ) Debug . LogWarning ( $ "[Shabby] shader { mat . shader . name } does not have property { propName } ") ;
128
+ return exists ;
129
+ }
130
+
121
131
/// <summary>
122
132
/// Create a new material based on this definition. The material name is copied from the
123
133
/// passed reference material. In update-existing mode, all properties are also copied from
@@ -139,17 +149,26 @@ public Material Instantiate(Material referenceMaterial)
139
149
if ( preserveRenderQueue ) material . renderQueue = referenceMaterial . renderQueue ;
140
150
141
151
foreach ( var kvp in keywords ) {
152
+ if ( ! CheckProperty ( material , kvp . Key ) ) continue ;
142
153
if ( kvp . Value ) material . EnableKeyword ( kvp . Key ) ;
143
154
else material . DisableKeyword ( kvp . Key ) ;
144
155
}
145
156
146
- foreach ( var kvp in floats ) material . SetFloat ( kvp . Key , kvp . Value ) ;
157
+ foreach ( var kvp in floats ) {
158
+ if ( CheckProperty ( material , kvp . Key ) ) material . SetFloat ( kvp . Key , kvp . Value ) ;
159
+ }
147
160
148
- foreach ( var kvp in colors ) material . SetColor ( kvp . Key , kvp . Value ) ;
161
+ foreach ( var kvp in colors ) {
162
+ if ( CheckProperty ( material , kvp . Key ) ) material . SetColor ( kvp . Key , kvp . Value ) ;
163
+ }
149
164
150
- foreach ( var kvp in vectors ) material . SetVector ( kvp . Key , kvp . Value ) ;
165
+ foreach ( var kvp in vectors ) {
166
+ if ( CheckProperty ( material , kvp . Key ) ) material . SetVector ( kvp . Key , kvp . Value ) ;
167
+ }
151
168
152
- foreach ( var kvp in textures ) material . SetTexture ( kvp . Key , kvp . Value ) ;
169
+ foreach ( var kvp in textures ) {
170
+ if ( CheckProperty ( material , kvp . Key ) ) material . SetTexture ( kvp . Key , kvp . Value ) ;
171
+ }
153
172
154
173
return material ;
155
174
}
0 commit comments