@@ -329,6 +329,7 @@ const props = withDefaults(defineProps<{
|
||||
initialView?: ViewMode
|
||||
showControls?: boolean
|
||||
showPoi?: boolean
|
||||
visiblePoiIds?: string[] | null
|
||||
targetFocus?: TargetPoiFocusRequest | null
|
||||
touchGestureMode?: TouchGestureMode
|
||||
targetFocusDistanceFactor?: number
|
||||
@@ -345,6 +346,7 @@ const props = withDefaults(defineProps<{
|
||||
initialView: 'overview',
|
||||
showControls: true,
|
||||
showPoi: false,
|
||||
visiblePoiIds: null,
|
||||
targetFocus: null,
|
||||
touchGestureMode: 'pan',
|
||||
targetFocusDistanceFactor: 0.36,
|
||||
@@ -395,7 +397,21 @@ const floors = computed<FloorOption[]>(() => (
|
||||
label: formatFloorLabel(floor.floorId)
|
||||
}))
|
||||
))
|
||||
const shouldRenderPoiMarkers = computed(() => props.showPoi || props.showControls || Boolean(props.targetFocus))
|
||||
const shouldRenderPoiMarkers = computed(() => (
|
||||
props.showPoi
|
||||
|| props.showControls
|
||||
|| props.visiblePoiIds !== null
|
||||
|| Boolean(props.targetFocus)
|
||||
))
|
||||
const visiblePoiIdFilter = computed(() => (
|
||||
props.visiblePoiIds === null
|
||||
? null
|
||||
: new Set(props.visiblePoiIds)
|
||||
))
|
||||
|
||||
const isPoiIncludedByVisibleFilter = (poi: RenderPoi) => (
|
||||
visiblePoiIdFilter.value === null || visiblePoiIdFilter.value.has(poi.id)
|
||||
)
|
||||
|
||||
let scene: THREE.Scene | null = null
|
||||
let camera: THREE.PerspectiveCamera | null = null
|
||||
@@ -1480,8 +1496,28 @@ const updatePoiVisibilityByDistance = () => {
|
||||
.sort((a, b) => (b.poi ? getPoiPriority(b.poi) : 0) - (a.poi ? getPoiPriority(a.poi) : 0))
|
||||
|
||||
candidates.forEach(({ sprite, poi, screenPosition }) => {
|
||||
if (!poi) {
|
||||
if (!poi || !isPoiIncludedByVisibleFilter(poi)) {
|
||||
sprite.visible = false
|
||||
const hitTarget = getPoiSpriteUserData(sprite).hitTarget
|
||||
const labelSprite = getPoiSpriteUserData(sprite).labelSprite
|
||||
if (hitTarget) {
|
||||
hitTarget.visible = false
|
||||
}
|
||||
if (labelSprite) {
|
||||
labelSprite.visible = false
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// 分类结果模式直接展示列表对应点位,避免密度策略再次裁剪结果。
|
||||
if (visiblePoiIdFilter.value !== null) {
|
||||
sprite.visible = true
|
||||
const hitTarget = getPoiSpriteUserData(sprite).hitTarget
|
||||
if (hitTarget) {
|
||||
hitTarget.visible = true
|
||||
}
|
||||
acceptedPositions.push(screenPosition)
|
||||
visibleCount += 1
|
||||
return
|
||||
}
|
||||
|
||||
@@ -2182,7 +2218,12 @@ const getPoiHitTargets = () => {
|
||||
const sprites: THREE.Sprite[] = []
|
||||
|
||||
poiGroup?.traverse((child) => {
|
||||
if (isPoiHitTargetSprite(child)) {
|
||||
const poi = child.userData.poi as RenderPoi | undefined
|
||||
if (
|
||||
isPoiHitTargetSprite(child)
|
||||
&& child.visible
|
||||
&& Boolean(poi && isPoiIncludedByVisibleFilter(poi))
|
||||
) {
|
||||
sprites.push(child)
|
||||
}
|
||||
})
|
||||
@@ -4513,7 +4554,11 @@ const createPoiMarkerGroup = (
|
||||
labelSprite.position.copy(getPoiAmbientLabelPosition(displayPosition, markerSize))
|
||||
labelSprite.visible = false
|
||||
}
|
||||
sprite.visible = shouldShowPoiAtDistance(poi, getPoiVisibilityTier())
|
||||
sprite.visible = isPoiIncludedByVisibleFilter(poi)
|
||||
&& (
|
||||
visiblePoiIdFilter.value !== null
|
||||
|| shouldShowPoiAtDistance(poi, getPoiVisibilityTier())
|
||||
)
|
||||
hitTarget.visible = sprite.visible
|
||||
group.add(sprite)
|
||||
group.add(hitTarget)
|
||||
@@ -5294,6 +5339,12 @@ watch(() => props.targetFocus, (request) => {
|
||||
immediate: true
|
||||
})
|
||||
|
||||
watch(() => props.visiblePoiIds, () => {
|
||||
refreshPoiVisibilityByDistance()
|
||||
}, {
|
||||
deep: true
|
||||
})
|
||||
|
||||
watch(() => [props.routePreview, props.showRoute], () => {
|
||||
renderRoutePreview()
|
||||
}, {
|
||||
|
||||
Reference in New Issue
Block a user