From 0ece9b965c806b82365f24cd77fb513b894b1068 Mon Sep 17 00:00:00 2001
From: martinRenou <martin.renou@gmail.com>
Date: Mon, 25 Nov 2024 18:11:46 +0100
Subject: [PATCH 1/4] Show selection in transparency for non-visible objects

---
 packages/base/src/3dview/helpers.ts   |  3 +++
 packages/base/src/3dview/mainview.tsx | 34 ++++++++++++++++++++-------
 2 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/packages/base/src/3dview/helpers.ts b/packages/base/src/3dview/helpers.ts
index af5dd17f8..9c75f941f 100644
--- a/packages/base/src/3dview/helpers.ts
+++ b/packages/base/src/3dview/helpers.ts
@@ -190,6 +190,9 @@ export function buildShape(options: {
   const meshGroup = new THREE.Group();
   meshGroup.name = `${objName}-group`;
   meshGroup.visible = visible;
+  meshGroup.userData = {
+    visible
+  };
 
   // We only build the stencil logic for solid meshes
   if (isSolid) {
diff --git a/packages/base/src/3dview/mainview.tsx b/packages/base/src/3dview/mainview.tsx
index f3cfe8020..f73d5dd73 100644
--- a/packages/base/src/3dview/mainview.tsx
+++ b/packages/base/src/3dview/mainview.tsx
@@ -781,7 +781,7 @@ export class MainView extends React.Component<IProps, IStates> {
 
       if (output) {
         const { meshGroup, mainMesh, edgesMeshes } = output;
-        if (meshGroup.visible) {
+        if (meshGroup.userData.visible) {
           this._boundingGroup.expandByObject(mainMesh);
         }
 
@@ -844,6 +844,11 @@ export class MainView extends React.Component<IProps, IStates> {
         this._meshGroup?.add(meshGroup);
       }
 
+      const localState = this._model.localState;
+      if (localState?.selected?.value) {
+        this._updateSelected(localState.selected.value);
+      }
+
       this._updateTransformControls(selectedNames);
     });
 
@@ -947,7 +952,6 @@ export class MainView extends React.Component<IProps, IStates> {
     const wireframe = new THREE.LineSegments(lineGeo, mat);
     mesh.add(wireframe);
     mesh.name = name;
-    mesh.visible = true;
     if (this._meshGroup) {
       this._meshGroup.add(mesh);
       this._boundingGroup?.expandByObject(mesh);
@@ -1106,14 +1110,21 @@ export class MainView extends React.Component<IProps, IStates> {
 
       const parentGroup = this._meshGroup?.getObjectByName(
         selectedMesh.name
-      )?.parent;
+      )?.parent as THREE.Group;
       const boundingBox = parentGroup?.getObjectByName(
         SELECTION_BOUNDING_BOX
       ) as THREE.Mesh;
+
       if (boundingBox) {
         boundingBox.visible = false;
       }
 
+      if (!parentGroup.userData.visible) {
+        parentGroup.visible = false;
+        selectedMesh.material.opacity = 1;
+        selectedMesh.material.transparent = false;
+      }
+
       const material = selectedMesh.material as THREE.Material & {
         linewidth?: number;
       };
@@ -1131,10 +1142,12 @@ export class MainView extends React.Component<IProps, IStates> {
         selectionName
       ) as BasicMesh;
 
-      if (!selectedMesh || !selectedMesh.visible) {
+      if (!selectedMesh) {
         continue;
       }
 
+      this._selectedMeshes.push(selectedMesh);
+
       if (selectedMesh.name.startsWith('edge')) {
         // Highlight edges using the old method
         if (!selectedMesh.userData.originalColor) {
@@ -1142,7 +1155,6 @@ export class MainView extends React.Component<IProps, IStates> {
             selectedMesh.material.color.clone();
         }
 
-        this._selectedMeshes.push(selectedMesh);
         if (selectedMesh?.material?.color) {
           selectedMesh.material.color = BOUNDING_BOX_COLOR;
         }
@@ -1155,11 +1167,16 @@ export class MainView extends React.Component<IProps, IStates> {
         }
       } else {
         // Highlight non-edges using a bounding box
-        this._selectedMeshes.push(selectedMesh);
-
         const parentGroup = this._meshGroup?.getObjectByName(
           selectedMesh.name
-        )?.parent;
+        )?.parent as THREE.Group;
+
+        if (!parentGroup.userData.visible) {
+          parentGroup.visible = true;
+          selectedMesh.material.opacity = 0.5;
+          selectedMesh.material.transparent = true;
+        }
+
         const boundingBox = parentGroup?.getObjectByName(
           SELECTION_BOUNDING_BOX
         ) as THREE.Mesh;
@@ -1377,6 +1394,7 @@ export class MainView extends React.Component<IProps, IStates> {
         const objColor = obj?.material.color;
 
         obj.parent!.visible = isVisible;
+        obj.parent!.userData.visible = isVisible;
 
         const explodedLineHelper =
           this._explodedViewLinesHelperGroup?.getObjectByName(objName);

From 88a29359cb073e1d5ee52bdc8f84d5bc190bb2e0 Mon Sep 17 00:00:00 2001
From: martinRenou <martin.renou@gmail.com>
Date: Mon, 25 Nov 2024 18:25:39 +0100
Subject: [PATCH 2/4] Fix initial upon transparency

---
 packages/base/src/3dview/mainview.tsx | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/packages/base/src/3dview/mainview.tsx b/packages/base/src/3dview/mainview.tsx
index f73d5dd73..0d0571e69 100644
--- a/packages/base/src/3dview/mainview.tsx
+++ b/packages/base/src/3dview/mainview.tsx
@@ -804,6 +804,12 @@ export class MainView extends React.Component<IProps, IStates> {
             boundingBox.visible = true;
           }
 
+          if (!meshGroup.userData.visible) {
+            meshGroup.visible = true;
+            mainMesh.material.opacity = 0.5;
+            mainMesh.material.transparent = true;
+          }
+
           this._selectedMeshes.push(mainMesh);
         }
         edgesMeshes.forEach(el => {
@@ -844,11 +850,6 @@ export class MainView extends React.Component<IProps, IStates> {
         this._meshGroup?.add(meshGroup);
       }
 
-      const localState = this._model.localState;
-      if (localState?.selected?.value) {
-        this._updateSelected(localState.selected.value);
-      }
-
       this._updateTransformControls(selectedNames);
     });
 

From ca1d0d15114cc7ca91586fe5d348373689bf3625 Mon Sep 17 00:00:00 2001
From: martinRenou <martin.renou@gmail.com>
Date: Mon, 25 Nov 2024 18:39:12 +0100
Subject: [PATCH 3/4] Store jcObject in userData

---
 packages/base/src/3dview/helpers.ts   | 2 +-
 packages/base/src/3dview/mainview.tsx | 8 ++++----
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/packages/base/src/3dview/helpers.ts b/packages/base/src/3dview/helpers.ts
index 9c75f941f..393cdc3e8 100644
--- a/packages/base/src/3dview/helpers.ts
+++ b/packages/base/src/3dview/helpers.ts
@@ -191,7 +191,7 @@ export function buildShape(options: {
   meshGroup.name = `${objName}-group`;
   meshGroup.visible = visible;
   meshGroup.userData = {
-    visible
+    jcObject
   };
 
   // We only build the stencil logic for solid meshes
diff --git a/packages/base/src/3dview/mainview.tsx b/packages/base/src/3dview/mainview.tsx
index 0d0571e69..49febf555 100644
--- a/packages/base/src/3dview/mainview.tsx
+++ b/packages/base/src/3dview/mainview.tsx
@@ -781,7 +781,7 @@ export class MainView extends React.Component<IProps, IStates> {
 
       if (output) {
         const { meshGroup, mainMesh, edgesMeshes } = output;
-        if (meshGroup.userData.visible) {
+        if (meshGroup.userData.jcObject.visible) {
           this._boundingGroup.expandByObject(mainMesh);
         }
 
@@ -804,7 +804,7 @@ export class MainView extends React.Component<IProps, IStates> {
             boundingBox.visible = true;
           }
 
-          if (!meshGroup.userData.visible) {
+          if (!meshGroup.userData.jcObject.visible) {
             meshGroup.visible = true;
             mainMesh.material.opacity = 0.5;
             mainMesh.material.transparent = true;
@@ -1120,7 +1120,7 @@ export class MainView extends React.Component<IProps, IStates> {
         boundingBox.visible = false;
       }
 
-      if (!parentGroup.userData.visible) {
+      if (!parentGroup.userData.jcObject.visible) {
         parentGroup.visible = false;
         selectedMesh.material.opacity = 1;
         selectedMesh.material.transparent = false;
@@ -1172,7 +1172,7 @@ export class MainView extends React.Component<IProps, IStates> {
           selectedMesh.name
         )?.parent as THREE.Group;
 
-        if (!parentGroup.userData.visible) {
+        if (!parentGroup.userData.jcObject.visible) {
           parentGroup.visible = true;
           selectedMesh.material.opacity = 0.5;
           selectedMesh.material.transparent = true;

From b10769889a2dba10c28ea372b0f4d3e8a8db02b2 Mon Sep 17 00:00:00 2001
From: "pre-commit-ci[bot]"
 <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Date: Mon, 25 Nov 2024 17:39:45 +0000
Subject: [PATCH 4/4] [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci
---
 packages/base/src/3dview/mainview.tsx | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/packages/base/src/3dview/mainview.tsx b/packages/base/src/3dview/mainview.tsx
index 49febf555..74d1a12eb 100644
--- a/packages/base/src/3dview/mainview.tsx
+++ b/packages/base/src/3dview/mainview.tsx
@@ -1109,9 +1109,8 @@ export class MainView extends React.Component<IProps, IStates> {
         selectedMesh.material.color = originalColor;
       }
 
-      const parentGroup = this._meshGroup?.getObjectByName(
-        selectedMesh.name
-      )?.parent as THREE.Group;
+      const parentGroup = this._meshGroup?.getObjectByName(selectedMesh.name)
+        ?.parent as THREE.Group;
       const boundingBox = parentGroup?.getObjectByName(
         SELECTION_BOUNDING_BOX
       ) as THREE.Mesh;
@@ -1168,9 +1167,8 @@ export class MainView extends React.Component<IProps, IStates> {
         }
       } else {
         // Highlight non-edges using a bounding box
-        const parentGroup = this._meshGroup?.getObjectByName(
-          selectedMesh.name
-        )?.parent as THREE.Group;
+        const parentGroup = this._meshGroup?.getObjectByName(selectedMesh.name)
+          ?.parent as THREE.Group;
 
         if (!parentGroup.userData.jcObject.visible) {
           parentGroup.visible = true;