Skip to content

Commit bcf384c

Browse files
authored
Collada fixes (NASAWorldWind#825)
* Double sided enhancement, node geometry fix * Fixed a regression on the engine model
1 parent 054ff83 commit bcf384c

File tree

5 files changed

+351
-44
lines changed

5 files changed

+351
-44
lines changed

apps/Collada/Collada.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ require(['../../src/WorldWind', '../util/ProjectionMenu'], function (ww, Project
120120
path: 'box',
121121
initialScale: 500000,
122122
maxScale: 1000000,
123+
doubleSided: false,
123124
useTexturePaths: true
124125
},
125126
{
@@ -128,6 +129,7 @@ require(['../../src/WorldWind', '../util/ProjectionMenu'], function (ww, Project
128129
path: 'duck',
129130
initialScale: 5000,
130131
maxScale: 10000,
132+
doubleSided: false,
131133
useTexturePaths: true
132134
},
133135
{
@@ -136,6 +138,7 @@ require(['../../src/WorldWind', '../util/ProjectionMenu'], function (ww, Project
136138
path: '2_cylinder_engine',
137139
initialScale: 5000,
138140
maxScale: 10000,
141+
doubleSided: false,
139142
useTexturePaths: true
140143
},
141144
{
@@ -144,6 +147,7 @@ require(['../../src/WorldWind', '../util/ProjectionMenu'], function (ww, Project
144147
path: 'Reciprocating_Saw',
145148
initialScale: 5000,
146149
maxScale: 10000,
150+
doubleSided: false,
147151
useTexturePaths: true
148152
},
149153
{
@@ -152,6 +156,7 @@ require(['../../src/WorldWind', '../util/ProjectionMenu'], function (ww, Project
152156
path: 'gearbox_assy',
153157
initialScale: 10000,
154158
maxScale: 20000,
159+
doubleSided: false,
155160
useTexturePaths: true
156161
},
157162
{
@@ -160,6 +165,7 @@ require(['../../src/WorldWind', '../util/ProjectionMenu'], function (ww, Project
160165
path: 'buggy',
161166
initialScale: 5000,
162167
maxScale: 10000,
168+
doubleSided: false,
163169
useTexturePaths: true
164170
},
165171
{
@@ -168,6 +174,16 @@ require(['../../src/WorldWind', '../util/ProjectionMenu'], function (ww, Project
168174
path: 'kmlBuilding',
169175
initialScale: 500,
170176
maxScale: 1000,
177+
doubleSided: false,
178+
useTexturePaths: false
179+
},
180+
{
181+
displayName: 'bad normals',
182+
fileName: 'bad_normals.dae',
183+
path: 'bad_normals',
184+
initialScale: 20000,
185+
maxScale: 40000,
186+
doubleSided: true,
171187
useTexturePaths: false
172188
},
173189
];
@@ -204,7 +220,7 @@ require(['../../src/WorldWind', '../util/ProjectionMenu'], function (ww, Project
204220
scene.scale = model.initialScale;
205221
scene.altitudeMode = WorldWind.ABSOLUTE;
206222
scene.useTexturePaths = model.useTexturePaths;
207-
223+
scene.doubleSided = model.doubleSided;
208224
modelLayer.removeAllRenderables();
209225
modelLayer.addRenderable(scene);
210226

Lines changed: 245 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,245 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
3+
<asset>
4+
<created>2020-05-21T08:37:06Z</created>
5+
<modified>2020-05-21T08:37:06Z</modified>
6+
<up_axis>Z_UP</up_axis>
7+
</asset>
8+
<library_geometries>
9+
<geometry id="ID_201700003257.dae3">
10+
<mesh>
11+
<source id="ID_201700003257.dae3-positions">
12+
<float_array id="ID_201700003257.dae3-positions-array" count="24">25.8881 2.22867 13.4721 25.8881 2.22867 0.5465 11.6699 -23.2139 13.4721 11.6699 -23.2139 1.2027 -25.8881 -2.2244 13.4721 -25.8881 -2.2244 0.6561 -11.6621 23.2139 13.4721 -11.6621 23.2139 0</float_array>
13+
<technique_common>
14+
<accessor count="8" source="#ID_201700003257.dae3-positions-array" stride="3">
15+
<param name="X" type="float"/>
16+
<param name="Y" type="float"/>
17+
<param name="Z" type="float"/>
18+
</accessor>
19+
</technique_common>
20+
</source>
21+
<source id="ID_201700003257.dae3-normals">
22+
<float_array id="ID_201700003257.dae3-normals-array" count="3">0 0 1</float_array>
23+
<technique_common>
24+
<accessor count="1" source="#ID_201700003257.dae3-normals-array" stride="3">
25+
<param name="X" type="float"/>
26+
<param name="Y" type="float"/>
27+
<param name="Z" type="float"/>
28+
</accessor>
29+
</technique_common>
30+
</source>
31+
<vertices id="ID_201700003257.dae3-vertices">
32+
<input semantic="POSITION" source="#ID_201700003257.dae3-positions"/>
33+
</vertices>
34+
<triangles count="8" material="ID_201700003257.dae3material">
35+
<input offset="0" semantic="VERTEX" source="#ID_201700003257.dae3-vertices"/>
36+
<input offset="1" semantic="NORMAL" source="#ID_201700003257.dae3-normals"/>
37+
<p>1 0 0 0 2 0 1 0 2 0 3 0 3 0 2 0 4 0 3 0 4 0 5 0 5 0 4 0 6 0 5 0 6 0 7 0 7 0 6 0 0 0 7 0 0 0 1 0</p>
38+
</triangles>
39+
</mesh>
40+
</geometry>
41+
<geometry id="ID_201700003257.dae4">
42+
<mesh>
43+
<source id="ID_201700003257.dae4-positions">
44+
<float_array id="ID_201700003257.dae4-positions-array" count="12">11.6699 -23.2139 1.2027 -11.6621 23.2139 0 -25.8881 -2.2244 0.6561 25.8881 2.22867 0.5465</float_array>
45+
<technique_common>
46+
<accessor count="4" source="#ID_201700003257.dae4-positions-array" stride="3">
47+
<param name="X" type="float"/>
48+
<param name="Y" type="float"/>
49+
<param name="Z" type="float"/>
50+
</accessor>
51+
</technique_common>
52+
</source>
53+
<source id="ID_201700003257.dae4-normals">
54+
<float_array id="ID_201700003257.dae4-normals-array" count="3">0 0 1</float_array>
55+
<technique_common>
56+
<accessor count="1" source="#ID_201700003257.dae4-normals-array" stride="3">
57+
<param name="X" type="float"/>
58+
<param name="Y" type="float"/>
59+
<param name="Z" type="float"/>
60+
</accessor>
61+
</technique_common>
62+
</source>
63+
<vertices id="ID_201700003257.dae4-vertices">
64+
<input semantic="POSITION" source="#ID_201700003257.dae4-positions"/>
65+
</vertices>
66+
<triangles count="2" material="ID_201700003257.dae4material">
67+
<input offset="0" semantic="VERTEX" source="#ID_201700003257.dae4-vertices"/>
68+
<input offset="1" semantic="NORMAL" source="#ID_201700003257.dae4-normals"/>
69+
<p>1 0 0 0 2 0 0 0 1 0 3 0</p>
70+
</triangles>
71+
</mesh>
72+
</geometry>
73+
<geometry id="ID_201700003257.dae5">
74+
<mesh>
75+
<source id="ID_201700003257.dae5-positions">
76+
<float_array id="ID_201700003257.dae5-positions-array" count="12">-11.6621 23.2139 13.4721 11.6699 -23.2139 13.4721 -25.8881 -2.2244 13.4721 25.8881 2.22867 13.4721</float_array>
77+
<technique_common>
78+
<accessor count="4" source="#ID_201700003257.dae5-positions-array" stride="3">
79+
<param name="X" type="float"/>
80+
<param name="Y" type="float"/>
81+
<param name="Z" type="float"/>
82+
</accessor>
83+
</technique_common>
84+
</source>
85+
<source id="ID_201700003257.dae5-normals">
86+
<float_array id="ID_201700003257.dae5-normals-array" count="3">0 0 1</float_array>
87+
<technique_common>
88+
<accessor count="1" source="#ID_201700003257.dae5-normals-array" stride="3">
89+
<param name="X" type="float"/>
90+
<param name="Y" type="float"/>
91+
<param name="Z" type="float"/>
92+
</accessor>
93+
</technique_common>
94+
</source>
95+
<vertices id="ID_201700003257.dae5-vertices">
96+
<input semantic="POSITION" source="#ID_201700003257.dae5-positions"/>
97+
</vertices>
98+
<triangles count="2" material="ID_201700003257.dae5material">
99+
<input offset="0" semantic="VERTEX" source="#ID_201700003257.dae5-vertices"/>
100+
<input offset="1" semantic="NORMAL" source="#ID_201700003257.dae5-normals"/>
101+
<p>1 0 0 0 2 0 0 0 1 0 3 0</p>
102+
</triangles>
103+
</mesh>
104+
</geometry>
105+
</library_geometries>
106+
<library_effects>
107+
<effect id="ID_201700003257.dae0effect">
108+
<profile_COMMON>
109+
<technique sid="common">
110+
<phong>
111+
<diffuse>
112+
<color>0.929412 0.760784 0.611765 1</color>
113+
</diffuse>
114+
</phong>
115+
</technique>
116+
</profile_COMMON>
117+
</effect>
118+
</library_effects>
119+
<library_materials>
120+
<material id="ID_201700003257.dae0material">
121+
<instance_effect url="#ID_201700003257.dae0effect"/>
122+
</material>
123+
</library_materials>
124+
<library_effects>
125+
<effect id="ID_201700003257.dae1effect">
126+
<profile_COMMON>
127+
<technique sid="common">
128+
<phong>
129+
<diffuse>
130+
<color>0.929412 0.760784 0.611765 1</color>
131+
</diffuse>
132+
</phong>
133+
</technique>
134+
</profile_COMMON>
135+
</effect>
136+
</library_effects>
137+
<library_materials>
138+
<material id="ID_201700003257.dae1material">
139+
<instance_effect url="#ID_201700003257.dae1effect"/>
140+
</material>
141+
</library_materials>
142+
<library_effects>
143+
<effect id="ID_201700003257.dae2effect">
144+
<profile_COMMON>
145+
<technique sid="common">
146+
<phong>
147+
<diffuse>
148+
<color>0.929412 0.760784 0.611765 1</color>
149+
</diffuse>
150+
</phong>
151+
</technique>
152+
</profile_COMMON>
153+
</effect>
154+
</library_effects>
155+
<library_materials>
156+
<material id="ID_201700003257.dae2material">
157+
<instance_effect url="#ID_201700003257.dae2effect"/>
158+
</material>
159+
</library_materials>
160+
<library_effects>
161+
<effect id="ID_201700003257.dae3effect">
162+
<profile_COMMON>
163+
<technique sid="common">
164+
<phong>
165+
<diffuse>
166+
<color>0.929412 0.760784 0.611765 1</color>
167+
</diffuse>
168+
</phong>
169+
</technique>
170+
</profile_COMMON>
171+
</effect>
172+
</library_effects>
173+
<library_materials>
174+
<material id="ID_201700003257.dae3material">
175+
<instance_effect url="#ID_201700003257.dae3effect"/>
176+
</material>
177+
</library_materials>
178+
<library_effects>
179+
<effect id="ID_201700003257.dae4effect">
180+
<profile_COMMON>
181+
<technique sid="common">
182+
<phong>
183+
<diffuse>
184+
<color>0.929412 0.760784 0.611765 1</color>
185+
</diffuse>
186+
</phong>
187+
</technique>
188+
</profile_COMMON>
189+
</effect>
190+
</library_effects>
191+
<library_materials>
192+
<material id="ID_201700003257.dae4material">
193+
<instance_effect url="#ID_201700003257.dae4effect"/>
194+
</material>
195+
</library_materials>
196+
<library_effects>
197+
<effect id="ID_201700003257.dae5effect">
198+
<profile_COMMON>
199+
<technique sid="common">
200+
<phong>
201+
<diffuse>
202+
<color>0.929412 0.760784 0.611765 1</color>
203+
</diffuse>
204+
</phong>
205+
</technique>
206+
</profile_COMMON>
207+
</effect>
208+
</library_effects>
209+
<library_materials>
210+
<material id="ID_201700003257.dae5material">
211+
<instance_effect url="#ID_201700003257.dae5effect"/>
212+
</material>
213+
</library_materials>
214+
<library_visual_scenes>
215+
<visual_scene id="Multipatch-Converted-Scene">
216+
<node id="ID_201700003257.dae">
217+
<translate>0 0 0</translate>
218+
<instance_geometry url="#ID_201700003257.dae3">
219+
<bind_material>
220+
<technique_common>
221+
<instance_material symbol="ID_201700003257.dae3material" target="#ID_201700003257.dae3material"/>
222+
</technique_common>
223+
</bind_material>
224+
</instance_geometry>
225+
<instance_geometry url="#ID_201700003257.dae4">
226+
<bind_material>
227+
<technique_common>
228+
<instance_material symbol="ID_201700003257.dae4material" target="#ID_201700003257.dae4material"/>
229+
</technique_common>
230+
</bind_material>
231+
</instance_geometry>
232+
<instance_geometry url="#ID_201700003257.dae5">
233+
<bind_material>
234+
<technique_common>
235+
<instance_material symbol="ID_201700003257.dae5material" target="#ID_201700003257.dae5material"/>
236+
</technique_common>
237+
</bind_material>
238+
</instance_geometry>
239+
</node>
240+
</visual_scene>
241+
</library_visual_scenes>
242+
<scene>
243+
<instance_visual_scene url="#Multipatch-Converted-Scene"/>
244+
</scene>
245+
</COLLADA>

src/formats/collada/ColladaLoader.js

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -107,13 +107,11 @@ define([
107107

108108
if (!data) {
109109
var colladaScene = null;
110-
}
111-
else {
110+
} else {
112111

113112
try {
114113
colladaScene = this.parse(data);
115-
}
116-
catch (e) {
114+
} catch (e) {
117115
colladaScene = null;
118116
Logger.log(Logger.LEVEL_SEVERE, "error parsing collada file: " + e);
119117
}
@@ -139,7 +137,7 @@ define([
139137
var iNodes = this.xmlDoc.querySelectorAll('library_nodes node');
140138
var eNodes = this.xmlDoc.querySelectorAll("library_effects effect");
141139

142-
this.scene.metadata = ( new ColladaAsset(this.xmlDoc) ).parse();
140+
this.scene.metadata = (new ColladaAsset(this.xmlDoc)).parse();
143141
this.parseLib('visual_scene', iNodes);
144142
this.parseLib('library_geometries');
145143
this.parseLib('library_materials', eNodes);
@@ -175,16 +173,18 @@ define([
175173
switch (libNode.nodeName) {
176174

177175
case 'node':
178-
var node = ( new ColladaNode() ).parse(libNode, extraNodes);
179-
if (node) {
180-
this.scene.root.children.push(node);
176+
var nodes = (new ColladaNode()).parse(libNode, extraNodes);
177+
if (nodes) {
178+
for (var j = 0, len = nodes.length; j < len; j++) {
179+
this.scene.root.children.push(nodes[j]);
180+
}
181181
}
182182
break;
183183

184184
case 'geometry':
185185
var geometryId = libNode.getAttribute("id");
186186
var xmlMesh = libNode.querySelector("mesh");
187-
var mesh = ( new ColladaMesh(geometryId) ).parse(xmlMesh);
187+
var mesh = (new ColladaMesh(geometryId)).parse(xmlMesh);
188188
if (mesh) {
189189
this.scene.meshes[geometryId] = mesh;
190190
}
@@ -195,7 +195,7 @@ define([
195195
var iEffect = libNode.querySelector("instance_effect");
196196
var effectId = iEffect.getAttribute("url").substr(1);
197197
var effect = ColladaUtils.querySelectorById(extraNodes, effectId);
198-
var material = ( new ColladaMaterial(materialId) ).parse(effect);
198+
var material = (new ColladaMaterial(materialId)).parse(effect);
199199
if (material) {
200200
this.scene.materials[materialId] = material;
201201
}
@@ -204,7 +204,7 @@ define([
204204
case 'image':
205205
var imageId = libNode.getAttribute("id");
206206
var imageName = libNode.getAttribute("name");
207-
var image = ( new ColladaImage(imageId, imageName) ).parse(libNode);
207+
var image = (new ColladaImage(imageId, imageName)).parse(libNode);
208208
if (image) {
209209
this.scene.images[imageId] = image;
210210
}

0 commit comments

Comments
 (0)