이 저장소가 대체 무엇인가.
Pascal Editor는 설치 없이 브라우저에서 집의 평면도를 그리고 3D로 확인하는 오픈소스 3D 건축 편집기다. 벽을 그으면 자동으로 모서리가 맞춰지고(mitering), 문을 배치하면 벽에 구멍이 뚫리며(CSG), 계단을 놓으면 위층 슬라브에 자동으로 개구부가 생긴다.
하지만 2026년 7월 현재 가장 중요한 변화는 packages/mcp다. README은 이를 "Model Context Protocol server for the Pascal 3D editor. Drives the @pascal-app/core scene graph from any MCP-compatible AI host."라고 설명한다 — 즉 Claude 같은 AI가 브라우저 없이 헤드리스로 씬을 조작할 수 있다. create_wall, place_item, cut_opening부터 사진 한 장으로 방을 3D로 재구성하는 photo-to-scene까지, 40개 넘는 MCP 툴이 등록돼 있다.
README의 자기소개는 짧고 명확하다: "A 3D building editor built with React Three Fiber and WebGPU." 실제로 열어 보면 Site → Building → Level → (Wall/Slab/Ceiling/Roof/Zone) → Item의 계층 구조 위에서, 각 요소가 Zod 스키마로 타입 검증되고 Zustand 스토어에 플랫 딕셔너리로 저장된다.
루트 AGENTS.md(=CLAUDE.md=GEMINI.md 심링크)는 이 레포가 "Consumed both as npm packages and (in pascalorg/private-editor) as a git submodule"라고 밝힌다 — 즉 이 공개 레포가 상용 서비스(private-editor)의 엔진 역할도 겸한다. 오픈소스 코어 위에 비공개 프로덕트를 얹는 전형적인 "오픈 코어" 전략이다.
stdio 또는 HTTP로 "MCP 서버"와 통신하며, 서버가 노출한 tools(함수)·resources(데이터)·prompts(템플릿)를 AI가 호출한다. Pascal Editor의 @pascal-app/mcp는 "3D 씬 편집"을 MCP 툴로 노출해, AI가 "침실 3평짜리 방 하나 만들어줘"라고 하면 실제로 벽 노드가 생성되게 한다.수백 개의 벽·문·창문·배관을 다루면서도 60fps를 유지하는 비결은 모든 노드를 Record<id, Node> 평면 딕셔너리에 저장하고, 변경된 노드만 dirtyNodes Set에 표시해 다음 프레임에서 그 노드의 지오메트리만 재계산하는 것이다. Figma·Notion류 에디터가 쓰는 패턴을 3D 씬 그래프에 적용한 사례다.
WebGPU 실전 적용 · MCP로 "AI가 집 짓기" · IFC 건축 표준 지원 · 서드파티 플러그인 생태계.
Spline·SketchUp Web 같은 도구는 WebGL 기반이거나 폐쇄형 SaaS다. 오픈소스 + WebGPU + React 생태계 통합 + AI 에이전트 연동을 동시에 만족하는 3D 건축 에디터는 사실상 없었다.
| 영역 | 2026-03 시점 | 2026-07 현재 |
|---|---|---|
| 패키지 수 | 앱 1개 + 패키지 9개 | 앱 2개(editor + ifc-converter) + 패키지 10개(+mcp, +nodes, +plugin-trees) |
| 노드 타입 | Wall/Slab/Zone/Item 등 소수 | 44종 — 계단·엘리베이터·굴뚝·채광창·태양광판·배관(HVAC/덕트/파이프)까지 |
| AI 연동 | 없음 | packages/mcp — Claude Desktop/Code에서 자연어로 씬 조작, 사진→3D, 도면 이미지 분석 |
| 건축 표준 | 없음 | packages/ifc-converter — IFC(Industry Foundation Classes) 파일 → Pascal 씬 그래프 |
| 확장성 | 내장 기능뿐 | 공식 Plugin 계약 — 서드파티가 노드 종류·패널을 추가(plugin-trees가 레퍼런스 구현) |
| 아키텍처 문서 | README 위주 | wiki/architecture/ 17개 문서 — 레이어 경계, 노드 정의 3체크박스 모델, 상호작용 스코프 등 |
완전 오픈소스이면서 WebGPU 렌더러를 쓰고, 건축 특화 CSG 불리언 연산(벽에 문 구멍 뚫기)과 Claude가 직접 부를 수 있는 40여 개의 MCP 툴을 동시에 갖춘 것이 독보적이다. "AI가 도면을 그리는" 데모가 실제로 동작하는 몇 안 되는 오픈소스 사례다.
| 비교 항목 | Pascal Editor | Spline | SketchUp Web |
|---|---|---|---|
| 오픈소스 | ✅ MIT | ❌ | ❌ |
| WebGPU 지원 | ✅ | ❌ (WebGL) | ❌ (WebGL) |
| 건축 특화 노드 | ✅ 44종(MEP 포함) | ❌ (범용 3D) | ✅ |
| AI 에이전트(MCP) 연동 | ✅ 공식 패키지 | ❌ | ❌ |
| IFC 건축 표준 호환 | ✅ | ❌ | △(플러그인) |
| 서드파티 플러그인 계약 | ✅ 공식 Plugin API | ❌ | △ |
주목도를 끌어올린 구체적 요인은 다음과 같다. ① "AI가 집을 짓는다"는 화제성. MCP 서버 하나로 Claude가 create_room·add_door·furnish_room을 호출해 실제 3D 건물을 만드는 데모는 AI 에이전트 시대의 대표적 활용 사례가 됐다.
② Vision AI 파이프라인. analyze_floorplan_image·analyze_room_photo·photo_to_scene 툴로 스마트폰 사진 한 장을 3D 씬으로 역변환하는 기능은 실측(measurement) 도구로도 활용 가치가 크다.
③ 프로덕션급 아키텍처 문서. wiki/architecture/의 17개 문서와 .agents/skills/review-architecture/는 대규모 오픈소스 프로젝트가 AI 코딩 에이전트와 협업하는 법을 실전으로 보여준다.
프론트엔드(R3F/WebGPU) · MCP 백엔드(Bun+SQLite) · Turborepo 10패키지 인프라.
| 기술 | 버전 | 역할 |
|---|---|---|
| React | 19.2.4 | UI 컴포넌트 프레임워크 |
| Next.js | 16.2.9 | SSR, 라우팅, 빌드(App Router) |
| Three.js | 0.184.0 | 3D 렌더링 엔진 (WebGPU 렌더러) |
| React Three Fiber | 9.5.0 | Three.js의 React 선언적 래퍼 |
| Drei | 10.7.7 | R3F 유틸리티 컴포넌트 모음 |
| Tailwind CSS | 4.2.1 | 유틸리티 기반 CSS |
| Radix UI | 1.2.8 | 접근성 갖춘 헤드리스 UI(Tooltip 등) |
| 기술 | 역할 |
|---|---|
| Zustand | 경량 상태관리 — 스토어 계층(useScene/useViewer/useEditor) 분리 |
| Zundo | Zustand 기반 Undo/Redo(50단계 히스토리, "시간 여행" 미들웨어) |
| Zod | 4.3.5 — 44종 노드 스키마의 런타임 검증. MCP 툴 입력 검증에도 재사용 |
| IndexedDB | 클라이언트 영구 저장소(브라우저) |
| 기술 | 역할 |
|---|---|
| three-bvh-csg | BVH 기반 CSG 불리언 연산 — 벽에 문/창문 구멍 뚫기, 지붕 절단 |
| Spatial Grid Manager | 충돌 감지 및 배치 유효성 검사(canPlaceOnFloor/Wall/Ceiling) |
| mitt | 타입 안전 이벤트 이미터 — 노드/그리드 이벤트 버스 |
| @dgreenheck/ez-tree | 플러그인(plugin-trees)의 프로시저럴 나무 지오메트리 라이브러리 |
| 기술 | 역할 |
|---|---|
| Bun 런타임 | 브라우저·React·WebGPU 없이 헤드리스로 씬 그래프 조작 |
| MCP SDK | tools/resources/prompts 노출. stdio 및 HTTP(bearer token) 트랜스포트 지원 |
| SQLite(WAL 모드) | ~/.pascal/data/pascal.db — 로컬 씬 저장, 트랜잭션 버전 체크로 동시 저장 충돌 방지 |
| Server-Sent Events | MCP가 편집한 변경을 /api/scenes/:id/events로 스트리밍 → 열린 브라우저 탭에 실시간 반영(live-sync) |
| Vision 분석 툴 | analyze-floorplan-image·analyze-room-photo — 이미지를 씬 데이터로 해석 |
| 기술 | 버전 | 역할 |
|---|---|---|
| Turborepo | 2.9.17+ | 10패키지 모노레포 빌드 오케스트레이션, 증분 캐시 |
| Bun | 1.3.0 | 패키지 매니저 & 런타임(packageManager 고정) |
| Biome | 2.4.16 | Rust 기반 Linter+Formatter(ESLint/Prettier 대체) |
| TypeScript | 6.0.3 | 전 패키지 100% 타입 커버리지 |
| @typescript/native-preview | 7.0.0-dev | 차세대 네이티브(tsgo) 타입체커 실험 도입 |
| react-scan | 0.5.3 | React 렌더링 성능 시각화(dev) |
Zod로 정의한 44종 노드 스키마(packages/core/src/schema/nodes/)는 에디터 UI의 폼 검증뿐 아니라 MCP 툴의 입력 파라미터 검증에도 그대로 재사용된다. 사람이 클릭해서 만든 벽이든, Claude가 create_wall을 호출해 만든 벽이든 동일한 타입 안전성을 보장받는다 — "AI 우선 설계(AI-native)"가 사후 통합이 아니라 스키마 레이어부터 관통하는 구조다.
3계층 레이어 경계 + 3체크박스 노드 정의 모델 + MCP↔브라우저 실시간 동기화.
Pascal Editor의 아키텍처는 AGENTS.md가 못박은 세 개의 엄격한 레이어 경계 위에 서 있다. packages/core는 Three.js를 몰라야 하고(순수 도메인 로직), packages/viewer는 에디터 개념(툴·패널·모드)을 몰라야 하며(뷰어 격리), apps/editor만 이 둘을 조합해 실제 편집 경험을 만든다. 이 경계 위에 MCP 서버가 core를 헤드리스로 직접 구동하는 네 번째 진입점이 얹혀 있다.
packages/viewer가 useEditor·에디터 툴·페인트 모드 같은 "에디터 전용 어휘"를 절대 몰라야 한다는 규칙. 덕분에 @pascal-app/viewer는 단독 npm 패키지로 배포돼, 서드파티가 에디터 기능 없이 "3D 뷰어만" 임베드할 수 있다. 위반 여부는 .agents/skills/review-architecture 스킬이 PR마다 자동 점검한다.
기존 분석(3월)에서는 렌더러가 하나의 방식(React 컴포넌트)으로 통일된 것처럼 보였지만, 지금은 wiki/architecture/node-definitions.md가 정의하는 독립적인 3개 필드로 세분화됐다. 노드 종류(kind)마다 필요한 조합만 켠다.
| 필드 | 용도 | 고르는 기준 |
|---|---|---|
geometry? | 순수 함수. (node, ctx, ...) => Object3D | 노드 데이터의 순수 함수로 메시가 결정될 때(선반·기둥·벽) |
renderer? | 커스텀 React 컴포넌트가 메시 생성을 전담 | <Html>·useGLTF·인스턴싱·TSL 셰이더가 필요할 때(존, 나무) |
system? | 프레임마다 도는 컴포넌트(useFrame, null 반환) | 애니메이션·투명도 전환·크로스킨드 더티 캐스케이드가 필요할 때(문 열림) |
// shelf — 순수 geometry만, React·프레임 로직 없음
export const shelfDefinition: NodeDefinition<typeof ShelfNode> = {
geometry: buildShelfGeometry, // geometry.ts의 순수 함수
}
// door — 순수 geometry + 애니메이션 system 병행
export const doorDefinition: NodeDefinition<typeof DoorNode> = {
geometry: buildDoorGeometry,
system: { module: () => import('./animation') }, // operationState 진행
}
런타임에서는 <NodeRenderer>가 def.renderer 유무로 커스텀 컴포넌트 or <ParametricNodeRenderer>(빈 그룹 + 레지스트리 등록)를 고르고, <GeometrySystem>이 매 프레임 dirty한 노드 중 def.geometry가 있는 것만 재빌드한다. "구조/조직용 킨드(site·building·level·zone)"는 dirtyTracking: false로 이 추적에서 아예 빠진다 — 불필요한 더티 마크가 세션 내내 누적되는 걸 막기 위해서다.
geometry() 두 번째 인자 GeometryContext는 resolve()·children·siblings·parent만 제공한다. 벽은 ctx.siblings로 이웃 벽과 모서리를 맞대고(mitering), 문/창문은 ctx.parent로 자신이 박힌 벽의 두께를 읽어 프레임 깊이를 맞춘다. 빌더 함수 자체는 useScene import도, 스토어 mutation도 하지 않는 순수 함수로 남아 유닛 테스트가 쉽다.
wiki/architecture/interaction-scope.md가 정의하는, 배치·이동·핸들 조작·박스 선택·페인트 등 모든 포인터 상호작용을 관장하는 단일 상태 머신이다. InteractionScope 유니온 타입 + begin/update/end/endIf 계약으로, "지금 무엇을 클릭하면 무슨 일이 일어나야 하는가"를 한 곳에서 판정한다. PR이 배치/이동/핸들/리셰이프/박스선택/페인트 중 하나라도 건드리면 이 문서를 반드시 읽어야 한다고 AGENTS.md가 명시한다 — 그만큼 사고(엉뚱한 클릭 처리) 위험이 큰 코어라는 뜻이다.
MCP와 에디터가 같은 PASCAL_DATA_DIR을 공유하면, MCP의 씬 변경이 SQLite에 저장되고 로컬 scene_events 스트림에 기록된다. 열려 있는 에디터 브라우저 탭은 /api/scenes/:id/events를 Server-Sent Events로 구독해 씬 그래프 스냅샷을 실시간 반영한다. 각 mutation은 저장 전 버전 체크를 거쳐, 브라우저와 MCP 프로세스가 동시에 저장하면 live_sync_version_conflict를 반환하고 load_scene으로 재로드하게 한다 — 낙관적 동시성 제어(optimistic concurrency)의 실전 사례다.
3체크박스 모델은 "레고 부품 카탈로그"다. 어떤 부품(노드 킨드)은 순수 성형(geometry)만 필요하고, 어떤 건 조립 설명서(renderer)가 따로 있어야 하며, 어떤 건 태엽(system)이 돌아야 움직인다. 세 속성이 독립적이라 필요한 것만 골라 끼운다 — 모든 부품에 태엽을 강제하지 않는다.
모든 노드는 Record<id, Node> 평면 딕셔너리에 저장되고, parentId/children으로만 트리를 표현한다. 노드가 바뀌면 dirtyNodes Set에 추가되고, 다음 useFrame에서 그 노드만 재계산된다. Figma·Notion류 복잡한 에디터의 공통 패턴을, Pascal은 44종 건축 노드 + MCP 동시 편집까지 확장해 적용하고 있다.
// 업데이트 시 dirtyNodes에 자동 추가 (사람이든 MCP든 동일 경로)
useScene.getState().updateNode(wallId, { thickness: 0.2 })
// GeometrySystem 렌더 루프: dirty 노드 중 def.geometry 보유자만 처리
useFrame(() => {
for (const id of dirtyNodes) {
const group = sceneRegistry.nodes.get(id) // O(1)
const ctx = buildGeometryContext(id) // siblings/parent/children
const built = def.geometry(node, ctx, shading, textures, colorPreset, theme)
disposeOldChildren(group); group.add(...built.children)
clearDirty(id)
}
})
2개 앱 + 10개 패키지 Turborepo 모노레포 — 1,302개 TS/TSX 파일.
네 덩어리로 나눠 읽으면 명료하다.
① 도메인 코어 packages/core/. Three.js를 몰라야 하는 순수 로직 레이어. 44종 노드 스키마와 nodeRegistry가 여기 있다. 이 패키지 하나가 UI(apps/editor)와 MCP(packages/mcp) 양쪽에서 동시에 소비된다 — "도메인 로직은 한 곳, 진입점은 여럿"의 실물이다.
② 독립 뷰어 packages/viewer/. 에디터 개념을 모르는 "순수 3D 캔버스"로, 그 자체로 npm 배포된다. 19개의 뷰어 시스템(ceiling·column·door·roof·stair·window·zone 등)이 각 노드 킨드의 프레임별 갱신을 맡는다.
③ MCP 서버 packages/mcp/. 이번 재분석의 핵심 신규 축. tools/ 안에 기능별로 vision(사진 분석)·photo-to-scene(역변환)·scene-lifecycle(저장/불러오기)·templates(정원 딸린 집 등 프리셋)·variants(설계 변형 자동 생성) 5개 하위 그룹이 있다. 거의 모든 툴 파일 옆에 *.test.ts가 붙어 있어 AI가 호출하는 인터페이스일수록 테스트를 촘촘히 깐다는 원칙이 보인다.
④ 위키 + 에이전트 스킬 wiki/architecture/, .agents/skills/. 사람이 아니라 AI 코딩 에이전트가 읽도록 설계된 규범 문서다. AGENTS.md가 "레이어 경계를 건드리는 변경 전에는 반드시 이 문서를 먼저 읽어라"고 명시하고, review-architecture 스킬이 PR 리뷰 시 이를 자동으로 로드해 위반 여부를 층별로 분류·보고한다.
@pascal-app/{core,viewer,editor,mcp})을 오픈소스로 공개하고, 이를 서브모듈로 끌어와 쓰는 별도 비공개 저장소(pascalorg/private-editor)에서 상용 기능(계정·과금·협업 등으로 추정)을 얹는 사업 모델. AGENTS.md에 명시된 이 구조 덕분에, 커뮤니티 기여가 코어 엔진 품질을 직접 개선하면서도 회사는 별도 수익화 레이어를 가질 수 있다.이 저장소에서 "무엇을 배울 수 있는가" — 개념 → 코드 위치 → 실습 아이디어.
packages/mcp 전체가 "도메인 로직을 AI가 호출 가능한 툴로 노출하는 법"의 실전 교과서다. tools/index.ts에서 툴이 등록되는 방식, operations/scene-operations.ts가 core 스토어를 감싸는 어댑터 계층, storage/sqlite-scene-store.ts의 버전 체크 기반 낙관적 동시성 제어를 함께 읽으면 "브라우저 없는 헤드리스 AI 백엔드"를 통째로 배운다.
실습: packages/mcp/src/tools/measure.ts(가장 단순한 툴 중 하나)를 읽고, 같은 패턴으로 "노드 개수를 킨드별로 세는" 새 MCP 툴을 하나 추가해 bunx pascal-mcp로 호출해 보기.
packages/core가 Three.js를 import하면 안 된다는 규칙은 컴파일러가 아니라 AGENTS.md + review-architecture 스킬이 지킨다. 사람/AI 리뷰어가 읽는 "헌법 문서"로 아키텍처를 통제하는 대규모 오픈소스의 실전 운영 방식을 배운다.
실습: wiki/architecture/viewer-isolation.md를 읽고, packages/viewer 소스에서 실제로 useEditor나 에디터 전용 개념을 import하는 곳이 있는지 grep으로 검증(없어야 정상).
geometry/renderer/system 세 필드를 독립적으로 켜고 끄는 NodeDefinition 모델은, 조건 분기 대신 "필드 존재 여부 = 참여 여부"로 다형성을 표현한다. 44종의 서로 다른 건축 요소를 하나의 통일된 등록 인터페이스로 다루는 법을 배운다.
실습: packages/nodes/src/shelf/(geometry만)와 packages/plugin-trees/src/(system+renderer)를 나란히 열어, 같은 NodeDefinition 타입이 어떻게 다르게 채워지는지 비교.
plugin-trees는 "structurally identical to a third-party plugin" — 내부 전용 API를 전혀 쓰지 않고 @pascal-app/*를 peer-dependency로만 소비한다. 플러그인 작성자에게 신뢰를 주는 가장 확실한 방법은, 자사 팀도 같은 제약 안에서 만든 예제를 공개하는 것이라는 통찰을 얻는다.
실습: wiki/architecture/plugin-authoring.md의 Plugin 계약을 읽고, plugin-trees/src/index.ts가 그 계약의 어떤 필드를 채우는지 대조.
브라우저 탭과 MCP 프로세스가 같은 씬을 동시에 편집할 수 있는 상황에서, Pascal은 락(lock) 대신 저장 시 버전을 체크하고 충돌하면 실패시키는(live_sync_version_conflict) 전략을 택했다. 분산 상태 동기화의 실무 트레이드오프를 실제 코드로 확인할 수 있다.
실습: packages/mcp/src/storage/sqlite-scene-store.ts의 저장 함수에서 버전 비교 로직을 찾아, 같은 씬을 두 클라이언트가 동시에 저장하면 무슨 값이 반환되는지 추적.
packages/ifc-converter는 Uint8Array의 IFC 바이트를 받아 Pascal의 노드/루트ID/통계로 변환하는 순수 함수 라이브러리다(DOM·React 의존 없음). 실무 CAD/BIM 파일 포맷을 다루는 첫 진입점으로 삼기 좋다.
실습: IFC 샘플 파일(공개 IFC 예제 파일 검색)을 apps/ifc-converter UI에 업로드해, 변환된 노드 수와 원본 IFC 엔티티 수를 비교.
WebGPU 지원 브라우저 필수 · MCP 서버는 Bun만 있으면 헤드리스로 별도 구동.
| 구성요소 | 최소 요구사항 | 권장 사항 |
|---|---|---|
| 브라우저(에디터 UI) | Chrome 113+ / Edge 113+ (WebGPU 지원) | Chrome 최신 안정판 |
| GPU | WebGPU 지원 GPU | 전용 GPU(NVIDIA/AMD), 복잡한 건물일수록 유리 |
| Node.js | 18+ (engines.node 명시) | 20+ |
| Bun | 1.3.0 (packageManager 고정) | 동일 버전 유지 권장 |
| RAM | 8GB | 16GB(다층 건물 + 다수 MEP 노드 편집 시) |
| MCP 서버(헤드리스) | Bun만 있으면 브라우저·GPU 불필요 | 에디터와 별도 터미널/프로세스로 상시 구동 |
| MCP 저장소 | 로컬 SQLite 파일(~/.pascal/data/pascal.db) | PASCAL_DATA_DIR로 에디터와 경로 공유 시 Live Sync 활성화 |
| OS | macOS, Windows, Linux | — |
브라우저 3D 에디터를 직접 만져보려면 WebGPU GPU가 필요하지만, AI가 도면을 짜는 워크플로만 체험하고 싶다면 bunx pascal-mcp --stdio 하나로 충분하다. Claude Desktop 설정 파일에 서버를 등록하면 그래픽 환경 없이도 "AI에게 집을 설계시키는" 경험을 할 수 있다.
WebGPU는 Chrome/Edge에서 기본 활성화됐지만 Firefox·Safari는 여전히 플래그 뒤에 있거나 부분 지원이다. 또한 bun dev는 반드시 루트 디렉토리에서 실행해야 packages/core·packages/viewer의 워처가 함께 돌아 핫 리로드가 동작한다 — 개별 앱 폴더에서 실행하면 패키지 변경이 반영되지 않는다.
난이도별로 손을 움직여 보는 5가지 — 3D 에디터부터 MCP AI 연동까지.
git clone https://github.com/pascalorg/editor.git
cd editor
bun install
bun dev
# http://localhost:3002 에서 에디터 열기
벽·바닥·계단·지붕을 그려 보고, packages/core/src/schema/nodes/ 폴더의 44개 파일 목록만 훑어보며 이 에디터가 얼마나 광범위한 건축 요소(굴뚝·태양광판·덕트·엘리베이터)를 다루는지 체감한다.
# 리포 루트에서
bun run --filter=@pascal-app/mcp build
claude mcp add pascal bun /absolute/path/to/editor/packages/mcp/dist/bin/pascal-mcp.js
Claude Code 세션에서 "정원 딸린 작은 집 하나 만들어줘"처럼 자연어로 요청해, create_room·add_door·furnish_room 같은 MCP 툴이 실제로 호출되는 과정을 관찰한다. 같은 PASCAL_DATA_DIR로 에디터를 함께 띄우면 브라우저에 실시간 반영되는 Live Sync도 확인 가능.
packages/nodes/src/에 새 킨드(예: column과 유사한 "beam" 기둥보)를 추가하되, geometry만 채우는 가장 단순한 조합으로 시작한다. Zod 스키마 → nodeRegistry 등록 → 에디터 툴바에서 배치까지 전체 흐름을 경험한다.
packages/mcp/src/tools/vision/analyze-room-photo.ts와 photo-to-scene/을 읽고, 실제 방 사진을 MCP 클라이언트로 전달해 벽 위치·문/창문 추정 결과가 씬 노드로 변환되는지 확인한다. 결과의 정확도 한계(원근 왜곡, 가려진 벽)를 기록해 보는 것도 좋은 학습이다.
packages/plugin-trees를 통째로 복사해 packages/plugin-fences(또는 다른 조경 요소)로 리네이밍하고, wiki/architecture/plugin-authoring.md의 Plugin 계약(panels·parametrics·tool/preview)을 따라 좌측 프리셋 패널까지 갖춘 완전한 플러그인을 만든다. 인스턴스 렌더링(instanced.tsx 패턴)을 재사용해 N개 배치 시 드로우콜이 적게 유지되는지 성능을 확인하면 심화 과제가 된다.
5주 코스 — R3F/WebGPU 기초부터 MCP 서버 직접 만들기까지.
Pascal Editor는 세 분야가 교차한다. MCP(Anthropic의 AI 도구 연동 표준), BIM/IFC(건축 정보 모델링 업계 표준 — Revit·ArchiCAD와의 상호운용성), 그리고 게임 엔진 패턴(더티 플래그·씬 레지스트리·ECS와 유사한 시스템 분리). 이 셋을 동시에 다루는 오픈소스는 드물어, 각 분야를 따로 공부하되 이 레포를 "교차점 사례"로 삼으면 이해가 빠르다.
이 프로젝트를 읽을 때 반복 등장하는 용어 정리.
| 키워드 | 뜻 |
|---|---|
| MCP (Model Context Protocol) | AI 호스트(Claude 등)와 외부 도구/데이터를 연결하는 Anthropic 표준 프로토콜 |
| NodeDefinition (3체크박스 모델) | geometry/renderer/system 3개 독립 필드로 노드 킨드의 렌더링 방식을 조합하는 등록 모델 |
| Dirty Node / Dirty Flag | 변경된 노드만 표시해 다음 프레임에 그 노드만 재계산하는 최적화 패턴 |
| Scene Registry | 노드 ID → Three.js Object3D 매핑. 선언적 React와 명령적 Three.js 사이의 브릿지 |
| GeometryContext | geometry() 빌더가 받는 읽기 전용 씬 접근 객체(resolve/children/siblings/parent) |
| Interaction Scope ("the spine") | 배치·이동·핸들·박스선택·페인트를 관장하는 단일 상호작용 상태 머신 |
| Layer Isolation | core는 Three.js를, viewer는 에디터 개념을 몰라야 한다는 아키텍처 경계 규칙 |
| Live Sync | MCP의 씬 변경을 SSE로 스트리밍해 열린 브라우저 탭에 실시간 반영하는 메커니즘 |
| Optimistic Concurrency | 락 대신 저장 시 버전 체크로 동시 편집 충돌을 감지하는 방식(live_sync_version_conflict) |
| CSG (Constructive Solid Geometry) | 불리언 연산(합/차/교)으로 복잡한 형태를 만드는 기법. 벽에 문 구멍 뚫기에 사용 |
| BVH | Bounding Volume Hierarchy. 공간을 계층적으로 분할해 CSG·충돌·레이캐스팅을 가속 |
| IFC (Industry Foundation Classes) | 건축/BIM 업계 표준 파일 포맷. Revit·ArchiCAD 등과의 상호운용성 핵심 |
| Open Core | 엔진은 오픈소스로 공개하고 비공개 서브모듈 레포에서 상용 기능을 얹는 사업 모델 |
| Plugin (Manifest) | 서드파티가 노드 킨드·좌측 패널을 추가하는 공식 계약. 1st-party 예제는 plugin-trees |
| WebGPU | WebGL 차세대 표준. GPU 컴퓨트 셰이더, 멀티스레드 렌더링, 낮은 API 오버헤드 |
| Zundo | Zustand용 Undo/Redo 미들웨어(50단계 히스토리) |
| Turborepo | 변경된 패키지만 증분 재빌드하는 모노레포 빌드 오케스트레이터 |
원본을 직접 확인하고 싶을 때.