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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }