Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
326
GameTools/Zallad3D SceneClass/Z3DRenderable.cpp
Normal file
326
GameTools/Zallad3D SceneClass/Z3DRenderable.cpp
Normal file
@@ -0,0 +1,326 @@
|
||||
// Z3DRenderable.cpp: implementation of the CZ3DRenderable class.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#pragma warning(disable:4786)
|
||||
|
||||
#include "Z3DRenderable.h"
|
||||
#include "3DMath.h"
|
||||
#include "SimpleParser.h"
|
||||
#include <algorithm>
|
||||
#include "SceneStateMgr.h"
|
||||
|
||||
|
||||
IDirect3DDevice8* CZ3DRenderable::ms_pDevice;
|
||||
std::list<CZ3DRenderable*> CZ3DRenderable::ms_listpObjects;
|
||||
std::vector<CZ3DRenderable*> CZ3DRenderable::ms_vec_pRenderObjects;
|
||||
std::vector<CZ3DRenderable*> CZ3DRenderable::ms_vec_pSecondRenderObjects;
|
||||
//unsigned long CZ3DRenderable::ms_ulVertexStateBlockHandle;
|
||||
//unsigned long CZ3DRenderable::ms_ulPixelStateBlockHandle;
|
||||
vector3 CZ3DRenderable::ms_vec_CameraPos;
|
||||
D3DXMATRIX CZ3DRenderable::ms_IdentityD3DMatrix;
|
||||
|
||||
vector3 CZ3DRenderable::m_vecCameraPosition;
|
||||
D3DMATERIAL8 CZ3DRenderable::ms_Material;
|
||||
|
||||
|
||||
bool CZ3DRenderable::_Init(PDIRECT3DDEVICE8 pDevice)
|
||||
{
|
||||
if( !pDevice )
|
||||
return false;
|
||||
|
||||
ms_pDevice = pDevice;
|
||||
D3DXMatrixIdentity( &ms_IdentityD3DMatrix );
|
||||
|
||||
// ms_pDevice->CreateStateBlock( D3DSBT_PIXELSTATE, &ms_ulPixelStateBlockHandle );
|
||||
// ms_pDevice->CreateStateBlock( D3DSBT_VERTEXSTATE, &ms_ulVertexStateBlockHandle );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool CZ3DRenderable::_Close()
|
||||
{
|
||||
if( ms_pDevice )
|
||||
{
|
||||
// ms_pDevice->DeleteStateBlock( ms_ulVertexStateBlockHandle );
|
||||
// ms_pDevice->DeleteStateBlock( ms_ulPixelStateBlockHandle );
|
||||
|
||||
ms_pDevice = NULL;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
static bool operator< ( CZ3DRenderable& a, CZ3DRenderable& b )
|
||||
{
|
||||
return (a.GetTexturePtr() < b.GetTexturePtr());
|
||||
}
|
||||
|
||||
|
||||
static DWORD s_dwAmbient;
|
||||
static DWORD s_dwZWriteEnable;
|
||||
static DWORD s_dwLighting;
|
||||
static DWORD s_dwAlphaBlend;
|
||||
static DWORD s_dwAlphaTest;
|
||||
static DWORD s_dwSrcBlend;
|
||||
static DWORD s_dwDestBlend;
|
||||
|
||||
static DWORD s_dwTS0Op;
|
||||
static DWORD s_dwTS0Arg1;
|
||||
static DWORD s_dwTS0Arg2;
|
||||
static DWORD s_dwTS1Op;
|
||||
|
||||
void CZ3DRenderable::Process()
|
||||
{
|
||||
std::list<CZ3DRenderable*>::iterator iter;
|
||||
|
||||
// get camera position for LOD level calculation
|
||||
matrix m;
|
||||
ms_pDevice->GetTransform( D3DTS_VIEW, m );
|
||||
matrix matForViewPosition;
|
||||
matForViewPosition.Inverse(m);
|
||||
|
||||
ms_vec_CameraPos=matForViewPosition.GetLoc();
|
||||
|
||||
// clear pervious work vector
|
||||
if( !(ms_vec_pRenderObjects.empty()) )
|
||||
ms_vec_pRenderObjects.clear();
|
||||
if( !(ms_vec_pSecondRenderObjects.empty()) )
|
||||
ms_vec_pSecondRenderObjects.clear();
|
||||
|
||||
// make non-culled object vector
|
||||
for( iter = ms_listpObjects.begin(); iter != ms_listpObjects.end(); iter++ )
|
||||
{
|
||||
if( !((*iter)->IsCulled()) && !((*iter)->IsRenderIndividually()) )
|
||||
{
|
||||
ms_vec_pRenderObjects.push_back( *iter );
|
||||
|
||||
// check second-renderability
|
||||
if( (*iter)->IsSecondRenderable() )
|
||||
{
|
||||
ms_vec_pSecondRenderObjects.push_back( *iter );
|
||||
}
|
||||
}
|
||||
}
|
||||
ptr_greater<CZ3DRenderable*> pg;
|
||||
std::sort( ms_vec_pRenderObjects.begin(), ms_vec_pRenderObjects.end(), pg );
|
||||
|
||||
|
||||
// save current renderstates
|
||||
// GetDevice()->CreateStateBlock( D3DSBT_ALL, &ms_ulRenderStateBlockHandle );
|
||||
// GetDevice()->CaptureStateBlock( ms_ulPixelStateBlockHandle );
|
||||
// GetDevice()->CaptureStateBlock( ms_ulVertexStateBlockHandle );
|
||||
GetDevice()->GetRenderState( D3DRS_AMBIENT, &s_dwAmbient );
|
||||
GetDevice()->GetRenderState( D3DRS_ZWRITEENABLE, &s_dwZWriteEnable );
|
||||
GetDevice()->GetRenderState( D3DRS_LIGHTING, &s_dwLighting );
|
||||
GetDevice()->GetRenderState( D3DRS_ALPHABLENDENABLE, &s_dwAlphaBlend );
|
||||
GetDevice()->GetRenderState( D3DRS_ALPHATESTENABLE, &s_dwAlphaTest );
|
||||
GetDevice()->GetRenderState( D3DRS_SRCBLEND, &s_dwSrcBlend );
|
||||
GetDevice()->GetRenderState( D3DRS_DESTBLEND, &s_dwDestBlend );
|
||||
GetDevice()->GetTextureStageState( 0, D3DTSS_ALPHAOP, &s_dwTS0Op );
|
||||
GetDevice()->GetTextureStageState( 0, D3DTSS_ALPHAARG1, &s_dwTS0Arg1 );
|
||||
GetDevice()->GetTextureStageState( 0, D3DTSS_ALPHAARG2, &s_dwTS0Arg2 );
|
||||
GetDevice()->GetTextureStageState( 1, D3DTSS_ALPHAOP, &s_dwTS1Op );
|
||||
|
||||
|
||||
// setting up renderstate here
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, D3DCOLOR_ARGB(0xff, 0x80, 0x80, 0x80) );
|
||||
|
||||
ms_Material.Ambient.a = 1.0f;
|
||||
ms_Material.Ambient.r = 1.0f;
|
||||
ms_Material.Ambient.g = 1.0f;
|
||||
ms_Material.Ambient.b = 1.0f;
|
||||
ms_Material.Diffuse.a = 1.0f;
|
||||
ms_Material.Diffuse.r = 1.0f;
|
||||
ms_Material.Diffuse.g = 1.0f;
|
||||
ms_Material.Diffuse.b = 1.0f;
|
||||
ms_Material.Emissive.a = 1.0f;
|
||||
ms_Material.Emissive.r = 0.0f;
|
||||
ms_Material.Emissive.g = 0.0f;
|
||||
ms_Material.Emissive.b = 0.0f;
|
||||
ms_Material.Power = 0;
|
||||
//GetDevice()->SetMaterial( &ms_Material );
|
||||
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,TRUE);
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,TRUE);
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
|
||||
|
||||
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE );
|
||||
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
|
||||
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE );
|
||||
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
|
||||
|
||||
|
||||
// render
|
||||
CZ3DRenderable* pRenderable;
|
||||
GetDevice()->SetTexture( 0, NULL );
|
||||
IDirect3DTexture8* pPrevTexture = NULL;
|
||||
for( int i = 0; i < (int)ms_vec_pRenderObjects.size(); i++ )
|
||||
{
|
||||
pRenderable = ms_vec_pRenderObjects[i];
|
||||
|
||||
if( pPrevTexture != pRenderable->GetTexturePtr() &&
|
||||
(IDirect3DTexture8*)0xFFFFFFFF != pRenderable->GetTexturePtr() )
|
||||
{
|
||||
// texture change
|
||||
GetDevice()->SetTexture( 0, pRenderable->GetTexturePtr() );
|
||||
//GetDevice()->SetTexture( 0, NULL );
|
||||
pPrevTexture = pRenderable->GetTexturePtr();
|
||||
}
|
||||
|
||||
ms_Material.Diffuse.a = pRenderable->GetTransparency();
|
||||
GetDevice()->SetMaterial( &ms_Material );
|
||||
pRenderable->Render();
|
||||
}
|
||||
GetDevice()->SetTexture( 0, NULL );
|
||||
// GetDevice()->SetStreamSource( 0, NULL, 0 );
|
||||
// GetDevice()->SetIndices( NULL, 0 );
|
||||
|
||||
|
||||
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_ALPHAOP, s_dwTS1Op );
|
||||
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, s_dwTS0Arg2 );
|
||||
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, s_dwTS0Arg1 );
|
||||
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, s_dwTS0Op );
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, s_dwDestBlend );
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, s_dwSrcBlend );
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE, s_dwAlphaTest );
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, s_dwAlphaBlend );
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING, s_dwLighting );
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_ZWRITEENABLE, s_dwZWriteEnable );
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, s_dwAmbient );
|
||||
|
||||
// CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
|
||||
// CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE);
|
||||
// GetDevice()->ApplyStateBlock( ms_ulVertexStateBlockHandle );
|
||||
// GetDevice()->ApplyStateBlock( ms_ulPixelStateBlockHandle );
|
||||
// GetDevice()->DeleteStateBlock( ms_ulRenderStateBlockHandle );
|
||||
}
|
||||
|
||||
|
||||
void CZ3DRenderable::SecondProcess()
|
||||
{
|
||||
// setting up second render state( alpha'd object )
|
||||
|
||||
// save current renderstates
|
||||
// GetDevice()->CreateStateBlock( D3DSBT_ALL, &ms_ulRenderStateBlockHandle );
|
||||
// GetDevice()->CaptureStateBlock( ms_ulPixelStateBlockHandle );
|
||||
// GetDevice()->CaptureStateBlock( ms_ulVertexStateBlockHandle );
|
||||
GetDevice()->GetRenderState( D3DRS_AMBIENT, &s_dwAmbient );
|
||||
GetDevice()->GetRenderState( D3DRS_ZWRITEENABLE, &s_dwZWriteEnable );
|
||||
GetDevice()->GetRenderState( D3DRS_LIGHTING, &s_dwLighting );
|
||||
GetDevice()->GetRenderState( D3DRS_ALPHABLENDENABLE, &s_dwAlphaBlend );
|
||||
GetDevice()->GetRenderState( D3DRS_ALPHATESTENABLE, &s_dwAlphaTest );
|
||||
GetDevice()->GetRenderState( D3DRS_SRCBLEND, &s_dwSrcBlend );
|
||||
GetDevice()->GetRenderState( D3DRS_DESTBLEND, &s_dwDestBlend );
|
||||
GetDevice()->GetTextureStageState( 0, D3DTSS_ALPHAOP, &s_dwTS0Op );
|
||||
GetDevice()->GetTextureStageState( 0, D3DTSS_ALPHAARG1, &s_dwTS0Arg1 );
|
||||
GetDevice()->GetTextureStageState( 0, D3DTSS_ALPHAARG2, &s_dwTS0Arg2 );
|
||||
GetDevice()->GetTextureStageState( 1, D3DTSS_ALPHAOP, &s_dwTS1Op );
|
||||
|
||||
static D3DMATERIAL8 tmpMtrl;
|
||||
GetDevice()->GetMaterial( &tmpMtrl );
|
||||
|
||||
|
||||
// setting up renderstate here
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, D3DCOLOR_ARGB(0x00, 0x80, 0x80, 0x80) );
|
||||
|
||||
ms_Material.Ambient.a = 1.0f;
|
||||
ms_Material.Ambient.r = 0.4f;
|
||||
ms_Material.Ambient.g = 0.4f;
|
||||
ms_Material.Ambient.b = 0.4f;
|
||||
ms_Material.Diffuse.a = 1.0f;
|
||||
ms_Material.Diffuse.r = 1.60f;
|
||||
ms_Material.Diffuse.g = 1.60f;
|
||||
ms_Material.Diffuse.b = 1.60f;
|
||||
ms_Material.Emissive.a = 1.0f;
|
||||
ms_Material.Emissive.r = 0.0f;
|
||||
ms_Material.Emissive.g = 0.0f;
|
||||
ms_Material.Emissive.b = 0.0f;
|
||||
ms_Material.Power = 0.0f;
|
||||
//GetDevice()->SetMaterial( &ms_Material );
|
||||
|
||||
// TEST now
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_ZWRITEENABLE, FALSE);
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING, FALSE );
|
||||
DWORD dwCullState;
|
||||
GetDevice()->GetRenderState( D3DRS_CULLMODE, &dwCullState );
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
|
||||
|
||||
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,TRUE);
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE);
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
|
||||
|
||||
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
|
||||
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
|
||||
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
|
||||
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
|
||||
|
||||
|
||||
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE );
|
||||
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
|
||||
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE );
|
||||
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
|
||||
|
||||
|
||||
ptr_greater<CZ3DRenderable*> pg;
|
||||
std::sort( ms_vec_pSecondRenderObjects.begin(), ms_vec_pSecondRenderObjects.end(), pg );
|
||||
|
||||
// render
|
||||
CZ3DRenderable* pRenderable;
|
||||
GetDevice()->SetTexture( 0, NULL );
|
||||
IDirect3DTexture8* pPrevTexture = NULL;
|
||||
for( int i = 0; i < (int)ms_vec_pSecondRenderObjects.size(); i++ )
|
||||
{
|
||||
pRenderable = ms_vec_pSecondRenderObjects[i];
|
||||
if( pPrevTexture != pRenderable->GetTexturePtr() &&
|
||||
(IDirect3DTexture8*)0xFFFFFFFF != pRenderable->GetTexturePtr() )
|
||||
{
|
||||
// texture change
|
||||
GetDevice()->SetTexture( 0, pRenderable->GetTexturePtr() );
|
||||
pPrevTexture = pRenderable->GetTexturePtr();
|
||||
}
|
||||
|
||||
/*if( pRenderable->IsLightenSecondRender() )
|
||||
{
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
|
||||
}
|
||||
else
|
||||
{
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
|
||||
}*/
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, pRenderable->m_SecondRenderSrcBlend );
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, pRenderable->m_SecondRenderDestBlend );
|
||||
|
||||
ms_Material.Diffuse.a = pRenderable->GetTransparency();
|
||||
GetDevice()->SetMaterial( &ms_Material );
|
||||
pRenderable->SecondRender();
|
||||
}
|
||||
|
||||
GetDevice()->SetMaterial( &tmpMtrl );
|
||||
|
||||
GetDevice()->SetTexture( 0, NULL );
|
||||
GetDevice()->SetStreamSource( 0, NULL, 0 );
|
||||
GetDevice()->SetIndices( NULL, 0 );
|
||||
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_CULLMODE, dwCullState );
|
||||
|
||||
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_ALPHAOP, s_dwTS1Op );
|
||||
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, s_dwTS0Arg2 );
|
||||
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, s_dwTS0Arg1 );
|
||||
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, s_dwTS0Op );
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, s_dwDestBlend );
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, s_dwSrcBlend );
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE, s_dwAlphaTest );
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, s_dwAlphaBlend );
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING, s_dwLighting );
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_ZWRITEENABLE, s_dwZWriteEnable );
|
||||
CSceneStateMgr::_SetD3DRenderState( D3DRS_AMBIENT, s_dwAmbient );
|
||||
// GetDevice()->ApplyStateBlock( ms_ulVertexStateBlockHandle );
|
||||
// GetDevice()->ApplyStateBlock( ms_ulPixelStateBlockHandle );
|
||||
// GetDevice()->DeleteStateBlock( ms_ulRenderStateBlockHandle );
|
||||
}
|
||||
Reference in New Issue
Block a user