Victor Giers 1e934ae57c auto-git:
[change] public/foliage/Grass/BlueFescue/BlueFescue_LOD0.glb
 [change] public/foliage/Grass/BlueFescue/BlueFescue_LOD1.glb
 [change] public/foliage/Grass/BlueFescue/BlueFescue_LOD2.glb
 [change] public/foliage/Grass/BlueFescue/BlueFescue_LOD3.glb
 [change] public/foliage/Grass/BroadBlade/BroadBlade_LOD0.glb
 [change] public/foliage/Grass/BroadBlade/BroadBlade_LOD1.glb
 [change] public/foliage/Grass/BroadBlade/BroadBlade_LOD2.glb
 [change] public/foliage/Grass/BroadBlade/BroadBlade_LOD3.glb
 [change] public/foliage/Grass/DryTuft/DryTuft_LOD0.glb
 [change] public/foliage/Grass/DryTuft/DryTuft_LOD1.glb
 [change] public/foliage/Grass/DryTuft/DryTuft_LOD2.glb
 [change] public/foliage/Grass/DryTuft/DryTuft_LOD3.glb
 [change] public/foliage/Grass/Foxtail/Foxtail_LOD0.glb
 [change] public/foliage/Grass/Foxtail/Foxtail_LOD1.glb
 [change] public/foliage/Grass/Foxtail/Foxtail_LOD2.glb
 [change] public/foliage/Grass/Foxtail/Foxtail_LOD3.glb
 [change] public/foliage/Grass/MarshReed/MarshReed_LOD0.glb
 [change] public/foliage/Grass/MarshReed/MarshReed_LOD1.glb
 [change] public/foliage/Grass/MarshReed/MarshReed_LOD2.glb
 [change] public/foliage/Grass/MarshReed/MarshReed_LOD3.glb
 [change] public/foliage/Grass/MeadowSoft/MeadowSoft_LOD0.glb
 [change] public/foliage/Grass/MeadowSoft/MeadowSoft_LOD1.glb
 [change] public/foliage/Grass/MeadowSoft/MeadowSoft_LOD2.glb
 [change] public/foliage/Grass/MeadowSoft/MeadowSoft_LOD3.glb
 [change] public/foliage/Grass/SparseField/SparseField_LOD0.glb
 [change] public/foliage/Grass/SparseField/SparseField_LOD1.glb
 [change] public/foliage/Grass/SparseField/SparseField_LOD2.glb
 [change] public/foliage/Grass/SparseField/SparseField_LOD3.glb
 [change] public/foliage/Grass/Windswept/Windswept_LOD0.glb
 [change] public/foliage/Grass/Windswept/Windswept_LOD1.glb
 [change] public/foliage/Grass/Windswept/Windswept_LOD2.glb
 [change] public/foliage/Grass/Windswept/Windswept_LOD3.glb
 [change] public/foliage/GrassDry/BrittleGrassClump/BrittleGrassClump_LOD0.glb
 [change] public/foliage/GrassDry/BrittleGrassClump/BrittleGrassClump_LOD1.glb
 [change] public/foliage/GrassDry/BrittleGrassClump/BrittleGrassClump_LOD2.glb
 [change] public/foliage/GrassDry/BrittleGrassClump/BrittleGrassClump_LOD3.glb
 [change] public/foliage/GrassDry/BrokenHayPile/BrokenHayPile_LOD0.glb
 [change] public/foliage/GrassDry/BrokenHayPile/BrokenHayPile_LOD1.glb
 [change] public/foliage/GrassDry/BrokenHayPile/BrokenHayPile_LOD2.glb
 [change] public/foliage/GrassDry/BrokenHayPile/BrokenHayPile_LOD3.glb
 [change] public/foliage/GrassDry/CutStubblePatch/CutStubblePatch_LOD0.glb
 [change] public/foliage/GrassDry/CutStubblePatch/CutStubblePatch_LOD1.glb
 [change] public/foliage/GrassDry/CutStubblePatch/CutStubblePatch_LOD2.glb
 [change] public/foliage/GrassDry/CutStubblePatch/CutStubblePatch_LOD3.glb
 [change] public/foliage/GrassDry/DryTuftFan/DryTuftFan_LOD0.glb
 [change] public/foliage/GrassDry/DryTuftFan/DryTuftFan_LOD1.glb
 [change] public/foliage/GrassDry/DryTuftFan/DryTuftFan_LOD2.glb
 [change] public/foliage/GrassDry/DryTuftFan/DryTuftFan_LOD3.glb
 [change] public/foliage/GrassDry/GoldenSparseGrass/GoldenSparseGrass_LOD0.glb
 [change] public/foliage/GrassDry/GoldenSparseGrass/GoldenSparseGrass_LOD1.glb
 [change] public/foliage/GrassDry/GoldenSparseGrass/GoldenSparseGrass_LOD2.glb
 [change] public/foliage/GrassDry/GoldenSparseGrass/GoldenSparseGrass_LOD3.glb
 [change] public/foliage/GrassDry/MownClippings/MownClippings_LOD0.glb
 [change] public/foliage/GrassDry/MownClippings/MownClippings_LOD1.glb
 [change] public/foliage/GrassDry/MownClippings/MownClippings_LOD2.glb
 [change] public/foliage/GrassDry/MownClippings/MownClippings_LOD3.glb
 [change] public/foliage/GrassDry/StrawLitterMat/StrawLitterMat_LOD0.glb
 [change] public/foliage/GrassDry/StrawLitterMat/StrawLitterMat_LOD1.glb
 [change] public/foliage/GrassDry/StrawLitterMat/StrawLitterMat_LOD2.glb
 [change] public/foliage/GrassDry/StrawLitterMat/StrawLitterMat_LOD3.glb
 [change] public/foliage/GrassDry/WheatStubbleRow/WheatStubbleRow_LOD0.glb
 [change] public/foliage/GrassDry/WheatStubbleRow/WheatStubbleRow_LOD1.glb
 [change] public/foliage/GrassDry/WheatStubbleRow/WheatStubbleRow_LOD2.glb
 [change] public/foliage/GrassDry/WheatStubbleRow/WheatStubbleRow_LOD3.glb
 [change] public/foliage/GrassTall/BentWildGrass/BentWildGrass_LOD0.glb
 [change] public/foliage/GrassTall/BentWildGrass/BentWildGrass_LOD1.glb
 [change] public/foliage/GrassTall/BentWildGrass/BentWildGrass_LOD2.glb
 [change] public/foliage/GrassTall/BentWildGrass/BentWildGrass_LOD3.glb
 [change] public/foliage/GrassTall/DryPrairieClump/DryPrairieClump_LOD0.glb
 [change] public/foliage/GrassTall/DryPrairieClump/DryPrairieClump_LOD1.glb
 [change] public/foliage/GrassTall/DryPrairieClump/DryPrairieClump_LOD2.glb
 [change] public/foliage/GrassTall/DryPrairieClump/DryPrairieClump_LOD3.glb
 [change] public/foliage/GrassTall/FeatherGrassClump/FeatherGrassClump_LOD0.glb
 [change] public/foliage/GrassTall/FeatherGrassClump/FeatherGrassClump_LOD1.glb
 [change] public/foliage/GrassTall/FeatherGrassClump/FeatherGrassClump_LOD2.glb
 [change] public/foliage/GrassTall/FeatherGrassClump/FeatherGrassClump_LOD3.glb
 [change] public/foliage/GrassTall/ReedGrassClump/ReedGrassClump_LOD0.glb
 [change] public/foliage/GrassTall/ReedGrassClump/ReedGrassClump_LOD1.glb
 [change] public/foliage/GrassTall/ReedGrassClump/ReedGrassClump_LOD2.glb
 [change] public/foliage/GrassTall/ReedGrassClump/ReedGrassClump_LOD3.glb
 [change] public/foliage/GrassTall/SeedStemClump/SeedStemClump_LOD0.glb
 [change] public/foliage/GrassTall/SeedStemClump/SeedStemClump_LOD1.glb
 [change] public/foliage/GrassTall/SeedStemClump/SeedStemClump_LOD2.glb
 [change] public/foliage/GrassTall/SeedStemClump/SeedStemClump_LOD3.glb
 [change] public/foliage/GrassTall/TallMeadowClump/TallMeadowClump_LOD0.glb
 [change] public/foliage/GrassTall/TallMeadowClump/TallMeadowClump_LOD1.glb
 [change] public/foliage/GrassTall/TallMeadowClump/TallMeadowClump_LOD2.glb
 [change] public/foliage/GrassTall/TallMeadowClump/TallMeadowClump_LOD3.glb
 [change] public/foliage/GrassTall/TuftedRushClump/TuftedRushClump_LOD0.glb
 [change] public/foliage/GrassTall/TuftedRushClump/TuftedRushClump_LOD1.glb
 [change] public/foliage/GrassTall/TuftedRushClump/TuftedRushClump_LOD2.glb
 [change] public/foliage/GrassTall/TuftedRushClump/TuftedRushClump_LOD3.glb
 [change] public/foliage/GrassTall/WildOatClump/WildOatClump_LOD0.glb
 [change] public/foliage/GrassTall/WildOatClump/WildOatClump_LOD1.glb
 [change] public/foliage/GrassTall/WildOatClump/WildOatClump_LOD2.glb
 [change] public/foliage/GrassTall/WildOatClump/WildOatClump_LOD3.glb
 [change] public/foliage/Weed/CloverPatch/CloverPatch_LOD0.glb
 [change] public/foliage/Weed/CloverPatch/CloverPatch_LOD1.glb
 [change] public/foliage/Weed/CloverPatch/CloverPatch_LOD2.glb
 [change] public/foliage/Weed/CloverPatch/CloverPatch_LOD3.glb
 [change] public/foliage/Weed/DandelionRosette/DandelionRosette_LOD0.glb
 [change] public/foliage/Weed/DandelionRosette/DandelionRosette_LOD1.glb
 [change] public/foliage/Weed/DandelionRosette/DandelionRosette_LOD2.glb
 [change] public/foliage/Weed/DandelionRosette/DandelionRosette_LOD3.glb
 [change] public/foliage/Weed/DockWeed/DockWeed_LOD0.glb
 [change] public/foliage/Weed/DockWeed/DockWeed_LOD1.glb
 [change] public/foliage/Weed/DockWeed/DockWeed_LOD2.glb
 [change] public/foliage/Weed/DockWeed/DockWeed_LOD3.glb
 [change] public/foliage/Weed/GroundIvy/GroundIvy_LOD0.glb
 [change] public/foliage/Weed/GroundIvy/GroundIvy_LOD1.glb
 [change] public/foliage/Weed/GroundIvy/GroundIvy_LOD2.glb
 [change] public/foliage/Weed/GroundIvy/GroundIvy_LOD3.glb
 [change] public/foliage/Weed/NettlePatch/NettlePatch_LOD0.glb
 [change] public/foliage/Weed/NettlePatch/NettlePatch_LOD1.glb
 [change] public/foliage/Weed/NettlePatch/NettlePatch_LOD2.glb
 [change] public/foliage/Weed/NettlePatch/NettlePatch_LOD3.glb
 [change] public/foliage/Weed/PlantainCluster/PlantainCluster_LOD0.glb
 [change] public/foliage/Weed/PlantainCluster/PlantainCluster_LOD1.glb
 [change] public/foliage/Weed/PlantainCluster/PlantainCluster_LOD2.glb
 [change] public/foliage/Weed/PlantainCluster/PlantainCluster_LOD3.glb
 [change] public/foliage/Weed/RagweedSprig/RagweedSprig_LOD0.glb
 [change] public/foliage/Weed/RagweedSprig/RagweedSprig_LOD1.glb
 [change] public/foliage/Weed/RagweedSprig/RagweedSprig_LOD2.glb
 [change] public/foliage/Weed/RagweedSprig/RagweedSprig_LOD3.glb
 [change] public/foliage/Weed/ThistleRosette/ThistleRosette_LOD0.glb
 [change] public/foliage/Weed/ThistleRosette/ThistleRosette_LOD1.glb
 [change] public/foliage/Weed/ThistleRosette/ThistleRosette_LOD2.glb
 [change] public/foliage/Weed/ThistleRosette/ThistleRosette_LOD3.glb
 [change] public/foliage/WheatUnderstory/BroadPlantainPatch/BroadPlantainPatch_LOD0.glb
 [change] public/foliage/WheatUnderstory/BroadPlantainPatch/BroadPlantainPatch_LOD1.glb
 [change] public/foliage/WheatUnderstory/BroadPlantainPatch/BroadPlantainPatch_LOD2.glb
 [change] public/foliage/WheatUnderstory/BroadPlantainPatch/BroadPlantainPatch_LOD3.glb
 [change] public/foliage/WheatUnderstory/ChickweedMat/ChickweedMat_LOD0.glb
 [change] public/foliage/WheatUnderstory/ChickweedMat/ChickweedMat_LOD1.glb
 [change] public/foliage/WheatUnderstory/ChickweedMat/ChickweedMat_LOD2.glb
 [change] public/foliage/WheatUnderstory/ChickweedMat/ChickweedMat_LOD3.glb
 [change] public/foliage/WheatUnderstory/FieldWeedSprig/FieldWeedSprig_LOD0.glb
 [change] public/foliage/WheatUnderstory/FieldWeedSprig/FieldWeedSprig_LOD1.glb
 [change] public/foliage/WheatUnderstory/FieldWeedSprig/FieldWeedSprig_LOD2.glb
 [change] public/foliage/WheatUnderstory/FieldWeedSprig/FieldWeedSprig_LOD3.glb
 [change] public/foliage/WheatUnderstory/RedCloverTuft/RedCloverTuft_LOD0.glb
 [change] public/foliage/WheatUnderstory/RedCloverTuft/RedCloverTuft_LOD1.glb
 [change] public/foliage/WheatUnderstory/RedCloverTuft/RedCloverTuft_LOD2.glb
 [change] public/foliage/WheatUnderstory/RedCloverTuft/RedCloverTuft_LOD3.glb
 [change] public/foliage/WheatUnderstory/RibwortPlantain/RibwortPlantain_LOD0.glb
 [change] public/foliage/WheatUnderstory/RibwortPlantain/RibwortPlantain_LOD1.glb
 [change] public/foliage/WheatUnderstory/RibwortPlantain/RibwortPlantain_LOD2.glb
 [change] public/foliage/WheatUnderstory/RibwortPlantain/RibwortPlantain_LOD3.glb
 [change] public/foliage/WheatUnderstory/TinyBlueFlowerClump/TinyBlueFlowerClump_LOD0.glb
 [change] public/foliage/WheatUnderstory/TinyBlueFlowerClump/TinyBlueFlowerClump_LOD1.glb
 [change] public/foliage/WheatUnderstory/TinyBlueFlowerClump/TinyBlueFlowerClump_LOD2.glb
 [change] public/foliage/WheatUnderstory/TinyBlueFlowerClump/TinyBlueFlowerClump_LOD3.glb
 [change] public/foliage/WheatUnderstory/TinyDaisyClump/TinyDaisyClump_LOD0.glb
 [change] public/foliage/WheatUnderstory/TinyDaisyClump/TinyDaisyClump_LOD1.glb
 [change] public/foliage/WheatUnderstory/TinyDaisyClump/TinyDaisyClump_LOD2.glb
 [change] public/foliage/WheatUnderstory/TinyDaisyClump/TinyDaisyClump_LOD3.glb
 [change] public/foliage/WheatUnderstory/WhiteCloverPatch/WhiteCloverPatch_LOD0.glb
 [change] public/foliage/WheatUnderstory/WhiteCloverPatch/WhiteCloverPatch_LOD1.glb
 [change] public/foliage/WheatUnderstory/WhiteCloverPatch/WhiteCloverPatch_LOD2.glb
 [change] public/foliage/WheatUnderstory/WhiteCloverPatch/WhiteCloverPatch_LOD3.glb
