Merge remote-tracking branch 'origin/main' into fix/fri-8-may
# Conflicts: # packages/editor/src/components/tools/fence/move-fence-endpoint-tool.tsx # packages/editor/src/components/tools/select/box-select-tool.tsx # packages/editor/src/components/tools/wall/move-wall-tool.tsx # packages/editor/src/components/ui/panels/column-panel.tsx # packages/editor/src/components/ui/panels/door-panel.tsx # packages/editor/src/components/ui/panels/window-panel.tsx # packages/viewer/src/components/renderers/column/column-renderer.tsx # packages/viewer/src/components/viewer/index.tsx # packages/viewer/src/systems/slab/slab-system.tsx
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
import {
|
||||
getMaterialPresetByRef,
|
||||
type MaterialMapProperties,
|
||||
type MaterialPresetPayload,
|
||||
type MaterialProperties,
|
||||
type MaterialSchema,
|
||||
getMaterialPresetByRef,
|
||||
resolveMaterial,
|
||||
} from '@pascal-app/core'
|
||||
import * as THREE from 'three'
|
||||
@@ -90,8 +90,7 @@ function getTexture(material?: MaterialSchema): THREE.Texture | undefined {
|
||||
|
||||
function isStandardMaterial(material: THREE.Material): material is StandardMaterial {
|
||||
return (
|
||||
material instanceof THREE.MeshStandardMaterial ||
|
||||
material instanceof THREE.MeshPhysicalMaterial
|
||||
material instanceof THREE.MeshStandardMaterial || material instanceof THREE.MeshPhysicalMaterial
|
||||
)
|
||||
}
|
||||
|
||||
@@ -112,11 +111,19 @@ function applyTextureProperties(
|
||||
return texture
|
||||
}
|
||||
|
||||
function getPresetTextureCacheKey(path: string, props: MaterialMapProperties, slot?: TextureSlot): string {
|
||||
function getPresetTextureCacheKey(
|
||||
path: string,
|
||||
props: MaterialMapProperties,
|
||||
slot?: TextureSlot,
|
||||
): string {
|
||||
return `${path}-${props.repeatX}-${props.repeatY}-${props.rotation}-${props.wrapS}-${props.wrapT}-${props.flipY}-${slot ?? 'map'}`
|
||||
}
|
||||
|
||||
function getPresetTexture(path: string, props: MaterialMapProperties, slot?: TextureSlot): THREE.Texture {
|
||||
function getPresetTexture(
|
||||
path: string,
|
||||
props: MaterialMapProperties,
|
||||
slot?: TextureSlot,
|
||||
): THREE.Texture {
|
||||
const cacheKey = getPresetTextureCacheKey(path, props, slot)
|
||||
const cached = textureCache.get(cacheKey)
|
||||
if (cached) return cached
|
||||
@@ -177,14 +184,17 @@ function queueTextureAssignment(
|
||||
|
||||
material[slot] = null
|
||||
|
||||
void loadPresetTexture(path, props, slot).then((texture) => {
|
||||
loadPresetTexture(path, props, slot).then((texture) => {
|
||||
if (!texture) return
|
||||
material[slot] = texture
|
||||
material.needsUpdate = true
|
||||
})
|
||||
}
|
||||
|
||||
function applyMaterialMapProperties(material: StandardMaterial, mapProperties: MaterialMapProperties) {
|
||||
function applyMaterialMapProperties(
|
||||
material: StandardMaterial,
|
||||
mapProperties: MaterialMapProperties,
|
||||
) {
|
||||
material.color.set(mapProperties.color)
|
||||
material.roughness = mapProperties.roughness
|
||||
material.metalness = mapProperties.metalness
|
||||
@@ -206,10 +216,7 @@ function applyMaterialMapProperties(material: StandardMaterial, mapProperties: M
|
||||
material.needsUpdate = true
|
||||
}
|
||||
|
||||
function applyMaterialPresetTextures(
|
||||
material: StandardMaterial,
|
||||
preset: MaterialPresetPayload,
|
||||
) {
|
||||
function applyMaterialPresetTextures(material: StandardMaterial, preset: MaterialPresetPayload) {
|
||||
const { maps, mapProperties } = preset
|
||||
|
||||
queueTextureAssignment(material, 'map', maps.albedoMap, mapProperties)
|
||||
@@ -243,7 +250,9 @@ export function applyMaterialPresetToMaterials(
|
||||
}
|
||||
}
|
||||
|
||||
export function createMaterialFromPreset(preset: MaterialPresetPayload): THREE.MeshStandardMaterial {
|
||||
export function createMaterialFromPreset(
|
||||
preset: MaterialPresetPayload,
|
||||
): THREE.MeshStandardMaterial {
|
||||
const cacheKey = JSON.stringify(preset)
|
||||
|
||||
if (materialCache.has(cacheKey)) {
|
||||
@@ -256,7 +265,9 @@ export function createMaterialFromPreset(preset: MaterialPresetPayload): THREE.M
|
||||
return material
|
||||
}
|
||||
|
||||
export function createMaterialFromPresetRef(materialPreset?: string): THREE.MeshStandardMaterial | null {
|
||||
export function createMaterialFromPresetRef(
|
||||
materialPreset?: string,
|
||||
): THREE.MeshStandardMaterial | null {
|
||||
const preset = getMaterialPresetByRef(materialPreset)
|
||||
if (!preset) return null
|
||||
return createMaterialFromPreset(preset)
|
||||
|
||||
@@ -622,14 +622,9 @@ export class MergedOutlineNode extends TempNode {
|
||||
|
||||
private _buildCache(objects: Object3D[], cache: Set<Object3D>) {
|
||||
for (const obj of objects) {
|
||||
if (!obj || !obj.traverse) continue
|
||||
try {
|
||||
obj.traverse((child: any) => {
|
||||
if (child.isMesh || child.isSprite) cache.add(child)
|
||||
})
|
||||
} catch {
|
||||
// Skip objects that were disposed or removed from the scene graph
|
||||
}
|
||||
obj.traverse((child: any) => {
|
||||
if (child.isMesh || child.isSprite) cache.add(child)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
/**
|
||||
* Suppresses the `THREE.Clock: This module has been deprecated` warning
|
||||
* emitted by three.js r183+ on every `new THREE.Clock()` call.
|
||||
*
|
||||
* We don't instantiate `Clock` ourselves — `@react-three/fiber` 9.x
|
||||
* (current stable) creates one internally per `<Canvas>` mount. The
|
||||
* migration to `THREE.Timer` lands in R3F 10.x (still alpha).
|
||||
*
|
||||
* Uses three's `setConsoleFunction` hook so we don't touch `console.warn`
|
||||
* globally. Only the exact Clock deprecation message is suppressed; all
|
||||
* other three.js logs (including TSL stack-trace warnings) pass through
|
||||
* untouched.
|
||||
*
|
||||
* Runs in production as well as dev — the suppressed message is a pure
|
||||
* deprecation notice with no user-actionable content.
|
||||
*
|
||||
* REMOVAL: safe to delete once `@react-three/fiber` no longer constructs
|
||||
* `new THREE.Clock()`. To verify after an R3F upgrade:
|
||||
* grep -n "new THREE.Clock" node_modules/@react-three/fiber/dist/*.js
|
||||
* No hits → delete this file and its import in components/viewer/index.tsx.
|
||||
*
|
||||
* @see https://github.com/pascalorg/editor/issues/213
|
||||
*/
|
||||
|
||||
import { setConsoleFunction } from 'three'
|
||||
|
||||
// three's warn() prepends 'THREE.' to its first argument, and the Clock
|
||||
// constructor passes 'THREE.Clock: ...', producing a double-prefixed
|
||||
// string. Exact equality keeps the suppression surgical — if three ever
|
||||
// rewords this, the filter stops matching and the message resurfaces.
|
||||
const CLOCK_DEPRECATION_MESSAGE =
|
||||
'THREE.THREE.Clock: This module has been deprecated. Please use THREE.Timer instead.'
|
||||
|
||||
type ConsoleMethod = 'log' | 'warn' | 'error'
|
||||
|
||||
// HMR-idempotent install guard. setConsoleFunction is a single-slot global
|
||||
// in three, so re-evaluating this module on HMR would reinstall the hook.
|
||||
const INSTALLED = Symbol.for('@pascal-app/viewer/suppress-three-clock-warning')
|
||||
type GlobalWithFlag = typeof globalThis & { [INSTALLED]?: true }
|
||||
|
||||
if (!(globalThis as GlobalWithFlag)[INSTALLED]) {
|
||||
;(globalThis as GlobalWithFlag)[INSTALLED] = true
|
||||
|
||||
setConsoleFunction((method: ConsoleMethod, message: string, ...params: unknown[]) => {
|
||||
if (method === 'warn' && message === CLOCK_DEPRECATION_MESSAGE) {
|
||||
return
|
||||
}
|
||||
|
||||
// Mirror three's default stack-trace handling so TSL warnings/errors
|
||||
// keep their clickable stack frames.
|
||||
if (method !== 'log') {
|
||||
const first = params[0] as
|
||||
| { isStackTrace?: boolean; getError?: (m: string) => Error }
|
||||
| undefined
|
||||
if (first?.isStackTrace && typeof first.getError === 'function') {
|
||||
console[method](first.getError(message))
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
console[method](message, ...params)
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user