Skip to content

Commit fdb869a

Browse files
committed
Disable hover effects by default to improve performance
1 parent beb173d commit fdb869a

File tree

8 files changed

+72
-34
lines changed

8 files changed

+72
-34
lines changed

src/components/visualization/rendering/popups/popup-coordinator.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ export default function PopupCoordinator({
240240
onPointerOut={onPointerOut}
241241
ref={element}
242242
>
243-
{popupData.wasMoved ? (
243+
{popupData.wasMoved || popupData.isPinned ? (
244244
<>
245245
<OverlayTrigger
246246
placement="top"

src/hooks/interaction-modifier.ts

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { MutableRefObject, useEffect, useRef } from 'react';
33
import { useCollaborationSessionStore } from 'explorviz-frontend/src/stores/collaboration/collaboration-session';
44
import { useLocalUserStore } from 'explorviz-frontend/src/stores/collaboration/local-user';
55
import { useMinimapStore } from 'explorviz-frontend/src/stores/minimap-service';
6+
import { useUserSettingsStore } from 'explorviz-frontend/src/stores/user-settings';
67
import RemoteUser from 'explorviz-frontend/src/utils/collaboration/remote-user';
78
import Raycaster from 'explorviz-frontend/src/utils/raycaster';
89
import * as THREE from 'three';
@@ -70,6 +71,10 @@ export default function useInteractionModifier(
7071
}))
7172
);
7273

74+
const enableHoverEffects = useUserSettingsStore(
75+
(state) => state.visualizationSettings.enableHoverEffects.value
76+
);
77+
7378
// MARK: Refs
7479

7580
const raycaster = useRef<Raycaster>(new Raycaster(minimapCamera));
@@ -185,15 +190,25 @@ export default function useInteractionModifier(
185190
} else if (pointers.current.length === 1) {
186191
handleMouseMovePan(event);
187192
} else if (makeFullsizeMinimap) {
188-
const intersectedViewObj = minimapActions.raycastForObjects(
189-
event,
190-
minimapCamera,
191-
raycastObjects
192-
);
193-
eventCallbacks?.onMouseMove?.(intersectedViewObj, event);
193+
// Skip raycasting for hover when hover effects are disabled
194+
if (enableHoverEffects) {
195+
const intersectedViewObj = minimapActions.raycastForObjects(
196+
event,
197+
minimapCamera,
198+
raycastObjects
199+
);
200+
eventCallbacks?.onMouseMove?.(intersectedViewObj, event);
201+
} else {
202+
eventCallbacks?.onMouseMove?.(null, event);
203+
}
194204
} else {
195-
const intersectedViewObj = raycast(event);
196-
eventCallbacks?.onMouseMove?.(intersectedViewObj, event);
205+
// Skip raycasting for hover when hover effects are disabled
206+
if (enableHoverEffects) {
207+
const intersectedViewObj = raycast(event);
208+
eventCallbacks?.onMouseMove?.(intersectedViewObj, event);
209+
} else {
210+
eventCallbacks?.onMouseMove?.(null, event);
211+
}
197212
}
198213
};
199214

@@ -207,6 +222,10 @@ export default function useInteractionModifier(
207222
if (pointers.current.length > 0) {
208223
return;
209224
}
225+
// Skip raycasting for hover when hover effects are disabled
226+
if (!enableHoverEffects) {
227+
return;
228+
}
210229
const event = customEvent.detail.srcEvent;
211230

212231
const intersectedViewObj = raycast(event);
@@ -636,7 +655,13 @@ export default function useInteractionModifier(
636655
document.removeEventListener('keydown', keyDown);
637656
document.removeEventListener('keyup', keyUp);
638657
};
639-
}, [camera, objectsToRaycast, minimapCamera, makeFullsizeMinimap]);
658+
}, [
659+
camera,
660+
objectsToRaycast,
661+
minimapCamera,
662+
makeFullsizeMinimap,
663+
enableHoverEffects,
664+
]);
640665
}
641666

642667
// MARK: Types

