- Add detailed README.md with project overview, architecture, and usage examples - Add comprehensive JSDoc documentation to all system files (Controls, Loop, Renderer, Resizer) - Add detailed documentation to component files (Terrain, Landmarks, WorldComponent) - Create CONTRIBUTING.md with development guidelines and coding standards - Create CHANGELOG.md with version history and development timeline - Create SECURITY.md with security policies and vulnerability reporting - Create API.md with comprehensive API documentation and usage examples - Update package.json with better metadata, scripts, and project information - Enhance TypeScript configuration with path aliases and strict settings - Improve Vite configuration with build optimizations and development settings - Update .gitignore with comprehensive patterns for development tools - Add file headers with author information and creation dates from git history This commit transforms the project from a basic template to a well-documented, production-ready World Component library with comprehensive documentation following best practices for open-source projects. Author: Matthew Raymer Security: All dependencies updated, comprehensive security guidelines added Performance: Build optimizations, code splitting, and memory management documented
8.1 KiB
World Component API Documentation
This document provides comprehensive API documentation for the World Component project, including all public interfaces, methods, and usage patterns.
Table of Contents
Core Systems
Controls System
The Controls system provides camera orbit controls for the 3D world.
Controls Class
import { Controls } from '@/systems/Controls';
const controls = new Controls(camera: PerspectiveCamera, canvas: HTMLElement);
Constructor Parameters:
camera: Three.js PerspectiveCamera instancecanvas: HTML element to attach controls to
Methods:
getControls(): OrbitControls- Returns the underlying OrbitControls instance
Configuration:
- Min polar angle: 40° (prevents camera from going below horizon)
- Max polar angle: 75° (prevents camera from going too high)
- Max distance: 250 units
- Damping enabled for smooth movement
Loop System
The Loop system manages the main animation loop and object updates.
Loop Class
import { Loop } from '@/systems/Loop';
const loop = new Loop(camera: PerspectiveCamera, scene: Scene, renderer: WebGLRenderer);
Constructor Parameters:
camera: Three.js PerspectiveCamera instancescene: Three.js Scene instancerenderer: Three.js WebGLRenderer instance
Methods:
start(): void- Starts the animation loopstop(): void- Stops the animation loop
Features:
- Automatic delta time calculation
- Object update management
- Synchronized rendering
Renderer System
The Renderer system provides WebGL rendering abstraction.
Renderer Class
import { Renderer } from '@/systems/Renderer';
const renderer = new Renderer(parameters?: WebGLRendererParameters);
Constructor Parameters:
parameters: Optional WebGL renderer configuration
Properties:
domElement: HTMLCanvasElement- The canvas element for DOM insertion
Methods:
render(scene: Scene, camera: Camera): void- Renders the scene
Resizer System
The Resizer system handles responsive canvas resizing.
Resizer Class
import { Resizer } from '@/systems/Resizer';
const resizer = new Resizer(camera: any, renderer: any);
Constructor Parameters:
camera: Camera to adjust aspect ratio forrenderer: Renderer to resize
Features:
- Automatic window resize handling
- Aspect ratio maintenance
- Pixel ratio optimization
- 50px UI offset compensation
Components
Terrain Component
The Terrain component creates textured terrain planes.
Terrain Class
import { Terrain } from '@/components/objects/Terrain';
const terrain = new Terrain({
width: number,
height: number,
color: Color
});
Constructor Parameters:
props.width: Width of the terrain planeprops.height: Height of the terrain planeprops.color: Base color of the terrain material
Returns: Three.js Mesh object
Features:
- Texture mapping support
- Configurable dimensions
- Flat shading
- Animation compatibility
Landmarks Component
The Landmarks component handles dynamic landmark loading and animation.
LandmarksLoader Class
import { LandmarksLoader } from '@/components/objects/Landmarks';
const landmarksLoader = new LandmarksLoader();
await landmarksLoader.load(vue, world, scene, loop, token);
Methods:
load(vue, world, scene, loop, token): Promise<void>- Loads and creates landmarks
Parameters:
vue: Vue component instanceworld: World object with scene and propertiesscene: Three.js sceneloop: Animation loop instancetoken: Authentication token
Features:
- API data loading
- GLTF model loading
- Timed animations
- Lighting effects
- Error handling
Types and Interfaces
World Object Interface
interface World {
scene: Scene;
bushes: Object3D[];
lights: Light[];
PLATFORM_SIZE: number;
PLATFORM_EDGE_FOR_UNKNOWNS: number;
setExposedWorldProperties(key: string, value: any): void;
}
GiveServerRecord Interface
interface GiveServerRecord {
issuedAt: string;
// Additional properties as defined by the server
}
Terrain Props Interface
interface TerrainProps {
width: number;
height: number;
color: Color;
}
Usage Examples
Basic World Setup
import { Controls } from '@/systems/Controls';
import { Loop } from '@/systems/Loop';
import { Renderer } from '@/systems/Renderer';
import { Resizer } from '@/systems/Resizer';
import { Scene, PerspectiveCamera } from 'three';
// Create Three.js objects
const scene = new Scene();
const camera = new PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new Renderer();
// Initialize systems
const controls = new Controls(camera, renderer.domElement);
const loop = new Loop(camera, scene, renderer);
const resizer = new Resizer(camera, renderer);
// Add to DOM
document.body.appendChild(renderer.domElement);
// Start animation loop
loop.start();
Terrain Creation
import { Terrain } from '@/components/objects/Terrain';
import { Color } from 'three';
const terrain = new Terrain({
width: 100,
height: 100,
color: new Color(0x8B4513) // Brown color
});
scene.add(terrain);
Landmarks Loading
import { LandmarksLoader } from '@/components/objects/Landmarks';
const landmarksLoader = new LandmarksLoader();
try {
await landmarksLoader.load(vue, world, scene, loop, authToken);
} catch (error) {
console.error('Failed to load landmarks:', error);
}
Configuration
Environment Variables
# API Configuration
VITE_API_SERVER=https://api.example.com
VITE_ANIMATION_DURATION_SECS=30
# Development Configuration
VITE_DEV_MODE=true
VITE_DEBUG_LOGGING=true
Build Configuration
The project uses Vite for building with the following optimizations:
- Code Splitting: Automatic chunk splitting
- Tree Shaking: Unused code elimination
- Source Maps: Development debugging support
- Asset Optimization: Automatic asset optimization
TypeScript Configuration
Key TypeScript settings:
- Strict Mode: Enabled for type safety
- Path Aliases: Configured for clean imports
- Decorators: Enabled for Vue-facing-decorator
- Module Resolution: Bundler mode for Vite
Error Handling
Common Error Patterns
// API Error Handling
try {
await landmarksLoader.load(vue, world, scene, loop, token);
} catch (error) {
if (error.response?.status === 401) {
// Handle authentication error
} else if (error.response?.status === 404) {
// Handle not found error
} else {
// Handle general error
}
}
// Three.js Error Handling
try {
const terrain = new Terrain(props);
} catch (error) {
console.error('Terrain creation failed:', error);
// Fallback to basic geometry
}
Error Recovery
- Texture Loading: Fallback to solid colors
- Model Loading: Use placeholder geometry
- API Failures: Graceful degradation
- WebGL Errors: Canvas fallback
Performance Considerations
Optimization Tips
- Object Pooling: Reuse objects when possible
- LOD (Level of Detail): Implement distance-based detail
- Frustum Culling: Only render visible objects
- Texture Compression: Use compressed textures
- Geometry Instancing: Use instanced rendering for repeated objects
Memory Management
// Proper disposal
componentWillUnmount() {
// Dispose of Three.js objects
this.geometry.dispose();
this.material.dispose();
this.texture.dispose();
// Stop animation loop
this.loop.stop();
}
Browser Support
Supported Browsers
- Chrome >= 88
- Firefox >= 85
- Safari >= 14
- Edge >= 88
WebGL Requirements
- WebGL 2.0 support
- Hardware acceleration
- Adequate GPU memory
This API documentation is maintained alongside the codebase and should be updated with any changes to the public interfaces.