From 10bc8545c797ca9c5d0ddb74dcb128a8dd011206 Mon Sep 17 00:00:00 2001
From: Tom McCauley
Date: Thu, 28 Apr 2022 13:26:16 +0100
Subject: [PATCH 01/40] fix doc link and bump version
---
Default.htm | 2 +-
index.html | 2 +-
js/config.js | 2 +-
package.json | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/Default.htm b/Default.htm
index be209f6..1e81d91 100644
--- a/Default.htm
+++ b/Default.htm
@@ -412,7 +412,7 @@ iSpy-WebGL
Questions/comments/problems
- Documentation and FAQ
+ Documentation and FAQ
Code and
Issues
diff --git a/index.html b/index.html
index be209f6..1e81d91 100644
--- a/index.html
+++ b/index.html
@@ -412,7 +412,7 @@
iSpy-WebGL
Questions/comments/problems
- Documentation and FAQ
+ Documentation and FAQ
Code and
Issues
diff --git a/js/config.js b/js/config.js
index b3afd8a..8ec4106 100644
--- a/js/config.js
+++ b/js/config.js
@@ -1,6 +1,6 @@
var ispy = ispy || {};
ispy.detector = {"Collections":{}};
-ispy.version = "1.0.0-rc";
+ispy.version = "1.0.1-rc";
// These need to be defined before adding objects:
ispy.POINT = 0;
diff --git a/package.json b/package.json
index c9350ba..0e6e5b8 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ispy-webgl",
- "version": "1.0.0-rc",
+ "version": "1.0.1-rc",
"description": "A browser-based event display for the CMS experiment at the LHC, using WebGL",
"main": "",
"scripts": {
From 54ec46a811522720796fdc26fef87175791b1ccc Mon Sep 17 00:00:00 2001
From: Tom McCauley
Date: Fri, 29 Apr 2022 11:04:02 +0100
Subject: [PATCH 02/40] photons
* enable dashed line thickness control
* closes #170
---
js/objects-config.js | 4 ++--
js/objects-draw.js | 45 ++++++++++++++++++++++++++++++++++++--------
js/tree-view.js | 2 +-
3 files changed, 40 insertions(+), 11 deletions(-)
diff --git a/js/objects-config.js b/js/objects-config.js
index a93a0e3..5c99aae 100644
--- a/js/objects-config.js
+++ b/js/objects-config.js
@@ -468,11 +468,11 @@ ispy.event_description = {
},
"Photons_V1": {
type: ispy.SHAPE, on: false, group: "Physics", name: "Photons (Reco)",
- fn: ispy.makePhoton, style: {color: "rgb(100%, 80%, 0%)", opacity: 1.0, linewidth: 3}, selection: {"min_energy": 10.0}
+ fn: ispy.makePhoton, style: {color: "rgb(100%, 80%, 0%)", opacity: 1.0, linewidth: 2}, selection: {"min_energy": 10.0}
},
"PATPhotons_V1": {
type: ispy.SHAPE, on: false, group: "Physics", name: "Photons (PAT)",
- fn: ispy.makePhoton, style: {color: "rgb(100%, 80%, 0%)", opacity: 1.0, linewidth: 3}, selection: {"min_energy":10.0}
+ fn: ispy.makePhoton, style: {color: "rgb(100%, 80%, 0%)", opacity: 1.0, linewidth: 2}, selection: {"min_energy":10.0}
},
"GlobalMuons_V1": {
type: ispy.ASSOC, on: true, group: "Physics", name: "Global Muons (Reco)",
diff --git a/js/objects-draw.js b/js/objects-draw.js
index d6b5128..42aa6fb 100644
--- a/js/objects-draw.js
+++ b/js/objects-draw.js
@@ -900,6 +900,7 @@ ispy.makeGEM = function(gem) {
return ispy.makeWireframeBox(gem, 1);
};
+
ispy.makeMuonChamber = function(chamber) {
return ispy.makeSolidBox(chamber, 1);
@@ -1260,17 +1261,45 @@ ispy.makePhoton = function(data, style, selection) {
let color = new THREE.Color(style.color);
- const photon = new THREE.LineSegments(
- new THREE.BufferGeometry().setFromPoints(
- [pt1, pt2]
- ),
- new THREE.LineDashedMaterial({
+ var photon;
+
+ if ( ispy.use_line2 ) {
+
+ // For some reason LineDashedMaterial doesn't
+ // work for Line2 so use this material
+ const ldm = new THREE.LineMaterial({
color: color,
- scale: 1,
+ dashed: true,
+ linewidth: style.linewidth*0.001,
dashSize: 0.1,
gapSize: 0.1
- })
- );
+ });
+
+ ldm.defines.USE_DASH = "";
+ ldm.needsUpdate = true;
+
+ photon = new THREE.Line2(
+ new THREE.LineGeometry().setPositions(
+ [...pt1.toArray(), ...pt2.toArray()]
+ ),
+ ldm
+ );
+
+ } else {
+
+ photon = new THREE.LineSegments(
+ new THREE.BufferGeometry().setFromPoints(
+ [pt1, pt2]
+ ),
+ new THREE.LineDashedMaterial({
+ color: color,
+ scale: 1,
+ dashSize: 0.1,
+ gapSize: 0.1
+ })
+ );
+
+ }
photon.computeLineDistances();
photon.userData.energy = energy;
diff --git a/js/tree-view.js b/js/tree-view.js
index 780e358..a98e87e 100644
--- a/js/tree-view.js
+++ b/js/tree-view.js
@@ -212,7 +212,7 @@ ispy.addSelectionRow = function(group, key, name, objectIds, visible) {
if ( ispy.use_line2 ) {
- if ( key.includes('GlobalMuon') || key.includes('Electron') ) {
+ if ( key.includes('GlobalMuon') || key.includes('Electron') || key.includes('Photon') ) {
sf.add(row_obj, 'linewidth', 1, 5).onChange(function() {
From d92a948c0f994d4b95e13555caeb46df53ca660b Mon Sep 17 00:00:00 2001
From: Tom McCauley
Date: Thu, 30 Jun 2022 16:54:56 +0200
Subject: [PATCH 03/40] small fixes
---
js/objects-add.js | 3 ++-
js/objects-draw.js | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/js/objects-add.js b/js/objects-add.js
index 4865fe4..fef5e13 100644
--- a/js/objects-add.js
+++ b/js/objects-add.js
@@ -263,7 +263,8 @@ ispy.addEvent = function(event) {
color:ocolor,
transparent: transp,
opacity:descr.style.opacity,
- depthTest: false
+ depthTest: false,
+ depthWrite: false
});
solidbox_material.side = THREE.DoubleSide;
diff --git a/js/objects-draw.js b/js/objects-draw.js
index 42aa6fb..e841871 100644
--- a/js/objects-draw.js
+++ b/js/objects-draw.js
@@ -1167,7 +1167,7 @@ ispy.makeJetWithVertex = function(data, style, selection) {
let length2 = st ? maxR / Math.abs(st) : maxR;
let length = length1 < length2 ? length1 : length2;
let radius = 0.3 * (1.0 /(1 + 0.001));
-
+
// radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded
const geometry = new THREE.CylinderGeometry(
radius,
From d9c00e8e46095b4e0247e2292e5d5e931d23a9c7 Mon Sep 17 00:00:00 2001
From: Tom McCauley
Date: Fri, 1 Jul 2022 15:09:01 +0200
Subject: [PATCH 04/40] clipping planes and controls
* add clipping planes for xyz and controls using dat.GUI
* add toggle for show/hide controls
* closes #172
---
Default.htm | 4 ++
css/ispy.css | 12 ++++++
index.html | 4 ++
js/clipping-gui.js | 101 +++++++++++++++++++++++++++++++++++++++++++++
js/setup.js | 18 +++++++-
5 files changed, 137 insertions(+), 2 deletions(-)
create mode 100644 js/clipping-gui.js
diff --git a/Default.htm b/Default.htm
index 1e81d91..7905b1f 100644
--- a/Default.htm
+++ b/Default.htm
@@ -58,6 +58,7 @@
+
@@ -335,6 +336,9 @@ Settings
Invert colors:
+
+ Show clipping plane controls:
+
Hide axes:
diff --git a/css/ispy.css b/css/ispy.css
index 6eaab91..0c3b040 100644
--- a/css/ispy.css
+++ b/css/ispy.css
@@ -108,6 +108,18 @@ canvas.hover {
font-size: 14px;
}
+#clipgui {
+ position: absolute;
+ top:0;
+ left:65%;
+ z-index: 1002;
+ padding-top: 0px;
+ padding-right: 0px;
+ display: block;
+ font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
+ font-size: 14px;
+}
+
#toolbar {
float: left;
}
diff --git a/index.html b/index.html
index 1e81d91..7905b1f 100644
--- a/index.html
+++ b/index.html
@@ -58,6 +58,7 @@
+
@@ -335,6 +336,9 @@ Settings
Invert colors:
+
+ Show clipping plane controls:
+
Hide axes:
diff --git a/js/clipping-gui.js b/js/clipping-gui.js
new file mode 100644
index 0000000..5fb0032
--- /dev/null
+++ b/js/clipping-gui.js
@@ -0,0 +1,101 @@
+ispy.clipgui = new dat.GUI({
+ name: 'Clipping Controls',
+ hideable: false,
+ autoPlace: false
+});
+
+const planeX = ispy.clipgui.addFolder("planeX");
+const planeY = ispy.clipgui.addFolder("planeY");
+const planeZ = ispy.clipgui.addFolder("planeZ");
+
+const params = {
+
+ planeX: {
+
+ constant: 10,
+ negated: false,
+ displayHelper: false
+ },
+
+ planeY: {
+
+ constant: 10,
+ negated: false,
+ displayHelper: false
+
+ },
+
+ planeZ: {
+
+ constant: 30,
+ negated: false,
+ displayHelper: false
+
+ }
+
+};
+
+ispy.planes = [
+ new THREE.Plane( new THREE.Vector3(-1,0,0), params.planeX.constant),
+ new THREE.Plane( new THREE.Vector3(0,-1,0), params.planeY.constant),
+ new THREE.Plane( new THREE.Vector3(0,0,-1), params.planeZ.constant)
+];
+
+planeX.add(params.planeX, 'constant').min(-10).max(10).onChange(
+
+ d => ispy.planes[0].constant = d
+
+);
+
+planeX.add(params.planeX, 'negated').onChange(
+
+ () => {
+
+ ispy.planes[0].negate();
+ params.planeX.constant = ispy.planes[0].constant;
+
+ }
+
+);
+
+planeX.open();
+
+planeY.add(params.planeY, 'constant').min(-10).max(10).onChange(
+
+ d => ispy.planes[1].constant = d
+
+);
+
+planeY.add(params.planeY, 'negated').onChange(
+
+ () => {
+
+ ispy.planes[1].negate();
+ params.planeY.constant = ispy.planes[1].constant;
+
+ }
+
+);
+
+planeY.open();
+
+
+planeZ.add(params.planeZ, 'constant').min(-30).max(30).onChange(
+
+ d => ispy.planes[2].constant = d
+
+);
+
+planeZ.add(params.planeZ, 'negated').onChange(
+
+ () => {
+
+ ispy.planes[2].negate();
+ params.planeZ.constant = ispy.planes[2].constant;
+
+ }
+
+);
+
+planeZ.open();
+
diff --git a/js/setup.js b/js/setup.js
index 1841cfa..6dd89c4 100644
--- a/js/setup.js
+++ b/js/setup.js
@@ -147,7 +147,7 @@ ispy.init = function() {
}
});
-
+
ispy.treegui = new dat.GUI({
name: 'Tree View',
hideable: false,
@@ -156,13 +156,19 @@ ispy.init = function() {
ispy.treegui.domElement.id = 'treegui';
document.getElementById('titlebar').appendChild(ispy.treegui.domElement);
-
+
// It seems currently impossible with dat.gui
// to fetch the folders as an array and remove them
// (without knowing the name beforehand).
// Therefore we have to keep track of them by-hand.
ispy.subfolders = {};
+
+ ispy.clipgui.domElement.id = 'clipgui';
+ document.getElementById('titlebar').appendChild(ispy.clipgui.domElement);
+ $('#clipgui').hide();
+ ispy.renderer.clippingPlanes = ispy.planes;
+
ispy.inverted_colors = false;
$('#invert-colors').prop('checked', false);
@@ -232,6 +238,14 @@ ispy.init = function() {
ispy.use_line2 = this.checked ? true : false;
});
+
+ $('#clipping').prop('checked', false);
+
+ $('#clipping').change(function() {
+
+ this.checked ? $('#clipgui').show() : $('#clipgui').hide();
+
+ });
const font_loader = new THREE.FontLoader();
From 0ba8182933b7675bccab5e4d36daeaa48c320349 Mon Sep 17 00:00:00 2001
From: Tom McCauley
Date: Fri, 1 Jul 2022 17:14:09 +0200
Subject: [PATCH 05/40] test gui creation
---
js/clipping-gui.js | 6 ------
js/setup.js | 12 +++++++++---
2 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/js/clipping-gui.js b/js/clipping-gui.js
index 5fb0032..59145b6 100644
--- a/js/clipping-gui.js
+++ b/js/clipping-gui.js
@@ -1,9 +1,3 @@
-ispy.clipgui = new dat.GUI({
- name: 'Clipping Controls',
- hideable: false,
- autoPlace: false
-});
-
const planeX = ispy.clipgui.addFolder("planeX");
const planeY = ispy.clipgui.addFolder("planeY");
const planeZ = ispy.clipgui.addFolder("planeZ");
diff --git a/js/setup.js b/js/setup.js
index 6dd89c4..4a8fa34 100644
--- a/js/setup.js
+++ b/js/setup.js
@@ -162,11 +162,16 @@ ispy.init = function() {
// (without knowing the name beforehand).
// Therefore we have to keep track of them by-hand.
ispy.subfolders = {};
-
+
+ ispy.clipgui = new dat.GUI({
+ name: 'Clipping Controls',
+ hideable: false,
+ autoPlace: false
+ });
+
ispy.clipgui.domElement.id = 'clipgui';
document.getElementById('titlebar').appendChild(ispy.clipgui.domElement);
- $('#clipgui').hide();
-
+
ispy.renderer.clippingPlanes = ispy.planes;
ispy.inverted_colors = false;
@@ -239,6 +244,7 @@ ispy.init = function() {
});
+ $('#clipgui').hide();
$('#clipping').prop('checked', false);
$('#clipping').change(function() {
From a42925b7a86b52c2b540f1aa2b5121dc1dff4fc8 Mon Sep 17 00:00:00 2001
From: Tom McCauley
Date: Fri, 1 Jul 2022 17:34:03 +0200
Subject: [PATCH 06/40] all together now
---
Default.htm | 1 -
index.html | 1 -
js/clipping-gui.js | 95 ----------------------------------------------
js/setup.js | 62 ++++++++++++++++++++++++++++++
4 files changed, 62 insertions(+), 97 deletions(-)
delete mode 100644 js/clipping-gui.js
diff --git a/Default.htm b/Default.htm
index 7905b1f..408e747 100644
--- a/Default.htm
+++ b/Default.htm
@@ -58,7 +58,6 @@
-
diff --git a/index.html b/index.html
index 7905b1f..408e747 100644
--- a/index.html
+++ b/index.html
@@ -58,7 +58,6 @@
-
diff --git a/js/clipping-gui.js b/js/clipping-gui.js
deleted file mode 100644
index 59145b6..0000000
--- a/js/clipping-gui.js
+++ /dev/null
@@ -1,95 +0,0 @@
-const planeX = ispy.clipgui.addFolder("planeX");
-const planeY = ispy.clipgui.addFolder("planeY");
-const planeZ = ispy.clipgui.addFolder("planeZ");
-
-const params = {
-
- planeX: {
-
- constant: 10,
- negated: false,
- displayHelper: false
- },
-
- planeY: {
-
- constant: 10,
- negated: false,
- displayHelper: false
-
- },
-
- planeZ: {
-
- constant: 30,
- negated: false,
- displayHelper: false
-
- }
-
-};
-
-ispy.planes = [
- new THREE.Plane( new THREE.Vector3(-1,0,0), params.planeX.constant),
- new THREE.Plane( new THREE.Vector3(0,-1,0), params.planeY.constant),
- new THREE.Plane( new THREE.Vector3(0,0,-1), params.planeZ.constant)
-];
-
-planeX.add(params.planeX, 'constant').min(-10).max(10).onChange(
-
- d => ispy.planes[0].constant = d
-
-);
-
-planeX.add(params.planeX, 'negated').onChange(
-
- () => {
-
- ispy.planes[0].negate();
- params.planeX.constant = ispy.planes[0].constant;
-
- }
-
-);
-
-planeX.open();
-
-planeY.add(params.planeY, 'constant').min(-10).max(10).onChange(
-
- d => ispy.planes[1].constant = d
-
-);
-
-planeY.add(params.planeY, 'negated').onChange(
-
- () => {
-
- ispy.planes[1].negate();
- params.planeY.constant = ispy.planes[1].constant;
-
- }
-
-);
-
-planeY.open();
-
-
-planeZ.add(params.planeZ, 'constant').min(-30).max(30).onChange(
-
- d => ispy.planes[2].constant = d
-
-);
-
-planeZ.add(params.planeZ, 'negated').onChange(
-
- () => {
-
- ispy.planes[2].negate();
- params.planeZ.constant = ispy.planes[2].constant;
-
- }
-
-);
-
-planeZ.open();
-
diff --git a/js/setup.js b/js/setup.js
index 4a8fa34..37b5034 100644
--- a/js/setup.js
+++ b/js/setup.js
@@ -172,7 +172,69 @@ ispy.init = function() {
ispy.clipgui.domElement.id = 'clipgui';
document.getElementById('titlebar').appendChild(ispy.clipgui.domElement);
+ const planeX = ispy.clipgui.addFolder("planeX");
+ const planeY = ispy.clipgui.addFolder("planeY");
+ const planeZ = ispy.clipgui.addFolder("planeZ");
+
+ const clip_params = {
+
+ planeX: {
+ constant: 10,
+ negated: false
+ },
+
+ planeY: {
+ constant: 10,
+ negated: false
+ },
+
+ planeZ: {
+ constant: 30,
+ negated: false
+ }
+
+ };
+
+ ispy.planes = [
+ new THREE.Plane( new THREE.Vector3(-1,0,0), clip_params.planeX.constant),
+ new THREE.Plane( new THREE.Vector3(0,-1,0), clip_params.planeY.constant),
+ new THREE.Plane( new THREE.Vector3(0,0,-1), clip_params.planeZ.constant)
+ ];
+
ispy.renderer.clippingPlanes = ispy.planes;
+
+ planeX.add(clip_params.planeX, 'constant').min(-10).max(10).onChange(
+ d => ispy.planes[0].constant = d
+ );
+
+ planeX.add(clip_params.planeX, 'negated').onChange(() => {
+ ispy.planes[0].negate();
+ clip_params.planeX.constant = ispy.planes[0].constant;
+ });
+
+ planeX.open();
+
+ planeY.add(clip_params.planeY, 'constant').min(-10).max(10).onChange(
+ d => ispy.planes[1].constant = d
+ );
+
+ planeY.add(clip_params.planeY, 'negated').onChange(() => {
+ ispy.planes[1].negate();
+ clip_params.planeY.constant = ispy.planes[1].constant;
+ });
+
+ planeY.open();
+
+ planeZ.add(clip_params.planeZ, 'constant').min(-30).max(30).onChange(
+ d => ispy.planes[2].constant = d
+ );
+
+ planeZ.add(clip_params.planeZ, 'negated').onChange(() => {
+ ispy.planes[2].negate();
+ clip_params.planeZ.constant = ispy.planes[2].constant;
+ });
+
+ planeZ.open();
ispy.inverted_colors = false;
$('#invert-colors').prop('checked', false);
From 6fcd75b60922a5314754b66c0ac16ccffe6ba640 Mon Sep 17 00:00:00 2001
From: Tom McCauley
Date: Fri, 2 Sep 2022 15:32:29 +0100
Subject: [PATCH 07/40] local clipping
* add local clipping parameters to menu
* add handling of parameters in gui
* add clipping planes to approproate materials
* closes #175
---
js/files-load.js | 11 +++-
js/objects-add.js | 14 +++---
js/setup.js | 126 +++++++++++++++++++++++++++++++++++-----------
3 files changed, 116 insertions(+), 35 deletions(-)
diff --git a/js/files-load.js b/js/files-load.js
index 0460cc3..6677da9 100644
--- a/js/files-load.js
+++ b/js/files-load.js
@@ -714,6 +714,12 @@ ispy.loadSelectedGLTF = function() {
let object = gltf.scene.children[0];
+ object.children.forEach(function(c) {
+
+ c.material.clippingPlanes = ispy.local_planes;
+
+ });
+
ispy.scene.getObjectByName('Imported').add(object);
ispy.addSelectionRow('Imported', name, name, [], true);
@@ -762,6 +768,7 @@ ispy.loadOBJMTL_new = function(obj_file, mtl_file, id, name, group, show) {
c.material.transparent = true;
c.material.opacity = ispy.importTransparency;
+ c.material.clippingPlanes = ispy.local_planes;
});
@@ -984,7 +991,7 @@ ispy.importDetector = function() {
await function(gltf) {
let object = gltf.scene.children[0];
-
+
object.name = g.id;
object.visible = g.show;
@@ -994,6 +1001,8 @@ ispy.importDetector = function() {
c.renderOrder = 1;
+ c.material.clippingPlanes = ispy.local_planes;
+
});
ispy.disabled[object.name] = ! g.show;
diff --git a/js/objects-add.js b/js/objects-add.js
index fef5e13..1a48d74 100644
--- a/js/objects-add.js
+++ b/js/objects-add.js
@@ -35,11 +35,12 @@ ispy.addDetector = function() {
case ispy.BOX:
let box_material = new THREE.LineBasicMaterial({
- color:ocolor,
- transparent: transp,
- linewidth:descr.style.linewidth,
- depthWrite: false,
- opacity:descr.style.opacity
+ color:ocolor,
+ transparent: transp,
+ linewidth:descr.style.linewidth,
+ depthWrite: false,
+ opacity:descr.style.opacity,
+ clippingPlanes: ispy.local_planes
});
let box_geometries = [];
@@ -67,7 +68,8 @@ ispy.addDetector = function() {
color:ocolor,
transparent: transp,
opacity:descr.style.opacity,
- depthTest: false
+ depthTest: false,
+ clippingPlanes: ispy.local_planes
});
solidbox_material.side = THREE.DoubleSide;
diff --git a/js/setup.js b/js/setup.js
index 37b5034..ec85661 100644
--- a/js/setup.js
+++ b/js/setup.js
@@ -156,13 +156,15 @@ ispy.init = function() {
ispy.treegui.domElement.id = 'treegui';
document.getElementById('titlebar').appendChild(ispy.treegui.domElement);
-
+
// It seems currently impossible with dat.gui
// to fetch the folders as an array and remove them
// (without knowing the name beforehand).
// Therefore we have to keep track of them by-hand.
ispy.subfolders = {};
+ // Clipping stuff
+
ispy.clipgui = new dat.GUI({
name: 'Clipping Controls',
hideable: false,
@@ -172,11 +174,37 @@ ispy.init = function() {
ispy.clipgui.domElement.id = 'clipgui';
document.getElementById('titlebar').appendChild(ispy.clipgui.domElement);
- const planeX = ispy.clipgui.addFolder("planeX");
- const planeY = ispy.clipgui.addFolder("planeY");
- const planeZ = ispy.clipgui.addFolder("planeZ");
+ const localFolder = ispy.clipgui.addFolder("Local Clipping");
+ const globalFolder = ispy.clipgui.addFolder("Global Clipping");
+
+ const local_planeX = localFolder.addFolder("planeX");
+ const local_planeY = localFolder.addFolder("planeY");
+ const local_planeZ = localFolder.addFolder("planeZ");
+
+ const global_planeX = globalFolder.addFolder("planeX");
+ const global_planeY = globalFolder.addFolder("planeY");
+ const global_planeZ = globalFolder.addFolder("planeZ");
+
+ const local_params = {
+
+ planeX: {
+ constant: 10,
+ negated: false
+ },
+
+ planeY: {
+ constant: 10,
+ negated: false
+ },
+
+ planeZ: {
+ constant: 30,
+ negated: false
+ }
- const clip_params = {
+ };
+
+ const global_params = {
planeX: {
constant: 10,
@@ -195,47 +223,89 @@ ispy.init = function() {
};
- ispy.planes = [
- new THREE.Plane( new THREE.Vector3(-1,0,0), clip_params.planeX.constant),
- new THREE.Plane( new THREE.Vector3(0,-1,0), clip_params.planeY.constant),
- new THREE.Plane( new THREE.Vector3(0,0,-1), clip_params.planeZ.constant)
+ ispy.local_planes = [
+ new THREE.Plane( new THREE.Vector3(-1,0,0), local_params.planeX.constant),
+ new THREE.Plane( new THREE.Vector3(0,-1,0), local_params.planeY.constant),
+ new THREE.Plane( new THREE.Vector3(0,0,-1), local_params.planeZ.constant)
+ ];
+
+ ispy.global_planes = [
+ new THREE.Plane( new THREE.Vector3(-1,0,0), global_params.planeX.constant),
+ new THREE.Plane( new THREE.Vector3(0,-1,0), global_params.planeY.constant),
+ new THREE.Plane( new THREE.Vector3(0,0,-1), global_params.planeZ.constant)
];
- ispy.renderer.clippingPlanes = ispy.planes;
+ ispy.renderer.clippingPlanes = ispy.global_planes;
+ ispy.renderer.localClippingEnabled = true;
+
+ local_planeX.add(local_params.planeX, 'constant').min(-10).max(10).onChange(
+ d => ispy.local_planes[0].constant = d
+ );
+
+ local_planeX.add(local_params.planeX, 'negated').onChange(() => {
+ ispy.local_planes[0].negate();
+ local_params.planeX.constant = ispy.local_planes[0].constant;
+ });
+
+ local_planeX.open();
- planeX.add(clip_params.planeX, 'constant').min(-10).max(10).onChange(
- d => ispy.planes[0].constant = d
+ global_planeX.add(global_params.planeX, 'constant').min(-10).max(10).onChange(
+ d => ispy.global_planes[0].constant = d
);
- planeX.add(clip_params.planeX, 'negated').onChange(() => {
- ispy.planes[0].negate();
- clip_params.planeX.constant = ispy.planes[0].constant;
+ global_planeX.add(global_params.planeX, 'negated').onChange(() => {
+ ispy.global_planes[0].negate();
+ global_params.planeX.constant = ispy.global_planes[0].constant;
});
- planeX.open();
+ global_planeX.open();
+
+ local_planeY.add(local_params.planeY, 'constant').min(-10).max(10).onChange(
+ d => ispy.local_planes[1].constant = d
+ );
- planeY.add(clip_params.planeY, 'constant').min(-10).max(10).onChange(
- d => ispy.planes[1].constant = d
+ local_planeY.add(local_params.planeY, 'negated').onChange(() => {
+ ispy.local_planes[1].negate();
+ local_params.planeY.constant = ispy.local_planes[1].constant;
+ });
+
+ local_planeY.open();
+
+ global_planeY.add(global_params.planeY, 'constant').min(-10).max(10).onChange(
+ d => ispy.global_planes[1].constant = d
);
- planeY.add(clip_params.planeY, 'negated').onChange(() => {
- ispy.planes[1].negate();
- clip_params.planeY.constant = ispy.planes[1].constant;
+ global_planeY.add(global_params.planeY, 'negated').onChange(() => {
+ ispy.global_planes[1].negate();
+ global_params.planeY.constant = ispy.global_planes[1].constant;
});
- planeY.open();
+ global_planeY.open();
+
+ local_planeZ.add(local_params.planeZ, 'constant').min(-30).max(30).onChange(
+ d => ispy.local_planes[2].constant = d
+ );
- planeZ.add(clip_params.planeZ, 'constant').min(-30).max(30).onChange(
- d => ispy.planes[2].constant = d
+ local_planeZ.add(local_params.planeZ, 'negated').onChange(() => {
+ ispy.local_planes[2].negate();
+ local_params.planeZ.constant = ispy.local_planes[2].constant;
+ });
+
+ local_planeZ.open();
+
+ global_planeZ.add(global_params.planeZ, 'constant').min(-30).max(30).onChange(
+ d => ispy.global_planes[2].constant = d
);
- planeZ.add(clip_params.planeZ, 'negated').onChange(() => {
- ispy.planes[2].negate();
- clip_params.planeZ.constant = ispy.planes[2].constant;
+ global_planeZ.add(global_params.planeZ, 'negated').onChange(() => {
+ ispy.global_planes[2].negate();
+ global_params.planeZ.constant = ispy.global_planes[2].constant;
});
- planeZ.open();
+ global_planeZ.open();
+ // End of clipping stuff
+
ispy.inverted_colors = false;
$('#invert-colors').prop('checked', false);
From 6ee8adbfc3b16d417ed14f3daa2f414ea3f41609 Mon Sep 17 00:00:00 2001
From: Tom McCauley
Date: Fri, 30 Sep 2022 13:33:50 +0100
Subject: [PATCH 08/40] clamp MET length
---
js/objects-draw.js | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/js/objects-draw.js b/js/objects-draw.js
index e841871..d3b593b 100644
--- a/js/objects-draw.js
+++ b/js/objects-draw.js
@@ -1042,8 +1042,12 @@ ispy.makeMET = function(data, style, selection) {
const px = data[2];
const py = data[3];
+ let d = 1.45; // ECAL barrel radius
let length = pt*style.scale;
-
+
+ // Clamp length of MET
+ length = length+d > 5 ? 5 : length;
+
let dir = new THREE.Vector3(px,py,0);
dir.normalize();
@@ -1057,13 +1061,13 @@ ispy.makeMET = function(data, style, selection) {
met = ispy.makeArrowThick(
dir, origin,
length, color,
- 1.45 // displace out to ECAL barrel radius
+ d // displace out to ECAL barrel radius
);
} else {
origin.add(dir);
- origin.multiplyScalar(1.45);
+ origin.multiplyScalar(d); // see comment above
met = ispy.makeArrow(dir, origin, length, color);
From 56610fc8621b9626c2fcd0aab5d56ae73392c597 Mon Sep 17 00:00:00 2001
From: Tom McCauley
Date: Tue, 4 Oct 2022 15:05:11 +0100
Subject: [PATCH 09/40] start rphi and rpho views
* add geometries and load
* add buttons and functionality
---
geometry/gltf/RPhi.glb | Bin 0 -> 314864 bytes
geometry/gltf/RhoZ.glb | Bin 0 -> 839260 bytes
index.html | 54 ++++++++++++++++++++++++++---------------
js/controls.js | 50 ++++++++++++++++++++++----------------
js/files-load.js | 41 ++++++++++++++++++++++---------
5 files changed, 92 insertions(+), 53 deletions(-)
create mode 100644 geometry/gltf/RPhi.glb
create mode 100644 geometry/gltf/RhoZ.glb
diff --git a/geometry/gltf/RPhi.glb b/geometry/gltf/RPhi.glb
new file mode 100644
index 0000000000000000000000000000000000000000..19f6d8857b92a74a6f3297380f198e431d7775b6
GIT binary patch
literal 314864
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 |