#include "SpriteEx.h"
#include "SquirrelClassEx.h"
//#include "kiwano/render/DirectX/D3DDeviceResources.h"
//#include "kiwano/render/DirectX/NativePtr.h"
//#include "d2d1effects_2.h"

std::unordered_map<int, TexturePtr>ImageRecShadowObject;

#pragma comment(lib, "d2d1.lib")
#pragma comment(lib, "dxguid.lib")

extern NPK_M* npk;

SpriteEx::SpriteEx(const std::string imgpath, const int frame)
{
    SetFrame(SquirrelClassEx::GetTexturePtrByImg(imgpath, frame));
}

void SpriteEx::SetPosition(const Point& point)
{
    TexturePtr t = GetTexture();
    ImgInfo Img = *(ImgInfo*)t->GetUserData();
    Actor::SetPosition(Point((point.x + Img.Xpos), (point.y + Img.Ypos) * GetScale().y));


}




void SpriteEx::SetScale(const Point& point)
{
    //if (ShadowObject) {
    //    ShadowObject->GetTransform().skew = Vec2((-20.0) * (GetParent()->GetScale().x), 0.0);

    //}
    Sprite::SetScale(point);
}

void SpriteEx::OnRender(RenderContext& ctx)
{
    
    //if (INTERPOLATION_MODE != D2D1_INTERPOLATION_MODE_FORCE_DWORD && COMPOSITE_MODE != D2D1_COMPOSITE_MODE_FORCE_DWORD)
    //{
    //    auto bitmap = NativePtr::Get<ID2D1Bitmap>(GetFrame().GetTexture());

    //    auto d2d_res = graphics::directx::GetD2DDeviceResources();

    //    d2d_res->GetDeviceContext()->DrawImage(
    //        bitmap.Get(),
    //        INTERPOLATION_MODE,
    //        COMPOSITE_MODE
    //    );

    //    //auto bitmap = NativePtr::Get<ID2D1Bitmap>(GetFrame().GetTexture());
    //    //auto m_d2dContext = graphics::directx::GetD2DDeviceResources()->GetDeviceContext();
    //    //ComPtr<ID2D1Effect> chromakeyEffect;
    //    //m_d2dContext->CreateEffect(CLSID_D2D1Emboss, &chromakeyEffect);

    //    //
    //    //chromakeyEffect->SetInput(0, bitmap.Get());
    //    ////chromakeyEffect->SetValue(D2D1_CHROMAKEY_PROP_COLOR, Color{ 1.0f, 1.0f, 1.0f, 1.0f });
    //    ////chromakeyEffect->SetValue(D2D1_CHROMAKEY_PROP_TOLERANCE, 0.2f);
    //    ////chromakeyEffect->SetValue(D2D1_CHROMAKEY_PROP_INVERT_ALPHA, true);
    //    //chromakeyEffect->SetValue(D2D1_EMBOSS_PROP_HEIGHT, 1.0f);
    //    //chromakeyEffect->SetValue(D2D1_EMBOSS_PROP_DIRECTION, 0.0f);

    //    //m_d2dContext->DrawImage(chromakeyEffect.Get());
    //}
    //else {
    //    this->Sprite::OnRender(ctx);
    //}
    

    switch (MyModel)
    {
    case -1:        //-1原始模式
        ctx.SetBlendMode(BlendMode::SourceOver);
        break;
    case 0:        //0线性减淡
        ctx.SetBlendMode(BlendMode::Add);
        break;
    default:
        ctx.SetBlendMode(BlendMode::SourceOver);
        break;
    }
    
    this->Sprite::OnRender(ctx);

}

//void SpriteEx::OnUpdate(Duration dt) {
//    //当处于播放状态 
//    if (is_Animotion_Play) {
//        //当前帧小于总帧时执行逻辑
//        if (NowFrameIndex < MaxFrameCount) {
//            if (OffsetTime == 0)OffsetTime = clock();
//            if ((clock() - OffsetTime) >= MyDelay[NowFrameIndex]) {
//                OffsetTime = clock();
//                NowFrameIndex++;
//                SquirrelClassEx::RunUpdateScript("AnimotionUpdateCallBack", this->GetObjectID(), NowFrameIndex);
//            }
//        }
//        //否则重置时间 重置当前帧
//        else {
//            OffsetTime = 0;
//            NowFrameIndex = 0;
//            MyLoop--;
//            if (MyLoop != 0) {
//                SquirrelClassEx::RunUpdateScript("AnimotionUpdateCallBack", this->GetObjectID(), NowFrameIndex);
//            }
//            else {
//                is_Animotion_Play = false;
//            }
//        }
//    }
//}

void SpriteEx::SetFrameInfo(std::vector<int> FrameDaley , const int Loop)
{
    MyDelay = FrameDaley;
    MaxFrameCount = FrameDaley.size();
    MyLoop = Loop;
}

void SpriteEx::SetAnimotionPlay(bool Type)
{
    is_Animotion_Play = Type;
    //开始播放以后 第一次先传入第0帧
    SquirrelClassEx::RunUpdateScript("AnimotionUpdateCallBack", this->GetObjectID(), NowFrameIndex);
}

void SpriteEx::SetAnimotionFrame(const int gFrame)
{
    this->NowFrameIndex = gFrame;
}

void SpriteEx::SetShadow()
{

    TexturePtr t;
    ImgInfo Img = *(ImgInfo*)GetTexture()->GetUserData();

    if (ImageRecShadowObject.count(GetTexture()->GetObjectID())) {
        t = ImageRecShadowObject[GetTexture()->GetObjectID()];
    }
    else {

        BYTE* Data = Img.PNGdata;
        BYTE* NewData = new BYTE[Img.Height * Img.Width * 4];

        for (size_t i = 0; i < Img.Height * Img.Width * 4; i++)
        {
            if ((i + 1) % 4 == 0)
                NewData[i] = Data[i];
            else
                NewData[i] = 0;
        }

        BinaryData data = { ((void*)NewData) ,(uint32_t)(Img.Height * Img.Width * 4) };
        t = new Texture();
        t->Load(PixelSize(Img.Width, Img.Height), data, PixelFormat::Bpp32BGRA);
        t->SetUserData(&Img);
        ImageRecShadowObject[GetTexture()->GetObjectID()] = t;

    }

    if (ShadowObject) {
        ShadowObject->SetFrame(t);
    }
    else {
        ShadowObject = new SpriteEx(t);
        ShadowObject->SetAnchor(1, 1);
        ShadowObject->SetOpacity(0.4);
        ShadowObject->SetZOrder(-1);
        AddChild(ShadowObject);
        //GetParent()->GetParent()->AddChild(ShadowObject);
    }

    Transform B;
    B.scale = Vec2(1.0, 0.29);
    B.position = Point(GetWidth(), GetHeight() - 5);
    B.skew = Vec2((-20.0) * (GetParent()->GetScale().x), 0.0);
    ShadowObject->SetTransform(B);

}

