Skip to content

Commit 7280681

Browse files
committed
Implement TGeoEltu shape
1 parent 1978b2f commit 7280681

File tree

3 files changed

+68
-23
lines changed

3 files changed

+68
-23
lines changed

changes.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
## Changes in master
44
1. Significant performance improvements in 3D drawings - TGeo/TH2/TH3
5-
2. Implement TGeoPara, TGeoGtra and TGeoXtru shapes
6-
3. Optimize (reduce vertices number) for several other TGeo shapes
5+
2. Implement TGeoPara, TGeoGtra, TGeoXtru and TGeoEltu shapes
6+
3. Optimize (reduce vertices number) for others TGeo shapes
77
4. Correct rotation/translation/scaling of TGeo nodes
88
5. Workaround for axis reflection (not directly supported in three.js)
99
6. Support array of objects in I/O (like in TAxis3D)

scripts/JSRootCore.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@
8585
}
8686
} (function(JSROOT) {
8787

88-
JSROOT.version = "dev 16/02/2016";
88+
JSROOT.version = "dev 17/02/2016";
8989

9090
JSROOT.source_dir = "";
9191
JSROOT.source_min = false;

scripts/JSRootGeoPainter.js

Lines changed: 65 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@
9797

9898
var verticesOfShape;
9999

100-
if (shape['_typename'] == "TGeoArb8" || shape['_typename'] == "TGeoTrap" || shape['_typename'] == "TGeoGtra") {
100+
if (shape._typename == "TGeoArb8" || shape._typename == "TGeoTrap" || shape._typename == "TGeoGtra") {
101101
// Arb8
102102
verticesOfShape = [
103103
shape['fXY'][0][0], shape['fXY'][0][1], -shape['fDZ'],
@@ -110,7 +110,7 @@
110110
shape['fXY'][7][0], shape['fXY'][7][1], shape['fDZ']
111111
];
112112
}
113-
else if (shape['_typename'] == "TGeoTrd1") {
113+
else if (shape._typename == "TGeoTrd1") {
114114
verticesOfShape = [
115115
-shape['fDx1'], shape['fDY'], -shape['fDZ'],
116116
shape['fDx1'], shape['fDY'], -shape['fDZ'],
@@ -122,7 +122,7 @@
122122
-shape['fDx2'], -shape['fDY'], shape['fDZ']
123123
];
124124
}
125-
else if (shape['_typename'] == "TGeoTrd2") {
125+
else if (shape._typename == "TGeoTrd2") {
126126
verticesOfShape = [
127127
-shape['fDx1'], shape['fDy1'], -shape['fDZ'],
128128
shape['fDx1'], shape['fDy1'], -shape['fDZ'],
@@ -232,9 +232,8 @@
232232
}
233233

234234
JSROOT.GEO.createTube = function( shape ) {
235-
236235
var outerRadius1, innerRadius1, outerRadius2, innerRadius2;
237-
if ((shape['_typename'] == "TGeoCone") || (shape['_typename'] == "TGeoConeSeg")) {
236+
if ((shape._typename == "TGeoCone") || (shape._typename == "TGeoConeSeg")) {
238237
outerRadius1 = shape['fRmax2'];
239238
innerRadius1 = shape['fRmin2'];
240239
outerRadius2 = shape['fRmax1'];
@@ -247,7 +246,7 @@
247246
if (innerRadius2 <= 0) innerRadius2 = 0.0000001;
248247

249248
var thetaStart = 0, thetaLength = 360;
250-
if ((shape['_typename'] == "TGeoConeSeg") || (shape['_typename'] == "TGeoTubeSeg") || (shape['_typename'] == "TGeoCtub")) {
249+
if ((shape._typename == "TGeoConeSeg") || (shape._typename == "TGeoTubeSeg") || (shape._typename == "TGeoCtub")) {
251250
thetaStart = shape['fPhi1'];
252251
thetaLength = shape['fPhi2'] - shape['fPhi1'];
253252
}
@@ -282,7 +281,6 @@
282281
for (var seg=0; seg<=radiusSegments; ++seg)
283282
geometry.vertices.push( new THREE.Vector3( outerRadius2*_cos[seg], outerRadius2*_sin[seg], -shape['fDZ']));
284283

285-
286284
// add inner tube faces
287285
for (var seg=0; seg<radiusSegments; ++seg) {
288286
geometry.faces.push( new THREE.Face3( seg, seg+radiusSegments+1, seg+1 ) );
@@ -318,11 +316,55 @@
318316

319317
geometry.computeFaceNormals();
320318

321-
// console.log(shape['_typename'] + ' vertices ' + geometry.vertices.length + ' faces ' + geometry.faces.length);
319+
// console.log(shape._typename + ' vertices ' + geometry.vertices.length + ' faces ' + geometry.faces.length);
322320

323321
return geometry;
324322
}
325323

324+
JSROOT.GEO.createEltu = function( shape ) {
325+
var geometry = new THREE.Geometry();
326+
327+
var radiusSegments = Math.floor(360/6);
328+
329+
// calculate all sin/cos tables in advance
330+
var x = new Float32Array(radiusSegments),
331+
y = new Float32Array(radiusSegments);
332+
for (var seg=0; seg<radiusSegments; ++seg) {
333+
var phi = seg/radiusSegments*2*Math.PI;
334+
x[seg] = shape.fRmin*Math.cos(phi);
335+
y[seg] = shape.fRmax*Math.sin(phi);
336+
}
337+
338+
// create vertices
339+
for (var seg=0; seg<radiusSegments; ++seg)
340+
geometry.vertices.push( new THREE.Vector3( x[seg], y[seg], -shape.fDZ));
341+
geometry.vertices.push( new THREE.Vector3( 0, 0, -shape.fDZ));
342+
343+
for (var seg=0; seg<radiusSegments; ++seg)
344+
geometry.vertices.push( new THREE.Vector3( x[seg], y[seg], +shape.fDZ));
345+
geometry.vertices.push( new THREE.Vector3( 0, 0, shape.fDZ));
346+
347+
// create tube faces
348+
for (var seg=0; seg<radiusSegments; ++seg) {
349+
var seg1 = (seg + 1) % radiusSegments;
350+
geometry.faces.push( new THREE.Face3( seg, seg+radiusSegments+1, seg1 ) );
351+
geometry.faces.push( new THREE.Face3( seg+radiusSegments+1, seg1+radiusSegments+1, seg1 ) );
352+
}
353+
354+
// create bottom cap
355+
for (var seg=0; seg<radiusSegments; ++seg)
356+
geometry.faces.push( new THREE.Face3( seg, (seg + 1) % radiusSegments, radiusSegments));
357+
358+
// create upper cap
359+
var shift = radiusSegments + 1;
360+
for (var seg=0; seg<radiusSegments; ++seg)
361+
geometry.faces.push( new THREE.Face3( shift+seg, shift+ (seg + 1) % radiusSegments, shift+radiusSegments));
362+
363+
geometry.computeFaceNormals();
364+
return geometry;
365+
}
366+
367+
326368
JSROOT.GEO.createTorus = function( shape ) {
327369
var radius = shape['fR'];
328370
var innerTube = shape['fRmin'];
@@ -391,7 +433,7 @@
391433
var thetaStart = shape['fPhi1'], thetaLength = shape['fDphi'];
392434

393435
var radiusSegments = 60;
394-
if ( shape['_typename'] == "TGeoPgon" ) {
436+
if ( shape._typename == "TGeoPgon" ) {
395437
radiusSegments = shape['fNedges'];
396438
} else {
397439
radiusSegments = Math.floor(thetaLength/6);
@@ -547,7 +589,7 @@
547589
if (! ('supported_shapes' in this))
548590
this.supported_shapes =
549591
[ "TGeoBBox", "TGeoPara", "TGeoArb8", "TGeoTrd1", "TGeoTrd2", "TGeoTrap", "TGeoGtra", "TGeoSphere",
550-
"TGeoCone", "TGeoConeSeg", "TGeoTube", "TGeoTubeSeg","TGeoTorus", "TGeoPcon", "TGeoPgon", "TGeoXtru" ];
592+
"TGeoCone", "TGeoConeSeg", "TGeoTube", "TGeoTubeSeg", "TGeoEltu", "TGeoTorus", "TGeoPcon", "TGeoPgon", "TGeoXtru" ];
551593
if (this.supported_shapes.indexOf(shape._typename) >= 0) return true;
552594

553595
if (!('unsupported_shapes' in this)) this.unsupported_shapes = [];
@@ -561,30 +603,33 @@
561603

562604
JSROOT.GEO.createGeometry = function( shape ) {
563605

564-
if (shape['_typename'] == "TGeoBBox")
606+
if (shape._typename == "TGeoBBox")
565607
return JSROOT.GEO.createCube( shape ); // Cube
566608

567-
if (shape['_typename'] == "TGeoPara")
609+
if (shape._typename == "TGeoPara")
568610
return JSROOT.GEO.createPara( shape ); // Parallelepiped
569611

570-
if ((shape['_typename'] == "TGeoArb8") || (shape['_typename'] == "TGeoTrd1") ||
571-
(shape['_typename'] == "TGeoTrd2") || (shape['_typename'] == "TGeoTrap") || (shape['_typename'] == "TGeoGtra"))
612+
if ((shape._typename == "TGeoArb8") || (shape._typename == "TGeoTrd1") ||
613+
(shape._typename == "TGeoTrd2") || (shape._typename == "TGeoTrap") || (shape._typename == "TGeoGtra"))
572614
return JSROOT.GEO.createTrapezoid( shape );
573615

574-
if ((shape['_typename'] == "TGeoSphere"))
616+
if ((shape._typename == "TGeoSphere"))
575617
return JSROOT.GEO.createSphere( shape );
576618

577-
if ((shape['_typename'] == "TGeoCone") || (shape['_typename'] == "TGeoConeSeg") ||
578-
(shape['_typename'] == "TGeoTube") || (shape['_typename'] == "TGeoTubeSeg"))
619+
if ((shape._typename == "TGeoCone") || (shape._typename == "TGeoConeSeg") ||
620+
(shape._typename == "TGeoTube") || (shape._typename == "TGeoTubeSeg"))
579621
return JSROOT.GEO.createTube( shape );
580622

581-
if (shape['_typename'] == "TGeoTorus")
623+
if (shape._typename == "TGeoEltu")
624+
return JSROOT.GEO.createEltu( shape );
625+
626+
if (shape._typename == "TGeoTorus")
582627
return JSROOT.GEO.createTorus( shape );
583628

584-
if ( shape['_typename'] == "TGeoPcon" || shape['_typename'] == "TGeoPgon" )
629+
if ( shape._typename == "TGeoPcon" || shape._typename == "TGeoPgon" )
585630
return JSROOT.GEO.createPolygon( shape );
586631

587-
if ( shape['_typename'] == "TGeoXtru")
632+
if ( shape._typename == "TGeoXtru")
588633
return JSROOT.GEO.createXtru(shape);
589634

590635
return null;

0 commit comments

Comments
 (0)