design.md 3.6 KB

Context

The reference implementation is a fullscreen three.js WebGPU page with multiple datasets, DOM controls, HDR loading, post-processing, and interaction helpers. This repository needs a reusable dynamic component instead: all visuals should live in the Tres/three WebGL layer, component-specific code should stay in src/components, shader code should live under src/shader/PieChartArt/, and preview integration should be handled by src/dcsConfig.ts.

Goals / Non-Goals

Goals:

  • Render the default Market Share dataset from the reference.
  • Accept JSON data updates and rebuild the chart directly to avoid per-frame geometry churn.
  • Preserve the extruded beveled 3D pie chart feel with labels and leader lines.
  • Use WebGL-compatible three.js code rather than WebGPU/TSL/post-processing.
  • Expose only Chart, label-size, Gradient, and Material controls plus the required data JSON input.
  • Keep code split into focused files because the component has non-trivial geometry, labels, materials, and parsing logic.

Non-Goals:

  • Do not port HDR environment selection, AO, SSR, rendering, lighting, ground, FPS, dataset buttons, or DOM UI from the reference.
  • Do not modify src/views/previewEntry.vue or src/views/templateComponet.vue.
  • Do not add runtime network font or HDR dependencies.
  • Do not implement WebGPU-only APIs.

Decisions

  1. Decision: Build the chart imperatively inside a THREE.Group exposed through a Tres primitive.

    • Rationale: Pie slices, labels, leader lines, and direct rebuilds are easier to manage and dispose with direct three.js objects while still living inside the Tres scene.
  2. Decision: Use ExtrudeGeometry for each slice and three-custom-shader-material over MeshStandardMaterial.

    • Rationale: This keeps bevels, lights, roughness, metalness, and env map intensity compatible with standard WebGL materials while allowing external shader code to drive gradient color.
  3. Decision: Store the default dataset as JSON and parse incoming data with json5.

    • Rationale: The existing config pane already supports JSON text editing through JSON5, and direct rebuild avoids the frame-rate hit from rebuilding extruded geometry every animation frame.
  4. Decision: Use canvas-backed sprite labels instead of WebGPU text geometry or DOM labels.

    • Rationale: Sprites remain inside the WebGL scene, avoid remote font loading, and work in the dynamic component host.
  5. Decision: Provide five automatic color schemes and ignore per-slice color controls by default.

    • Rationale: The user requested palette-level automatic options rather than individual color pickers.

Risks / Trade-offs

  • Risk: Direct rebuilds do not animate between datasets.

    • Mitigation: This avoids low FPS during JSON updates and keeps the component simpler.
  • Risk: Canvas sprite labels are less crisp than vector text when viewed very close.

    • Mitigation: Render labels at high canvas resolution and keep them billboarded toward the camera.
  • Risk: envMapIntensity has limited visible impact when the host scene does not provide an environment map.

    • Mitigation: Keep the prop because it is part of the requested Material controls and will work in hosts that do provide an environment map.

Migration Plan

  • Add src/components/PieChartArt/ with parsing, palette, geometry, label, and component files.
  • Add src/shader/PieChartArt/slice.vert and slice.frag.
  • Add a PieChartArt entry to src/dcsConfig.ts.
  • Add a lightweight preview asset under public/preview/.
  • Perform source/diff inspection only unless the user explicitly asks for build/debug validation.

Open Questions

  • None for the current scope.