/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
/*
* Copyright (C) 2006-2010 - Frictional Games
*
* This file is part of HPL1 Engine.
*/
#ifndef HPL_RENDER_LIST_H
#define HPL_RENDER_LIST_H
#include "hpl1/engine/graphics/GraphicsTypes.h"
#include "hpl1/engine/graphics/Material.h"
#include "hpl1/engine/graphics/OcclusionQuery.h"
#include "hpl1/engine/graphics/VertexBuffer.h"
#include "hpl1/engine/math/MathTypes.h"
#include "hpl1/engine/scene/Light3D.h"
#include "hpl1/engine/system/SystemTypes.h"
#include "hpl1/std/multiset.h"
#include "hpl1/std/set.h"
namespace hpl {
class iRenderable;
class cCamera3D;
class cGraphics;
class iRenderState;
class cRenderSettings;
//-------------------------------------------------------------
enum eRenderListDrawType {
eRenderListDrawType_Normal,
eRenderListDrawType_Trans,
eRenderListDrawType_LastEnum
};
//-------------------------------------------------------------
class cRenderNode;
class cRenderNodeCompare {
public:
bool operator()(cRenderNode *apNodeA, cRenderNode *apNodeB) const;
};
typedef Hpl1::Std::set tRenderNodeSet;
typedef tRenderNodeSet::iterator tRenderNodeSetIt;
class cRenderNode {
public:
cRenderNode() : mpState(NULL) {}
iRenderState *mpState;
tRenderNodeSet m_setNodes;
void DeleteChildren();
void Render(cRenderSettings *apSettings);
};
//-------------------------------------------------------------
class cMotionBlurObject_Compare {
public:
bool operator()(iRenderable *pObjectA, iRenderable *pObjectB) const;
};
typedef Hpl1::Std::multiset tMotionBlurObjectSet;
typedef tMotionBlurObjectSet::iterator tMotionBlurObjectSetIt;
typedef cSTLIterator
cMotionBlurObjectIterator;
//-------------------------------------------------------------
class cTransperantObject_Compare {
public:
bool operator()(iRenderable *pObjectA, iRenderable *pObjectB) const;
};
typedef Hpl1::Std::multiset tTransperantObjectSet;
typedef tTransperantObjectSet::iterator tTransperantObjectSetIt;
typedef cSTLIterator cTransperantObjectIterator;
//-------------------------------------------------------------
class cOcclusionQueryObject {
public:
cOcclusionQueryObject() : mpQuery(NULL), mpVtxBuffer(NULL), mpMatrix(NULL) {}
iOcclusionQuery *mpQuery;
iVertexBuffer *mpVtxBuffer;
cMatrixf *mpMatrix;
bool mbDepthTest;
};
class cOcclusionQueryObject_Compare {
public:
bool operator()(const cOcclusionQueryObject *pObjectA, const cOcclusionQueryObject *pObjectB) const;
};
typedef Hpl1::Std::set tOcclusionQueryObjectSet;
typedef tOcclusionQueryObjectSet::iterator tOcclusionQueryObjectSetIt;
typedef cSTLIterator
cOcclusionQueryObjectIterator;
//-------------------------------------------------------------
typedef Hpl1::Std::set tRenderableSet;
typedef tRenderableSet::iterator tRenderableSetIt;
typedef Hpl1::Std::set tLight3DSet;
typedef tLight3DSet::iterator tLight3DSetIt;
typedef cSTLIterator cLight3DIterator;
typedef cSTLIterator cRenderableIterator;
//-------------------------------------------------------------
class cRenderList {
public:
cRenderList(cGraphics *apGraphics);
~cRenderList();
void SetCamera(cCamera3D *apCamera) { mpCamera = apCamera; }
cCamera3D *GetCamera() { return mpCamera; }
bool Add(iRenderable *apObject);
void Clear();
void AddOcclusionQuery(cOcclusionQueryObject *apObject);
cOcclusionQueryObjectIterator GetQueryIterator();
cMotionBlurObjectIterator GetMotionBlurIterator();
cTransperantObjectIterator GetTransperantIterator();
cLight3DIterator GetLightIt();
cRenderableIterator GetObjectIt();
int GetLightNum();
int GetObjectNum();
void Compile();
int GetRenderCount() { return mlRenderCount; }
int GetLastRenderCount() { return mlLastRenderCount; }
int GetLightObjects(int alLightIdx) { return mvObjectsPerLight[alLightIdx]; }
void SetFrameTime(float afTime) { mfFrameTime = afTime; }
cRenderNode *GetRootNode(eRenderListDrawType aObjectType, eMaterialRenderType aPassType, int alLightNum);
static inline int GetGlobalRenderCount() { return mlGlobalRenderCount; }
private:
cRenderNode *InsertNode(cRenderNode *apListNode, cRenderNode *apTempNode);
void AddToTree(iRenderable *apObject, eRenderListDrawType aObjectType,
eMaterialRenderType mPassType, int alLightNum, iLight3D *apLight,
bool abUseDepth, int alPass);
static int mlGlobalRenderCount;
tLight3DSet m_setLights;
int mvObjectsPerLight[MAX_NUM_OF_LIGHTS];
tRenderableSet m_setObjects;
tOcclusionQueryObjectSet m_setQueries;
tMotionBlurObjectSet m_setMotionBlurObjects;
tTransperantObjectSet m_setTransperantObjects;
cRenderNode mRootNodeDepth;
cRenderNode mRootNodeDiffuse;
cRenderNode mRootNodeLight[MAX_NUM_OF_LIGHTS];
cRenderNode mRootNodeTrans;
cRenderNode mTempNode;
int mlRenderCount;
int mlLastRenderCount;
float mfFrameTime;
cMemoryPool *m_poolRenderState;
cMemoryPool *m_poolRenderNode;
cCamera3D *mpCamera;
cGraphics *mpGraphics;
};
} // namespace hpl
#endif // HPL_RENDER_LIST_H