24 | function Ropes:load(savegame) |
25 | self.ropes = {}; |
26 | local i=0; |
27 | while true do |
28 | local key = string.format("vehicle.ropes.rope(%d)", i); |
29 | if not hasXMLProperty(self.xmlFile, key) then |
30 | break; |
31 | end |
32 | local entry = {}; |
33 | entry.baseNode = Utils.indexToObject(self.components, getXMLString(self.xmlFile, key .. "#baseNode")); |
34 | entry.targetNode = Utils.indexToObject(self.components, getXMLString(self.xmlFile, key .. "#targetNode")); |
35 | entry.baseParameters = Utils.getVectorNFromString(getXMLString(self.xmlFile, key .. "#baseParameters", 4)); |
36 | entry.targetParameters = Utils.getVectorNFromString(getXMLString(self.xmlFile, key .. "#targetParameters", 4)); |
37 | setShaderParameter(entry.baseNode, "cv0", entry.baseParameters[1],entry.baseParameters[2],entry.baseParameters[3],entry.baseParameters[4], false); |
38 | setShaderParameter(entry.baseNode, "cv1", 0,0,0,0, false); |
39 | local x,y,z = localToLocal(entry.targetNode, entry.baseNode, entry.targetParameters[1], entry.targetParameters[2], entry.targetParameters[3]); |
40 | setShaderParameter(entry.baseNode, "cv3", x,y,z,0, false); |
41 | |
42 | -- <baseParameterAdjuster index="0>10|0|0|0|0|0|0" rotationAxis="1" rotationRange="-120 120" minTargetParameters="10 0 0 0" maxTargetParameters="-10 0 0 0" /> |
43 | entry.baseParameterAdjusters = {}; |
44 | local j=0; |
45 | while true do |
46 | local key = string.format("%s.baseParameterAdjuster(%d)", key, j); |
47 | if not hasXMLProperty(self.xmlFile, key) then |
48 | break; |
49 | end |
50 | local adjuster = { }; |
51 | adjuster.node = Utils.indexToObject(self.components, getXMLString(self.xmlFile, key .. "#index")); |
52 | |
53 | adjuster.rotationAxis = getXMLInt(self.xmlFile, key .. "#rotationAxis"); |
54 | adjuster.rotationRange = Utils.getRadiansFromString(getXMLString(self.xmlFile, key .. "#rotationRange"), 2); |
55 | |
56 | adjuster.translationAxis = getXMLInt(self.xmlFile, key .. "#translationAxis"); |
57 | adjuster.translationRange = Utils.getVectorNFromString(getXMLString(self.xmlFile, key .. "#translationRange"), 2); |
58 | |
59 | adjuster.minTargetParameters = Utils.getVectorNFromString(getXMLString(self.xmlFile, key .. "#minTargetParameters"), 4); |
60 | adjuster.maxTargetParameters = Utils.getVectorNFromString(getXMLString(self.xmlFile, key .. "#maxTargetParameters"), 4); |
61 | |
62 | table.insert(entry.baseParameterAdjusters, adjuster); |
63 | j=j+1; |
64 | end |
65 | |
66 | entry.targetParameterAdjusters = {}; |
67 | local j=0; |
68 | while true do |
69 | local key = string.format("%s.targetParameterAdjuster(%d)", key, j); |
70 | if not hasXMLProperty(self.xmlFile, key) then |
71 | break; |
72 | end |
73 | local adjuster = { }; |
74 | adjuster.node = Utils.indexToObject(self.components, getXMLString(self.xmlFile, key .. "#index")); |
75 | |
76 | adjuster.rotationAxis = getXMLInt(self.xmlFile, key .. "#rotationAxis"); |
77 | adjuster.rotationRange = Utils.getRadiansFromString(getXMLString(self.xmlFile, key .. "#rotationRange"), 2); |
78 | |
79 | adjuster.translationAxis = getXMLInt(self.xmlFile, key .. "#translationAxis"); |
80 | adjuster.translationRange = Utils.getVectorNFromString(getXMLString(self.xmlFile, key .. "#translationRange"), 2); |
81 | |
82 | adjuster.minTargetParameters = Utils.getVectorNFromString(getXMLString(self.xmlFile, key .. "#minTargetParameters"), 4); |
83 | adjuster.maxTargetParameters = Utils.getVectorNFromString(getXMLString(self.xmlFile, key .. "#maxTargetParameters"), 4); |
84 | |
85 | table.insert(entry.targetParameterAdjusters, adjuster); |
86 | j=j+1; |
87 | end |
88 | |
89 | table.insert(self.ropes, entry); |
90 | i=i+1; |
91 | end |
92 | |
93 | self.isActiveRopeTimeOffset = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.ropes#isActiveDirtyTimeOffset"), 2) * 1000; |
94 | self.isActiveRopeTime = g_currentMission.time + self.isActiveRopeTimeOffset; |
95 | end; |
115 | function Ropes:update(dt) |
116 | if self.isClient and self:getIsActive() then |
117 | self.isActiveRopeTime = g_currentMission.time + self.isActiveRopeTimeOffset; |
118 | end |
119 | if self.isActiveRopeTime >= g_currentMission.time then |
120 | for _,rope in pairs(self.ropes) do |
121 | -- |
122 | local parameters = {0, 0, 0}; |
123 | if #rope.baseParameterAdjusters > 0 then |
124 | for _,adjuster in pairs(rope.baseParameterAdjusters) do |
125 | |
126 | if adjuster.rotationAxis ~= nil then |
127 | local rotations = { getRotation(adjuster.node) }; |
128 | local rot = rotations[adjuster.rotationAxis]; |
129 | local alpha = math.max(0, math.min(1, (rot - adjuster.rotationRange[1]) / (adjuster.rotationRange[2] - adjuster.rotationRange[1]) )); |
130 | local x,y,z = Utils.vector3ArrayLerp(adjuster.minTargetParameters, adjuster.maxTargetParameters, alpha); |
131 | parameters[1] = parameters[1] + x; |
132 | parameters[2] = parameters[2] + y; |
133 | parameters[3] = parameters[3] + z; |
134 | elseif adjuster.translationAxis ~= nil then |
135 | local translations = { getRotation(adjuster.node) }; |
136 | local trans = translations[adjuster.translationAxis]; |
137 | local alpha = math.max(0, math.min(1, (trans - adjuster.translationRange[1]) / (adjuster.translationRange[2] - adjuster.translationRange[1]) )); |
138 | local x,y,z = Utils.vector3ArrayLerp(adjuster.minTargetParameters, adjuster.maxTargetParameters, alpha); |
139 | parameters[1] = parameters[1] + x; |
140 | parameters[2] = parameters[2] + y; |
141 | parameters[3] = parameters[3] + z; |
142 | end |
143 | |
144 | end |
145 | end |
146 | setShaderParameter(rope.baseNode, "cv0", rope.baseParameters[1]+parameters[1], rope.baseParameters[2]+parameters[2], rope.baseParameters[3]+parameters[3], 0, false); |
147 | |
148 | -- |
149 | local x,y,z = localToLocal(rope.targetNode, rope.baseNode, 0,0,0); |
150 | setShaderParameter(rope.baseNode, "cv2", x,y,z,0, false); |
151 | |
152 | -- |
153 | local parameters = {0, 0, 0}; |
154 | if #rope.targetParameterAdjusters > 0 then |
155 | for _,adjuster in pairs(rope.targetParameterAdjusters) do |
156 | |
157 | if adjuster.rotationAxis ~= nil then |
158 | local rotations = { getRotation(adjuster.node) }; |
159 | local rot = rotations[adjuster.rotationAxis]; |
160 | local alpha = math.max(0, math.min(1, (rot - adjuster.rotationRange[1]) / (adjuster.rotationRange[2] - adjuster.rotationRange[1]) )); |
161 | local x,y,z = Utils.vector3ArrayLerp(adjuster.minTargetParameters, adjuster.maxTargetParameters, alpha); |
162 | parameters[1] = parameters[1] + x; |
163 | parameters[2] = parameters[2] + y; |
164 | parameters[3] = parameters[3] + z; |
165 | elseif adjuster.translationAxis ~= nil then |
166 | local translations = { getRotation(adjuster.node) }; |
167 | local trans = translations[adjuster.translationAxis]; |
168 | local alpha = math.max(0, math.min(1, (trans - adjuster.translationRange[1]) / (adjuster.translationRange[2] - adjuster.translationRange[1]) )); |
169 | local x,y,z = Utils.vector3ArrayLerp(adjuster.minTargetParameters, adjuster.maxTargetParameters, alpha); |
170 | parameters[1] = parameters[1] + x; |
171 | parameters[2] = parameters[2] + y; |
172 | parameters[3] = parameters[3] + z; |
173 | end |
174 | |
175 | end |
176 | end |
177 | local x,y,z = localToLocal(rope.targetNode, rope.baseNode, rope.targetParameters[1]+parameters[1], rope.targetParameters[2]+parameters[2], rope.targetParameters[3]+parameters[3]); |
178 | setShaderParameter(rope.baseNode, "cv3", x,y,z,0, false); |
179 | end |
180 | end |
181 | end; |