Skip to content

refactor: EffectsManager missing state model, hover color not configurable, no experiment override API #886

@deveshbervar

Description

@deveshbervar

Context

PR #837 improved EffectsManager significantly — OutlinePass for
selection silhouettes, Fresnel shader for jets, setSelectionColor()
for experiment customization. Strong foundation.

Four gaps remain that block further extensibility, all verified
against current main after #837 merged.


Gap 1 — GLSL embedded as TypeScript strings, no CI validation

VERTEX_SHADER and HOVER_FRAGMENT_SHADER
are private static readonly TypeScript string constants containing
raw GLSL. A syntax error only surfaces at WebGL runtime — never in
yarn test:ci. Search of .github/workflows/ for glslang,
glsl-loader, glsl-validate returns zero results.

The Fresnel shader added in PR #837 (phoenix-objects.ts) follows
the same pattern — no shader in the codebase has a validation path.


Gap 2 — No formal state model

The render path branches on implicit checks:

  • Line 148: if (this.selectedObjectsSet.size > 0)
  • Line 157: else if (this.hoverOutline)
  • Line 219: if (this.selectionOutlinePass && this.selectedObjectsSet.size > 0)
  • Line 268: this.selectionOutlinePass.enabled = this.selectedObjectsSet.size > 0

Search for EffectsState returns zero results — no enum, no typed
state machine exists. Adding a new visual state — DIMMED for pileup
animation (PR #862) or HIGHLIGHTED for masterclass mode — requires
finding and updating every implicit branch with no compiler guidance.


Gap 3 — Hover color hardcoded, selection color configurable

setSelectionColor(color: number) exists at line 328 — experiments
can override the amber selection outline. Hover color is hardcoded
at line 71:

vec3 color = vec3(0.2, 0.6, 1.0);

No setHoverColor() exists. An experiment with blue-colored objects
(e.g. LHCb calorimeter deposits) cannot change hover color without
modifying core code — inconsistent with the configurable selection
color pattern established by #837.


Gap 4 — No experiment effect override API

Search for registerEffect, effectOverride, override in
effects-manager.ts returns zero results. Search of all experiment
pages in packages/phoenix-ng/projects/phoenix-app/src/app/sections/
for effectsManager. calls returns zero results.

The only experiment-configurable API is setSelectionColor().
Experiments wanting custom hover behavior for a specific object type
must fork effects-manager.ts — no extension point exists.


Proposed Fix — Three Phases

Phase 1 — Low risk, independently mergeable:

  • Add EffectsState enum: DEFAULT | HOVERED | SELECTED | HIGHLIGHTED | DIMMED
  • Add setHoverColor(color: number) to match setSelectionColor()
  • Update HOVER_FRAGMENT_SHADER to use uniform vec3 color
  • Full unit tests — no render path changes, no shader extraction yet

Phase 2 — Shader organisation:

  • Extract VERTEX_SHADER and HOVER_FRAGMENT_SHADER to shaders/
  • ShaderRegistry class via glsl-loader
  • Add glslangValidator CI validation step

Phase 3 — Extensibility:

  • registerEffectOverride(objectType, config) API
  • Experiments configure visual behavior per object type without
    forking core code — demonstrated with one working example

Happy to implement all three phases.

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions