Files
Leviathan/Client/Game/game/Main/SViewPort.h
T
2026-06-01 12:46:52 +02:00

189 lines
5.6 KiB
C++

#pragma once
/// @brief ViewPort의 게임관련 인터페이스( 툴 말구 )
#include "KViewport.h"
#include <toolkit/XFlag.h>
#include <dump/XException.h>
#include <toolkit/khash.h>
#include "TerrainPrimitiveFor4Stage.h"
class K3DVertexBuffer;
class KMeshPrimitive;
class CTerrainPrimitive;
class SRenderTargetContainer
{
public:
virtual K3DRenderTarget * GetRenderTarget(int index, void * pr) { return NULL; }
};
// DP debug용
//#define _DEBUG_DPCOUNT
#ifdef _DEBUG_DPCOUNT
void __startOneFrame();
void __endOneFrame();
void __startRenderToViewport(LPCSTR viewportName);
void __addRenderItem(LPCSTR name,int DP, int face, LARGE_INTEGER counter1, LARGE_INTEGER counter2);
#define START_ONE_FRAME() __startOneFrame()
#define END_ONE_FRAME() __endOneFrame()
#define START_RENDER_VIEWPORT(name) __startRenderToViewport(name)
#define START_DPCOUNT(__name)\
LARGE_INTEGER __counter; QueryPerformanceCounter(&__counter);\
LPCSTR __outputname = __name;\
K3DRenderDeviceDX* __pDXDev = static_cast<K3DRenderDeviceDX*>(m_dev);\
int __totalDP = __pDXDev->GetDPCount();\
int __totalFace = __pDXDev->GetPolyCount()
#define END_DPCOUNT()\
LARGE_INTEGER __counter2;\
QueryPerformanceCounter(&__counter2);\
__addRenderItem(__outputname, __pDXDev->GetDPCount() - __totalDP, __pDXDev->GetPolyCount() - __totalFace, __counter,__counter2);
#define START_PROFILE_JOB(__name)\
LARGE_INTEGER __counter; QueryPerformanceCounter(&__counter);\
LPCSTR __outputname = __name
#define END_PROFILE_JOB()\
LARGE_INTEGER __counter2;\
QueryPerformanceCounter(&__counter2);\
__addRenderItem(__outputname, 1,0, __counter, __counter2);
#else
#define START_ONE_FRAME()
#define END_ONE_FRAME()
#define START_RENDER_VIEWPORT(name)
#define START_DPCOUNT(name)
#define END_DPCOUNT()
#define START_PROFILE_JOB(name)
#define END_PROFILE_JOB()
#endif
class SViewPort : public KViewportObject
{
public:
SViewPort( DWORD attr, bool bClearColorBuffer = true, bool bClearDepthBuffer = true );
virtual ~SViewPort();
virtual void Initilaize( K3DRenderDevice *dev, const KViewportStruct &viewarea, float nearClip, float farClip );
virtual void Register( K3DPrimitive *pr, DWORD flag );
virtual void Render( K3DRenderTarget *pRT, DWORD flag = 0, bool bClearRegister = true );
void BeginRender();
void EndRender(bool bClearRegister);
virtual void Render( bool bClearRegister = true, bool bSetRenderTarget = true );
virtual void ClearRegisteredList();
//쉐도우 맵 관련
//bool InitShadow();
virtual void SetRenderFlag( int nFlag );
//#ifndef NDEBUG
// void SetDebugMode( bool bDebugMode ) { m_bDebugMode = bDebugMode; }
//#endif
//void SetRenderBumpMapMode( bool bRender );
//bool GetRenderBumpMapMode();
void SetSelfShadowAmbientFactor( float fFactor );
protected:
//void RenderShadowViewPort();
void RenderSky();
void RenderCloud();
void RenderLightning(); //<! [sonador][2007.04.11] Rendering method of SGameLightningStroke
void RenderWeather(); //<! [sonador][2007.03.19] Rendering method of SGameWeather
void RenderTerrain( bool bCheckOcclusionCull );
void RenderTerrainShadow(SRenderTargetContainer *cont1, SRenderTargetContainer *cont2);
//void RenderBuilding(SRenderTargetContainer *cont1, SRenderTargetContainer *cont2);
//void RenderAlphaBuilding(SRenderTargetContainer *cont1, SRenderTargetContainer *cont2);
void RenderBranch(bool renderTransparentOrOpaque=false); // true : render transparent only, false : render opaque only
void RenderFrond(bool renderTransparentOrOpaque=false);
void RenderLeaf(bool renderTransparentOrOpaque=false);
void RenderTreeBillboard();
void RenderSpeedGrass();
//void RenderPathEffect();
void RenderQuadPrimitive();
void RenderLinePrimitive();
void RenderPolyLinePrimitive();
void RenderPrList( vec_rendermesh& renderlist, SRenderTargetContainer *cont1, SRenderTargetContainer *cont2);
void RenderPrAlphaList( vec_rendermesh& renderlist, SRenderTargetContainer *cont1, SRenderTargetContainer *cont2);
void RenderPrAlphaList(SRenderTargetContainer *cont1, SRenderTargetContainer *cont2, KCustomVector< const RENDER_MESHEX* >& vMesh, K3DVector & vecCam, bool bEnableAdditive );
void RenderPrAdditiveList(SRenderTargetContainer *cont1, SRenderTargetContainer *cont2);
void RenderBliiboardList();
void RenderAdditiveBliiboard();
void RenderLensflare();
void RenderSprite();
void RenderWirePrimitive();
void RenderHighQualityWater();
void SetSpeedGrassShaderConstants();
virtual bool DrawWater() { assert(0); return false; }
void SetOldBlendMode( int nBlendMode, bool bReset = false );
void SetOldBlendFlag( int nFlag = 0 );
protected:
// float m_afLighting[12];
XFlag< int > m_nRenderFlag; ///< int 1개 크기의 플래그 생성.
//#ifndef NDEBUG
// bool m_bDebugMode;
//#endif
bool m_bRenderSelfShadow;
//bool m_bRenderBumpMap;
float m_fSelfShadowAmbientFactor;
struct TerrainLess
{
bool operator()( CTerrainPrimitiveFor4Stage& a, CTerrainPrimitiveFor4Stage& b )
{
return ( a > b );
}
bool operator()( CTerrainPrimitiveFor4Stage* a, CTerrainPrimitiveFor4Stage* b )
{
return ( a->m_fLengthByCamera < b->m_fLengthByCamera );
return ( a > b );
}
};
struct MeshLess
{
bool operator()( RENDER_MESHEX &a, RENDER_MESHEX &b )
{
return ( a < b ); // sonador 1.6.2 프랍 렌더링시 정렬 문제 해결
}
};
struct TransMeshLess
{
bool operator()( RENDER_MESHEX& a, RENDER_MESHEX& b )
{
if( a.bForcePriority || b.bForcePriority || ( fabsf( a - b ) < 50.0f && a.dwPriority != b.dwPriority ) )
return ( a.dwPriority < b.dwPriority );
return ( a < b ); // sonador 1.6.2 프랍 렌더링시 정렬 문제 해결
}
};
int m_nOldBlendMode;
int m_nOldBlend_Flag;
};