2026-05-03 12:43:28 +02:00
2026-04-01 02:55:21 +02:00
2026-04-02 20:27:51 +02:00
2026-05-03 12:43:28 +02:00
2026-04-15 04:21:08 +02:00
2026-03-31 01:32:33 +02:00
2026-03-31 01:32:33 +02:00
2026-04-04 07:55:41 +02:00
2026-04-04 07:55:41 +02:00
2026-03-31 01:32:33 +02:00
2026-03-31 01:32:33 +02:00

WebEditor3D

WebEditor3D is a browser-based engine/editor for authoring interactive 3D environments and running them immediately in the browser.

The core loop is:

  1. author a scene
  2. save or load the project
  3. enter run mode without leaving the editor

The project is focused on fast whiteboxing, imported assets, typed entities, simple interactions, and web-native delivery. It is not intended to replace Blender, CAD tools, or a general-purpose engine platform.

Current Capabilities

  • Whitebox authoring with box, wedge, cylinder, cone, and torus primitives.
  • Object transforms plus face, edge, and vertex selection foundations.
  • Per-face materials, UV controls, climbable faces, water volumes, and light volume settings for whitebox solids.
  • Authored terrain with sculpt and paint tools.
  • GLB/GLTF model import, including multi-file GLTF packages and Draco assets.
  • Imported image and audio assets stored in the project asset registry.
  • Placed modelInstances with explicit collision modes.
  • Typed entities such as PlayerStart, SceneEntry, NPC, CameraRig, TriggerVolume, TeleportTarget, Interactable, local lights, and sound emitters.
  • Interaction links for runtime behavior such as teleport, visibility, audio, animation, control effects, and sequences.
  • Multi-scene project state with scene loading screen settings.
  • Project-wide time, day/night lighting, scheduler routines, sequence authoring, and dialogue foundations.
  • Built-in runner with first-person and third-person navigation, Rapier collision, scene transitions, dialogue overlay, spatial audio, and animation playback.
  • Multi-viewport editor layout with perspective, top, front, and side views.

