134 | function BaseMaterial:applyBaseMaterialConfiguration(xmlFile, configName, configId) |
135 | local spec = self.spec_baseMaterial |
136 | |
137 | local baseKey = string.format("vehicle.%sConfigurations", configName) |
138 | local i = 0 |
139 | |
140 | while true do |
141 | local key = string.format("%s.material(%d)", baseKey, i) |
142 | |
143 | if not xmlFile:hasProperty(key) then |
144 | break |
145 | end |
146 | |
147 | local name = xmlFile:getValue(key .. "#name") |
148 | if not ClassUtil.getIsValidIndexName(name) then |
149 | Logging.xmlWarning(xmlFile, "Given material name '%s' is not valid for material '%s'", name, key) |
150 | return false |
151 | end |
152 | |
153 | local shaderParameterName = xmlFile:getValue(key .. "#shaderParameter") |
154 | if not ClassUtil.getIsValidIndexName(shaderParameterName) then |
155 | Logging.xmlWarning(xmlFile, "Given shader parameter '%s' is not valid for material '%s'", name, key) |
156 | return false |
157 | end |
158 | |
159 | local material = spec.nameToMaterial[name] |
160 | if material == nil then |
161 | Logging.xmlWarning(xmlFile, "Given material name '%s' not found for material configuration '%s'", name, key) |
162 | return false |
163 | end |
164 | |
165 | local shaderParameter = material.nameToShaderParameter[shaderParameterName] |
166 | if shaderParameter == nil then |
167 | Logging.xmlWarning(xmlFile, "Given shader parameter '%s' not found for material configuration '%s'", shaderParameterName, key) |
168 | return false |
169 | end |
170 | |
171 | local color = xmlFile:getValue(key.."#color", nil, true) |
172 | if color == nil then |
173 | color = ConfigurationUtil.getColorByConfigId(self, configName, configId) |
174 | if color == nil then |
175 | Logging.xmlWarning(xmlFile, "Color not found for configId '%d' for material configuration '%s'", configId, key) |
176 | return false |
177 | end |
178 | end |
179 | |
180 | local materialId = xmlFile:getValue(key.."#material") |
181 | materialId = materialId or ConfigurationUtil.getMaterialByConfigId(self, configName, configId) |
182 | |
183 | shaderParameter.value[1] = color[1] |
184 | shaderParameter.value[2] = color[2] |
185 | shaderParameter.value[3] = color[3] |
186 | shaderParameter.value[4] = materialId or shaderParameter.value[4] |
187 | |
188 | if xmlFile:getValue(key .. "#useContrastColor", false) then |
189 | local brightness = MathUtil.getBrightnessFromColor(color[1], color[2], color[3]) |
190 | local threshold = xmlFile:getValue(key .. "#contrastThreshold", 0.5) |
191 | if brightness > threshold then |
192 | brightness = 1 |
193 | else |
194 | brightness = 0 |
195 | end |
196 | |
197 | shaderParameter.value[1] = 1-brightness |
198 | shaderParameter.value[2] = 1-brightness |
199 | shaderParameter.value[3] = 1-brightness |
200 | end |
201 | |
202 | i = i + 1 |
203 | end |
204 | end |
21 | function BaseMaterial.initSpecialization() |
22 | g_configurationManager:addConfigurationType("baseMaterial", g_i18n:getText("configuration_baseColor"), nil, nil, ConfigurationUtil.getConfigColorSingleItemLoad, ConfigurationUtil.getConfigColorPostLoad, ConfigurationUtil.SELECTOR_COLOR) |
23 | g_configurationManager:addConfigurationType("designMaterial", g_i18n:getText("configuration_designColor"), nil, nil, ConfigurationUtil.getConfigColorSingleItemLoad, ConfigurationUtil.getConfigColorPostLoad, ConfigurationUtil.SELECTOR_COLOR) |
24 | g_configurationManager:addConfigurationType("designMaterial2", g_i18n:getText("configuration_designColor"), nil, nil, ConfigurationUtil.getConfigColorSingleItemLoad, ConfigurationUtil.getConfigColorPostLoad, ConfigurationUtil.SELECTOR_COLOR) |
25 | g_configurationManager:addConfigurationType("designMaterial3", g_i18n:getText("configuration_designColor"), nil, nil, ConfigurationUtil.getConfigColorSingleItemLoad, ConfigurationUtil.getConfigColorPostLoad, ConfigurationUtil.SELECTOR_COLOR) |
26 | |
27 | local schema = Vehicle.xmlSchema |
28 | schema:setXMLSpecializationType("BaseMaterial") |
29 | |
30 | MaterialUtil.registerBaseMaterialXMLPaths(schema, "vehicle.baseMaterial.material") |
31 | |
32 | BaseMaterial.registerBaseMaterialConfigurationsXMLPaths(schema, "baseMaterial") |
33 | ConfigurationUtil.registerColorConfigurationXMLPaths(schema, "baseMaterial") |
34 | ObjectChangeUtil.registerObjectChangeXMLPaths(schema, "vehicle.baseMaterialConfigurations.baseMaterialConfiguration(?)") |
35 | |
36 | BaseMaterial.registerBaseMaterialConfigurationsXMLPaths(schema, "designMaterial") |
37 | ConfigurationUtil.registerColorConfigurationXMLPaths(schema, "designMaterial") |
38 | ObjectChangeUtil.registerObjectChangeXMLPaths(schema, "vehicle.designMaterialConfigurations.designMaterialConfiguration(?)") |
39 | |
40 | BaseMaterial.registerBaseMaterialConfigurationsXMLPaths(schema, "designMaterial2") |
41 | ConfigurationUtil.registerColorConfigurationXMLPaths(schema, "designMaterial2") |
42 | ObjectChangeUtil.registerObjectChangeXMLPaths(schema, "vehicle.designMaterial2Configurations.designMaterial2Configuration(?)") |
43 | |
44 | BaseMaterial.registerBaseMaterialConfigurationsXMLPaths(schema, "designMaterial3") |
45 | ConfigurationUtil.registerColorConfigurationXMLPaths(schema, "designMaterial3") |
46 | ObjectChangeUtil.registerObjectChangeXMLPaths(schema, "vehicle.designMaterial3Configurations.designMaterial3Configuration(?)") |
47 | |
48 | schema:setXMLSpecializationType() |
49 | end |
81 | function BaseMaterial:onLoad(savegame) |
82 | local spec = self.spec_baseMaterial |
83 | |
84 | spec.baseMaterials = {} |
85 | spec.nameToMaterial = {} |
86 | |
87 | MaterialUtil.loadBaseMaterialsFromXML(spec.baseMaterials, self.xmlFile, "vehicle.baseMaterial.material", self.components, self.i3dMappings) |
88 | |
89 | for i=1, #spec.baseMaterials do |
90 | local baseMaterial = spec.baseMaterials[i] |
91 | spec.nameToMaterial[baseMaterial.name] = baseMaterial |
92 | end |
93 | |
94 | if self.configurations["baseMaterial"] ~= nil then |
95 | self:applyBaseMaterialConfiguration(self.xmlFile, "baseMaterial", self.configurations["baseMaterial"]) |
96 | ObjectChangeUtil.updateObjectChanges(self.xmlFile, "vehicle.baseMaterialConfigurations.baseMaterialConfiguration", self.configurations["baseMaterial"], self.components, self) |
97 | end |
98 | |
99 | if self.configurations["designMaterial"] ~= nil then |
100 | self:applyBaseMaterialConfiguration(self.xmlFile, "designMaterial", self.configurations["designMaterial"]) |
101 | ObjectChangeUtil.updateObjectChanges(self.xmlFile, "vehicle.designMaterialConfigurations.designMaterialConfiguration", self.configurations["designMaterial"], self.components, self) |
102 | end |
103 | |
104 | if self.configurations["designMaterial2"] ~= nil then |
105 | self:applyBaseMaterialConfiguration(self.xmlFile, "designMaterial2", self.configurations["designMaterial2"]) |
106 | ObjectChangeUtil.updateObjectChanges(self.xmlFile, "vehicle.designMaterial2Configurations.designMaterial2Configuration", self.configurations["designMaterial2"], self.components, self) |
107 | end |
108 | |
109 | if self.configurations["designMaterial3"] ~= nil then |
110 | self:applyBaseMaterialConfiguration(self.xmlFile, "designMaterial3", self.configurations["designMaterial3"]) |
111 | ObjectChangeUtil.updateObjectChanges(self.xmlFile, "vehicle.designMaterial3Configurations.designMaterial3Configuration", self.configurations["designMaterial3"], self.components, self) |
112 | end |
113 | end |
53 | function BaseMaterial.registerBaseMaterialConfigurationsXMLPaths(schema, configurationName) |
54 | local baseKey = string.format("vehicle.%sConfigurations", configurationName) |
55 | |
56 | schema:register(XMLValueType.STRING, baseKey .. ".material(?)#name", "Material name") |
57 | schema:register(XMLValueType.STRING, baseKey .. ".material(?)#shaderParameter", "Material shader parameter") |
58 | schema:register(XMLValueType.COLOR, baseKey .. ".material(?)#color", "Material color if it shouldn't be used from configuration") |
59 | schema:register(XMLValueType.INT, baseKey .. ".material(?)#material", "Material id if it shouldn't be used from configuration") |
60 | schema:register(XMLValueType.BOOL, baseKey .. ".material(?)#useContrastColor", "Use contrast color from configuration", false) |
61 | schema:register(XMLValueType.FLOAT, baseKey .. ".material(?)#contrastThreshold", "Contrast color brightness threshold", 0.5) |
62 | end |
208 | function BaseMaterial:setBaseMaterialColor(materialName, shaderParameterName, color, materialId) |
209 | local spec = self.spec_baseMaterial |
210 | local material = spec.nameToMaterial[materialName] |
211 | if material ~= nil then |
212 | local shaderParameter = material.nameToShaderParameter[shaderParameterName] |
213 | if shaderParameter ~= nil then |
214 | shaderParameter.value[1] = color[1] |
215 | shaderParameter.value[2] = color[2] |
216 | shaderParameter.value[3] = color[3] |
217 | shaderParameter.value[4] = materialId or shaderParameter.value[4] |
218 | end |
219 | end |
220 | |
221 | self:applyBaseMaterial() |
222 | end |