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>
243 lines
7.8 KiB
C++
243 lines
7.8 KiB
C++
// InstanceObjectManager.cpp: implementation of the CInstanceObjectManager class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "InstanceObjectManager.h"
|
|
#include "SceneManager.h"
|
|
#include "BaseGraphicsLayer.h"
|
|
#include "SceneStateMgr.h"
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
CInstanceObjectManager::CInstanceObjectManager()
|
|
{
|
|
m_TotalInstanceObjectID=0;
|
|
}
|
|
|
|
CInstanceObjectManager::~CInstanceObjectManager()
|
|
{
|
|
|
|
}
|
|
|
|
int CInstanceObjectManager::AddInstanceObject(char *strObjectName, vector3 vecPos)
|
|
{
|
|
CSceneManager::m_MeshObjectContainer.SetPath(INSTANCEOBJECTPATH);
|
|
InstanceObjectNode AddNode;
|
|
AddNode.m_ID=m_TotalInstanceObjectID;
|
|
AddNode.m_Color.c=0x0;
|
|
if(strcmp(strObjectName,"")!=0)
|
|
{
|
|
AddNode.m_pMeshObject=CSceneManager::m_MeshObjectContainer.GetMeshObject(strObjectName);
|
|
AddNode.m_pMeshObject->ConvertNormal();
|
|
}
|
|
else
|
|
{
|
|
AddNode.m_pMeshObject=NULL;
|
|
}
|
|
AddNode.m_vecPosition=vecPos;
|
|
strcpy(AddNode.m_strMeshName,strObjectName);
|
|
m_InstanceObjectList.Add(AddNode);
|
|
m_TotalInstanceObjectID++;
|
|
return AddNode.m_ID;
|
|
}
|
|
|
|
void CInstanceObjectManager::DeleteInstanceObject(int InstanceObjectID)
|
|
{
|
|
for(int i=0;i<m_InstanceObjectList.num;i++)
|
|
{
|
|
if(m_InstanceObjectList[i].m_ID==InstanceObjectID)
|
|
{
|
|
CSceneManager::m_MeshObjectContainer.DeleteMeshObject(m_InstanceObjectList[i].m_strMeshName);
|
|
m_InstanceObjectList.DelIndex(i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void CInstanceObjectManager::Render(LPDIRECT3DDEVICE8 pd3dDevice)
|
|
{
|
|
//pd3dDevice->CaptureStateBlock(oldStateBlock);
|
|
//pd3dDevice->ApplyStateBlock(m_ObjectRenderStateBlock);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAARG2,D3DTA_DIFFUSE);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_COLOROP,D3DTOP_DISABLE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
|
|
|
|
|
|
pd3dDevice->LightEnable(0,TRUE);
|
|
|
|
pd3dDevice->LightEnable(1,FALSE);
|
|
|
|
pd3dDevice->LightEnable(2,FALSE);
|
|
|
|
pd3dDevice->LightEnable(3,FALSE);
|
|
|
|
pd3dDevice->LightEnable(4,FALSE);
|
|
|
|
pd3dDevice->LightEnable(5,FALSE);
|
|
|
|
pd3dDevice->LightEnable(6,FALSE);
|
|
pd3dDevice->LightEnable(7,FALSE);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_LIGHTING,TRUE);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
|
|
|
|
|
|
|
|
/////
|
|
pd3dDevice->LightEnable(0,TRUE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE2X);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_COLORARG2,D3DTA_CURRENT);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_SELECTARG1);
|
|
CSceneStateMgr::_SetD3DTextureStageState(1,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
|
|
|
|
pd3dDevice->SetTexture(0,NULL);
|
|
pd3dDevice->SetTexture(1,NULL);
|
|
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE);
|
|
|
|
D3DMATERIAL8 mtrl;
|
|
ZeroMemory( &mtrl, sizeof(D3DMATERIAL8) );
|
|
mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
|
|
mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;
|
|
mtrl.Diffuse.b = mtrl.Ambient.b = 1.0f;
|
|
mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
|
|
pd3dDevice->SetMaterial( &mtrl );
|
|
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_LIGHTING,TRUE);
|
|
|
|
matrix matTrans;
|
|
CSceneNode SceneNode;
|
|
SceneNode.m_fRad=200.0f;
|
|
float w;
|
|
vector3 vecResult;
|
|
D3DLIGHT8 ColorLight=CSceneManager::m_WeatherManager.m_SunLight;
|
|
for(int cObject=0;cObject<m_InstanceObjectList.num;cObject++)
|
|
{
|
|
matTrans.Translation(m_InstanceObjectList[cObject].m_vecPosition);
|
|
SceneNode.m_AccumulateTM=matTrans;
|
|
if(SceneNode.isCulling())
|
|
{
|
|
if(m_InstanceObjectList[cObject].m_Color.c!=0x0)
|
|
{
|
|
ColorLight.Diffuse.r=(float)m_InstanceObjectList[cObject].m_Color.r/255.0f;
|
|
ColorLight.Diffuse.g=(float)m_InstanceObjectList[cObject].m_Color.g/255.0f;;
|
|
ColorLight.Diffuse.b=(float)m_InstanceObjectList[cObject].m_Color.b/255.0f;;
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,m_InstanceObjectList[cObject].m_Color.c);
|
|
pd3dDevice->SetLight(0,&ColorLight);
|
|
}
|
|
else
|
|
{
|
|
//CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterObjectAmbientColor.c);
|
|
//CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c);
|
|
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,0xffcccccc);
|
|
pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight);
|
|
}
|
|
pd3dDevice->SetTransform(D3DTS_WORLD,matTrans);
|
|
BaseGraphicsLayer::TransformVector(m_InstanceObjectList[cObject].m_vecPosition,vecResult,w);
|
|
m_InstanceObjectList[cObject].m_ptMousePick.x=(int)vecResult.x;
|
|
m_InstanceObjectList[cObject].m_ptMousePick.y=(int)vecResult.y;
|
|
if(m_InstanceObjectList[cObject].m_pMeshObject)
|
|
m_InstanceObjectList[cObject].m_pMeshObject->Render(pd3dDevice);
|
|
}
|
|
else
|
|
{
|
|
m_InstanceObjectList[cObject].m_ptMousePick.x=
|
|
m_InstanceObjectList[cObject].m_ptMousePick.y=-1;
|
|
}
|
|
}
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE);
|
|
//pd3dDevice->ApplyStateBlock(oldStateBlock);
|
|
}
|
|
|
|
void CInstanceObjectManager::Create(LPDIRECT3DDEVICE8 pd3dDevice)
|
|
{
|
|
/* pd3dDevice->CreateStateBlock(D3DSBT_ALL,&m_ObjectRenderStateBlock);
|
|
|
|
pd3dDevice->BeginStateBlock();
|
|
pd3dDevice->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
|
|
pd3dDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE);
|
|
pd3dDevice->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE);
|
|
|
|
pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
|
|
pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE);
|
|
pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAARG2,D3DTA_DIFFUSE);
|
|
|
|
pd3dDevice->SetTextureStageState(1,D3DTSS_COLOROP,D3DTOP_DISABLE);
|
|
pd3dDevice->SetTextureStageState(1,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
|
|
|
|
|
|
pd3dDevice->LightEnable(0,TRUE);
|
|
|
|
pd3dDevice->LightEnable(1,FALSE);
|
|
|
|
pd3dDevice->LightEnable(2,FALSE);
|
|
|
|
pd3dDevice->LightEnable(3,FALSE);
|
|
|
|
pd3dDevice->LightEnable(4,FALSE);
|
|
|
|
pd3dDevice->LightEnable(5,FALSE);
|
|
|
|
pd3dDevice->LightEnable(6,FALSE);
|
|
pd3dDevice->LightEnable(7,FALSE);
|
|
pd3dDevice->SetRenderState(D3DRS_LIGHTING,TRUE);
|
|
pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
|
|
/*
|
|
pd3dDevice->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight);
|
|
pd3dDevice->SetRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_AmbientColor->c);
|
|
*/
|
|
// pd3dDevice->EndStateBlock(&m_ObjectRenderStateBlock);
|
|
}
|
|
|
|
int CInstanceObjectManager::MouseOnCheckInstanceObject(int px, int py)
|
|
{
|
|
for(int i=0;i<m_InstanceObjectList.num;i++)
|
|
{
|
|
if(m_InstanceObjectList[i].m_ptMousePick.x!=-1)
|
|
{
|
|
if( m_InstanceObjectList[i].m_ptMousePick.x > px-30 &&
|
|
m_InstanceObjectList[i].m_ptMousePick.x < px+30 &&
|
|
m_InstanceObjectList[i].m_ptMousePick.y > py-30 &&
|
|
m_InstanceObjectList[i].m_ptMousePick.y < py+30)
|
|
{
|
|
return m_InstanceObjectList[i].m_ID;
|
|
}
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
void CInstanceObjectManager::SetInstanceObjectColor(int ID, color Color)
|
|
{
|
|
for(int i=0;i<m_InstanceObjectList.num;i++)
|
|
{
|
|
if(m_InstanceObjectList[i].m_ID==ID)
|
|
{
|
|
m_InstanceObjectList[i].m_Color=Color;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void CInstanceObjectManager::SetAllObjectColor(color Color)
|
|
{
|
|
for(int i=0;i<m_InstanceObjectList.num;i++)
|
|
{
|
|
m_InstanceObjectList[i].m_Color=Color;
|
|
}
|
|
}
|