summaryrefslogtreecommitdiff
path: root/doc/WORKSPACE_SYSTEM.md
diff options
context:
space:
mode:
Diffstat (limited to 'doc/WORKSPACE_SYSTEM.md')
-rw-r--r--doc/WORKSPACE_SYSTEM.md582
1 files changed, 21 insertions, 561 deletions
diff --git a/doc/WORKSPACE_SYSTEM.md b/doc/WORKSPACE_SYSTEM.md
index 6b4319d..f0981fd 100644
--- a/doc/WORKSPACE_SYSTEM.md
+++ b/doc/WORKSPACE_SYSTEM.md
@@ -1,576 +1,36 @@
-# Workspace System (Task #77) [COMPLETED]
+# Workspace System
-## Status
+**Status:** ✅ Complete (Feb 9, 2026)
-**Implemented:** Feb 9, 2026
+Self-contained demo workspaces. Select with `cmake -B build -DDEMO_WORKSPACE=<name>`.
-Workspace system is now active. Use `cmake -B build -DDEMO_WORKSPACE=<name>` to select workspace.
+## Directory Layout
-## Overview
-
-Self-contained demo workspaces for parallel development and clean content separation.
-
-**Motivation:** Current structure scatters demo content across multiple locations:
-- `assets/demo.seq` - Timeline
-- `assets/music.track` - Audio
-- `assets/final/demo_assets.txt` - Asset list
-- `assets/final/music/*.spec` - Audio samples
-- `assets/shaders/*.wgsl` - Shaders (some demo-specific, some shared)
-
-This makes it hard to:
-- Work on multiple demos simultaneously
-- Understand what files belong to which demo
-- Share common resources cleanly
-- Onboard new developers
-
-## Problem Statement
-
-**Current structure (flat):**
```
-/assets/
- demo.seq # Main demo timeline
- music.track # Main demo music
- test_demo.seq # Test demo timeline
- test_demo.track # Test demo music
- /final/
- demo_assets.txt # Main demo assets
- /music/*.spec # Audio samples (mixed usage)
- /shaders/
- *.wgsl # Mixed: common + demo-specific
-```
-
-**Issues:**
-1. No clear ownership of files
-2. Can't easily switch between demos
-3. Assets intermingled (demo vs test)
-4. Shaders hard to categorize (shared vs demo-specific)
-5. Adding new demos requires scattered changes
-
-## Current Structure (Implemented)
-
-### Workspace Directory Layout
-
-```
-/workspaces/
- /main/ # Main production demo
- workspace.cfg # Workspace metadata
- timeline.seq # Visual effects
- music.track # Audio patterns
- assets.txt # Asset list
- /music/*.spec # Audio samples
- /weights/*.bin # CNN binary weights
- /obj/*.obj # 3D models
- /shaders/ # Workspace-specific shaders only
- custom_effect.wgsl
-
- /test/ # Test/validation demo
- workspace.cfg
- timeline.seq
- music.track
- assets.txt
- /music/
- /weights/
- /obj/
- /shaders/
-
-/common/ # Shared resources
- /shaders/
- /math/ # Shared math utilities
- common_utils.wgsl
- noise.wgsl
- sdf_shapes.wgsl
- sdf_utils.wgsl
- /render/ # Shared rendering helpers
- lighting_utils.wgsl
- scene_query_bvh.wgsl
- scene_query_linear.wgsl
- shadows.wgsl
- /compute/ # Shared compute shaders
- gen_blend.wgsl
- gen_grid.wgsl
- gen_mask.wgsl
- gen_noise.wgsl
- gen_perlin.wgsl
- common_uniforms.wgsl
- lighting.wgsl
- passthrough.wgsl
- ray_box.wgsl
- ray_triangle.wgsl
- sdf_primitives.wgsl
- skybox.wgsl
-
-/tools/
- originals/ # Source audio files (.wav, .aif)
-```
-
-### Workspace Configuration
-
-**`workspace.cfg` format:**
-```ini
-[workspace]
-name = "Main Demo"
-description = "Production 64k demo"
-version = "1.0"
+workspaces/
+ main/ # Main production demo
+ timeline.seq # Visual effects
+ music.track # Audio patterns
+ assets.txt # Asset list
+ music/*.spec # Audio samples
+ weights/*.bin # CNN weights
+ obj/*.obj # 3D models
+ shaders/ # Workspace-specific shaders only
+ test/ # Test demo (same structure)
-[build]
-target = "demo64k"
-timeline = "timeline.seq"
-music = "music.track"
-assets = "assets.txt"
-asset_dirs = ["music/", "weights/", "obj/"]
-shader_dirs = ["shaders/"]
-
-[build]
-# Output binary name
-target = "demo64k"
-
-# Include paths (relative to workspace root)
-timeline = "timeline.seq"
-music = "music.track"
-assets = "assets.txt"
-
-# Asset directories
-asset_dirs = ["assets/", "../common/audio/"]
-
-# Shader directories (order matters: workspace-specific first)
-shader_dirs = ["shaders/", "../src/shaders/"]
-
-[options]
-# Default resolution
-width = 1280
-height = 720
-
-# Duration (seconds, -1 = auto-detect)
-duration = -1
-
-# BPM for timeline
-bpm = 120
+src/shaders/ # Shared common shaders (math/, render/, compute/)
```
-## Architecture
-
-### Build System Integration
-
-**CMakeLists.txt changes:**
-```cmake
-# Select active workspace (default: main)
-set(DEMO_WORKSPACE "main" CACHE STRING "Active workspace")
+## Usage
-# Parse workspace config
-set(WORKSPACE_DIR "${CMAKE_SOURCE_DIR}/workspaces/${DEMO_WORKSPACE}")
-set(WORKSPACE_CFG "${WORKSPACE_DIR}/workspace.cfg")
-
-# Read config and set variables
-parse_workspace_config(${WORKSPACE_CFG}
- TIMELINE_PATH
- MUSIC_PATH
- ASSETS_PATH
- ASSET_DIRS
- SHADER_DIRS
- TARGET_NAME
-)
-
-# Generate assets from workspace
-add_custom_command(
- OUTPUT ${GEN_ASSETS_H}
- COMMAND asset_packer ${WORKSPACE_DIR}/${ASSETS_PATH} ...
- DEPENDS ${WORKSPACE_DIR}/${ASSETS_PATH}
-)
-
-# Generate timeline from workspace
-add_custom_command(
- OUTPUT ${GEN_TIMELINE_CC}
- COMMAND seq_compiler ${WORKSPACE_DIR}/${TIMELINE_PATH} ...
- DEPENDS ${WORKSPACE_DIR}/${TIMELINE_PATH}
-)
-
-# Add shader include paths from workspace
-foreach(SHADER_DIR ${SHADER_DIRS})
- list(APPEND SHADER_INCLUDE_DIRS "${WORKSPACE_DIR}/${SHADER_DIR}")
-endforeach()
-```
-
-**Building specific workspace:**
```bash
-# Default (main workspace)
-cmake -S . -B build
-cmake --build build -j4
-
-# Specific workspace
-cmake -S . -B build_test -DDEMO_WORKSPACE=test
-cmake --build build_test -j4
-
-# Experimental workspace
-cmake -S . -B build_exp -DDEMO_WORKSPACE=experiments/demo2024_revision
-cmake --build build_exp -j4
-```
-
-### Asset Packer Changes
-
-**Support workspace-relative paths:**
-```cpp
-// asset_packer.cc
-void PackerContext::resolve_asset_path(const char* rel_path) {
- // Try workspace-local first
- std::string workspace_path = workspace_dir + "/" + rel_path;
- if (file_exists(workspace_path)) {
- return workspace_path;
- }
-
- // Try common assets
- std::string common_path = "assets/common/" + rel_path;
- if (file_exists(common_path)) {
- return common_path;
- }
-
- error("Asset not found: %s", rel_path);
-}
-```
-
-### Shader Composer Changes
-
-**Support multiple include paths:**
-```cpp
-// shader_composer.cc
-class ShaderComposer {
- std::vector<std::string> include_paths_;
-
- void add_include_path(const char* path) {
- include_paths_.push_back(path);
- }
-
- std::string resolve_include(const char* filename) {
- for (const auto& base : include_paths_) {
- std::string full = base + "/" + filename;
- if (file_exists(full)) {
- return full;
- }
- }
- error("Shader include not found: %s", filename);
- }
-};
-```
-
-**Shader includes with search paths:**
-```wgsl
-// workspace-specific shader
-#include "custom_uniforms.wgsl" // From workspaces/main/shaders/
-#include "math/common_utils.wgsl" // From src/shaders/
-```
-
-### CLI Tool
-
-**`scripts/workspace.sh` - Workspace management:**
-```bash
-#!/bin/bash
-# workspace.sh - Manage demo workspaces
-
-case "$1" in
- list)
- # List all workspaces
- ls -1 workspaces/
- ;;
-
- create)
- # Create new workspace from template
- NAME=$2
- mkdir -p workspaces/$NAME/{assets,shaders}
- cp templates/workspace.cfg workspaces/$NAME/
- echo "Created workspace: $NAME"
- ;;
-
- build)
- # Build specific workspace
- NAME=$2
- cmake -S . -B build_$NAME -DDEMO_WORKSPACE=$NAME
- cmake --build build_$NAME -j4
- ;;
-
- info)
- # Show workspace details
- NAME=$2
- cat workspaces/$NAME/workspace.cfg
- ;;
-esac
-```
-
-**Usage:**
-```bash
-./scripts/workspace.sh list
-./scripts/workspace.sh create my_demo
-./scripts/workspace.sh build main
-./scripts/workspace.sh info test
-```
-
-## Implementation Plan
-
-### Phase 1: Create Workspace Structure
-
-**1.1 Create directory tree:**
-```bash
-mkdir -p workspaces/{main,test}/assets
-mkdir -p workspaces/{main,test}/shaders
-mkdir -p assets/common/{shaders,audio}
-```
-
-**1.2 Move existing files:**
-```bash
-# Main demo
-mv assets/demo.seq workspaces/main/timeline.seq
-mv assets/music.track workspaces/main/music.track
-mv assets/final/demo_assets.txt workspaces/main/assets.txt
-mv assets/final/music workspaces/main/assets/
+# Main demo (default)
+cmake -S . -B build -DDEMO_WORKSPACE=main && cmake --build build -j4
# Test demo
-mv assets/test_demo.seq workspaces/test/timeline.seq
-mv assets/test_demo.track workspaces/test/music.track
-cp assets/final/demo_assets.txt workspaces/test/assets.txt # Or create minimal version
-
-# Common shaders
-mv assets/shaders/math assets/common/shaders/
-mv assets/shaders/common_uniforms assets/common/shaders/
-```
-
-**1.3 Create workspace configs:**
-```bash
-# Generate workspace.cfg for main and test
-# See format above
-```
-
-### Phase 2: Update Build System
-
-**2.1 Add workspace parsing:**
-- Create `cmake/ParseWorkspace.cmake`
-- Parse INI-style config
-- Set CMake variables
-
-**2.2 Update CMakeLists.txt:**
-- Add `DEMO_WORKSPACE` option
-- Use workspace paths for assets/timeline/music
-- Pass shader include paths to ShaderComposer
-
-**2.3 Update compiler tools:**
-- `asset_packer`: Accept workspace root dir
-- `seq_compiler`: Accept workspace root dir
-- `tracker_compiler`: Accept workspace root dir
-
-### Phase 3: Update Code
-
-**3.1 ShaderComposer:**
-- Add multi-path include resolution
-- Search workspace shaders first, then common
-
-**3.2 Asset loading:**
-- Update paths to match new structure
-- Ensure backward compatibility during transition
-
-**3.3 Generated code:**
-- Verify generated assets.h/timeline.cc still work
-- Update include paths if needed
-
-### Phase 4: Documentation & Tools
-
-**4.1 Update docs:**
-- README.md: Explain workspace structure
-- HOWTO.md: Document workspace build commands
-- CONTRIBUTING.md: Workspace best practices
-
-**4.2 Create helper scripts:**
-- `scripts/workspace.sh`: Workspace management CLI
-- `templates/workspace.cfg`: Template for new workspaces
-
-**4.3 Update CI:**
-- Build both main and test workspaces
-- Validate workspace isolation
-
-### Phase 5: Migration & Validation
-
-**5.1 Test builds:**
-```bash
-# Build both workspaces
-cmake -S . -B build_main -DDEMO_WORKSPACE=main
-cmake --build build_main -j4
-
-cmake -S . -B build_test -DDEMO_WORKSPACE=test
-cmake --build build_test -j4
-
-# Run tests
-cd build_main && ctest
-cd build_test && ctest
+cmake -S . -B build_test -DDEMO_WORKSPACE=test && cmake --build build_test -j4
```
-**5.2 Verify isolation:**
-- Modify workspace-specific shader → only that workspace affected
-- Modify common shader → both workspaces affected
-
-**5.3 Update .gitignore:**
-```
-/build_*/
-/workspaces/*/generated/
-```
-
-## Benefits
-
-### 1. Clear Ownership
-Each workspace is self-contained:
-```bash
-workspaces/main/
-├── workspace.cfg # Configuration
-├── timeline.seq # Timeline
-├── music.track # Music
-├── assets.txt # Assets
-├── assets/ # Local assets
-└── shaders/ # Local shaders
-```
-
-### 2. Parallel Development
-Multiple developers can work on different demos without conflicts:
-```bash
-# Developer A: Main demo
-cd workspaces/main
-vim timeline.seq
-
-# Developer B: Experimental demo
-cd workspaces/experiments/christmas_demo
-vim timeline.seq
-```
-
-### 3. Easy Switching
-```bash
-# Build main demo
-cmake -B build -DDEMO_WORKSPACE=main
-./build/demo64k
-
-# Build test demo
-cmake -B build -DDEMO_WORKSPACE=test
-./build/test_demo
-```
-
-### 4. Clean Sharing
-Common resources in one place:
-```
-assets/common/
-├── shaders/
-│ ├── math/ # Shared by all
-│ └── common_uniforms/
-└── audio/
- └── standard_drums.spec
-```
-
-### 5. Scalability
-Easy to add new demos:
-```bash
-./scripts/workspace.sh create party2025
-cd workspaces/party2025
-# Start developing...
-```
-
-## Migration Path
-
-### Backward Compatibility
-
-During transition, support both structures:
-```cmake
-if(EXISTS "${CMAKE_SOURCE_DIR}/workspaces/${DEMO_WORKSPACE}")
- # New workspace structure
- set(USING_WORKSPACES TRUE)
-else()
- # Legacy flat structure
- set(USING_WORKSPACES FALSE)
-endif()
-```
-
-### Gradual Migration
-
-1. **Phase 1:** Create workspace structure alongside existing
-2. **Phase 2:** Update build system to support both
-3. **Phase 3:** Move files to workspaces
-4. **Phase 4:** Remove legacy paths
-5. **Phase 5:** Update all documentation
-
-**Timeline:** 1-2 weeks for full migration
-
-## Trade-offs
-
-### Pros
-- Clear project organization
-- Parallel demo development
-- Clean resource sharing
-- Better onboarding for new devs
-- Scales to many demos
-
-### Cons
-- Initial migration effort
-- Build system complexity increases
-- More directories to navigate
-- Learning curve for contributors
-
-### Alternative Approaches
-
-**1. Monorepo with subprojects:**
-- Separate CMake projects per demo
-- More isolated but harder to share code
-
-**2. Configuration files only:**
-- Keep flat structure, use config to select files
-- Less clear, harder to understand ownership
-
-**3. Git branches per demo:**
-- Each demo is a branch
-- Conflicts when merging shared code
-
-**Chosen:** Workspace system (best balance)
-
-## Implementation Effort
-
-**Estimated time: 12-16 hours**
-
-- Phase 1: Create structure (2-3 hours)
-- Phase 2: Build system (4-5 hours)
-- Phase 3: Code updates (3-4 hours)
-- Phase 4: Documentation (2-3 hours)
-- Phase 5: Validation (1-2 hours)
-
-**Priority:** Medium (improves workflow, not blocking)
-
-## Success Criteria
-
-1. Both `main` and `test` workspaces build successfully
-2. Switching workspaces requires only CMake flag change
-3. Workspace-specific changes don't affect other workspaces
-4. Common shader changes affect all workspaces
-5. New workspace creation takes < 5 minutes
-6. All tests pass for both workspaces
-7. Documentation clear for new contributors
-
-## Related Files
-
-**New files:**
-- `workspaces/main/workspace.cfg` - Main demo config
-- `workspaces/test/workspace.cfg` - Test demo config
-- `cmake/ParseWorkspace.cmake` - Config parser
-- `scripts/workspace.sh` - Workspace CLI tool
-- `templates/workspace.cfg` - New workspace template
-
-**Modified files:**
-- `CMakeLists.txt` - Workspace support
-- `tools/asset_packer.cc` - Multi-path resolution
-- `src/gpu/shader_composer.cc` - Multi-path includes
-- `README.md` - Workspace documentation
-- `doc/HOWTO.md` - Build commands
-- `doc/CONTRIBUTING.md` - Workspace guidelines
-
-**Moved files:**
-- `assets/demo.seq` → `workspaces/main/timeline.seq`
-- `assets/music.track` → `workspaces/main/music.track`
-- `assets/final/demo_assets.txt` → `workspaces/main/assets.txt`
-- `assets/test_demo.*` → `workspaces/test/`
-- `assets/shaders/math/` → `assets/common/shaders/math/`
-
-## Notes
+Shared shaders in `src/shaders/` are referenced as `../../src/shaders/...` in `assets.txt`.
-- This is a **structural refactor**, not a feature
-- No runtime behavior changes
-- Enables future scalability
-- Makes project more professional
-- Good foundation for demoscene releases (multiple demos per repo)
+See `doc/archive/WORKSPACE_SYSTEM.md` for full design and implementation history.