diff --git a/src/components/Armor/components/SpacedArmorSceneComponent/index.tsx b/src/components/Armor/components/SpacedArmorSceneComponent/index.tsx index c532bf6ba..be6ab51db 100644 --- a/src/components/Armor/components/SpacedArmorSceneComponent/index.tsx +++ b/src/components/Armor/components/SpacedArmorSceneComponent/index.tsx @@ -17,6 +17,7 @@ import { resolvePenetrationCoefficient } from '../../../../core/blitz/resolvePen import { hasEquipment } from '../../../../core/blitzkit/hasEquipment'; import { jsxTree } from '../../../../core/blitzkit/jsxTree'; import { ShellType } from '../../../../core/blitzkit/tankDefinitions'; +import { discardClippingPlane } from '../../../../core/three/discardClippingPlane'; import * as Duel from '../../../../stores/duel'; import * as TankopediaEphemeral from '../../../../stores/tankopediaEphemeral'; import { ArmorType } from '../SpacedArmorScene'; @@ -109,7 +110,9 @@ export function SpacedArmorSceneComponent({ resolvePenetrationCoefficient(hasCalibratedShells, shell.type); const thicknessCoefficient = hasEnhancedArmor ? 1.03 : 1; const filteredIntersections = intersections.filter( - (intersection) => 'type' in intersection.object.userData, + (intersection) => + 'type' in intersection.object.userData && + !discardClippingPlane(intersection.object, intersection.point), ) as unknown as Intersection[]; const encounteredExternalModuleVariants: ExternalModuleVariant[] = []; const noDuplicateIntersections: typeof filteredIntersections = []; diff --git a/src/components/Armor/components/StaticArmorSceneComponent.tsx b/src/components/Armor/components/StaticArmorSceneComponent.tsx index 2615b73d8..52fc81afb 100644 --- a/src/components/Armor/components/StaticArmorSceneComponent.tsx +++ b/src/components/Armor/components/StaticArmorSceneComponent.tsx @@ -14,6 +14,7 @@ import { Quaternion, } from 'three'; import { jsxTree } from '../../../core/blitzkit/jsxTree'; +import { discardClippingPlane } from '../../../core/three/discardClippingPlane'; import * as TankopediaEphemeral from '../../../stores/tankopediaEphemeral'; import { ThicknessRange } from '../../StaticArmor'; import { ArmorType } from './SpacedArmorScene'; @@ -166,6 +167,8 @@ export function StaticArmorSceneComponent({ } satisfies ArmorUserData, onClick(event) { + if (discardClippingPlane(event.object, event.point)) return; + event.stopPropagation(); const { editStatic } = tankopediaEphemeralStore.getState(); diff --git a/src/core/three/discardClippingPlane.ts b/src/core/three/discardClippingPlane.ts new file mode 100644 index 000000000..a6a62dd4a --- /dev/null +++ b/src/core/three/discardClippingPlane.ts @@ -0,0 +1,15 @@ +import { Material, Mesh, Object3D, Vector3 } from 'three'; + +export function discardClippingPlane(object: Object3D, point: Vector3) { + if ( + object instanceof Mesh && + object.material instanceof Material && + object.material.clippingPlanes !== null + ) { + return object.material.clippingPlanes.every( + (plane) => plane.distanceToPoint(point) < 0, + ); + } + + return false; +}