Getting Started

Use a current Node.js LTS release.

npm install
npm run dev

Vite will print a local URL, typically http://localhost:5173/.

Common Scripts

npm run dev           # start the Vite dev server
npm run build         # typecheck and build the app
npm run typecheck     # run TypeScript without emitting files
npm run lint          # run ESLint
npm test              # run Vitest tests
npm run test:watch    # run Vitest in watch mode
npm run test:browser  # run Playwright browser tests
npm run test:e2e      # alias for Playwright browser tests

Project Files

User-facing save/load uses portable .we3d project packages. A package is a zip archive containing canonical project JSON plus referenced assets.

Important format boundaries:

  • The editable project format is the .we3d project package.
  • The canonical document is versioned and migrated through serialization code.
  • Runtime output is separate from editable save/load.
  • Blob URLs are transient loading details, not persisted asset references.

Architecture Map

  • src/document: canonical project and scene document state.
  • src/commands: undoable editor mutations.
  • src/geometry: derived whitebox, terrain, mesh, and collider generation.
  • src/viewport-three: editor viewport rendering and interaction helpers.
  • src/runtime-three: play-mode runtime, scene build, collision, scheduling, audio, navigation, interactions, and scene transitions.
  • src/assets: imported model, image, audio, and asset storage adapters.
  • src/entities: typed scene objects with editor/runtime semantics.
  • src/interactions: authored trigger/action links.
  • src/controls, src/scheduler, src/sequencer, src/dialogues: shared control surface, time-based orchestration, sequence steps, and dialogue data.
  • src/serialization: JSON serialization, migrations, autosave, and .we3d package import/export.
  • src/app: React editor shell and panels.
  • src/runner-web: React wrapper for the built-in runner canvas.

Development Notes

  • ProjectDocument / SceneDocument is the source of truth.
  • Editor-authored mutations should go through commands.
  • Three.js scenes, meshes, materials, and runtime objects are derived state.
  • Imported assets live in the asset registry.
  • Placed imported assets live in modelInstances.
  • Typed runtime/editor objects live in entities.
  • Global ambient, sun, background, fog, and project time live in project/world settings.

Verification

For a normal code change, run the narrowest relevant checks. Useful defaults are:

npm run typecheck
npm test
npm run test:browser

Use Playwright tests when browser behavior, rendering, input, or the built-in runner is part of the change.

License

No license file is currently included in this repository.

Description
A web-based editor for 3D scenes, managing document structure, rendering layers, and model instances. Features include foliage management and project time settings.
Readme 113 MiB
Languages
TypeScript 99.2%
CSS 0.7%