// 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;iCaptureStateBlock(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;cObjectSetLight(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 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