17 | function Effect:load(xmlFile, baseName, rootNodes, parent, i3dMapping) |
18 | if not hasXMLProperty(xmlFile, baseName) then |
19 | return nil |
20 | end |
21 | |
22 | self.parent = parent |
23 | self.rootNodes = rootNodes |
24 | self.configFileName = Utils.getNoNil(parent.configFileName, parent.xmlFilename) |
25 | self.baseDirectory = parent.baseDirectory |
26 | |
27 | local filename = getXMLString(xmlFile, baseName .. "#filename") |
28 | if filename ~= nil then |
29 | local shared = Utils.getNoNil(getXMLBool(xmlFile, baseName.."#shared"), true) |
30 | local i3dNode = 0 |
31 | if shared then |
32 | i3dNode = g_i3DManager:loadSharedI3DFile(filename, self.baseDirectory, false, false, false) |
33 | else |
34 | filename = Utils.getFilename(filename, self.baseDirectory) |
35 | i3dNode = loadI3DFile(filename, false, false, false) |
36 | end |
37 | if i3dNode ~= 0 then |
38 | if shared then |
39 | self.filename = filename |
40 | end |
41 | |
42 | if not self:loadEffectAttributes(xmlFile, baseName, nil, i3dNode, i3dMapping) then |
43 | g_logManager:xmlWarning(self.configFileName, "Failed to load effect from file '%s'", baseName) |
44 | return nil |
45 | end |
46 | self:transformEffectNode(xmlFile, baseName, nil) |
47 | |
48 | delete(i3dNode) |
49 | end |
50 | else |
51 | if not self:loadEffectAttributes(xmlFile, baseName, nil, rootNodes, i3dMapping) then |
52 | g_logManager:xmlWarning(self.configFileName, "Failed to load effect '%s' from node", baseName) |
53 | return nil |
54 | end |
55 | self:transformEffectNode(xmlFile, baseName, nil) |
56 | end |
57 | |
58 | |
59 | return self |
60 | end |
100 | function Effect:loadEffectAttributes(xmlFile, key, node, i3dNode, i3dMapping) |
101 | local useSelfAsEffectNode = Utils.getNoNil(Effect.getValue(xmlFile, key, getXMLFloat, node, "useSelfAsEffectNode"), false) |
102 | self.prio = Utils.getNoNil(Effect.getValue(xmlFile, key, getXMLInt, node, "prio"), 0) |
103 | local effect = I3DUtil.indexToObject(Utils.getNoNil(node, self.rootNodes), Effect.getValue(xmlFile, key, getXMLString, node, "effectNode"), i3dMapping) |
104 | if effect == nil and useSelfAsEffectNode then |
105 | effect = node |
106 | end |
107 | |
108 | if effect ~= nil then |
109 | self.node = effect |
110 | else |
111 | self.node = I3DUtil.indexToObject(i3dNode, Effect.getValue(xmlFile, key, getXMLString, node, "node"), i3dMapping) |
112 | self.linkNode = I3DUtil.indexToObject(Utils.getNoNil(node, self.rootNodes), Effect.getValue(xmlFile, key, getXMLString, node, "linkNode"), i3dMapping) |
113 | if self.linkNode == nil then |
114 | if node == nil then |
115 | g_logManager:xmlWarning(self.configFileName, "LinkNode is nil in '%s'", key) |
116 | else |
117 | g_logManager:xmlWarning(self.configFileName, "LinkNode is nil in node attribute '%s'", getName(node)) |
118 | end |
119 | return false |
120 | end |
121 | if self.node == nil then |
122 | if node == nil then |
123 | g_logManager:xmlWarning(self.configFileName, "Node is nil in '%s'", key) |
124 | else |
125 | g_logManager:xmlWarning(self.configFileName, "Node is nil in node attribute '%s'", getName(node)) |
126 | end |
127 | |
128 | return false |
129 | end |
130 | |
131 | if self.node ~= nil and self.linkNode ~= nil then |
132 | link(self.linkNode, self.node) |
133 | end |
134 | end |
135 | |
136 | return true |
137 | end |
64 | function Effect:loadFromNode(node, parent) |
65 | self.parent = parent |
66 | self.baseDirectory = parent.baseDirectory |
67 | self.configFileName = Utils.getNoNil(parent.configFileName, parent.xmlFilename) |
68 | |
69 | local filename = getUserAttribute(node, "filename") |
70 | local i3dNode = 0 |
71 | |
72 | if filename ~= nil then |
73 | local shared = Utils.getNoNil(getUserAttribute(node, "shared"), true) |
74 | if shared then |
75 | i3dNode = g_i3DManager:loadSharedI3DFile(filename, self.baseDirectory, false, false, false) |
76 | else |
77 | filename = Utils.getFilename(filename, self.baseDirectory) |
78 | i3dNode = loadI3DFile(filename, false, false, false) |
79 | end |
80 | if shared then |
81 | self.filename = filename |
82 | end |
83 | end |
84 | |
85 | if not self:loadEffectAttributes(nil, nil, node, i3dNode) then |
86 | g_logManager:xmlWarning(self.configFileName, "Failed to load effect from node '%s'", getName(node)) |
87 | return nil |
88 | end |
89 | self:transformEffectNode(nil, nil, node) |
90 | |
91 | if i3dNode ~= 0 then |
92 | delete(i3dNode) |
93 | end |
94 | |
95 | return self |
96 | end |
141 | function Effect:transformEffectNode(xmlFile, key, node) |
142 | local x,y,z = StringUtil.getVectorFromString(Effect.getValue(xmlFile, key, getXMLString, node, "position")) |
143 | local rotX, rotY, rotZ = StringUtil.getVectorFromString(Effect.getValue(xmlFile, key, getXMLString, node, "rotation")) |
144 | if rotX ~= nil and rotY ~= nil and rotZ ~= nil then |
145 | rotX = MathUtil.degToRad(rotX) |
146 | rotY = MathUtil.degToRad(rotY) |
147 | rotZ = MathUtil.degToRad(rotZ) |
148 | end |
149 | local scaleX,scaleY,scaleZ = StringUtil.getVectorFromString(Effect.getValue(xmlFile, key, getXMLString, node, "scale")) |
150 | |
151 | if x ~= nil and y ~= nil and z ~= nil then |
152 | setTranslation(self.node, x,y,z) |
153 | end |
154 | if rotX ~= nil and rotY ~= nil and rotZ ~= nil then |
155 | setRotation(self.node, rotX, rotY, rotZ) |
156 | end |
157 | if scaleX ~= nil and scaleY ~= nil and scaleZ ~= nil then |
158 | setScale(self.node, scaleX, scaleY, scaleZ) |
159 | end |
160 | setVisibility(self.node, false) |
161 | end |