267 lines
6.9 KiB
C++
267 lines
6.9 KiB
C++
/* 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 <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
/*
|
|
* Copyright (C) 2006-2010 - Frictional Games
|
|
*
|
|
* This file is part of HPL1 Engine.
|
|
*/
|
|
|
|
#ifndef HPL_RENDERER3D_H
|
|
#define HPL_RENDERER3D_H
|
|
|
|
#include "hpl1/engine/graphics/GPUProgram.h"
|
|
#include "hpl1/engine/graphics/GraphicsTypes.h"
|
|
#include "hpl1/engine/graphics/Material.h"
|
|
#include "hpl1/engine/math/Frustum.h"
|
|
#include "hpl1/engine/math/MathTypes.h"
|
|
|
|
namespace hpl {
|
|
|
|
#define eRendererDebugFlag_DrawTangents (0x00000001)
|
|
#define eRendererDebugFlag_DrawNormals (0x00000002)
|
|
#define eRendererDebugFlag_DisableLighting (0x00000004)
|
|
#define eRendererDebugFlag_LogRendering (0x00000008)
|
|
#define eRendererDebugFlag_DrawBoundingBox (0x00000010)
|
|
#define eRendererDebugFlag_DrawBoundingSphere (0x00000020)
|
|
#define eRendererDebugFlag_DrawLightBoundingBox (0x00000040)
|
|
#define eRendererDebugFlag_RenderLines (0x00000080)
|
|
|
|
typedef tFlag tRendererDebugFlag;
|
|
|
|
class cResources;
|
|
class iLowLevelGraphics;
|
|
class LowLevelResources;
|
|
class iTexture;
|
|
class cCamera3D;
|
|
class cWorld3D;
|
|
class iVertexBuffer;
|
|
class cMeshCreator;
|
|
class cRenderList;
|
|
class iRenderable;
|
|
class iLight3D;
|
|
class cRendererPostEffects;
|
|
class cSector;
|
|
|
|
class cResources;
|
|
|
|
//---------------------------------------------
|
|
|
|
enum eRendererShowShadows {
|
|
eRendererShowShadows_All,
|
|
eRendererShowShadows_Static,
|
|
eRendererShowShadows_None,
|
|
eRendererShowShadows_LastEnum
|
|
};
|
|
|
|
//---------------------------------------------
|
|
|
|
class cRenderSettings {
|
|
public:
|
|
cRenderSettings();
|
|
|
|
void Clear();
|
|
void Reset(iLowLevelGraphics *apLowLevel);
|
|
|
|
// Setings that doesn't change:
|
|
iGpuProgram *extrudeProgram;
|
|
iLowLevelGraphics *mpLowLevel;
|
|
|
|
unsigned int *mpTempIndexArray;
|
|
|
|
// Setting that changes
|
|
iLight3D *mpLight;
|
|
cCamera3D *mpCamera;
|
|
cFrustum *mpFrustum;
|
|
|
|
cSector *mpSector;
|
|
|
|
bool mbFogActive;
|
|
bool mbFogCulling;
|
|
float mfFogStart;
|
|
float mfFogEnd;
|
|
cColor mFogColor;
|
|
|
|
eRendererShowShadows mShowShadows;
|
|
bool mbLog;
|
|
tRendererDebugFlag mDebugFlags;
|
|
|
|
// State settings
|
|
int mlLastShadowAlgo;
|
|
|
|
bool mbDepthTest;
|
|
|
|
eMaterialAlphaMode mAlphaMode;
|
|
eMaterialBlendMode mBlendMode;
|
|
eMaterialChannelMode mChannelMode;
|
|
|
|
iGpuProgram *gpuProgram;
|
|
iMaterialProgramSetup *gpuProgramSetup;
|
|
iGpuProgram *mpVertexProgram;
|
|
bool mbVertexUseLight;
|
|
iMaterialProgramSetup *mpVtxProgramSetup;
|
|
|
|
iGpuProgram *mpFragmentProgram;
|
|
|
|
bool mbMatrixWasNULL;
|
|
|
|
bool mbUsesLight;
|
|
bool mbUsesEye;
|
|
|
|
cColor mAmbientColor;
|
|
|
|
iTexture *mpTexture[MAX_TEXTUREUNITS];
|
|
eMaterialBlendMode mTextureBlend[MAX_TEXTUREUNITS];
|
|
|
|
iVertexBuffer *mpVtxBuffer;
|
|
};
|
|
|
|
//---------------------------------------------
|
|
|
|
class cRenderer3D {
|
|
public:
|
|
cRenderer3D(iLowLevelGraphics *apLowLevelGraphics, cResources *apResources,
|
|
cMeshCreator *apMeshCreator, cRenderList *apRenderList);
|
|
~cRenderer3D();
|
|
|
|
void UpdateRenderList(cWorld3D *apWorld, cCamera3D *apCamera, float afFrameTime);
|
|
|
|
void RenderWorld(cWorld3D *apWorld, cCamera3D *apCamera, float afFrameTime);
|
|
|
|
void SetSkyBox(iTexture *apTexture, bool abAutoDestroy);
|
|
void SetSkyBoxActive(bool abX);
|
|
void SetSkyBoxColor(const cColor &aColor);
|
|
|
|
iTexture *GetSkyBox() { return mpSkyBoxTexture; }
|
|
bool GetSkyBoxActive() { return mbSkyBoxActive; }
|
|
cColor GetSkyBoxColor() { return mSkyBoxColor; }
|
|
|
|
void SetAmbientColor(const cColor &aColor) { mRenderSettings.mAmbientColor = aColor; }
|
|
cColor GetAmbientColor() { return mRenderSettings.mAmbientColor; }
|
|
|
|
iTexture *GetFogSolidTexture() { return mpFogLinearSolidTexture; }
|
|
iTexture *GetFogAddTexture() { return mpFogLinearAddTexture; }
|
|
iTexture *GetFogAlphaTexture() { return mpFogLinearAlphaTexture; }
|
|
|
|
void SetRefractionUsed(bool abX) { mbRefractionUsed = abX; }
|
|
bool GetRefractionUsed() { return mbRefractionUsed; }
|
|
|
|
// Fog properties
|
|
void SetFogActive(bool abX);
|
|
void SetFogStart(float afX);
|
|
void SetFogEnd(float afX);
|
|
void SetFogColor(const cColor &aCol) { mRenderSettings.mFogColor = aCol; }
|
|
void SetFogCulling(bool abX) { mRenderSettings.mbFogCulling = abX; }
|
|
|
|
bool GetFogActive() { return mRenderSettings.mbFogActive; }
|
|
float GetFogStart() { return mRenderSettings.mfFogStart; }
|
|
float GetFogEnd() { return mRenderSettings.mfFogEnd; }
|
|
cColor GetFogColor() { return mRenderSettings.mFogColor; }
|
|
bool GetFogCulling() { return mRenderSettings.mbFogCulling; }
|
|
|
|
cBoundingVolume *GetFogBV() { return &mFogBV; }
|
|
|
|
void SetPostEffects(cRendererPostEffects *apPostEffects) { mpPostEffects = apPostEffects; }
|
|
|
|
// Debug setup
|
|
void SetDebugFlags(tRendererDebugFlag aFlags) { mDebugFlags = aFlags; }
|
|
tRendererDebugFlag GetDebugFlags() { return mDebugFlags; }
|
|
|
|
cRenderList *GetRenderList() { return mpRenderList; }
|
|
cRenderSettings *GetRenderSettings() { return &mRenderSettings; }
|
|
|
|
eRendererShowShadows GetShowShadows();
|
|
void SetShowShadows(eRendererShowShadows aState);
|
|
|
|
void FetchOcclusionQueries();
|
|
|
|
private:
|
|
inline void BeginRendering(cCamera3D *apCamera);
|
|
|
|
void InitSkyBox();
|
|
|
|
// Render steps
|
|
void RenderFog(cCamera3D *apCamera);
|
|
|
|
void RenderSkyBox(cCamera3D *apCamera);
|
|
|
|
void RenderZ(cCamera3D *apCamera);
|
|
|
|
void RenderOcclusionQueries(cCamera3D *apCamera);
|
|
|
|
void RenderLight(cCamera3D *apCamera);
|
|
|
|
void RenderDiffuse(cCamera3D *apCamera);
|
|
|
|
void RenderTrans(cCamera3D *apCamera);
|
|
|
|
void RenderDebug(cCamera3D *apCamera);
|
|
|
|
inline void RenderDebugObject(cCamera3D *apCamera, iRenderable *&apObject, iMaterial *apPrevMat,
|
|
int alPrevMatId, iVertexBuffer *apPrevVtxBuff,
|
|
eMaterialRenderType aRenderType, iLight3D *apLight);
|
|
|
|
iLowLevelGraphics *mpLowLevelGraphics;
|
|
LowLevelResources *mpLowLevelResources;
|
|
|
|
cRendererPostEffects *mpPostEffects;
|
|
|
|
bool mbLog;
|
|
|
|
float mfRenderTime;
|
|
|
|
iGpuProgram *_diffuseProgram;
|
|
iGpuProgram *_solidFogProgram;
|
|
|
|
iTexture *mpFogLinearSolidTexture;
|
|
|
|
iTexture *mpFogLinearAddTexture;
|
|
iTexture *mpFogLinearAlphaTexture;
|
|
|
|
iGpuProgram *_refractProgram;
|
|
iGpuProgram *_refractSpecProgram;
|
|
bool mbRefractionAvailable;
|
|
bool mbRefractionUsed;
|
|
|
|
cRenderSettings mRenderSettings;
|
|
|
|
cBoundingVolume mFogBV;
|
|
|
|
tVertexVec mvVtxRect;
|
|
|
|
cMeshCreator *mpMeshCreator;
|
|
cRenderList *mpRenderList;
|
|
|
|
iVertexBuffer *mpSkyBox;
|
|
iTexture *mpSkyBoxTexture;
|
|
bool mbAutoDestroySkybox;
|
|
bool mbSkyBoxActive;
|
|
cColor mSkyBoxColor;
|
|
|
|
cResources *mpResources;
|
|
|
|
tRendererDebugFlag mDebugFlags;
|
|
};
|
|
|
|
} // namespace hpl
|
|
|
|
#endif // HPL_RENDERER3D_H
|