//  ---------------------------------------------------------------------------
//
//  @file       TwDirect3D10.h
//  @brief      Direct3D10 graph functions
//  @author     Philippe Decaudin
//  @license    This file is part of the AntTweakBar library.
//              For conditions of distribution and use, see License.txt
//
//  note:       Private header
//
//  ---------------------------------------------------------------------------


#if !defined ANT_TW_DIRECT3D10_INCLUDED
#define ANT_TW_DIRECT3D10_INCLUDED

#include "TwGraph.h"

//  ---------------------------------------------------------------------------

class CTwGraphDirect3D10 : public ITwGraph
{
public:
    virtual int                 Init();
    virtual int                 Shut();
    virtual void                BeginDraw(int _WndWidth, int _WndHeight);
    virtual void                EndDraw();
    virtual bool                IsDrawing();
    virtual void                Restore();
    virtual void                DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color0, color32 _Color1, bool _AntiAliased=false);
    virtual void                DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color, bool _AntiAliased=false) { DrawLine(_X0, _Y0, _X1, _Y1, _Color, _Color, _AntiAliased); }
    virtual void                DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color00, color32 _Color10, color32 _Color01, color32 _Color11);
    virtual void                DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color) { DrawRect(_X0, _Y0, _X1, _Y1, _Color, _Color, _Color, _Color); }
    virtual void                DrawTriangles(int _NumTriangles, int *_Vertices, color32 *_Colors, Cull _CullMode);

    virtual void *              NewTextObj();
    virtual void                DeleteTextObj(void *_TextObj);
    virtual void                BuildText(void *_TextObj, const std::string *_TextLines, color32 *_LineColors, color32 *_LineBgColors, int _NbLines, const CTexFont *_Font, int _Sep, int _BgWidth);
    virtual void                DrawText(void *_TextObj, int _X, int _Y, color32 _Color, color32 _BgColor);

    virtual void                ChangeViewport(int _X0, int _Y0, int _Width, int _Height, int _OffsetX, int _OffsetY);
    virtual void                RestoreViewport();
    virtual void                SetScissor(int _X0, int _Y0, int _Width, int _Height);

protected:
    struct ID3D10Device *       m_D3DDev;
    unsigned int                m_D3DDevInitialRefCount;
    bool                        m_Drawing;
    const CTexFont *            m_FontTex;
    struct ID3D10ShaderResourceView *m_FontD3DTexRV;
    int                         m_WndWidth;
    int                         m_WndHeight;
    int                         m_OffsetX;
    int                         m_OffsetY;
    void *                      m_ViewportInit;
    RECT                        m_ViewportAndScissorRects[2];

    struct CLineRectVtx
    {
        float                   m_Pos[3];
        color32                 m_Color;
    };
    struct CTextVtx
    {
        float                   m_Pos[3];
        color32                 m_Color;
        float                   m_UV[2];
    };

    struct CTextObj
    {
        struct ID3D10Buffer *   m_TextVertexBuffer;
        struct ID3D10Buffer *   m_BgVertexBuffer;
        int                     m_NbTextVerts;
        int                     m_NbBgVerts;
        int                     m_TextVertexBufferSize;
        int                     m_BgVertexBufferSize;
        bool                    m_LineColors;
        bool                    m_LineBgColors;
    };

    struct CState10 *               m_State;
    struct ID3D10DepthStencilState *m_DepthStencilState;
    struct ID3D10BlendState *       m_BlendState;
    struct ID3D10RasterizerState *  m_RasterState;
    struct ID3D10RasterizerState *  m_RasterStateAntialiased;
    struct ID3D10RasterizerState *  m_RasterStateCullCW;
    struct ID3D10RasterizerState *  m_RasterStateCullCCW;
    struct ID3D10Effect *           m_Effect;
    struct ID3D10EffectTechnique*   m_LineRectTech;
    struct ID3D10EffectTechnique*   m_LineRectCstColorTech;
    struct ID3D10InputLayout *      m_LineRectVertexLayout;
    struct ID3D10Buffer *           m_LineVertexBuffer;
    struct ID3D10Buffer *           m_RectVertexBuffer;
    struct ID3D10Buffer *           m_TrianglesVertexBuffer;
    int                             m_TrianglesVertexBufferCount;
    struct ID3D10EffectTechnique*   m_TextTech;
    struct ID3D10EffectTechnique*   m_TextCstColorTech;
    struct ID3D10InputLayout *      m_TextVertexLayout;
    struct ID3D10EffectShaderResourceVariable *m_FontD3DResVar;
    struct ID3D10EffectVectorVariable *m_OffsetVar;
    struct ID3D10EffectVectorVariable *m_CstColorVar;
};

//  ---------------------------------------------------------------------------


#endif // !defined ANT_TW_DIRECT3D10_INCLUDED