src/utils/settings/default-settings.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ export const defaultVizSettings: VisualizationSettings = {
342342
},
343343
enableHoverEffects: {
344344
level: SettingLevel.DEFAULT,
345-
value: true,
345+
value: false,
346346
group: 'Effects',
347347
displayName: 'Enable Hover Effect',
348348
description: 'Hover effect (flashing entities) for mouse cursor',

src/view-objects/3d/application/city-districts.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -514,8 +514,10 @@ const CityDistricts = forwardRef<InstancedMesh2, Args>(
514514
castShadow={castShadows}
515515
args={[geometry, material]}
516516
onClick={handleClickWithPrevent}
517-
onPointerOver={handleOnPointerOver}
518-
onPointerOut={handleOnPointerOut}
517+
{...(enableHoverEffects && {
518+
onPointerOver: handleOnPointerOver,
519+
onPointerOut: handleOnPointerOut,
520+
})}
519521
onDoubleClick={handleDoubleClickWithPrevent}
520522
{...pointerStopHandlers}
521523
frustumCulled={false}

src/view-objects/3d/application/city-foundation.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -116,14 +116,12 @@ export default function CityFoundation({
116116

117117
const handleOnPointerOver = (event: any) => {
118118
event.stopPropagation();
119-
if (enableHoverEffects) {
120119
setHoveredEntityId(application.id);
121-
}
122120
};
123121

124122
const handleOnPointerOut = (event: any) => {
125123
event.stopPropagation();
126-
setHoveredEntityId(null);
124+
setHoveredEntityId(null);
127125
};
128126

129127
const handleClick = (/*event: any*/) => {
@@ -173,8 +171,10 @@ export default function CityFoundation({
173171
position={foundationPosition} // Center around application's position
174172
onClick={handleClickWithPrevent}
175173
onDoubleClick={handleDoubleClickWithPrevent}
176-
onPointerOver={handleOnPointerOver}
177-
onPointerOut={handleOnPointerOut}
174+
{...(enableHoverEffects && {
175+
onPointerOver: handleOnPointerOver,
176+
onPointerOut: handleOnPointerOut,
177+
})}
178178
{...pointerStopHandlers}
179179
>
180180
<meshLambertMaterial color={computeColor()} />

src/view-objects/3d/application/code-buildings.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -479,8 +479,10 @@ const CodeBuildings = forwardRef<InstancedMesh2, Args>(
479479
ref={meshRef}
480480
args={[geometry, material]}
481481
onClick={handleClickWithPrevent}
482-
onPointerOver={handleOnPointerOver}
483-
onPointerOut={handleOnPointerOut}
482+
{...(enableHoverEffects && {
483+
onPointerOver: handleOnPointerOver,
484+
onPointerOut: handleOnPointerOut,
485+
})}
484486
onDoubleClick={handleDoubleClickWithPrevent}
485487
{...pointerStopHandlers}
486488
frustumCulled={false}

src/view-objects/3d/application/communication-r3f.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -674,8 +674,10 @@ export default function CommunicationR3F({
674674
<clazzCommunicationMesh
675675
key={`${enableEdgeBundling}-${use3DHAPAlgorithm}`}
676676
{...pointerStopHandlers}
677-
onPointerOver={handleOnPointerOver}
678-
onPointerOut={handleOnPointerOut}
677+
{...(enableHoverEffects && {
678+
onPointerOver: handleOnPointerOver,
679+
onPointerOut: handleOnPointerOut,
680+
})}
679681
onClick={handleClickWithPrevent}
680682
onDoubleClick={handleDoubleClickWithPrevent}
681683
args={constructorArgs}

src/view-objects/3d/application/html-dom-box.tsx

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { ThreeEvent } from '@react-three/fiber';
33
import { usePointerStop } from 'explorviz-frontend/src/hooks/pointer-stop';
44
import useClickPreventionOnDoubleClick from 'explorviz-frontend/src/hooks/useClickPreventionOnDoubleClick';
55
import { usePopupHandlerStore } from 'explorviz-frontend/src/stores/popup-handler';
6+
import { useUserSettingsStore } from 'explorviz-frontend/src/stores/user-settings';
67
import { BoxData } from 'explorviz-frontend/src/view-objects/3d/application/html-visualizer';
78
import { useRef, useState } from 'react';
89
import { useShallow } from 'zustand/react/shallow';
@@ -35,6 +36,10 @@ export default function HtmlDomBox({
3536
}))
3637
);
3738

39+
const enableHoverEffects = useUserSettingsStore(
40+
(state) => state.visualizationSettings.enableHoverEffects.value
41+
);
42+
3843
const handlePointerStop = (event: ThreeEvent<PointerEvent>) => {
3944
addPopup({
4045
mesh: meshRef.current,
@@ -68,18 +73,20 @@ export default function HtmlDomBox({
6873
position={[300, 218, 0]}
6974
intersectChildren={false}
7075
visible={visible}
71-
onPointerOver={(event) => {
72-
if (visible) {
73-
event.stopPropagation();
74-
setHovered(true);
75-
}
76-
}}
77-
onPointerOut={(event) => {
78-
if (visible) {
79-
event.stopPropagation();
80-
}
81-
setHovered(false);
82-
}}
76+
{...(enableHoverEffects && {
77+
onPointerOver: (event) => {
78+
if (visible) {
79+
event.stopPropagation();
80+
setHovered(true);
81+
}
82+
},
83+
onPointerOut: (event) => {
84+
if (visible) {
85+
event.stopPropagation();
86+
}
87+
setHovered(false);
88+
},
89+
})}
8390
onClick={handleClickWithPrevent}
8491
onDoubleClick={handleDoubleClickWithPrevent}
8592
ref={meshRef}

0 commit comments

Comments
 (0)