#include "effect.hpp"

#include "controlled.hpp"
#include "node.hpp"

namespace Nif
{

    void NiDynamicEffect::read(NIFStream* nif)
    {
        Node::read(nif);
        if (nif->getVersion() >= nif->generateVersion(10, 1, 0, 106)
            && nif->getBethVersion() < NIFFile::BethVersion::BETHVER_FO4)
            nif->getBoolean(); // Switch state
        unsigned int numAffectedNodes = nif->getUInt();
        for (unsigned int i = 0; i < numAffectedNodes; ++i)
            nif->getUInt(); // ref to another Node
    }

    void NiLight::read(NIFStream* nif)
    {
        NiDynamicEffect::read(nif);

        dimmer = nif->getFloat();
        ambient = nif->getVector3();
        diffuse = nif->getVector3();
        specular = nif->getVector3();
    }

    void NiTextureEffect::read(NIFStream* nif)
    {
        NiDynamicEffect::read(nif);

        // Model Projection Matrix
        nif->skip(3 * 3 * sizeof(float));

        // Model Projection Transform
        nif->skip(3 * sizeof(float));

        // Texture Filtering
        nif->skip(4);

        // Max anisotropy samples
        if (nif->getVersion() >= NIFStream::generateVersion(20, 5, 0, 4))
            nif->skip(2);

        clamp = nif->getUInt();

        textureType = (TextureType)nif->getUInt();

        coordGenType = (CoordGenType)nif->getUInt();

        texture.read(nif);

        nif->skip(1); // Use clipping plane
        nif->skip(16); // Clipping plane dimensions vector
        if (nif->getVersion() <= NIFStream::generateVersion(10, 2, 0, 0))
            nif->skip(4); // PS2-specific shorts
        if (nif->getVersion() <= NIFStream::generateVersion(4, 1, 0, 12))
            nif->skip(2); // Unknown short
    }

    void NiTextureEffect::post(Reader& nif)
    {
        NiDynamicEffect::post(nif);
        texture.post(nif);
    }

    void NiPointLight::read(NIFStream* nif)
    {
        NiLight::read(nif);

        constantAttenuation = nif->getFloat();
        linearAttenuation = nif->getFloat();
        quadraticAttenuation = nif->getFloat();
    }

    void NiSpotLight::read(NIFStream* nif)
    {
        NiPointLight::read(nif);

        cutoff = nif->getFloat();
        exponent = nif->getFloat();
    }

}