// // FadeEffectJobs.h // Created by Olivier Prat on 07/07/2017. // Copyright 2017 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // #ifndef hifi_render_utils_FadeEffectJobs_h #define hifi_render_utils_FadeEffectJobs_h #include "FadeEffect.h" #include #include #include #include #include class FadeEditConfig : public render::Job::Config { Q_OBJECT Q_PROPERTY(bool editFade MEMBER editFade NOTIFY dirty) Q_PROPERTY(int editedCategory MEMBER editedCategory NOTIFY dirty) public: bool editFade { false }; int editedCategory { (int)TransitionType::ELEMENT_ENTER_DOMAIN }; signals: void dirty(); }; class FadeConfig : public render::Job::Config { Q_OBJECT Q_PROPERTY(float duration READ getDuration WRITE setDuration NOTIFY dirty) Q_PROPERTY(float baseSizeX READ getBaseSizeX WRITE setBaseSizeX NOTIFY dirty) Q_PROPERTY(float baseSizeY READ getBaseSizeY WRITE setBaseSizeY NOTIFY dirty) Q_PROPERTY(float baseSizeZ READ getBaseSizeZ WRITE setBaseSizeZ NOTIFY dirty) Q_PROPERTY(float baseLevel READ getBaseLevel WRITE setBaseLevel NOTIFY dirty) Q_PROPERTY(bool isInverted READ isInverted WRITE setInverted NOTIFY dirty) Q_PROPERTY(float noiseSizeX READ getNoiseSizeX WRITE setNoiseSizeX NOTIFY dirty) Q_PROPERTY(float noiseSizeY READ getNoiseSizeY WRITE setNoiseSizeY NOTIFY dirty) Q_PROPERTY(float noiseSizeZ READ getNoiseSizeZ WRITE setNoiseSizeZ NOTIFY dirty) Q_PROPERTY(float noiseLevel READ getNoiseLevel WRITE setNoiseLevel NOTIFY dirty) Q_PROPERTY(float edgeWidth READ getEdgeWidth WRITE setEdgeWidth NOTIFY dirty) Q_PROPERTY(QColor edgeInnerColor READ getEdgeInnerColor WRITE setEdgeInnerColor NOTIFY dirty) Q_PROPERTY(float edgeInnerIntensity READ getEdgeInnerIntensity WRITE setEdgeInnerIntensity NOTIFY dirty) Q_PROPERTY(QColor edgeOuterColor READ getEdgeOuterColor WRITE setEdgeOuterColor NOTIFY dirty) Q_PROPERTY(float edgeOuterIntensity READ getEdgeOuterIntensity WRITE setEdgeOuterIntensity NOTIFY dirty) Q_PROPERTY(int timing READ getTiming WRITE setTiming NOTIFY dirty) Q_PROPERTY(float noiseSpeedX READ getNoiseSpeedX WRITE setNoiseSpeedX NOTIFY dirty) Q_PROPERTY(float noiseSpeedY READ getNoiseSpeedY WRITE setNoiseSpeedY NOTIFY dirty) Q_PROPERTY(float noiseSpeedZ READ getNoiseSpeedZ WRITE setNoiseSpeedZ NOTIFY dirty) Q_PROPERTY(float threshold MEMBER threshold NOTIFY dirty) Q_PROPERTY(bool manualFade MEMBER manualFade NOTIFY dirty) Q_PROPERTY(float manualThreshold MEMBER manualThreshold NOTIFY dirty) public: FadeConfig(); void setEditedCategory(int value); void setDuration(float value); float getDuration() const; void setBaseSizeX(float value); float getBaseSizeX() const; void setBaseSizeY(float value); float getBaseSizeY() const; void setBaseSizeZ(float value); float getBaseSizeZ() const; void setBaseLevel(float value); float getBaseLevel() const { return props.baseLevel; } void setInverted(bool value); bool isInverted() const; void setNoiseSizeX(float value); float getNoiseSizeX() const; void setNoiseSizeY(float value); float getNoiseSizeY() const; void setNoiseSizeZ(float value); float getNoiseSizeZ() const; void setNoiseLevel(float value); float getNoiseLevel() const { return props.noiseLevel; } void setNoiseSpeedX(float value); float getNoiseSpeedX() const; void setNoiseSpeedY(float value); float getNoiseSpeedY() const; void setNoiseSpeedZ(float value); float getNoiseSpeedZ() const; void setEdgeWidth(float value); float getEdgeWidth() const; void setEdgeInnerColor(const QColor& value); QColor getEdgeInnerColor() const; void setEdgeInnerIntensity(float value); float getEdgeInnerIntensity() const { return props.innerEdgeColor.a; } void setEdgeOuterColor(const QColor& value); QColor getEdgeOuterColor() const; void setEdgeOuterIntensity(float value); float getEdgeOuterIntensity() const { return props.outerEdgeColor.a; } void setTiming(int value); int getTiming() const { return (int)props.timing; } FadeProperties props; float threshold { 0.f }; float manualThreshold { 0.f }; bool manualFade { false }; signals: void dirty(); void dirtyCategory(); }; class FadeEditJob { public: using Config = FadeEditConfig; using Output = render::ItemID; using JobModel = render::Job::ModelO; FadeEditJob() {} void configure(const Config& config); void run(const render::RenderContextPointer& renderContext, Output& output); private: bool _isEditEnabled { false }; int _editedCategory { (int)TransitionType::ELEMENT_ENTER_DOMAIN }; render::ItemID _editedItem { render::Item::INVALID_ITEM_ID }; }; class FadeJob { public: using Config = FadeConfig; using Input = render::ItemID; using JobModel = render::Job::ModelI; FadeJob(); void configure(const Config& config); void run(const render::RenderContextPointer& renderContext, const Input& input); private: FadeProperties _editedFadeProperties; uint64_t _previousTime{ 0 }; bool update(RenderArgs* args, const Config& config, const render::ScenePointer& scene, render::Transaction& transaction, render::Transition& transition, const double deltaTime, const render::ItemID editedItemID) const; static float computeElementEnterRatio(double time, const double period, FadeTiming timing); }; #endif // hifi_render_utils_FadeEffectJobs_h