ginipick commited on
Commit
032e410
·
1 Parent(s): e930868

Delete lib/mod3d.js

Browse files
Files changed (1) hide show
  1. lib/mod3d.js +0 -2520
lib/mod3d.js DELETED
@@ -1,2520 +0,0 @@
1
- /*
2
- * Real3D FlipBook [https://real3dflipbook.com]
3
- * @author creativeinteractivemedia [https://codecanyon.net/user/creativeinteractivemedia/portfolio]
4
- * @version 4.10
5
- * @date 2025-05-15
6
- */
7
- /**
8
- * MOD3 3D Modifier Library for JavaScript
9
- * port of AS3DMod ActionScript3 library (http://code.google.com/p/as3dmod/)
10
- *
11
- * @version 1.0.0 (2023-01-03 16:08:34)
12
- * https://github.com/foo123/MOD3
13
- *
14
- **//**
15
- * MOD3 3D Modifier Library for JavaScript
16
- * port of AS3DMod ActionScript3 library (http://code.google.com/p/as3dmod/)
17
- *
18
- * @version 1.0.0 (2023-01-03 16:08:34)
19
- * https://github.com/foo123/MOD3
20
- *
21
- **/
22
- !function(root, name, factory) {
23
- "use strict";
24
- if (('object' === typeof module) && module.exports) /* CommonJS */
25
- (module.$deps = module.$deps||{}) && (module.exports = module.$deps[name] = factory.call(root));
26
- else if (('function' === typeof define) && define.amd && ('function' === typeof require) && ('function' === typeof require.specified) && require.specified(name) /*&& !require.defined(name)*/) /* AMD */
27
- define(name, ['module'], function(module) {factory.moduleUri = module.uri; return factory.call(root);});
28
- else if (!(name in root)) /* Browser/WebWorker/.. */
29
- (root[name] = factory.call(root)||1) && ('function' === typeof(define)) && define.amd && define(function() {return root[name];});
30
- }( /* current root */ 'undefined' !== typeof self ? self : this,
31
- /* module name */ "MOD3",
32
- /* module factory */ function ModuleFactory__MOD3(undef) {
33
- "use strict";
34
-
35
- var HAS = Object.prototype.hasOwnProperty,
36
- toString = Object.prototype.toString,
37
- def = Object.defineProperty,
38
- stdMath = Math, PI = stdMath.PI,
39
- TWO_PI = 2*PI, HALF_PI = PI/2, INV_PI = 1/PI,
40
- EMPTY_ARR = [], EMPTY_OBJ = {}, NOP = function() {},
41
- isNode = ("undefined" !== typeof global) && ("[object global]" === toString.call(global)),
42
- isBrowser = ("undefined" !== typeof window) && ("[object Window]" === toString.call(window))
43
- ;
44
-
45
- // basic backwards-compatible "class" construction
46
- function makeSuper(superklass)
47
- {
48
- var called = {};
49
- return function $super(method, args) {
50
- var self = this, m = ':'+method, ret;
51
- if (1 === called[m]) return (superklass.prototype.$super || NOP).call(self, method, args);
52
- called[m] = 1;
53
- ret = ('constructor' === method ? superklass : (superklass.prototype[method] || NOP)).apply(self, args || []);
54
- called[m] = 0;
55
- return ret;
56
- };
57
- }
58
- function makeClass(superklass, klass, statik)
59
- {
60
- if (arguments.length < 2)
61
- {
62
- klass = superklass;
63
- superklass = null;
64
- }
65
- var C = HAS.call(klass, 'constructor') ? klass.constructor : function() {}, p;
66
- if (superklass)
67
- {
68
- C.prototype = Object.create(superklass.prototype);
69
- C.prototype.$super = makeSuper(superklass);
70
- }
71
- else
72
- {
73
- C.prototype.$super = NOP;
74
- }
75
- C.prototype.constructor = C;
76
- for (p in klass)
77
- {
78
- if (HAS.call(klass, p) && ('constructor' !== p))
79
- {
80
- C.prototype[p] = klass[p];
81
- }
82
- }
83
- if (statik)
84
- {
85
- for (p in statik)
86
- {
87
- if (HAS.call(statik, p))
88
- {
89
- C[p] = statik[p];
90
- }
91
- }
92
- }
93
- return C;
94
- }
95
- var MOD3 = {
96
- VERSION: "1.0.0",
97
- Class: makeClass
98
- };
99
- /**
100
- * MOD3 Constants and Auxilliary methods
101
- **/
102
- MOD3.Constants = {
103
- // cache math constants for reference and optimization
104
- PI: PI,
105
- invPI: INV_PI,
106
- halfPI: HALF_PI,
107
- doublePI: TWO_PI,
108
- toRad: PI/180,
109
- toDeg: 180/PI
110
- };
111
- MOD3.ModConstant = {
112
- NONE: 0,
113
- LEFT: -1,
114
- RIGHT: 1,
115
-
116
- X: 1,
117
- Y: 2,
118
- Z: 4,
119
-
120
- Xi: 0,
121
- Yi: 1,
122
- Zi: 2
123
- };
124
- MOD3.XYZi = [
125
- null,
126
- 0,
127
- 1,
128
- null,
129
- 2
130
- ];
131
- MOD3.iXYZ = [
132
- 1,
133
- 2,
134
- 4
135
- ];
136
- MOD3.xyz = [
137
- "x",
138
- "y",
139
- "z"
140
- ];
141
- MOD3.XYZ = [
142
- "X",
143
- "Y",
144
- "Z"
145
- ];
146
-
147
- // Typed Arrays Substitutes
148
- MOD3.Array32F = typeof Float32Array !== "undefined" ? Float32Array : Array;
149
- MOD3.Array64F = typeof Float64Array !== "undefined" ? Float64Array : Array;
150
- MOD3.Array8I = typeof Int8Array !== "undefined" ? Int8Array : Array;
151
- MOD3.Array16I = typeof Int16Array !== "undefined" ? Int16Array : Array;
152
- MOD3.Array32I = typeof Int32Array !== "undefined" ? Int32Array : Array;
153
- MOD3.Array8U = typeof Uint8Array !== "undefined" ? Uint8Array : Array;
154
- MOD3.Array16U = typeof Uint16Array !== "undefined" ? Uint16Array : Array;
155
- MOD3.Array32U = typeof Uint32Array !== "undefined" ? Uint32Array : Array;
156
- // vector typed-array
157
- MOD3.VecArray = MOD3.Array32F;
158
- /**
159
- * MOD3 Math Utilities Class
160
- **/
161
- MOD3.XMath = {
162
- normalize: function(start, end, val) {
163
- var range = end - start;
164
- return 0 === range ? 1 : MOD3.XMath.trim(0, 1, (val - start)/end);
165
- },
166
-
167
- toRange: function(start, end, normalized) {
168
- var range = end - start;
169
- return 0 === range ? 0 : (start + range*normalized);
170
- },
171
-
172
- inRange: function(start, end, value, excluding) {
173
- return false !== excluding ? (value >= start && value <= end) : (value > start && value < end);
174
- },
175
-
176
- sign: function(val, ifZero) {
177
- return 0 === val ? (ifZero || 0) : (val > 0 ? 1 : -1);
178
- },
179
-
180
- trim: function(start, end, value) {
181
- return value < start ? start : (value > end ? end : value);
182
- },
183
-
184
- wrap: function(start, end, value) {
185
- var r = end - start;
186
- return value < start ? (value + r) : (value >= end ? value - r : value);
187
- },
188
-
189
- degToRad: function(deg) {
190
- return deg/180*PI;
191
- },
192
-
193
- radToDeg: function(rad) {
194
- return rad/PI*180;
195
- },
196
-
197
- presicion: function(number, precision) {
198
- var r = stdMath.pow(10, precision);
199
- return stdMath.round(number*r)/r;
200
- },
201
-
202
- uceil: function(val) {
203
- return val < 0 ? stdMath.floor(val) : stdMath.ceil(val);
204
- }
205
- };
206
- // alias
207
- MOD3.XMath.clamp = MOD3.XMath.trim;
208
- /**
209
- * MOD3 Range Auxilliary Class
210
- **/
211
- MOD3.Range = MOD3.Class({
212
- constructor: function Range(s, e) {
213
- var self = this;
214
- if (!(self instanceof Range)) return new Range(s, e);
215
- self.start = null != s ? s : 0;
216
- self.end = null != e ? e : 1;
217
- },
218
-
219
- name: "Range",
220
- start: 0,
221
- end: 1,
222
-
223
- dispose: function() {
224
- var self = this;
225
- self.start = null;
226
- self.end = null;
227
- return self;
228
- },
229
-
230
- getSize: function() {
231
- return this.end - this.start;
232
- },
233
-
234
- move: function(amount) {
235
- this.start += amount;
236
- this.end += amount;
237
- },
238
-
239
- isIn: function(n) {
240
- return (n >= this.start && n <= this.end);
241
- },
242
-
243
- normalize: function(n) {
244
- return MOD3.XMath.normalize(this.start, this.end, n);
245
- },
246
-
247
- toRange: function(n) {
248
- return MOD3.XMath.toRange(this.start, this.end, n);
249
- },
250
-
251
- trim: function(n) {
252
- return MOD3.XMath.trim(this.start, this.end, n);
253
- },
254
-
255
- interpolate: function(n, r) {
256
- return MOD3.XMath.toRange(this.start, this.end, r.normalize(n));
257
- },
258
-
259
- toString: function() {
260
- return "[" + this.start + " - " + this.end + "]";
261
- }
262
- });
263
- /**
264
- * MOD3 Phase Auxilliary Class
265
- **/
266
- MOD3.Phase = MOD3.Class({
267
- constructor: function Phase(v) {
268
- var self = this;
269
- if (!(self instanceof Phase)) return new Phase(v);
270
- self.value = v || 0;
271
- },
272
-
273
- name: "Phase",
274
- value: 0,
275
-
276
- dispose: function() {
277
- this.value = null;
278
- return this;
279
- },
280
-
281
- getPhasedValue: function() {
282
- return stdMath.sin(this.value);
283
- },
284
-
285
- getAbsPhasedValue: function() {
286
- return stdMath.abs(stdMath.sin(this.value));
287
- },
288
-
289
- getNormValue: function() {
290
- return (stdMath.sin(this.value) + 1)*0.5;
291
- }
292
- });
293
- /**
294
- * MOD3 2D Point Class
295
- **/
296
- MOD3.Point = MOD3.Class({
297
- constructor: function Point(x, y) {
298
- var self = this;
299
- if (!(self instanceof Point)) return new Point(x, y);
300
- self.x = x || 0;
301
- self.y = y || 0;
302
- },
303
-
304
- name: "Point",
305
- x: 0,
306
- y: 0,
307
-
308
- dispose: function() {
309
- var self = this;
310
- self.x = null;
311
- self.y = null;
312
- return self;
313
- },
314
-
315
- clone: function() {
316
- return new MOD3.Point(this.x, this.y);
317
- }
318
- });
319
- /**
320
- * MOD3 2D Transform Matrix Class
321
- **/
322
- MOD3.Matrix = MOD3.Class(null, {
323
- constructor: function Matrix(m11, m12,
324
- m21, m22)
325
- {
326
- var self = this;
327
- if (!(self instanceof Matrix)) return new Matrix(m11, m12,
328
- m21, m22);
329
- self.m = new MOD3.VecArray([
330
- m11 == null ? 1 : m11,
331
- m12 == null ? 0 : m12,
332
- m21 == null ? 0 : m21,
333
- m22 == null ? 1 : m22
334
- ]);
335
- },
336
-
337
- name: "Matrix",
338
- m: null,
339
-
340
- dispose: function() {
341
- this.m = null;
342
- return this;
343
- },
344
-
345
- reset: function() {
346
- var m = this.m;
347
- m[0] = 1; m[1] = 0;
348
- m[2] = 0; m[3] = 1;
349
- return this;
350
- },
351
-
352
- rotate: function(angle) {
353
- var m = this.m, c = stdMath.cos(angle), s = stdMath.sin(angle);
354
- m[0] = c; m[1] = -s;
355
- m[2] = s; m[3] = c;
356
- return this;
357
- },
358
-
359
- scale: function(sx, sy) {
360
- var m = this.m;
361
- m[0] = 1; m[1] = 0;
362
- m[2] = 0; m[3] = 1;
363
- if (sx != null)
364
- {
365
- m[0] = sx;
366
- m[3] = sx;
367
- }
368
- if (sy != null)
369
- {
370
- m[3] = sy;
371
- }
372
- return this;
373
- },
374
-
375
- multiply: function(b) {
376
- return MOD3.Matrix.mult(this, b);
377
- },
378
-
379
- transformPoint: function(p) {
380
- var xy = MOD3.Matrix.transform(this, [p.x, p.y]);
381
- return new MOD3.Point(xy[0], xy[1]);
382
- },
383
-
384
- transformPointSelf: function(p) {
385
- var xy = MOD3.Matrix.transform(this, [p.x, p.y]);
386
- p.x = xy[0]; p.y = xy[1];
387
- return p;
388
- },
389
-
390
- clone: function() {
391
- var m = this.m;
392
- return new MOD3.Matrix(m[0], m[1],
393
- m[2], m[3]);
394
- }
395
- }, {
396
- transform: function(m2, xy) {
397
- var m = m2.m, x = xy[0], y = xy[1];
398
- xy[0] = m[0]*x + m[1]*y;
399
- xy[1] = m[2]*x + m[3]*y;
400
- return xy;
401
- },
402
-
403
- mult: function(m1, m2) {
404
- var a = m1.m, b = m2.m, a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];
405
- a[0] = a0*b[0] + a1*b[2];
406
- a[1] = a0*b[1] + a1*b[3];
407
- a[2] = a2*b[0] + a3*b[2];
408
- a[3] = a2*b[1] + a3*b[3];
409
- return m1;
410
- }
411
- });
412
- /**
413
- * MOD3 Vector3 Class
414
- **/
415
- MOD3.Vector3 = MOD3.Class(null, {
416
- constructor: function Vector3(x, y, z) {
417
- var self = this;
418
- if (!(self instanceof Vector3)) return new Vector3(x, y, z);
419
-
420
- // use an internal typed-array for speed
421
- var v = new MOD3.VecArray(3);
422
- if (x && (3 === x.length))
423
- {
424
- // array passed
425
- v[0] = x[0] || 0;
426
- v[1] = x[1] || 0;
427
- v[2] = x[2] || 0;
428
- }
429
- else
430
- {
431
- // numbers passed
432
- v[0] = x || 0;
433
- v[1] = y || 0;
434
- v[2] = z || 0;
435
- }
436
- self.xyz = v;
437
- },
438
-
439
- name: "Vector3",
440
- xyz: null,
441
-
442
- dispose: function() {
443
- this.xyz = null;
444
- return this;
445
- },
446
-
447
- getXYZ: function() {
448
- // copy it
449
- return new MOD3.VecArray(this.xyz);
450
- },
451
-
452
- getXYZRef: function() {
453
- return this.xyz;
454
- },
455
-
456
- setXYZ: function(w) {
457
- var v = this.xyz;
458
- v[0] = w[0];
459
- v[1] = w[1];
460
- v[2] = w[2];
461
- return this;
462
- },
463
-
464
- setXYZRef: function(xyz) {
465
- this.xyz = xyz;
466
- return this;
467
- },
468
-
469
- clone: function() {
470
- return new MOD3.Vector3(this.xyz);
471
- },
472
-
473
- equalsSelf: function(b) {
474
- var v = this.xyz, w = b.xyz;
475
- return (v[0] === w[0]) && (v[1] === w[1]) && (v[2] === w[2]);
476
- },
477
-
478
- zeroSelf: function() {
479
- var v = this.xyz;
480
- v[0] = 0; v[1] = 0; v[2] = 0;
481
- return this;
482
- },
483
-
484
- negate: function() {
485
- var v = this.xyz;
486
- return new MOD3.Vector3(-v[0], -v[1], -v[2]);
487
- },
488
-
489
- negateSelf: function() {
490
- var v = this.xyz;
491
- v[0] = -v[0]; v[1] = -v[1]; v[2] = -v[2];
492
- return this;
493
- },
494
-
495
- add: function(b) {
496
- var v = this.xyz, w = b.xyz;
497
- return new MOD3.Vector3(v[0] + w[0], v[1] + w[1], v[2] + w[2]);
498
- },
499
-
500
- addSelf: function(b) {
501
- var v = this.xyz, w = b.xyz;
502
- v[0] += w[0]; v[1] += w[1]; v[2] += w[2];
503
- return this;
504
- },
505
-
506
- subtract: function(b) {
507
- var v = this.xyz, w = b.xyz;
508
- return new MOD3.Vector3(v[0] - w[0], v[1] - w[1], v[2] - w[2]);
509
- },
510
-
511
- subtractSelf: function(b) {
512
- var v = this.xyz, w = b.xyz;
513
- v[0] -= w[0]; v[1] -= w[1]; v[2] -= w[2];
514
- return this;
515
- },
516
-
517
- multiplyScalar: function(s) {
518
- var v = this.xyz;
519
- return new MOD3.Vector3(v[0]*s, v[1]*s, v[2]*s);
520
- },
521
-
522
- multiplyScalarSelf: function(s) {
523
- var v = this.xyz;
524
- v[0] *= s; v[1] *= s; v[2] *= s;
525
- return this;
526
- },
527
-
528
- multiply: function(b) {
529
- var v = this.xyz, w = b.xyz;
530
- return new MOD3.Vector3(v[0] * w[0], v[1] * w[1], v[2] * w[2]);
531
- },
532
-
533
- multiplySelf: function(b) {
534
- var v = this.xyz, w = b.xyz;
535
- v[0] *= w[0]; v[1] *= w[1]; v[2] *= w[2];
536
- return this;
537
- },
538
-
539
- divide: function(s) {
540
- var v = this.xyz;
541
- return new MOD3.Vector3(v[0] / s, v[1] / s, v[2] / s);
542
- },
543
-
544
- divideSelf: function(s) {
545
- var v = this.xyz;
546
- v[0] /= s; v[1] /= s; v[2] /= s;
547
- return this;
548
- },
549
-
550
- normalize: function() {
551
- var v = this.xyz,
552
- x = v[0], y = v[1], z = v[2],
553
- m = x * x + y * y + z * z, n;
554
- if (0 < m)
555
- {
556
- n = stdMath.sqrt(m);
557
- x /= n;
558
- y /= n;
559
- z /= n;
560
- }
561
- return new MOD3.Vector3(x, y, z);
562
- },
563
-
564
- normalizeSelf: function() {
565
- var v = this.xyz,
566
- x = v[0], y = v[1], z = v[2],
567
- m = x * x + y * y + z * z, n;
568
- if (0 < m)
569
- {
570
- n = stdMath.sqrt(m);
571
- x /= n;
572
- y /= n;
573
- z /= n;
574
- }
575
- v[0] = x; v[1] = y; v[2] = z;
576
- return this;
577
- },
578
-
579
- getMagnitude: function() {
580
- var v = this.xyz, x = v[0], y = v[1], z = v[2];
581
- return stdMath.sqrt(x*x + y*y + z*z);
582
- },
583
-
584
- setMagnitude: function(m) {
585
- this.normalizeSelf();
586
- var v = this.xyz;
587
- v[0] *= m; v[1] *= m; v[2] *= m;
588
- return this;
589
- },
590
-
591
- dot: function(b) {
592
- var v = this.xyz, w = b.xyz;
593
- return v[0]*w[0] + v[1]*w[1] + v[2]*w[2];
594
- },
595
-
596
- cross: function(b) {
597
- var v = this.xyz, w = b.xyz,
598
- x1 = v[0], y1 = v[1], z1 = v[2],
599
- x2 = w[0], y2 = w[1], z2 = w[2];
600
- return new MOD3.Vector3(y1 * z2 - z1 * y2, z1 * x2 - x1 * z2, x1 * y2 - y1 * x2);
601
- },
602
-
603
- crossSelf: function(v) {
604
- var v = this.xyz, w = b.xyz,
605
- x1 = v[0], y1 = v[1], z1 = v[2],
606
- x2 = w[0], y2 = w[1], z2 = w[2];
607
- v[0] = y1 * z2 - z1 * y2;
608
- v[1] = z1 * x2 - x1 * z2;
609
- v[2] = x1 * y2 - y1 * x2;
610
- return this;
611
- },
612
-
613
- distance: function(b) {
614
- var v = this.xyz, w = b.xyz,
615
- dx = v[0] - w[0],
616
- dy = v[1] - w[1],
617
- dz = v[2] - w[2];
618
- return stdMath.sqrt(dx*dx + dy*dy + dz*dz);
619
- },
620
-
621
- toString: function() {
622
- var v = this.xyz;
623
- return "[" + v[0] + " , " + v[1] + " , " + v[2] + "]";
624
- }
625
- }, {
626
- ZERO: function() {
627
- return new MOD3.Vector3(0, 0, 0);
628
- },
629
-
630
- X: function(direct_or_complement) {
631
- return false === direct_or_complement ? new MOD3.Vector3(0, 1, 1) : new MOD3.Vector3(1, 0, 0);
632
- },
633
-
634
- Y: function(direct_or_complement) {
635
- return false === direct_or_complement ? new MOD3.Vector3(1, 0, 1) : new MOD3.Vector3(0, 1, 0);
636
- },
637
-
638
- Z: function(direct_or_complement) {
639
- return false === direct_or_complement ? new MOD3.Vector3(1, 1, 0) : new MOD3.Vector3(0, 0, 1);
640
- },
641
-
642
- dot: function(v, w) {
643
- return v[0]*w[0] + v[1]*w[1] + v[2]*w[2];
644
- },
645
-
646
- equals: function(v, w) {
647
- return (v[0] === w[0]) && (v[1] === w[1]) && (v[2] === w[2]);
648
- },
649
-
650
- cross: function(v, w) {
651
- var vw = new MOD3.VecArray(3);
652
- vw[0] = v[1] * w[2] - v[2] * w[1];
653
- vw[1] = v[2] * w[0] - v[0] * w[2];
654
- vw[2] = v[0] * w[1] - v[1] * w[0];
655
- return vw;
656
- },
657
-
658
- mod: function(v) {
659
- var x = v[0], y = v[1], z = v[2];
660
- return stdMath.sqrt(x*x + y*y + z*z);
661
- },
662
-
663
- dist: function(v, w) {
664
- var dx = v[0] - w[0],
665
- dy = v[1] - w[1],
666
- dz = v[2] - w[2];
667
- return stdMath.sqrt(dx*dx + dy*dy + dz*dz);
668
- },
669
-
670
- add: function(v, w) {
671
- v[0] += w[0];
672
- v[1] += w[1];
673
- v[2] += w[2];
674
- return v;
675
- },
676
-
677
- sub: function(v, w) {
678
- v[0] -= w[0];
679
- v[1] -= w[1];
680
- v[2] -= w[2];
681
- return v;
682
- },
683
-
684
- mul: function(v, w) {
685
- v[0] *= w[0];
686
- v[1] *= w[1];
687
- v[2] *= w[2];
688
- return v;
689
- },
690
-
691
- muls: function(v, m) {
692
- v[0] *= m;
693
- v[1] *= m;
694
- v[2] *= m;
695
- return v;
696
- },
697
-
698
- norm: function(v) {
699
- var x = v[0], y = v[1], z = v[2],
700
- m = x*x + y*y + z*z, n;
701
- if (0 < m)
702
- {
703
- n = stdMath.sqrt(m);
704
- x /= n;
705
- y /= n;
706
- z /= n;
707
- }
708
- v[0] = x; v[1] = y; v[2] = z;
709
- return v;
710
- }
711
- });
712
- // alaises
713
- MOD3.Vector3.modulo = MOD3.Vector3.mod;
714
- MOD3.Vector3.distance = MOD3.Vector3.dist;
715
- MOD3.Vector3.prototype.dotSelf = MOD3.Vector3.prototype.dot;
716
- MOD3.Vector3.prototype.distanceSelf = MOD3.Vector3.prototype.distance;
717
- /**
718
- * MOD3 3D Transform Matrix Class
719
- **/
720
- MOD3.Matrix4 = MOD3.Class(null, {
721
- constructor: function Matrix4(n11, n12, n13, n14,
722
- n21, n22, n23, n24,
723
- n31, n32, n33, n34,
724
- n41, n42, n43, n44)
725
- {
726
- var self = this;
727
- if (!(self instanceof Matrix4)) return new Matrix4(n11, n12, n13, n14,
728
- n21, n22, n23, n24,
729
- n31, n32, n33, n34,
730
- n41, n42, n43, n44);
731
- self.m = new MOD3.VecArray([
732
- n11 == null ? 1 : n11,
733
- n12 == null ? 0 : n12,
734
- n13 == null ? 0 : n13,
735
- n14 == null ? 0 : n14,
736
-
737
- n21 == null ? 0 : n21,
738
- n22 == null ? 1 : n22,
739
- n23 == null ? 0 : n23,
740
- n24 == null ? 0 : n24,
741
-
742
- n31 == null ? 0 : n31,
743
- n32 == null ? 0 : n32,
744
- n33 == null ? 1 : n33,
745
- n34 == null ? 0 : n34,
746
-
747
- n41 == null ? 0 : n41,
748
- n42 == null ? 0 : n42,
749
- n43 == null ? 0 : n43,
750
- n44 == null ? 1 : n44
751
- ]);
752
- },
753
-
754
- name: "Matrix4",
755
- m: null,
756
-
757
- dispose: function() {
758
- this.m = null;
759
- return this;
760
- },
761
-
762
- reset: function() {
763
- var m = this.m;
764
- m[0 ] = 1; m[1 ] = 0; m[2 ] = 0; m[3 ] = 0;
765
- m[4 ] = 0; m[5 ] = 1; m[6 ] = 0; m[7 ] = 0;
766
- m[8 ] = 0; m[9 ] = 0; m[10] = 1; m[11] = 0;
767
- m[12] = 0; m[13] = 0; m[14] = 0; m[15] = 1;
768
- return this;
769
- },
770
-
771
- translate: function(tx, ty, tz, reset) {
772
- var m = this.m;
773
- if (true === reset) this.reset();
774
- m[3 ] = tx;
775
- m[7 ] = ty;
776
- m[11] = tz;
777
- return this;
778
- },
779
-
780
- scale: function(sx, sy, sz, reset) {
781
- var m = this.m;
782
- if (true === reset) this.reset();
783
- m[0 ] = sx;
784
- m[5 ] = sy;
785
- m[10] = sz;
786
- return this;
787
- },
788
-
789
- rotate: function(rx, ry, rz, theta, reset) {
790
- var m = this.m,
791
- nCos = stdMath.cos(theta), nSin = stdMath.sin(theta), scos = 1 - nCos,
792
- sxy = rx*ry*scos, syz = ry*rz*scos, sxz = rx*rz*scos,
793
- sz = nSin*rz, sy = nSin*ry, sx = nSin*rx
794
- ;
795
- if (true === reset) this.reset();
796
- m[0 ] = nCos + rx*rx*scos;
797
- m[1 ] = -sz + sxy;
798
- m[2 ] = sy + sxz;
799
- m[3 ] = 0;
800
-
801
- m[4 ] = sz + sxy;
802
- m[5 ] = nCos + ry*ry*scos;
803
- m[6 ] = -sx + syz;
804
- m[7 ] = 0;
805
-
806
- m[8 ] = -sy + sxz;
807
- m[9 ] = sx + syz;
808
- m[10] = nCos + rz*rz*scos;
809
- m[11] = 0;
810
- return this;
811
- },
812
-
813
- translateFromVector: function(v, reset) {
814
- return this.translate(v.xyz[0], v.xyz[1], v.xyz[2], reset);
815
- },
816
-
817
- scaleFromVector: function(v, reset) {
818
- return this.scale(v.xyz[0], v.xyz[1], v.xyz[2], reset);
819
- },
820
-
821
- rotateFromVector: function(v, theta, reset) {
822
- return this.rotate(v.xyz[0], v.xyz[1], v.xyz[2], theta, reset);
823
- },
824
-
825
- multiply: function(b) {
826
- return MOD3.Matrix4.mult(this, b);
827
- },
828
-
829
- multiplyVector: function(v) {
830
- MOD3.Matrix4.multXYZ(this, v.xyz);
831
- return v;
832
- }
833
- }, {
834
- multXYZ: function(m4, v) {
835
- var m = m4.m, x = v[0], y = v[1], z = v[2];
836
- v[0] = x*m[0 ] + y*m[1 ] + z*m[2 ] + m[3 ];
837
- v[1] = x*m[4 ] + y*m[5 ] + z*m[6 ] + m[7 ];
838
- v[2] = x*m[8 ] + y*m[9 ] + z*m[10] + m[11];
839
- return v;
840
- },
841
-
842
- mult: function(m1, m2) {
843
- var a = m1.m, b = m2.m,
844
- a11 = a[0 ], b11 = b[0 ],
845
- a21 = a[4 ], b21 = b[4 ],
846
- a31 = a[8 ], b31 = b[8 ],
847
- a12 = a[1 ], b12 = b[1 ],
848
- a22 = a[5 ], b22 = b[5 ],
849
- a32 = a[9 ], b32 = b[9 ],
850
- a13 = a[2 ], b13 = b[2 ],
851
- a23 = a[6 ], b23 = b[6 ],
852
- a33 = a[10], b33 = b[10],
853
- a14 = a[3 ], b14 = b[3 ],
854
- a24 = a[7 ], b24 = b[7 ],
855
- a34 = a[11], b34 = b[11];
856
-
857
- a[0 ] = a11*b11 + a12*b21 + a13*b31;
858
- a[1 ] = a11*b12 + a12*b22 + a13*b32;
859
- a[2 ] = a11*b13 + a12*b23 + a13*b33;
860
- a[3 ] = a11*b14 + a12*b24 + a13*b34 + a14;
861
-
862
- a[4 ] = a21*b11 + a22*b21 + a23*b31;
863
- a[5 ] = a21*b12 + a22*b22 + a23*b32;
864
- a[6 ] = a21*b13 + a22*b23 + a23*b33;
865
- a[7 ] = a21*b14 + a22*b24 + a23*b34 + a24;
866
-
867
- a[8 ] = a31*b11 + a32*b21 + a33*b31;
868
- a[9 ] = a31*b12 + a32*b22 + a33*b32;
869
- a[10] = a31*b13 + a32*b23 + a33*b33;
870
- a[11] = a31*b14 + a32*b24 + a33*b34 + a34;
871
- return m1;
872
- }
873
- });
874
- // aliases
875
- MOD3.Matrix4.prototype.translationMatrix = MOD3.Matrix4.prototype.translate;
876
- MOD3.Matrix4.prototype.scaleMatrix = MOD3.Matrix4.prototype.scale;
877
- MOD3.Matrix4.prototype.rotationMatrix = MOD3.Matrix4.prototype.rotate;
878
- MOD3.Matrix4.prototype.translationMatrixFromVector = MOD3.Matrix4.prototype.translateFromVector;
879
- MOD3.Matrix4.prototype.scaleMatrixFromVector = MOD3.Matrix4.prototype.scaleFromVector;
880
- MOD3.Matrix4.prototype.rotationMatrixFromVector = MOD3.Matrix4.prototype.rotateFromVector;
881
- // fast list utilities
882
- MOD3.List = {
883
- operate: function operate(x, F, F0, i0, i1, reverse) {
884
- var len = x.length;
885
- if (arguments.length < 5) i1 = len-1;
886
- if (0 > i1) i1 += len;
887
- if (arguments.length < 4) i0 = 0;
888
- if (i0 > i1) return F0;
889
- if (true === reverse)
890
- {
891
- var i, k, l=i1-i0+1, l1=l-1, r=l&15, q=r&1, lr=l1-r, Fv=q?F(F0,x[i1],i1):F0;
892
- for (i=l1-q; i>lr; i-=2) { k = i0+i; Fv = F(F(Fv,x[k],k),x[k-1],k-1); }
893
- for (i=lr; i>=0; i-=16) { k = i0+i; Fv = F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(Fv,x[k],k),x[k-1],k-1),x[k-2],k-2),x[k-3],k-3),x[k-4],k-4),x[k-5],k-5),x[k-6],k-6),x[k-7],k-7),x[k-8],k-8),x[k-9],k-9),x[k-10],k-10),x[k-11],k-11),x[k-12],k-12),x[k-13],k-13),x[k-14],k-14),x[k-15],k-15); }
894
- }
895
- else
896
- {
897
- var i, k, l=i1-i0+1, r=l&15, q=r&1, Fv=q?F(F0,x[i0],i0):F0;
898
- for (i=q; i<r; i+=2) { k = i0+i; Fv = F(F(Fv,x[k],k),x[k+1],k+1); }
899
- for (i=r; i<l; i+=16) { k = i0+i; Fv = F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(Fv,x[k],k),x[k+1],k+1),x[k+2],k+2),x[k+3],k+3),x[k+4],k+4),x[k+5],k+5),x[k+6],k+6),x[k+7],k+7),x[k+8],k+8),x[k+9],k+9),x[k+10],k+10),x[k+11],k+11),x[k+12],k+12),x[k+13],k+13),x[k+14],k+14),x[k+15],k+15); }
900
- }
901
- return Fv;
902
- }
903
-
904
- ,each: function each(x, F, i0, i1, reverse) {
905
- if (null == x || !x.length) return x;
906
- var len = x.length;
907
- if (arguments.length < 4) i1 = len-1;
908
- if (0 > i1) i1 += len;
909
- if (arguments.length < 3) i0 = 0;
910
- if (i0 > i1) return x;
911
- var i, k, l=i1-i0+1, l1, lr, r, q;
912
- if (true === reverse)
913
- {
914
- l1=l-1; r=l&15; q=r&1; lr=l1-r;
915
- if (q) F(x[i1]);
916
- for (i=l1-q; i>lr; i-=2)
917
- {
918
- k = i0+i;
919
- F(x[k ]);
920
- F(x[k-1]);
921
- }
922
- for (i=lr; i>=0; i-=16)
923
- {
924
- k = i0+i;
925
- F(x[k ] );
926
- F(x[k-1] );
927
- F(x[k-2] );
928
- F(x[k-3] );
929
- F(x[k-4] );
930
- F(x[k-5] );
931
- F(x[k-6] );
932
- F(x[k-7] );
933
- F(x[k-8] );
934
- F(x[k-9] );
935
- F(x[k-10]);
936
- F(x[k-11]);
937
- F(x[k-12]);
938
- F(x[k-13]);
939
- F(x[k-14]);
940
- F(x[k-15]);
941
- }
942
- }
943
- else
944
- {
945
- r=l&15; q=r&1;
946
- if (q) F(x[i0]);
947
- for (i=q; i<r; i+=2)
948
- {
949
- k = i0+i;
950
- F(x[k ]);
951
- F(x[k+1]);
952
- }
953
- for (i=r; i<l; i+=16)
954
- {
955
- k = i0+i;
956
- F(x[k ] );
957
- F(x[k+1] );
958
- F(x[k+2] );
959
- F(x[k+3] );
960
- F(x[k+4] );
961
- F(x[k+5] );
962
- F(x[k+6] );
963
- F(x[k+7] );
964
- F(x[k+8] );
965
- F(x[k+9] );
966
- F(x[k+10]);
967
- F(x[k+11]);
968
- F(x[k+12]);
969
- F(x[k+13]);
970
- F(x[k+14]);
971
- F(x[k+15]);
972
- }
973
- }
974
- return x;
975
- }
976
- };
977
- /**
978
- * MOD3 MeshProxy Super Class
979
- **/
980
- function dispose(o)
981
- {
982
- o.dispose();
983
- }
984
- function reset(o)
985
- {
986
- o.reset();
987
- }
988
- function collapse(o)
989
- {
990
- o.collapse();
991
- }
992
-
993
- MOD3.FaceProxy = MOD3.Class(null, {
994
- constructor: function FaceProxy() {
995
- this.vertices = [];
996
- },
997
-
998
- name: "FaceProxy",
999
- vertices: null,
1000
-
1001
- dispose: function() {
1002
- var self = this;
1003
- self.vertices = null;
1004
- return self;
1005
- },
1006
-
1007
- addVertex: function(v) {
1008
- this.vertices.push(v);
1009
- },
1010
-
1011
- getVertices: function() {
1012
- return this.vertices;
1013
- }
1014
- });
1015
-
1016
- MOD3.VertexProxy = MOD3.Class(null, {
1017
- constructor: function VertexProxy(vertex, mesh) {
1018
- var self = this;
1019
- self.mesh = mesh || null;
1020
- // use internal typed-arrays for speed
1021
- self.original = new MOD3.VecArray([0,0,0]);
1022
- self.ratio = new MOD3.VecArray([0,0,0]);
1023
- // vertex can be zero
1024
- if (null != vertex) self.setVertex(vertex);
1025
- },
1026
-
1027
- name: "VertexProxy",
1028
- mesh: null,
1029
- vertex: null,
1030
- original: null,
1031
- ratio: null,
1032
-
1033
- dispose: function() {
1034
- var self = this;
1035
- self.mesh = null;
1036
- self.vertex = null;
1037
- self.original = null;
1038
- self.ratio = null;
1039
- return self;
1040
- },
1041
-
1042
- setVertex: function(vt) {
1043
- // override
1044
- var self = this;
1045
- self.vertex = vt;
1046
- return self;
1047
- },
1048
-
1049
- getRatioVector: function() {
1050
- var r = this.ratio, rv = new MOD3.VecArray(3);
1051
- rv[0] = r[0]; rv[1] = r[1]; rv[2] = r[2];
1052
- return rv;
1053
- },
1054
-
1055
- getRatio: function(axis) {
1056
- return this.ratio[MOD3.XYZi[axis]] || 0;
1057
- },
1058
-
1059
- setRatios: function(rx, ry, rz) {
1060
- var r = this.ratio;
1061
- r[0] = rx || 0;
1062
- r[1] = ry || 0;
1063
- r[2] = rz || 0;
1064
- return this;
1065
- },
1066
-
1067
- getOriginalValue: function(axis) {
1068
- return this.original[MOD3.XYZi[axis]] || 0;
1069
- },
1070
-
1071
- setOriginalPosition: function(ox, oy, oz) {
1072
- var o = this.original;
1073
- o[0] = ox || 0;
1074
- o[1] = oy || 0;
1075
- o[2] = oz || 0;
1076
- return this;
1077
- },
1078
-
1079
- getXYZ: function() {
1080
- // override
1081
- return new MOD3.VecArray([0,0,0]);
1082
- },
1083
-
1084
- getX: function() {
1085
- // override
1086
- return 0;
1087
- },
1088
-
1089
- getY: function() {
1090
- // override
1091
- return 0;
1092
- },
1093
-
1094
- getZ: function() {
1095
- // override
1096
- return 0;
1097
- },
1098
-
1099
- getValue: function(axis) {
1100
- var self = this;
1101
- // override
1102
- return MOD3.ModConstant.X === axis
1103
- ? self.getX()
1104
- : (MOD3.ModConstant.Y === axis
1105
- ? self.getY()
1106
- : (MOD3.ModConstant.Z === axis
1107
- ? self.getZ()
1108
- : 0))
1109
- ;
1110
- },
1111
-
1112
- setXYZ: function(xyz) {
1113
- // override
1114
- return this;
1115
- },
1116
-
1117
- setX: function(vo) {
1118
- // override
1119
- return this;
1120
- },
1121
-
1122
- setY: function(vo) {
1123
- // override
1124
- return this;
1125
- },
1126
-
1127
- setZ: function(vo) {
1128
- // override
1129
- return this;
1130
- },
1131
-
1132
- setValue: function(axis, vo) {
1133
- var self = this;
1134
- // override
1135
- if (MOD3.ModConstant.X === axis) self.setX(vo);
1136
- else if (MOD3.ModConstant.Y === axis) self.setY(vo);
1137
- else if (MOD3.ModConstant.Z === axis) self.setZ(vo);
1138
- return self;
1139
- },
1140
-
1141
- reset: function() {
1142
- // override
1143
- var self = this;
1144
- self.setXYZ(self.original);
1145
- return self;
1146
- },
1147
-
1148
- collapse: function() {
1149
- // override
1150
- var self = this, xyz = self.getXYZ(), o = self.original;
1151
- o[0] = xyz[0]; o[1] = xyz[1]; o[2] = xyz[2];
1152
- return self;
1153
- }
1154
- });
1155
-
1156
- MOD3.MeshProxy = MOD3.Class(null, {
1157
- constructor: function MeshProxy(mesh) {
1158
- var self = this;
1159
- self.maxX = 0;
1160
- self.maxY = 0;
1161
- self.maxZ = 0;
1162
-
1163
- self.minX = 0;
1164
- self.minY = 0;
1165
- self.minZ = 0;
1166
-
1167
- self.maxAxis = 0;
1168
- self.midAxis = 0;
1169
- self.minAxis = 0;
1170
-
1171
- self.width = 0;
1172
- self.height = 0;
1173
- self.depth = 0;
1174
-
1175
- self.vertices = null;
1176
- self.faces = null;
1177
- self.mesh = null;
1178
-
1179
- if (null != mesh) self.setMesh(mesh);
1180
- },
1181
-
1182
- name: "MeshProxy",
1183
-
1184
- maxX: 0,
1185
- maxY: 0,
1186
- maxZ: 0,
1187
- minX: 0,
1188
- minY: 0,
1189
- minZ: 0,
1190
-
1191
- maxAxis: 0,
1192
- midAxis: 0,
1193
- minAxis: 0,
1194
-
1195
- width: 0,
1196
- height: 0,
1197
- depth: 0,
1198
-
1199
- vertices : null,
1200
- faces : null,
1201
- mesh : null,
1202
- v: null,
1203
-
1204
- dispose: function() {
1205
- var self = this;
1206
- self.maxX = null;
1207
- self.maxY = null;
1208
- self.maxZ = null;
1209
- self.minX = null;
1210
- self.minY = null;
1211
- self.minZ = null;
1212
-
1213
- self.maxAxis = null;
1214
- self.midAxis = null;
1215
- self.minAxis = null;
1216
-
1217
- self.width = null;
1218
- self.height = null;
1219
- self.depth = null;
1220
-
1221
- self.disposeFaces();
1222
- self.disposeVertices();
1223
- self.mesh = null;
1224
- self.v = null;
1225
- return self;
1226
- },
1227
-
1228
- disposeVertices: function() {
1229
- var self = this;
1230
- if (self.vertices) MOD3.List.each(self.vertices, dispose);
1231
- self.vertices = null;
1232
- return self;
1233
- },
1234
-
1235
- disposeFaces: function() {
1236
- var self = this;
1237
- if (self.faces) MOD3.List.each(self.faces, dispose);
1238
- self.faces = null;
1239
- return self;
1240
- },
1241
-
1242
- init: function(mesh) {
1243
- var self = this;
1244
- self.mesh = mesh;
1245
- //self.vertices = [];
1246
- // not used
1247
- //self.faces = [];
1248
- return self;
1249
- },
1250
-
1251
- setMesh: function(mesh) {
1252
- var self = this;
1253
- self.init(mesh);
1254
- self.preApply();
1255
- self.analyzeGeometry()
1256
- self.postApply();
1257
- return self;
1258
- },
1259
-
1260
- getVertices: function() {
1261
- return this.vertices;
1262
- },
1263
-
1264
- getFaces: function() {
1265
- return this.faces;
1266
- },
1267
-
1268
- applyModifiers: function(modStack) {
1269
- var self = this, sl, i;
1270
- for (i=0,sl=modStack.length; i<sl; ++i)
1271
- {
1272
- modStack[i].enabled && modStack[i].apply(self);
1273
- }
1274
- return self;
1275
- },
1276
-
1277
- analyzeGeometry: function() {
1278
- var self = this,
1279
- vertices = self.vertices,
1280
- minX = 0, minY = 0, minZ = 0,
1281
- maxX = 0, maxY = 0, maxZ = 0,
1282
- width = 0, height = 0, depth = 0,
1283
- maxe, mine, w
1284
- ;
1285
- if (!vertices || !vertices.length) return self;
1286
-
1287
- w = vertices[0].getXYZ();
1288
- minX = w[0];
1289
- minY = w[1];
1290
- minZ = w[2];
1291
-
1292
- maxX = w[0];
1293
- maxY = w[1];
1294
- maxZ = w[2];
1295
-
1296
- MOD3.List.each(vertices, function(v) {
1297
- var xyz = v.getXYZ(), x = xyz[0], y = xyz[1], z = xyz[2];
1298
- minX = stdMath.min(minX, x);
1299
- minY = stdMath.min(minY, y);
1300
- minZ = stdMath.min(minZ, z);
1301
-
1302
- maxX = stdMath.max(maxX, x);
1303
- maxY = stdMath.max(maxY, y);
1304
- maxZ = stdMath.max(maxZ, z);
1305
- v.setOriginalPosition(x, y, z);
1306
- });
1307
-
1308
- width = maxX - minX;
1309
- height = maxY - minY;
1310
- depth = maxZ - minZ;
1311
-
1312
- self.width = width;
1313
- self.height = height;
1314
- self.depth = depth;
1315
- self.minX = minX;
1316
- self.maxX = maxX;
1317
- self.minY = minY;
1318
- self.maxY = maxY;
1319
- self.minZ = minZ;
1320
- self.maxZ = maxZ;
1321
-
1322
- maxe = stdMath.max(width, height, depth);
1323
- mine = stdMath.min(width, height, depth);
1324
-
1325
- if ((maxe === width) && (mine === height))
1326
- {
1327
- self.minAxis = MOD3.ModConstant.Y;
1328
- self.midAxis = MOD3.ModConstant.Z;
1329
- self.maxAxis = MOD3.ModConstant.X;
1330
- }
1331
- else if ((maxe === width) && (mine === depth))
1332
- {
1333
- self.minAxis = MOD3.ModConstant.Z;
1334
- self.midAxis = MOD3.ModConstant.Y;
1335
- self.maxAxis = MOD3.ModConstant.X;
1336
- }
1337
- else if ((maxe === height) && (mine === width))
1338
- {
1339
- self.minAxis = MOD3.ModConstant.X;
1340
- self.midAxis = MOD3.ModConstant.Z;
1341
- self.maxAxis = MOD3.ModConstant.Y;
1342
- }
1343
- else if ((maxe === height) && (mine === depth))
1344
- {
1345
- self.minAxis = MOD3.ModConstant.Z;
1346
- self.midAxis = MOD3.ModConstant.X;
1347
- self.maxAxis = MOD3.ModConstant.Y;
1348
- }
1349
- else if ((maxe === depth) && (mine === width))
1350
- {
1351
- self.minAxis = MOD3.ModConstant.X;
1352
- self.midAxis = MOD3.ModConstant.Y;
1353
- self.maxAxis = MOD3.ModConstant.Z;
1354
- }
1355
- else if ((maxe === depth) && (mine === height))
1356
- {
1357
- self.minAxis = MOD3.ModConstant.Y;
1358
- self.midAxis = MOD3.ModConstant.X;
1359
- self.maxAxis = MOD3.ModConstant.Z;
1360
- }
1361
-
1362
- MOD3.List.each(vertices, function(v) {
1363
- var xyz = v.getXYZ();
1364
- v.setRatios(width > 0 ? (xyz[0] - minX) / width : 0, height > 0 ? (xyz[1] - minY) / height : 0, depth > 0 ? (xyz[2] - minZ) / depth : 0);
1365
- });
1366
- return self;
1367
- },
1368
-
1369
- resetGeometry: function() {
1370
- var self = this;
1371
- MOD3.List.each(self.vertices, reset);
1372
- return self;
1373
- },
1374
-
1375
- collapseGeometry: function() {
1376
- var self = this;
1377
- MOD3.List.each(self.vertices, collapse);
1378
- self.analyzeGeometry();
1379
- return self;
1380
- },
1381
-
1382
- getMin: function(axis) {
1383
- var self = this;
1384
- return MOD3.ModConstant.X === axis
1385
- ? self.minX
1386
- : (MOD3.ModConstant.Y === axis
1387
- ? self.minY
1388
- : (MOD3.ModConstant.Z === axis
1389
- ? self.minZ
1390
- : -1))
1391
- ;
1392
- },
1393
-
1394
- getMax: function(axis) {
1395
- var self = this;
1396
- return MOD3.ModConstant.X === axis
1397
- ? self.maxX
1398
- : (MOD3.ModConstant.Y === axis
1399
- ? self.maxY
1400
- : (MOD3.ModConstant.Z === axis
1401
- ? self.maxZ
1402
- : -1))
1403
- ;
1404
- },
1405
-
1406
- getSize: function(axis) {
1407
- var self = this;
1408
- return MOD3.ModConstant.X === axis
1409
- ? self.width
1410
- : (MOD3.ModConstant.Y === axis
1411
- ? self.height
1412
- : (MOD3.ModConstant.Z === axis
1413
- ? self.depth
1414
- : -1))
1415
- ;
1416
- },
1417
-
1418
- update: function() {
1419
- // do nothing
1420
- return this;
1421
- },
1422
-
1423
- preApply: function() {
1424
- // do nothing
1425
- return this;
1426
- },
1427
-
1428
- postApply: function() {
1429
- // do nothing
1430
- return this;
1431
- },
1432
-
1433
- updateMeshPosition: function(p) {
1434
- // do nothing
1435
- return this;
1436
- }
1437
- });
1438
-
1439
- MOD3.Library3d = {
1440
- id : "Library3d",
1441
- Mesh : MOD3.MeshProxy,
1442
- Vertex : MOD3.VertexProxy
1443
- };
1444
-
1445
- MOD3.Factory = {
1446
- getLibrary: function(json) {
1447
- if (json && json.library && MOD3[json.library]) return MOD3[json.library];
1448
- // dummy, default
1449
- return MOD3.Library3d;
1450
- }
1451
-
1452
- ,getMeshProxy: function(lib3D) {
1453
- if (arguments.length) return lib3D.Mesh ? new lib3D.Mesh() : null;
1454
- return null;
1455
- }
1456
-
1457
- ,getModifier: function(json) {
1458
- if (json && json.modifier && MOD3[json.modifier]) return new MOD3[json.modifier]();
1459
- return null;
1460
- }
1461
-
1462
- /*
1463
- ,getMesh: function(json) {
1464
- if (json && json.mesh && MOD3[json.mesh] ) return new MOD3.MeshProxy().unserialize(json);
1465
- // dummy, default
1466
- return new MOD3.MeshProxy();
1467
- }
1468
-
1469
- ,getVertex: function(json) {
1470
- if (json && json.vertex && MOD3[json.vertex]) return new MOD3.VertexProxy().unserialize(json);
1471
- // dummy, default
1472
- return new MOD3.VertexProxy();
1473
- }*/
1474
- };
1475
- /**
1476
- * MOD3 Modifier & ModifierStack Classes
1477
- **/
1478
- var _modCount = 0;
1479
-
1480
- MOD3.Modifier = MOD3.Class({
1481
- constructor: function Modifier() {
1482
- var self = this;
1483
- self.id = ++_modCount;
1484
- self.name = 'Modifier';
1485
- self.axes = MOD3.ModConstant.NONE;
1486
- self.constraint = MOD3.ModConstant.NONE;
1487
- self.enabled = true;
1488
- },
1489
-
1490
- id: null,
1491
- name: 'Modifier',
1492
- axes: null,
1493
- constraint: null,
1494
- enabled: true,
1495
-
1496
- dispose: function() {
1497
- var self = this;
1498
- self.name = null;
1499
- self.axes = null;
1500
- self.constraint = null;
1501
- return self;
1502
- },
1503
-
1504
- enable: function(enabled) {
1505
- if (arguments.length)
1506
- {
1507
- this.enabled = !!enabled;
1508
- return this;
1509
- }
1510
- return this.enabled;
1511
- },
1512
-
1513
- constraintAxes: function(axes) {
1514
- this.axes = axes || MOD3.ModConstant.NONE;
1515
- return this;
1516
- },
1517
-
1518
- setConstraint: function(c) {
1519
- this.constraint = c || MOD3.ModConstant.NONE;
1520
- return this;
1521
- },
1522
-
1523
- // override
1524
- apply: function(modifiable) {
1525
- return this;
1526
- },
1527
-
1528
- toString: function() {
1529
- return '[Modifier '+this.name+']';
1530
- }
1531
- });
1532
-
1533
- MOD3.ModifierStack = MOD3.Class({
1534
- constructor: function ModifierStack(lib3d, mesh) {
1535
- var self = this;
1536
- if (!(self instanceof ModifierStack)) return new ModifierStack(lib3d, mesh);
1537
- self.stack = [];
1538
- self.setModifiable(MOD3.Factory.getMeshProxy(lib3d), mesh);
1539
- },
1540
-
1541
- name: "ModifierStack",
1542
- modifiable: null,
1543
- stack: null,
1544
-
1545
- dispose: function(withModifiers) {
1546
- var self = this;
1547
- if (withModifiers && self.stack) while (self.stack.length) self.stack.pop().dispose();
1548
- if (self.modifiable) self.modifiable.dispose();
1549
- self.stack = null;
1550
- self.modifiable = null;
1551
- return self;
1552
- },
1553
-
1554
- getModifiable: function() {
1555
- return this.modifiable;
1556
- },
1557
-
1558
- setModifiable: function(modifiable, mesh) {
1559
- var self = this;
1560
- self.modifiable = modifiable;
1561
- if (mesh) self.modifiable.setMesh(mesh);
1562
- return self;
1563
- },
1564
-
1565
- add: function(modifier) {
1566
- var self = this;
1567
- if (modifier) self.stack.push(modifier);
1568
- return self;
1569
- },
1570
-
1571
- apply: function() {
1572
- var self = this, modifiable = self.modifiable, stack = self.stack;
1573
- if (modifiable && stack && stack.length)
1574
- modifiable
1575
- .preApply()
1576
- .resetGeometry()
1577
- .applyModifiers(stack)
1578
- .postApply()
1579
- .update()
1580
- ;
1581
- return self;
1582
- },
1583
-
1584
- collapse: function() {
1585
- var self = this, modifiable = self.modifiable, stack = self.stack;
1586
- if (modifiable && stack && stack.length)
1587
- {
1588
- modifiable
1589
- .preApply()
1590
- .resetGeometry()
1591
- .applyModifiers(stack)
1592
- .collapseGeometry()
1593
- .postApply()
1594
- .update()
1595
- ;
1596
- stack.length = 0;
1597
- }
1598
- return self;
1599
- },
1600
-
1601
- clear: function() {
1602
- var self = this;
1603
- if (self.stack) self.stack.length = 0;
1604
- return self;
1605
- }
1606
- });
1607
- // aliases
1608
- MOD3.ModifierStack.prototype.getMeshInfo = MOD3.ModifierStack.prototype.getModifiable;
1609
- MOD3.ModifierStack.prototype.addModifier = MOD3.ModifierStack.prototype.add;
1610
- !function(MOD3) {
1611
- "use strict";
1612
- /**
1613
- * MOD3 Pivot Modifier
1614
- **/
1615
-
1616
- /**[DOC_MD]
1617
- * ### Pivot modifier
1618
- *
1619
- * Allows to move the pivot point of a 3D mesh.
1620
- *
1621
- * @author Bartek Drozdz
1622
- *
1623
- [/DOC_MD]**/
1624
- MOD3.Pivot = MOD3.Class(MOD3.Modifier, {
1625
- constructor: function Pivot(x, y, z) {
1626
- var self = this;
1627
- if (!(self instanceof Pivot)) return new Pivot(x, y, z);
1628
- self.$super('constructor');
1629
- self.name = 'Pivot';
1630
- self.vector = new MOD3.Vector3(x||0, y||0, z||0);
1631
- },
1632
-
1633
- vector: null,
1634
-
1635
- dispose: function() {
1636
- var self = this;
1637
- self.vector.dispose();
1638
- self.vector = null;
1639
- self.$super('dispose');
1640
- return self;
1641
- },
1642
-
1643
- setMeshCenter: function(modifiable) {
1644
- var self = this;
1645
- self.vector = new MOD3.Vector3(
1646
- -(modifiable.minX + 0.5*modifiable.width),
1647
- -(modifiable.minY + 0.5*modifiable.height),
1648
- -(modifiable.minZ + 0.5*modifiable.depth)
1649
- );
1650
- return self;
1651
- },
1652
-
1653
- apply: function(modifiable) {
1654
- var self = this, pivot = self.vector, pv = pivot.xyz;
1655
-
1656
- MOD3.List.each(modifiable.vertices, function(v) {
1657
- v.setXYZ(MOD3.Vector3.add(v.getXYZ(), pv));
1658
- });
1659
- modifiable.updateMeshPosition(pivot.negate());
1660
- return self;
1661
- }
1662
- });
1663
- }(MOD3);!function(MOD3) {
1664
- "use strict";
1665
- /**
1666
- * MOD3 Bend Modifier
1667
- **/
1668
-
1669
- /**[DOC_MD]
1670
- * ### Bend modifier
1671
- *
1672
- * Bends an object along an axis.
1673
- *
1674
- * @author Bartek Drozdz
1675
- *
1676
- [/DOC_MD]**/
1677
- var stdMath = Math, PI = stdMath.PI,
1678
- TWO_PI = 2*PI, HALF_PI = PI/2;
1679
-
1680
- MOD3.Bend = MOD3.Class(MOD3.Modifier, {
1681
- constructor: function Bend(force, offset, angle) {
1682
- var self = this;
1683
- if (!(self instanceof Bend)) return new Bend(force, offset, angle);
1684
- self.$super('constructor');
1685
- self.name = 'Bend';
1686
- self.constraint = MOD3.ModConstant.NONE;
1687
- self.switchAxes = false;
1688
- self.force = force || 0;
1689
- self.offset = offset || 0;
1690
- self.angle = angle || 0;
1691
- },
1692
-
1693
- force: 0,
1694
- offset: 0,
1695
- angle: 0,
1696
- switchAxes: false,
1697
-
1698
- dispose: function() {
1699
- var self = this;
1700
- self.force = null;
1701
- self.offset = null;
1702
- self.angle = null;
1703
- self.switchAxes = null;
1704
- self.$super('dispose');
1705
- return self;
1706
- },
1707
-
1708
- apply: function(modifiable) {
1709
- var self = this;
1710
-
1711
- if (0 === self.force) return self;
1712
-
1713
- var constraint = self.constraint, switchAxes = self.switchAxes,
1714
- force = self.force, offset = stdMath.min(1, stdMath.max(0, self.offset)), a = self.angle,
1715
- max = switchAxes ? modifiable.midAxis : modifiable.maxAxis,
1716
- min = modifiable.minAxis,
1717
- mid = switchAxes ? modifiable.maxAxis : modifiable.midAxis,
1718
- width = modifiable.getSize(max),
1719
- height = modifiable.getSize(mid),
1720
- origin = modifiable.getMin(max),
1721
- //diagAngle = stdMath.atan2(height, width),
1722
- m1 = new MOD3.Matrix().rotate(a),
1723
- m2 = new MOD3.Matrix().rotate(-a),
1724
- distance = origin + width * offset,
1725
- radius = width / PI / force,
1726
- bendAngle = TWO_PI * (width / (radius * TWO_PI))
1727
- ;
1728
-
1729
- MOD3.List.each(modifiable.vertices, function(v) {
1730
- var xyz = v.getXYZ(),
1731
- vmax = xyz[MOD3.XYZi[max]],
1732
- vmid = xyz[MOD3.XYZi[mid]],
1733
- vmin = xyz[MOD3.XYZi[min]],
1734
- np = MOD3.Matrix.transform(m1, [vmax, vmid]),
1735
- p, fa, op, ow, np2
1736
- ;
1737
- vmax = np[0]; vmid = np[1];
1738
-
1739
- p = (vmax - origin) / width;
1740
-
1741
- if (
1742
- ((MOD3.ModConstant.LEFT === constraint) && (p <= offset)) ||
1743
- ((MOD3.ModConstant.RIGHT === constraint) && (p >= offset))
1744
- )
1745
- {
1746
- /* do nothing */
1747
- }
1748
- else
1749
- {
1750
- fa = (HALF_PI - bendAngle * offset) + (bendAngle * p);
1751
- op = stdMath.sin(fa) * (radius + vmin);
1752
- ow = stdMath.cos(fa) * (radius + vmin);
1753
- vmin = op - radius;
1754
- vmax = distance - ow;
1755
- }
1756
-
1757
- np2 = MOD3.Matrix.transform(m2, [vmax, vmid]);
1758
- vmax = np2[0]; vmid = np2[1];
1759
- xyz[MOD3.XYZi[max]] = vmax;
1760
- xyz[MOD3.XYZi[mid]] = vmid;
1761
- xyz[MOD3.XYZi[min]] = vmin;
1762
- v.setXYZ(xyz);
1763
- });
1764
- return self;
1765
- }
1766
- });
1767
- }(MOD3);!function(MOD3) {
1768
- "use strict";
1769
- /**
1770
- * MOD3 Bloat Modifier
1771
- **/
1772
-
1773
- /**[DOC_MD]
1774
- * ### Bloat modifier
1775
- *
1776
- * Bloats a mesh by forcing vertices out of specified sphere
1777
- *
1778
- * @author makc
1779
- *
1780
- [/DOC_MD]**/
1781
- var stdMath = Math;
1782
-
1783
- MOD3.Bloat = MOD3.Class(MOD3.Modifier, {
1784
- constructor: function Bloat(radius, a, center) {
1785
- var self = this;
1786
- if (!(self instanceof Bloat)) return new Bloat(radius, a, center);
1787
- self.$super('constructor');
1788
- self.name = 'Bloat';
1789
- self.radius = radius || 0;
1790
- self.a = null == a ? 0.01 : a;
1791
- self.center = center || MOD3.Vector3.ZERO();
1792
- //self.u = MOD3.Vector3.ZERO();
1793
- },
1794
-
1795
- radius: 0,
1796
- a: 0.01,
1797
- center: null,
1798
- //u: null,
1799
-
1800
- dispose: function() {
1801
- var self = this;
1802
- self.center.dispose();
1803
- self.center = null;
1804
- self.radius = null;
1805
- self.a = null;
1806
- self.$super('dispose');
1807
- return self;
1808
- },
1809
-
1810
- apply: function(modifiable) {
1811
- var self = this, center = self.center.xyz,
1812
- radius = stdMath.max(0, self.radius), a = stdMath.max(0, self.a);
1813
-
1814
- MOD3.List.each(modifiable.vertices, function(v) {
1815
- // get a vector towards vertex
1816
- // change norm to norm + r * exp (-a * norm)
1817
- var uu = MOD3.Vector3.sub(v.getXYZ(), center), magn = MOD3.Vector3.mod(uu);
1818
- MOD3.Vector3.muls(MOD3.Vector3.norm(uu), magn + radius * stdMath.exp(- magn * a));
1819
- // move vertex accordingly
1820
- v.setXYZ(MOD3.Vector3.add(uu, center));
1821
- // ?? needed??
1822
- //self.u=uu;
1823
- });
1824
- return self;
1825
- }
1826
- });
1827
- }(MOD3);!function(MOD3) {
1828
- "use strict";
1829
- /**
1830
- * MOD3 Twist Modifier
1831
- **/
1832
-
1833
- /**[DOC_MD]
1834
- * ### Twist modifier
1835
- *
1836
- * Twist mesh along an axis
1837
- * Adapted from the Twist modifier for PV3D
1838
- *
1839
- [/DOC_MD]**/
1840
- MOD3.Twist = MOD3.Class(MOD3.Modifier, {
1841
- constructor: function Twist(angle, vector, center) {
1842
- var self = this;
1843
- if (!(self instanceof Twist)) return new Twist(angle, vector, center);
1844
- self.$super('constructor');
1845
- self.name = 'Twist';
1846
- self.angle = angle || 0;
1847
- self.vector = vector || MOD3.Vector3.Y();
1848
- self.center = center || MOD3.Vector3.ZERO();
1849
- },
1850
-
1851
- angle: 0,
1852
- vector: null,
1853
- center: null,
1854
-
1855
- dispose: function() {
1856
- var self = this;
1857
- self.vector.dispose();
1858
- self.vector = null;
1859
- self.angle = null;
1860
- self.center.dispose();
1861
- self.center = null;
1862
- self.$super('dispose');
1863
- return self;
1864
- },
1865
-
1866
- apply: function(modifiable) {
1867
- var self = this,
1868
- tvec = self.vector.normalizeSelf().xyz, angle = self.angle, center = self.center.xyz,
1869
- modulo = MOD3.Vector3.mod([0.5*modifiable.maxX, 0.5*modifiable.maxY, 0.5*modifiable.maxZ]),
1870
- d = -MOD3.Vector3.dot(tvec, center),
1871
- m1 = new MOD3.Matrix4(), m2 = new MOD3.Matrix4()
1872
- ;
1873
-
1874
- MOD3.List.each(modifiable.vertices, function(v) {
1875
- var xyz = v.getXYZ(),
1876
- a = (MOD3.Vector3.dot(xyz, tvec) + d) * angle / modulo,
1877
- m = MOD3.Matrix4.mult(
1878
- m2.rotate(tvec[0], tvec[1], tvec[2], a, true),
1879
- m1.translate(xyz[0], xyz[1], xyz[2], true)
1880
- )
1881
- ;
1882
- v.setXYZ([m.m[3], m.m[7], m.m[11]]);
1883
- });
1884
- return self;
1885
- }
1886
- });
1887
- }(MOD3);!function(MOD3) {
1888
- "use strict";
1889
- /**
1890
- * MOD3 Skew Modifier
1891
- **/
1892
-
1893
- /**[DOC_MD]
1894
- * ### Skew modifier
1895
- *
1896
- * Skew mesh along an axis
1897
- *
1898
- * @author Bartek Drozdz
1899
- *
1900
- [/DOC_MD]**/
1901
- var stdMath = Math;
1902
-
1903
- MOD3.Skew = MOD3.Class(MOD3.Modifier, {
1904
- constructor: function Skew(force, offset, power, falloff) {
1905
- var self = this;
1906
- if (!(self instanceof Skew)) return new Skew(force, offset, power, falloff);
1907
- self.$super('constructor');
1908
- self.name = 'Skew';
1909
- self.constraint = MOD3.ModConstant.NONE;
1910
- self.force = force != null ? force : 0;
1911
- self.offset = offset != null ? offset : 0.5;
1912
- self.power = power != null ? power : 1;
1913
- self.falloff = falloff != null ? falloff : 1;
1914
- self.inverseFalloff = false;
1915
- self.oneSide = false;
1916
- self.swapAxes = false;
1917
- self.skewAxis = 0;
1918
- },
1919
-
1920
- force: 0,
1921
- skewAxis: 0,
1922
- offset: 0.5,
1923
- power: 1,
1924
- falloff: 1,
1925
- inverseFalloff: false,
1926
- oneSide: false,
1927
- swapAxes: false,
1928
-
1929
- dispose: function() {
1930
- var self = this;
1931
- self.force = null;
1932
- self.skewAxis = null;
1933
- self.offset = null;
1934
- self.power = null;
1935
- self.falloff = null;
1936
- self.inverseFalloff = null;
1937
- self.oneSide = null;
1938
- self.swapAxes = null;
1939
- self.$super('dispose');
1940
- return self;
1941
- },
1942
-
1943
- apply: function(modifiable) {
1944
- var self = this,
1945
- constraint = self.constraint,
1946
- skewAxis = self.skewAxis || modifiable.maxAxis,
1947
- swapAxes = self.swapAxes,
1948
- offset = stdMath.min(1, stdMath.max(0, self.offset)),
1949
- oneSide = self.oneSide,
1950
- inverseFalloff = !!self.inverseFalloff,
1951
- falloff = stdMath.min(1, stdMath.max(0, self.falloff)),
1952
- mirrorfalloff = 1-falloff,
1953
- power = self.power,
1954
- force = self.force,
1955
- displaceAxis = MOD3.ModConstant.X === skewAxis
1956
- ? (swapAxes ? MOD3.ModConstant.Z : MOD3.ModConstant.Y)
1957
- : (MOD3.ModConstant.Y === skewAxis
1958
- ? (swapAxes ? MOD3.ModConstant.Z : MOD3.ModConstant.X)
1959
- : (MOD3.ModConstant.Z === skewAxis
1960
- ? (swapAxes ? MOD3.ModConstant.Y : MOD3.ModConstant.X)
1961
- : 0))
1962
- ;
1963
-
1964
- MOD3.List.each(modifiable.vertices, function(v) {
1965
- var r, dr, f, p, vRatio;
1966
- vRatio = v.getRatio(skewAxis);
1967
- if ((MOD3.ModConstant.LEFT === constraint) && (vRatio <= offset)) return;
1968
- if ((MOD3.ModConstant.RIGHT === constraint) && (vRatio > offset)) return;
1969
-
1970
- r = vRatio - offset;
1971
- if (oneSide && (0 > r)) r = -r;
1972
-
1973
- dr = v.getRatio(displaceAxis);
1974
- if (inverseFalloff) dr = 1 - dr;
1975
-
1976
- f = falloff + dr * mirrorfalloff;
1977
- p = (0 > r ? -1 : 1) * stdMath.pow(stdMath.abs(r), power);
1978
- v.setValue(displaceAxis, v.getValue(displaceAxis) + force * p * f);
1979
- });
1980
- return self;
1981
- },
1982
- });
1983
- }(MOD3);!function(MOD3) {
1984
- "use strict";
1985
- /**
1986
- * MOD3 Taper Modifier
1987
- **/
1988
-
1989
- /**[DOC_MD]
1990
- * ### Taper modifier
1991
- *
1992
- * The taper modifier displaces the vertices on two axes proportionally to their position on the third axis.
1993
- *
1994
- * @author Bartek Drozdz
1995
- *
1996
- [/DOC_MD]**/
1997
- var stdMath = Math;
1998
-
1999
- MOD3.Taper = MOD3.Class(MOD3.Modifier, {
2000
- constructor: function Taper(force, power, v1, v2) {
2001
- var self = this;
2002
- if (!(self instanceof Taper)) return new Taper(force, power, v1, v2);
2003
- self.$super('constructor');
2004
- self.name = 'Taper';
2005
- /*self.start = 0;
2006
- self.end = 1;*/
2007
- self.force = force != null ? force : 0;
2008
- self.power = power != null ? power : 1;
2009
- self.vector = v1 || MOD3.Vector3.Y(false);
2010
- self.vector2 = v2 || MOD3.Vector3.Y();
2011
- },
2012
-
2013
- force: 0,
2014
- power: 1,
2015
- /*start: 0,
2016
- end: 1,*/
2017
- vector: null,
2018
- vector2: null,
2019
-
2020
- /*setFalloff : function(start, end) {
2021
- this.start = (start!==undef) ? start : 0;
2022
- this.end = (end!==undef) ? end : 1;
2023
-
2024
- return this;
2025
- },*/
2026
-
2027
- dispose: function() {
2028
- var self = this;
2029
- self.vector.dispose();
2030
- self.vector2.dispose();
2031
- self.vector = null;
2032
- self.vector2 = null;
2033
- self.force = null;
2034
- self.power = null;
2035
- self.$super('dispose');
2036
- return self;
2037
- },
2038
-
2039
- apply: function(modifiable) {
2040
- var self = this,
2041
- vec = self.vector.xyz, vec2 = self.vector2.xyz,
2042
- force = self.force, power = self.power, m = new MOD3.Matrix4();
2043
-
2044
- MOD3.List.each(modifiable.vertices, 1 !== power
2045
- ? function(v) {
2046
- var ar = MOD3.Vector3.mod(MOD3.Vector3.mul(v.getRatioVector(), vec2)), sc = force * stdMath.pow(ar, power);
2047
- v.setXYZ(MOD3.Matrix4.multXYZ(m.scale(1 + sc * vec[0], 1 + sc * vec[1], 1 + sc * vec[2]), v.getXYZ()));
2048
- }
2049
- : function(v) {
2050
- var ar = MOD3.Vector3.mod(MOD3.Vector3.mul(v.getRatioVector(), vec2)), sc = force * ar;
2051
- v.setXYZ(MOD3.Matrix4.multXYZ(m.scale(1 + sc * vec[0], 1 + sc * vec[1], 1 + sc * vec[2]), v.getXYZ()));
2052
- }
2053
- );
2054
- return self;
2055
- }
2056
- });
2057
- }(MOD3);!function(MOD3) {
2058
- "use strict";
2059
- /**
2060
- * MOD3 Wheel Modifier
2061
- **/
2062
-
2063
- /**[DOC_MD]
2064
- * ### Wheel modifier
2065
- *
2066
- * Use it with vehicle models for wheels.
2067
- *
2068
- * The usual problem with a 3d wheel in a vahicle is that it is
2069
- * supposed to turn (steer) and roll in the same time.
2070
- * So, this code:
2071
- *
2072
- * ```javascript
2073
- * wheel.rotationY = 10; // Steer 10deg to the left
2074
- * wheel.rotationZ += 5; // Roll with a speed of 5
2075
- * ```
2076
- * This will make the wheel roll incorectly.
2077
- *
2078
- * A usual way to solve this problem is to put the wheel in another DisplayObject3D/Mesh,
2079
- * turn the parent and roll the child, like that:
2080
- * ```javascript
2081
- * steer.rotationY = 10; // Steer 10deg to the left
2082
- * steer.wheel.rotationZ += 5; // Roll with a speed of 5
2083
- * ```
2084
- * That will make the wheel behave correctly. But it can be uncomfortanble to apply, especially
2085
- * to imported complex Collada models.
2086
- *
2087
- * The Wheel modifier elegantly solves this problem by doind the proper math in order to steer and roll
2088
- * a single mesh at the same time. The only thing you need to do is to specify a steer vector and
2089
- * roll vector - usually it will be 2 of the cardinal axes. The default value is:
2090
- *
2091
- * * steer - along the Y axis / new Vector3(0, 1, 0)
2092
- * * roll - along the Z axis / new Vector3(0, 0, 1)
2093
- *
2094
- *
2095
- * It should work with most car models imported from 3D editors as this is the natural position of a wheel.
2096
- *
2097
- * *Please note, that Papervision primitive cylinder, which may also be used as wheel, will require different axes
2098
- * (Y for roll and Z or X for steer).*
2099
- *
2100
- * @author Bartek Drozdz
2101
- *
2102
- [/DOC_MD]**/
2103
- MOD3.Wheel = MOD3.Class(MOD3.Modifier, {
2104
- constructor: function Wheel(speed, turn, roll, steerVector, rollVector) {
2105
- var self = this;
2106
- if (!(self instanceof Wheel)) return new Wheel(speed, turn, roll, steerVector, rollVector);
2107
- self.$super('constructor');
2108
- self.name = 'Wheel';
2109
- self.speed = speed || 0;
2110
- self.turn = turn || 0;
2111
- self.roll = roll || 0;
2112
- self.steerVector = steerVector || MOD3.Vector3.Y();
2113
- self.rollVector = rollVector || MOD3.Vector3.Z();
2114
- },
2115
-
2116
- speed: 0,
2117
- turn: 0,
2118
- roll: 0,
2119
- steerVector: null,
2120
- rollVector: null,
2121
-
2122
- dispose: function() {
2123
- var self = this;
2124
- self.speed = null;
2125
- self.turn = null;
2126
- self.roll = null;
2127
- self.steerVector.dispose();
2128
- self.rollVector.dispose();
2129
- self.steerVector = null;
2130
- self.rollVector = null;
2131
- self.$super('dispose');
2132
-
2133
- return self;
2134
- },
2135
-
2136
- apply: function(modifiable) {
2137
- var self = this,
2138
- steerVector = self.steerVector.normalizeSelf(),
2139
- rollVector = self.rollVector.normalizeSelf(),
2140
- turn = self.turn, roll = self.roll,
2141
- //radius = 0.5*modifiable.width,
2142
- //step = radius * self.speed / PI,
2143
- //perimeter = radius * TWO_PI,
2144
- ms = null, mt = null
2145
- ;
2146
-
2147
- self.roll += self.speed;
2148
-
2149
- if (turn)
2150
- {
2151
- mt = new MOD3.Matrix4().rotateFromVector(steerVector, turn);
2152
- ms = new MOD3.Matrix4().rotateFromVector(mt.multiplyVector(rollVector.clone()), roll);
2153
- }
2154
- else
2155
- {
2156
- ms = new MOD3.Matrix4().rotateFromVector(rollVector, roll);
2157
- }
2158
-
2159
- MOD3.List.each(modifiable.vertices, mt
2160
- ? function(v) {
2161
- v.setXYZ(MOD3.Matrix4.multXYZ(ms, MOD3.Matrix4.multXYZ(mt, v.getXYZ())));
2162
- }
2163
- : function(v) {
2164
- v.setXYZ(MOD3.Matrix4.multXYZ(ms, v.getXYZ()));
2165
- }
2166
- );
2167
- return self;
2168
- }
2169
- });
2170
- }(MOD3);!function(MOD3) {
2171
- "use strict";
2172
- /**
2173
- * MOD3 Break Modifier
2174
- **/
2175
-
2176
- /**[DOC_MD]
2177
- * ### Break modifier
2178
- *
2179
- * Allow to break a mesh
2180
- *
2181
- * @author Bartek Drozdz
2182
- *
2183
- [/DOC_MD]**/
2184
- var stdMath = Math;
2185
-
2186
- MOD3.Break = MOD3.Class(MOD3.Modifier, {
2187
- constructor: function Break(offset, angle, vector) {
2188
- var self = this;
2189
- if (!(self instanceof Break)) return new Break(offset, angle, vector);
2190
- self.$super('constructor');
2191
- self.name = 'Break';
2192
- self.offset = offset || 0;
2193
- self.angle = angle || 0;
2194
- self.vector = vector || MOD3.Vector3.Y();
2195
- self.range = new MOD3.Range(0, 1);
2196
- },
2197
-
2198
- offset: 0,
2199
- angle: 0,
2200
- vector: null,
2201
- range: null,
2202
-
2203
- dispose: function() {
2204
- var self = this;
2205
- self.vector.dispose();
2206
- self.range.dispose();
2207
- self.vector = null;
2208
- self.range = null;
2209
- self.offset = null;
2210
- self.angle = null;
2211
- self.$super('dispose');
2212
- return self;
2213
- },
2214
-
2215
- apply: function(modifiable) {
2216
- var self = this,
2217
- offset = stdMath.min(1, stdMath.max(0, self.offset)), range = self.range, angle = self.angle,
2218
- bv = self.vector.normalizeSelf().xyz, pv, rm;
2219
-
2220
- pv = modifiable.minZ + modifiable.depth*offset;
2221
- rm = new MOD3.Matrix4().rotate(bv[0], bv[1], bv[2], angle);
2222
-
2223
- MOD3.List.each(modifiable.vertices, function(v) {
2224
- var c = v.getXYZ();
2225
- c[2] -= pv;
2226
- if ((0 <= c[2]) && range.isIn(v.ratio[1])) MOD3.Matrix4.multXYZ(rm, c);
2227
- c[2] += pv;
2228
- v.setXYZ(c);
2229
- });
2230
- return self;
2231
- }
2232
- });
2233
- }(MOD3);!function(MOD3) {
2234
- "use strict";
2235
- /**
2236
- * MOD3 Noise Modifier
2237
- **/
2238
-
2239
- /**[DOC_MD]
2240
- * ### Noise modifier
2241
- *
2242
- * Randomly displaces each vertex in all 3 axes
2243
- *
2244
- *
2245
- [/DOC_MD]**/
2246
- var stdMath = Math;
2247
-
2248
- MOD3.Noise = MOD3.Class(MOD3.Modifier, {
2249
- constructor: function Noise(force) {
2250
- var self = this;
2251
- if (!(self instanceof Noise)) return new Noise(force);
2252
- self.$super('constructor');
2253
- self.name = 'Noise';
2254
- self.force = force || 0;
2255
- self.start = 0;
2256
- self.end = 1;
2257
- self.axes = MOD3.ModConstant.X | MOD3.ModConstant.Y | MOD3.ModConstant.Z;
2258
- },
2259
-
2260
- force: 0,
2261
- start: 0,
2262
- end: 1,
2263
-
2264
- dispose: function() {
2265
- var self = this;
2266
- self.force = null;
2267
- self.start = null;
2268
- self.end = null;
2269
- self.$super('dispose');
2270
- return self;
2271
- },
2272
-
2273
- setFalloff: function(start, end) {
2274
- var self = this;
2275
- self.start = start != null ? start : 0;
2276
- self.end = end != null ? end : 1;
2277
- return self;
2278
- },
2279
-
2280
- apply: function(modifiable) {
2281
- var self = this,
2282
- axes = self.axes, start = self.start, end = self.end,
2283
- force = self.force, halfforce = 0.5*force,
2284
- maxAxis = modifiable.maxAxis;
2285
-
2286
- if ((0 == axes) || (0 == force)) return self;
2287
-
2288
- MOD3.List.each(modifiable.vertices, function(v) {
2289
- var r = stdMath.random() * force - halfforce,
2290
- p = v.getRatio(maxAxis), rp, xyz;
2291
- if (start < end)
2292
- {
2293
- if (p < start) p = 0;
2294
- else if (p > end) p = 1;
2295
- }
2296
- else if (start > end)
2297
- {
2298
- p = 1 - p;
2299
- if (p > start) p = 0;
2300
- else if (p < end) p = 1;
2301
- }
2302
- else
2303
- {
2304
- p = 1;
2305
- }
2306
-
2307
- rp = r * p;
2308
- xyz = v.getXYZ();
2309
- v.setXYZ([
2310
- xyz[0] + (axes & MOD3.ModConstant.X ? rp : 0),
2311
- xyz[1] + (axes & MOD3.ModConstant.Y ? rp : 0),
2312
- xyz[2] + (axes & MOD3.ModConstant.Z ? rp : 0)
2313
- ]);
2314
- });
2315
- return self;
2316
- }
2317
- });
2318
- }(MOD3);!function(MOD3) {
2319
- "use strict";
2320
- /**
2321
- * MOD3 DisplaceMap (BitmapDisplacement) Modifier
2322
- **/
2323
-
2324
- /**[DOC_MD]
2325
- * ### DisplaceMap (BitmapDisplacement) Modifier
2326
- *
2327
- * Displaces vertices based on RGB values of bitmapData pixels.
2328
- *
2329
- * BitmapDisplacement is inspired by both the AS3 built-in DisplacementMapFilter. It allows
2330
- * to use color values for each channels of a bitmap to modify the position of vertices in a mesh.
2331
- *
2332
- * The displacement takes place along the cardinal axes, and each axis is mapped to a
2333
- * channel in the bitmap: X for Red, Y for Green and Z for Blue.
2334
- *
2335
- * @author Bartek Drozdz
2336
- *
2337
- [/DOC_MD]**/
2338
- MOD3.DisplaceMap = MOD3.Class(MOD3.Modifier, {
2339
- constructor: function DisplaceMap(bmp, force, offset) {
2340
- var self = this;
2341
- if (!(self instanceof DisplaceMap)) return new DisplaceMap(bmp, force, offset);
2342
- self.$super('constructor');
2343
- self.name = 'DisplaceMap';
2344
- if (+bmp === bmp) // number
2345
- {
2346
- self.force = bmp || 1;
2347
- self.offset = null == force ? 127 : force;// 0x7F;
2348
- }
2349
- else
2350
- {
2351
- self.setBitmap(bmp);
2352
- self.force = force || 1;
2353
- self.offset = null == offset ? 127 : offset;// 0x7F;
2354
- }
2355
- self.axes = MOD3.ModConstant.X | MOD3.ModConstant.Y | MOD3.ModConstant.Z;
2356
- },
2357
-
2358
- width: null,
2359
- height: null,
2360
- bmpData: null,
2361
- force: 1,
2362
- offset: 127,
2363
-
2364
- dispose: function() {
2365
- var self = this;
2366
- self.bmpData = null;
2367
- self.width = null;
2368
- self.height = null;
2369
- self.force = null;
2370
- self.offset = null;
2371
- self.$super('dispose');
2372
- return self;
2373
- },
2374
-
2375
- setBitmap: function(bmpData) {
2376
- var self = this;
2377
- self.bmpData = bmpData ? bmpData.data : null;
2378
- self.width = bmpData ? bmpData.width : 0;
2379
- self.height = bmpData ? bmpData.height : 0;
2380
- return self;
2381
- },
2382
-
2383
- apply: function(modifiable) {
2384
- var self = this,
2385
- axes = self.axes,
2386
- w = self.width, h = self.height, bmp = self.bmpData,
2387
- force = self.force, offset = self.offset;
2388
-
2389
- if (!axes || !bmp) return self;
2390
-
2391
- MOD3.List.each(modifiable.vertices, function(v) {
2392
- var uv, uu, vv, xyz = v.getXYZ();
2393
-
2394
- uu = ~~((w - 1) * v.ratio[0]/* X */);
2395
- vv = ~~((h - 1) * v.ratio[2]/* Z */);
2396
- uv = (vv * w + uu) << 2;
2397
-
2398
- v.setXYZ([
2399
- xyz[0] + (axes & MOD3.ModConstant.X ? ((bmp[uv] & 0xff) - offset) * force : 0),
2400
- xyz[1] + (axes & MOD3.ModConstant.Y ? ((bmp[uv+1] & 0xff) - offset) * force : 0),
2401
- xyz[2] + (axes & MOD3.ModConstant.Z ? ((bmp[uv+2] & 0xff) - offset) * force : 0)
2402
- ]);
2403
- });
2404
- return self;
2405
- }
2406
- });
2407
- }(MOD3);!function(MOD3) {
2408
- "use strict";
2409
- /**
2410
- * MOD3 Perlin/Simplex Noise Modifier
2411
- **/
2412
-
2413
- /**[DOC_MD]
2414
- * ### Perlin modifier
2415
- *
2416
- * Displaces vertices based on a perlin/simplex noise source.
2417
- *
2418
- * Accepts a perlin/simplex noise data (with width and height information) and displaces vertices
2419
- * based on the value of each point of the noise map.
2420
- *
2421
- * @author Bartek Drozdz
2422
- *
2423
- * @uses: https://github.com/josephg/noisejs for JavaScript
2424
- *
2425
- [/DOC_MD]**/
2426
- function cyclic_shift(a, w, h, dX, dY)
2427
- {
2428
- var size = w*h, b = new MOD3.VecArray(size), i, j, i2, j2, index;
2429
- if (dX < 0) dX += w;
2430
- if (dY < 0) dY += h;
2431
- dX = ~~dX; dY = ~~dY;
2432
- for (i=0,j=0,index=0; index<size; ++index,++i)
2433
- {
2434
- if (i >= w) {i = 0; ++j;}
2435
- i2 = (i + dX) % w; j2 = (j + dY) % h;
2436
- b[index] = a[i2 + j2 * w];
2437
- }
2438
- return b;
2439
- }
2440
- /*function generate2d(perlinNoise2d, w, h)
2441
- {
2442
- var size = w*h, a = new MOD3.VecArray(size), i, j, index;
2443
- for (i=0,j=0,index=0; index<size; ++index,++i)
2444
- {
2445
- if (i >= w) {i = 0; ++j;}
2446
- a[index] = perlinNoise2d(i/w, j/h);
2447
- }
2448
- return a;
2449
- }*/
2450
- MOD3.Perlin = MOD3.Class(MOD3.Modifier, {
2451
- constructor: function Perlin(force, noise, autoRun) {
2452
- var self = this;
2453
- if (!(self instanceof Perlin)) return new Perlin(force, noise, autoRun);
2454
- self.$super('constructor');
2455
- self.name = 'Perlin';
2456
- self.force = null != force ? force : 1;
2457
- self.perlin = noise;
2458
- self.autoRun = null != autoRun ? !!autoRun : true;
2459
- self.axes = MOD3.ModConstant.X | MOD3.ModConstant.Y | MOD3.ModConstant.Z;
2460
- },
2461
-
2462
- speedX: 1,
2463
- speedY: 1,
2464
- perlin: null,
2465
- force: 1,
2466
- offset: 0,
2467
- autoRun: true,
2468
-
2469
- dispose: function() {
2470
- var self = this;
2471
- self.perlin = null;
2472
- self.speedX = null;
2473
- self.speedY = null;
2474
- self.force = null;
2475
- self.offset = null;
2476
- self.autoRun = null;
2477
- self.$super('dispose');
2478
-
2479
- return self;
2480
- },
2481
-
2482
- setSpeed: function(dX, dY) {
2483
- var self = this;
2484
- self.speedX = dX;
2485
- self.speedY = dY;
2486
- return self;
2487
- },
2488
-
2489
- apply: function(modifiable) {
2490
- var self = this,
2491
- axes = self.axes, force = self.force,
2492
- offset = self.offset, pn = self.perlin,
2493
- w, h;
2494
-
2495
- if (!axes || !pn) return self;
2496
- w = pn.width; h = pn.height;
2497
- if (self.autoRun)
2498
- {
2499
- pn = self.perlin = cyclic_shift(pn, w, h, self.speedX, self.speedY);
2500
- pn.width = w; pn.height = h;
2501
- }
2502
-
2503
- MOD3.List.each(modifiable.vertices, function(v) {
2504
- var xyz = v.getXYZ(),
2505
- uu = ~~((w - 1) * v.ratio[0]/* u */),
2506
- vv = ~~((h - 1) * v.ratio[2]/* v */),
2507
- uv = uu + vv * w;
2508
-
2509
- v.setXYZ([
2510
- xyz[0] + (axes & MOD3.ModConstant.X ? (pn[uv] - offset) * force : 0),
2511
- xyz[1] + (axes & MOD3.ModConstant.Y ? (pn[uv/*+1*/] - offset) * force : 0),
2512
- xyz[2] + (axes & MOD3.ModConstant.Z ? (pn[uv/*+2*/] - offset) * force : 0)
2513
- ]);
2514
- });
2515
- return self;
2516
- }
2517
- });
2518
- }(MOD3);// export it
2519
- return MOD3;
2520
- });