jsc3d-js-rails 1.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9782cb77e095035e34592c06985348b2c002a2fd
4
+ data.tar.gz: 9a6a369afb4016bb8b88fa981a395e175d0c6a80
5
+ SHA512:
6
+ metadata.gz: defe6f362fa2fb28faf9392ed9254a7e4d1ae85b2e2b27f741f78113d3f9f7caf7279df1b07bb7b92ccc800564bb049bc2b077b5e9cf62095a54ba8d17146d1a
7
+ data.tar.gz: b6118403c0f1dff325183fd794e7737d071efc4b749e64a2c42786d6b233485865cd079a934f4c85b41667b783fae626da6610433357bb0bc5a841dd55521c72
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in jsc3d-js-rails.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Bogdan Frankovskiy
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # Jsc3d::Js::Rails
2
+
3
+ This gem provides [js3d](https://code.google.com/p/jsc3d/) driver for your Rails 3+ application.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'jsc3d-js-rails'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install jsc3d-js-rails
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'jsc3d/js/rails/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "jsc3d-js-rails"
8
+ spec.version = Jsc3d::Js::Rails::VERSION
9
+ spec.authors = ["Bogdan Frankovskiy"]
10
+ spec.email = ["bfrankovskiy@gmail.com"]
11
+ spec.description = %q{This gem provides js3d driver for your Rails 3+ application.}
12
+ spec.summary = %q{Use js3d javascript library with Rails 3jdt}
13
+ spec.homepage = "https://code.google.com/p/jsc3d/"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.require_paths = ["lib"]
18
+
19
+ spec.add_dependency "railties", ">= 3.0", "< 5.0"
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ end
@@ -0,0 +1,10 @@
1
+ require "jsc3d/js/rails/version"
2
+
3
+ module Jsc3d
4
+ module Js
5
+ module Rails
6
+ class Engine < ::Rails::Engine
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ module Jsc3d
2
+ module Js
3
+ module Rails
4
+ VERSION = "1.6.5"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,717 @@
1
+ /**
2
+ * @preserve Copyright (c) 2013 Vasile Dirla <vasile@dirla.ro>
3
+ * This file is part of jsc3d project, which is freely distributable under the
4
+ * terms of the MIT license.
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ * of this software and associated documentation files (the "Software"), to deal
8
+ * in the Software without restriction, including without limitation the rights
9
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ * copies of the Software, and to permit persons to whom the Software is
11
+ * furnished to do so, subject to the following conditions:
12
+ *
13
+ * The above copyright notice and this permission notice shall be included in
14
+ * all copies or substantial portions of the Software.
15
+ *
16
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ * THE SOFTWARE.
23
+ */
24
+
25
+
26
+ /**
27
+ @namespace JSC3D
28
+ */
29
+ var JSC3D = JSC3D || {};
30
+
31
+
32
+ /**
33
+ @class Autodesk3DSLoader
34
+
35
+ This class implements a scene loader from an 3DS file.
36
+ */
37
+ JSC3D.Autodesk3DSLoader = function(onload, onerror, onprogress, onresource) {
38
+ this.onload = (onload && typeof(onload) == 'function') ? onload : null;
39
+ this.onerror = (onerror && typeof(onerror) == 'function') ? onerror : null;
40
+ this.onprogress = (onprogress && typeof(onprogress) == 'function') ? onprogress : null;
41
+ this.onresource = (onresource && typeof(onresource) == 'function') ? onresource : null;
42
+ this.request = null;
43
+
44
+ this._materials = {};
45
+ this._unfinalized_objects = {};
46
+ this._textures={};
47
+
48
+ this._cur_obj_end = 0;
49
+ this._cur_obj;
50
+
51
+ this._cur_mat_end = 0;
52
+ this._cur_mat;
53
+
54
+ this.totalFaces = 0;
55
+ };
56
+
57
+ /**
58
+ Load scene from a given 3DS file.
59
+ @param {String} urlName a string that specifies where to fetch the 3DS file.
60
+ */
61
+ JSC3D.Autodesk3DSLoader.prototype.loadFromUrl = function(urlName) {
62
+ var self = this;
63
+ var xhr = new XMLHttpRequest;
64
+ xhr.open('GET', urlName, true);
65
+ if(JSC3D.PlatformInfo.browser == 'ie' && JSC3D.PlatformInfo.version >= '10')
66
+ xhr.responseType = 'blob'; // use blob method to deal with 3DS files for IE >= 10
67
+ else{
68
+ xhr.overrideMimeType('text/plain; charset=x-user-defined');
69
+ // xhr.responseType = "arraybuffer";
70
+ }
71
+
72
+ xhr.onreadystatechange = function() {
73
+ if(this.readyState == 4) {
74
+ if(this.status == 200 || this.status == 0) {
75
+ if(JSC3D.console)
76
+ JSC3D.console.logInfo('Finished loading 3DS file "' + urlName + '".');
77
+ if(self.onload) {
78
+ if(self.onprogress)
79
+ self.onprogress('Loading 3DS file ...', 1);
80
+ if(JSC3D.PlatformInfo.browser == 'ie' && JSC3D.PlatformInfo.version >= '10') {
81
+ // asynchronously decode blob to binary string
82
+ var blobReader = new FileReader;
83
+ blobReader.onload = function(event) {
84
+ var scene = new JSC3D.Scene;
85
+ self.parse3DS(scene, event.target.result);
86
+ self.onload(scene);
87
+ };
88
+ blobReader.readAsText(this.response, 'x-user-defined');
89
+ }
90
+ else {
91
+ var scene = new JSC3D.Scene;
92
+ self.parse3DS(scene, this.responseText);
93
+ self.onload(scene);
94
+ }
95
+ }
96
+ }
97
+ else {
98
+ if(JSC3D.console)
99
+ JSC3D.console.logError('Failed to load 3DS file "' + urlName + '".');
100
+ if(self.onerror)
101
+ self.onerror('Failed to load 3DS file "' + urlName + '".');
102
+ }
103
+ self.request = null;
104
+ }
105
+ };
106
+
107
+ if(this.onprogress) {
108
+ this.onprogress('Loading 3DS file ...', 0);
109
+ xhr.onprogress = function(event) {
110
+ self.onprogress('Loading 3DS file ...', event.loaded / event.total);
111
+ };
112
+ }
113
+
114
+ this.request = xhr;
115
+ xhr.send();
116
+ };
117
+
118
+ /**
119
+ Abort current loading if it is not finished yet.
120
+ */
121
+ JSC3D.Autodesk3DSLoader.prototype.abort = function() {
122
+ if(this.request) {
123
+ this.request.abort();
124
+ this.request = null;
125
+ }
126
+ };
127
+
128
+ JSC3D.Autodesk3DSLoader.prototype.parseMaterial= function (reader, endMaterial) {
129
+ var mat = {};
130
+
131
+ while (reader.tell() < endMaterial) {
132
+ var cid ;
133
+ var len;
134
+ var end;
135
+
136
+ cid = reader.readUInt16();
137
+ len = reader.readUInt32();
138
+ end = reader.tell() + (len-6);
139
+
140
+ switch (cid) {
141
+ case 0xA000: // Material name
142
+ mat.name = this.readNulTermString(reader);
143
+ break;
144
+
145
+ case 0xA010: // Ambient color
146
+ mat.ambientColor = this.readColor(reader);
147
+ break;
148
+
149
+ case 0xA020: // Diffuse color
150
+ mat.diffuseColor = this.readColor(reader);
151
+ break;
152
+
153
+ case 0xA030: // Specular color
154
+ mat.specularColor = this.readColor(reader);
155
+ break;
156
+
157
+ case 0xA050: // transparency
158
+ mat.transparency = this.readAmount(reader,end);
159
+ break;
160
+
161
+ case 0xA081: // Two-sided, existence indicates "true"
162
+ mat.twoSided = true;
163
+ break;
164
+
165
+ case 0xA200: // Main (color) texture
166
+ mat.colorMap = this.parseTexture(reader,end);
167
+ break;
168
+
169
+ case 0xA204: // Specular map
170
+ mat.specularMap = this.parseTexture(reader,end);
171
+ break;
172
+
173
+ default:
174
+ reader.seek(end);
175
+ break;
176
+ }
177
+ }
178
+
179
+ return mat;
180
+ };
181
+
182
+ JSC3D.Autodesk3DSLoader.prototype.readAmount = function(reader,end) {
183
+ var cid;
184
+ var len;
185
+ var amount = 0;
186
+ cid = reader.readUInt16();
187
+ len = reader.readUInt32();
188
+
189
+ switch (cid) {
190
+ case 0x0030: // Floats
191
+ amount = reader.readUInt16();
192
+ break;
193
+ default:
194
+ break;
195
+ }
196
+
197
+ reader.seek(end);
198
+ return amount;
199
+ };
200
+
201
+ JSC3D.Autodesk3DSLoader.prototype.readColor = function(reader) {
202
+ var cid;
203
+ var len;
204
+ var r, g, b;
205
+
206
+ cid = reader.readUInt16();
207
+ len = reader.readUInt32();
208
+
209
+ switch (cid) {
210
+ case 0x0010: // Floats
211
+ r = reader.readFloat32() * 255;
212
+ g = reader.readFloat32() * 255;
213
+ b = reader.readFloat32() * 255;
214
+ break;
215
+ case 0x0011: // 24-bit color
216
+ r = reader.readUInt8();
217
+ g = reader.readUInt8();
218
+ b = reader.readUInt8();
219
+ break;
220
+ default:
221
+ reader.skip(len-6);
222
+ break;
223
+ }
224
+
225
+ return (r<<16) | (g<<8) | b;
226
+ };
227
+
228
+ JSC3D.Autodesk3DSLoader.prototype.parseTexture = function(reader, endTexture) {
229
+ var tex ={};
230
+
231
+ while (reader.tell() < endTexture) {
232
+ var cid;
233
+ var len;
234
+
235
+ cid = reader.readUInt16();
236
+ len = reader.readUInt32();
237
+
238
+ switch (cid) {
239
+ case 0xA300:
240
+ tex.url = this.readNulTermString(reader);
241
+ break;
242
+ default:
243
+ // Skip this unknown texture sub-chunk
244
+ reader.skip(len-6);
245
+ break;
246
+ }
247
+ }
248
+
249
+ this._textures[tex.url] = tex;
250
+ //TODO: vasea
251
+ // this.addDependency(tex.url);
252
+
253
+ return tex;
254
+ };
255
+
256
+ JSC3D.Autodesk3DSLoader.prototype.readNulTermString= function (reader) {
257
+ var chr;
258
+ var str = '';
259
+
260
+ while ((chr = reader.readUInt8()) > 0) {
261
+ str += String.fromCharCode(chr);
262
+ }
263
+
264
+ return str;
265
+ };
266
+
267
+ JSC3D.Autodesk3DSLoader.prototype.parseVertexList = function (reader) {
268
+ var i;
269
+ var len;
270
+ var count;
271
+
272
+ count = reader.readUInt16();
273
+ this._cur_obj.verts = new Array(count*3);
274
+
275
+ i = 0;
276
+ len = this._cur_obj.verts.length;
277
+ while (i<len) {
278
+ var x, y, z;
279
+
280
+ x = reader.readFloat32();
281
+ y = reader.readFloat32();
282
+ z = reader.readFloat32();
283
+
284
+ this._cur_obj.verts[i++] = x;
285
+ this._cur_obj.verts[i++] = z;
286
+ this._cur_obj.verts[i++] = -y;
287
+ }
288
+ };
289
+
290
+
291
+ JSC3D.Autodesk3DSLoader.prototype.parseFaceList = function (reader) {
292
+ var i;
293
+ var len;
294
+ var count;
295
+
296
+ count = reader.readUInt16();
297
+ this._cur_obj.facesCount = count;
298
+ this._cur_obj.indices = [];
299
+ this._cur_obj.uvsIndexes = [];
300
+
301
+
302
+ i = 0;
303
+ len = count*3;
304
+ while (i < len) {
305
+ var i0, i1, i2;
306
+
307
+ i0 = reader.readUInt16();
308
+ i1 = reader.readUInt16();
309
+ i2 = reader.readUInt16();
310
+ i+=3;
311
+ this._cur_obj.indices.push(i0);
312
+ this._cur_obj.indices.push(i2);
313
+ this._cur_obj.indices.push(i1);
314
+ this._cur_obj.indices.push(-1);
315
+
316
+ this._cur_obj.uvsIndexes.push(i0);
317
+ this._cur_obj.uvsIndexes.push(i2);
318
+ this._cur_obj.uvsIndexes.push(i1);
319
+ this._cur_obj.uvsIndexes.push(-1);
320
+
321
+
322
+ // Skip "face info", irrelevant data
323
+ reader.skip(2);
324
+ }
325
+
326
+ this._cur_obj.smoothingGroups = [];
327
+ for ( index = 0 ; index <this._cur_obj.facesCount;index++){
328
+ this._cur_obj.smoothingGroups[index] = 0;
329
+ }
330
+ };
331
+
332
+
333
+
334
+ JSC3D.Autodesk3DSLoader.prototype.parseUVList = function (reader) {
335
+ var i;
336
+ var len;
337
+ var count;
338
+
339
+ count = reader.readUInt16();
340
+ this._cur_obj.uvs = [];
341
+
342
+
343
+ i = 0;
344
+ len = count;
345
+
346
+ while (i < len) {
347
+ this._cur_obj.uvs.push(reader.readFloat32());
348
+ this._cur_obj.uvs.push(1.0 - reader.readFloat32());
349
+ i+=1;
350
+ }
351
+ };
352
+
353
+
354
+ JSC3D.Autodesk3DSLoader.prototype.parseFaceMaterialList = function (reader) {
355
+ var mat;
356
+ var count;
357
+ var i;
358
+ var faces = [];
359
+
360
+ mat = this.readNulTermString(reader);
361
+ count = reader.readUInt16();
362
+ for (var index = 0 ; index < count;index++){
363
+ faces[index] = 0;
364
+ }
365
+
366
+ i = 0;
367
+ while (i<faces.length) {
368
+ faces[i++] = reader.readUInt16();
369
+ }
370
+
371
+ this._cur_obj.materials.push(mat);
372
+ this._cur_obj.materialFaces[mat] = faces;
373
+ };
374
+
375
+
376
+ JSC3D.Autodesk3DSLoader.prototype.readTransform = function (reader) {
377
+ var data =[];
378
+ for (var index = 0 ; index < 16;index++){
379
+ data[index] = 0;
380
+ }
381
+
382
+
383
+ // X axis
384
+ data[0] = reader.readFloat32(); // X
385
+ data[2] = reader.readFloat32(); // Z
386
+ data[1] = reader.readFloat32(); // Y
387
+ data[3] = 0;
388
+
389
+ // Z axis
390
+ data[8] = reader.readFloat32(); // X
391
+ data[10] = reader.readFloat32(); // Z
392
+ data[9] = reader.readFloat32(); // Y
393
+ data[11] = 0;
394
+
395
+ // Y Axis
396
+ data[4] = reader.readFloat32(); // X
397
+ data[6] = reader.readFloat32(); // Z
398
+ data[5] = reader.readFloat32(); // Y
399
+ data[7] = 0;
400
+
401
+ // Translation
402
+ data[12] = reader.readFloat32(); // X
403
+ data[14] = reader.readFloat32(); // Z
404
+ data[13] = reader.readFloat32(); // Y
405
+ data[15] = 1;
406
+
407
+ return data;
408
+ };
409
+
410
+ JSC3D.Autodesk3DSLoader.prototype.parseObjectAnimation = function (reader,end) {
411
+ var vo;
412
+ var obj;
413
+ var pivot;
414
+ var name;
415
+ var hier;
416
+
417
+ // Pivot defaults to origin
418
+ pivot = {};
419
+
420
+ while (reader.tell() < end) {
421
+ var cid;
422
+ var len;
423
+
424
+ cid = reader.readUInt16();
425
+ len = reader.readUInt32();
426
+
427
+ switch (cid) {
428
+ case 0xb010: // Name/hierarchy
429
+ name = this.readNulTermString(reader);
430
+ reader.skip(4);
431
+ hier = reader.readInt16();
432
+ break;
433
+
434
+ case 0xb013: // Pivot
435
+ pivot.x = reader.readFloat32();
436
+ pivot.z = reader.readFloat32();
437
+ pivot.y = reader.readFloat32();
438
+ break;
439
+
440
+ default:
441
+ reader.skip(len-6);
442
+ break;
443
+ }
444
+ }
445
+
446
+ // If name is "$$$DUMMY" this is an empty object (e.g. a container)
447
+ // and will be ignored in this version of the parser
448
+ // TODO: Implement containers in 3DS parser.
449
+ if (name != '$$$DUMMY' && this._unfinalized_objects.hasOwnProperty(name)) {
450
+ vo = this._unfinalized_objects[name];
451
+ // todo vasea
452
+ if(JSC3D.console)
453
+ JSC3D.console.logInfo('Construct object '+vo.name);
454
+ // this._cur_obj = null;
455
+ obj = null;//this.constructObject(vo, pivot);
456
+
457
+ if (obj) {
458
+ if(JSC3D.console)
459
+ JSC3D.console.logInfo('finished loading the object '+vo.name);
460
+ }
461
+
462
+ delete this._unfinalized_objects[name];
463
+ }
464
+ };
465
+
466
+
467
+ JSC3D.Autodesk3DSLoader.prototype.parseSmoothingGroups = function (reader) {
468
+ var len = this._cur_obj.facesCount;
469
+ var i = 0;
470
+ while (i < len) {
471
+ this._cur_obj.smoothingGroups[i] = reader.readUInt32();
472
+ i++;
473
+ }
474
+ };
475
+
476
+
477
+ JSC3D.Autodesk3DSLoader.prototype.finalizeCurrentMaterial = function () {
478
+ var mat = new JSC3D.Material;
479
+
480
+ if (this._cur_mat.colorMap) {
481
+ mat.textureFileName = this._cur_mat.colorMap.texture;
482
+ }
483
+ else {
484
+ mat.diffuseColor = this._cur_mat.diffuseColor;
485
+ }
486
+
487
+ mat.ambientColor = this._cur_mat.ambientColor;
488
+ mat.specularColor = this._cur_mat.specularColor;
489
+ mat.bothSides = this._cur_mat.twoSided;
490
+
491
+ this._materials[this._cur_mat.name] = this._cur_mat;
492
+ this._cur_mat.material = mat;
493
+
494
+ this._cur_mat = null;
495
+ };
496
+
497
+ /**
498
+ Asynchronously load a texture from a given url and set it to corresponding meshes when done.
499
+ @private
500
+ */
501
+ JSC3D.Autodesk3DSLoader.prototype.setupTexture = function(meshList, textureUrlName) {
502
+ var self = this;
503
+ var texture = new JSC3D.Texture;
504
+
505
+ texture.onready = function() {
506
+ for(var i=0; i<meshList.length; i++)
507
+ meshList[i].setTexture(this);
508
+ if(self.onresource)
509
+ self.onresource(this);
510
+ };
511
+
512
+ texture.createFromUrl(textureUrlName);
513
+ };
514
+
515
+ /**
516
+ Parse contents of an Autodesk3DSLoader file and generate the scene.
517
+ @private
518
+ */
519
+ JSC3D.Autodesk3DSLoader.prototype.parse3DS = function(scene, data) {
520
+ var mesh = new JSC3D.Mesh;
521
+ mesh.vertexBuffer = [];
522
+ mesh.indexBuffer = [];
523
+ mesh.faceNormalBuffer = [];
524
+
525
+ var reader = new JSC3D.BinaryStream(data);
526
+
527
+ reader.reset();
528
+
529
+
530
+ // TODO: With this construct, the loop will run no-op for as long
531
+ // as there is time once file has finished reading. Consider a nice
532
+ // way to stop loop when byte array is empty, without putting it in
533
+ // the while-conditional, which will prevent finalizations from
534
+ // happening after the last chunk.
535
+ while (!reader.eof()) {
536
+
537
+ // If we are currently working on an object, and the most recent chunk was
538
+ // the last one in that object, finalize the current object.
539
+ if (this._cur_mat && reader.tell() >= this._cur_mat_end) {
540
+ this.finalizeCurrentMaterial();
541
+ }
542
+ else if (this._cur_obj && reader.tell() >= this._cur_obj_end) {
543
+ // Can't finalize at this point, because we have to wait until the full
544
+ // animation section has been parsed for any potential pivot definitions
545
+
546
+ if(JSC3D.console)
547
+ JSC3D.console.logInfo('Optimize the mesh and add it to the scene. ');
548
+
549
+ //have to parse all the materials and create a mesh fdor each material
550
+
551
+ mesh = new JSC3D.Mesh;
552
+ mesh.faceCount = this._cur_obj.facesCount;
553
+ mesh.name = this._cur_obj.name;
554
+ mesh.vertexBuffer = this._cur_obj.verts;
555
+ mesh.indexBuffer = this._cur_obj.indices;
556
+ mesh.texCoordBuffer = this._cur_obj.uvs;
557
+
558
+
559
+ mesh.texCoordIndexBuffer = this._cur_obj.uvsIndexes;
560
+ // mesh.texCoordIndexBuffer = mesh.indexBuffer;
561
+ mesh.material = new JSC3D.Material;
562
+
563
+ var materialFaces = this._cur_obj.materialFaces;
564
+ var currentMaterial = null;
565
+ for(var materialName in materialFaces){
566
+ currentMaterial = this._materials[materialName];
567
+ if (currentMaterial.colorMap) {
568
+ if(JSC3D.console)
569
+ JSC3D.console.logInfo('set texture: '+currentMaterial.colorMap.url);
570
+ this.setupTexture([mesh], currentMaterial.colorMap.url);
571
+ }
572
+ else {
573
+ mesh.material.diffuseColor = currentMaterial.diffuseColor;
574
+ }
575
+ // mesh.material.ambientColor = currentMaterial.ambientColor;
576
+ // mesh.material.simulateSpecular = (currentMaterial.specularColor>0);
577
+ mesh.isDoubleSided = true;//currentMaterial.twoSided;
578
+ mesh.material.transparency = currentMaterial.transparency>0?(currentMaterial.transparency)/100:0;
579
+ }
580
+
581
+
582
+
583
+ //mesh.faceNormalBuffer = [];
584
+ // mesh.init();
585
+ /*
586
+
587
+ var tempVertexBuffer = this._cur_obj.verts; // temporary buffer as container for all vertices
588
+
589
+ var viBuffer = tempVertexBuffer.length >= 3 ? (new Array(tempVertexBuffer.length / 3)) : null;
590
+
591
+ // split vertices into the mesh, the indices are also re-calculated
592
+ if(tempVertexBuffer.length >= 3 && mesh.indexBuffer.length > 0) {
593
+ for(var i=0; i<viBuffer.length; i++)
594
+ viBuffer[i] = -1;
595
+
596
+ mesh.vertexBuffer = [];
597
+ var oldVI = 0, newVI = 0;
598
+ for(var i=0; i<mesh.indexBuffer.length; i++) {
599
+ oldVI = mesh.indexBuffer[i];
600
+ if(oldVI != -1) {
601
+ if(viBuffer[oldVI] == -1) {
602
+ var v = oldVI * 3;
603
+ mesh.vertexBuffer.push(tempVertexBuffer[v]);
604
+ mesh.vertexBuffer.push(tempVertexBuffer[v + 1]);
605
+ mesh.vertexBuffer.push(tempVertexBuffer[v + 2]);
606
+ mesh.indexBuffer[i] = newVI;
607
+ viBuffer[oldVI] = newVI;
608
+ newVI++;
609
+ }
610
+ else {
611
+ mesh.indexBuffer[i] = viBuffer[oldVI];
612
+ }
613
+ }
614
+ }
615
+ }
616
+ */
617
+
618
+
619
+
620
+ // add mesh to scene
621
+ if(!mesh.isTrivial()){
622
+ scene.addChild(mesh);
623
+ this.totalFaces+=mesh.faceCount;
624
+ }
625
+
626
+ this._unfinalized_objects[this._cur_obj.name] = this._cur_obj;
627
+
628
+ this._cur_obj_end = Number.MAX_VALUE;
629
+ this._cur_obj = null;
630
+ }
631
+
632
+
633
+ var cid;
634
+ var len;
635
+ var end;
636
+
637
+ cid = reader.readUInt16();
638
+ len = reader.readUInt32();
639
+ end = reader.tell() + (len-6);
640
+
641
+ switch (cid) {
642
+ case 0x4D4D: // MAIN3DS
643
+ case 0x3D3D: // EDIT3DS
644
+ case 0xB000: // KEYF3DS
645
+ // This types are "container chunks" and contain only
646
+ // sub-chunks (no data on their own.) This means that
647
+ // there is nothing more to parse at this point, and
648
+ // instead we should progress to the next chunk, which
649
+ // will be the first sub-chunk of this one.
650
+ continue;
651
+ break;
652
+
653
+ case 0xAFFF: // MATERIAL
654
+ this._cur_mat_end = end;
655
+ this._cur_mat = this.parseMaterial(reader,end);
656
+ break;
657
+
658
+ case 0x4000: // EDIT_OBJECT
659
+ this._cur_obj_end = end;
660
+ this._cur_obj = {};
661
+ this._cur_obj.name = this.readNulTermString(reader);
662
+ this._cur_obj.materials = [];
663
+ this._cur_obj.materialFaces = [];
664
+ break;
665
+
666
+ case 0x4100: // OBJ_TRIMESH
667
+
668
+ this._cur_obj.type = 'mesh';
669
+ break;
670
+
671
+ case 0x4110: // TRI_VERTEXL
672
+ this.parseVertexList(reader);
673
+ break;
674
+
675
+ case 0x4120: // TRI_FACELIST
676
+ this.parseFaceList(reader);
677
+ break;
678
+
679
+ case 0x4140: // TRI_MAPPINGCOORDS
680
+ this.parseUVList(reader);
681
+ break;
682
+
683
+ case 0x4130: // Face materials
684
+ this.parseFaceMaterialList(reader);
685
+ break;
686
+
687
+ case 0x4160: // Transform
688
+ this._cur_obj.transform = this.readTransform(reader);
689
+ break;
690
+
691
+ case 0xB002: // Object animation (including pivot)
692
+ this.parseObjectAnimation(reader,end);
693
+ break;
694
+
695
+ case 0x4150: // Smoothing groups
696
+ this.parseSmoothingGroups(reader);
697
+ break;
698
+
699
+ default:
700
+ // Skip this (unknown) chunk
701
+ reader.skip(len-6);
702
+ break;
703
+ }
704
+ }
705
+
706
+ if(JSC3D.console) {
707
+ JSC3D.console.logInfo('3DS object was loaded !');
708
+ JSC3D.console.logInfo(' totalFaces=' + this.totalFaces);
709
+ }
710
+ };
711
+
712
+ JSC3D.Autodesk3DSLoader.prototype.onload = null;
713
+ JSC3D.Autodesk3DSLoader.prototype.onerror = null;
714
+ JSC3D.Autodesk3DSLoader.prototype.onprogress = null;
715
+ JSC3D.Autodesk3DSLoader.prototype.onresource = null;
716
+
717
+ JSC3D.LoaderSelector.registerLoader('3ds', JSC3D.Autodesk3DSLoader);