otsdaq_utilities  v2_05_02_indev
JSRootGeoWorker.js
1 JSROOT = {}; // just place holder for JSROOT.GEO functions
2 
3 JSROOT.BIT = function(n) { return 1 << (n); }
4 
5 importScripts("three.min.js", "ThreeCSG.js", "JSRootGeoBase.js");
6 
7 // if (console) console.log('geoworker started ' + THREE.REVISION);
8 
9 var clones = null;
10 
11 onmessage = function(e) {
12 
13  if (typeof e.data == 'string') {
14  console.log('Worker get message ' + e.data);
15  return;
16  }
17 
18  if (typeof e.data != 'object') return;
19 
20  e.data.tm1 = new Date().getTime();
21 
22  if (e.data.init) {
23  // console.log('start worker ' + (e.data.tm1 - e.data.tm0));
24 
25  var nodes = e.data.clones;
26  if (nodes) {
27  // console.log('get clones ' + nodes.length);
28  clones = new JSROOT.GEO.ClonedNodes(null, nodes);
29  clones.SetVisLevel(e.data.vislevel);
30  clones.SetMaxVisNodes(e.data.maxvisnodes);
31  delete e.data.clones;
32  clones.sortmap = e.data.sortmap;
33  }
34 
35  // used in composite shape
36  JSROOT.browser = e.data.browser;
37 
38  e.data.tm2 = new Date().getTime();
39 
40  return postMessage(e.data);
41  }
42 
43  if (e.data.shapes) {
44  // this is task to create geometries in the worker
45 
46  var shapes = e.data.shapes, transferables = [];
47 
48  // build all shapes up to specified limit, also limit execution time
49  for (var n=0;n<100;++n) {
50  var res = clones.BuildShapes(shapes, e.data.limit, 1000);
51  if (res.done) break;
52  postMessage({ progress: "Worker creating: " + res.shapes + " / " + shapes.length + " shapes, " + res.faces + " faces" });
53  }
54 
55  for (var n=0;n<shapes.length;++n) {
56  var item = shapes[n];
57 
58  if (item.geom) {
59  var bufgeom;
60  if (item.geom instanceof THREE.BufferGeometry) {
61  bufgeom = item.geom;
62  } else {
63  var bufgeom = new THREE.BufferGeometry();
64  bufgeom.fromGeometry(item.geom);
65  }
66 
67  item.buf_pos = bufgeom.attributes.position.array;
68  item.buf_norm = bufgeom.attributes.normal.array;
69 
70  // use nice feature of HTML workers with transferable
71  // we allow to take ownership of buffer from local array
72  // therefore buffer content not need to be copied
73  transferables.push(item.buf_pos.buffer, item.buf_norm.buffer);
74 
75  delete item.geom;
76  }
77 
78  delete item.shape; // no need to send back shape
79  }
80 
81  e.data.tm2 = new Date().getTime();
82 
83  return postMessage(e.data, transferables);
84  }
85 
86  if (e.data.collect !== undefined) {
87  // this is task to collect visible nodes using camera position
88 
89  // first mark all visible flags
90  clones.SetVisibleFlags(e.data.flags);
91  delete e.data.falgs;
92 
93  clones.ProduceIdShits();
94 
95  var matrix = null;
96  if (e.data.matrix)
97  matrix = new THREE.Matrix4().fromArray(e.data.matrix);
98  delete e.data.matrix;
99 
100  var res = clones.CollectVisibles(e.data.collect, JSROOT.GEO.CreateFrustum(matrix));
101 
102  e.data.new_nodes = res.lst;
103  e.data.complete = res.complete; // inform if all nodes are selected
104 
105  e.data.tm2 = new Date().getTime();
106 
107  // console.log('Collect visibles in worker ' + e.data.new_nodes.length + ' takes ' + (e.data.tm2-e.data.tm1));
108 
109  return postMessage(e.data);
110  }
111 
112 }