#ifndef _SCENE_CACHE_H
#define _SCENE_CACHE_H
#include "GlFunctions.h"
class VBOMesh
{
public:
    VBOMesh();
    ~VBOMesh();
    
    bool Initialize(
const FbxMesh * pMesh);
 
    
    void UpdateVertexPosition(
const FbxMesh * pMesh, 
const FbxVector4 * pVertices) 
const;
 
    
    void BeginDraw(ShadingMode pShadingMode) const;
    
    void Draw(int pMaterialIndex, ShadingMode pShadingMode) const;
    
    void EndDraw() const;
    
    int GetSubMeshCount() const { return mSubMeshes.GetCount(); }
private:
    enum
    {
        VERTEX_VBO,
        NORMAL_VBO,
        UV_VBO,
        INDEX_VBO,
        VBO_COUNT,
    };
    
    struct SubMesh
    {
        SubMesh() : IndexOffset(0), TriangleCount(0) {}
        int IndexOffset;
        int TriangleCount;
    };
    GLuint mVBONames[VBO_COUNT];
    bool mHasNormal;
    bool mHasUV;
    bool mAllByControlPoint; 
};
class MaterialCache
{
public:
    MaterialCache();
    ~MaterialCache();
    
    
    void SetCurrentMaterial() const;
    bool HasTexture() const { return mDiffuse.mTextureName != 0; }
    
    static void SetDefaultMaterial();
private:
    struct ColorChannel
    {
        ColorChannel() : mTextureName(0)
        {
            mColor[0] = 0.0f;
            mColor[1] = 0.0f;
            mColor[2] = 0.0f;
            mColor[3] = 1.0f;
        }
        GLuint mTextureName;
        GLfloat mColor[4];
    };
    ColorChannel mEmissive;
    ColorChannel mAmbient;
    ColorChannel mDiffuse;
    ColorChannel mSpecular;
    GLfloat mShinness;
};
struct PropertyChannel
{
    PropertyChannel() : mAnimCurve(
NULL), mValue(0.0f) {}
 
    
    GLfloat Get(
const FbxTime & pTime)
 const 
    {
        if (mAnimCurve)
        {
            return mAnimCurve->Evaluate(pTime);
        }
        else
        {
            return mValue;
        }
    }
    GLfloat mValue;
};
class LightCache
{
public:
    LightCache();
    ~LightCache();
    
    
    static void IntializeEnvironment(
const FbxColor & pAmbientLight);
 
    
    
    void SetLight(
const FbxTime & pTime) 
const;
 
private:
    static int sLightCount;         
    GLuint mLightIndex;
    PropertyChannel mColorRed;
    PropertyChannel mColorGreen;
    PropertyChannel mColorBlue;
    PropertyChannel mConeAngle;
};
#endif // _SCENE_CACHE_H