SpectrumEffectRegistry.ets 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import { SpectrumRenderer } from './SpectrumRenderer'
  2. import { BarSpectrumRenderer } from './BarSpectrumRenderer'
  3. import { WaveSpectrumRenderer } from './WaveSpectrumRenderer'
  4. import { CircleSpectrumRenderer } from './CircleSpectrumRenderer'
  5. import { ParticleSpectrumRenderer } from './ParticleSpectrumRenderer'
  6. import { RadialPulseSpectrumRenderer } from './RadialPulseSpectrumRenderer'
  7. import { MirrorBarSpectrumRenderer } from './MirrorBarSpectrumRenderer'
  8. import { ShadowBarSpectrumRenderer } from './ShadowBarSpectrumRenderer'
  9. import { OrbitLineSpectrumRenderer } from './OrbitLineSpectrumRenderer'
  10. import { DotMatrixSpectrumRenderer } from './DotMatrixSpectrumRenderer'
  11. import { StarburstSpectrumRenderer } from './StarburstSpectrumRenderer'
  12. export type SpectrumPerformanceLevel = 'low' | 'medium' | 'high'
  13. export interface SpectrumEffectPerformanceProfile {
  14. targetFps: number
  15. minFps: number
  16. maxBandCount: number
  17. complexityFloor: number
  18. }
  19. export interface SpectrumEffectDefinition {
  20. effectId: string
  21. displayName: string
  22. performanceLevel: SpectrumPerformanceLevel
  23. performance: SpectrumEffectPerformanceProfile
  24. createRenderer: () => SpectrumRenderer
  25. }
  26. const EFFECTS: SpectrumEffectDefinition[] = [
  27. {
  28. effectId: 'bar',
  29. displayName: '柱状',
  30. performanceLevel: 'medium',
  31. performance: { targetFps: 30, minFps: 18, maxBandCount: 32, complexityFloor: 0.60 },
  32. createRenderer: (): SpectrumRenderer => new BarSpectrumRenderer()
  33. },
  34. {
  35. effectId: 'wave',
  36. displayName: '波形',
  37. performanceLevel: 'medium',
  38. performance: { targetFps: 30, minFps: 18, maxBandCount: 32, complexityFloor: 0.62 },
  39. createRenderer: (): SpectrumRenderer => new WaveSpectrumRenderer()
  40. },
  41. {
  42. effectId: 'circle',
  43. displayName: '圆形',
  44. performanceLevel: 'high',
  45. performance: { targetFps: 30, minFps: 15, maxBandCount: 32, complexityFloor: 0.50 },
  46. createRenderer: (): SpectrumRenderer => new CircleSpectrumRenderer()
  47. },
  48. {
  49. effectId: 'particle',
  50. displayName: '粒子',
  51. performanceLevel: 'high',
  52. performance: { targetFps: 28, minFps: 12, maxBandCount: 24, complexityFloor: 0.45 },
  53. createRenderer: (): SpectrumRenderer => new ParticleSpectrumRenderer()
  54. },
  55. {
  56. effectId: 'radial-pulse',
  57. displayName: '脉冲',
  58. performanceLevel: 'low',
  59. performance: { targetFps: 30, minFps: 20, maxBandCount: 28, complexityFloor: 0.65 },
  60. createRenderer: (): SpectrumRenderer => new RadialPulseSpectrumRenderer()
  61. },
  62. {
  63. effectId: 'mirror-bar',
  64. displayName: '镜像柱',
  65. performanceLevel: 'low',
  66. performance: { targetFps: 30, minFps: 20, maxBandCount: 30, complexityFloor: 0.68 },
  67. createRenderer: (): SpectrumRenderer => new MirrorBarSpectrumRenderer()
  68. },
  69. {
  70. effectId: 'shadow-bar',
  71. displayName: '影子柱',
  72. performanceLevel: 'medium',
  73. performance: { targetFps: 30, minFps: 18, maxBandCount: 32, complexityFloor: 0.60 },
  74. createRenderer: (): SpectrumRenderer => new ShadowBarSpectrumRenderer()
  75. },
  76. {
  77. effectId: 'orbit-line',
  78. displayName: '轨道线',
  79. performanceLevel: 'medium',
  80. performance: { targetFps: 30, minFps: 18, maxBandCount: 28, complexityFloor: 0.60 },
  81. createRenderer: (): SpectrumRenderer => new OrbitLineSpectrumRenderer()
  82. },
  83. {
  84. effectId: 'dot-matrix',
  85. displayName: '点阵',
  86. performanceLevel: 'low',
  87. performance: { targetFps: 30, minFps: 22, maxBandCount: 24, complexityFloor: 0.72 },
  88. createRenderer: (): SpectrumRenderer => new DotMatrixSpectrumRenderer()
  89. },
  90. {
  91. effectId: 'starburst',
  92. displayName: '星爆',
  93. performanceLevel: 'medium',
  94. performance: { targetFps: 30, minFps: 18, maxBandCount: 30, complexityFloor: 0.58 },
  95. createRenderer: (): SpectrumRenderer => new StarburstSpectrumRenderer()
  96. }
  97. ]
  98. const LEGACY_MODE_TO_EFFECT_ID: string[] = ['bar', 'wave', 'circle', 'particle']
  99. export function getSpectrumEffects(): SpectrumEffectDefinition[] {
  100. return EFFECTS
  101. }
  102. export function getDefaultSpectrumEffectId(): string {
  103. return EFFECTS[0].effectId
  104. }
  105. export function findSpectrumEffectById(effectId: string): SpectrumEffectDefinition | undefined {
  106. for (let i = 0; i < EFFECTS.length; i++) {
  107. if (EFFECTS[i].effectId === effectId) {
  108. return EFFECTS[i]
  109. }
  110. }
  111. return undefined
  112. }
  113. export function normalizeSpectrumEffectId(effectId: string | undefined): string {
  114. if (!effectId) {
  115. return getDefaultSpectrumEffectId()
  116. }
  117. const effect: SpectrumEffectDefinition | undefined = findSpectrumEffectById(effectId)
  118. return effect ? effect.effectId : getDefaultSpectrumEffectId()
  119. }
  120. export function fromLegacySpectrumMode(mode: number | undefined): string {
  121. if (mode === undefined || mode < 0 || mode >= LEGACY_MODE_TO_EFFECT_ID.length) {
  122. return getDefaultSpectrumEffectId()
  123. }
  124. return LEGACY_MODE_TO_EFFECT_ID[mode]
  125. }