Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
name: CI

on:
push:
branches: [main]
pull_request:
branches: [main]

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
quality:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: oven-sh/setup-bun@v2

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Lint & format check
run: bun run check

- name: Type check
run: bun run check-types
2 changes: 0 additions & 2 deletions apps/editor/lib/bootstrap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ function loadBuiltinsSync(): void {
if (isDev()) {
const kinds = Array.from(nodeRegistry.entries(), ([k]) => k)
if (typeof console !== 'undefined') {
// biome-ignore lint/suspicious/noConsole: dev-only verification log
console.info(
`[pascal:registry] loaded ${builtinPlugin.id} v${builtinPlugin.apiVersion} (${kinds.length} kinds: ${kinds.join(', ') || '∅'})`,
)
Expand Down Expand Up @@ -74,7 +73,6 @@ export async function loadExternalPlugins(): Promise<void> {
await loadPlugin(plugin)
}
if (isDev() && externals.length > 0 && typeof console !== 'undefined') {
// biome-ignore lint/suspicious/noConsole: dev-only verification log
console.info(`[pascal:registry] + ${externals.length} discovered plugin(s)`)
}
}
Expand Down
8 changes: 5 additions & 3 deletions packages/core/src/store/actions/node-actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -416,16 +416,18 @@ export const applyNodeChangesAction = (
return { nodes: nextNodes, rootNodeIds: resolvedRootIds, collections: nextCollections }
})

nodesToMarkDirty.forEach((id) => get().markDirty(id))
parentsToMarkDirty.forEach((id) => {
for (const id of nodesToMarkDirty) {
get().markDirty(id)
}
for (const id of parentsToMarkDirty) {
get().markDirty(id)
const parent = get().nodes[id]
if (parent && 'children' in parent && Array.isArray(parent.children)) {
for (const childId of parent.children) {
get().markDirty(childId as AnyNodeId)
}
}
})
}
}

export const updateNodesAction = (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,9 @@ export function buildFirstPersonColliderWorldFromRegistry(): FirstPersonCollider
}

const mergedGeometry = mergeGeometries(geometries, false)
geometries.forEach((geometry) => geometry.dispose())
for (const geometry of geometries) {
geometry.dispose()
}

if (!mergedGeometry || mergedGeometry.getAttribute('position') == null) {
mergedGeometry?.dispose()
Expand Down
4 changes: 2 additions & 2 deletions packages/nodes/src/ceiling/tool.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -192,8 +192,8 @@ export const CeilingTool: React.FC = () => {
if (points.length === 0) {
mainLineRef.current.visible = false
closingLineRef.current.visible = false
groundMainLineRef.current && (groundMainLineRef.current.visible = false)
groundClosingLineRef.current && (groundClosingLineRef.current.visible = false)
if (groundMainLineRef.current) groundMainLineRef.current.visible = false
if (groundClosingLineRef.current) groundClosingLineRef.current.visible = false
return
}
const ceilingY = levelY + CEILING_HEIGHT
Expand Down
29 changes: 15 additions & 14 deletions packages/nodes/src/chimney/panel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,21 @@ export default function ChimneyPanel() {
}
}, [selectedId, node, deleteNode, setSelection])

// Match the current store node against the preset table so the
// segmented control highlights "the preset you'd land on if you
// applied X again". Compare against the store node, not the live-
// override-merged `node`, so the highlight is stable across slider
// drags. Null means the user has tweaked away from any preset; the
// segmented control will then render with no segment selected.
const activePreset = useMemo(() => detectActiveChimneyPreset(storeNode), [storeNode])
const applyPreset = useCallback(
(key: ChimneyPresetKey) => {
commitProp(chimneyPresets[key] as Partial<ChimneyNode>)
triggerSFX('sfx:item-pick')
},
[commitProp],
)

if (!(node && node.type === 'chimney' && selectedId)) return null

const scenestate = useScene.getState()
Expand Down Expand Up @@ -322,20 +337,6 @@ export default function ChimneyPanel() {
}

// Match the current store node against the preset table so the
// segmented control highlights "the preset you'd land on if you
// applied X again". Compare against the store node, not the live-
// override-merged `node`, so the highlight is stable across slider
// drags. Null means the user has tweaked away from any preset; the
// segmented control will then render with no segment selected.
const activePreset = useMemo(() => detectActiveChimneyPreset(storeNode), [storeNode])
const applyPreset = useCallback(
(key: ChimneyPresetKey) => {
commitProp(chimneyPresets[key] as Partial<ChimneyNode>)
triggerSFX('sfx:item-pick')
},
[commitProp],
)

return (
<PanelWrapper
icon="/icons/roof.png"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,6 @@ type RenderableNode = AnyNode & {
export const ParametricNodeRenderer = ({ node }: { node: AnyNode }) => {
const ref = useRef<Group>(null!)
const n = node as RenderableNode
// biome-ignore lint/suspicious/noExplicitAny: useNodeEvents is keyed by
// literal kind; the registry path passes a runtime kind union. Routing
// through the type cast is safer than widening the hook signature.
const handlers = useNodeEvents(node as any, node.type as any)
const liveTransform = useLiveTransforms((s) => s.get(node.id as AnyNodeId))
// Registry arrow handles (rotation gizmo, position-affecting patches)
Expand Down
3 changes: 0 additions & 3 deletions packages/viewer/src/r3f.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,21 +78,18 @@ interface ThreeJSXElements {
}

declare module 'react' {
// biome-ignore lint/style/noNamespace: Required for JSX module augmentation
namespace JSX {
interface IntrinsicElements extends ThreeJSXElements {}
}
}

declare module 'react/jsx-runtime' {
// biome-ignore lint/style/noNamespace: Required for JSX module augmentation
namespace JSX {
interface IntrinsicElements extends ThreeJSXElements {}
}
}

declare module 'react/jsx-dev-runtime' {
// biome-ignore lint/style/noNamespace: Required for JSX module augmentation
namespace JSX {
interface IntrinsicElements extends ThreeJSXElements {}
}
Expand Down
2 changes: 1 addition & 1 deletion turbo.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
"dependsOn": ["^lint"]
},
"check-types": {
"dependsOn": ["^check-types"]
"dependsOn": ["^build", "^check-types"]
},
"dev": {
"dependsOn": ["^build"],
Expand Down
Loading