spec.md 4.2 KB

ADDED Requirements

Requirement: Support directional flowing smoke emission

The system SHALL provide a 3D flowing smoke component that emits smoke continuously from a configurable origin and direction for exhaust-like scenes.

Scenario: Render default upward smoke plume

  • WHEN the component is rendered with default parameters
  • THEN it MUST display a visible non-zero smoke plume that flows upward continuously in canvas

Scenario: Render custom emission direction

  • WHEN a developer sets a custom emission direction
  • THEN the smoke flow MUST align with that direction so the component can represent scenes such as tailpipe exhaust

Requirement: Control smoke flow rate and density

The component MUST expose independent controls for smoke flow rate and density.

Scenario: Increase flow rate

  • WHEN a developer increases flowRate
  • THEN smoke particles MUST advance faster along the emission path without requiring component remount

Scenario: Increase density

  • WHEN a developer increases density
  • THEN the visible smoke volume MUST become fuller by increasing active particle presence or equivalent visual density

Scenario: Clamp invalid values

  • WHEN a developer passes invalid or extreme values for flowRate or density
  • THEN the component MUST clamp or fallback to safe non-breaking values and continue rendering

Requirement: Control smoke color and dissipation appearance

The component MUST support configurable smoke color and visually fade or dissipate over its lifetime.

Scenario: Apply custom smoke color

  • WHEN a developer sets color
  • THEN the smoke particles MUST render with the configured tint

Scenario: Fade over lifetime

  • WHEN smoke particles move away from the emission origin over their lifetime
  • THEN their opacity MUST decrease so the smoke visually dissipates instead of ending abruptly

Scenario: Expand over lifetime

  • WHEN smoke particles progress through their lifetime
  • THEN their apparent size or spread MUST increase to create a soft expanding plume

Requirement: Support scene-specific spread behavior

The component MUST support configurable spread behavior so that narrow chimney smoke and wider vehicle exhaust can both be represented.

Scenario: Render narrow plume

  • WHEN a developer configures a small spread value
  • THEN the smoke plume MUST remain visually tighter around the main emission direction

Scenario: Render wide exhaust

  • WHEN a developer configures a larger spread value
  • THEN the smoke plume MUST disperse more broadly while preserving the main directional flow

Requirement: Keep implementation in three.js canvas pipeline

The implementation MUST rely on tresjs/three rendering in canvas and MUST NOT use CSS animation for the core smoke behavior.

Scenario: Validate rendering path

  • WHEN the component is loaded in the project preview pipeline
  • THEN all smoke motion, spread, color, and dissipation effects MUST be produced by three.js materials, geometry, and shader logic in canvas

Requirement: Store shader source as component-scoped files

Shader source code MUST be stored under src/shader/flowingSmokeComponent/ and separated into vertex and fragment files.

Scenario: Organize shader files

  • WHEN the flowing smoke component introduces custom shader logic
  • THEN the shader source MUST be read from component-scoped vertex and fragment files instead of inline shader strings in the Vue component

Requirement: Register component defaults and controls in service config

The component MUST be registered through src/dcsConfig.ts with usable defaults and parameter controls for preview and publishing.

Scenario: Load component from config registry

  • WHEN the dynamic component service loads its component list
  • THEN the flowing smoke component MUST be available through src/dcsConfig.ts without modifying the generic preview view files

Scenario: Adjust smoke parameters in config panel

  • WHEN a user opens the component configuration panel
  • THEN the panel MUST expose controls for at least flow rate, density, color, direction, and spread with usable defaults