/*
* Copyright 2019 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/

#ifndef SkParticleBinding_DEFINED
#define SkParticleBinding_DEFINED

#include "include/core/SkString.h"
#include "modules/particles/include/SkReflected.h"
#include "src/sksl/SkSLExternalValue.h"

#include <memory>

class SkParticleEffect;
class SkParticleEffectParams;
class SkRandom;

namespace SkSL {
    class Compiler;
}

class SkParticleExternalValue : public SkSL::ExternalValue {
public:
    SkParticleExternalValue(const char* name, SkSL::Compiler& compiler, const SkSL::Type& type)
        : SkSL::ExternalValue(name, type)
        , fCompiler(compiler)
        , fRandom(nullptr)
        , fEffect(nullptr) {}

    void setRandom(SkRandom* random) { fRandom = random; }
    void setEffect(SkParticleEffect* effect) { fEffect = effect; }

protected:
    SkSL::Compiler&   fCompiler;

    SkRandom*         fRandom;
    SkParticleEffect* fEffect;
};

class SkParticleBinding : public SkReflected {
public:
    SkParticleBinding(const char* name = "name") : fName(name) {}

    REFLECTED_ABSTRACT(SkParticleBinding, SkReflected)

    void visitFields(SkFieldVisitor* v) override;
    virtual std::unique_ptr<SkParticleExternalValue> toValue(SkSL::Compiler&) = 0;

    static void RegisterBindingTypes();

    /*
     * All SkParticleBinding objects expose a particular native object to an effect's SkSL code.
     * In all cases, the 'name' is the symbol that will be used to access the object from the SkSL.
     * Each binding is a callable object, so the SkSL name behaves like a function. The behavior of
     * each kind of binding is described below.
     */

    // Binds an SkPath to an effect's SkSL. The path is specified using SVG syntax. It is called
    // in the SkSL as 'name(t)'. 't' is a normalized distance along the path. This returns a float4
    // value, containing the position in .xy, and the normal in .zw.
    static sk_sp<SkParticleBinding> MakePathBinding(const char* name, const char* path);

    static sk_sp<SkParticleBinding> MakeEffectBinding(const char* name,
                                                      sk_sp<SkParticleEffectParams> effect);

protected:
    SkString fName;
};

#endif // SkParticleBinding_DEFINED
