LUADOC - Farming Simulator 22

MaterialUtil

Description
Util for materials
Functions

applyBaseMaterial

Description
Definition
applyBaseMaterial()
Code
213function 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
235end

loadBaseMaterialFromXML

Description
Definition
loadBaseMaterialFromXML()
Code
129function 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
183end

loadBaseMaterialParameterFromXML

Description
Definition
loadBaseMaterialParameterFromXML()
Code
187function 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
209end

loadBaseMaterialsFromXML

Description
Definition
loadBaseMaterialsFromXML()
Code
118function 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)
125end

onCreateBaseMaterial

Description
Called by material holder to create material
Definition
onCreateBaseMaterial(any_type unused, integer id)
Arguments
any_typeunusedunused
integeridid
Code
16function MaterialUtil.onCreateBaseMaterial(_, id)
17 local materialNameStr = getUserAttribute(id, "materialName")
18 if materialNameStr == nil then
19 print("Warning: No material name given in '"..getName(id).."' for MaterialUtil.onCreateBaseMaterial")
20 return
21 end
22
23 g_materialManager:addBaseMaterial(materialNameStr, getMaterial(id, 0))
24end

onCreateMaterial

Description
Called by material holder to create material
Definition
onCreateMaterial(any_type unused, integer id)
Arguments
any_typeunusedunused
integeridid
Code
69function MaterialUtil.onCreateMaterial(_, id)
70 local isValid, fillTypeIndex, materialType, materialIndex = MaterialUtil.validateMaterialAttributes(id, "MaterialUtil.onCreateMaterial")
71 if isValid then
72 g_materialManager:addMaterial(fillTypeIndex, materialType, materialIndex, getMaterial(id, 0))
73 end
74end

onCreateParticleMaterial

Description
Called by material holder to create particle material
Definition
onCreateParticleMaterial(any_type unused, integer id)
Arguments
any_typeunusedunused
integeridid
Code
80function MaterialUtil.onCreateParticleMaterial(_, id)
81 local isValid, fillTypeIndex, materialType, materialIndex = MaterialUtil.validateMaterialAttributes(id, "MaterialUtil.onCreateParticleMaterial")
82 if isValid then
83 g_materialManager:addParticleMaterial(fillTypeIndex, materialType, materialIndex, getMaterial(id, 0))
84 end
85end

onCreateParticleSystem

Description
Called by particle holder to create particle system
Definition
onCreateParticleSystem(any_type unused, integer id)
Arguments
any_typeunusedunused
integeridid
Code
92function 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)
114end

registerBaseMaterialXMLPaths

Description
Definition
registerBaseMaterialXMLPaths()
Code
239function 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")
245end

validateMaterialAttributes

Description
Called by material holder to create material
Definition
validateMaterialAttributes(any_type unused, integer id)
Arguments
any_typeunusedunused
integeridid
Code
30function 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
63end