Object.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  1. #pragma once
  2. #include <map>
  3. #include <optional>
  4. #include <string>
  5. #include <utility>
  6. #include <vector>
  7. #include <glm/glm.hpp>
  8. #include "Effect.h"
  9. #include "Material.h"
  10. #include "Model.h"
  11. #include "Types.h"
  12. #include "UserSetting.h"
  13. #include "WallpaperEngine/Data/Utils/TypeCaster.h"
  14. #include <memory>
  15. namespace WallpaperEngine::Data::Model {
  16. using namespace WallpaperEngine::Data::Utils;
  17. struct ObjectData {
  18. int id;
  19. std::string name;
  20. std::vector<int> dependencies;
  21. std::optional<int> parent;
  22. /** The point of origin of the object */
  23. UserSettingUniquePtr origin;
  24. /** Transform fields for generic scene/group objects. Typed objects keep their own transform fields. */
  25. UserSettingUniquePtr groupScale;
  26. UserSettingUniquePtr groupAngles;
  27. UserSettingUniquePtr groupVisible;
  28. };
  29. /**
  30. * Base class for all objects, represents a single object in the scene
  31. *
  32. * @see Image
  33. * @see Sound
  34. * @see Particle
  35. * @see Text
  36. * @see Light
  37. */
  38. class Object : public TypeCaster, public ObjectData {
  39. public:
  40. explicit Object (ObjectData data) noexcept : TypeCaster (), ObjectData (std::move (data)) { };
  41. ~Object () override = default;
  42. };
  43. /**
  44. * Overrides effect's passes configuration
  45. *
  46. * @see ImageEffect
  47. * @see EffectPass
  48. */
  49. struct ImageEffectPassOverride {
  50. int id;
  51. ComboMap combos;
  52. ShaderConstantMap constants;
  53. TextureMap textures;
  54. std::optional<std::string> shaderOverride; // Overrides MaterialPass::shader when set
  55. };
  56. /**
  57. * Override information for an specific effect
  58. *
  59. * @see ImageEffect
  60. * @see Effect
  61. * @see EffectPass
  62. * @see ImageEffectPass
  63. */
  64. struct ImageEffect {
  65. /** Not sure what it's used for */
  66. int id;
  67. /** Effect's name for the editor */
  68. std::string name;
  69. /** If this effect is visible or not */
  70. UserSettingUniquePtr visible;
  71. /** Pass overrides to apply to the effect's passes */
  72. std::vector<ImageEffectPassOverrideUniquePtr> passOverrides;
  73. /** The effect definition */
  74. EffectUniquePtr effect;
  75. };
  76. /**
  77. * Animation layers for the puppet warp
  78. */
  79. struct ImageAnimationLayer {
  80. int id;
  81. UserSettingUniquePtr rate;
  82. UserSettingUniquePtr visible;
  83. UserSettingUniquePtr blend;
  84. UserSettingUniquePtr animation;
  85. };
  86. struct ImageData {
  87. /** The scale of the image */
  88. UserSettingUniquePtr scale;
  89. /** The rotation of the image */
  90. UserSettingUniquePtr angles;
  91. /** If the image is visible or not */
  92. UserSettingUniquePtr visible;
  93. /** The alpha of the image */
  94. UserSettingUniquePtr alpha;
  95. /** The color of the image */
  96. UserSettingUniquePtr color;
  97. // TODO: WRITE A COUPLE OF ENUMS FOR THIS
  98. /** The alignment of the image */
  99. std::string alignment;
  100. /** The size of the image in pixels */
  101. glm::vec2 size;
  102. /** Parallax depth used for parallax scrolling */
  103. UserSettingUniquePtr parallaxDepth;
  104. /** The color blending mode for this image */
  105. UserSettingUniquePtr colorBlendMode;
  106. /** The brightness of the image */
  107. UserSettingUniquePtr brightness;
  108. /** The material in use for this image */
  109. ModelUniquePtr model;
  110. /** The effects applied to this image after the material is rendered */
  111. std::vector<ImageEffectUniquePtr> effects;
  112. /** The animation layers used in the puppet warp */
  113. std::vector<ImageAnimationLayerUniquePtr> animationLayers;
  114. };
  115. class Image : public Object, public ImageData {
  116. public:
  117. explicit Image (ObjectData data, ImageData imageData) noexcept :
  118. Object (std::move (data)), ImageData (std::move (imageData)) { };
  119. ~Image () override = default;
  120. };
  121. struct SoundData {
  122. /** Playback mode, loop, */
  123. // TODO: WRITE AN ENUM FOR THIS
  124. std::optional<std::string> playbackmode;
  125. std::vector<std::string> sounds;
  126. };
  127. class Sound : public Object, public SoundData {
  128. public:
  129. explicit Sound (ObjectData data, SoundData soundData) noexcept :
  130. Object (std::move (data)), SoundData (std::move (soundData)) { };
  131. ~Sound () override = default;
  132. };
  133. /**
  134. * Particle control points for forces and positions
  135. */
  136. struct ParticleControlPoint {
  137. int id;
  138. uint32_t flags;
  139. glm::vec3 offset;
  140. bool lockToPointer;
  141. };
  142. /**
  143. * Particle emitter configuration
  144. */
  145. struct ParticleEmitter {
  146. int id;
  147. std::string name;
  148. glm::vec3 directions;
  149. glm::vec3 distanceMin;
  150. glm::vec3 distanceMax;
  151. glm::vec3 origin;
  152. glm::ivec3 sign;
  153. uint32_t instantaneous;
  154. float speedMin;
  155. float speedMax;
  156. float rate;
  157. int controlPoint;
  158. uint32_t flags;
  159. float cone;
  160. float delay;
  161. float duration;
  162. glm::vec2 audioProcessingBounds;
  163. int audioProcessingExponent;
  164. int audioProcessingFrequencyStart;
  165. int audioProcessingFrequencyEnd;
  166. int audioProcessingMode;
  167. float minPeriodicDelay;
  168. float maxPeriodicDelay;
  169. float minPeriodicDuration;
  170. float maxPeriodicDuration;
  171. };
  172. /**
  173. * Particle initializer base and implementations
  174. */
  175. class ParticleInitializerBase : public TypeCaster {
  176. public:
  177. virtual ~ParticleInitializerBase () = default;
  178. };
  179. class ColorRandomInitializer : public ParticleInitializerBase {
  180. public:
  181. ColorRandomInitializer (UserSettingUniquePtr min, UserSettingUniquePtr max) :
  182. min (std::move (min)), max (std::move (max)) { }
  183. UserSettingUniquePtr min;
  184. UserSettingUniquePtr max;
  185. };
  186. class SizeRandomInitializer : public ParticleInitializerBase {
  187. public:
  188. SizeRandomInitializer (UserSettingUniquePtr min, UserSettingUniquePtr max, UserSettingUniquePtr exponent) :
  189. min (std::move (min)), max (std::move (max)), exponent (std::move (exponent)) { }
  190. UserSettingUniquePtr min;
  191. UserSettingUniquePtr max;
  192. UserSettingUniquePtr exponent;
  193. };
  194. class AlphaRandomInitializer : public ParticleInitializerBase {
  195. public:
  196. AlphaRandomInitializer (UserSettingUniquePtr min, UserSettingUniquePtr max) :
  197. min (std::move (min)), max (std::move (max)) { }
  198. UserSettingUniquePtr min;
  199. UserSettingUniquePtr max;
  200. };
  201. class LifetimeRandomInitializer : public ParticleInitializerBase {
  202. public:
  203. LifetimeRandomInitializer (UserSettingUniquePtr min, UserSettingUniquePtr max) :
  204. min (std::move (min)), max (std::move (max)) { }
  205. UserSettingUniquePtr min;
  206. UserSettingUniquePtr max;
  207. };
  208. class VelocityRandomInitializer : public ParticleInitializerBase {
  209. public:
  210. VelocityRandomInitializer (UserSettingUniquePtr min, UserSettingUniquePtr max) :
  211. min (std::move (min)), max (std::move (max)) { }
  212. UserSettingUniquePtr min;
  213. UserSettingUniquePtr max;
  214. };
  215. class RotationRandomInitializer : public ParticleInitializerBase {
  216. public:
  217. RotationRandomInitializer (UserSettingUniquePtr min, UserSettingUniquePtr max) :
  218. min (std::move (min)), max (std::move (max)) { }
  219. UserSettingUniquePtr min;
  220. UserSettingUniquePtr max;
  221. };
  222. class AngularVelocityRandomInitializer : public ParticleInitializerBase {
  223. public:
  224. AngularVelocityRandomInitializer (
  225. UserSettingUniquePtr min, UserSettingUniquePtr max, UserSettingUniquePtr exponent
  226. ) : min (std::move (min)), max (std::move (max)), exponent (std::move (exponent)) { }
  227. UserSettingUniquePtr min;
  228. UserSettingUniquePtr max;
  229. UserSettingUniquePtr exponent;
  230. };
  231. class TurbulentVelocityRandomInitializer : public ParticleInitializerBase {
  232. public:
  233. TurbulentVelocityRandomInitializer (
  234. UserSettingUniquePtr speedMin, UserSettingUniquePtr speedMax, UserSettingUniquePtr scale,
  235. UserSettingUniquePtr offset, UserSettingUniquePtr forward, UserSettingUniquePtr timeScale,
  236. UserSettingUniquePtr phaseMin, UserSettingUniquePtr phaseMax, UserSettingUniquePtr right
  237. ) :
  238. speedMin (std::move (speedMin)), speedMax (std::move (speedMax)), scale (std::move (scale)),
  239. offset (std::move (offset)), forward (std::move (forward)), timeScale (std::move (timeScale)),
  240. phaseMin (std::move (phaseMin)), phaseMax (std::move (phaseMax)), right (std::move (right)) { }
  241. UserSettingUniquePtr speedMin;
  242. UserSettingUniquePtr speedMax;
  243. UserSettingUniquePtr scale;
  244. UserSettingUniquePtr offset;
  245. UserSettingUniquePtr forward;
  246. UserSettingUniquePtr timeScale;
  247. UserSettingUniquePtr phaseMin;
  248. UserSettingUniquePtr phaseMax;
  249. UserSettingUniquePtr right;
  250. };
  251. class MapSequenceAroundControlPointInitializer : public ParticleInitializerBase {
  252. public:
  253. MapSequenceAroundControlPointInitializer (
  254. UserSettingUniquePtr controlPoint, UserSettingUniquePtr count, UserSettingUniquePtr speedMin,
  255. UserSettingUniquePtr speedMax
  256. ) :
  257. controlPoint (std::move (controlPoint)), count (std::move (count)), speedMin (std::move (speedMin)),
  258. speedMax (std::move (speedMax)) { }
  259. UserSettingUniquePtr controlPoint;
  260. UserSettingUniquePtr count;
  261. UserSettingUniquePtr speedMin;
  262. UserSettingUniquePtr speedMax;
  263. };
  264. using ParticleInitializerUniquePtr = std::unique_ptr<ParticleInitializerBase>;
  265. /**
  266. * Particle operator base and implementations
  267. */
  268. class ParticleOperatorBase : public TypeCaster {
  269. public:
  270. virtual ~ParticleOperatorBase () = default;
  271. };
  272. class MovementOperator : public ParticleOperatorBase {
  273. public:
  274. MovementOperator (UserSettingUniquePtr drag, UserSettingUniquePtr gravity) :
  275. drag (std::move (drag)), gravity (std::move (gravity)) { }
  276. UserSettingUniquePtr drag;
  277. UserSettingUniquePtr gravity;
  278. };
  279. class AngularMovementOperator : public ParticleOperatorBase {
  280. public:
  281. AngularMovementOperator (UserSettingUniquePtr drag, UserSettingUniquePtr force) :
  282. drag (std::move (drag)), force (std::move (force)) { }
  283. UserSettingUniquePtr drag;
  284. UserSettingUniquePtr force;
  285. };
  286. class AlphaFadeOperator : public ParticleOperatorBase {
  287. public:
  288. AlphaFadeOperator (UserSettingUniquePtr fadeInTime, UserSettingUniquePtr fadeOutTime) :
  289. fadeInTime (std::move (fadeInTime)), fadeOutTime (std::move (fadeOutTime)) { }
  290. UserSettingUniquePtr fadeInTime;
  291. UserSettingUniquePtr fadeOutTime;
  292. };
  293. class SizeChangeOperator : public ParticleOperatorBase {
  294. public:
  295. SizeChangeOperator (
  296. UserSettingUniquePtr startTime, UserSettingUniquePtr endTime, UserSettingUniquePtr startValue,
  297. UserSettingUniquePtr endValue
  298. ) :
  299. startTime (std::move (startTime)), endTime (std::move (endTime)), startValue (std::move (startValue)),
  300. endValue (std::move (endValue)) { }
  301. UserSettingUniquePtr startTime;
  302. UserSettingUniquePtr endTime;
  303. UserSettingUniquePtr startValue;
  304. UserSettingUniquePtr endValue;
  305. };
  306. class AlphaChangeOperator : public ParticleOperatorBase {
  307. public:
  308. AlphaChangeOperator (
  309. UserSettingUniquePtr startTime, UserSettingUniquePtr endTime, UserSettingUniquePtr startValue,
  310. UserSettingUniquePtr endValue
  311. ) :
  312. startTime (std::move (startTime)), endTime (std::move (endTime)), startValue (std::move (startValue)),
  313. endValue (std::move (endValue)) { }
  314. UserSettingUniquePtr startTime;
  315. UserSettingUniquePtr endTime;
  316. UserSettingUniquePtr startValue;
  317. UserSettingUniquePtr endValue;
  318. };
  319. class ColorChangeOperator : public ParticleOperatorBase {
  320. public:
  321. ColorChangeOperator (
  322. UserSettingUniquePtr startTime, UserSettingUniquePtr endTime, UserSettingUniquePtr startValue,
  323. UserSettingUniquePtr endValue
  324. ) :
  325. startTime (std::move (startTime)), endTime (std::move (endTime)), startValue (std::move (startValue)),
  326. endValue (std::move (endValue)) { }
  327. UserSettingUniquePtr startTime;
  328. UserSettingUniquePtr endTime;
  329. UserSettingUniquePtr startValue;
  330. UserSettingUniquePtr endValue;
  331. };
  332. class TurbulenceOperator : public ParticleOperatorBase {
  333. public:
  334. TurbulenceOperator (
  335. UserSettingUniquePtr scale, UserSettingUniquePtr speedMin, UserSettingUniquePtr speedMax,
  336. UserSettingUniquePtr timeScale, UserSettingUniquePtr mask, UserSettingUniquePtr phaseMin,
  337. UserSettingUniquePtr phaseMax, UserSettingUniquePtr audioProcessingMode,
  338. UserSettingUniquePtr audioProcessingBounds, UserSettingUniquePtr audioProcessingExponent,
  339. UserSettingUniquePtr audioProcessingFrequencyStart, UserSettingUniquePtr audioProcessingFrequencyEnd
  340. ) :
  341. scale (std::move (scale)), speedMin (std::move (speedMin)), speedMax (std::move (speedMax)),
  342. timeScale (std::move (timeScale)), mask (std::move (mask)), phaseMin (std::move (phaseMin)),
  343. phaseMax (std::move (phaseMax)), audioProcessingMode (std::move (audioProcessingMode)),
  344. audioProcessingBounds (std::move (audioProcessingBounds)),
  345. audioProcessingExponent (std::move (audioProcessingExponent)),
  346. audioProcessingFrequencyStart (std::move (audioProcessingFrequencyStart)),
  347. audioProcessingFrequencyEnd (std::move (audioProcessingFrequencyEnd)) { }
  348. UserSettingUniquePtr scale;
  349. UserSettingUniquePtr speedMin;
  350. UserSettingUniquePtr speedMax;
  351. UserSettingUniquePtr timeScale;
  352. UserSettingUniquePtr mask;
  353. UserSettingUniquePtr phaseMin;
  354. UserSettingUniquePtr phaseMax;
  355. UserSettingUniquePtr audioProcessingMode;
  356. UserSettingUniquePtr audioProcessingBounds;
  357. UserSettingUniquePtr audioProcessingExponent;
  358. UserSettingUniquePtr audioProcessingFrequencyStart;
  359. UserSettingUniquePtr audioProcessingFrequencyEnd;
  360. };
  361. class VortexOperator : public ParticleOperatorBase {
  362. public:
  363. VortexOperator (
  364. int controlPoint, int flags, UserSettingUniquePtr axis, UserSettingUniquePtr offset,
  365. UserSettingUniquePtr distanceInner, UserSettingUniquePtr distanceOuter, UserSettingUniquePtr speedInner,
  366. UserSettingUniquePtr speedOuter, UserSettingUniquePtr centerForce, UserSettingUniquePtr ringRadius,
  367. UserSettingUniquePtr ringWidth, UserSettingUniquePtr ringPullDistance, UserSettingUniquePtr ringPullForce,
  368. UserSettingUniquePtr audioProcessingMode, UserSettingUniquePtr audioProcessingBounds
  369. ) :
  370. controlPoint (controlPoint), flags (flags), axis (std::move (axis)), offset (std::move (offset)),
  371. distanceInner (std::move (distanceInner)), distanceOuter (std::move (distanceOuter)),
  372. speedInner (std::move (speedInner)), speedOuter (std::move (speedOuter)), centerForce (std::move (centerForce)),
  373. ringRadius (std::move (ringRadius)), ringWidth (std::move (ringWidth)),
  374. ringPullDistance (std::move (ringPullDistance)), ringPullForce (std::move (ringPullForce)),
  375. audioProcessingMode (std::move (audioProcessingMode)),
  376. audioProcessingBounds (std::move (audioProcessingBounds)) { }
  377. int controlPoint;
  378. int flags; // 1 = infinite axis, 2 = maintain distance to center, 4 = ring shape
  379. UserSettingUniquePtr axis;
  380. UserSettingUniquePtr offset;
  381. UserSettingUniquePtr distanceInner; // Standard vortex inner radius
  382. UserSettingUniquePtr distanceOuter; // Standard vortex outer radius
  383. UserSettingUniquePtr speedInner;
  384. UserSettingUniquePtr speedOuter;
  385. UserSettingUniquePtr centerForce; // Strength to pull particles toward center
  386. UserSettingUniquePtr ringRadius; // Ring mode: radius of the ring
  387. UserSettingUniquePtr ringWidth; // Ring mode: width of the ring
  388. UserSettingUniquePtr ringPullDistance; // Ring mode: distance at which ring attracts particles
  389. UserSettingUniquePtr ringPullForce; // Ring mode: strength of ring attraction
  390. UserSettingUniquePtr audioProcessingMode;
  391. UserSettingUniquePtr audioProcessingBounds;
  392. };
  393. class ControlPointAttractOperator : public ParticleOperatorBase {
  394. public:
  395. ControlPointAttractOperator (
  396. int controlPoint, UserSettingUniquePtr origin, UserSettingUniquePtr scale, UserSettingUniquePtr threshold
  397. ) :
  398. controlPoint (controlPoint), origin (std::move (origin)), scale (std::move (scale)),
  399. threshold (std::move (threshold)) { }
  400. int controlPoint;
  401. UserSettingUniquePtr origin;
  402. UserSettingUniquePtr scale;
  403. UserSettingUniquePtr threshold;
  404. };
  405. class OscillateAlphaOperator : public ParticleOperatorBase {
  406. public:
  407. OscillateAlphaOperator (
  408. UserSettingUniquePtr frequencyMin, UserSettingUniquePtr frequencyMax, UserSettingUniquePtr scaleMin,
  409. UserSettingUniquePtr scaleMax, UserSettingUniquePtr phaseMin, UserSettingUniquePtr phaseMax
  410. ) :
  411. frequencyMin (std::move (frequencyMin)), frequencyMax (std::move (frequencyMax)),
  412. scaleMin (std::move (scaleMin)), scaleMax (std::move (scaleMax)), phaseMin (std::move (phaseMin)),
  413. phaseMax (std::move (phaseMax)) { }
  414. UserSettingUniquePtr frequencyMin;
  415. UserSettingUniquePtr frequencyMax;
  416. UserSettingUniquePtr scaleMin;
  417. UserSettingUniquePtr scaleMax;
  418. UserSettingUniquePtr phaseMin;
  419. UserSettingUniquePtr phaseMax;
  420. };
  421. class OscillateSizeOperator : public ParticleOperatorBase {
  422. public:
  423. OscillateSizeOperator (
  424. UserSettingUniquePtr frequencyMin, UserSettingUniquePtr frequencyMax, UserSettingUniquePtr scaleMin,
  425. UserSettingUniquePtr scaleMax, UserSettingUniquePtr phaseMin, UserSettingUniquePtr phaseMax
  426. ) :
  427. frequencyMin (std::move (frequencyMin)), frequencyMax (std::move (frequencyMax)),
  428. scaleMin (std::move (scaleMin)), scaleMax (std::move (scaleMax)), phaseMin (std::move (phaseMin)),
  429. phaseMax (std::move (phaseMax)) { }
  430. UserSettingUniquePtr frequencyMin;
  431. UserSettingUniquePtr frequencyMax;
  432. UserSettingUniquePtr scaleMin;
  433. UserSettingUniquePtr scaleMax;
  434. UserSettingUniquePtr phaseMin;
  435. UserSettingUniquePtr phaseMax;
  436. };
  437. class OscillatePositionOperator : public ParticleOperatorBase {
  438. public:
  439. OscillatePositionOperator (
  440. UserSettingUniquePtr frequencyMin, UserSettingUniquePtr frequencyMax, UserSettingUniquePtr scaleMin,
  441. UserSettingUniquePtr scaleMax, UserSettingUniquePtr phaseMin, UserSettingUniquePtr phaseMax,
  442. UserSettingUniquePtr mask
  443. ) :
  444. frequencyMin (std::move (frequencyMin)), frequencyMax (std::move (frequencyMax)),
  445. scaleMin (std::move (scaleMin)), scaleMax (std::move (scaleMax)), phaseMin (std::move (phaseMin)),
  446. phaseMax (std::move (phaseMax)), mask (std::move (mask)) { }
  447. UserSettingUniquePtr frequencyMin;
  448. UserSettingUniquePtr frequencyMax;
  449. UserSettingUniquePtr scaleMin;
  450. UserSettingUniquePtr scaleMax;
  451. UserSettingUniquePtr phaseMin;
  452. UserSettingUniquePtr phaseMax;
  453. UserSettingUniquePtr mask;
  454. };
  455. using ParticleOperatorUniquePtr = std::unique_ptr<ParticleOperatorBase>;
  456. /**
  457. * Particle renderer configuration
  458. */
  459. struct ParticleRenderer {
  460. std::string name;
  461. float length;
  462. float maxLength;
  463. float minLength;
  464. float subdivision;
  465. float segments; // ropetrail: number of history segments per particle
  466. float uvScale;
  467. bool uvScrolling;
  468. bool uvSmoothing; // rope only: reduces flickering when lifetimes are identical
  469. bool fadeAlpha; // ropetrail: fade alpha along trail
  470. bool fadeSize; // ropetrail: fade size along trail
  471. };
  472. /**
  473. * Child particle system
  474. */
  475. struct ParticleChild {
  476. std::string type;
  477. std::string name;
  478. int maxCount;
  479. int controlPointStartIndex;
  480. float probability;
  481. glm::vec3 angles;
  482. glm::vec3 origin;
  483. glm::vec3 scale;
  484. std::string particleFile;
  485. };
  486. /**
  487. * Instance override values
  488. */
  489. struct ParticleInstanceOverride {
  490. UserSettingUniquePtr enabled;
  491. UserSettingUniquePtr alpha;
  492. UserSettingUniquePtr size;
  493. UserSettingUniquePtr lifetime;
  494. UserSettingUniquePtr rate;
  495. UserSettingUniquePtr speed;
  496. UserSettingUniquePtr count;
  497. UserSettingUniquePtr color; // Replaces particle color
  498. UserSettingUniquePtr colorn; // Multiplies particle color
  499. };
  500. struct ParticleData {
  501. /** Position and transformation */
  502. UserSettingUniquePtr scale;
  503. UserSettingUniquePtr angles;
  504. UserSettingUniquePtr visible;
  505. /** Parallax depth */
  506. UserSettingUniquePtr parallaxDepth;
  507. /** Reference to particle definition file */
  508. std::string particleFile;
  509. /** Particle system configuration */
  510. std::string animationMode;
  511. float sequenceMultiplier;
  512. uint32_t maxCount;
  513. uint32_t startTime;
  514. uint32_t flags;
  515. /** Material for rendering */
  516. ModelUniquePtr material;
  517. /** Emitters, initializers, operators, renderers */
  518. std::vector<ParticleEmitter> emitters;
  519. std::vector<ParticleInitializerUniquePtr> initializers;
  520. std::vector<ParticleOperatorUniquePtr> operators;
  521. std::vector<ParticleRenderer> renderers;
  522. std::vector<ParticleControlPoint> controlPoints;
  523. std::vector<ParticleChild> children;
  524. /** Instance override */
  525. ParticleInstanceOverride instanceOverride;
  526. };
  527. class Particle : public Object, public ParticleData {
  528. public:
  529. explicit Particle (ObjectData data, ParticleData particleData) noexcept :
  530. Object (std::move (data)), ParticleData (std::move (particleData)) { };
  531. ~Particle () override = default;
  532. };
  533. /**
  534. * Text object data. Phase 1 of text support covers only static text;
  535. * dynamic (script-driven) text captures the script source for a future
  536. * pass but renders whatever initial value the scene provides.
  537. */
  538. struct TextData {
  539. /** Initial text content to render (for scripted text, this is the `value` placeholder) */
  540. std::string text;
  541. /** Scripted text source — full JS, resolved inline or loaded from a .js asset. Empty for static text. */
  542. std::string script;
  543. /** Typed initial values for the script's scriptProperties, keyed by property name */
  544. std::map<std::string, UserSettingUniquePtr> scriptProperties;
  545. /** Font reference from scene (e.g. "fonts/VCR_OSD_MONO.ttf" or "systemfont_arial") */
  546. std::string font;
  547. /** Font size in points, optionally bound to a user setting or script */
  548. UserSettingUniquePtr pointSize;
  549. /** Bounding box size */
  550. glm::vec2 size;
  551. /** Scale (x, y, z) */
  552. UserSettingUniquePtr scale;
  553. /** Text color as linear-space RGB */
  554. UserSettingUniquePtr color;
  555. /** Alpha multiplier */
  556. UserSettingUniquePtr alpha;
  557. /** Whether the text is visible */
  558. UserSettingUniquePtr visible;
  559. /** Horizontal alignment: "left", "center", "right" */
  560. std::string alignment;
  561. /** Vertical alignment: "top", "center", "bottom" */
  562. std::string verticalalign;
  563. /** Padding inside the bounding box */
  564. int padding;
  565. };
  566. class Text : public Object, public TextData {
  567. public:
  568. explicit Text (ObjectData data, TextData textData) noexcept :
  569. Object (std::move (data)), TextData (std::move (textData)) { };
  570. ~Text () override = default;
  571. };
  572. } // namespace WallpaperEngine::Data::Model