Mercurial > hg > orthanc-stl
annotate Resources/Nexus/js/nexus_three.js @ 45:967f947014ac nexus
adding experimental support for nexus models
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 09 Apr 2024 22:13:01 +0200 |
parents | |
children |
rev | line source |
---|---|
45
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1 function NexusObject(url, renderer, render, material) { |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2 var gl = renderer.context; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
3 var geometry = new THREE.BufferGeometry(); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
4 var positions = new Float32Array(3); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
5 |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
6 |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
7 geometry.addAttribute('position', new THREE.BufferAttribute(positions, 3)); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
8 |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
9 |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
10 if(!material) |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
11 this.autoMaterial = true; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
12 |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
13 THREE.Mesh.call( this, geometry, material); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
14 this.frustumCulled = false; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
15 |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
16 var mesh = this; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
17 var instance = this.instance = new Nexus.Instance(gl); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
18 instance.open(url); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
19 instance.onLoad = function() { |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
20 var s = 1/instance.mesh.sphere.radius; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
21 var pos = instance.mesh.sphere.center; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
22 mesh.position.set(-pos[0]*s, -pos[1]*s, -pos[2]*s); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
23 mesh.scale.set(s, s, s); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
24 if(mesh.autoMaterial) |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
25 mesh.material = new THREE.MeshLambertMaterial( { color: 0xffffff } ); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
26 |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
27 if(this.mesh.vertex.normal) { |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
28 var normals = new Float32Array(3); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
29 geometry.addAttribute( 'normal', new THREE.BufferAttribute(normals, 3)); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
30 } |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
31 if(this.mesh.vertex.color) { |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
32 var colors = new Float32Array(4); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
33 geometry.addAttribute( 'color', new THREE.BufferAttribute(colors, 4)); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
34 if(mesh.autoMaterial) |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
35 mesh.material = new THREE.MeshLambertMaterial({ vertexColors: THREE.VertexColors }); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
36 } |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
37 |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
38 if(this.mesh.vertex.texCoord) { |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
39 var uv = new Float32Array(2); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
40 geometry.addAttribute( 'uv', new THREE.BufferAttribute(uv, 2)); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
41 if(mesh.autoMaterial) { |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
42 var texture = new THREE.DataTexture( new Uint8Array([1, 1, 1]), 1, 1, THREE.RGBFormat ); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
43 texture.needsUpdate = true; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
44 mesh.material = new THREE.MeshLambertMaterial( { color: 0xffffff, map: texture } ); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
45 } |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
46 } |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
47 |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
48 if(this.mesh.face.index) { |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
49 var indices = new Uint32Array(3); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
50 geometry.setIndex(new THREE.BufferAttribute( indices, 3) ); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
51 } |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
52 render(); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
53 }; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
54 instance.onUpdate = function() { render(); } |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
55 |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
56 this.onAfterRender = function(renderer, scene, camera, geometry, material, group) { |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
57 if(!instance.isReady) return; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
58 var s = renderer.getSize(); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
59 instance.updateView([0, 0, s.width, s.height], |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
60 camera.projectionMatrix.elements, |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
61 mesh.modelViewMatrix.elements); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
62 var program = renderer.context.getParameter(gl.CURRENT_PROGRAM); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
63 instance.attributes['position'] = renderer.context.getAttribLocation(program, "position"); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
64 instance.attributes['normal'] = renderer.context.getAttribLocation(program, "normal"); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
65 instance.attributes['color'] = renderer.context.getAttribLocation(program, "color"); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
66 instance.attributes['uv'] = renderer.context.getAttribLocation(program, "uv"); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
67 |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
68 instance.render(); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
69 } |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
70 } |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
71 |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
72 NexusObject.prototype = Object.create(THREE.Mesh.prototype); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
73 |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
74 NexusObject.prototype.raycast = function(raycaster, intersects) { |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
75 var instance = this.instance; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
76 var nexus = instance.mesh; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
77 if(!nexus.sphere) return; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
78 var sp = nexus.sphere; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
79 var c = sp.center; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
80 var center = new THREE.Vector3(c[0], c[1], c[2]); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
81 var sphere = new THREE.Sphere(center, sp.radius); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
82 sphere.applyMatrix4( this.matrixWorld ); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
83 |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
84 if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
85 //just check the last level spheres. |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
86 if(!nexus.sink) return; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
87 |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
88 var distance = -1.0; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
89 for(var i = 0; i < nexus.sink; i++) { |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
90 var patch = nexus.nfirstpatch[i]; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
91 if(nexus.patches[patch*3] != nexus.sink) |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
92 continue; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
93 var x = nexus.nspheres[i*5]; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
94 var y = nexus.nspheres[i*5+1]; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
95 var z = nexus.nspheres[i*5+2]; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
96 var r = nexus.nspheres[i*5+4]; //tight radius |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
97 var sphere = new THREE.Sphere(new THREE.Vector3(x, y, z), r); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
98 sphere.applyMatrix4( this.matrixWorld ); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
99 if ( raycaster.ray.intersectsSphere( sphere ) != false ) { |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
100 var d = sphere.center.lengthSq(); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
101 if(distance == -1.0 || d < distance) |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
102 distance = d; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
103 } |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
104 } |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
105 if(distance == -1.0) return; |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
106 |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
107 intersects.push({ distance: distance, object: this} ); |
967f947014ac
adding experimental support for nexus models
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
108 } |