Browse Source

chore: some puppet info parsing

Almamu 1 năm trước cách đây
mục cha
commit
d3c235e7bb

+ 2 - 0
src/WallpaperEngine/Data/Model/Model.h

@@ -26,5 +26,7 @@ struct ModelStruct {
     std::optional<int> width;
     /** Not sure what's used for */
     std::optional<int> height;
+    /** Model file for puppet */
+    std::optional <std::string> puppet;
 };
 } // namespace WallpaperEngine::Data::Model

+ 13 - 0
src/WallpaperEngine/Data/Model/Object.h

@@ -71,6 +71,17 @@ struct ImageEffect {
     EffectUniquePtr effect;
 };
 
+/**
+ * Animation layers for the puppet warp
+ */
+struct ImageAnimationLayer {
+    int id;
+    float rate;
+    bool visible;
+    float blend;
+    int animation;
+};
+
 struct ImageData {
     /** The point of origin of the image */
     UserSettingUniquePtr origin;
@@ -99,6 +110,8 @@ struct ImageData {
     ModelUniquePtr model;
     /** The effects applied to this image after the material is rendered */
     std::vector <ImageEffectUniquePtr> effects;
+    /** The animation layers used in the puppet warp */
+    std::vector <ImageAnimationLayerUniquePtr> animationLayers;
 };
 
 class Image : public Object, public ImageData {

+ 2 - 0
src/WallpaperEngine/Data/Model/Types.h

@@ -12,6 +12,7 @@ class Scene;
 class Web;
 class Video;
 struct UserSetting;
+struct ImageAnimationLayer;
 class Object;
 class Sound;
 class Image;
@@ -51,6 +52,7 @@ using ParticleUniquePtr = std::unique_ptr <Particle>;
 using MaterialUniquePtr = std::unique_ptr <Material>;
 using MaterialPassUniquePtr = std::unique_ptr <MaterialPass>;
 using EffectUniquePtr = std::unique_ptr <Effect>;
+using ImageAnimationLayerUniquePtr = std::unique_ptr <ImageAnimationLayer>;
 using ImageEffectUniquePtr = std::unique_ptr <ImageEffect>;
 using ImageEffectPassOverrideUniquePtr = std::unique_ptr <ImageEffectPassOverride>;
 using EffectPassUniquePtr = std::unique_ptr <EffectPass>;

+ 1 - 0
src/WallpaperEngine/Data/Parsers/ModelParser.cpp

@@ -28,5 +28,6 @@ ModelUniquePtr ModelParser::parse (const JSON& file, const Project& project, con
         .nopadding = file.optional ("nopadding", false),
         .width = file.optional <int> ("width"),
         .height = file.optional <int> ("height"),
+        .puppet = file.optional <std::string> ("puppet"),
     });
 }

+ 26 - 0
src/WallpaperEngine/Data/Parsers/ObjectParser.cpp

@@ -76,6 +76,7 @@ SoundUniquePtr ObjectParser::parseSound (const JSON& it, ObjectData base) {
 ImageUniquePtr ObjectParser::parseImage (const JSON& it, const Project& project, ObjectData base, const std::string& image) {
     const auto& properties = project.properties;
     const auto& effects = it.optional ("effects");
+    const auto& animationLayers = it.optional ("animationlayers");
 
     auto result = std::make_unique <Image> (
         std::move (base),
@@ -93,6 +94,7 @@ ImageUniquePtr ObjectParser::parseImage (const JSON& it, const Project& project,
             .brightness = it.optional ("brightness", 1.0f),
             .model = ModelParser::load (project, image),
             .effects = effects.has_value () ? parseEffects (*effects, project) : std::vector <ImageEffectUniquePtr> {},
+            .animationLayers = animationLayers.has_value () ? parseAnimationLayers (*animationLayers) : std::vector <ImageAnimationLayerUniquePtr> {},
         }
     );
 
@@ -192,4 +194,28 @@ ComboMap ObjectParser::parseComboMap (const JSON& it) {
     }
 
     return result;
+}
+
+std::vector <ImageAnimationLayerUniquePtr> ObjectParser::parseAnimationLayers (const JSON& it) {
+    if (!it.is_array ()) {
+        return {};
+    }
+
+    std::vector <ImageAnimationLayerUniquePtr> result = {};
+
+    for (const auto& cur : it.items ()) {
+        result.push_back (parseAnimationLayer (cur.value ()));
+    }
+
+    return result;
+}
+
+ImageAnimationLayerUniquePtr ObjectParser::parseAnimationLayer (const JSON& it) {
+    return std::make_unique <ImageAnimationLayer> (ImageAnimationLayer {
+        .id = it.require ("id", "Animation layer must have an id"),
+        .rate = it.require ("rate", "Animation layer must have a rate"),
+        .visible = it.require ("visible", "Animation layer must include visibility"),
+        .blend = it.require ("blend", "Animation layer must include blend"),
+        .animation = it.require ("animation", "Animation layer must include an animation"),
+    });
 }

+ 2 - 0
src/WallpaperEngine/Data/Parsers/ObjectParser.h

@@ -27,5 +27,7 @@ class ObjectParser {
     static ImageEffectPassOverrideUniquePtr parseEffectPass (const JSON& it, const Project& project);
     static TextureMap parseTextureMap (const JSON& it);
     static ComboMap parseComboMap (const JSON& it);
+    static std::vector <ImageAnimationLayerUniquePtr> parseAnimationLayers (const JSON& it);
+    static ImageAnimationLayerUniquePtr parseAnimationLayer (const JSON& it);
 };
 } // namespace WallpaperEngine::Data::Parsers