// Texture example: "dot" image, wandering around the frame.

#pragma once

#include "lib/color.h"
#include "lib/effect.h"
#include "lib/texture.h"

class DotEffect : public Effect
{
public:
    DotEffect(const char *filename)
        : dot(filename),
          angle1(0), angle2(0), angle3(0)
    {}

    Texture dot;

    float angle1;
    float angle2;
    float angle3;

    virtual void beginFrame(const FrameInfo &f)
    {
        const float speed = 6.0;

        // Several bounded state variables, rotating at different rates
        angle1 = fmodf(angle1 + f.timeDelta * speed, 2 * M_PI);
        angle2 = fmodf(angle2 + f.timeDelta * speed * 0.2f, 2 * M_PI);
        angle3 = fmodf(angle3 + f.timeDelta * speed * 0.7f, 2 * M_PI);
    }

    virtual void shader(Vec3& rgb, const PixelInfo &p) const
    {
        // Project onto the XZ plane
        Vec2 plane = Vec2(p.point[0], p.point[2]);

        // Moving dot
        Vec2 position = 0.8 * Vec2( sinf(angle1), cosf(angle1 + sin(angle2)) );

        // Texture geometry
        Vec2 center(0.5, 0.5);
        float size = 1.5 + 0.8 * sinf(angle3);

        rgb = dot.sample( (plane - position) / size + center );
    }
};