213 | function MaterialUtil.applyBaseMaterial(node, material) |
214 | if getHasClassId(node, ClassIds.SHAPE) then |
215 | local nodeMaterialId = getMaterial(node, 0) |
216 | if material.materialId == nodeMaterialId then |
217 | for i=#material.shaderParameters, 1, -1 do |
218 | local parameter = material.shaderParameters[i] |
219 | if getHasShaderParameter(node, parameter.name) then |
220 | setShaderParameter(node, parameter.name, parameter.value[1], parameter.value[2], parameter.value[3], parameter.value[4], false) |
221 | else |
222 | Logging.warning("ShaderParameter '%s' not found for material '%s'!", parameter.name, material.name) |
223 | table.remove(material.shaderParameters, i) |
224 | end |
225 | end |
226 | end |
227 | end |
228 | |
229 | local numChildren = getNumOfChildren(node) |
230 | if numChildren > 0 then |
231 | for i=0, numChildren-1 do |
232 | MaterialUtil.applyBaseMaterial(getChildAt(node, i), material) |
233 | end |
234 | end |
235 | end |
129 | function MaterialUtil.loadBaseMaterialFromXML(xmlFile, key, material, components, i3dMappings) |
130 | local name = xmlFile:getValue(key.."#name") |
131 | if name == nil then |
132 | Logging.xmlWarning(xmlFile, "Missing material name for base material '%s'", key) |
133 | return false |
134 | end |
135 | if not ClassUtil.getIsValidIndexName(name) then |
136 | Logging.xmlWarning(xmlFile, "Given material name '%s' is not valid for material '%s'", name, key) |
137 | return false |
138 | end |
139 | |
140 | local baseNode = xmlFile:getValue(key.."#baseNode", nil, components, i3dMappings) |
141 | if baseNode == nil then |
142 | Logging.xmlWarning(xmlFile, "Missing baseNode for base material '%s'", key) |
143 | return false |
144 | else |
145 | if not getHasClassId(baseNode, ClassIds.SHAPE) then |
146 | Logging.xmlWarning(xmlFile, "Material baseNode '%s' is not a shape '%s'", getName(baseNode), key) |
147 | return false |
148 | end |
149 | end |
150 | |
151 | material.name = name |
152 | material.baseNode = baseNode |
153 | material.materialId = getMaterial(baseNode, 0) |
154 | material.nameToShaderParameter = {} |
155 | material.shaderParameters = {} |
156 | |
157 | local i = 0 |
158 | while true do |
159 | local parameterKey = string.format("%s.shaderParameter(%d)", key, i) |
160 | if not xmlFile:hasProperty(parameterKey) then |
161 | break |
162 | end |
163 | |
164 | local shaderParameter = {} |
165 | if MaterialUtil.loadBaseMaterialParameterFromXML(xmlFile, parameterKey, shaderParameter, material.baseNode) then |
166 | if material.nameToShaderParameter[shaderParameter.name] == nil then |
167 | material.nameToShaderParameter[shaderParameter.name] = shaderParameter |
168 | table.insert(material.shaderParameters, shaderParameter) |
169 | else |
170 | Logging.xmlWarning(xmlFile, "shaderParameter '%s' already defined for material '%s'!", shaderParameter.name, key) |
171 | end |
172 | end |
173 | |
174 | i = i + 1 |
175 | end |
176 | |
177 | if #material.shaderParameters == 0 then |
178 | Logging.xmlWarning(xmlFile, "Missing shaderParameters for base material '%s'", key) |
179 | return false |
180 | end |
181 | |
182 | return true |
183 | end |
187 | function MaterialUtil.loadBaseMaterialParameterFromXML(xmlFile, key, shaderParameter, node) |
188 | local name = xmlFile:getValue(key.."#name") |
189 | |
190 | if name == nil then |
191 | Logging.xmlWarning(xmlFile, "Missing shader parameter name for base material '%s'", key) |
192 | return false |
193 | end |
194 | if not ClassUtil.getIsValidIndexName(name) then |
195 | Logging.xmlWarning(xmlFile, "Given shader parameter name '%s' is not valid for base material '%s'", name, key) |
196 | return false |
197 | end |
198 | |
199 | local value = g_brandColorManager:loadColorAndMaterialFromXML(xmlFile, node, name, key) |
200 | if value == nil then |
201 | Logging.xmlWarning(xmlFile, "Failed to load shader parameter value or material for base material '%s'", key) |
202 | return false |
203 | end |
204 | |
205 | shaderParameter.name = name |
206 | shaderParameter.value = value |
207 | |
208 | return true |
209 | end |
118 | function MaterialUtil.loadBaseMaterialsFromXML(targetTable, xmlFile, baseKey, components, i3dMappings) |
119 | xmlFile:iterate(baseKey, function (i, key) |
120 | local baseMaterial = {} |
121 | if MaterialUtil.loadBaseMaterialFromXML(xmlFile, key, baseMaterial, components, i3dMappings) then |
122 | table.insert(targetTable, baseMaterial) |
123 | end |
124 | end) |
125 | end |
92 | function MaterialUtil.onCreateParticleSystem(_, id) |
93 | local particleTypeName = getUserAttribute(id, "particleType") |
94 | if particleTypeName == nil then |
95 | Logging.warning("No particleType given for node '%s' in MaterialUtil.onCreateParticleSystem", getName(id)) |
96 | return |
97 | end |
98 | |
99 | local particleType = g_particleSystemManager:getParticleSystemTypeByName(particleTypeName) |
100 | if particleType == nil then |
101 | Logging.warning("Unknown particleType '%s' given for node '%s' in MaterialUtil.onCreateParticleSystem\nAvailable types: %s", particleTypeName, getName(id), table.concat(g_particleSystemManager.particleTypes, " ")) |
102 | return |
103 | end |
104 | |
105 | local defaultEmittingState = Utils.getNoNil(getUserAttribute(id, "defaultEmittingState"), false) |
106 | local worldSpace = Utils.getNoNil(getUserAttribute(id, "worldSpace"), true) |
107 | local forceFullLifespan = Utils.getNoNil(getUserAttribute(id, "forceFullLifespan"), false) |
108 | |
109 | local particleSystem = {} |
110 | |
111 | ParticleUtil.loadParticleSystemFromNode(id, particleSystem, defaultEmittingState, worldSpace, forceFullLifespan) |
112 | |
113 | g_particleSystemManager:addParticleSystem(particleType, particleSystem) |
114 | end |
239 | function MaterialUtil.registerBaseMaterialXMLPaths(schema, basePath) |
240 | schema:register(XMLValueType.STRING, basePath .. "(?)#name", "Material name") |
241 | schema:register(XMLValueType.NODE_INDEX, basePath .. "(?)#baseNode", "Material base node") |
242 | schema:register(XMLValueType.STRING, basePath .. "(?).shaderParameter(?)#name", "Shader parameter name") |
243 | schema:register(XMLValueType.COLOR, basePath .. "(?).shaderParameter(?)#value", "Color value") |
244 | schema:register(XMLValueType.INT, basePath .. "(?).shaderParameter(?)#material", "Material value") |
245 | end |
30 | function MaterialUtil.validateMaterialAttributes(id, sourceFunc) |
31 | local fillTypeStr = getUserAttribute(id, "fillType") |
32 | if fillTypeStr == nil then |
33 | print("Warning: No fillType given in '"..getName(id).."' for " .. sourceFunc) |
34 | return false |
35 | end |
36 | |
37 | local fillTypeIndex = g_fillTypeManager:getFillTypeIndexByName(fillTypeStr) |
38 | if fillTypeIndex == nil then |
39 | print("Warning: Unknown fillType '"..tostring(fillTypeStr).."' for " .. sourceFunc) |
40 | return false |
41 | end |
42 | |
43 | local materialTypeName = getUserAttribute(id, "materialType") |
44 | if materialTypeName == nil then |
45 | print("Warning: No materialType given for '"..getName(id).."' for " .. sourceFunc) |
46 | return false |
47 | end |
48 | |
49 | local materialType = g_materialManager:getMaterialTypeByName(materialTypeName) |
50 | if materialType == nil then |
51 | print("Warning: Unknown materialType '"..materialTypeName.."' given for '"..getName(id).."' for " .. sourceFunc) |
52 | return false |
53 | end |
54 | |
55 | local matIdStr = Utils.getNoNil(getUserAttribute(id, "materialIndex"), 1) |
56 | local materialIndex = tonumber(matIdStr) |
57 | if materialIndex == nil then |
58 | print("Warning: Invalid materialIndex '"..matIdStr.."' for "..getName(id).."-"..materialTypeName.."!") |
59 | return false |
60 | end |
61 | |
62 | return true, fillTypeIndex, materialType, materialIndex |
63 | end |