Files
Leviathan/Client/Game/engine/Renderer/KRenderDeviceDX.cpp
T
2026-06-01 12:46:52 +02:00

5357 lines
173 KiB
C++

#include "stdafx.h"
//#include <dxsdkver.h>
#include "KRenderDeviceDX.h"
#include "KResourceDX.h"
#include <kfile/KFileManager.h>
//#include <string>
//#include <string>
#include "resource.h"
#include <dxerr9.h>
#ifndef _NOSTREE_
#include "SSpeedTreeVertexShaders.h"
#endif
#include <SpeedGrass/VertexShaders.h>
#include <toolkit/ILock.h>
#include "SDebug_Util.h"
// 2010.07.07 - prodongi
#include "GameRule.h"
#define SETPOLYCOUNT( n ) m_nPolyCount = n
#define INCPOLYCOUNT( n ) m_nPolyCount += n
XCriticalSection s_lckReloadTexture;
XCriticalSection s_lckVB_Array;
int K3DRenderDeviceDX::s_nRecycleMaxCount = 400;
bool K3DRenderDeviceDX::s_bForceTextureNull = false;
K3DRenderDeviceDX::K3DRenderDeviceDX()
{
m_bIsDeviceLost = false;
m_pD3D9 = NULL;
m_d3ddev = NULL;
m_lpDD7 = NULL;
m_idxCurRS = 9999999;
m_backbuffer = NULL;
m_zbuffer = NULL;
m_d3dfont = NULL;
m_cursorTexture = NULL;
int i;
for(i = 0; i < 8; ++i)
m_curTexture[i] = NULL;
memset( m_hRS, 0, sizeof(m_hRS) );
m_nOnePassTexes = 0;
m_bgcolor.color = 0;
for(i = 0; i < TS_STAGE_MAX; ++i) {
K3DMatrixIdentity(m_arTransformStages[i]);
}
// rendering state
m_backBufferWriteEnable = D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE;
m_depthBufferWriteEnable = true;
m_depthCompareMode = D3DCMP_LESSEQUAL;
m_clipPlaneEnabled = 0;
m_fogMode = FOGM_NONE;
m_fillmode = FM_SOLID;
m_cullmode = KCM_CCW;
m_textureFactor = KColor(0xFFAAAAAA);
m_fVertexAspect = 1.0f;
m_nBeginSceneCount = 0;
//m_pRenderTarget = NULL;
m_pRenderTargetSurface = NULL;
//m_pRenderTargetDepth = NULL;
//m_pV11_MeshSkin_Decl = NULL;
m_pEffect = NULL;
memset(m_pVertexDeclaration, 0, sizeof(m_pVertexDeclaration));
m_dwBranchVertexShader = NULL;
m_dwLeafVertexShader = NULL;
m_dwSpeedTreeBillboardVertexShader = NULL; // sonador #2.1.7.1 스피드 트리 퍼포먼스 증가
m_dwGrassVertexShader = NULL;
m_bStencilTwo = false;
m_Campos = K3DVector( 0,0,0 );
m_fMipBias = 0.f;//-.9f;
m_dwAlpharef = 0;
m_pSwapChain = NULL;
m_pRenderToEnvMap = NULL;
m_d3dQuery = NULL;
m_bOcclusionCullingCheck = false;
m_bDeviceSupportsVizQuery = false;
m_nVertexBufBlendArrayCount = 0;
m_pVertexBufBlendArray = NULL;
m_dwPrevDeclaration = VTXDECLARATION_MAX;
m_dwPrevTechnique = TECHNIQUE_MAX;
}
K3DRenderDeviceDX::~K3DRenderDeviceDX()
{
//메모리 Array 삭제
for( unsigned int i(0); m_nVertexBufBlendArrayCount>i; i++ )
{
m_pVertexBufBlendArray[i]->Discard(); //SUN : 추적요망, LEAK발생, AddRef()를 명시적으로 호출하는 부분때문에 최후 삭제시점에서 refcount가1인상태임.
}
SAFE_DELETE_ARRAY( m_pVertexBufBlendArray );
//Recycle VB 삭제
for( unsigned int i(0); m_vRecycleVBList.size()>i; i++ )
{
m_vRecycleVBList[i]->pVtxBuf->Discard();
delete m_vRecycleVBList[i];
}
m_vRecycleVBList.erase( m_vRecycleVBList.begin(), m_vRecycleVBList.end() );
SAFE_RELEASE(m_pRenderTargetSurface );
//SAFE_RELEASE(m_pRenderTargetDepth );
//SAFE_RELEASE(m_pRenderTarget );
SAFE_RELEASE(m_backbuffer);
SAFE_RELEASE(m_zbuffer);
SAFE_RELEASE(m_d3dQuery);
EndVertexShader();
EndSpeedTree();
SAFE_DELETE(m_pSwapChain);
for( int nRSB = 0; nRSB < MAX_RENDERSTATE_BLOCK; ++nRSB )
{
SAFE_RELEASE( m_hRS[nRSB] );
}
SAFE_RELEASE(m_lpDD7);
SAFE_RELEASE( m_pRenderToEnvMap );
SAFE_RELEASE(m_d3ddev );
SAFE_RELEASE(m_pD3D9 );
}
void K3DRenderDeviceDX::GetVGAMem( DWORD & dwFree, DWORD & dwTotal )
{
checkVGAMem();
dwFree = m_dwVGA_Free;
dwTotal = m_dwVGA_Total;
}
void K3DRenderDeviceDX::checkVGAMem()
{
#ifdef _DEBUG
//=======================================================================
if( m_lpDD7 )
{
DDSCAPS2 ddsCaps2;
HRESULT hr;
// Initialize the structure.
ZeroMemory(&ddsCaps2, sizeof(ddsCaps2));
ddsCaps2.dwCaps = DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM;
hr = m_lpDD7->GetAvailableVidMem(&ddsCaps2, &m_dwVGA_Total, &m_dwVGA_Free);
if (FAILED(hr))
return;
// _oprint( "Device Info - GetAvailableVidMem : [Total %d KB] [Free %d KB]\n", m_dwVGA_Total/1024, m_dwVGA_Free/1024 );
}
//=======================================================================
#endif
}
HRESULT K3DRenderDeviceDX::TestCooperativeLevel()
{
return m_d3ddev->TestCooperativeLevel();
}
bool K3DRenderDeviceDX::SetSupportDispMode()
{
m_pD3D9 = Direct3DCreate9( D3D_SDK_VERSION );
m_Adapter = D3DADAPTER_DEFAULT;
// Identify 저장
m_pD3D9->GetAdapterIdentifier( m_Adapter, 0, &m_Adapter_Identify );
//current DispMode
if( FAILED( m_pD3D9->GetAdapterDisplayMode( m_Adapter, &m_d3ddm ) ) )
{
return false;
}
_GetDisplayModelist();
SAFE_RELEASE( m_pD3D9 );
return true;
}
//#define VIEW_MSG_BOX
bool K3DRenderDeviceDX::Create( const CS &cs )
{
_oprint( "K3DRenderDeviceDX::Create\n" );
SAFE_RELEASE( m_lpDD7 );
// {
// HRESULT hr;
// m_lpDD7 = NULL;
// hr = DirectDrawCreateEx(NULL, (VOID**)&m_lpDD7, IID_IDirectDraw7, NULL );
// if (FAILED(hr))
// {
// _oprint( "DirectDrawCreateEx Failed : %d\n", hr );
//#ifdef VIEW_MSG_BOX
// MessageBox( (HWND)m_cs.hWnd, "RenderDevice Create Error 00", "Error", MB_OK );
//#endif
// return false;
// }
// }
m_cs = cs;
m_sizeScreen = m_cs.sizeScreen;
m_pD3D9 = Direct3DCreate9( D3D_SDK_VERSION );
m_Adapter = D3DADAPTER_DEFAULT;
// Identify 저장
m_pD3D9->GetAdapterIdentifier( m_Adapter, 0, &m_Adapter_Identify );
//current DispMode
if( FAILED( m_pD3D9->GetAdapterDisplayMode( m_Adapter, &m_d3ddm ) ) )
{
#ifdef VIEW_MSG_BOX
MessageBox( (HWND)m_cs.hWnd, "RenderDevice Create Error 01", "Error", MB_OK );
#endif
return false;
}
//현재 화면 포맷에 대한 해상도 리스트만 얻는다.
_GetDisplayModelist();
// Caps에 대한 정보를 얻어서 설정
_GetCapsInformation();
if( m_Caps.VertexShaderVersion < D3DPS_VERSION(2,0) || m_Caps.PixelShaderVersion < D3DPS_VERSION(2,0) )
{
//return false;
}
// 실제로 Device 생성
if( false == _CreateDevice() )
{
#ifdef VIEW_MSG_BOX
MessageBox( (HWND)m_cs.hWnd, "RenderDevice Create Error 02", "Error", MB_OK );
#endif
return false;
}
setupOcclusion();
int nMaxAllocMem = m_d3ddev->GetAvailableTextureMem();
_oprint( "Device Info - GetAvailableTextureMem : %d KB\n", nMaxAllocMem/1024 );
m_fVertexAspect = (float)m_cs.sizeScreen.width / m_cs.sizeScreen.height;
m_d3ddev->GetRenderTarget( 0, &m_backbuffer );
m_d3ddev->GetDepthStencilSurface( &m_zbuffer );
ResetGammaRange();
//소프트웨어 커서 생기면 삭제 해야 함.
if( GetCaps().CursorCaps & D3DCURSORCAPS_LOWRES ||
GetCaps().CursorCaps == 0 )
{
m_d3ddev->SetDialogBoxMode( TRUE );
}
initializeRenderState();
//Shader 초기화~
InitVertexShader();
InitSpeedTree();
InitSpeedGrass();
return true;
}
K3DFORMAT K3DRenderDeviceDX::GetCurrentDisplayModeFormat()
{
D3DDISPLAYMODE mode;
m_d3ddev->GetDisplayMode( 0, &mode );
return (K3DFORMAT)mode.Format;
}
void K3DRenderDeviceDX::_GetDisplayModelist()
{
assert(m_pD3D9);
const UINT MIN_WIDTH = 1024;
// 2010.07.12 동남아시아에 최저 해상도 조정 - prodongi
const UINT MIN_HEIGHT = GameRule::isSoutheastAsia() ? 720 : 768;
const UINT MAX_WIDTH = 4096;
const UINT MAX_HEIGHT = 4096;
const UINT REFRESH_MIN = 0;
const UINT REFRESH_MAX = UINT_MAX;
UINT numAdapterModes = m_pD3D9->GetAdapterModeCount( m_Adapter, m_d3ddm.Format );
for (UINT mode = 0; mode < numAdapterModes; mode++)
{
D3DDISPLAYMODE displayMode;
m_pD3D9->EnumAdapterModes( m_Adapter, m_d3ddm.Format, mode, &displayMode );
if( displayMode.Width < MIN_WIDTH || displayMode.Height < MIN_HEIGHT ||
displayMode.Width > MAX_WIDTH || displayMode.Height > MAX_HEIGHT ||
displayMode.RefreshRate < REFRESH_MIN || displayMode.RefreshRate > REFRESH_MAX )
{
continue;
}
m_DispModeList.push_back( displayMode );
_oprint( "%dx%d %d\n", displayMode.Width, displayMode.Height, displayMode.RefreshRate );
}
}
void K3DRenderDeviceDX::_GetCapsInformation()
{
//Shader 정보 얻기============================================================
m_pD3D9->GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &m_Caps );
//StretchRect Filter
m_StretchRectFilterMode = D3DTEXF_NONE;
if( m_Caps.StretchRectFilterCaps & D3DPTFILTERCAPS_MINFPOINT ){ m_StretchRectFilterMode = D3DTEXF_POINT ; _oprint( "StretchRect Filter Mode Min Point\n" ); }
if( m_Caps.StretchRectFilterCaps & D3DPTFILTERCAPS_MAGFPOINT ){ m_StretchRectFilterMode = D3DTEXF_POINT ; _oprint( "StretchRect Filter Mode Mag Point\n" ); }
// if( m_Caps.StretchRectFilterCaps & D3DPTFILTERCAPS_MINFLINEAR ){ m_StretchRectFilterMode = D3DTEXF_LINEAR; _oprint( "StretchRect Filter Mode Min Linear\n" ); }
// if( m_Caps.StretchRectFilterCaps & D3DPTFILTERCAPS_MAGFLINEAR ){ m_StretchRectFilterMode = D3DTEXF_LINEAR; _oprint( "StretchRect Filter Mode Mag Linear\n" ); }
m_bIsStretchRect = false;
//StretchRect H/W Acc
if( m_Caps.DevCaps2 & D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES )
{
m_bIsStretchRect = true;
_oprint( "StretchRect H/W 지원\n" );
}
//UpdateSurface H/W Acc
if( m_Caps.Caps3 & D3DCAPS3_COPY_TO_VIDMEM )
{
_oprint( "UpdateSurface H/W 지원\n" );
}
// 양면 스텐실 기능 확인
if( ( m_Caps.StencilCaps & D3DSTENCILCAPS_TWOSIDED ) )
{
_oprint( "D3DSTENCILCAPS_TWOSIDED H/W 지원\n" );
m_bStencilTwo = true;
}
if ( m_Caps.MaxVertexShaderConst > 250 )
m_cs.dwOption = 1;
else
m_cs.dwOption = 0;
}
#define DEBUG_VS
bool K3DRenderDeviceDX::_CreateDevice()
{
// 알맞은것 설정
const int TYPE_COUNT = 3;
D3DDEVTYPE BEST_FIT_D3DDEV[TYPE_COUNT] = { D3DDEVTYPE_HAL, D3DDEVTYPE_HAL, D3DDEVTYPE_REF };
DWORD BEST_FIT_BEHAVIOR[TYPE_COUNT] = { D3DCREATE_HARDWARE_VERTEXPROCESSING, D3DCREATE_SOFTWARE_VERTEXPROCESSING, D3DCREATE_SOFTWARE_VERTEXPROCESSING };
int BEST_FIT_KDEV[3] = { KDEVTYPE_HARDWARE_VTX_PROCESSING, KDEVTYPE_SOFTWARE_VTX_PROCESSING, KDEVTYPE_SOFTWARE_RENDER};
// 무조건 D3DCREATE_SOFTWARE_VERTEXPROCESSING 로 생성
if( m_cs.dwOption == 0)
{
BEST_FIT_BEHAVIOR[0] = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
BEST_FIT_KDEV[0] = KDEVTYPE_SOFTWARE_VTX_PROCESSING;
}
HRESULT hr = D3D_OK;
for(int i = 0; i < TYPE_COUNT; ++i)
{
m_d3dDevType = (D3DDEVTYPE)BEST_FIT_D3DDEV[i];
#ifdef _COUNTRY_ME_
m_BeHaviorFlag = BEST_FIT_BEHAVIOR[i] | D3DCREATE_MULTITHREADED | D3DCREATE_FPU_PRESERVE;
#else
m_BeHaviorFlag = BEST_FIT_BEHAVIOR[i] | D3DCREATE_MULTITHREADED;
#endif
#ifdef DEBUG_VS
//if( m_d3dDevType != D3DDEVTYPE_REF )
//{
// m_BeHaviorFlag &= ~D3DCREATE_HARDWARE_VERTEXPROCESSING;
// m_BeHaviorFlag &= ~D3DCREATE_PUREDEVICE;
// m_BeHaviorFlag |= D3DCREATE_SOFTWARE_VERTEXPROCESSING;
//}
#endif
_SetPresentParam();
hr = m_pD3D9->CreateDevice( m_Adapter, m_d3dDevType, reinterpret_cast<HWND>( m_cs.hFocusWnd ), m_BeHaviorFlag,
&m_d3dParam, &m_d3ddev );
if ( m_d3ddev != NULL && SUCCEEDED(hr) )
{
break;
}
}
if ( m_d3ddev == NULL )
{
assert( 0 && "Device Init Fail!!" );
return false;
}
//기존에 설정 된 값을 얻어 놓는다.
m_d3ddev->GetGammaRamp( 0, &m_OldD3dgr );
return true;
}
void K3DRenderDeviceDX::_SetPresentParam()
{
memset( &m_d3dParam, 0, sizeof(m_d3dParam) );
if ( m_cs.bFullScreen )
{
switch(m_cs.nBPP)
{
default:
case 16:
{
static D3DFORMAT BEST_FIT_FORMAT[] = { D3DFMT_R5G6B5, D3DFMT_X1R5G5B5 };
m_d3dParam.BackBufferFormat = _GetValidBackBuffer( &BEST_FIT_FORMAT[0], _countof(BEST_FIT_FORMAT) );
break;
}
case 32:
{
static const D3DFORMAT BEST_FIT_FORMAT[] = { D3DFMT_X8R8G8B8, D3DFMT_R8G8B8 };
m_d3dParam.BackBufferFormat = _GetValidBackBuffer( &BEST_FIT_FORMAT[0], _countof(BEST_FIT_FORMAT) );
break;
}
}
m_d3dParam.BackBufferCount = 1;
m_d3dParam.SwapEffect = D3DSWAPEFFECT_DISCARD;
m_d3dParam.FullScreen_RefreshRateInHz = m_d3ddm.RefreshRate;
m_d3dParam.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
}
else
{
m_d3dParam.BackBufferCount = 0;
m_d3dParam.BackBufferFormat = m_d3ddm.Format;
m_d3dParam.SwapEffect = D3DSWAPEFFECT_COPY;
m_d3dParam.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
m_d3dParam.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
}
m_d3dParam.BackBufferWidth = m_cs.sizeScreen.width;
m_d3dParam.BackBufferHeight = m_cs.sizeScreen.height;
m_d3dParam.MultiSampleType = D3DMULTISAMPLE_NONE;
m_d3dParam.hDeviceWindow = reinterpret_cast<HWND>(m_cs.hWnd);
m_d3dParam.Windowed = !m_cs.bFullScreen;
m_d3dParam.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; //Explorer
m_d3dParam.EnableAutoDepthStencil = TRUE;
m_d3dParam.AutoDepthStencilFormat = _GetValidZBuffer();
}
D3DFORMAT K3DRenderDeviceDX::_GetValidBackBuffer(const D3DFORMAT* pCheckType, int nSize)
{
for(int i = 0; i < nSize; ++i)
{
if( SUCCEEDED( m_pD3D9->CheckDeviceType(m_Adapter, m_d3dDevType, pCheckType[i], pCheckType[i],
false) ) )
{
return pCheckType[i];
}
}
return D3DFMT_UNKNOWN;
}
D3DFORMAT K3DRenderDeviceDX::_GetValidZBuffer()
{
bool bCreateStencil = false;
if(bCreateStencil)
{
D3DFORMAT bestFitWithZBufferStencil[] =
{
D3DFMT_D16, D3DFMT_D15S1, D3DFMT_D24X8, D3DFMT_D24S8, D3DFMT_D24X4S4, D3DFMT_D32,
};
int nSize = _countof(bestFitWithZBufferStencil);
for(int i = (nSize-1) ; i >= 0; --i )
{
if( _IsDepthFormatOk(bestFitWithZBufferStencil[i]) )
return bestFitWithZBufferStencil[i];
}
}
else
{
D3DFORMAT bestFitWithZBuffer[] =
{
D3DFMT_D16, D3DFMT_D15S1, D3DFMT_D24X8, D3DFMT_D24S8, D3DFMT_D24X4S4, D3DFMT_D32,
};
int nSize = _countof(bestFitWithZBuffer);
for(int i = (nSize-1) ; i >= 0; --i )
{
if( _IsDepthFormatOk(bestFitWithZBuffer[i]) )
return bestFitWithZBuffer[i];
}
}
return D3DFMT_UNKNOWN;
}
bool K3DRenderDeviceDX::_IsDepthFormatOk(D3DFORMAT DepthFormat)
{
if( SUCCEEDED(m_pD3D9->CheckDeviceFormat(m_Adapter, m_d3dDevType,
m_d3dParam.BackBufferFormat, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE,
DepthFormat) ) )
{
if( SUCCEEDED( m_pD3D9->CheckDepthStencilMatch(m_Adapter,
m_d3dDevType,m_d3dParam.BackBufferFormat, m_d3dParam.BackBufferFormat,
DepthFormat ) ) )
{
return true;
}
}
return false;
}
void K3DRenderDeviceDX::ResetScreenSize( int nWidth, int nHeight )
{
if( m_sizeScreen.cx != nWidth || m_sizeScreen.cy != nHeight )
{
//KSize oldsize = m_cs.sizeScreen;
m_sizeScreen = m_cs.sizeScreen = KSize( nWidth, nHeight );
m_fVertexAspect = (float)m_cs.sizeScreen.width / m_cs.sizeScreen.height;
resetDevice(false);
//if(!resetDevice( false ))
//{
// m_sizeScreen = m_cs.sizeScreen = oldsize;
// m_fVertexAspect = (float)m_cs.sizeScreen.width / m_cs.sizeScreen.height;
// resetDevice(false, true);
//}
reloadDevice();
setWindowStyle();
}
}
void K3DRenderDeviceDX::SetRefreshRate( int nRefreshRate )
{
if( m_cs.nRefreshRate != nRefreshRate )
{
//int nOldRefresh = m_cs.nRefreshRate;
m_cs.nRefreshRate = nRefreshRate;
resetDevice(false);
//if(!resetDevice( false ))
//{
// m_cs.nRefreshRate = nOldRefresh;
// resetDevice(false, true);
//}
reloadDevice();
setWindowStyle();
}
}
//기존 상태 해제 후 재 설정
bool K3DRenderDeviceDX::resetDevice( bool bToggleFullScreen/* = true*/, bool bInfiniteTry )
{
THREAD_SYNCRONIZE( s_lckReloadTexture );
ResetPrevDeclarationTechnique();
SAFE_RELEASE(m_backbuffer);
SAFE_RELEASE(m_zbuffer);
if ( m_pSwapChain )
m_pSwapChain->Clear();
//DYNAMIC 버텍스 릴리즈~ Speed Tree 등
for( unsigned int i(0); m_vReloadVertexList.size()>i; i++ )
m_vReloadVertexList[i]->PreReload();
_performance_print( "DYNAMIC VtxCount : %d \n", m_vReloadVertexList.size() );
for( unsigned int i(0); m_vReloadIndexList.size()>i; i++ )
m_vReloadIndexList[i]->PreReload();
_performance_print( "Recycle VtxCount : %d \n", m_vRecycleVBList.size() );
for( unsigned int i(0); m_vRecycleVBList.size()>i; i++ )
{
if( m_vRecycleVBList[i]->usage & D3DUSAGE_DYNAMIC )
{
m_vRecycleVBList[i]->pVtxBuf->PreReload();
}
}
//DYNAMIC 텍스쳐 릴리즈
for( unsigned int i(0); m_vReloadTextureList.size()>i; i++ )
{
m_vReloadTextureList[i]->PreReload();
_oprint( "Device Lost : resetDevice (0x%08X)\n", m_vReloadTextureList[i] );
}
//// FXEffect 릴리즈
//for( UINT i(0); i < m_vReloadFXEffectList.size(); ++i)
// m_vReloadFXEffectList[i]->OnLostDevice();
EndVertexShader();
if( bToggleFullScreen )
m_cs.bFullScreen = !m_cs.bFullScreen; //한번 Lost되면, 윈도우 모드..
_SetPresentParam();
for( int nRSB = 0; nRSB < MAX_RENDERSTATE_BLOCK; ++nRSB )
{
SAFE_RELEASE( m_hRS[nRSB] );
}
HRESULT hres;
SAFE_RELEASE( m_d3dQuery );
//성공 할 때까지 시도...
while ( (hres = m_d3ddev->Reset( &m_d3dParam )) != D3D_OK )
{
// by Testors
Sleep( 100 );
if(!bInfiniteTry) break; // device lost 때 호출하는 것이 아니라면 루프에서 빠져나온다.
//끝나지 않는 다면, 대략 낭패...
}
_oprint( "!!!resetDevice()\n" );
if(hres == D3D_OK)
{
setupOcclusion();
m_bIsDeviceLost = false;
return true;
}
else
{
m_bIsDeviceLost = true;
return false;
}
}
//복구 안되는것 재 설정
void K3DRenderDeviceDX::reloadDevice()
{
THREAD_SYNCRONIZE( s_lckReloadTexture );
//DYNAMIC 버퍼들..(Speed Tree 재 설정)
//DYNAMIC 버텍스 릴리즈~ Speed Tree 등
for( unsigned int i(0); m_vReloadVertexList.size()>i; i++ )
m_vReloadVertexList[i]->Reload();
for( unsigned int i(0); m_vReloadIndexList.size()>i; i++ )
m_vReloadIndexList[i]->Reload();
for( unsigned int i(0); m_vRecycleVBList.size()>i; i++ )
{
if( m_vRecycleVBList[i]->usage & D3DUSAGE_DYNAMIC )
{
m_vRecycleVBList[i]->pVtxBuf->Reload();
}
}
//DYNAMIC 텍스쳐 릴리즈
for( unsigned int i(0); m_vReloadTextureList.size()>i; i++ )
m_vReloadTextureList[i]->Reload();
//for( UINT i(0); i < m_vReloadFXEffectList.size(); ++i)
// m_vReloadFXEffectList[i]->OnResetDevice();
//Back Buffer 재 설정
m_d3ddev->GetRenderTarget( 0, &m_backbuffer );
m_d3ddev->GetDepthStencilSurface( &m_zbuffer );
if(m_pSwapChain)
{
m_pSwapChain->Reset();
SetSwapChain(m_pSwapChain);
}
//순서 있음. initializeRenderState() 보다 먼저 처리
InitVertexShader();
initializeRenderState();
_oprint( "!!!reloadDevice()\n" );
}
//BOOL CALLBACK PaintWindowProc(HWND hwnd, LPARAM lParam)
//{
// PostMessage(hwnd, WM_PAINT, 0, 0);
//
// return TRUE;
//}
void K3DRenderDeviceDX::setWindowStyle()
{
DWORD dwStyle = 0;
int sx = GetSystemMetrics(SM_CXSCREEN);
int sy = GetSystemMetrics(SM_CYSCREEN);
// In fullscreen mode, do not use the caption border
if(m_cs.bFullScreen)
{
dwStyle = WS_POPUPWINDOW; // Fullscreen mode
dwStyle &= ~WS_SYSMENU;
}
#ifdef _DEV
else if( m_cs.bFullWindow ) // 전체 창 모드
{
dwStyle = WS_POPUPWINDOW; //
dwStyle &= ~WS_SYSMENU;
}
#endif
else
{
// Hide the menu bar when the resolution is 1024x768
if( sx == 1024 && sy == 768 )
{
dwStyle = WS_POPUPWINDOW; //
dwStyle &= ~WS_SYSMENU;
}
else
{
dwStyle = WS_OVERLAPPEDWINDOW; // Windowed mode
dwStyle |= WS_SYSMENU;
dwStyle |= WS_MINIMIZEBOX;
}
}
dwStyle &= ~WS_THICKFRAME;
dwStyle &= ~WS_MAXIMIZEBOX;
//Explorer
dwStyle |= WS_CLIPCHILDREN;
dwStyle |= WS_CLIPSIBLINGS;
SetWindowLong((HWND) m_cs.hWnd, GWL_STYLE, dwStyle);
if( false == m_cs.bFullScreen && false == m_cs.bFullWindow) // If not in fullscreen or borderless window mode
{
//int x, y, cx, cy, sx, sy;
int cx, cy;
cx = m_cs.sizeScreen.width + GetSystemMetrics(SM_CXFIXEDFRAME) * 2;
cy = m_cs.sizeScreen.height + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFIXEDFRAME) * 2;
//SetWindowPos((HWND) m_cs.hWnd, HWND_NOTOPMOST, (sx - cx) / 2, (sy - cy) / 2, cx, cy, SWP_SHOWWINDOW);
SetWindowPos((HWND) m_cs.hWnd, HWND_NOTOPMOST, (sx - cx) / 2, (sy - cy) / 2, cx, cy, 0);
}
if( false == m_cs.bFullScreen && true == m_cs.bFullWindow) // 전체창 모드라면
{
int cx, cy;
cx = GetSystemMetrics(SM_CXSCREEN);
cy = GetSystemMetrics(SM_CYSCREEN);
SetWindowPos((HWND) m_cs.hWnd, HWND_NOTOPMOST, 0, 0, cx, cy, 0);
}
ShowWindow((HWND) m_cs.hWnd, SW_SHOW);
//EnumWindows(PaintWindowProc, 0);
}
bool K3DRenderDeviceDX::ToggleFullscreen(bool bFullscreen)
{
if(m_cs.bFullScreen == bFullscreen) return false;
resetDevice();
//if(!resetDevice())
//{
// resetDevice(true, true);
//}
reloadDevice();
setWindowStyle();
return true;
}
void K3DRenderDeviceDX::ShowCursor( BOOL bShow )
{
m_d3ddev->ShowCursor( bShow );
}
void K3DRenderDeviceDX::SetCursorPos( int x, int y )
{
m_d3ddev->SetCursorPosition( x, y, D3DCURSOR_IMMEDIATE_UPDATE );
}
void K3DRenderDeviceDX::SetCursor( K3DTexture *cursor, DWORD dwHotSpotX, DWORD dwHotSpotY )
{
if ( cursor && cursor->IsValid() )
{
//K3DTextureDX *dxtex = static_cast<K3DTextureDX*>( cursor );
IDirect3DSurface9 *pCursorSurf;
HRESULT res;
res = reinterpret_cast<IDirect3DTexture9*>(cursor->GetSurface())->GetSurfaceLevel( 0, &pCursorSurf );
res = m_d3ddev->SetCursorProperties( dwHotSpotX, dwHotSpotY, pCursorSurf );
m_d3ddev->ShowCursor( TRUE );
if ( res =! D3D_OK )
return;
SAFE_RELEASE( pCursorSurf );
}
}
void K3DRenderDeviceDX::AddLostVertexBuffer( K3DVertexBuffer* pVtxBuf )
{
if( pVtxBuf == NULL )
{
return;
}
for( unsigned int i(0); m_vReloadVertexList.size()>i; i++ )
{
if( m_vReloadVertexList[i] == pVtxBuf)
{
return;
}
}
m_vReloadVertexList.push_back(pVtxBuf);
}
void K3DRenderDeviceDX::RemoveLostVertexBuffer( K3DVertexBuffer* pVtxBuf )
{
DelReloadVertexList( pVtxBuf );
}
void K3DRenderDeviceDX::DelReloadVertexList( class K3DVertexBuffer * pVtx )
{
#ifdef _DEBUG
int nSize = m_vReloadVertexList.size();
#endif
for( unsigned int i(0); m_vReloadVertexList.size()>i; i++ )
{
if( m_vReloadVertexList[i] == pVtx)
{
#ifdef _DEBUG
K3DVertexBuffer * pDVtx = m_vReloadVertexList[i];
#endif
m_vReloadVertexList.erase( m_vReloadVertexList.begin()+i );
return;
}
}
}
void K3DRenderDeviceDX::AddLostIndexBuffer( K3DIndexBuffer* pIdxBuf )
{
if( pIdxBuf == NULL )
{
return;
}
for( unsigned int i(0); m_vReloadIndexList.size()>i; i++ )
{
if( m_vReloadIndexList[i] == pIdxBuf)
{
return;
}
}
m_vReloadIndexList.push_back(pIdxBuf);
}
void K3DRenderDeviceDX::RemoveLostIndexBuffer( K3DIndexBuffer* pIdxBuf )
{
for( unsigned int i(0); m_vReloadIndexList.size()>i; i++ )
{
if( pIdxBuf == m_vReloadIndexList[i])
{
m_vReloadIndexList.erase( m_vReloadIndexList.begin()+i );
return;
}
}
}
K3DVertexBuffer *K3DRenderDeviceDX::CreateVertexBufferSpeedTree( DWORD stride, DWORD Usage, DWORD vertexformat, DWORD count )
{
K3DVertexBuffer* pVB = GetRecycleVertexBufferSpeedTree( stride, Usage, vertexformat, count );
if( pVB )
{
if(Usage & D3DUSAGE_DYNAMIC)
{
AddLostVertexBuffer( pVB );
}
return pVB;
}
K3DVertexBufferDX *vb = new K3DVertexBufferDX(this);
if( vb )
{
if( vb->CreateNewSpeedTree( stride, Usage, count, vertexformat ) == false )
{
vb->Discard();
return NULL;
}
if(Usage & D3DUSAGE_DYNAMIC)
{
AddLostVertexBuffer( vb );
}
return vb;
}
return NULL;
}
K3DVertexBuffer *K3DRenderDeviceDX::CreateVertexBufferUsePoolDefault( DWORD stride, DWORD vertexformat, DWORD count, DWORD Usage )
{
K3DVertexBuffer* pVB = GetRecycleVertexBufferUsePoolDefault( stride, vertexformat, count, Usage );
if( pVB )
{
AddLostVertexBuffer( pVB );
return pVB;
}
K3DVertexBufferDX *vb = new K3DVertexBufferDX(this);
if( vb )
{
if( vb->CreateNewPoolDefault( stride, count, vertexformat, Usage ) == false )
{
vb->Discard();
return NULL;
}
AddLostVertexBuffer( vb );
return vb;
}
return NULL;
}
K3DVertexBuffer *K3DRenderDeviceDX::CreateVertexBufferBlend( DWORD stride, DWORD vertexformat, DWORD count )
{
K3DVertexBuffer* pVB = GetRecycleVertexBufferBlend( stride, vertexformat, count );
if( pVB ) return pVB;
K3DVertexBufferDX *vb = new K3DVertexBufferDX(this);
if( vb )
{
if( vb->CreateNewBlend( stride, count, vertexformat ) == false )
{
vb->Discard();
return NULL;
}
//AddLostVertexBuffer( vb );
return vb;
}
return NULL;
}
K3DVertexBuffer *K3DRenderDeviceDX::CreateVertexBufferSpeedGrass( DWORD stride, DWORD Usage, DWORD vertexformat, DWORD count )
{
K3DVertexBuffer* pVB = GetRecycleVertexBufferSpeedGrass( stride, Usage, vertexformat, count );
if( pVB )
{
if(Usage & D3DUSAGE_DYNAMIC)
{
AddLostVertexBuffer( pVB );
}
return pVB;
}
K3DVertexBufferDX *vb = new K3DVertexBufferDX(this);
if( vb )
{
if( vb->CreateNewSpeedGrass( stride, Usage, count, vertexformat ) == false )
{
vb->Discard();
return NULL;
}
if(Usage & D3DUSAGE_DYNAMIC)
{
AddLostVertexBuffer( vb );
// m_vReloadVertexList.push_back(vb);
}
return vb;
}
return NULL;
}
KFXEffect* K3DRenderDeviceDX::CreateFXEffect(KStream& stream)
{
//KFXEffectDX* pEffect = new KFXEffectDX( this );
//pEffect->Initialize( stream );
//m_vReloadFXEffectList.push_back( pEffect );
//return pEffect;
return NULL;
}
K3DVertexBuffer *K3DRenderDeviceDX::CreateVertexBuffer( DWORD vertexformat, DWORD count )
{
K3DVertexBuffer* pVB = GetRecycleVertexBuffer( vertexformat, count );
if( pVB ) return pVB;
K3DVertexBufferDX *vb = new K3DVertexBufferDX(this);
if( vb )
{
if( vb->CreateNew( vertexformat, count ) == false )
{
vb->Discard();
return NULL;
}
//AddLostVertexBuffer( vb );
return vb;
}
return NULL;
}
// Vertex Buffer Array
bool K3DRenderDeviceDX::CreateVertexBufferBlendArray( DWORD array_count, DWORD stride, DWORD vertexformat, DWORD count )
{
if( m_pVertexBufBlendArray != NULL )
{
return false;
}
m_nVertexBufBlendArrayCount = array_count;
m_pVertexBufBlendArray = new K3DVertexBuffer*[m_nVertexBufBlendArrayCount];
for( unsigned int i(0); m_nVertexBufBlendArrayCount>i; i++ )
{
m_pVertexBufBlendArray[i] = CreateVertexBufferBlend( stride, vertexformat, count );
// m_pVertexBufBlendArray[i]->AddRef();
m_pVertexBufBlendArray[i]->SetUseRecycle(false); //알아서 재사용 함.
m_queueFreeVB.push( i );
}
return true;
}
K3DVertexBuffer* K3DRenderDeviceDX::GetFreeVertexBufferBlend( int &nIndex )
{
THREAD_SYNCRONIZE( s_lckVB_Array );
if( !m_queueFreeVB.empty() )
{
nIndex = m_queueFreeVB.front();
m_queueFreeVB.pop();
//m_pVertexBufBlendArray[nIndex]->AddRef();
return m_pVertexBufBlendArray[nIndex];
}
else
{
// assert( 0 && "empty Free VB" );
nIndex = -1;
}
return NULL;
}
int K3DRenderDeviceDX::ReleaseVertexBufferBlend( int nIndex )
{
THREAD_SYNCRONIZE( s_lckVB_Array );
if( nIndex >= 0 && nIndex < (int)m_nVertexBufBlendArrayCount )
{
m_pVertexBufBlendArray[nIndex]->Release();
m_queueFreeVB.push( nIndex );
}
if( m_queueFreeVB.empty() )
return 0;
return m_queueFreeVB.size();
}
bool K3DRenderDeviceDX::ResizeVertexBufferBlendArray( DWORD array_count, DWORD stride, DWORD vertexformat, DWORD count )
{
THREAD_SYNCRONIZE( s_lckVB_Array );
if( m_nVertexBufBlendArrayCount > array_count )
return false;
K3DVertexBuffer** pVBArray = new K3DVertexBuffer*[array_count];
for( unsigned int i(0); array_count>i; i++ )
{
//늘어난 곳만 할당
if( i >= m_nVertexBufBlendArrayCount )
{
pVBArray[i] = CreateVertexBufferBlend( stride, vertexformat, count );
// pVBArray[i]->AddRef();
pVBArray[i]->SetUseRecycle(false);
m_queueFreeVB.push( i );
}
else
{ //기존것 받음.
pVBArray[i] = m_pVertexBufBlendArray[i];
}
}
m_nVertexBufBlendArrayCount = array_count;
//포인터만 삭제
SAFE_DELETE_ARRAY( m_pVertexBufBlendArray );
//새 배열 설정
m_pVertexBufBlendArray = pVBArray;
return true;
}
//Serarch 가 빨라야 한다.
void K3DRenderDeviceDX::AddRecycleVertexBuffer( K3DVertexBuffer* pVtxBuf, DWORD vtxformat, DWORD usage, DWORD stride, DWORD count )
{
THREAD_SYNCRONIZE( s_lckReloadTexture );
if( (int)m_vRecycleVBList.size() < s_nRecycleMaxCount )
{
RECYCLE_VB* pRecycleVB = new RECYCLE_VB;
pRecycleVB->usage = usage ;
pRecycleVB->vtxformat = vtxformat;
pRecycleVB->stride = stride ;
pRecycleVB->count = count ;
pRecycleVB->pVtxBuf = pVtxBuf ;
m_vRecycleVBList.push_back( pRecycleVB );
}
else
{ //
// _performance_print( "Recycle VB Over %d\n", m_vRecycleVBList.size() );
if( pVtxBuf ) pVtxBuf->Discard();
}
}
K3DVertexBuffer* K3DRenderDeviceDX::getRecycleVB( DWORD stride, DWORD Usage, DWORD vertexformat, DWORD count )
{
// return NULL;
THREAD_SYNCRONIZE( s_lckReloadTexture );
if( m_vRecycleVBList.empty() )
return NULL;
std::vector< RECYCLE_VB* >::iterator it = m_vRecycleVBList.begin();
for( ; it != m_vRecycleVBList.end(); it++ )
{
RECYCLE_VB* pReVB = (*it);
if( pReVB->usage == Usage && pReVB->vtxformat == vertexformat && pReVB->stride == stride )
{
if( pReVB->count == count )
{
// _performance_print( "Recycle Hit 01 - %d\n", m_vRecycleVBList.size() );
K3DVertexBuffer* pVB = pReVB->pVtxBuf;
delete (*it);
m_vRecycleVBList.erase(it);
return pVB;
}
else
{
//약간 큰것이라면, 준다.
int nTime = pReVB->count/count;
if( nTime == 1 )
{
// _performance_print( "Recycle Hit 02 기본:%d 요구:%d - %d\n", pReVB->count, count, m_vRecycleVBList.size() );
K3DVertexBuffer* pVB = pReVB->pVtxBuf;
delete (*it);
m_vRecycleVBList.erase(it);
return pVB;
}
}
}
}
return NULL;
}
K3DVertexBuffer* K3DRenderDeviceDX::GetRecycleVertexBuffer( DWORD vertexformat, DWORD count )
{
DWORD usage = D3DUSAGE_WRITEONLY;
DWORD stride = K3DVertexBuffer::CalcVertexStride( vertexformat );
return getRecycleVB( stride, usage, vertexformat, count );
}
K3DVertexBuffer* K3DRenderDeviceDX::GetRecycleVertexBufferBlend( DWORD stride, DWORD vertexformat, DWORD count )
{
DWORD usage = D3DUSAGE_WRITEONLY;
return getRecycleVB( stride, usage, vertexformat, count );
}
K3DVertexBuffer* K3DRenderDeviceDX::GetRecycleVertexBufferSpeedTree( DWORD stride, DWORD Usage, DWORD vertexformat, DWORD count )
{
return getRecycleVB( stride, Usage, vertexformat, count );
}
K3DVertexBuffer* K3DRenderDeviceDX::GetRecycleVertexBufferSpeedGrass( DWORD stride, DWORD Usage, DWORD vertexformat, DWORD count )
{
return getRecycleVB( stride, Usage, vertexformat, count );
}
K3DVertexBuffer* K3DRenderDeviceDX::GetRecycleVertexBufferUsePoolDefault( DWORD stride, DWORD vertexformat, DWORD count, DWORD Usage )
{
return getRecycleVB( stride, Usage, vertexformat, count );
}
// Index Buffer
K3DIndexBuffer *K3DRenderDeviceDX::CreateIndexBuffer( DWORD count, bool use32bit )
{
K3DIndexBufferDX *ib = new K3DIndexBufferDX(this);
if( ib )
{
if( ib->CreateNew( count, use32bit ) == false )
{
ib->Discard();
return NULL;
}
return ib;
}
return NULL;
}
// Texture
K3DTexture *K3DRenderDeviceDX::CreateTexture( KStream &stream, int nQuality )
{
K3DTextureDX *tex = new K3DTextureDX(this);
if( tex )
{
if( tex->Initialize( stream, nQuality ) == false )
{
tex->Discard();
return NULL;
}
//AddLostTexture(tex);
return tex;
}
return NULL;
}
K3DTexture *K3DRenderDeviceDX::CreateTexture( int width, int height, K3DFORMAT format, D3DPOOL pool/* = D3DPOOL_MANAGED*/, int nLevel /*= 1*/ )
{
K3DTextureDX *tex = new K3DTextureDX(this); // [MEMORY_LEAK] 2012. 3. 2 - marine 스마트 포인터로 릭 아님..
if( tex )
{
if( tex->CreateNew( width, height, format, pool, nLevel ) == false )
{
tex->Discard();
return NULL;
}
//AddLostTexture(tex);
return tex;
}
return NULL;
}
void K3DRenderDeviceDX::AddLostTexture( K3DTexture * tex )
{
if( tex == NULL )
{
return;
}
THREAD_SYNCRONIZE( s_lckReloadTexture );
for( unsigned int i(0); m_vReloadTextureList.size()>i; i++ )
{
if( m_vReloadTextureList[i] == tex)
{
return;
}
}
m_vReloadTextureList.push_back(tex);
}
void K3DRenderDeviceDX::RemoveTexture( K3DTexture * tex )
{
THREAD_SYNCRONIZE( s_lckReloadTexture );
for( unsigned int i(0); m_vReloadTextureList.size()>i; i++ )
{
if( tex == m_vReloadTextureList[i])
{
m_vReloadTextureList.erase( m_vReloadTextureList.begin()+i );
return;
}
}
}
K3DRenderTargetCube *K3DRenderDeviceDX::CreateRenderCube( int size, UINT nLevels, K3DFORMAT format, DWORD dwDepthUsage )
{
K3DRenderTargetCubeDX *pRenderCubeTex = new K3DRenderTargetCubeDX( this );
if( pRenderCubeTex )
{
if( pRenderCubeTex->CreateNew( size, nLevels, format, dwDepthUsage ) == false )
{
pRenderCubeTex->Discard();
return NULL;
}
AddLostTexture( pRenderCubeTex );
return pRenderCubeTex;
}
return NULL;
}
//K3DRenderTarget *K3DRenderDeviceDX::CreateRenderTarget( int width, int height, UINT nLevels, K3DFORMAT format, bool bUseDepth )
K3DRenderTarget *K3DRenderDeviceDX::CreateRenderTarget( int width, int height, UINT nLevels, K3DFORMAT format, DWORD dwDepthUsage, bool bDepth16Bit/*=false*/ )
{
// _oprint( "Device Lost : CreateRenderTarget\n" );
K3DRenderTargetDX *surf = new K3DRenderTargetDX(this);
if( surf )
{
//Device Lost 처리
// _oprint( "Device Lost : Size : %d : CreateRenderTarget (0x%08X)\n", m_vReloadTextureList.size(), surf );
//if ( surf->CreateNew( width, height, nLevels, format, bUseDepth ) )
if ( surf->CreateNew( width, height, nLevels, format, dwDepthUsage, bDepth16Bit ) == false )
{
surf->Discard();
return NULL;
}
AddLostTexture(surf);
return surf;
}
return NULL;
}
K3DTexture * K3DRenderDeviceDX::CreateTexture( int width, int height, DWORD usage, K3DFORMAT format, D3DPOOL pool/* = D3DPOOL_DEFAULT*/ )
{
// _oprint( "Device Lost : CreateRenderTarget\n" );
K3DTextureDX *tex = new K3DTextureDX(this);
if( tex )
{
if( tex->CreateNew( width, height, usage, format, pool ) == false )
{
tex->Discard();
return NULL;
}
//Device Lost 처리
AddLostTexture(tex);
// _oprint( "Device Lost : Size %d : CreateTexture (0x%08X)\n", m_vReloadTextureList.size(), tex );
return tex;
}
return NULL;
}
HRESULT K3DRenderDeviceDX::UpdateSurface( K3DTexture * pSrc, const RECT * pSrcRect, K3DTexture * pDst, const POINT * pDstPoint )
{
if( !pSrc || !pDst ) return S_FALSE;
if( !pSrc->IsValid() || !pDst->IsValid() ) return S_FALSE;
IDirect3DSurface9 *pSrcSurf = NULL;
reinterpret_cast<IDirect3DTexture9*>(pSrc->GetSurface())->GetSurfaceLevel( 0, &pSrcSurf );
IDirect3DSurface9 *pDstSurf = NULL;
reinterpret_cast<IDirect3DTexture9*>(pDst->GetSurface())->GetSurfaceLevel( 0, &pDstSurf );
HRESULT hr = m_d3ddev->UpdateSurface( pSrcSurf, pSrcRect, pDstSurf, pDstPoint );
SAFE_RELEASE( pSrcSurf );
SAFE_RELEASE( pDstSurf );
return hr;
}
HRESULT K3DRenderDeviceDX::StretchRect( K3DTexture * pSrc, const RECT * pSrcRect, K3DTexture * pDst, const RECT * pDstRect )
{
if( !m_bIsStretchRect ) return D3DERR_INVALIDCALL; //하드웨어에서 지원 안됨.
if( !pSrc || !pDst ) return S_FALSE;
if( !pSrc->IsValid() || !pDst->IsValid() ) return S_FALSE;
IDirect3DSurface9 *pSrcSurf = NULL;
reinterpret_cast<IDirect3DTexture9*>(pSrc->GetSurface())->GetSurfaceLevel( 0, &pSrcSurf );
IDirect3DSurface9 *pDstSurf = NULL;
reinterpret_cast<IDirect3DTexture9*>(pDst->GetSurface())->GetSurfaceLevel( 0, &pDstSurf );
HRESULT hr = m_d3ddev->StretchRect( pSrcSurf, pSrcRect, pDstSurf, pDstRect, m_StretchRectFilterMode );
SAFE_RELEASE( pSrcSurf );
SAFE_RELEASE( pDstSurf );
return hr;
}
bool K3DRenderDeviceDX::SetRenderTarget( int nLevel, K3DRenderTarget *target )
{
SAFE_RELEASE(m_pRenderTargetSurface);
//SAFE_RELEASE(m_pRenderTargetDepth)
//SAFE_RELEASE(m_pRenderTarget);
if ( target == NULL || !target->IsValid() ) return false;
K3DRenderTargetDX* pTDX = static_cast<K3DRenderTargetDX*>(target);
pTDX->GetD3DTexture()->GetSurfaceLevel( nLevel, &m_pRenderTargetSurface );
if ( m_d3ddev->SetRenderTarget( 0, m_pRenderTargetSurface ) == S_OK ) {
m_d3ddev->SetDepthStencilSurface( NULL );
return true;
}
return false;
}
bool K3DRenderDeviceDX::SetRenderTarget( K3DRenderTarget *target )
{
SAFE_RELEASE(m_pRenderTargetSurface);
//SAFE_RELEASE(m_pRenderTargetDepth);
//SAFE_RELEASE(m_pRenderTarget);
if ( target == NULL )
{
if ( m_d3ddev->SetRenderTarget( 0, m_backbuffer ) != S_OK )
return false;
if ( m_d3ddev->SetDepthStencilSurface( m_zbuffer ) != S_OK )
return false;
return true;
}
else
{
if( target->IsValid() )
{
K3DRenderTargetDX* pTDX = static_cast<K3DRenderTargetDX*>(target);
if( pTDX->GetD3DTexture() )
{
pTDX->GetD3DTexture()->GetSurfaceLevel( 0, &m_pRenderTargetSurface );
}
//if( pTDX->GetDepthUsage() == K3DRenderTargetDX::DEPTH_ENABLE || pTDX->GetDepthUsage() == K3DRenderTargetDX::DEPTH_USEASTEXTURE )
//{
// if( pTDX->GetDepth() )
// {
// pTDX->GetDepth()->GetSurfaceLevel( 0, &m_pRenderTargetDepth );
// }
//}
if( pTDX->GetDepthUsage() == K3DRenderTarget::DEPTH_ENABLE )
{
if( m_d3ddev->SetRenderTarget( 0, m_pRenderTargetSurface ) != S_OK )
return false;
if( m_d3ddev->SetDepthStencilSurface( pTDX->GetDepth() ) != S_OK )
return false;
return true;
}
else
{
if ( m_d3ddev->SetRenderTarget( 0, m_pRenderTargetSurface ) == S_OK ) {
m_d3ddev->SetDepthStencilSurface( NULL );
return true;
}
}
//if( pTDX->GetDepthUsage() == K3DRenderTargetDX::DEPTH_ENABLE || pTDX->GetDepthUsage() == K3DRenderTargetDX::DEPTH_USEASTEXTURE )
//{
// if( m_d3ddev->SetRenderTarget( 0, m_pRenderTargetSurface ) != S_OK )
// return false;
// if( m_d3ddev->SetDepthStencilSurface( m_pRenderTargetDepth ) != S_OK )
// return false;
// return true;
//}
//else
//{
// if ( m_d3ddev->SetRenderTarget( 0, m_pRenderTargetSurface ) == S_OK ) {
// m_d3ddev->SetDepthStencilSurface( NULL );
// return true;
// }
//}
}
}
return false;
}
bool K3DRenderDeviceDX::SetRenderTargetCube( K3DRenderTargetCube* pTargetCube, int nCubeFace, int nLevel /*= 0*/ )
{
SAFE_RELEASE(m_pRenderTargetSurface);
if ( pTargetCube == NULL )
{
if ( m_d3ddev->SetRenderTarget( 0, m_backbuffer ) != S_OK )
return false;
if ( m_d3ddev->SetDepthStencilSurface( m_zbuffer ) != S_OK )
return false;
return true;
}
else
{
if( pTargetCube->IsValid() )
{
K3DRenderTargetCubeDX* pTDX = static_cast<K3DRenderTargetCubeDX*>(pTargetCube);
if( pTDX->GetD3DCubeTexture() && nCubeFace < 6)
{
pTDX->GetD3DCubeTexture()->GetCubeMapSurface( (D3DCUBEMAP_FACES)nCubeFace, nLevel, &m_pRenderTargetSurface );
}
if( pTDX->GetDepthUsage() == K3DRenderTarget::DEPTH_ENABLE )
{
if( m_d3ddev->SetRenderTarget( 0, m_pRenderTargetSurface ) != S_OK )
return false;
if( m_d3ddev->SetDepthStencilSurface( pTDX->GetDepth() ) != S_OK )
return false;
return true;
}
else
{
if ( m_d3ddev->SetRenderTarget( 0, m_pRenderTargetSurface ) == S_OK ) {
m_d3ddev->SetDepthStencilSurface( NULL );
return true;
}
}
}
}
return false;
}
void K3DRenderDeviceDX::SaveRenderTargetSurface( K3DIMAGE_FILEFORMAT nImageFileFormat )
{
if( m_pRenderTargetSurface )
{
D3DXIMAGE_FILEFORMAT fileformat;
std::string str = "rendertarget";
switch( nImageFileFormat )
{
case K3DIFF_BMP:
{
str += ".bmp";
fileformat = D3DXIFF_BMP;
}
break;
case K3DIFF_JPG:
{
str += ".jpg";
fileformat = D3DXIFF_JPG;
}
break;
case K3DIFF_TGA:
{
str += ".tga";
fileformat = D3DXIFF_TGA;
}
break;
case K3DIFF_PNG:
{
str += ".png";
fileformat = D3DXIFF_PNG;
}
break;
case K3DIFF_DDS:
{
str += ".dds";
fileformat = D3DXIFF_DDS;
}
break;
case K3DIFF_PPM:
{
str += ".ppm";
fileformat = D3DXIFF_PPM;
}
break;
case K3DIFF_DIB:
{
str += ".dib";
fileformat = D3DXIFF_DIB;
}
break;
case K3DIFF_HDR:
{
str += ".hdr";
fileformat = D3DXIFF_HDR;
}
break;
case K3DIFF_PFM:
{
str += ".pfm";
fileformat = D3DXIFF_PFM;
}
break;
default:
assert( false && "지원하지 않는 파일 포맷입니다." );
return;
}
D3DXSaveSurfaceToFile( str.c_str(), fileformat, m_pRenderTargetSurface, NULL, NULL);
}
}
bool K3DRenderDeviceDX::SetSwapChain(KSwapChainDX* pSwapChain)
{
m_pSwapChain = pSwapChain;
if(!pSwapChain)
{
if(m_d3ddev->SetRenderTarget(0, m_backbuffer) != S_OK)
return false;
if(m_d3ddev->SetDepthStencilSurface(m_zbuffer) != S_OK)
return false;
return true;
}
else
{
if(m_d3ddev->SetRenderTarget(0, pSwapChain->GetBackBuffer()) != S_OK)
return false;
if(pSwapChain->DoesUseDepthBuffer())
{
if(m_d3ddev->SetDepthStencilSurface(pSwapChain->GetDepthBuffer()) != S_OK)
return false;
}
else
{
if(m_d3ddev->SetDepthStencilSurface(NULL) != S_OK)
return false;
}
return true;
}
return false;
}
K3DTexture *K3DRenderDeviceDX::SetTexture( int stage, K3DTexture *tex )
{
if( s_bForceTextureNull )
{
m_stageTextures[stage] = NULL;
HRESULT hres = m_d3ddev->SetTexture( stage, NULL );
return NULL;
}
K3DTexture *old = m_stageTextures[stage];
m_stageTextures[stage] = tex;
HRESULT hres;
if ( tex && tex->IsValid() == true )
hres = m_d3ddev->SetTexture( stage, reinterpret_cast<IDirect3DTexture9*>(tex->GetSurface()) );
else
hres = m_d3ddev->SetTexture( stage, NULL );
assert( hres == D3D_OK );
return old;
}
//
// Light
//
void K3DRenderDeviceDX::EnableLightEffect( bool enable )
{
K3DRenderDevice::EnableLightEffect( enable );
m_d3ddev->SetRenderState( D3DRS_LIGHTING, enable ? TRUE : FALSE );
}
void K3DRenderDeviceDX::SetLight( int index, const K3DLight *light )
{
memcpy( &m_arLights[index], light, sizeof(m_arLights[index]) );
m_d3ddev->SetLight( index, (const D3DLIGHT9*)light );
}
void K3DRenderDeviceDX::SetLightEnable( int index, bool enable )
{
m_bEnLight[index] = enable;
m_d3ddev->LightEnable( index, enable );
}
void K3DRenderDeviceDX::SetBright(float bright)
{
//m_fBright = bright;
//BYTE highGamma = (BYTE) (255.0f * bright);
//float grey = 255.0f * 0.2125f + 255.0f * 0.7154f + 255.0f * 0.0721f;
//float fGamma = grey + bright * (255.0f - grey);
//if(fGamma < 0.0f) fGamma = 0.0f;
//else if(fGamma > 255.0f) fGamma = 255.0f;
//BYTE highGamma = (BYTE) fGamma;
//SetGammaRange(KColor(0), KColor(highGamma, highGamma, highGamma, highGamma), m_nContrast);
SetGammaRange(m_lowGamma, m_highGamma, m_nContrast, bright);
}
void K3DRenderDeviceDX::SetContrast(int contrast)
{
SetGammaRange(m_lowGamma, m_highGamma, contrast, m_fBright);
}
void K3DRenderDeviceDX::SetGammaRange( const KColor &low, const KColor &high, int contrast /* = 1 */, float bright)
{
m_highGamma = high;
m_lowGamma = low;
m_nContrast = contrast;
m_fBright = bright;
if ( m_cs.bFullScreen ) // 임시로 없앰 by blackfish
{
D3DGAMMARAMP d3dgr;
//::ZeroMemory(&d3dgr, sizeof(D3DGAMMARAMP));
int r, g, b;
for ( int i=0 ; i<256; i+= contrast )
{
//r = (int)(((1-i/255.f) * low.r + i/255.f*high.r) * 257.f );
//g = (int)(((1-i/255.f) * low.g + i/255.f*high.g) * 257.f );
//b = (int)(((1-i/255.f) * low.b + i/255.f*high.b) * 257.f );
//r = (int)(((1-i/255.f) * low.r + i/255.f*400) * 257.f );
//g = (int)(((1-i/255.f) * low.g + i/255.f*400) * 257.f );
//b = (int)(((1-i/255.f) * low.b + i/255.f*400) * 257.f );
r = (int)(((1-i/255.f) * low.r + i/255.f*high.r) * 257.f * bright);
g = (int)(((1-i/255.f) * low.g + i/255.f*high.g) * 257.f * bright);
b = (int)(((1-i/255.f) * low.b + i/255.f*high.b) * 257.f * bright);
if(r > 65535) r = 65535;
if(g > 65535) g = 65535;
if(b > 65535) b = 65535;
for ( int j=0 ; j<contrast && i+j < 256 ; ++j )
{
d3dgr.red[i+j] = (unsigned short)r;
d3dgr.green[i+j] = (unsigned short)g;
d3dgr.blue[i+j] = (unsigned short)b;
}
}
m_d3ddev->SetGammaRamp( 0, D3DSGR_CALIBRATE, &d3dgr );
//m_d3ddev->SetGammaRamp( 1, D3DSGR_NO_CALIBRATION, &d3dgr );
}
}
void K3DRenderDeviceDX::SetDefaultGammaRange()
{
if ( m_cs.bFullScreen )
{
D3DGAMMARAMP d3dgr;
memcpy(&d3dgr, &m_OldD3dgr, sizeof(d3dgr));
float rate0, rate1, rate2;
WORD RED, GREEN, BLUE;
for ( int i=0 ; i<256; i++)
{
rate0 = float(i);
rate1 = float(i);
rate2 = float(i);
RED = WORD(256 * rate0);
GREEN = WORD(256 * rate1);
BLUE = WORD(256 * rate2);
if(RED > 65535) RED = 65535;
if(GREEN > 65535) GREEN = 65535;
if(BLUE > 65535) BLUE = 65535;
d3dgr.red[i] = RED;
d3dgr.green[i] = GREEN;
d3dgr.blue[i] = BLUE;
}
m_d3ddev->SetGammaRamp( 0, D3DSGR_CALIBRATE, &d3dgr );
}
}
bool K3DRenderDeviceDX::SetRenderState( DWORD stateindex )
{
if( stateindex == m_idxCurRS ) return false;
if(m_hRS[stateindex]->Apply() != S_OK)
return false;
else {
m_idxCurRS = stateindex;
return true;
}
}
void K3DRenderDeviceDX::SetTransform( int stage, const K3DMatrix *mat, int count )
{
K3DRenderDevice::SetTransform(stage, mat, count);
switch( stage )
{
case TS_WORLD:
m_d3ddev->SetTransform( D3DTS_WORLD, (const D3DXMATRIX *)mat );
//SetVertexShaderMatrix( MATRIX_WORLD, &mat );
SetMatrixArray((const D3DXMATRIX *)mat, count);
break;
case TS_VIEW:
m_d3ddev->SetTransform( D3DTS_VIEW, (const D3DXMATRIX *)mat );
SetVertexShaderMatrix( MATRIX_VIEW, mat );
K3DMatrixMultiply( m_VPMat, *mat, *GetTransform(TS_PROJECTION) );
SetVertexShaderMatrix( MATRIX_VIEWPROJECTION, &m_VPMat );
break;
case TS_PROJECTION:
m_d3ddev->SetTransform( D3DTS_PROJECTION, (const D3DXMATRIX *)mat );
SetVertexShaderMatrix( MATRIX_PROJECTION, mat );
K3DMatrixMultiply( m_VPMat, *GetTransform(TS_VIEW), *mat );
SetVertexShaderMatrix( MATRIX_VIEWPROJECTION, &m_VPMat );
break;
case TS_TEXTURE0:
m_d3ddev->SetTransform( D3DTS_TEXTURE0, (const D3DXMATRIX *)mat );
break;
/* case TS_TEXTURE1:
m_d3ddev->SetTransform( D3DTS_TEXTURE1, (const D3DXMATRIX *)mat );
break;
case TS_TEXTURE2:
m_d3ddev->SetTransform( D3DTS_TEXTURE2, (const D3DXMATRIX *)mat );
break;
case TS_TEXTURE3:
m_d3ddev->SetTransform( D3DTS_TEXTURE3, (const D3DXMATRIX *)mat );
break;
case TS_TEXTURE4:
m_d3ddev->SetTransform( D3DTS_TEXTURE4, (const D3DXMATRIX *)mat );
break;
case TS_TEXTURE5:
m_d3ddev->SetTransform( D3DTS_TEXTURE5, (const D3DXMATRIX *)mat );
break;
case TS_TEXTURE6:
m_d3ddev->SetTransform( D3DTS_TEXTURE6, (const D3DXMATRIX *)mat );
break;
case TS_TEXTURE7:
m_d3ddev->SetTransform( D3DTS_TEXTURE7, (const D3DXMATRIX *)mat );
break;*/
}
}
void K3DRenderDeviceDX::SetTransformIdentity( int stage )
{
K3DMatrixIdentity( m_arTransformStages[stage] );
switch( stage )
{
case TS_WORLD:
m_d3ddev->SetTransform( D3DTS_WORLD, m_arTransformStages[stage] );
break;
case TS_VIEW:
m_d3ddev->SetTransform( D3DTS_VIEW, m_arTransformStages[stage] );
break;
case TS_PROJECTION:
m_d3ddev->SetTransform( D3DTS_PROJECTION, m_arTransformStages[stage] );
break;
case TS_WORLD1:
m_d3ddev->SetTransform( D3DTS_WORLD1, m_arTransformStages[stage] );
break;
case TS_WORLD2:
m_d3ddev->SetTransform( D3DTS_WORLD2, m_arTransformStages[stage] );
break;
case TS_WORLD3:
m_d3ddev->SetTransform( D3DTS_WORLD3, m_arTransformStages[stage] );
break;
case TS_TEXTURE0:
m_d3ddev->SetTransform( D3DTS_TEXTURE0, m_arTransformStages[stage] );
break;
case TS_TEXTURE1:
m_d3ddev->SetTransform( D3DTS_TEXTURE1, m_arTransformStages[stage] );
break;
case TS_TEXTURE2:
m_d3ddev->SetTransform( D3DTS_TEXTURE2, m_arTransformStages[stage] );
break;
case TS_TEXTURE3:
m_d3ddev->SetTransform( D3DTS_TEXTURE3, m_arTransformStages[stage] );
break;
case TS_TEXTURE4:
m_d3ddev->SetTransform( D3DTS_TEXTURE4, m_arTransformStages[stage] );
break;
case TS_TEXTURE5:
m_d3ddev->SetTransform( D3DTS_TEXTURE5, m_arTransformStages[stage] );
break;
case TS_TEXTURE6:
m_d3ddev->SetTransform( D3DTS_TEXTURE6, m_arTransformStages[stage] );
break;
case TS_TEXTURE7:
m_d3ddev->SetTransform( D3DTS_TEXTURE7, m_arTransformStages[stage] );
break;
}
}
// material
void K3DRenderDeviceDX::SetMaterial( const K3DMaterial *mat )
{
memcpy( &m_curMaterial, mat, sizeof(m_curMaterial) );
m_d3ddev->SetMaterial( (const D3DMATERIAL9*)mat );
}
// Shader
void K3DRenderDeviceDX::SetVertexShaderConstant( DWORD Register, CONST void* pConstantData, DWORD ConstantCount )
{
m_d3ddev->SetVertexShaderConstantF( Register, (CONST float*)pConstantData, ConstantCount );
}
//
// Drawing
//
void K3DRenderDeviceDX::DrawPoints( int vtxFormat, void* vtx, int vtxCount, int vtxStride )
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
++m_nDPCount;
INCPOLYCOUNT(1);
SetFVF(vtxFormat);
m_d3ddev->DrawPrimitiveUP( D3DPT_POINTLIST, vtxCount, vtx, vtxStride );
}
void K3DRenderDeviceDX::DrawLine( int vtxFormat, void* vtx, int vtxStride )
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
++m_nDPCount;
INCPOLYCOUNT(1);
SetFVF(vtxFormat);
m_d3ddev->DrawPrimitiveUP ( D3DPT_LINELIST, 1, vtx, vtxStride );
}
void K3DRenderDeviceDX::DrawTriangle( int vtxFormat, void* vtx, int vtxStride )
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
++m_nDPCount;
INCPOLYCOUNT(1);
SetFVF(vtxFormat);
m_d3ddev->DrawPrimitiveUP ( D3DPT_TRIANGLELIST, 1, vtx, vtxStride );
}
void K3DRenderDeviceDX::DrawLines(int vtxFormat, void* vtx, int vtxCount, int vtxStride )
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
++m_nDPCount;
INCPOLYCOUNT( vtxCount/2 );
SetFVF(vtxFormat);
m_d3ddev->DrawPrimitiveUP ( D3DPT_LINELIST, vtxCount/2, vtx, vtxStride );
}
void K3DRenderDeviceDX::DrawTriangles( int vtxFormat, void* vtxBuf, int vtxCount, int vtxStride )
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
SetVertexShaderDefault();
m_d3ddev->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_LINEAR );
++m_nDPCount;
INCPOLYCOUNT( vtxCount/3 );
SetFVF(vtxFormat);
m_d3ddev->DrawPrimitiveUP( D3DPT_TRIANGLELIST, vtxCount/3, vtxBuf, vtxStride );
}
void K3DRenderDeviceDX::DrawTriangles( int vtxFormat, void* vtxBuf, int vtxCount, int vtxStride, const unsigned short* indexBuf, int indexCount )
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
SetVertexShaderDefault();
m_d3ddev->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_LINEAR );
++m_nDPCount;
INCPOLYCOUNT( indexCount/3 );
SetFVF(vtxFormat);
HRESULT hres = m_d3ddev->DrawIndexedPrimitiveUP( D3DPT_TRIANGLELIST, 0, vtxCount, indexCount/3, indexBuf, D3DFMT_INDEX16, vtxBuf, vtxStride );
if ( hres != D3D_OK )
{
assert( 0 );
}
}
void K3DRenderDeviceDX::DrawLineStrip(int vtxFormat, void* vtx, int vtxCount, int vtxStride )
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
++m_nDPCount;
INCPOLYCOUNT( vtxCount-1 );
SetFVF(vtxFormat);
m_d3ddev->DrawPrimitiveUP ( D3DPT_LINESTRIP, vtxCount - 1, vtx, vtxStride );
}
void K3DRenderDeviceDX::DrawTriangleFan( int vtxFormat, void* vtxBuf, int vtxCount, int vtxStride )
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
//m_d3ddev->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_LINEAR ); // sonador #2.1.7.1 스피드 트리 퍼포먼스 증가
++m_nDPCount;
INCPOLYCOUNT( vtxCount-2 );
SetFVF(vtxFormat);
m_d3ddev->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, vtxCount - 2, vtxBuf, vtxStride);
}
void K3DRenderDeviceDX::DrawTriangleFan_VS( int vtxFormat, void* vtxBuf, int vtxCount, int vtxStride )
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
//m_d3ddev->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_LINEAR );
m_d3ddev->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_NONE );
++m_nDPCount;
INCPOLYCOUNT( vtxCount-2 );
SetFVF(vtxFormat);
HRESULT hres;
unsigned int uPasses, uPass;
if( m_pEffect->Begin(&uPasses, 0 ) == D3D_OK )
{
for( uPass = 0; uPass < uPasses; uPass++)
{
// Set the state for a particular pass in a technique.
m_pEffect->BeginPass(uPass);
hres = m_d3ddev->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, vtxCount - 2, vtxBuf, vtxStride);
if ( hres != D3D_OK )
{
assert( 0 );
}
m_pEffect->EndPass();
}
m_pEffect->End();
}
}
void K3DRenderDeviceDX::DrawTriangleStrip( int vtxFormat, void* vtxBuf, int vtxCount, int vtxStride )
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
m_d3ddev->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_LINEAR );
++m_nDPCount;
INCPOLYCOUNT( vtxCount-2 );
SetVertexShaderDefault();
SetFVF(vtxFormat);
m_d3ddev->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, vtxCount-2, vtxBuf, vtxStride);
}
void K3DRenderDeviceDX::DrawTriangleStrip_VS( int vtxFormat, void* vtxBuf, int vtxCount, int vtxStride )
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
//m_d3ddev->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_LINEAR );
m_d3ddev->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_NONE );
++m_nDPCount;
INCPOLYCOUNT( vtxCount-2 );
SetVertexShaderDefault();
SetFVF(vtxFormat);
HRESULT hres;
unsigned int uPasses, uPass;
if( m_pEffect->Begin(&uPasses, 0 ) == D3D_OK )
{
for( uPass = 0; uPass < uPasses; uPass++)
{
// Set the state for a particular pass in a technique.
m_pEffect->BeginPass(uPass);
hres = m_d3ddev->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, vtxCount - 2, vtxBuf, vtxStride);
if ( hres != D3D_OK )
{
assert( 0 );
}
m_pEffect->EndPass();
}
m_pEffect->End();
}
}
void K3DRenderDeviceDX::DrawTriangleVB(const K3DVertexBuffer *vb, int vtxCount)
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
++m_nDPCount;
INCPOLYCOUNT( vtxCount ? vtxCount/3 : vb->GetVertexCount()/3 );
SetFVF(vb->GetVertexFormat());
m_d3ddev->SetStreamSource(0, static_cast<const K3DVertexBufferDX*>(vb)->GetD3DVertexBuffer(), 0, vb->GetVertexStride());
if( vtxCount )
m_d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, vtxCount / 3);
else
m_d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, vb->GetVertexCount() / 3);
}
void K3DRenderDeviceDX::DrawTriangleFanVB(const K3DVertexBuffer *vb)
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
++m_nDPCount;
INCPOLYCOUNT( vb->GetVertexCount()-2 );
SetFVF(vb->GetVertexFormat());
m_d3ddev->SetStreamSource(0, static_cast<const K3DVertexBufferDX*>(vb)->GetD3DVertexBuffer(), 0, vb->GetVertexStride());
m_d3ddev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, vb->GetVertexCount()-2);
}
void K3DRenderDeviceDX::DrawTriangleFanVB_VS(const K3DVertexBuffer *vb, UINT nStartVertex, UINT nPrimitiveCount )
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
++m_nDPCount;
INCPOLYCOUNT( vb->GetVertexCount()-2 );
SetFVF(vb->GetVertexFormat());
m_d3ddev->SetStreamSource(0, static_cast<const K3DVertexBufferDX*>(vb)->GetD3DVertexBuffer(), 0, vb->GetVertexStride());
HRESULT hres;
unsigned int uPasses, uPass;
if( m_pEffect->Begin(&uPasses, 0 ) == D3D_OK )
{
for( uPass = 0; uPass < uPasses; uPass++)
{
m_pEffect->BeginPass(uPass);
if( nStartVertex != 0 && nPrimitiveCount != 0 )
hres = m_d3ddev->DrawPrimitive(D3DPT_TRIANGLEFAN, nStartVertex, nPrimitiveCount );
else
hres = m_d3ddev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, vb->GetVertexCount()-2);
if ( hres != D3D_OK )
{
assert( 0 );
}
m_pEffect->EndPass();
}
m_pEffect->End();
}
}
void K3DRenderDeviceDX::DrawIndexedTriangleFanVB_VS(const K3DVertexBuffer *vb, const K3DIndexBuffer *ib )
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
++m_nDPCount;
INCPOLYCOUNT( vb->GetVertexCount()-2 );
SetFVF(vb->GetVertexFormat());
m_d3ddev->SetStreamSource(0, static_cast<const K3DVertexBufferDX*>(vb)->GetD3DVertexBuffer(), 0, vb->GetVertexStride());
m_d3ddev->SetIndices(static_cast<const K3DIndexBufferDX*>(ib)->GetD3DIndexBuffer());
HRESULT hres;
unsigned int uPasses, uPass;
if( m_pEffect->Begin(&uPasses, 0 ) == D3D_OK )
{
for( uPass = 0; uPass < uPasses; uPass++)
{
m_pEffect->BeginPass(uPass);
hres = m_d3ddev->DrawIndexedPrimitive( D3DPT_TRIANGLEFAN, 0, 0, vb->GetVertexCount(), 0, ib->GetIndexCount()-2 );
if ( hres != D3D_OK )
{
assert( 0 );
}
m_pEffect->EndPass();
}
m_pEffect->End();
}
}
void K3DRenderDeviceDX::DrawTriangleStripVB(const K3DVertexBuffer *vb, int vtxCount)
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
++m_nDPCount;
INCPOLYCOUNT( vtxCount ? vtxCount-2 : vb->GetVertexCount()-2 );
SetFVF(vb->GetVertexFormat());
m_d3ddev->SetStreamSource(0, static_cast<const K3DVertexBufferDX*>(vb)->GetD3DVertexBuffer(), 0, vb->GetVertexStride());
if( vtxCount )
m_d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, vtxCount-2 );
else
m_d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, vb->GetVertexCount()-2);
}
void K3DRenderDeviceDX::DrawTriangleStripVB_VS(const K3DVertexBuffer *vb, int vtxCount)
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
++m_nDPCount;
INCPOLYCOUNT( vtxCount ? vtxCount-2 : vb->GetVertexCount()-2 );
SetFVF(vb->GetVertexFormat());
m_d3ddev->SetStreamSource(0, static_cast<const K3DVertexBufferDX*>(vb)->GetD3DVertexBuffer(), 0, vb->GetVertexStride());
HRESULT hres;
unsigned int uPasses, uPass;
if( m_pEffect->Begin(&uPasses, 0 ) == D3D_OK )
{
for( uPass = 0; uPass < uPasses; uPass++)
{
m_pEffect->BeginPass(uPass);
if( vtxCount )
hres = m_d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, vtxCount-2 );
else
hres = m_d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, vb->GetVertexCount()-2);
if ( hres != D3D_OK )
{
assert( 0 );
}
m_pEffect->EndPass();
}
m_pEffect->End();
}
}
void K3DRenderDeviceDX::DrawIndexedTriangleVB(const K3DVertexBuffer *vb, const K3DIndexBuffer *ib)
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
++m_nDPCount;
INCPOLYCOUNT( ib->GetIndexCount()/3 );
HRESULT hres;
SetFVF(vb->GetVertexFormat());
m_d3ddev->SetStreamSource(0, static_cast<const K3DVertexBufferDX*>(vb)->GetD3DVertexBuffer(), 0, vb->GetVertexStride());
m_d3ddev->SetIndices(static_cast<const K3DIndexBufferDX*>(ib)->GetD3DIndexBuffer());
hres = m_d3ddev->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, vb->GetVertexCount(), 0, ib->GetIndexCount()/3 );
if ( hres != D3D_OK )
{
assert( 0 );
}
}
//Speed Tree
void K3DRenderDeviceDX::DrawIndexedTriangleStripVB(const K3DVertexBuffer *vb, const K3DIndexBuffer *ib, UINT nVtxCnt, UINT nPriCnt )
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
++m_nDPCount;
INCPOLYCOUNT( nPriCnt );
HRESULT hres;
// m_d3ddev->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_LINEAR );
SetFVF(vb->GetVertexFormat());
m_d3ddev->SetStreamSource(0, static_cast<const K3DVertexBufferDX*>(vb)->GetD3DVertexBuffer(), 0, vb->GetVertexStride());
m_d3ddev->SetIndices(static_cast<const K3DIndexBufferDX*>(ib)->GetD3DIndexBuffer());
hres = m_d3ddev->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP, 0, 0, nVtxCnt, 0, nPriCnt);
if ( hres != D3D_OK )
{
assert( 0 );
}
}
void K3DRenderDeviceDX::DrawPrimitiveUP( int vtxFormat, void* vtxBuf,int vtxCount, int vtxStride )
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
++m_nDPCount;
INCPOLYCOUNT( vtxCount/3 );
SetFVF(vtxFormat);
m_d3ddev->DrawPrimitiveUP( D3DPT_TRIANGLELIST, vtxCount, vtxBuf, vtxStride );
}
void K3DRenderDeviceDX::DrawIndexedPrimitiveUP( int vtxFormat, void* vtxBuf,int vtxCount, int vtxStride, unsigned short* indexBuf, int indexCount )
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
++m_nDPCount;
INCPOLYCOUNT( indexCount/3 );
SetFVF(vtxFormat);
m_d3ddev->DrawIndexedPrimitiveUP( D3DPT_TRIANGLELIST, 0, vtxCount, indexCount/3, indexBuf, D3DFMT_INDEX16, vtxBuf, vtxStride );
}
void K3DRenderDeviceDX::DrawPrimitiveUP_VS( int vtxFormat, void* vtxBuf,int vtxCount, int vtxStride )
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
++m_nDPCount;
INCPOLYCOUNT( vtxCount/3 );
SetFVF(vtxFormat);
HRESULT hres;
unsigned int uPasses, uPass;
if( m_pEffect->Begin(&uPasses, 0 ) == D3D_OK )
{
for( uPass = 0; uPass < uPasses; uPass++)
{
// Set the state for a particular pass in a technique.
m_pEffect->BeginPass(uPass);
hres = m_d3ddev->DrawPrimitiveUP( D3DPT_TRIANGLELIST, vtxCount, vtxBuf, vtxStride );
if ( hres != D3D_OK )
{
assert( 0 );
}
m_pEffect->EndPass();
}
m_pEffect->End();
}
}
void K3DRenderDeviceDX::DrawIndexedPrimitiveUP_VS( int vtxFormat, void* vtxBuf, int vtxCount, int vtxStride, const unsigned short* indexBuf, int indexCount )
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
++m_nDPCount;
INCPOLYCOUNT( indexCount/3 );
SetFVF(vtxFormat);
HRESULT hres;
unsigned int uPasses, uPass;
if( m_pEffect->Begin(&uPasses, 0 ) == D3D_OK )
{
for( uPass = 0; uPass < uPasses; uPass++)
{
// Set the state for a particular pass in a technique.
m_pEffect->BeginPass(uPass);
hres = m_d3ddev->DrawIndexedPrimitiveUP( D3DPT_TRIANGLELIST, 0, vtxCount, indexCount/3, indexBuf, D3DFMT_INDEX16, vtxBuf, vtxStride );
if ( hres != D3D_OK )
{
assert( 0 );
}
m_pEffect->EndPass();
}
m_pEffect->End();
}
}
void K3DRenderDeviceDX::DrawIndexedPrimitiveUPLine( int vtxFormt, void* vtxBuf, void* vIdxBuf, int vtxCount, int vtxIdxCount, int vtxStride )
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
++m_nDPCount;
INCPOLYCOUNT( vtxIdxCount/2 );
SetFVF(vtxFormt);
m_d3ddev->DrawIndexedPrimitiveUP(D3DPT_LINELIST, 0, vtxCount, vtxIdxCount, vIdxBuf, D3DFMT_INDEX16, vtxBuf, vtxStride);
}
void K3DRenderDeviceDX::DrawIndexedTriangleVB_VS(const K3DVertexBuffer *vb, const K3DIndexBuffer *ib, int primcount, int s_framecount)
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
//매트릭스 설정을 하는데...,
if( !m_pEffect ) return;
if(primcount == 0) {
primcount = ib->GetIndexCount()/3;
s_framecount = 1;
}
++m_nDPCount;
INCPOLYCOUNT( primcount*s_framecount );
int vtx_count = vb->GetVertexCount();
m_d3ddev->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_NONE );
m_d3ddev->SetStreamSource(0, static_cast<const K3DVertexBufferDX*>(vb)->GetD3DVertexBuffer(), 0, vb->GetVertexStride());
m_d3ddev->SetIndices(static_cast<const K3DIndexBufferDX*>(ib)->GetD3DIndexBuffer());
HRESULT hres;
unsigned int uPasses, uPass;
if( m_pEffect->Begin(&uPasses, 0 ) == D3D_OK )
{
for( uPass = 0; uPass < uPasses; uPass++)
{
// Set the state for a particular pass in a technique.
m_pEffect->BeginPass(uPass);
hres = m_d3ddev->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, vtx_count, 0, primcount );
if ( hres != D3D_OK )
{
assert( 0 );
}
m_pEffect->EndPass();
}
m_pEffect->End();
}
}
void K3DRenderDeviceDX::SetTechnique( int nTechniqueIndex )
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
if( !m_pEffect ) return;
m_pEffect->SetTechnique( m_pTechHandles[nTechniqueIndex] );
}
void K3DRenderDeviceDX::SetVertexShaderConstant( const TCHAR *dcl, const float *value, DWORD count )
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
if( !m_pEffect ) return;
#ifdef _DEBUG
D3DXHANDLE hParameter = m_pEffect->GetParameterByName(NULL, dcl);
#endif
HRESULT hr = m_pEffect->SetValue(dcl, (const void*)value, count*sizeof(float));
assert(hr == S_OK && "선언부가 틀린듯하다.");
}
void K3DRenderDeviceDX::SetVertexShaderMaterialLight( const K3DMaterial *mat, const K3DLight *light )
{
if( light == NULL ) return;
//K3DLight Matrial_Light;
//Matrial_Light = (*light);
//Matrial_Light.ambient.r = mat->Ambient.r * light->ambient.r;
//Matrial_Light.ambient.g = mat->Ambient.g * light->ambient.g;
//Matrial_Light.ambient.b = mat->Ambient.b * light->ambient.b;
//Matrial_Light.diffuse.r = mat->Diffuse.r * light->diffuse.r;
//Matrial_Light.diffuse.g = mat->Diffuse.g * light->diffuse.g;
//Matrial_Light.diffuse.b = mat->Diffuse.b * light->diffuse.b;
SetVertexShaderLight( light );
}
void K3DRenderDeviceDX::SetVertexShaderLight( const K3DLight *light )
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
if( !m_pEffect || !light ) return;
K3DVector g_fLightDir = K3DVector(0,-1,-1);
K3DVector g_fLightPos = K3DVector(0,-1,-1);
K3DVector g_fLightAttenuation = K3DVector(0.f, 0.1f, 0.f);
float ambient[4] = {0.3f, 0.3f, 0.3f, 1.0f};
float diffuse[4] = {1.0f, 1.0f, 1.0f, 1.0f};
float specular[4] = {1.0f, 1.0f, 1.0f, 1.0f};
//매트릭스 설정을 하는데...,
{
g_fLightDir = light->direction;
g_fLightPos = light->position;
Normalize( g_fLightDir );
ambient[0] = light->ambient.r/2;
ambient[1] = light->ambient.g/2;
ambient[2] = light->ambient.b/2;
ambient[3] = light->attenuation1;
diffuse[0] = light->diffuse.r/2;
diffuse[1] = light->diffuse.g/2;
diffuse[2] = light->diffuse.b/2;
diffuse[3] = light->diffuse.a;
//스페큘러는 광역만 설정 가능하다. 각 개개별 오브젝트 설정 불가
specular[0] = light->specular.r;
specular[1] = light->specular.g;
specular[2] = light->specular.b;
specular[3] = light->specular.a;
}
D3DXHANDLE hParameter = NULL;
D3DXHANDLE hTechnique = NULL;
//위에서 한번만 하면 되는 것들...////////////////////////////////////////////////////////////////
//Light Position
hParameter = m_pEffect->GetParameterByName(NULL,"Light_position");
{
m_pEffect->SetValue("Light_position", (void*)g_fLightPos, sizeof(g_fLightPos));
}
//Light Ambient
hParameter = m_pEffect->GetParameterByName(NULL,"Light_ambient");
{
m_pEffect->SetValue("Light_ambient", (void*)ambient, sizeof(ambient));
}
//Light Diffuse
hParameter = m_pEffect->GetParameterByName(NULL,"Light_diffuse");
{
m_pEffect->SetValue("Light_diffuse", (void*)diffuse, sizeof(diffuse));
}
//초기화 해줘야 될 수도 있다. nVidia 테스트 끝나고, ATI 쪽에서 안된다면 초기화 해주자.
hParameter = m_pEffect->GetParameterByName(NULL,"Light_specular");
HRESULT hr;
if( hParameter )
{
hr = m_pEffect->SetValue("Light_specular", (void*)specular, sizeof(specular));
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
// Present
void K3DRenderDeviceDX::BeginScene()
{
if ( m_nBeginSceneCount == 0 )
m_d3ddev->BeginScene();
++m_nBeginSceneCount;
assert( m_nBeginSceneCount > 0 );
}
void K3DRenderDeviceDX::EndScene()
{
assert( m_nBeginSceneCount > 0 );
--m_nBeginSceneCount;
if ( m_nBeginSceneCount == 0 )
m_d3ddev->EndScene();
}
HRESULT K3DRenderDeviceDX::Render()
{
HRESULT hr = S_OK;
if ( m_nBeginSceneCount == 0 )
{
if ( m_cs.bFullScreen )
{
if(m_pSwapChain)
{
hr = m_pSwapChain->GetInterface()->Present(NULL, NULL, NULL, NULL, 0);
}
else
{
hr = m_d3ddev->Present( NULL, NULL, NULL, NULL );
}
}
else
{
RECT srt;
RECT drt;
srt.left = srt.top = 0;
srt.right = m_viewport.Width; srt.bottom = m_viewport.Height;
drt.top = m_viewport.Y; drt.bottom = m_viewport.Height;
drt.left = m_viewport.X; drt.right = m_viewport.Width;
if(m_pSwapChain)
{
hr = m_pSwapChain->GetInterface()->Present( &srt, &drt, m_pSwapChain->GetHwnd(), NULL, 0 );
}
else
{
hr = m_d3ddev->Present( &srt, &drt, (HWND)m_cs.hFocusWnd, NULL );
}
}
m_nDPCount = 0;
SETPOLYCOUNT( 0 );
ResetPrevDeclarationTechnique();
}
switch(hr)
{
case D3D_OK :
m_bOcclusionCullingCheck = true;
break;
case D3DERR_DRIVERINTERNALERROR :
case D3DERR_INVALIDCALL :
{
//처리 불가...
m_bOcclusionCullingCheck = false;
}
break;
case D3DERR_DEVICELOST :
{
//resetDevice();
//resetDevice(false, true);
resetDevice(false);
reloadDevice();
m_bOcclusionCullingCheck = false;
}
break;
}
return hr;
}
void K3DRenderDeviceDX::SetMipBias( float fBias )
{
if ( m_fMipBias != fBias )
{
K3DRenderDevice::SetMipBias( fBias );
//initializeRenderState();
m_d3ddev->SetSamplerState(0, D3DSAMP_MIPMAPLODBIAS, *(DWORD *)&fBias);
m_d3ddev->SetSamplerState(1, D3DSAMP_MIPMAPLODBIAS, *(DWORD *)&fBias);
m_d3ddev->SetSamplerState(2, D3DSAMP_MIPMAPLODBIAS, *(DWORD *)&fBias);
m_d3ddev->SetSamplerState(3, D3DSAMP_MIPMAPLODBIAS, *(DWORD *)&fBias);
m_d3ddev->SetSamplerState(4, D3DSAMP_MIPMAPLODBIAS, *(DWORD *)&fBias);
m_d3ddev->SetSamplerState(5, D3DSAMP_MIPMAPLODBIAS, *(DWORD *)&fBias);
m_d3ddev->SetSamplerState(6, D3DSAMP_MIPMAPLODBIAS, *(DWORD *)&fBias);
m_d3ddev->SetSamplerState(7, D3DSAMP_MIPMAPLODBIAS, *(DWORD *)&fBias);
//m_d3ddev->SetSamplerState(0, D3DSAMP_MAXMIPLEVEL, (DWORD) fBias);
//m_d3ddev->SetSamplerState(1, D3DSAMP_MAXMIPLEVEL, (DWORD) fBias);
//m_d3ddev->SetSamplerState(2, D3DSAMP_MAXMIPLEVEL, (DWORD) fBias);
//m_d3ddev->SetSamplerState(3, D3DSAMP_MAXMIPLEVEL, (DWORD) fBias);
//m_d3ddev->SetSamplerState(4, D3DSAMP_MAXMIPLEVEL, (DWORD) fBias);
//m_d3ddev->SetSamplerState(5, D3DSAMP_MAXMIPLEVEL, (DWORD) fBias);
//m_d3ddev->SetSamplerState(6, D3DSAMP_MAXMIPLEVEL, (DWORD) fBias);
//m_d3ddev->SetSamplerState(7, D3DSAMP_MAXMIPLEVEL, (DWORD) fBias);
m_fMipBias = fBias;
}
}
void K3DRenderDeviceDX::SetAlpharef( DWORD dwAlpharef )
{
//if ( m_dwAlpharef != dwAlpharef ) 버그의 온상
{
K3DRenderDevice::SetAlpharef( dwAlpharef );
m_d3ddev->SetRenderState( D3DRS_ALPHAREF, dwAlpharef );
}
}
// 주의 : 이걸 편집하면 모든 스테이트 블럭에 영향을 미칠 수 있다.
void K3DRenderDeviceDX::setToDefaultRenderState()
{
// light enable
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
// alpha blend
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
m_d3ddev->SetRenderState( D3DRS_ZENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_STENCILENABLE, FALSE );
// alpha test
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_ALPHAREF, 0 );
m_d3ddev->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATER );
// vertex material source
m_d3ddev->SetRenderState( D3DRS_COLORVERTEX, FALSE );
m_d3ddev->SetRenderState( D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1 );
m_d3ddev->SetRenderState( D3DRS_SPECULARMATERIALSOURCE, D3DMCS_COLOR2 );
m_d3ddev->SetRenderState( D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_MATERIAL );
m_d3ddev->SetRenderState( D3DRS_EMISSIVEMATERIALSOURCE, D3DMCS_MATERIAL );
// set to default
for(int i = 0; i < 8 ; ++i)
{
m_d3ddev->SetTextureStageState( i, D3DTSS_COLOROP, D3DTOP_DISABLE );
m_d3ddev->SetTextureStageState( i, D3DTSS_RESULTARG, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( i, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
m_d3ddev->SetSamplerState( i, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP );
m_d3ddev->SetSamplerState( i, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP );
m_d3ddev->SetSamplerState( i, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( i, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( i, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR );
}
// texture state
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 0, D3DTSS_RESULTARG, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_CURRENT );
m_d3ddev->SetRenderState(D3DRS_WRAP1, 0); //speed tree
//m_d3ddev->SetSamplerState( 0, D3DSAMP_MIPMAPLODBIAS, *(DWORD*)&m_fMipBias );5
}
void K3DRenderDeviceDX::initializeRenderState()
{
DWORD nOnePass;
SetFVF( D3DFVF_XYZ | D3DFVF_TEX1 );
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
}
m_d3ddev->EndStateBlock( &m_hRS[K3DRenderDevice::RS_DEFAULT] );
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_DOTPRODUCT3 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE );
//m_d3ddev->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 0 );
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLORARG1, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_MODULATE );
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 2, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE );
//m_d3ddev->SetTextureStageState( 2, D3DTSS_TEXCOORDINDEX, 0 );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
}
m_d3ddev->EndStateBlock( &m_hRS[K3DRenderDevice::RS_DEFAULT_NORMAL] );
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE );
//m_d3ddev->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATEALPHA_ADDCOLOR );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE );
//m_d3ddev->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 | D3DTSS_TCI_SPHEREMAP );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAARG2, D3DTA_TEXTURE );
}
m_d3ddev->EndStateBlock( &m_hRS[K3DRenderDevice::RS_DEFAULT_SPECULAR] );
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_DOTPRODUCT3 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE );
//m_d3ddev->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 0 );
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLORARG1, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_MODULATE );
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 2, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE );
//m_d3ddev->SetTextureStageState( 2, D3DTSS_TEXCOORDINDEX, 0 );
m_d3ddev->SetTextureStageState( 3, D3DTSS_COLORARG1, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 3, D3DTSS_COLOROP, D3DTOP_MODULATEALPHA_ADDCOLOR );
m_d3ddev->SetTextureStageState( 3, D3DTSS_COLORARG2, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 3, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE );
//m_d3ddev->SetTextureStageState( 3, D3DTSS_TEXCOORDINDEX, 1 | D3DTSS_TCI_SPHEREMAP );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 2, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 2, D3DTSS_ALPHAARG1, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 2, D3DTSS_ALPHAARG2, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 3, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 3, D3DTSS_ALPHAARG1, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 3, D3DTSS_ALPHAARG2, D3DTA_TEXTURE );
}
m_d3ddev->EndStateBlock( &m_hRS[K3DRenderDevice::RS_DEFAULT_NORMAL_SPECULAR] );
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
//m_d3ddev->SetRenderState( D3DRS_COLORVERTEX, TRUE );
//m_d3ddev->SetRenderState( D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_COLOR1 );
//m_d3ddev->SetRenderState( D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_DISABLE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_NOLIGHT_VTXCOLOR]);
m_d3ddev->ValidateDevice( &nOnePass );
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
//알파 테스트를 약간 변경
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
m_d3ddev->SetRenderState( D3DRS_ZWRITEENABLE, false );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
}
m_d3ddev->EndStateBlock( &m_hRS[ K3DRenderDevice::RS_BILLBOARD ]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_POINT );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_SPRITE]);
#ifdef _KUI_INVALIDATION
// { [sonador]
m_d3ddev->ValidateDevice( &nOnePass );
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
m_d3ddev->SetRenderState( D3DRS_SEPARATEALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLENDALPHA, D3DBLEND_ONE );
m_d3ddev->SetRenderState( D3DRS_DESTBLENDALPHA, D3DBLEND_ONE );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_POINT );
}
m_d3ddev->EndStateBlock( &m_hRS[ K3DRenderDevice::RS_SPRITE_RENDERTARGET ] );
// }
#endif
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
m_d3ddev->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP );
m_d3ddev->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_TEXT_LAYER]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_TRANSPARENT_MESH]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAARG2, D3DTA_TEXTURE );
}
m_d3ddev->EndStateBlock( &m_hRS[ K3DRenderDevice::RS_TRANSPARENT_MESH_NOALPHAUVANI ] );
m_d3ddev->ValidateDevice( &nOnePass );
m_d3ddev->BeginStateBlock();
{
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
}
m_d3ddev->EndStateBlock( &m_hRS[ K3DRenderDevice::RS_TRANSPARENT_MESH_NOCOLORUVANI ] );
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_ALPHAREF, 255 );
m_d3ddev->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_EQUAL );
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
}
m_d3ddev->EndStateBlock( &m_hRS[ K3DRenderDevice::RS_ALPHABLEND_1STPASS ] );
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_ALPHAREF, 255 );
m_d3ddev->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_LESS );
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
}
m_d3ddev->EndStateBlock( &m_hRS[ K3DRenderDevice::RS_ALPHABLEND_2NDPASS ] );
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_MODULATE2X]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2 );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAARG2, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_MODULATE );
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLORARG2, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 2, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2 );
m_d3ddev->SetTextureStageState( 2, D3DTSS_ALPHAARG2, D3DTA_CURRENT );
m_d3ddev->SetSamplerState( 1, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP );
m_d3ddev->SetSamplerState( 1, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP );
m_d3ddev->SetSamplerState( 2, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP );
m_d3ddev->SetSamplerState( 2, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP );
//m_d3ddev->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
//m_d3ddev->SetTextureStageState( 2, D3DTSS_COLORARG1, D3DTA_SPECULAR );
//m_d3ddev->SetTextureStageState( 2, D3DTSS_COLORARG2, D3DTA_CURRENT );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_OBJECTSHADOW_SPECULAR2X]);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
for(int i = 0; i < 4; ++i)
m_d3ddev->SetTextureStageState( i, D3DTSS_TEXCOORDINDEX,i );
// 0: lightmap
// arg0 + arg1 * arg2
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MULTIPLYADD);
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG0, D3DTA_TFACTOR );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2);
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
m_d3ddev->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
m_d3ddev->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP );
// 1: diffuse
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAARG2, D3DTA_CURRENT );
m_d3ddev->SetSamplerState( 1, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
m_d3ddev->SetSamplerState( 1, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP );
// 2,3: shadow map
for(int i = 2; i < 4; ++i)
{
m_d3ddev->SetTextureStageState( i, D3DTSS_COLOROP, D3DTOP_MODULATE);
m_d3ddev->SetTextureStageState( i, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( i, D3DTSS_COLORARG2, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( i, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2 );
m_d3ddev->SetTextureStageState( i, D3DTSS_ALPHAARG2, D3DTA_CURRENT );
m_d3ddev->SetSamplerState( i, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP );
m_d3ddev->SetSamplerState( i, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP );
}
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_OBJECTSHADOW_LIGHTMAP]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_ADDITIVE_MESH]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAARG2, D3DTA_TEXTURE );
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
}
m_d3ddev->EndStateBlock( &m_hRS[ K3DRenderDevice::RS_ADDITIVE_MESH_NOALPHAUVANI ] );
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
}
m_d3ddev->EndStateBlock( &m_hRS[ K3DRenderDevice::RS_ADDITIVE_MESH_NOCOLORUVANI ] );
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_ADDITIVE_MESH_WITHOUT_DEFAULT]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
m_d3ddev->SetRenderState( D3DRS_COLORVERTEX, TRUE );
m_d3ddev->SetRenderState( D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1 );
m_d3ddev->SetRenderState( D3DRS_SPECULARMATERIALSOURCE, D3DMCS_COLOR1 );
m_d3ddev->SetRenderState( D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_COLOR1 );
m_d3ddev->SetRenderState( D3DRS_EMISSIVEMATERIALSOURCE, D3DMCS_COLOR1 );
m_d3ddev->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP );
m_d3ddev->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_ADDITIVE_PARTICLE]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
// texture state
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_TERRAIN_LIGHTMAP_ADDITIVE]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ZERO );
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_ADD );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2 );
//m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_CURRENT );
m_d3ddev->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP );
m_d3ddev->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_TERRAIN_LIGHTMAP_MODULATE]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE);
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_VOLUME_FOG]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 );
//m_d3ddev->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_TERRAIN_SINGLETILE]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 2, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 2, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 2, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_LERP );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG0, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_BLENDDIFFUSEALPHA );
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLORARG2, D3DTA_CURRENT );
/*m_d3ddev->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_LERP );
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLORARG2, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLORARG0, D3DTA_DIFFUSE | D3DTA_ALPHAREPLICATE );*/
m_d3ddev->SetTextureStageState( 3, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
m_d3ddev->SetTextureStageState( 3, D3DTSS_COLORARG1, D3DTA_SPECULAR );
m_d3ddev->SetTextureStageState( 3, D3DTSS_COLORARG2, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_TERRAIN_3TILE_LERP]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 2, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 2, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 3, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 3, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 4, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 4, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 2, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 3, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 4, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR );
// mod texture
m_d3ddev->SetTextureStageState( 0, D3DTSS_RESULTARG, D3DTA_TEMP );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
// base texture
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
//m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
//m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
// deco1 texture
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_LERP );
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLORARG0, D3DTA_TEMP );
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLORARG2, D3DTA_CURRENT );
//m_d3ddev->SetTextureStageState( 2, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2 );
//m_d3ddev->SetTextureStageState( 2, D3DTSS_COLORARG2, D3DTA_CURRENT );
// deco2 texture
m_d3ddev->SetTextureStageState( 3, D3DTSS_COLOROP, D3DTOP_LERP );
m_d3ddev->SetTextureStageState( 3, D3DTSS_COLORARG0, D3DTA_TEMP | D3DTA_ALPHAREPLICATE );
m_d3ddev->SetTextureStageState( 3, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 3, D3DTSS_COLORARG2, D3DTA_CURRENT );
//m_d3ddev->SetTextureStageState( 3, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2 );
//m_d3ddev->SetTextureStageState( 3, D3DTSS_COLORARG2, D3DTA_CURRENT );
// vertex color
m_d3ddev->SetTextureStageState( 4, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
m_d3ddev->SetTextureStageState( 4, D3DTSS_COLORARG1, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 4, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 4, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2 );
m_d3ddev->SetTextureStageState( 4, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
//// terrain specular
//m_d3ddev->SetTextureStageState( 4, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
//m_d3ddev->SetTextureStageState( 4, D3DTSS_COLORARG1, D3DTA_SPECULAR );
//m_d3ddev->SetTextureStageState( 4, D3DTSS_COLORARG2, D3DTA_CURRENT );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_TERRAIN_3TILE_WITH_SHADOW]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 2, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 2, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 3, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 3, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 4, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 4, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 2, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 3, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 4, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR );
// mod texture
m_d3ddev->SetTextureStageState( 0, D3DTSS_RESULTARG, D3DTA_TEMP );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
// base texture
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
// deco1 texture
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_LERP );
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLORARG0, D3DTA_TEMP );
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLORARG2, D3DTA_CURRENT );
// deco2 texture
m_d3ddev->SetTextureStageState( 3, D3DTSS_COLOROP, D3DTOP_LERP );
m_d3ddev->SetTextureStageState( 3, D3DTSS_COLORARG0, D3DTA_TEMP | D3DTA_ALPHAREPLICATE );
m_d3ddev->SetTextureStageState( 3, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 3, D3DTSS_COLORARG2, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 3, D3DTSS_RESULTARG, D3DTA_TEMP );
//// lightmap
m_d3ddev->SetSamplerState( 4, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP );
m_d3ddev->SetSamplerState( 4, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
//// arg0 + arg1 * arg2
m_d3ddev->SetTextureStageState( 4, D3DTSS_COLOROP, D3DTOP_MULTIPLYADD);
m_d3ddev->SetTextureStageState( 4, D3DTSS_COLORARG1, D3DTA_TEXTURE);
m_d3ddev->SetTextureStageState( 4, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 4, D3DTSS_COLORARG0, D3DTA_TFACTOR);
m_d3ddev->SetTextureStageState( 4, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 4, D3DTSS_ALPHAARG1, D3DTA_TEMP );
m_d3ddev->SetTextureStageState( 5, D3DTSS_COLOROP, D3DTOP_MODULATE2X);
m_d3ddev->SetTextureStageState( 5, D3DTSS_COLORARG1, D3DTA_TEMP );
m_d3ddev->SetTextureStageState( 5, D3DTSS_COLORARG2, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 5, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 5, D3DTSS_ALPHAARG1, D3DTA_TEMP );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_TERRAIN_3TILE_WITH_LIGHTMAP]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
//m_d3ddev->SetRenderState( D3DRS_LIGHTING, TRUE );
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE);
//m_d3ddev->SetRenderState( D3DRS_FOGENABLE, FALSE );
m_d3ddev->SetRenderState( D3DRS_FOGENABLE, TRUE );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR );
// mod texture
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
// deco1 texture
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE );
//m_d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_SELECTARG2);
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT);
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_TERRAIN_FOR_2SAMPLER_1STPASS]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
//m_d3ddev->SetRenderState( D3DRS_LIGHTING, TRUE );
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
//m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE);
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);
m_d3ddev->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD);
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE);
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE);
//m_d3ddev->SetRenderState( D3DRS_FOGENABLE, FALSE );
m_d3ddev->SetRenderState( D3DRS_FOGENABLE, TRUE );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR );
// mod texture
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE | D3DTA_COMPLEMENT );
//m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
// base texture
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE );
//m_d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
//m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT | D3DTA_COMPLEMENT );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_TERRAIN_FOR_2SAMPLER_2NDPASS]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
/* m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_ADD );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE | D3DTA_ALPHAREPLICATE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );*/
m_d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
m_d3ddev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
m_d3ddev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
m_d3ddev->SetRenderState(D3DRS_ALPHAREF, 0x00);
m_d3ddev->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER);
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAARG2, D3DTA_TEXTURE );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_LQWATER]);
m_d3ddev->ValidateDevice(&nOnePass);
//m_d3ddev->BeginStateBlock();
//{
// setToDefaultRenderState();
// //m_d3ddev->SetRenderState( D3DRS_LIGHTING, TRUE );
// m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
// m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
// //m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE);
// m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);
// //m_d3ddev->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_REVSUBTRACT);
// m_d3ddev->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD);
// //m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR);
// m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ZERO);
// //m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE);
// m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR);
// //m_d3ddev->SetRenderState( D3DRS_FOGENABLE, FALSE );
// m_d3ddev->SetRenderState( D3DRS_FOGENABLE, TRUE );
// m_d3ddev->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
// m_d3ddev->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
// m_d3ddev->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
// // mod texture
// m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
// m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE | D3DTA_ALPHAREPLICATE );
//}
//m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_TERRAIN_FOR_2SAMPLER_3RDPASS]);
//
//m_d3ddev->ValidateDevice(&nOnePass);
//m_d3ddev->BeginStateBlock();
//{
// setToDefaultRenderState();
// //m_d3ddev->SetRenderState( D3DRS_LIGHTING, TRUE );
// m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
// m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
// //m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE);
// m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);
// m_d3ddev->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD);
// m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE);
// m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE);
// //m_d3ddev->SetRenderState( D3DRS_FOGENABLE, FALSE );
// m_d3ddev->SetRenderState( D3DRS_FOGENABLE, TRUE );
// m_d3ddev->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
// m_d3ddev->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
// m_d3ddev->SetSamplerState( 1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
// m_d3ddev->SetSamplerState( 1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
// m_d3ddev->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
// m_d3ddev->SetSamplerState( 1, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR );
// // mod texture
// m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
// m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE | D3DTA_ALPHAREPLICATE );
//
// // deco2 texture
// m_d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE );
// m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
// m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
//}
//m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_TERRAIN_FOR_2SAMPLER_4THPASS]);
//m_d3ddev->ValidateDevice(&nOnePass);
//m_d3ddev->BeginStateBlock();
//{
// setToDefaultRenderState();
// //m_d3ddev->SetRenderState( D3DRS_LIGHTING, TRUE );
// m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
// m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
// //m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE);
// m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);
// m_d3ddev->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD);
// m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE);
// m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE);
// m_d3ddev->SetRenderState( D3DRS_FOGENABLE, TRUE );
//}
//m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_TERRAIN_FOR_2SAMPLER_5THPASS]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
//m_d3ddev->SetRenderState( D3DRS_LIGHTING, TRUE );
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
//m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE);
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);
m_d3ddev->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD);
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE);
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
//m_d3ddev->SetRenderState( D3DRS_FOGENABLE, FALSE );
m_d3ddev->SetRenderState( D3DRS_FOGENABLE, TRUE );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR );
// mod texture
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE | D3DTA_ALPHAREPLICATE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
// deco2 texture
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2 );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAARG2, D3DTA_CURRENT );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_TERRAIN_FOR_2SAMPLER_3RDPASS]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
//m_d3ddev->SetRenderState( D3DRS_LIGHTING, TRUE );
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
//m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE);
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);
m_d3ddev->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD);
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE);
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE);
m_d3ddev->SetRenderState( D3DRS_FOGENABLE, TRUE );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_TERRAIN_FOR_2SAMPLER_4THPASS]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_POINT );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_TERRAIN_ATTRIBUTE]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_BUMPENVMAP );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
//m_d3ddev->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
//m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_BUMPENVMAPLUMINANCE );
//m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
//m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT );
////////// Set up texture stage 1's states for the environment map
//m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
//m_d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
// m_d3ddev->SetTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT3|D3DTTFF_PROJECTED );
// m_d3ddev->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION | 1 );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_WATER]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
//setToDefaultRenderState();
// alpha test
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
m_d3ddev->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP );
m_d3ddev->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT3|D3DTTFF_PROJECTED );
//m_d3ddev->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_UVWRAP]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_LENSFLARE]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
#ifdef CLOUD_LUA
m_d3ddev->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
#endif
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ZENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP , D3DTOP_MODULATE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP , D3DTOP_MODULATE );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_CLOUD]);
// { [sonador][2007.03.23] RS_WEATHER
m_d3ddev->ValidateDevice( &nOnePass );
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ZWRITEENABLE, FALSE );
m_d3ddev->SetRenderState( D3DRS_COLORVERTEX, TRUE );
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATER );
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP , D3DTOP_MODULATE );
}
m_d3ddev->EndStateBlock( &m_hRS[ K3DRenderDevice::RS_WEATHER ] );
// } [sonador][2007.03.23] RS_WEATHER
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE);
m_d3ddev->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE );
// TEXTUREFACTOR 를 색상으로 사용해서 단색 렌더링을 할것임.
m_d3ddev->SetRenderState( D3DRS_TEXTUREFACTOR, D3DCOLOR_ARGB(255,0,0,0) );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP , D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TFACTOR );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP , D3DTOP_SELECTARG1);
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_SHADOW_PROJECTION]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ZERO );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP , D3DTOP_SELECTARG1 );
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP , D3DTOP_MODULATE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP , D3DTOP_DISABLE );
m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAOP , D3DTOP_DISABLE );
m_d3ddev->SetTextureStageState( 2, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
m_d3ddev->SetTextureStageState( 3, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
m_d3ddev->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_DISABLE );
m_d3ddev->SetTextureStageState( 3, D3DTSS_COLOROP, D3DTOP_DISABLE );
m_d3ddev->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP );
m_d3ddev->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP );
m_d3ddev->SetSamplerState( 0, D3DSAMP_ADDRESSW, D3DTADDRESS_CLAMP );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_SHADOW_MESH]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
m_d3ddev->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
m_d3ddev->SetSamplerState( 2, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
m_d3ddev->SetSamplerState( 3, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
/*m_d3ddev->SetSamplerState( 0, D3DSAMP_MIPMAPLODBIAS, 0 );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MIPMAPLODBIAS, 0 );
m_d3ddev->SetSamplerState( 2, D3DSAMP_MIPMAPLODBIAS, 0 );
m_d3ddev->SetSamplerState( 3, D3DSAMP_MIPMAPLODBIAS, 0 );*/
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_NO_MIPMAP]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
// setup general graphics states
//m_d3ddev->SetRenderState(D3DRS_LIGHTING, TRUE);
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
m_d3ddev->SetRenderState(D3DRS_COLORVERTEX, FALSE);
m_d3ddev->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
m_d3ddev->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER);
m_d3ddev->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE );
m_d3ddev->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
m_d3ddev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
m_d3ddev->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
#ifdef WRAPPER_RENDER_SELF_SHADOWS
m_d3ddev->SetRenderState(D3DRS_WRAP1, D3DWRAP_U | D3DWRAP_V);
m_d3ddev->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE);
m_d3ddev->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT);
m_d3ddev->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_TEXTURE);
m_d3ddev->SetSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
m_d3ddev->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
m_d3ddev->SetSamplerState(1, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
#endif
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_SPEED_TREE]);
m_d3ddev->ValidateDevice(&nOnePass);
// Non-alphablending shading mode for trees
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
// setup general graphics states
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
m_d3ddev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
m_d3ddev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO);
m_d3ddev->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
m_d3ddev->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER);
m_d3ddev->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
m_d3ddev->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
m_d3ddev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
m_d3ddev->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
//#ifdef WRAPPER_RENDER_SELF_SHADOWS
// m_d3ddev->SetRenderState(D3DRS_WRAP1, D3DWRAP_U | D3DWRAP_V);
// m_d3ddev->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE);
// m_d3ddev->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT);
// m_d3ddev->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_TEXTURE);
// m_d3ddev->SetSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
// m_d3ddev->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
// m_d3ddev->SetSamplerState(1, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
//#endif
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_SPEED_TREE_NONALPHABLEND]);
m_d3ddev->ValidateDevice(&nOnePass);
// Alphablending shading mode for trees
m_d3ddev->BeginStateBlock(); // SpeedTree render state with alpha blending
{
setToDefaultRenderState();
#ifndef _RAC
// setup general graphics states
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
//m_d3ddev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
//m_d3ddev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
#else
// setup general graphics states
m_d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
m_d3ddev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
m_d3ddev->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
m_d3ddev->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER);
m_d3ddev->SetRenderState( D3DRS_ZWRITEENABLE, FALSE ); // Do not write Zbuffer for transparent polygons
m_d3ddev->SetRenderState( D3DRS_FOGENABLE, TRUE ); // sonador #2.1.7.1 스피드 트리 퍼포먼스 증가
m_d3ddev->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_NONE );
#endif
m_d3ddev->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
m_d3ddev->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER);
m_d3ddev->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
m_d3ddev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
m_d3ddev->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_SPEED_TREE_ALPHABLEND]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
// setup rendering states
m_d3ddev->SetRenderState(D3DRS_ALPHAREF, 84);
m_d3ddev->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
m_d3ddev->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER);
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
m_d3ddev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
// clamp textures
m_d3ddev->SetRenderState(D3DRS_WRAP0, 0);
m_d3ddev->SetRenderState(D3DRS_WRAP1, 0);
m_d3ddev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
m_d3ddev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
m_d3ddev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT); // added by blackfish
m_d3ddev->SetRenderState(D3DRS_COLORVERTEX, TRUE);
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_SPEED_GRASS]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
// setup general graphics states
m_d3ddev->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_DISABLE_UVTRANSFORM]);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
// etc. render state
m_d3ddev->SetRenderState(D3DRS_DITHERENABLE , false);
m_d3ddev->SetRenderState(D3DRS_ZENABLE , false);
m_d3ddev->SetRenderState(D3DRS_FOGENABLE , FALSE);
m_d3ddev->SetRenderState(D3DRS_ALPHATESTENABLE, true);
m_d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
m_d3ddev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
m_d3ddev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
// m_d3ddev->SetRenderState(D3DRS_TEXTUREFACTOR, 0x78787878);
m_d3ddev->SetTextureStageState(0, D3DTSS_RESULTARG, D3DTA_CURRENT);
m_d3ddev->SetTextureStageState(0, D3DTSS_COLOROP , D3DTOP_SELECTARG2);
m_d3ddev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TFACTOR);
m_d3ddev->SetTextureStageState(0, D3DTSS_ALPHAOP , D3DTOP_MODULATE);
m_d3ddev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
m_d3ddev->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
m_d3ddev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
m_d3ddev->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
m_d3ddev->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
//float mipbias = 0.f;
//m_d3ddev->SetSamplerState(0, D3DSAMP_MIPMAPLODBIAS, *((DWORD*)&mipbias));
//m_d3ddev->SetRenderState(D3DRS_LASTPIXEL, FALSE);
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_SHADOW_MAP]);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR);
m_d3ddev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO);
m_d3ddev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
m_d3ddev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
m_d3ddev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
m_d3ddev->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_JITTER]);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
// diffuse texture를 지닌 material 세팅
m_d3ddev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
m_d3ddev->SetTextureStageState(0, D3DTSS_RESULTARG, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState(0, D3DTSS_ALPHAOP , D3DTOP_MODULATE);
m_d3ddev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
// specular level을 곱한다.
m_d3ddev->SetTextureStageState(1, D3DTSS_RESULTARG, D3DTA_TEMP );
m_d3ddev->SetTextureStageState(1, D3DTSS_COLOROP , D3DTOP_MODULATE);
m_d3ddev->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_SPECULAR );
m_d3ddev->SetTextureStageState(1, D3DTSS_ALPHAOP , D3DTOP_DISABLE );
// specular의 texture 맵을 더한다.
m_d3ddev->SetTextureStageState(2, D3DTSS_RESULTARG, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState(2, D3DTSS_COLOROP , D3DTOP_MULTIPLYADD);
m_d3ddev->SetTextureStageState(2, D3DTSS_COLORARG0, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState(2, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState(2, D3DTSS_COLORARG2, D3DTA_TEMP );
m_d3ddev->SetTextureStageState(2, D3DTSS_ALPHAOP , D3DTOP_SELECTARG2 );
m_d3ddev->SetTextureStageState(2, D3DTSS_ALPHAARG2, D3DTA_CURRENT );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_MESH_SPECULAR]);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
m_d3ddev->SetRenderState( D3DRS_ZENABLE, FALSE );
m_d3ddev->SetRenderState( D3DRS_DITHERENABLE, FALSE );
}
m_d3ddev->EndStateBlock( &m_hRS[ K3DRenderDevice::RS_HDR ] ); // HDR Blur
if (S_OK == m_d3ddev->BeginStateBlock())
{
setToDefaultRenderState();
m_d3ddev->SetRenderState(D3DRS_LIGHTING, false);
m_d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
m_d3ddev->SetRenderState(D3DRS_ALPHATESTENABLE, true);
m_d3ddev->SetRenderState(D3DRS_FOGENABLE, FALSE);
m_d3ddev->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
m_d3ddev->SetRenderState(D3DRS_ZWRITEENABLE, false);
m_d3ddev->SetRenderState(D3DRS_ZENABLE, false);
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_NO_TEX]);
}
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_SELECT_OUTLINE_MESH]);
//m_d3ddev->BeginStateBlock();
//{
// setToDefaultRenderState();
// m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
// m_d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
// m_d3ddev->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
// m_d3ddev->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_MAX);
// m_d3ddev->SetRenderState(D3DRS_SRCBLEND , D3DBLEND_ONE );
// m_d3ddev->SetRenderState(D3DRS_DESTBLEND , D3DBLEND_ONE );
// m_d3ddev->SetRenderState(D3DRS_ZENABLE , FALSE );
// m_d3ddev->SetRenderState(D3DRS_DITHERENABLE , FALSE );
// m_d3ddev->SetTextureStageState(0, D3DTSS_RESULTARG, D3DTA_CURRENT );
// m_d3ddev->SetTextureStageState(0, D3DTSS_COLOROP , D3DTOP_SELECTARG1);
// m_d3ddev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
// m_d3ddev->SetTextureStageState(0, D3DTSS_ALPHAOP , D3DTOP_DISABLE );
// m_d3ddev->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
// m_d3ddev->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
// m_d3ddev->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
//}
//m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_HDR_BLUR01_1]); //HDR Blur one pass
//
//m_d3ddev->BeginStateBlock();
//{
// setToDefaultRenderState();
// m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
// m_d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
// m_d3ddev->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
// m_d3ddev->SetRenderState(D3DRS_BLENDOP , D3DBLENDOP_ADD);
// m_d3ddev->SetRenderState(D3DRS_SRCBLEND , D3DBLEND_ONE);
// m_d3ddev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
// m_d3ddev->SetTextureStageState(0, D3DTSS_COLOROP , D3DTOP_SELECTARG1);
// m_d3ddev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE );
//}
//m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_HDR_BLUR01_2]); //HDR Blur two pass
//m_d3ddev->BeginStateBlock();
//{
// setToDefaultRenderState();
// m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
// m_d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
// m_d3ddev->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
// m_d3ddev->SetRenderState(D3DRS_BLENDOP , D3DBLENDOP_ADD);
// m_d3ddev->SetRenderState(D3DRS_SRCBLEND , D3DBLEND_DESTCOLOR);
// m_d3ddev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO);
// m_d3ddev->SetTextureStageState(0, D3DTSS_COLOROP , D3DTOP_SELECTARG2);
// m_d3ddev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TFACTOR );
// m_d3ddev->SetTextureStageState(0, D3DTSS_ALPHAOP , D3DTOP_DISABLE );
// m_d3ddev->SetTextureStageState(1, D3DTSS_COLOROP , D3DTOP_DISABLE );
// m_d3ddev->SetTextureStageState(1, D3DTSS_ALPHAOP , D3DTOP_DISABLE );
// m_d3ddev->SetTextureStageState(2, D3DTSS_COLOROP , D3DTOP_DISABLE );
// m_d3ddev->SetTextureStageState(2, D3DTSS_ALPHAOP , D3DTOP_DISABLE );
// m_d3ddev->SetTextureStageState(3, D3DTSS_COLOROP , D3DTOP_DISABLE );
// m_d3ddev->SetTextureStageState(3, D3DTSS_ALPHAOP , D3DTOP_DISABLE );
//}
//m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_HDR_BLUR02]); //HDR Blur one pass
//m_d3ddev->BeginStateBlock();
//{
// setToDefaultRenderState();
// m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
// m_d3ddev->SetRenderState(D3DRS_ZENABLE , FALSE );
// m_d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
// m_d3ddev->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
// m_d3ddev->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
// m_d3ddev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
// m_d3ddev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
// m_d3ddev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
// m_d3ddev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
// m_d3ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
// m_d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
// m_d3ddev->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
// m_d3ddev->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_DISABLE );
// m_d3ddev->SetTextureStageState( 2, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
// m_d3ddev->SetTextureStageState( 3, D3DTSS_COLOROP, D3DTOP_DISABLE );
// m_d3ddev->SetTextureStageState( 3, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
// m_d3ddev->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
// m_d3ddev->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
// m_d3ddev->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
//}
//m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_HDR_END]); //HDR Blur End
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
m_d3ddev->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP );
m_d3ddev->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP );
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
m_d3ddev->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0 );
m_d3ddev->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, 0 );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_SELECT_EFFECT]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_LOWSHADOW]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_LOWSHADOW]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
m_d3ddev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
m_d3ddev->SetTextureStageState(0, D3DTSS_RESULTARG, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState(0, D3DTSS_ALPHAOP , D3DTOP_MODULATE);
m_d3ddev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
m_d3ddev->SetSamplerState( 2, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
m_d3ddev->SetSamplerState( 3, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_ALPHATEX]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
setToDefaultRenderState();
m_d3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_d3ddev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
m_d3ddev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
m_d3ddev->SetTextureStageState(0, D3DTSS_RESULTARG, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState(0, D3DTSS_ALPHAOP , D3DTOP_MODULATE);
m_d3ddev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
m_d3ddev->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE );
m_d3ddev->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
m_d3ddev->SetSamplerState( 1, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
m_d3ddev->SetSamplerState( 2, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
m_d3ddev->SetSamplerState( 3, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_ALPHATEX_ADD]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
//MTE
m_d3ddev->SetTextureStageState(3, D3DTSS_RESULTARG, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState(3, D3DTSS_COLOROP , D3DTOP_MODULATE4X );
m_d3ddev->SetTextureStageState(3, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState(3, D3DTSS_COLORARG2, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState(3, D3DTSS_ALPHAOP , D3DTOP_DISABLE );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_MTE]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
//MTE
m_d3ddev->SetTextureStageState(1, D3DTSS_RESULTARG, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState(1, D3DTSS_COLOROP , D3DTOP_MODULATE4X );
m_d3ddev->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_d3ddev->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT );
m_d3ddev->SetTextureStageState(1, D3DTSS_ALPHAOP , D3DTOP_DISABLE );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_MTE_S1]);
m_d3ddev->ValidateDevice(&nOnePass);
m_d3ddev->BeginStateBlock();
{
//gmpbigsun( 20130404 ) : 알파 몬스터로 인해 제거댐.
//m_d3ddev->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
//m_d3ddev->SetRenderState( D3DRS_ALPHAREF, 0x88 );
//m_d3ddev->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATER );
m_d3ddev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
}
m_d3ddev->EndStateBlock(&m_hRS[K3DRenderDevice::RS_ALPHATEST]);
SetFillColor( KColor(0,0,0,0) );
SetBackBufferWriteEnable(BW_ALPHA | BW_RED | BW_GREEN | BW_BLUE);
//SetBackBufferWriteEnable( BW_RED | BW_GREEN | BW_BLUE );
SetDepthBufferWriteEnable(true);
SetDepthBufferCompareMode(DCM_LESSEQUAL);
m_d3ddev->SetRenderState(D3DRS_TEXTUREFACTOR, m_textureFactor.color);
m_d3ddev->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
m_d3ddev->SetRenderState(D3DRS_SPECULARENABLE, FALSE);
m_d3ddev->BeginScene();
//m_d3ddev->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE );
//m_d3ddev->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
m_d3ddev->SetTextureStageState(2, D3DTSS_COLOROP, D3DTOP_DISABLE );
m_d3ddev->SetTextureStageState(2, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
//m_d3ddev->SetTextureStageState(3, D3DTSS_COLOROP, D3DTOP_DISABLE );
//m_d3ddev->SetTextureStageState(3, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
//m_d3ddev->SetTextureStageState(4, D3DTSS_COLOROP, D3DTOP_DISABLE );
//m_d3ddev->SetTextureStageState(4, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
//m_d3ddev->SetTextureStageState(5, D3DTSS_COLOROP, D3DTOP_DISABLE );
//m_d3ddev->SetTextureStageState(5, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
//m_d3ddev->SetTextureStageState(6, D3DTSS_COLOROP, D3DTOP_DISABLE );
//m_d3ddev->SetTextureStageState(6, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
//m_d3ddev->SetTextureStageState(7, D3DTSS_COLOROP, D3DTOP_DISABLE );
//m_d3ddev->SetTextureStageState(7, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
// dither
m_d3ddev->SetRenderState( D3DRS_DITHERENABLE, TRUE );
m_d3ddev->EndScene();
}
void K3DRenderDeviceDX::SetBackBufferWriteEnable ( DWORD stat )
{
if ( m_backBufferWriteEnable == stat ) return;
m_backBufferWriteEnable = stat;
m_d3ddev->SetRenderState( D3DRS_COLORWRITEENABLE, stat );
}
void K3DRenderDeviceDX::SetDepthBufferWriteEnable ( bool enable )
{
if ( m_depthBufferWriteEnable == enable ) return;
m_depthBufferWriteEnable = enable;
m_d3ddev->SetRenderState( D3DRS_ZWRITEENABLE, enable );
}
void K3DRenderDeviceDX::SetDepthBufferCompareMode( int depthcmp )
{
if( m_depthCompareMode == depthcmp ) return;
m_depthCompareMode = depthcmp;
switch( depthcmp )
{
case DCM_NONE:
m_d3ddev->SetRenderState( D3DRS_ZFUNC, D3DCMP_NEVER );
break;
case DCM_LESS:
m_d3ddev->SetRenderState( D3DRS_ZFUNC, D3DCMP_LESS );
break;
case DCM_LESSEQUAL:
m_d3ddev->SetRenderState( D3DRS_ZFUNC, D3DCMP_LESSEQUAL );
break;
case DCM_EQUAL:
m_d3ddev->SetRenderState( D3DRS_ZFUNC, D3DCMP_EQUAL );
break;
case DCM_GREATEREQUAL:
m_d3ddev->SetRenderState( D3DRS_ZFUNC, D3DCMP_GREATEREQUAL );
break;
case DCM_GREATER:
m_d3ddev->SetRenderState( D3DRS_ZFUNC, D3DCMP_GREATER );
break;
case DCM_ALWAYS:
m_d3ddev->SetRenderState( D3DRS_ZFUNC, D3DCMP_ALWAYS );
break;
}
}
void K3DRenderDeviceDX::SetClipPlaneMode( DWORD state )
{
m_clipPlaneEnabled = state;
m_d3ddev->SetRenderState( D3DRS_CLIPPLANEENABLE, state );
}
void K3DRenderDeviceDX::SetClipPlane( DWORD n, const K3DPlane &plane )
{
m_clipPlane[n] = plane;
m_d3ddev->SetClipPlane( n, plane );
}
void K3DRenderDeviceDX::SetFogColor(KColor fogcolor)
{
m_fogColor = fogcolor;
m_d3ddev->SetRenderState( D3DRS_FOGCOLOR, m_fogColor.color );
}
void K3DRenderDeviceDX::SetFogMode(DWORD fogmode, KColor fogcolor, float p1, float p2, float p3, float p4)
{
//if ( m_fogMode == fogmode &&
// m_fogColor.color == fogcolor.color &&
// m_fogFactor1 == p1 && m_fogFactor2 == p2 &&
// m_fogFactor3 == p3 && m_fogFactor4 == p4 )
//{
// return;
//}
m_fogMode = fogmode;
m_fogColor = fogcolor;
m_fogFactor1 = p1;
m_fogFactor2 = p2;
m_fogFactor3 = p3;
m_fogFactor4 = p4;
m_d3ddev->SetRenderState( D3DRS_FOGCOLOR, m_fogColor.color );
if(fogmode & FOGM_LINEAR) {
m_d3ddev->SetRenderState( D3DRS_FOGENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_NONE );
m_d3ddev->SetRenderState( D3DRS_FOGSTART, *((DWORD*)&m_fogFactor1) );
m_d3ddev->SetRenderState( D3DRS_FOGEND, *((DWORD*)&m_fogFactor2) );
SetVertexShaderConstant(CONSTANT_DISTANCEFOGSTART, &p1, 1);
SetVertexShaderConstant(CONSTANT_DISTANCEFOGEND, &p2, 1);
}
if(fogmode & FOGM_HEIGHT) {
m_d3ddev->SetRenderState( D3DRS_FOGENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_NONE );
SetVertexShaderConstant(CONSTANT_HEIGHTFOGSTART, &p3, 1);
SetVertexShaderConstant(CONSTANT_HEIGHTFOGEND, &p4, 1);
}
else
{
m_fogFactor3 = 100.f;
m_fogFactor4 = 1000000.f; // sonador 1.1.18 환경 효과 오류 수정
SetVertexShaderConstant(CONSTANT_HEIGHTFOGSTART, &m_fogFactor3, 1);
SetVertexShaderConstant(CONSTANT_HEIGHTFOGEND, &m_fogFactor4, 1);
}
if(fogmode == FOGM_NONE) {
m_d3ddev->SetRenderState( D3DRS_FOGENABLE, FALSE );
}
/*switch( fogmode )
{
case FOGM_NONE:
m_d3ddev->SetRenderState( D3DRS_FOGENABLE, FALSE );
m_d3ddev->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_NONE );
m_d3ddev->SetRenderState( D3DRS_FOGVERTEXMODE, D3DFOG_NONE );
//m_d3ddev->SetRenderState( D3DRS_RANGEFOGENABLE, FALSE );
break;
case FOGM_LINEAR:
m_d3ddev->SetRenderState( D3DRS_FOGENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_FOGCOLOR, m_fogColor.color );
//m_d3ddev->SetRenderState( D3DRS_FOGVERTEXMODE, D3DFOG_LINEAR );
m_d3ddev->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_NONE );
//m_d3ddev->SetRenderState( D3DRS_RANGEFOGENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_FOGSTART, *((DWORD*)&m_fogFactor1) );
m_d3ddev->SetRenderState( D3DRS_FOGEND, *((DWORD*)&m_fogFactor2) );
m_d3ddev->
break;
//case FOGM_EXP:
// m_d3ddev->SetRenderState( D3DRS_FOGENABLE, TRUE );
// m_d3ddev->SetRenderState( D3DRS_FOGCOLOR, m_fogColor.color );
// m_d3ddev->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_EXP );
// //m_d3ddev->SetRenderState( D3DRS_FOGVERTEXMODE, D3DFOG_NONE );
// //m_d3ddev->SetRenderState( D3DRS_RANGEFOGENABLE, TRUE );
// m_d3ddev->SetRenderState( D3DRS_FOGDENSITY, *((DWORD*)&m_fogFactor1) );
// break;
//case FOGM_EXP2:
// m_d3ddev->SetRenderState( D3DRS_FOGENABLE, TRUE );
// m_d3ddev->SetRenderState( D3DRS_FOGCOLOR, m_fogColor.color );
// m_d3ddev->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_EXP2 );
// //m_d3ddev->SetRenderState( D3DRS_FOGVERTEXMODE, D3DFOG_NONE );
// //m_d3ddev->SetRenderState( D3DRS_RANGEFOGENABLE, TRUE );
// m_d3ddev->SetRenderState( D3DRS_FOGDENSITY, *((DWORD*)&m_fogFactor1) );
// break;
case FOGM_HEIGHT: // VS 전용
m_d3ddev->SetRenderState( D3DRS_FOGENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_FOGCOLOR, m_fogColor.color );
//m_d3ddev->SetRenderState( D3DRS_FOGVERTEXMODE, D3DFOG_LINEAR );
m_d3ddev->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_NONE );
//m_d3ddev->SetRenderState( D3DRS_RANGEFOGENABLE, TRUE );
m_d3ddev->SetRenderState( D3DRS_FOGSTART, *((DWORD*)&m_fogFactor1) );
m_d3ddev->SetRenderState( D3DRS_FOGEND, *((DWORD*)&m_fogFactor2) );
break;
}*/
}
void K3DRenderDeviceDX::SetFillMode(DWORD mode)
{
//if ( m_fillmode == mode ) return;
//m_fillmode = mode;
switch( mode )
{
case FM_POINT:
m_d3ddev->SetRenderState( D3DRS_FILLMODE, D3DFILL_POINT );
break;
case FM_WIREFRAME:
m_d3ddev->SetRenderState( D3DRS_FILLMODE, D3DFILL_WIREFRAME );
break;
case FM_SOLID:
m_d3ddev->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
break;
}
}
void K3DRenderDeviceDX::SetCullMode( DWORD mode )
{
//if ( m_cullmode == mode ) return;
//m_cullmode = mode;
switch( mode )
{
case KCM_NONE:
m_d3ddev->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
break;
case KCM_CW:
m_d3ddev->SetRenderState( D3DRS_CULLMODE, D3DCULL_CW );
break;
case KCM_CCW:
m_d3ddev->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW );
break;
}
}
void K3DRenderDeviceDX::SetSceneAmbientLight( const KColor &color )
{
m_sceneambient = color;
m_d3ddev->SetRenderState( D3DRS_AMBIENT, color.color );
}
void K3DRenderDeviceDX::SetViewport( const KViewportStruct &vp )
{
HRESULT hr = m_d3ddev->SetViewport( vp );
m_viewport = vp;
assert( hr == S_OK );
}
void K3DRenderDeviceDX::SetBumpState( K3DMatrix * BumpMat )
{
//Bump Map
m_d3ddev->SetTextureStageState( 0, D3DTSS_BUMPENVMAT00, F2DW( BumpMat->_11 ) );
m_d3ddev->SetTextureStageState( 0, D3DTSS_BUMPENVMAT01, F2DW( BumpMat->_12 ) );
m_d3ddev->SetTextureStageState( 0, D3DTSS_BUMPENVMAT10, F2DW( BumpMat->_21 ) );
m_d3ddev->SetTextureStageState( 0, D3DTSS_BUMPENVMAT11, F2DW( BumpMat->_22 ) );
m_d3ddev->SetTextureStageState( 0, D3DTSS_BUMPENVLSCALE, F2DW(0.8f) );
m_d3ddev->SetTextureStageState( 0, D3DTSS_BUMPENVLOFFSET, F2DW(0.0f) );
static K3DMatrix mat;
mat._11 = 0.8f; mat._12 = 0.0f; mat._13 = 0.0f;
mat._21 = 0.0f; mat._22 = 0.8f; mat._23 = 0.0f;
mat._31 = 0.5f; mat._32 =-0.5f; mat._33 = 1.0f;
mat._41 = 0.0f; mat._42 = 0.0f; mat._43 = 0.0f;
SetTransform( TS_TEXTURE1, &mat );
}
void K3DRenderDeviceDX::SetTextureFactor( DWORD dwFactor )
{
m_d3ddev->SetRenderState( D3DRS_TEXTUREFACTOR, dwFactor );
}
void K3DRenderDeviceDX::SetTextureFactor( const K3DVector &vFactor )
{
K3DVector vec;
K3DVectorNormalize( vec, vFactor );
DWORD r = (DWORD)( 127.0f * -vec.x + 128.0f );
DWORD g = (DWORD)( 127.0f * -vec.y + 128.0f );
DWORD b = (DWORD)( 127.0f * -vec.z + 128.0f );
DWORD a = 0;
m_d3ddev->SetRenderState( D3DRS_TEXTUREFACTOR, ( (a<<24L) + (r<<16L) + (g<<8L) + (b<<0L) ) );
}
void K3DRenderDeviceDX::EndVertexShader()
{
for(int i = 0; i < MAX_VERTEXT_DECLARATION; ++i) {
SAFE_RELEASE( m_pVertexDeclaration[i] );
}
SAFE_RELEASE( m_pEffect );
}
void K3DRenderDeviceDX::InitVertexShader()
{
//Test 중... BERSERK
LPD3DXBUFFER pErrorMsgs;
HRESULT hr;
//SAFE_RELEASE( m_pV11_MeshSkin_Decl );
for(int i = 0; i < MAX_VERTEXT_DECLARATION; ++i) {
SAFE_RELEASE( m_pVertexDeclaration[i] );
}
D3DVERTEXELEMENT9 decl_skinmesh_bump[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION , 0 },//size=12
{ 0, 12, D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL , 0 },//size=12
{ 0, 24, D3DDECLTYPE_UBYTE4 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR , 0 },//size=4
{ 0, 28, D3DDECLTYPE_FLOAT2 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD , 0 },//size=8
{ 0, 36, D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TANGENT , 0 },//size=16
{ 0, 52, D3DDECLTYPE_UBYTE4 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDINDICES, 0 },//size=4
{ 0, 56, D3DDECLTYPE_FLOAT2 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDWEIGHT , 0 },//size=8
D3DDECL_END()
};
D3DVERTEXELEMENT9 decl_skinmesh[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION , 0 },//size=12
{ 0, 12, D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL , 0 },//size=12
{ 0, 24, D3DDECLTYPE_UBYTE4 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR , 0 },//size=4
{ 0, 28, D3DDECLTYPE_FLOAT2 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD , 0 },//size=8
{ 0, 36, D3DDECLTYPE_UBYTE4 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDINDICES, 0 },//size=4
{ 0, 40, D3DDECLTYPE_FLOAT2 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDWEIGHT , 0 },//size=8
D3DDECL_END()
};
D3DVERTEXELEMENT9 decl_terrain[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION , 0 },//size=12
{ 0, 12, D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL , 0 },//size=12
{ 0, 24, D3DDECLTYPE_UBYTE4 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR , 0 },//size=4
D3DDECL_END()
};
D3DVERTEXELEMENT9 decl_water[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION , 0 },//size=16
{ 0, 16, D3DDECLTYPE_UBYTE4 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR , 0 },//size=4
// { 0, 20, D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL , 0 },//size=12
{ 0, 20, D3DDECLTYPE_FLOAT2 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD , 0 },//size=8
{ 0, 28, D3DDECLTYPE_FLOAT2 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD , 1 },//size=8
D3DDECL_END()
};
// { [sonador]
D3DVERTEXELEMENT9 decl_cloud[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION , 0 },
{ 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL , 0 },
{ 0, 24, D3DDECLTYPE_UBYTE4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR , 0 },
{ 0, 28, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD , 0 },
/*{ 0, 36, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD , 1 }, */
D3DDECL_END()
};
D3DVERTEXELEMENT9 decl_weather[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION , 0 },
{ 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL , 0 },
{ 0, 24, D3DDECLTYPE_UBYTE4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR , 0 },
{ 0, 28, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD , 0 },
D3DDECL_END()
};
// }
#ifdef _DEBUG
D3DVERTEXELEMENT9 decl_env[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION , 0 },//size=12
{ 0, 12, D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL , 0 },//size=12
{ 0, 24, D3DDECLTYPE_UBYTE4 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR , 0 },//size=4
{ 0, 28, D3DDECLTYPE_FLOAT2 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD , 0 },//size=8
{ 0, 36, D3DDECLTYPE_FLOAT2 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD , 1 },//size=8
D3DDECL_END()
};
#endif
hr = m_d3ddev->CreateVertexDeclaration( decl_skinmesh_bump, &m_pVertexDeclaration[VTXDECLARATION_SKINMESH] );
hr = m_d3ddev->CreateVertexDeclaration( decl_skinmesh_bump, &m_pVertexDeclaration[VTXDECLARATION_OBJECTMESH] );
hr = m_d3ddev->CreateVertexDeclaration( decl_skinmesh_bump, &m_pVertexDeclaration[VTXDECLARATION_BUMPSKINMESH] );
hr = m_d3ddev->CreateVertexDeclaration( decl_terrain, &m_pVertexDeclaration[VTXDECLARATION_TERRAIN] );
hr = m_d3ddev->CreateVertexDeclaration( decl_water, &m_pVertexDeclaration[ VTXDECLARATION_WATER ] );
hr = m_d3ddev->CreateVertexDeclaration( decl_cloud, &m_pVertexDeclaration[ VTXDECLARATION_CLOUD ] );
hr = m_d3ddev->CreateVertexDeclaration( decl_weather, &m_pVertexDeclaration[ VTXDECLARATION_WEATHER ] );
#ifdef _DEBUG
hr = m_d3ddev->CreateVertexDeclaration( decl_env, &m_pVertexDeclaration[ VTXDECLARATION_ENVMAP ] );
#endif
// Alpha-tex
D3DVERTEXELEMENT9 decl_alphatex[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION , 0 },//size=12
{ 0, 12, D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL , 0 },//size=12
{ 0, 24, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR , 0 },//size=4
{ 0, 28, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR , 1 },//size=4
{ 0, 32, D3DDECLTYPE_FLOAT2 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD , 0 },//size=8
{ 0, 40, D3DDECLTYPE_FLOAT2 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD , 1 },//size=8
{ 0, 48, D3DDECLTYPE_UBYTE4 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDINDICES , 0 },//size=4
{ 0, 52, D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDWEIGHT , 0 },//size=12
D3DDECL_END()
};
hr = m_d3ddev->CreateVertexDeclaration( decl_alphatex, &m_pVertexDeclaration[ VTXDECLARATION_ALPHATEX ] );
// hr = m_d3ddev->CreateVertexDeclaration( DynamicVertex::vertexDeclaration, &m_pVertexDeclaration[ VTXDECLARATION_ALPHATEX ] );
// See KResourceDXDynamic.cpp for declaration
//const char * pstrFile[] =
//{
// "DefaultEffect.fx", //캐릭터
// "ObjectEffect.fx", //Object Mesh
// "SkyEffect.fx", //Sky
// "TerrainEffect.fx", //Terrain
// "SpecularEffect.fx",//Specular
// "BumpEffect.fx", //Bump
//}
//for( int i(0); 6>i; i++ )
//{
// std::string strFile = KResourceManager::GetTempFileName( pstrFile[i] );
// LPD3DXEFFECT tempEffect;
// if(FAILED(hr = D3DXCreateEffectFromFile( m_d3ddev, strFile.c_str(), NULL, NULL, 0, NULL, &tempEffect, &pErrorMsgs )))
// {
// if(pErrorMsgs)
// {
// char * pErrStr = (char*)pErrorMsgs->GetBufferPointer();
// OutputDebugString(pErrStr);
// OutputDebugString("\n");
// }
// for(int i = 0; i < MAX_VERTEXT_DECLARATION; ++i) {
// SAFE_RELEASE( m_pVertexDeclaration[i] );
// }
// return;
// }
// else
// {
// SAFE_RELEASE( m_pEffect );
// m_pEffect = tempEffect;
// //Effect Technique
// //unsigned int i;
// m_pEffect->GetDesc(&(m_pFXDesc));
// m_nTechNum = m_pFXDesc.Techniques;
// /*for(i = 0; i < m_nTechNum; ++i)
// {
// m_pTechHandles[i] = m_pEffect->GetTechnique(i);
// m_pEffect->GetTechniqueDesc(m_pTechHandles[i], m_TechDesc[i]);
// }*/
// m_pTechHandles[TECHNIQUE_SKINMESH] = m_pEffect->GetTechniqueByName("DefaultTech_2x");
// m_pTechHandles[TECHNIQUE_SKINMESH_SPECULAR] = m_pEffect->GetTechniqueByName("BumpTech_2x");
// m_pTechHandles[TECHNIQUE_SKINMESH_BUMP_SPECULAR] = m_pEffect->GetTechniqueByName("BumpTech_2x");
// m_pTechHandles[TECHNIQUE_OBJECTMESH] = m_pEffect->GetTechniqueByName("ObjectTech_2x");
// m_pTechHandles[TECHNIQUE_OBJECTMESH_NOLIGHT] = m_pEffect->GetTechniqueByName("ObjectNoLightTech_2x");
// m_pTechHandles[TECHNIQUE_TERRAIN] = m_pEffect->GetTechniqueByName("TerrainTech");
// m_pTechHandles[TECHNIQUE_TERRAINSHADOW] = m_pEffect->GetTechniqueByName("TerrainShadowTech");
// m_pTechHandles[TECHNIQUE_SKYBOX] = m_pEffect->GetTechniqueByName("SkyBox_Tech");
// m_pTechHandles[TECHNIQUE_CLOUDSPREAD] = m_pEffect->GetTechniqueByName("CloudSpread_Tech");
// m_pTechHandles[TECHNIQUE_GLOWSCREEN] = m_pEffect->GetTechniqueByName("GlowScreenTech");
// }
//}
/*
2012.07.06 클라이언트가 동시에 실행될 때, 파일 생성에 실패 할 수 가 있다.
DefaultEffect.fx가 팩킹되어 있기 때문에 임시 위치에 저장 시켰다가
D3DXCreateEffectFromFile에서 쓰이고 있는 것 같음.
파일로 불러오지 말고 메모리 상의 fx데이타를 불러오도록 하면 될 것 같다.
가끔 처음 접속해서 로비화면으로 갔을 때 이런경우에 캐릭터가 안보이는 경우가 발생하고 게임을 시작하면
뻑이 난다. - prodongi
*/
std::string strFile = KFileManager::Instance().CreateTemporaryFileFromResource( "DefaultEffect.fx" );
OutputDebugString(strFile.c_str());
OutputDebugString("\n");
assert( strFile.length() && "Effect FX File Not Found!!!" );
//========================================================
LPD3DXEFFECT tempEffect;
#ifdef D3DXSHADER_USE_LEGACY_D3DX9_31_DLL
DWORD dwFlag = D3DXSHADER_USE_LEGACY_D3DX9_31_DLL;
#else
DWORD dwFlag = 0;
#endif
#ifdef _SHADER_DEBUG_MODE
dwFlag |= D3DXSHADER_DEBUG;
#endif
if(FAILED(hr = D3DXCreateEffectFromFile( m_d3ddev, strFile.c_str(), NULL, NULL, dwFlag, NULL, &tempEffect, &pErrorMsgs )))
{
if(pErrorMsgs)
{
char * pErrStr = (char*)pErrorMsgs->GetBufferPointer();
OutputDebugString(pErrStr);
OutputDebugString("\n");
}
for(int i = 0; i < MAX_VERTEXT_DECLARATION; ++i) {
SAFE_RELEASE( m_pVertexDeclaration[i] );
}
assert( 0 );
return;
}
else
{
SAFE_RELEASE( m_pEffect );
m_pEffect = tempEffect;
m_pEffect->GetDesc(&(m_pFXDesc));
m_nTechNum = m_pFXDesc.Techniques;
m_pTechHandles[TECHNIQUE_SKINMESH] = m_pEffect->GetTechniqueByName("DefaultTech_2x");
m_pTechHandles[ TECHNIQUE_SKINMESH_NOUVANIIN2NDTEX ] = m_pEffect->GetTechniqueByName( "DefaultTechNoUvAni2nd_2x" );
m_pTechHandles[TECHNIQUE_SKINMESH_SPECULAR] = m_pEffect->GetTechniqueByName("SpecularTech_2x");
m_pTechHandles[TECHNIQUE_SKINMESH_BUMP_SPECULAR] = m_pEffect->GetTechniqueByName("BumpTech_2x");
m_pTechHandles[TECHNIQUE_SKINMESH_BUMP_SPECULAR_SELFSHADOW] = m_pEffect->GetTechniqueByName("BumpSSTech_2x");
m_pTechHandles[TECHNIQUE_OBJECTMESH] = m_pEffect->GetTechniqueByName("ObjectTech_2x");
m_pTechHandles[TECHNIQUE_OBJECTMESH_LIGHTMAP] = m_pEffect->GetTechniqueByName("ObjectTech_LightMap");
m_pTechHandles[TECHNIQUE_TERRAIN] = m_pEffect->GetTechniqueByName("TerrainTech");
m_pTechHandles[TECHNIQUE_TERRAIN_LIGHTMAP] = m_pEffect->GetTechniqueByName("TerrainLightmapTech" );
m_pTechHandles[TECHNIQUE_TERRAIN_1STPASS] = m_pEffect->GetTechniqueByName("TerrainTech_1stPass");
m_pTechHandles[TECHNIQUE_TERRAIN_2NDPASS] = m_pEffect->GetTechniqueByName("TerrainTech_2ndPass");
m_pTechHandles[TECHNIQUE_TERRAIN_3RDPASS] = m_pEffect->GetTechniqueByName("TerrainTech_3rdPass");
m_pTechHandles[TECHNIQUE_TERRAIN_4THPASS] = m_pEffect->GetTechniqueByName("TerrainTech_4thPass");
//m_pTechHandles[TECHNIQUE_TERRAIN_5THPASS] = m_pEffect->GetTechniqueByName("TerrainTech_5thPass");
m_pTechHandles[TECHNIQUE_TERRAINSHADOW] = m_pEffect->GetTechniqueByName("TerrainShadowTech");
m_pTechHandles[TECHNIQUE_SKYBOX] = m_pEffect->GetTechniqueByName("SkyBox_Tech");
m_pTechHandles[TECHNIQUE_CLOUDSPREAD] = m_pEffect->GetTechniqueByName("CloudSpread_Tech");
m_pTechHandles[TECHNIQUE_WEATHER] = m_pEffect->GetTechniqueByName("WeatherTech");
m_pTechHandles[TECHNIQUE_SHADOWBUFFER] = m_pEffect->GetTechniqueByName("ShadowBuffer_Tech");
//m_pTechHandles[TECHNIQUE_GLOWSCREEN] = m_pEffect->GetTechniqueByName("GlowScreen_Tech");
//m_pTechHandles[TECHNIQUE_GLOWWHITESCREEN] = m_pEffect->GetTechniqueByName("GlowWhiteScreen_Tech");
m_pTechHandles[ TECHNIQUE_BLURSCREEN ] = m_pEffect->GetTechniqueByName( "Blur_Tech" );
m_pTechHandles[ TECHNIQUE_TONEMAPPING ] = m_pEffect->GetTechniqueByName( "Tone_Tech" );
m_pTechHandles[TECHNIQUE_WATER_SPECULAR] = m_pEffect->GetTechniqueByName("WaterSpecular_Tech");
m_pTechHandles[ TECHNIQUE_HQWATER ] = m_pEffect->GetTechniqueByName( "HqWater_Tech" );
m_pTechHandles[ TECHNIQUE_ALPHATEX ] = m_pEffect->GetTechniqueByName( "AlphaTex_Tech" );
m_pTechHandles[ TECHNIQUE_ALPHATEX_EDGEENHANCE ] = m_pEffect->GetTechniqueByName( "AlphaTex_EdgeEnhance_Tech" );
m_pTechHandles[ TECHNIQUE_ALPHATEX_EDGEENHANCE_BLEND ] = m_pEffect->GetTechniqueByName( "AlphaTex_EdgeEnhance_Blend_Tech" );
m_pTechHandles[ TECHNIQUE_SELECT_TARGET_FX ] = m_pEffect->GetTechniqueByName( "SelectTargetFx" );
#ifdef _DEBUG
m_pTechHandles[ TECHNIQUE_ENVMAP ] = m_pEffect->GetTechniqueByName( "EnvMap_Tech" );
#endif
m_pTechHandles[TECHNIQUE_OUTLINE] = m_pEffect->GetTechniqueByName("OutLineTech");
m_pTechHandles[TECHNIQUE_OUTLINE_BLEND] = m_pEffect->GetTechniqueByName("OutLineBlendTech");
m_pTechHandles[TECHNIQUE_NO_TEX] = m_pEffect->GetTechniqueByName("NoTexTech");
}
#ifdef _RAC
if(pErrorMsgs)
{
char * pErrStr = (char*)pErrorMsgs->GetBufferPointer();
OutputDebugString(pErrStr);
OutputDebugString("\n");
}
//임시 화일은 삭제.
if( strstr( strFile.c_str(), "_tmp" ) )
DeleteFile( strFile.c_str() );
#endif
}
void K3DRenderDeviceDX::InitSpeedTree()
{
#ifndef _NOSTREE_
//Speed Tree
m_dwBranchVertexShader = LoadBranchShader(m_d3ddev);
m_dwLeafVertexShader = LoadLeafShader(m_d3ddev);
m_dwSpeedTreeBillboardVertexShader = LoadSpeedTreeBillboardShader(m_d3ddev); // sonador #2.1.7.1 스피드 트리 퍼포먼스 증가
#endif
#ifdef _DEBUG
if( FAILED( D3DXCreateRenderToEnvMap( m_d3ddev, 256, 1, m_d3dParam.BackBufferFormat, TRUE,
m_d3dParam.AutoDepthStencilFormat, &m_pRenderToEnvMap ) ) )
{
assert( false );
}
#endif
}
void K3DRenderDeviceDX::EndSpeedTree()
{
#ifndef _NOSTREE_
SAFE_RELEASE(m_dwBranchVertexShader);
SAFE_RELEASE(m_dwLeafVertexShader);
SAFE_RELEASE(m_dwSpeedTreeBillboardVertexShader); // sonador #2.1.7.1 스피드 트리 퍼포먼스 증가
SAFE_RELEASE(m_dwGrassVertexShader);
#endif
}
void K3DRenderDeviceDX::InitSpeedGrass()
{
m_dwGrassVertexShader = LoadGrassShader(m_d3ddev);
}
void K3DRenderDeviceDX::SetMatrixArray( CONST D3DXMATRIX* pMatrix, UINT Count )
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
if( !m_pEffect ) return;
D3DXHANDLE hParameter = NULL;
D3DXHANDLE hTechnique = NULL;
hParameter = m_pEffect->GetParameterByName(NULL,"blendMatrices");
{
m_pEffect->SetMatrixArray(hParameter, pMatrix, Count);
}
}
void K3DRenderDeviceDX::Fill( int flags )
{
DWORD ddflag = 0;
if ( flags & FILL_COLOR ) ddflag |= D3DCLEAR_TARGET;
if ( flags & FILL_DEPTH ) ddflag |= D3DCLEAR_ZBUFFER;
if ( flags & FILL_STENCIL ) ddflag |= D3DCLEAR_STENCIL;
HRESULT hr = m_d3ddev->Clear( 0, NULL, ddflag, m_colorFill.color, 1.0f, 0L );
if( hr != S_OK )
{
assert( 0 && "Fill Fail..." );
}
}
void K3DRenderDeviceDX::SetVertexShaderDefault()
{
m_d3ddev->SetVertexShader( NULL );
ResetPrevDeclarationTechnique();
}
void K3DRenderDeviceDX::SetFVF( DWORD dwFVF )
{
if( dwFVF != NULL )
{
ResetPrevDeclarationTechnique();
}
if( m_d3ddev->SetFVF( dwFVF ) != S_OK )
{
assert( 0 );
}
}
void K3DRenderDeviceDX::SetVertexShader(DWORD decl, DWORD tech)
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
if( GetPrevDeclaration() == decl && GetPrevTechnique() == tech )
{
return;
}
if (!m_pEffect) return ;
SetPrevDeclaration( decl );
SetPrevTechnique( tech );
SetFVF( NULL );
HRESULT hr;
if(m_pVertexDeclaration[decl])
m_d3ddev->SetVertexDeclaration(m_pVertexDeclaration[decl]);
hr = m_pEffect->SetTechnique( m_pTechHandles[tech] );
assert(hr == S_OK && "선언부 에러");
}
void K3DRenderDeviceDX::SetVertexShaderMatrix(const TCHAR *dcl, const K3DMatrix *mat)
{
TestCooperativeLevel() == S_OK ? m_bIsDeviceLost = false : m_bIsDeviceLost = true;
if( m_bIsDeviceLost ) return;
if(m_pEffect == NULL) return;
m_pEffect->SetMatrix(dcl, (D3DXMATRIX*)mat);
}
void K3DRenderDeviceDX::SetVertexShaderBranch()
{
HRESULT hr = m_d3ddev->SetVertexShader( m_dwBranchVertexShader );
if( hr != S_OK )
{
assert( 0 && "Failed!!! - SetVertexShaderBranch()" );
}
}
void K3DRenderDeviceDX::SetVertexShaderLeaf()
{
HRESULT hr = m_d3ddev->SetVertexShader( m_dwLeafVertexShader );
if( hr != S_OK )
{
assert( 0 && "Failed!!! - SetVertexShaderLeaf()" );
}
}
// sonador #2.1.7.1 스피드 트리 퍼포먼스 증가
void K3DRenderDeviceDX::SetVertexShaderSpeedTreeBillboard()
{
HRESULT hr = m_d3ddev->SetVertexShader( m_dwSpeedTreeBillboardVertexShader );
if( hr != S_OK )
{
assert( 0 && "Failed!!! - SetVertexShaderSpeedTreeBillboard()" );
}
}
void K3DRenderDeviceDX::SetVertexShaderGrass()
{
HRESULT hr = m_d3ddev->SetVertexShader( m_dwGrassVertexShader );
if( hr != S_OK )
{
assert( 0 && "Failed!!! - SetVertexShaderGrass()" );
}
}
void K3DRenderDeviceDX::SetLocalCoordOffset( K3DVector vOffset )
{
m_LocalCoordOffset = vOffset;
K3DVector4 vec4( vOffset.x, vOffset.y, vOffset.z, 0.0f );
SetVertexShaderConstant( CONSTANT_LOCALCOORD_OFFSET, ( float* ) &vec4, 4);
}
K3DVector K3DRenderDeviceDX::GetLocalCoordOffset()
{
return m_LocalCoordOffset;
}
HRESULT K3DRenderDeviceDX::setupOcclusion()
{
// Create the query
HRESULT hr = m_d3ddev->CreateQuery( D3DQUERYTYPE_OCCLUSION, &m_d3dQuery );
if( hr == S_OK )
{
m_bDeviceSupportsVizQuery = true;
}
return hr;
}
bool K3DRenderDeviceDX::VizQueryIssueBegin()
{
if( m_bDeviceSupportsVizQuery )
{
if( m_d3dQuery->Issue( D3DISSUE_BEGIN ) == D3D_OK )
{
return true;
}
}
return false;
}
bool K3DRenderDeviceDX::VizQueryIssueEnd()
{
if( m_bDeviceSupportsVizQuery )
{
if( m_d3dQuery->Issue( D3DISSUE_END ) == D3D_OK )
{
DWORD dwVizData = 0;
while (m_d3dQuery->GetData((void *) &dwVizData, sizeof(DWORD), D3DGETDATA_FLUSH) == S_FALSE)
{
}
if( dwVizData > 0 ) return true;
return false;
}
}
return true;
}
// =========================================================================================
#pragma comment(lib, "dxerr9.lib")
KSwapChainDX::KSwapChainDX()
{
m_pInterface = NULL;
m_pBackBuffer = NULL;
m_pDepthBuffer = NULL;
m_pRenDev = NULL;
m_hWnd = NULL;
m_bUseDepth = FALSE;
}
KSwapChainDX::~KSwapChainDX()
{
Clear();
}
BOOL KSwapChainDX::Create(K3DRenderDeviceDX* pRenDev, HWND hWnd, BOOL bUseDepth)
{
IDirect3D9* pD3d = pRenDev->GetD3D();
IDirect3DDevice9* pD3dDev = pRenDev->GetD3DDevice();
if(!pD3d || !pD3dDev) return FALSE;
K3DRenderDeviceDX::CS cs = pRenDev->GetCS();
D3DDISPLAYMODE d3ddm;
if(FAILED(pD3d->GetAdapterDisplayMode(cs.nAdopter, &d3ddm))) return FALSE;
RECT rc;
::GetClientRect(hWnd, &rc);
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.BackBufferWidth = rc.right;
d3dpp.BackBufferHeight = rc.bottom;
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hWnd;
d3dpp.Windowed = !cs.bFullScreen;
//d3dpp.EnableAutoDepthStencil = FALSE;
//d3dpp.AutoDepthStencilFormat = (D3DFORMAT) K3DFMT_D24X8;//K3DFMT_D16;;
//d3dpp.Flags = 0;
IDirect3DSwapChain9* pInterface = NULL;
HRESULT hres = pD3dDev->CreateAdditionalSwapChain(&d3dpp, &pInterface);
if(FAILED(hres))
{
const TCHAR* szError = DXGetErrorString9(hres);
assert(0 && "CreateAdditionalSwapChain() failed");
if(szError)
{
assert(0 && szError);
}
return FALSE;
}
IDirect3DSurface9* pBackBuffer = NULL;
hres = pInterface->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer);
if(FAILED(hres))
{
const TCHAR* szError = DXGetErrorString9(hres);
assert(0 && "GetBackBuffer() failed");
if(szError)
{
assert(0 && szError);
}
SAFE_RELEASE(pInterface);
return FALSE;
}
IDirect3DSurface9* pDepthBuffer = NULL;
if(bUseDepth)
{
hres = pD3dDev->CreateDepthStencilSurface(rc.right, rc.bottom, D3DFMT_D24X8, D3DMULTISAMPLE_NONE, 0, TRUE, &pDepthBuffer, NULL);
if(FAILED(hres))
{
const TCHAR* szError = DXGetErrorString9(hres);
assert(0 && "CreateDepthStencilSurface() failed");
if(szError)
{
assert(0 && szError);
}
SAFE_RELEASE(pInterface);
SAFE_RELEASE(pBackBuffer);
return FALSE;
}
}
m_pInterface = pInterface;
m_pBackBuffer = pBackBuffer;
m_pDepthBuffer = pDepthBuffer;
m_pRenDev = pRenDev;
m_hWnd = hWnd;
m_bUseDepth = bUseDepth;
return TRUE;
}
void KSwapChainDX::Clear()
{
SAFE_RELEASE(m_pInterface);
SAFE_RELEASE(m_pBackBuffer);
SAFE_RELEASE(m_pDepthBuffer);
}
void KSwapChainDX::Reset()
{
Clear();
Create(m_pRenDev, m_hWnd, m_bUseDepth);
}
IDirect3DSwapChain9* KSwapChainDX::GetInterface()
{
return m_pInterface;
}
IDirect3DSurface9* KSwapChainDX::GetBackBuffer()
{
return m_pBackBuffer;
}
IDirect3DSurface9* KSwapChainDX::GetDepthBuffer()
{
return m_pDepthBuffer;
}
BOOL KSwapChainDX::DoesUseDepthBuffer()
{
return m_bUseDepth;
}
HWND KSwapChainDX::GetHwnd()
{
return m_hWnd;
}