241 | function FoliageBending:activateBendingNodes() |
242 | local spec = self.spec_foliageBending |
243 | for _, bendingNode in ipairs(spec.bendingNodes) do |
244 | if bendingNode.isActive then |
245 | if bendingNode.id == nil and g_currentMission.foliageBendingSystem then |
246 | bendingNode.id = g_currentMission.foliageBendingSystem:createRectangle(bendingNode.minX, bendingNode.maxX, bendingNode.minZ, bendingNode.maxZ, bendingNode.yOffset, bendingNode.node) |
247 | end |
248 | end |
249 | end |
250 | end |
21 | function FoliageBending.initSpecialization() |
22 | local schema = Vehicle.xmlSchema |
23 | schema:setXMLSpecializationType("FoliageBending") |
24 | |
25 | schema:register(XMLValueType.NODE_INDEX, "vehicle.foliageBending.bendingNode(?)#node", "Bending node") |
26 | schema:register(XMLValueType.FLOAT, "vehicle.foliageBending.bendingNode(?)#minX", "Min. width") |
27 | schema:register(XMLValueType.FLOAT, "vehicle.foliageBending.bendingNode(?)#maxX", "Max. width") |
28 | schema:register(XMLValueType.FLOAT, "vehicle.foliageBending.bendingNode(?)#minZ", "Min. length") |
29 | schema:register(XMLValueType.FLOAT, "vehicle.foliageBending.bendingNode(?)#maxZ", "Max. length") |
30 | schema:register(XMLValueType.FLOAT, "vehicle.foliageBending.bendingNode(?)#yOffset", "Y translation offset") |
31 | |
32 | schema:setXMLSpecializationType() |
33 | end |
190 | function FoliageBending:loadBendingNodeFromXML(xmlFile, key, bendingNode) |
191 | local node = xmlFile:getValue(key.."#node", nil, self.components, self.i3dMappings) |
192 | if node == nil then |
193 | node = self.rootNode |
194 | end |
195 | |
196 | bendingNode.node = node |
197 | bendingNode.key = key |
198 | bendingNode.minX = xmlFile:getValue(key.."#minX", -1) |
199 | bendingNode.maxX = xmlFile:getValue(key.."#maxX", 1) |
200 | bendingNode.minZ = xmlFile:getValue(key.."#minZ", -1) |
201 | bendingNode.maxZ = xmlFile:getValue(key.."#maxZ", 1) |
202 | bendingNode.yOffset = xmlFile:getValue(key.."#yOffset", 0) |
203 | bendingNode.isActive = true |
204 | |
205 | return true |
206 | end |
210 | function FoliageBending:loadBendingNodeModifierFromXML(xmlFile, key) |
211 | local modifier = {} |
212 | |
213 | modifier.index = xmlFile:getValue(key.."#index") |
214 | modifier.indices = xmlFile:getValue(key.."#indices", nil, true) |
215 | if modifier.index == nil and modifier.indices == nil then |
216 | Logging.xmlWarning(self.xmlFile, "Missing bending node index for bending modifier '%s'", key) |
217 | return |
218 | end |
219 | if modifier.index ~= nil then |
220 | table.insert(modifier.indices, modifier.index) |
221 | end |
222 | |
223 | modifier.minX = xmlFile:getValue(key.."#minX") |
224 | modifier.maxX = xmlFile:getValue(key.."#maxX") |
225 | modifier.minZ = xmlFile:getValue(key.."#minZ") |
226 | modifier.maxZ = xmlFile:getValue(key.."#maxZ") |
227 | modifier.yOffset = xmlFile:getValue(key.."#yOffset") |
228 | modifier.isActive = xmlFile:getValue(key.."#isActive", true) |
229 | modifier.overwrite = xmlFile:getValue(key.."#overwrite", true) |
230 | |
231 | local spec = self.spec_foliageBending |
232 | if spec.bendingModifiers == nil then |
233 | spec.bendingModifiers = {} |
234 | end |
235 | |
236 | table.insert(spec.bendingModifiers, modifier) |
237 | end |
113 | function FoliageBending:onPostLoad(savegame) |
114 | local spec = self.spec_foliageBending |
115 | |
116 | for name, _ in pairs(g_configurationManager:getConfigurations()) do |
117 | local specializationKey = g_configurationManager:getConfigurationAttribute(name, "xmlKey") |
118 | if specializationKey ~= nil then |
119 | specializationKey = "." .. specializationKey |
120 | else |
121 | specializationKey = "" |
122 | end |
123 | |
124 | local i = 0 |
125 | while true do |
126 | local configrationKey = string.format("vehicle%s.%sConfigurations.%sConfiguration(%d)", specializationKey, name, name, i) |
127 | if not self.xmlFile:hasProperty(configrationKey) then |
128 | break |
129 | end |
130 | |
131 | if self.configurations[name] ~= nil and self.configurations[name] == i + 1 then |
132 | local j = 0 |
133 | while true do |
134 | local modifierKey = string.format("%s.foliageBendingModifier(%d)", configrationKey, j) |
135 | if not self.xmlFile:hasProperty(modifierKey) then |
136 | break |
137 | end |
138 | |
139 | self:loadBendingNodeModifierFromXML(self.xmlFile, modifierKey) |
140 | |
141 | j = j + 1 |
142 | end |
143 | end |
144 | |
145 | i = i + 1 |
146 | end |
147 | end |
148 | |
149 | if spec.bendingModifiers ~= nil then |
150 | for _, modifier in ipairs(spec.bendingModifiers) do |
151 | for i=1, #modifier.indices do |
152 | local index = modifier.indices[i] |
153 | local bendingNode = spec.bendingNodes[index] |
154 | if bendingNode ~= nil then |
155 | if modifier.overwrite then |
156 | bendingNode.minX = modifier.minX or bendingNode.minX |
157 | bendingNode.maxX = modifier.maxX or bendingNode.maxX |
158 | bendingNode.minZ = modifier.minZ or bendingNode.minZ |
159 | bendingNode.maxZ = modifier.maxZ or bendingNode.maxZ |
160 | bendingNode.yOffset = modifier.yOffset or bendingNode.yOffset |
161 | else |
162 | bendingNode.minX = math.min(bendingNode.minX, modifier.minX or bendingNode.minX) |
163 | bendingNode.maxX = math.max(bendingNode.maxX, modifier.maxX or bendingNode.maxX) |
164 | bendingNode.minZ = math.min(bendingNode.minZ, modifier.minZ or bendingNode.minZ) |
165 | bendingNode.maxZ = math.max(bendingNode.maxZ, modifier.maxZ or bendingNode.maxZ) |
166 | bendingNode.yOffset = math.max(bendingNode.yOffset, modifier.yOffset or bendingNode.yOffset) |
167 | end |
168 | |
169 | if not modifier.isActive then |
170 | bendingNode.isActive = false |
171 | end |
172 | else |
173 | Logging.xmlWarning(self.xmlFile, "Undefined bendingNode index '%d' for bending modifier '%s'!", index, modifier.key) |
174 | end |
175 | end |
176 | end |
177 | |
178 | spec.bendingModifiers = nil |
179 | end |
180 | end |
37 | function FoliageBending.postInitSpecialization() |
38 | local schema = Vehicle.xmlSchema |
39 | schema:setXMLSpecializationType("FoliageBending") |
40 | |
41 | for name, _ in pairs(g_configurationManager:getConfigurations()) do |
42 | local specializationKey = g_configurationManager:getConfigurationAttribute(name, "xmlKey") |
43 | if specializationKey ~= nil then |
44 | specializationKey = "." .. specializationKey |
45 | else |
46 | specializationKey = "" |
47 | end |
48 | |
49 | local basePath = string.format("vehicle%s.%sConfigurations.%sConfiguration(?)", specializationKey, name, name) |
50 | |
51 | schema:setXMLSharedRegistration("foliageBendingModifier", basePath) |
52 | schema:register(XMLValueType.INT, basePath .. ".foliageBendingModifier(?)#index", "Bending node index") |
53 | schema:register(XMLValueType.VECTOR_N, basePath .. ".foliageBendingModifier(?)#indices", "Bending node indices") |
54 | schema:register(XMLValueType.FLOAT, basePath .. ".foliageBendingModifier(?)#minX", "Min. width") |
55 | schema:register(XMLValueType.FLOAT, basePath .. ".foliageBendingModifier(?)#maxX", "Max. width") |
56 | schema:register(XMLValueType.FLOAT, basePath .. ".foliageBendingModifier(?)#minZ", "Min. length") |
57 | schema:register(XMLValueType.FLOAT, basePath .. ".foliageBendingModifier(?)#maxZ", "Max. length") |
58 | schema:register(XMLValueType.FLOAT, basePath .. ".foliageBendingModifier(?)#yOffset", "Y translation offset") |
59 | schema:register(XMLValueType.BOOL, basePath .. ".foliageBendingModifier(?)#isActive", "Bending node is active", true) |
60 | schema:register(XMLValueType.BOOL, basePath .. ".foliageBendingModifier(?)#overwrite", "Overwrite the bending node values and do not use the max values", true) |
61 | schema:setXMLSharedRegistration() |
62 | end |
63 | |
64 | schema:setXMLSpecializationType() |
65 | end |
69 | function FoliageBending.registerFunctions(vehicleType) |
70 | SpecializationUtil.registerFunction(vehicleType, "loadBendingNodeFromXML", FoliageBending.loadBendingNodeFromXML) |
71 | SpecializationUtil.registerFunction(vehicleType, "loadBendingNodeModifierFromXML", FoliageBending.loadBendingNodeModifierFromXML) |
72 | SpecializationUtil.registerFunction(vehicleType, "activateBendingNodes", FoliageBending.activateBendingNodes) |
73 | SpecializationUtil.registerFunction(vehicleType, "deactivateBendingNodes", FoliageBending.deactivateBendingNodes) |
74 | SpecializationUtil.registerFunction(vehicleType, "getFoliageBendingNodeByIndex", FoliageBending.getFoliageBendingNodeByIndex) |
75 | SpecializationUtil.registerFunction(vehicleType, "updateFoliageBendingAttributes", FoliageBending.updateFoliageBendingAttributes) |
76 | end |