Object.h 23 KB

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