@@ -203,18 +203,35 @@ class SalvusThreeJS
203
203
@camera .up = new THREE.Vector3 (0 ,0 ,1 )
204
204
205
205
set_light : (color = 0xffffff ) =>
206
- ambient = new THREE.AmbientLight (0x404040 )
206
+ ambient = new THREE.AmbientLight (0xdddddd )
207
207
@scene .add ( ambient )
208
- directionalLight = new THREE.DirectionalLight ( 0xffffff )
209
- directionalLight .position .set ( 100 , 100 , 100 ). normalize ( )
208
+ directionalLight = new THREE.DirectionalLight (0xffffff , 0.8 )
209
+ directionalLight .position .set ( 1 , 1 , 1 )
210
210
@scene .add ( directionalLight )
211
- directionalLight = new THREE.DirectionalLight ( 0xffffff )
212
- directionalLight .position .set ( - 100 , - 100 , - 100 ). normalize ( )
211
+ directionalLight = new THREE.DirectionalLight (0xffffff , 0.8 )
212
+ directionalLight .position .set ( - 1 , - 1 , - 1 )
213
213
@scene .add ( directionalLight )
214
214
@light = new THREE.PointLight (0xffffff )
215
215
@light .position .set (0 ,10 ,0 )
216
216
217
- add_text : (opts ) =>
217
+ make_material : (opts ) =>
218
+ o = defaults opts,
219
+ opacity : 1
220
+ ambient : 0x222222
221
+ diffuse : 0x222222
222
+ specular : 0xffffff
223
+ color : required
224
+ emmissive : 0x222222
225
+ shininess : 100
226
+ overdraw : true
227
+ polygonOffset : true
228
+ polygonOffsetFactor : 1
229
+ polygonOffsetUnits : 1
230
+ # side: THREE.DoubleSide
231
+ o .transparent = o .opacity < 1
232
+ return new THREE.MeshPhongMaterial (o)
233
+
234
+ make_text : (opts ) =>
218
235
o = defaults opts,
219
236
pos : [0 ,0 ,0 ]
220
237
text : required
@@ -260,7 +277,6 @@ class SalvusThreeJS
260
277
else
261
278
@_text .push (sprite)
262
279
263
- @scene .add (sprite)
264
280
return sprite
265
281
266
282
add_line : (opts ) =>
@@ -273,7 +289,7 @@ class SalvusThreeJS
273
289
for a in o .points
274
290
geometry .vertices .push (new THREE.Vector3 (a[0 ],a[1 ],a[2 ]))
275
291
line = new THREE.Line (geometry, new THREE.LineBasicMaterial (color : opts .color , linewidth : o .thickness ))
276
- @scene . add ( line)
292
+ return line
277
293
278
294
add_point : (opts ) =>
279
295
o = defaults opts,
@@ -286,9 +302,30 @@ class SalvusThreeJS
286
302
geometry = new THREE.SphereGeometry (Math .sqrt (o .size )/ 50 ,16 ,16 )
287
303
sphere = new THREE.Mesh (geometry, material);
288
304
sphere .position .set (o .loc [0 ], o .loc [1 ], o .loc [2 ])
289
- @scene .add (sphere)
305
+ return sphere
306
+
307
+ make_sphere : (opts ) =>
308
+ o = defaults opts,
309
+ radius : 1
310
+ position : [0 ,0 ,0 ]
311
+ return new THREE.SphereGeometry (o .radius , 20 , 20 )
290
312
291
- add_obj : (myobj , opts )=>
313
+ make_group : (opts ) =>
314
+ o = defaults opts,
315
+ matrix : [1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 ]
316
+ children : required
317
+ obj = new THREE.Object3D ()
318
+ m = o .matrix
319
+ obj .matrixAutoUpdate = false # tell three.js to not update the matrix based on position, rotation, etc.
320
+ obj .matrix .set (m[0 ], m[1 ], m[2 ], m[3 ],
321
+ m[4 ], m[5 ], m[6 ], m[7 ],
322
+ m[8 ], m[9 ], m[10 ], m[11 ],
323
+ m[12 ], m[13 ], m[14 ], m[15 ])
324
+ obj .add (@ make_object (i)) for i in o .children
325
+ return obj
326
+
327
+ # #####
328
+ add_index_face_set : (myobj , opts )=>
292
329
vertices = myobj .vertex_geometry
293
330
for objects in [0 .. myobj .face_geometry .length - 1 ]
294
331
face3 = myobj .face_geometry [objects].face3
@@ -374,7 +411,8 @@ class SalvusThreeJS
374
411
mesh = THREE .SceneUtils .createMultiMaterialObject (geometry, multiMaterial);
375
412
376
413
mesh .position .set (0 ,0 ,0 )
377
- @scene .add (mesh)
414
+ return mesh
415
+ # #########
378
416
379
417
# always call this after adding things to the scene to make sure track
380
418
# controls are sorted out, etc. Set draw:false, if you don't want to
@@ -456,7 +494,9 @@ class SalvusThreeJS
456
494
return (z* 1 ).toString ()
457
495
458
496
txt = (x ,y ,z ,text ) =>
459
- @_frame_labels .push (@ add_text (pos : [x,y,z], text : text, fontsize : o .fontsize , color : o .color , constant_size : false ))
497
+ t = @ make_text (pos : [x,y,z], text : text, fontsize : o .fontsize , color : o .color , constant_size : false )
498
+ @_frame_labels .push (t)
499
+ @scene .add (t)
460
500
461
501
offset = 0.075
462
502
mx = (o .xmin + o .xmax )/ 2
@@ -488,39 +528,34 @@ class SalvusThreeJS
488
528
if o .draw
489
529
@ render_scene ()
490
530
531
+ make_object : (obj ) =>
532
+ handlers =
533
+ text : @make_text
534
+ index_face_set : @make_index_face_set
535
+ line : @make_line
536
+ point : @make_point
537
+ sphere : @make_sphere
538
+ type = obj .type
539
+ delete obj .type
540
+ o = false
541
+ if type == ' group'
542
+ o = @ make_group (obj)
543
+ else if type == ' object'
544
+ geometry_type = obj .geometry .type
545
+ delete obj .geometry .type
546
+ geometry = handlers[geometry_type](obj .geometry )
547
+ material = @ make_material (obj .texture )
548
+ o = new THREE.Mesh (geometry, material)
549
+ return o
550
+
491
551
add_3dgraphics_obj : (opts ) =>
492
552
opts = defaults opts,
493
553
obj : required
494
554
wireframe : false
495
555
496
- for o in opts .obj
497
- switch o .type
498
- when ' text'
499
- @add_text
500
- pos : o .pos
501
- text : o .text
502
- color : o .color
503
- fontsize : o .fontsize
504
- fontface : o .fontface
505
- constant_size : o .constant_size
506
- when ' index_face_set'
507
- @ add_obj (o, opts)
508
- if o .mesh and not o .wireframe # draw a wireframe mesh on top of the surface we just drew.
509
- o .color = ' #000000'
510
- o .wireframe = o .mesh
511
- @ add_obj (o, opts)
512
- when ' line'
513
- delete o .type
514
- @ add_line (o)
515
- when ' point'
516
- delete o .type
517
- @ add_point (o)
518
- else
519
- console .log (" ERROR: no renderer for model number = #{ o .id } " )
520
- return
556
+ @scene .add (@ make_object (opts .obj ))
521
557
@ render_scene (true )
522
558
523
-
524
559
animate : () =>
525
560
if @_animate
526
561
@_animation_frame = requestAnimationFrame (@animate )
0 commit comments