Skip to content

Commit 4369e1a

Browse files
committed
add example of usage of external three.js
1 parent be5373d commit 4369e1a

File tree

1 file changed

+158
-0
lines changed

1 file changed

+158
-0
lines changed
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<!-- as prototype used: https://github.com/mrdoob/three.js/blob/master/examples/webgl_geometries.html -->
5+
<title>Build and draw TGeo object using external three.js</title>
6+
<meta charset="utf-8">
7+
<link rel="shortcut icon" href="../img/RootIcon.ico"/>
8+
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
9+
<style>
10+
body {
11+
font-family: Monospace;
12+
background-color: #000;
13+
margin: 0px;
14+
overflow: hidden;
15+
}
16+
</style>
17+
<script type="importmap">
18+
{
19+
"imports": {
20+
"three": "https://threejs.org/build/three.module.js",
21+
"three/addons": "https://threejs.org/examples/jsm/Addons.js",
22+
"three_stats": "https://threejs.org/examples/jsm/libs/stats.module.js",
23+
"jsroot_geom": "../build/geom_nothreejs.mjs"
24+
}
25+
}
26+
</script>
27+
28+
</head>
29+
30+
<body>
31+
</body>
32+
33+
<script type='module'>
34+
35+
import { Box3, Vector3, PerspectiveCamera, Scene, AmbientLight, DirectionalLight, DoubleSide,
36+
MeshLambertMaterial, Mesh, TetrahedronGeometry, WebGLRenderer } from 'three';
37+
38+
import Stats from 'three_stats';
39+
40+
import { openFile, build, produceRenderOrder } from 'jsroot_geom';
41+
42+
43+
let container, stats, camera, scene, renderer, geom_size = 400, dummy = null;
44+
45+
function add_geometry(obj) {
46+
47+
// options for building three.js model
48+
let opt = { numfaces: 100000, numnodes: 1000 };
49+
50+
// increase number of faces
51+
// opt.numfaces *= 100;
52+
// opt.numnodes *= 100;
53+
54+
// use default colors
55+
// opt.dflt_colors = true;
56+
57+
// enable usage of InstancedMesh
58+
opt.instancing = 1;
59+
60+
// function demonstrate creation of three.js model
61+
let obj3d = build(obj, opt);
62+
63+
if (!obj3d) return;
64+
scene.remove( dummy );
65+
scene.add( obj3d );
66+
67+
let box3 = new Box3().setFromObject(obj3d);
68+
69+
geom_size = box3.getSize(new Vector3()).length();
70+
71+
camera.far = geom_size*5;
72+
camera.updateProjectionMatrix();
73+
}
74+
75+
function onWindowResize() {
76+
77+
camera.aspect = window.innerWidth / window.innerHeight;
78+
camera.updateProjectionMatrix();
79+
80+
renderer.setSize( window.innerWidth, window.innerHeight );
81+
}
82+
83+
function animate() {
84+
85+
requestAnimationFrame( animate );
86+
87+
render();
88+
stats.update();
89+
90+
}
91+
92+
function render() {
93+
94+
let timer = Date.now() * 0.0001;
95+
96+
camera.position.x = Math.cos(timer)*geom_size;
97+
camera.position.z = Math.sin(timer)*geom_size;
98+
camera.position.y = geom_size;
99+
100+
camera.lookAt( scene.position );
101+
102+
for (let i = 0, l = scene.children.length; i < l; i++) {
103+
104+
let object = scene.children[ i ];
105+
106+
object.rotation.x = timer * 5;
107+
object.rotation.y = timer * 2.5;
108+
109+
}
110+
111+
// set rendering order for transparent volumes, create with JSROOT
112+
produceRenderOrder(scene, camera.position, 'dflt');
113+
114+
renderer.render( scene, camera );
115+
}
116+
117+
container = document.createElement('div');
118+
document.body.appendChild(container);
119+
120+
camera = new PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, geom_size*5 );
121+
camera.position.y = geom_size;
122+
123+
scene = new Scene();
124+
scene.add(new AmbientLight(0x404040));
125+
126+
let light = new DirectionalLight( 0xffffff );
127+
light.position.set(0, 1, 0);
128+
scene.add( light );
129+
130+
// first draw dummy object, seen in the beginning
131+
let material = new MeshLambertMaterial({side: DoubleSide, color: 'red', vertexColors: false});
132+
dummy = new Mesh(new TetrahedronGeometry(75, 0), material);
133+
// object.position.set( 200, 0, 200 );
134+
scene.add( dummy );
135+
136+
renderer = new WebGLRenderer({ antialias: true });
137+
renderer.setPixelRatio( window.devicePixelRatio );
138+
renderer.setSize( window.innerWidth, window.innerHeight );
139+
140+
container.appendChild( renderer.domElement );
141+
142+
stats = new Stats();
143+
container.appendChild( stats.dom );
144+
145+
window.addEventListener( 'resize', onWindowResize, false );
146+
147+
148+
const file = await openFile('https://root.cern/files/lego.root');
149+
150+
const obj = await file.readObject('geom');
151+
152+
add_geometry(obj);
153+
154+
animate();
155+
156+
</script>
157+
158+
</html>

0 commit comments

Comments
 (0)