1498 lines
48 KiB
C++
1498 lines
48 KiB
C++
|
#include "StdAfx.h"
|
|||
|
#include "../eterLib/StateManager.h"
|
|||
|
#include "../eterLib/GrpSubImage.h"
|
|||
|
#include "../eterlib/Camera.h"
|
|||
|
#include "../EterPack/EterPackManager.h"
|
|||
|
|
|||
|
#include "PythonMiniMap.h"
|
|||
|
#include "PythonBackground.h"
|
|||
|
#include "PythonCharacterManager.h"
|
|||
|
#include "PythonGuild.h"
|
|||
|
|
|||
|
#include "AbstractPlayer.h"
|
|||
|
|
|||
|
#include "../eterPythonLib/PythonWindowManager.h"
|
|||
|
|
|||
|
void CPythonMiniMap::AddObserver(DWORD dwVID, float fSrcX, float fSrcY)
|
|||
|
{
|
|||
|
std::map<DWORD, SObserver>::iterator f=m_kMap_dwVID_kObserver.find(dwVID);
|
|||
|
if (m_kMap_dwVID_kObserver.end()==f)
|
|||
|
{
|
|||
|
SObserver kObserver;
|
|||
|
kObserver.dwSrcTime=ELTimer_GetMSec();
|
|||
|
kObserver.dwDstTime=kObserver.dwSrcTime+1000;
|
|||
|
kObserver.fSrcX=fSrcX;
|
|||
|
kObserver.fSrcY=fSrcY;
|
|||
|
kObserver.fDstX=fSrcX;
|
|||
|
kObserver.fDstY=fSrcY;
|
|||
|
kObserver.fCurX=fSrcX;
|
|||
|
kObserver.fCurY=fSrcY;
|
|||
|
m_kMap_dwVID_kObserver.insert(std::map<DWORD, SObserver>::value_type(dwVID, kObserver));
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
SObserver& rkObserver=f->second;
|
|||
|
rkObserver.dwSrcTime=ELTimer_GetMSec();
|
|||
|
rkObserver.dwDstTime=rkObserver.dwSrcTime+1000;
|
|||
|
rkObserver.fSrcX=fSrcX;
|
|||
|
rkObserver.fSrcY=fSrcY;
|
|||
|
rkObserver.fDstX=fSrcX;
|
|||
|
rkObserver.fDstY=fSrcY;
|
|||
|
rkObserver.fCurX=fSrcX;
|
|||
|
rkObserver.fCurY=fSrcY;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::MoveObserver(DWORD dwVID, float fDstX, float fDstY)
|
|||
|
{
|
|||
|
std::map<DWORD, SObserver>::iterator f=m_kMap_dwVID_kObserver.find(dwVID);
|
|||
|
if (m_kMap_dwVID_kObserver.end()==f)
|
|||
|
return;
|
|||
|
|
|||
|
SObserver& rkObserver=f->second;
|
|||
|
rkObserver.dwSrcTime=ELTimer_GetMSec();
|
|||
|
rkObserver.dwDstTime=rkObserver.dwSrcTime+1000;
|
|||
|
rkObserver.fSrcX=rkObserver.fCurX;
|
|||
|
rkObserver.fSrcY=rkObserver.fCurY;
|
|||
|
rkObserver.fDstX=fDstX;
|
|||
|
rkObserver.fDstY=fDstY;
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::RemoveObserver(DWORD dwVID)
|
|||
|
{
|
|||
|
m_kMap_dwVID_kObserver.erase(dwVID);
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::SetCenterPosition(float fCenterX, float fCenterY)
|
|||
|
{
|
|||
|
m_fCenterX = fCenterX;
|
|||
|
m_fCenterY = fCenterY;
|
|||
|
|
|||
|
CMapOutdoor& rkMap = CPythonBackground::Instance().GetMapOutdoorRef();
|
|||
|
for (BYTE byTerrainNum = 0; byTerrainNum < AROUND_AREA_NUM; ++byTerrainNum)
|
|||
|
{
|
|||
|
m_lpMiniMapTexture[byTerrainNum] = NULL;
|
|||
|
CTerrain * pTerrain;
|
|||
|
if (rkMap.GetTerrainPointer(byTerrainNum, &pTerrain))
|
|||
|
m_lpMiniMapTexture[byTerrainNum] = pTerrain->GetMiniMapTexture();
|
|||
|
}
|
|||
|
|
|||
|
const TOutdoorMapCoordinate & rOutdoorMapCoord = rkMap.GetCurCoordinate();
|
|||
|
|
|||
|
m_fCenterCellX = (m_fCenterX - (float)(rOutdoorMapCoord.m_sTerrainCoordX * CTerrainImpl::TERRAIN_XSIZE)) / (float)(CTerrainImpl::CELLSCALE);
|
|||
|
m_fCenterCellY = (m_fCenterY - (float)(rOutdoorMapCoord.m_sTerrainCoordY * CTerrainImpl::TERRAIN_YSIZE)) / (float)(CTerrainImpl::CELLSCALE);
|
|||
|
|
|||
|
__SetPosition();
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::Update(float fCenterX, float fCenterY)
|
|||
|
{
|
|||
|
CPythonBackground& rkBG=CPythonBackground::Instance();
|
|||
|
if (!rkBG.IsMapOutdoor())
|
|||
|
return;
|
|||
|
|
|||
|
// <20>̴ϸ<CCB4> <20><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
if (m_fCenterX != fCenterX || m_fCenterY != fCenterY )
|
|||
|
SetCenterPosition(fCenterX, fCenterY);
|
|||
|
|
|||
|
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
|
|||
|
m_OtherPCPositionVector.clear();
|
|||
|
m_PartyPCPositionVector.clear();
|
|||
|
m_NPCPositionVector.clear();
|
|||
|
m_MonsterPositionVector.clear();
|
|||
|
m_WarpPositionVector.clear();
|
|||
|
|
|||
|
float fooCellScale = 1.0f / ((float) CTerrainImpl::CELLSCALE);
|
|||
|
|
|||
|
CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
|
|||
|
|
|||
|
CInstanceBase* pkInstMain=rkChrMgr.GetMainInstancePtr();
|
|||
|
if (!pkInstMain)
|
|||
|
return;
|
|||
|
|
|||
|
CPythonCharacterManager::CharacterIterator i;
|
|||
|
for(i = rkChrMgr.CharacterInstanceBegin(); i!=rkChrMgr.CharacterInstanceEnd(); ++i)
|
|||
|
{
|
|||
|
CInstanceBase* pkInstEach=*i;
|
|||
|
|
|||
|
TPixelPosition kInstancePosition;
|
|||
|
pkInstEach->NEW_GetPixelPosition(&kInstancePosition);
|
|||
|
float fDistanceFromCenterX = (kInstancePosition.x - m_fCenterX) * fooCellScale * m_fScale;
|
|||
|
float fDistanceFromCenterY = (kInstancePosition.y - m_fCenterY) * fooCellScale * m_fScale;
|
|||
|
if (fabs(fDistanceFromCenterX) >= m_fMiniMapRadius || fabs(fDistanceFromCenterY) >= m_fMiniMapRadius)
|
|||
|
continue;
|
|||
|
|
|||
|
float fDistanceFromCenter = sqrtf(fDistanceFromCenterX * fDistanceFromCenterX + fDistanceFromCenterY * fDistanceFromCenterY );
|
|||
|
if ( fDistanceFromCenter >= m_fMiniMapRadius )
|
|||
|
continue;
|
|||
|
|
|||
|
TMarkPosition aMarkPosition;
|
|||
|
|
|||
|
if (pkInstEach->IsPC() && !pkInstEach->IsInvisibility())
|
|||
|
{
|
|||
|
if (pkInstEach == CPythonCharacterManager::Instance().GetMainInstancePtr())
|
|||
|
continue;
|
|||
|
|
|||
|
aMarkPosition.m_fX = ( m_fWidth - (float)m_WhiteMark.GetWidth() ) / 2.0f + fDistanceFromCenterX + m_fScreenX;
|
|||
|
aMarkPosition.m_fY = ( m_fHeight - (float)m_WhiteMark.GetHeight() ) / 2.0f + fDistanceFromCenterY + m_fScreenY;
|
|||
|
aMarkPosition.m_eNameColor=pkInstEach->GetNameColorIndex();
|
|||
|
if (aMarkPosition.m_eNameColor==CInstanceBase::NAMECOLOR_PARTY)
|
|||
|
m_PartyPCPositionVector.push_back(aMarkPosition);
|
|||
|
else
|
|||
|
m_OtherPCPositionVector.push_back(aMarkPosition);
|
|||
|
}
|
|||
|
else if (pkInstEach->IsNPC())
|
|||
|
{
|
|||
|
aMarkPosition.m_fX = ( m_fWidth - (float)m_WhiteMark.GetWidth() ) / 2.0f + fDistanceFromCenterX + m_fScreenX;
|
|||
|
aMarkPosition.m_fY = ( m_fHeight - (float)m_WhiteMark.GetHeight() ) / 2.0f + fDistanceFromCenterY + m_fScreenY;
|
|||
|
|
|||
|
m_NPCPositionVector.push_back(aMarkPosition);
|
|||
|
}
|
|||
|
else if (pkInstEach->IsEnemy())
|
|||
|
{
|
|||
|
aMarkPosition.m_fX = ( m_fWidth - (float)m_WhiteMark.GetWidth() ) / 2.0f + fDistanceFromCenterX + m_fScreenX;
|
|||
|
aMarkPosition.m_fY = ( m_fHeight - (float)m_WhiteMark.GetHeight() ) / 2.0f + fDistanceFromCenterY + m_fScreenY;
|
|||
|
|
|||
|
m_MonsterPositionVector.push_back(aMarkPosition);
|
|||
|
}
|
|||
|
else if (pkInstEach->IsWarp())
|
|||
|
{
|
|||
|
aMarkPosition.m_fX = ( m_fWidth - (float)m_WhiteMark.GetWidth() ) / 2.0f + fDistanceFromCenterX + m_fScreenX;
|
|||
|
aMarkPosition.m_fY = ( m_fHeight - (float)m_WhiteMark.GetHeight() ) / 2.0f + fDistanceFromCenterY + m_fScreenY;
|
|||
|
|
|||
|
m_WarpPositionVector.push_back(aMarkPosition);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
{
|
|||
|
DWORD dwCurTime=ELTimer_GetMSec();
|
|||
|
|
|||
|
std::map<DWORD, SObserver>::iterator i;
|
|||
|
for (i=m_kMap_dwVID_kObserver.begin(); i!=m_kMap_dwVID_kObserver.end(); ++i)
|
|||
|
{
|
|||
|
SObserver& rkObserver=i->second;
|
|||
|
|
|||
|
float fPos=float(dwCurTime-rkObserver.dwSrcTime)/float(rkObserver.dwDstTime-rkObserver.dwSrcTime);
|
|||
|
if (fPos<0.0f) fPos=0.0f;
|
|||
|
else if (fPos>1.0f) fPos=1.0f;
|
|||
|
|
|||
|
rkObserver.fCurX=(rkObserver.fDstX-rkObserver.fSrcX)*fPos+rkObserver.fSrcX;
|
|||
|
rkObserver.fCurY=(rkObserver.fDstY-rkObserver.fSrcY)*fPos+rkObserver.fSrcY;
|
|||
|
|
|||
|
TPixelPosition kInstancePosition;
|
|||
|
kInstancePosition.x=rkObserver.fCurX;
|
|||
|
kInstancePosition.y=rkObserver.fCurY;
|
|||
|
kInstancePosition.z=0.0f;
|
|||
|
|
|||
|
float fDistanceFromCenterX = (kInstancePosition.x - m_fCenterX) * fooCellScale * m_fScale;
|
|||
|
float fDistanceFromCenterY = (kInstancePosition.y - m_fCenterY) * fooCellScale * m_fScale;
|
|||
|
if (fabs(fDistanceFromCenterX) >= m_fMiniMapRadius || fabs(fDistanceFromCenterY) >= m_fMiniMapRadius)
|
|||
|
continue;
|
|||
|
|
|||
|
float fDistanceFromCenter = sqrtf(fDistanceFromCenterX * fDistanceFromCenterX + fDistanceFromCenterY * fDistanceFromCenterY );
|
|||
|
if ( fDistanceFromCenter >= m_fMiniMapRadius )
|
|||
|
continue;
|
|||
|
|
|||
|
TMarkPosition aMarkPosition;
|
|||
|
aMarkPosition.m_fX = ( m_fWidth - (float)m_WhiteMark.GetWidth() ) / 2.0f + fDistanceFromCenterX + m_fScreenX;
|
|||
|
aMarkPosition.m_fY = ( m_fHeight - (float)m_WhiteMark.GetHeight() ) / 2.0f + fDistanceFromCenterY + m_fScreenY;
|
|||
|
aMarkPosition.m_eNameColor=CInstanceBase::NAMECOLOR_PARTY;
|
|||
|
m_PartyPCPositionVector.push_back(aMarkPosition);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
{
|
|||
|
TAtlasMarkInfoVector::iterator itor = m_AtlasWayPointInfoVector.begin();
|
|||
|
for (; itor != m_AtlasWayPointInfoVector.end(); ++itor)
|
|||
|
{
|
|||
|
TAtlasMarkInfo & rAtlasMarkInfo = *itor;
|
|||
|
|
|||
|
if (TYPE_TARGET != rAtlasMarkInfo.m_byType)
|
|||
|
continue;
|
|||
|
|
|||
|
if (0 != rAtlasMarkInfo.m_dwChrVID)
|
|||
|
{
|
|||
|
CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(rAtlasMarkInfo.m_dwChrVID);
|
|||
|
if (pInstance)
|
|||
|
{
|
|||
|
TPixelPosition kPixelPosition;
|
|||
|
pInstance->NEW_GetPixelPosition(&kPixelPosition);
|
|||
|
__UpdateWayPoint(&rAtlasMarkInfo, kPixelPosition.x, kPixelPosition.y);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
const float c_fMiniMapWindowRadius = 55.0f;
|
|||
|
|
|||
|
float fDistanceFromCenterX = (rAtlasMarkInfo.m_fX - m_fCenterX) * fooCellScale * m_fScale;
|
|||
|
float fDistanceFromCenterY = (rAtlasMarkInfo.m_fY - m_fCenterY) * fooCellScale * m_fScale;
|
|||
|
float fDistanceFromCenter = sqrtf(fDistanceFromCenterX * fDistanceFromCenterX + fDistanceFromCenterY * fDistanceFromCenterY );
|
|||
|
|
|||
|
if (fDistanceFromCenter >= c_fMiniMapWindowRadius)
|
|||
|
{
|
|||
|
float fRadianX = acosf(fDistanceFromCenterX / fDistanceFromCenter);
|
|||
|
float fRadianY = asinf(fDistanceFromCenterY / fDistanceFromCenter);
|
|||
|
fDistanceFromCenterX = 55.0f * cosf(fRadianX);
|
|||
|
fDistanceFromCenterY = 55.0f * sinf(fRadianY);
|
|||
|
rAtlasMarkInfo.m_fMiniMapX = ( m_fWidth - (float)m_WhiteMark.GetWidth() ) / 2.0f + fDistanceFromCenterX + m_fScreenX + 2.0f;
|
|||
|
rAtlasMarkInfo.m_fMiniMapY = ( m_fHeight - (float)m_WhiteMark.GetHeight() ) / 2.0f + fDistanceFromCenterY + m_fScreenY + 2.0f;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
rAtlasMarkInfo.m_fMiniMapX = ( m_fWidth - (float)m_WhiteMark.GetWidth() ) / 2.0f + fDistanceFromCenterX + m_fScreenX;
|
|||
|
rAtlasMarkInfo.m_fMiniMapY = ( m_fHeight - (float)m_WhiteMark.GetHeight() ) / 2.0f + fDistanceFromCenterY + m_fScreenY;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::Render(float fScreenX, float fScreenY)
|
|||
|
{
|
|||
|
CPythonBackground& rkBG=CPythonBackground::Instance();
|
|||
|
if (!rkBG.IsMapOutdoor())
|
|||
|
return;
|
|||
|
|
|||
|
if (!m_bShow)
|
|||
|
return;
|
|||
|
|
|||
|
if (!rkBG.IsMapReady())
|
|||
|
return;
|
|||
|
|
|||
|
if (m_fScreenX != fScreenX || m_fScreenY != fScreenY)
|
|||
|
{
|
|||
|
m_fScreenX = fScreenX;
|
|||
|
m_fScreenY = fScreenY;
|
|||
|
__SetPosition();
|
|||
|
}
|
|||
|
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_MIPFILTER, D3DTEXF_POINT);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_POINT);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_POINT);
|
|||
|
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
|
|||
|
|
|||
|
STATEMANAGER.SaveTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION);
|
|||
|
STATEMANAGER.SaveTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
|
|||
|
STATEMANAGER.SaveTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
|
|||
|
STATEMANAGER.SaveTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
|
|||
|
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
|
|||
|
|
|||
|
STATEMANAGER.SaveTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
|||
|
STATEMANAGER.SaveTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT);
|
|||
|
STATEMANAGER.SaveTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE);
|
|||
|
STATEMANAGER.SaveTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
|
|||
|
STATEMANAGER.SaveTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
|
|||
|
STATEMANAGER.SaveTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
|
|||
|
|
|||
|
STATEMANAGER.SaveRenderState(D3DRS_TEXTUREFACTOR, 0xFF000000);
|
|||
|
|
|||
|
STATEMANAGER.SetTexture(1, m_MiniMapFilterGraphicImageInstance.GetTexturePointer()->GetD3DTexture());
|
|||
|
STATEMANAGER.SetTransform(D3DTS_TEXTURE1, &m_matMiniMapCover);
|
|||
|
|
|||
|
STATEMANAGER.SetVertexShader(D3DFVF_XYZ | D3DFVF_TEX1);
|
|||
|
STATEMANAGER.SetStreamSource(0, m_VertexBuffer.GetD3DVertexBuffer(), 20);
|
|||
|
STATEMANAGER.SetIndices(m_IndexBuffer.GetD3DIndexBuffer(), 0);
|
|||
|
STATEMANAGER.SetTransform(D3DTS_WORLD, &m_matWorld);
|
|||
|
|
|||
|
for (BYTE byTerrainNum = 0; byTerrainNum < AROUND_AREA_NUM; ++byTerrainNum)
|
|||
|
{
|
|||
|
LPDIRECT3DTEXTURE8 pMiniMapTexture = m_lpMiniMapTexture[byTerrainNum];
|
|||
|
STATEMANAGER.SetTexture(0, pMiniMapTexture);
|
|||
|
if (pMiniMapTexture)
|
|||
|
{
|
|||
|
CStateManager& rkSttMgr=CStateManager::Instance();
|
|||
|
rkSttMgr.DrawIndexedPrimitive(D3DPT_TRIANGLELIST, byTerrainNum * 4, 4, byTerrainNum * 6, 2);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
|
|||
|
STATEMANAGER.DrawIndexedPrimitive(D3DPT_TRIANGLELIST, byTerrainNum * 4, 4, byTerrainNum * 6, 2);
|
|||
|
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
STATEMANAGER.RestoreRenderState(D3DRS_TEXTUREFACTOR);
|
|||
|
|
|||
|
STATEMANAGER.RestoreTextureStageState(1, D3DTSS_ALPHAARG2);
|
|||
|
STATEMANAGER.RestoreTextureStageState(1, D3DTSS_ALPHAARG1);
|
|||
|
STATEMANAGER.RestoreTextureStageState(1, D3DTSS_ALPHAOP);
|
|||
|
STATEMANAGER.RestoreTextureStageState(1, D3DTSS_COLORARG1);
|
|||
|
STATEMANAGER.RestoreTextureStageState(1, D3DTSS_COLORARG2);
|
|||
|
STATEMANAGER.RestoreTextureStageState(1, D3DTSS_COLOROP);
|
|||
|
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ALPHAARG2);
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ALPHAARG1);
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ALPHAOP);
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG1);
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG2);
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLOROP);
|
|||
|
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ADDRESSU);
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ADDRESSV);
|
|||
|
STATEMANAGER.RestoreTextureStageState(1, D3DTSS_TEXCOORDINDEX);
|
|||
|
STATEMANAGER.RestoreTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS);
|
|||
|
STATEMANAGER.RestoreTextureStageState(1, D3DTSS_ADDRESSU);
|
|||
|
STATEMANAGER.RestoreTextureStageState(1, D3DTSS_ADDRESSV);
|
|||
|
|
|||
|
SetDiffuseOperation();
|
|||
|
STATEMANAGER.SetTransform(D3DTS_WORLD, &m_matIdentity);
|
|||
|
|
|||
|
STATEMANAGER.SaveRenderState(D3DRS_TEXTUREFACTOR, 0xFFFFFFFF);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2);
|
|||
|
|
|||
|
TInstancePositionVectorIterator aIterator;
|
|||
|
|
|||
|
if (m_fScale >= 2.0f)
|
|||
|
{
|
|||
|
// Monster
|
|||
|
STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, CInstanceBase::GetIndexedNameColor(CInstanceBase::NAMECOLOR_MOB));//m_MarkTypeToColorMap[TYPE_MONSTER]);
|
|||
|
aIterator = m_MonsterPositionVector.begin();
|
|||
|
while (aIterator != m_MonsterPositionVector.end())
|
|||
|
{
|
|||
|
TMarkPosition & rPosition = *aIterator;
|
|||
|
m_WhiteMark.SetPosition(rPosition.m_fX, rPosition.m_fY);
|
|||
|
m_WhiteMark.Render();
|
|||
|
++aIterator;
|
|||
|
}
|
|||
|
|
|||
|
// Other PC
|
|||
|
aIterator = m_OtherPCPositionVector.begin();
|
|||
|
while (aIterator != m_OtherPCPositionVector.end())
|
|||
|
{
|
|||
|
TMarkPosition & rPosition = *aIterator;
|
|||
|
STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, CInstanceBase::GetIndexedNameColor(rPosition.m_eNameColor));
|
|||
|
m_WhiteMark.SetPosition(rPosition.m_fX, rPosition.m_fY);
|
|||
|
m_WhiteMark.Render();
|
|||
|
++aIterator;
|
|||
|
}
|
|||
|
|
|||
|
// Party PC
|
|||
|
if (!m_PartyPCPositionVector.empty())
|
|||
|
{
|
|||
|
float v = (1+sinf(CTimer::Instance().GetCurrentSecond()*6))/5+0.6;
|
|||
|
D3DXCOLOR c(CInstanceBase::GetIndexedNameColor(CInstanceBase::NAMECOLOR_PARTY));//(m_MarkTypeToColorMap[TYPE_PARTY]);
|
|||
|
D3DXCOLOR d(v,v,v,1);
|
|||
|
D3DXColorModulate(&c,&c,&d);
|
|||
|
STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, (DWORD)c);
|
|||
|
aIterator = m_PartyPCPositionVector.begin();
|
|||
|
while (aIterator != m_PartyPCPositionVector.end())
|
|||
|
{
|
|||
|
TMarkPosition & rPosition = *aIterator;
|
|||
|
m_WhiteMark.SetPosition(rPosition.m_fX, rPosition.m_fY);
|
|||
|
m_WhiteMark.Render();
|
|||
|
++aIterator;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// NPC
|
|||
|
STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, CInstanceBase::GetIndexedNameColor(CInstanceBase::NAMECOLOR_NPC));
|
|||
|
aIterator = m_NPCPositionVector.begin();
|
|||
|
while (aIterator != m_NPCPositionVector.end())
|
|||
|
{
|
|||
|
TMarkPosition & rPosition = *aIterator;
|
|||
|
m_WhiteMark.SetPosition(rPosition.m_fX, rPosition.m_fY);
|
|||
|
m_WhiteMark.Render();
|
|||
|
++aIterator;
|
|||
|
}
|
|||
|
|
|||
|
// Warp
|
|||
|
STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, CInstanceBase::GetIndexedNameColor(CInstanceBase::NAMECOLOR_WARP));
|
|||
|
aIterator = m_WarpPositionVector.begin();
|
|||
|
while (aIterator != m_WarpPositionVector.end())
|
|||
|
{
|
|||
|
TMarkPosition & rPosition = *aIterator;
|
|||
|
m_WhiteMark.SetPosition(rPosition.m_fX, rPosition.m_fY);
|
|||
|
m_WhiteMark.Render();
|
|||
|
++aIterator;
|
|||
|
}
|
|||
|
|
|||
|
STATEMANAGER.RestoreRenderState(D3DRS_TEXTUREFACTOR);
|
|||
|
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ALPHAARG2);
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ALPHAARG1);
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ALPHAOP);
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG1);
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG2);
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLOROP);
|
|||
|
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_MIPFILTER);
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_MINFILTER);
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_MAGFILTER);
|
|||
|
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
|
|||
|
|
|||
|
// ij<><C4B3><EFBFBD><EFBFBD> <20><>ũ
|
|||
|
CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetMainInstancePtr();
|
|||
|
|
|||
|
if (pkInst)
|
|||
|
{
|
|||
|
float fRotation;
|
|||
|
fRotation = (540.0f - pkInst->GetRotation());
|
|||
|
while(fRotation > 360.0f)
|
|||
|
fRotation -= 360.0f;
|
|||
|
while(fRotation < 0.0f)
|
|||
|
fRotation += 360.0f;
|
|||
|
|
|||
|
m_PlayerMark.SetRotation(fRotation);
|
|||
|
m_PlayerMark.Render();
|
|||
|
}
|
|||
|
|
|||
|
// Target
|
|||
|
{
|
|||
|
TAtlasMarkInfoVector::iterator itor = m_AtlasWayPointInfoVector.begin();
|
|||
|
for (; itor != m_AtlasWayPointInfoVector.end(); ++itor)
|
|||
|
{
|
|||
|
TAtlasMarkInfo & rAtlasMarkInfo = *itor;
|
|||
|
|
|||
|
if (TYPE_TARGET != rAtlasMarkInfo.m_byType)
|
|||
|
continue;
|
|||
|
if (rAtlasMarkInfo.m_fMiniMapX <= 0.0f)
|
|||
|
continue;
|
|||
|
if (rAtlasMarkInfo.m_fMiniMapY <= 0.0f)
|
|||
|
continue;
|
|||
|
|
|||
|
__RenderTargetMark(rAtlasMarkInfo.m_fMiniMapX, rAtlasMarkInfo.m_fMiniMapY);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
CCamera* pkCmrCur=CCameraManager::Instance().GetCurrentCamera();
|
|||
|
|
|||
|
// ī<><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
if (pkCmrCur)
|
|||
|
{
|
|||
|
m_MiniMapCameraraphicImageInstance.SetRotation(pkCmrCur->GetRoll());
|
|||
|
m_MiniMapCameraraphicImageInstance.Render();
|
|||
|
}
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_MINFILTER);
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_MAGFILTER);
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::SetScale(float fScale)
|
|||
|
{
|
|||
|
if (fScale >= 4.0f)
|
|||
|
fScale = 4.0f;
|
|||
|
if (fScale <= 0.5f)
|
|||
|
fScale = 0.5f;
|
|||
|
m_fScale = fScale;
|
|||
|
|
|||
|
__SetPosition();
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::ScaleUp()
|
|||
|
{
|
|||
|
m_fScale *= 2.0f;
|
|||
|
if (m_fScale >= 4.0f)
|
|||
|
m_fScale = 4.0f;
|
|||
|
__SetPosition();
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::ScaleDown()
|
|||
|
{
|
|||
|
m_fScale *= 0.5f;
|
|||
|
if (m_fScale <= 0.5f)
|
|||
|
m_fScale = 0.5f;
|
|||
|
__SetPosition();
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::SetMiniMapSize(float fWidth, float fHeight)
|
|||
|
{
|
|||
|
m_fWidth = fWidth;
|
|||
|
m_fHeight = fHeight;
|
|||
|
}
|
|||
|
|
|||
|
#pragma pack(push)
|
|||
|
#pragma pack(1)
|
|||
|
typedef struct _MINIMAPVERTEX
|
|||
|
{
|
|||
|
float x, y, z; // position
|
|||
|
float u, v; // normal
|
|||
|
} MINIMAPVERTEX, *LPMINIMAPVERTEX;
|
|||
|
#pragma pack(pop)
|
|||
|
|
|||
|
bool CPythonMiniMap::Create()
|
|||
|
{
|
|||
|
const std::string strImageRoot = "D:/ymir work/ui/";
|
|||
|
const std::string strImageFilter = strImageRoot + "minimap_image_filter.dds";
|
|||
|
const std::string strImageCamera = strImageRoot + "minimap_camera.dds";
|
|||
|
const std::string strPlayerMark = strImageRoot + "minimap/playermark.sub";
|
|||
|
const std::string strWhiteMark = strImageRoot + "minimap/whitemark.sub";
|
|||
|
|
|||
|
// <20>̴ϸ<CCB4> Ŀ<><C4BF>
|
|||
|
CGraphicImage * pImage = (CGraphicImage *) CResourceManager::Instance().GetResourcePointer(strImageFilter.c_str());
|
|||
|
m_MiniMapFilterGraphicImageInstance.SetImagePointer(pImage);
|
|||
|
pImage = (CGraphicImage *) CResourceManager::Instance().GetResourcePointer(strImageCamera.c_str());
|
|||
|
m_MiniMapCameraraphicImageInstance.SetImagePointer(pImage);
|
|||
|
|
|||
|
m_matMiniMapCover._11 = 1.0f / ((float)m_MiniMapFilterGraphicImageInstance.GetWidth());
|
|||
|
m_matMiniMapCover._22 = 1.0f / ((float)m_MiniMapFilterGraphicImageInstance.GetHeight());
|
|||
|
m_matMiniMapCover._33 = 0.0f;
|
|||
|
|
|||
|
// ij<><C4B3><EFBFBD><EFBFBD> <20><>ũ
|
|||
|
CGraphicSubImage * pSubImage = (CGraphicSubImage *) CResourceManager::Instance().GetResourcePointer(strPlayerMark.c_str());
|
|||
|
m_PlayerMark.SetImagePointer(pSubImage);
|
|||
|
|
|||
|
pSubImage = (CGraphicSubImage *) CResourceManager::Instance().GetResourcePointer(strWhiteMark.c_str());
|
|||
|
m_WhiteMark.SetImagePointer(pSubImage);
|
|||
|
|
|||
|
char buf[256];
|
|||
|
for (int i = 0; i < MINI_WAYPOINT_IMAGE_COUNT; ++i)
|
|||
|
{
|
|||
|
sprintf(buf, "%sminimap/mini_waypoint%02d.sub", strImageRoot.c_str(), i+1);
|
|||
|
m_MiniWayPointGraphicImageInstances[i].SetImagePointer((CGraphicSubImage *) CResourceManager::Instance().GetResourcePointer(buf));
|
|||
|
m_MiniWayPointGraphicImageInstances[i].SetRenderingMode(CGraphicExpandedImageInstance::RENDERING_MODE_SCREEN);
|
|||
|
}
|
|||
|
for (int j = 0; j < WAYPOINT_IMAGE_COUNT; ++j)
|
|||
|
{
|
|||
|
sprintf(buf, "%sminimap/waypoint%02d.sub", strImageRoot.c_str(), j+1);
|
|||
|
m_WayPointGraphicImageInstances[j].SetImagePointer((CGraphicSubImage *) CResourceManager::Instance().GetResourcePointer(buf));
|
|||
|
m_WayPointGraphicImageInstances[j].SetRenderingMode(CGraphicExpandedImageInstance::RENDERING_MODE_SCREEN);
|
|||
|
}
|
|||
|
for (int k = 0; k < TARGET_MARK_IMAGE_COUNT; ++k)
|
|||
|
{
|
|||
|
sprintf(buf, "%sminimap/targetmark%02d.sub", strImageRoot.c_str(), k+1);
|
|||
|
m_TargetMarkGraphicImageInstances[k].SetImagePointer((CGraphicSubImage *) CResourceManager::Instance().GetResourcePointer(buf));
|
|||
|
m_TargetMarkGraphicImageInstances[k].SetRenderingMode(CGraphicExpandedImageInstance::RENDERING_MODE_SCREEN);
|
|||
|
}
|
|||
|
|
|||
|
m_GuildAreaFlagImageInstance.SetImagePointer((CGraphicSubImage *) CResourceManager::Instance().GetResourcePointer("d:/ymir work/ui/minimap/GuildArea01.sub"));
|
|||
|
|
|||
|
// <20><EFBFBD><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
#pragma pack(push)
|
|||
|
#pragma pack(1)
|
|||
|
LPMINIMAPVERTEX lpMiniMapVertex;
|
|||
|
LPMINIMAPVERTEX lpOrigMiniMapVertex;
|
|||
|
#pragma pack(pop)
|
|||
|
|
|||
|
if (!m_VertexBuffer.Create(36, D3DFVF_XYZ | D3DFVF_TEX1, D3DUSAGE_WRITEONLY, D3DPOOL_MANAGED) )
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (m_VertexBuffer.Lock((void **) &lpOrigMiniMapVertex))
|
|||
|
{
|
|||
|
char * pchMiniMapVertex = (char *)lpOrigMiniMapVertex;
|
|||
|
memset(pchMiniMapVertex, 0, sizeof(char) * 720);
|
|||
|
lpMiniMapVertex = (LPMINIMAPVERTEX) pchMiniMapVertex;
|
|||
|
|
|||
|
for (int iY = -3; iY <= 1; ++iY)
|
|||
|
{
|
|||
|
if (0 == iY%2)
|
|||
|
continue;
|
|||
|
float fY = 0.5f * ((float)iY);
|
|||
|
for (int iX = -3; iX <= 1; ++iX)
|
|||
|
{
|
|||
|
if (0 == iX%2)
|
|||
|
continue;
|
|||
|
float fX = 0.5f * ((float)iX);
|
|||
|
lpMiniMapVertex = (LPMINIMAPVERTEX) pchMiniMapVertex;
|
|||
|
lpMiniMapVertex->x = fX;
|
|||
|
lpMiniMapVertex->y = fY;
|
|||
|
lpMiniMapVertex->z = 0.0f;
|
|||
|
lpMiniMapVertex->u = 0.0f;
|
|||
|
lpMiniMapVertex->v = 0.0f;
|
|||
|
pchMiniMapVertex += 20;
|
|||
|
lpMiniMapVertex = (LPMINIMAPVERTEX) pchMiniMapVertex;
|
|||
|
lpMiniMapVertex->x = fX;
|
|||
|
lpMiniMapVertex->y = fY + 1.0f;
|
|||
|
lpMiniMapVertex->z = 0.0f;
|
|||
|
lpMiniMapVertex->u = 0.0f;
|
|||
|
lpMiniMapVertex->v = 1.0f;
|
|||
|
pchMiniMapVertex += 20;
|
|||
|
lpMiniMapVertex = (LPMINIMAPVERTEX) pchMiniMapVertex;
|
|||
|
lpMiniMapVertex->x = fX + 1.0f;
|
|||
|
lpMiniMapVertex->y = fY;
|
|||
|
lpMiniMapVertex->z = 0.0f;
|
|||
|
lpMiniMapVertex->u = 1.0f;
|
|||
|
lpMiniMapVertex->v = 0.0f;
|
|||
|
pchMiniMapVertex += 20;
|
|||
|
lpMiniMapVertex = (LPMINIMAPVERTEX) pchMiniMapVertex;
|
|||
|
lpMiniMapVertex->x = fX + 1.0f;
|
|||
|
lpMiniMapVertex->y = fY + 1.0f;
|
|||
|
lpMiniMapVertex->z = 0.0f;
|
|||
|
lpMiniMapVertex->u = 1.0f;
|
|||
|
lpMiniMapVertex->v = 1.0f;
|
|||
|
pchMiniMapVertex += 20;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
m_VertexBuffer.Unlock();
|
|||
|
}
|
|||
|
|
|||
|
if (!m_IndexBuffer.Create(54, D3DFMT_INDEX16))
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
WORD pwIndices[54] =
|
|||
|
{
|
|||
|
0, 1, 2, 2, 1, 3,
|
|||
|
4, 5, 6, 6, 5, 7,
|
|||
|
8, 9, 10, 10, 9, 11,
|
|||
|
|
|||
|
12, 13, 14, 14, 13, 15,
|
|||
|
16, 17, 18, 18, 17, 19,
|
|||
|
20, 21, 22, 22, 21, 23,
|
|||
|
|
|||
|
24, 25, 26, 26, 25, 27,
|
|||
|
28, 29, 30, 30, 29, 31,
|
|||
|
32, 33, 34, 34, 33, 35
|
|||
|
};
|
|||
|
|
|||
|
void * pIndices;
|
|||
|
|
|||
|
if (m_IndexBuffer.Lock(&pIndices))
|
|||
|
{
|
|||
|
memcpy(pIndices, pwIndices, 54 * sizeof(WORD));
|
|||
|
m_IndexBuffer.Unlock();
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::__SetPosition()
|
|||
|
{
|
|||
|
m_fMiniMapRadius = fMIN(6400.0f / ((float) CTerrainImpl::CELLSCALE) * m_fScale, 64.0f);
|
|||
|
|
|||
|
m_matWorld._11 = m_fWidth * m_fScale;
|
|||
|
m_matWorld._22 = m_fHeight * m_fScale;
|
|||
|
m_matWorld._41 = (1.0f + m_fScale) * m_fWidth * 0.5f - m_fCenterCellX * m_fScale + m_fScreenX;
|
|||
|
m_matWorld._42 = (1.0f + m_fScale) * m_fHeight * 0.5f - m_fCenterCellY * m_fScale + m_fScreenY;
|
|||
|
|
|||
|
if (!m_MiniMapFilterGraphicImageInstance.IsEmpty())
|
|||
|
{
|
|||
|
m_matMiniMapCover._41 = -(m_fScreenX) / ((float)m_MiniMapFilterGraphicImageInstance.GetWidth());
|
|||
|
m_matMiniMapCover._42 = -(m_fScreenY) / ((float)m_MiniMapFilterGraphicImageInstance.GetHeight());
|
|||
|
}
|
|||
|
|
|||
|
if (!m_PlayerMark.IsEmpty())
|
|||
|
m_PlayerMark.SetPosition( ( m_fWidth - (float)m_PlayerMark.GetWidth() ) / 2.0f + m_fScreenX,
|
|||
|
( m_fHeight - (float)m_PlayerMark.GetHeight() ) / 2.0f + m_fScreenY );
|
|||
|
|
|||
|
if (!m_MiniMapCameraraphicImageInstance.IsEmpty())
|
|||
|
m_MiniMapCameraraphicImageInstance.SetPosition( ( m_fWidth - (float)m_MiniMapCameraraphicImageInstance.GetWidth() ) / 2.0f + m_fScreenX,
|
|||
|
( m_fHeight - (float)m_MiniMapCameraraphicImageInstance.GetHeight() ) / 2.0f + m_fScreenY );
|
|||
|
}
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
// Atlas
|
|||
|
|
|||
|
void CPythonMiniMap::ClearAtlasMarkInfo()
|
|||
|
{
|
|||
|
m_AtlasNPCInfoVector.clear();
|
|||
|
m_AtlasWarpInfoVector.clear();
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::RegisterAtlasMark(BYTE byType, const char * c_szName, long lx, long ly)
|
|||
|
{
|
|||
|
TAtlasMarkInfo aAtlasMarkInfo;
|
|||
|
|
|||
|
aAtlasMarkInfo.m_fX = float(lx);
|
|||
|
aAtlasMarkInfo.m_fY = float(ly);
|
|||
|
aAtlasMarkInfo.m_strText = c_szName;
|
|||
|
|
|||
|
aAtlasMarkInfo.m_fScreenX = aAtlasMarkInfo.m_fX / m_fAtlasMaxX * m_fAtlasImageSizeX - (float)m_WhiteMark.GetWidth() / 2.0f;
|
|||
|
aAtlasMarkInfo.m_fScreenY = aAtlasMarkInfo.m_fY / m_fAtlasMaxY * m_fAtlasImageSizeY - (float)m_WhiteMark.GetHeight() / 2.0f;
|
|||
|
|
|||
|
switch(byType)
|
|||
|
{
|
|||
|
case CActorInstance::TYPE_NPC:
|
|||
|
aAtlasMarkInfo.m_byType = TYPE_NPC;
|
|||
|
m_AtlasNPCInfoVector.push_back(aAtlasMarkInfo);
|
|||
|
break;
|
|||
|
case CActorInstance::TYPE_WARP:
|
|||
|
aAtlasMarkInfo.m_byType = TYPE_WARP;
|
|||
|
{
|
|||
|
int iPos = aAtlasMarkInfo.m_strText.find(" ");
|
|||
|
if (iPos >= 0)
|
|||
|
aAtlasMarkInfo.m_strText[iPos]=0;
|
|||
|
|
|||
|
}
|
|||
|
m_AtlasWarpInfoVector.push_back(aAtlasMarkInfo);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::ClearGuildArea()
|
|||
|
{
|
|||
|
m_GuildAreaInfoVector.clear();
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::RegisterGuildArea(DWORD dwID, DWORD dwGuildID, long x, long y, long width, long height)
|
|||
|
{
|
|||
|
TGuildAreaInfo kGuildAreaInfo;
|
|||
|
kGuildAreaInfo.dwGuildID = dwGuildID;
|
|||
|
kGuildAreaInfo.lx = x;
|
|||
|
kGuildAreaInfo.ly = y;
|
|||
|
kGuildAreaInfo.lwidth = width;
|
|||
|
kGuildAreaInfo.lheight = height;
|
|||
|
m_GuildAreaInfoVector.push_back(kGuildAreaInfo);
|
|||
|
}
|
|||
|
|
|||
|
DWORD CPythonMiniMap::GetGuildAreaID(DWORD x, DWORD y)
|
|||
|
{
|
|||
|
TGuildAreaInfoVectorIterator itor = m_GuildAreaInfoVector.begin();
|
|||
|
for (; itor != m_GuildAreaInfoVector.end(); ++itor)
|
|||
|
{
|
|||
|
TGuildAreaInfo & rAreaInfo = *itor;
|
|||
|
|
|||
|
if (x >= rAreaInfo.lx)
|
|||
|
if (y >= rAreaInfo.ly)
|
|||
|
if (x <= rAreaInfo.lx + rAreaInfo.lwidth)
|
|||
|
if (y <= rAreaInfo.ly + rAreaInfo.lheight)
|
|||
|
{
|
|||
|
return rAreaInfo.dwGuildID;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return 0xffffffff;
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::CreateTarget(int iID, const char * c_szName)
|
|||
|
{
|
|||
|
AddWayPoint(TYPE_TARGET, iID, 0.0f, 0.0f, c_szName);
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::UpdateTarget(int iID, int ix, int iy)
|
|||
|
{
|
|||
|
TAtlasMarkInfo * pkInfo;
|
|||
|
if (!__GetWayPoint(iID, &pkInfo))
|
|||
|
return;
|
|||
|
|
|||
|
if (0 != pkInfo->m_dwChrVID)
|
|||
|
{
|
|||
|
if (CPythonCharacterManager::Instance().GetInstancePtr(pkInfo->m_dwChrVID))
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (ix < m_dwAtlasBaseX)
|
|||
|
return;
|
|||
|
if (iy < m_dwAtlasBaseY)
|
|||
|
return;
|
|||
|
if (ix > m_dwAtlasBaseX+DWORD(m_fAtlasMaxX))
|
|||
|
return;
|
|||
|
if (iy > m_dwAtlasBaseY+DWORD(m_fAtlasMaxY))
|
|||
|
return;
|
|||
|
|
|||
|
__UpdateWayPoint(pkInfo, ix-int(m_dwAtlasBaseX), iy-int(m_dwAtlasBaseY));
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::CreateTarget(int iID, const char * c_szName, DWORD dwVID)
|
|||
|
{
|
|||
|
AddWayPoint(TYPE_TARGET, iID, 0.0f, 0.0f, c_szName, dwVID);
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::DeleteTarget(int iID)
|
|||
|
{
|
|||
|
RemoveWayPoint(iID);
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::__LoadAtlasMarkInfo()
|
|||
|
{
|
|||
|
ClearAtlasMarkInfo();
|
|||
|
ClearGuildArea();
|
|||
|
|
|||
|
CPythonBackground& rkBG=CPythonBackground::Instance();
|
|||
|
if (!rkBG.IsMapOutdoor())
|
|||
|
return;
|
|||
|
|
|||
|
CMapOutdoor& rkMap=rkBG.GetMapOutdoorRef();
|
|||
|
|
|||
|
// LOCALE
|
|||
|
char szAtlasMarkInfoFileName[64+1];
|
|||
|
_snprintf(szAtlasMarkInfoFileName, sizeof(szAtlasMarkInfoFileName), "%s/map/%s_point.txt", LocaleService_GetLocalePath(), rkMap.GetName().c_str());
|
|||
|
// END_OF_LOCALE
|
|||
|
|
|||
|
CTokenVectorMap stTokenVectorMap;
|
|||
|
|
|||
|
if (!LoadMultipleTextData(szAtlasMarkInfoFileName, stTokenVectorMap))
|
|||
|
{
|
|||
|
Tracef(" CPythonMiniMap::__LoadAtlasMarkInfo File Load %s ERROR\n", szAtlasMarkInfoFileName);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
const std::string strType[TYPE_COUNT] = { "OPC", "OPCPVP", "OPCPVPSELF", "NPC", "MONSTER", "WARP", "WAYPOINT" };
|
|||
|
|
|||
|
for (DWORD i = 0; i < stTokenVectorMap.size(); ++i)
|
|||
|
{
|
|||
|
char szMarkInfoName[32+1];
|
|||
|
_snprintf(szMarkInfoName, sizeof(szMarkInfoName), "%d", i);
|
|||
|
|
|||
|
if (stTokenVectorMap.end() == stTokenVectorMap.find(szMarkInfoName))
|
|||
|
continue;
|
|||
|
|
|||
|
const CTokenVector & rVector = stTokenVectorMap[szMarkInfoName];
|
|||
|
|
|||
|
const std::string & c_rstrType = rVector[0].c_str();
|
|||
|
const std::string & c_rstrPositionX = rVector[1].c_str();
|
|||
|
const std::string & c_rstrPositionY = rVector[2].c_str();
|
|||
|
const std::string & c_rstrText = rVector[3].c_str();
|
|||
|
|
|||
|
TAtlasMarkInfo aAtlasMarkInfo;
|
|||
|
|
|||
|
for ( int i = 0; i < TYPE_COUNT; ++i)
|
|||
|
{
|
|||
|
if (0 == c_rstrType.compare(strType[i]))
|
|||
|
aAtlasMarkInfo.m_byType = (BYTE)i;
|
|||
|
}
|
|||
|
aAtlasMarkInfo.m_fX = atof(c_rstrPositionX.c_str());
|
|||
|
aAtlasMarkInfo.m_fY = atof(c_rstrPositionY.c_str());
|
|||
|
aAtlasMarkInfo.m_strText = c_rstrText;
|
|||
|
|
|||
|
aAtlasMarkInfo.m_fScreenX = aAtlasMarkInfo.m_fX / m_fAtlasMaxX * m_fAtlasImageSizeX - (float)m_WhiteMark.GetWidth() / 2.0f;
|
|||
|
aAtlasMarkInfo.m_fScreenY = aAtlasMarkInfo.m_fY / m_fAtlasMaxY * m_fAtlasImageSizeY - (float)m_WhiteMark.GetHeight() / 2.0f;
|
|||
|
|
|||
|
switch(aAtlasMarkInfo.m_byType)
|
|||
|
{
|
|||
|
case TYPE_NPC:
|
|||
|
m_AtlasNPCInfoVector.push_back(aAtlasMarkInfo);
|
|||
|
break;
|
|||
|
case TYPE_WARP:
|
|||
|
m_AtlasWarpInfoVector.push_back(aAtlasMarkInfo);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
bool CPythonMiniMap::LoadAtlas()
|
|||
|
{
|
|||
|
CPythonBackground& rkBG=CPythonBackground::Instance();
|
|||
|
if (!rkBG.IsMapOutdoor())
|
|||
|
return false;
|
|||
|
|
|||
|
CMapOutdoor& rkMap=rkBG.GetMapOutdoorRef();
|
|||
|
|
|||
|
const char* playerMarkFileName = "d:/ymir work/ui/minimap/playermark.sub";
|
|||
|
|
|||
|
char atlasFileName[1024+1];
|
|||
|
snprintf(atlasFileName, sizeof(atlasFileName), "%s/atlas.sub", rkMap.GetName().c_str());
|
|||
|
if (!CEterPackManager::Instance().isExist(atlasFileName))
|
|||
|
{
|
|||
|
snprintf(atlasFileName, sizeof(atlasFileName), "d:/ymir work/ui/atlas/%s/atlas.sub", rkMap.GetName().c_str());
|
|||
|
}
|
|||
|
|
|||
|
m_AtlasImageInstance.Destroy();
|
|||
|
m_AtlasPlayerMark.Destroy();
|
|||
|
CGraphicImage* pkGrpImgAtlas = (CGraphicImage *) CResourceManager::Instance().GetResourcePointer(atlasFileName);
|
|||
|
if (pkGrpImgAtlas)
|
|||
|
{
|
|||
|
m_AtlasImageInstance.SetImagePointer(pkGrpImgAtlas);
|
|||
|
|
|||
|
if (pkGrpImgAtlas->IsEmpty())
|
|||
|
m_bAtlas=false;
|
|||
|
else
|
|||
|
m_bAtlas=true;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
}
|
|||
|
m_AtlasPlayerMark.SetImagePointer((CGraphicSubImage *) CResourceManager::Instance().GetResourcePointer(playerMarkFileName));
|
|||
|
|
|||
|
short sTerrainCountX, sTerrainCountY;
|
|||
|
rkMap.GetBaseXY(&m_dwAtlasBaseX, &m_dwAtlasBaseY);
|
|||
|
rkMap.GetTerrainCount(&sTerrainCountX, &sTerrainCountY);
|
|||
|
m_fAtlasMaxX = (float) sTerrainCountX * CTerrainImpl::TERRAIN_XSIZE;
|
|||
|
m_fAtlasMaxY = (float) sTerrainCountY * CTerrainImpl::TERRAIN_YSIZE;
|
|||
|
|
|||
|
m_fAtlasImageSizeX = (float) m_AtlasImageInstance.GetWidth();
|
|||
|
m_fAtlasImageSizeY = (float) m_AtlasImageInstance.GetHeight();
|
|||
|
|
|||
|
__LoadAtlasMarkInfo();
|
|||
|
|
|||
|
if (m_bShowAtlas)
|
|||
|
OpenAtlasWindow();
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::__GlobalPositionToAtlasPosition(long lx, long ly, float * pfx, float * pfy)
|
|||
|
{
|
|||
|
*pfx = lx / m_fAtlasMaxX * m_fAtlasImageSizeX;
|
|||
|
*pfy = ly / m_fAtlasMaxY * m_fAtlasImageSizeY;
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::UpdateAtlas()
|
|||
|
{
|
|||
|
CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetMainInstancePtr();
|
|||
|
|
|||
|
if (pkInst)
|
|||
|
{
|
|||
|
TPixelPosition kInstPos;
|
|||
|
pkInst->NEW_GetPixelPosition(&kInstPos);
|
|||
|
|
|||
|
float fRotation;
|
|||
|
fRotation = (540.0f - pkInst->GetRotation());
|
|||
|
while(fRotation > 360.0f)
|
|||
|
fRotation -= 360.0f;
|
|||
|
while(fRotation < 0.0f)
|
|||
|
fRotation += 360.0f;
|
|||
|
|
|||
|
m_AtlasPlayerMark.SetPosition(kInstPos.x / m_fAtlasMaxX * m_fAtlasImageSizeX - (float)m_AtlasPlayerMark.GetWidth() / 2.0f,
|
|||
|
kInstPos.y / m_fAtlasMaxY * m_fAtlasImageSizeY - (float)m_AtlasPlayerMark.GetHeight() / 2.0f);
|
|||
|
m_AtlasPlayerMark.SetRotation(fRotation);
|
|||
|
}
|
|||
|
|
|||
|
{
|
|||
|
TGuildAreaInfoVectorIterator itor = m_GuildAreaInfoVector.begin();
|
|||
|
for (; itor != m_GuildAreaInfoVector.end(); ++itor)
|
|||
|
{
|
|||
|
TGuildAreaInfo & rInfo = *itor;
|
|||
|
__GlobalPositionToAtlasPosition(rInfo.lx, rInfo.ly, &rInfo.fsxRender, &rInfo.fsyRender);
|
|||
|
__GlobalPositionToAtlasPosition(rInfo.lx+rInfo.lwidth, rInfo.ly+rInfo.lheight, &rInfo.fexRender, &rInfo.feyRender);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::RenderAtlas(float fScreenX, float fScreenY)
|
|||
|
{
|
|||
|
if (!m_bShowAtlas)
|
|||
|
return;
|
|||
|
|
|||
|
if (m_fAtlasScreenX != fScreenX || m_fAtlasScreenY != fScreenY)
|
|||
|
{
|
|||
|
m_matWorldAtlas._41 = fScreenX;
|
|||
|
m_matWorldAtlas._42 = fScreenY;
|
|||
|
m_fAtlasScreenX = fScreenX;
|
|||
|
m_fAtlasScreenY = fScreenY;
|
|||
|
}
|
|||
|
|
|||
|
STATEMANAGER.SetTransform(D3DTS_WORLD, &m_matWorldAtlas);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_POINT);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_POINT);
|
|||
|
m_AtlasImageInstance.Render();
|
|||
|
|
|||
|
STATEMANAGER.SaveRenderState(D3DRS_TEXTUREFACTOR, 0xFFFFFFFF);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
|
|||
|
|
|||
|
STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, CInstanceBase::GetIndexedNameColor(CInstanceBase::NAMECOLOR_NPC));
|
|||
|
m_AtlasMarkInfoVectorIterator = m_AtlasNPCInfoVector.begin();
|
|||
|
while (m_AtlasMarkInfoVectorIterator != m_AtlasNPCInfoVector.end())
|
|||
|
{
|
|||
|
TAtlasMarkInfo & rAtlasMarkInfo = *m_AtlasMarkInfoVectorIterator;
|
|||
|
m_WhiteMark.SetPosition(rAtlasMarkInfo.m_fScreenX, rAtlasMarkInfo.m_fScreenY);
|
|||
|
m_WhiteMark.Render();
|
|||
|
++m_AtlasMarkInfoVectorIterator;
|
|||
|
}
|
|||
|
|
|||
|
STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, CInstanceBase::GetIndexedNameColor(CInstanceBase::NAMECOLOR_WARP));
|
|||
|
m_AtlasMarkInfoVectorIterator = m_AtlasWarpInfoVector.begin();
|
|||
|
while (m_AtlasMarkInfoVectorIterator != m_AtlasWarpInfoVector.end())
|
|||
|
{
|
|||
|
TAtlasMarkInfo & rAtlasMarkInfo = *m_AtlasMarkInfoVectorIterator;
|
|||
|
m_WhiteMark.SetPosition(rAtlasMarkInfo.m_fScreenX, rAtlasMarkInfo.m_fScreenY);
|
|||
|
m_WhiteMark.Render();
|
|||
|
++m_AtlasMarkInfoVectorIterator;
|
|||
|
}
|
|||
|
|
|||
|
STATEMANAGER.SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
|
|||
|
STATEMANAGER.SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
|
|||
|
STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, CInstanceBase::GetIndexedNameColor(CInstanceBase::NAMECOLOR_WAYPOINT));
|
|||
|
m_AtlasMarkInfoVectorIterator = m_AtlasWayPointInfoVector.begin();
|
|||
|
for (; m_AtlasMarkInfoVectorIterator != m_AtlasWayPointInfoVector.end(); ++m_AtlasMarkInfoVectorIterator)
|
|||
|
{
|
|||
|
TAtlasMarkInfo & rAtlasMarkInfo = *m_AtlasMarkInfoVectorIterator;
|
|||
|
|
|||
|
if (rAtlasMarkInfo.m_fScreenX <= 0.0f)
|
|||
|
continue;
|
|||
|
if (rAtlasMarkInfo.m_fScreenY <= 0.0f)
|
|||
|
continue;
|
|||
|
|
|||
|
if (TYPE_TARGET == rAtlasMarkInfo.m_byType)
|
|||
|
{
|
|||
|
__RenderMiniWayPointMark(rAtlasMarkInfo.m_fScreenX, rAtlasMarkInfo.m_fScreenY);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
__RenderWayPointMark(rAtlasMarkInfo.m_fScreenX, rAtlasMarkInfo.m_fScreenY);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
STATEMANAGER.RestoreRenderState(D3DRS_TEXTUREFACTOR);
|
|||
|
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG1);
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG2);
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLOROP);
|
|||
|
|
|||
|
if ((ELTimer_GetMSec() / 500) % 2)
|
|||
|
m_AtlasPlayerMark.Render();
|
|||
|
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_MINFILTER);
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_MAGFILTER);
|
|||
|
STATEMANAGER.SetTransform(D3DTS_WORLD, &m_matIdentity);
|
|||
|
|
|||
|
{
|
|||
|
TGuildAreaInfoVectorIterator itor = m_GuildAreaInfoVector.begin();
|
|||
|
for (; itor != m_GuildAreaInfoVector.end(); ++itor)
|
|||
|
{
|
|||
|
TGuildAreaInfo & rInfo = *itor;
|
|||
|
|
|||
|
m_GuildAreaFlagImageInstance.SetPosition(fScreenX+(rInfo.fsxRender+rInfo.fexRender)/2.0f - m_GuildAreaFlagImageInstance.GetWidth()/2,
|
|||
|
fScreenY+(rInfo.fsyRender+rInfo.feyRender)/2.0f - m_GuildAreaFlagImageInstance.GetHeight()/2);
|
|||
|
m_GuildAreaFlagImageInstance.Render();
|
|||
|
|
|||
|
// CScreen::RenderBar2d(fScreenX+rInfo.fsxRender,
|
|||
|
// fScreenY+rInfo.fsyRender,
|
|||
|
// fScreenX+rInfo.fexRender,
|
|||
|
// fScreenY+rInfo.feyRender);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
bool CPythonMiniMap::GetPickedInstanceInfo(float fScreenX, float fScreenY, std::string & rReturnName, float * pReturnPosX, float * pReturnPosY, DWORD * pdwTextColor)
|
|||
|
{
|
|||
|
float fDistanceFromMiniMapCenterX = fScreenX - m_fScreenX - m_fWidth * 0.5f;
|
|||
|
float fDistanceFromMiniMapCenterY = fScreenY - m_fScreenY - m_fHeight * 0.5f;
|
|||
|
|
|||
|
if (sqrtf(fDistanceFromMiniMapCenterX * fDistanceFromMiniMapCenterX + fDistanceFromMiniMapCenterY * fDistanceFromMiniMapCenterY) > m_fMiniMapRadius )
|
|||
|
return false;
|
|||
|
|
|||
|
float fRealX = m_fCenterX + fDistanceFromMiniMapCenterX / m_fScale * ((float) CTerrainImpl::CELLSCALE);
|
|||
|
float fRealY = m_fCenterY + fDistanceFromMiniMapCenterY / m_fScale * ((float) CTerrainImpl::CELLSCALE);
|
|||
|
|
|||
|
CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetMainInstancePtr();
|
|||
|
|
|||
|
if (pkInst)
|
|||
|
{
|
|||
|
TPixelPosition kInstPos;
|
|||
|
pkInst->NEW_GetPixelPosition(&kInstPos);
|
|||
|
|
|||
|
if (fabs(kInstPos.x - fRealX) < ((float) CTerrainImpl::CELLSCALE) * 6.0f / m_fScale &&
|
|||
|
fabs(kInstPos.y - fRealY) < ((float) CTerrainImpl::CELLSCALE) * 6.0f / m_fScale)
|
|||
|
{
|
|||
|
rReturnName = pkInst->GetNameString();
|
|||
|
*pReturnPosX = kInstPos.x;
|
|||
|
*pReturnPosY = kInstPos.y;
|
|||
|
*pdwTextColor = pkInst->GetNameColor();
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (m_fScale < 1.0f)
|
|||
|
return false;
|
|||
|
|
|||
|
CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
|
|||
|
CPythonCharacterManager::CharacterIterator i;
|
|||
|
for(i = rkChrMgr.CharacterInstanceBegin(); i!=rkChrMgr.CharacterInstanceEnd(); ++i)
|
|||
|
{
|
|||
|
CInstanceBase* pkInstEach=*i;
|
|||
|
if (pkInstEach->IsInvisibility())
|
|||
|
continue;
|
|||
|
if (m_fScale < 2.0f && (pkInstEach->IsEnemy() || pkInstEach->IsPC()))
|
|||
|
continue;
|
|||
|
TPixelPosition kInstancePosition;
|
|||
|
pkInstEach->NEW_GetPixelPosition(&kInstancePosition);
|
|||
|
|
|||
|
if (fabs(kInstancePosition.x - fRealX) < ((float) CTerrainImpl::CELLSCALE) * 3.0f / m_fScale &&
|
|||
|
fabs(kInstancePosition.y - fRealY) < ((float) CTerrainImpl::CELLSCALE) * 3.0f / m_fScale)
|
|||
|
{
|
|||
|
rReturnName = pkInstEach->GetNameString();
|
|||
|
*pReturnPosX = kInstancePosition.x;
|
|||
|
*pReturnPosY = kInstancePosition.y;
|
|||
|
*pdwTextColor = pkInstEach->GetNameColor();
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
bool CPythonMiniMap::GetAtlasInfo(float fScreenX, float fScreenY, std::string & rReturnString, float * pReturnPosX, float * pReturnPosY, DWORD * pdwTextColor, DWORD * pdwGuildID)
|
|||
|
{
|
|||
|
float fRealX = (fScreenX - m_fAtlasScreenX) * (m_fAtlasMaxX / m_fAtlasImageSizeX);
|
|||
|
float fRealY = (fScreenY - m_fAtlasScreenY) * (m_fAtlasMaxY / m_fAtlasImageSizeY);
|
|||
|
|
|||
|
//((float) CTerrainImpl::CELLSCALE) * 10.0f
|
|||
|
float fCheckWidth = (m_fAtlasMaxX / m_fAtlasImageSizeX) * 5.0f;
|
|||
|
float fCheckHeight = (m_fAtlasMaxY / m_fAtlasImageSizeY) * 5.0f;
|
|||
|
|
|||
|
CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetMainInstancePtr();
|
|||
|
|
|||
|
if (pkInst)
|
|||
|
{
|
|||
|
TPixelPosition kInstPos;
|
|||
|
pkInst->NEW_GetPixelPosition(&kInstPos);
|
|||
|
|
|||
|
if (kInstPos.x-fCheckWidth<fRealX && kInstPos.x+fCheckWidth>fRealX &&
|
|||
|
kInstPos.y-fCheckHeight<fRealY && kInstPos.y+fCheckHeight>fRealY)
|
|||
|
{
|
|||
|
rReturnString = pkInst->GetNameString();
|
|||
|
*pReturnPosX = kInstPos.x;
|
|||
|
*pReturnPosY = kInstPos.y;
|
|||
|
*pdwTextColor = pkInst->GetNameColor();
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
m_AtlasMarkInfoVectorIterator = m_AtlasNPCInfoVector.begin();
|
|||
|
while (m_AtlasMarkInfoVectorIterator != m_AtlasNPCInfoVector.end())
|
|||
|
{
|
|||
|
TAtlasMarkInfo & rAtlasMarkInfo = *m_AtlasMarkInfoVectorIterator;
|
|||
|
|
|||
|
if (rAtlasMarkInfo.m_fX-fCheckWidth/2<fRealX && rAtlasMarkInfo.m_fX+fCheckWidth>fRealX &&
|
|||
|
rAtlasMarkInfo.m_fY-fCheckWidth/2<fRealY && rAtlasMarkInfo.m_fY+fCheckHeight>fRealY)
|
|||
|
{
|
|||
|
rReturnString = rAtlasMarkInfo.m_strText;
|
|||
|
*pReturnPosX = rAtlasMarkInfo.m_fX;
|
|||
|
*pReturnPosY = rAtlasMarkInfo.m_fY;
|
|||
|
*pdwTextColor = CInstanceBase::GetIndexedNameColor(CInstanceBase::NAMECOLOR_NPC);//m_MarkTypeToColorMap[rAtlasMarkInfo.m_byType];
|
|||
|
return true;
|
|||
|
}
|
|||
|
++m_AtlasMarkInfoVectorIterator;
|
|||
|
}
|
|||
|
|
|||
|
m_AtlasMarkInfoVectorIterator = m_AtlasWarpInfoVector.begin();
|
|||
|
while (m_AtlasMarkInfoVectorIterator != m_AtlasWarpInfoVector.end())
|
|||
|
{
|
|||
|
TAtlasMarkInfo & rAtlasMarkInfo = *m_AtlasMarkInfoVectorIterator;
|
|||
|
if (rAtlasMarkInfo.m_fX-fCheckWidth/2<fRealX && rAtlasMarkInfo.m_fX+fCheckWidth>fRealX &&
|
|||
|
rAtlasMarkInfo.m_fY-fCheckWidth/2<fRealY && rAtlasMarkInfo.m_fY+fCheckHeight>fRealY)
|
|||
|
{
|
|||
|
rReturnString = rAtlasMarkInfo.m_strText;
|
|||
|
*pReturnPosX = rAtlasMarkInfo.m_fX;
|
|||
|
*pReturnPosY = rAtlasMarkInfo.m_fY;
|
|||
|
*pdwTextColor = CInstanceBase::GetIndexedNameColor(CInstanceBase::NAMECOLOR_WARP);//m_MarkTypeToColorMap[rAtlasMarkInfo.m_byType];
|
|||
|
return true;
|
|||
|
}
|
|||
|
++m_AtlasMarkInfoVectorIterator;
|
|||
|
}
|
|||
|
|
|||
|
m_AtlasMarkInfoVectorIterator = m_AtlasWayPointInfoVector.begin();
|
|||
|
while (m_AtlasMarkInfoVectorIterator != m_AtlasWayPointInfoVector.end())
|
|||
|
{
|
|||
|
TAtlasMarkInfo & rAtlasMarkInfo = *m_AtlasMarkInfoVectorIterator;
|
|||
|
if (rAtlasMarkInfo.m_fScreenX > 0.0f)
|
|||
|
if (rAtlasMarkInfo.m_fScreenY > 0.0f)
|
|||
|
if (rAtlasMarkInfo.m_fX-fCheckWidth/2<fRealX && rAtlasMarkInfo.m_fX+fCheckWidth>fRealX &&
|
|||
|
rAtlasMarkInfo.m_fY-fCheckWidth/2<fRealY && rAtlasMarkInfo.m_fY+fCheckHeight>fRealY)
|
|||
|
{
|
|||
|
rReturnString = rAtlasMarkInfo.m_strText;
|
|||
|
*pReturnPosX = rAtlasMarkInfo.m_fX;
|
|||
|
*pReturnPosY = rAtlasMarkInfo.m_fY;
|
|||
|
*pdwTextColor = CInstanceBase::GetIndexedNameColor(CInstanceBase::NAMECOLOR_WAYPOINT);//m_MarkTypeToColorMap[rAtlasMarkInfo.m_byType];
|
|||
|
return true;
|
|||
|
}
|
|||
|
++m_AtlasMarkInfoVectorIterator;
|
|||
|
}
|
|||
|
|
|||
|
TGuildAreaInfoVector::iterator itor = m_GuildAreaInfoVector.begin();
|
|||
|
for (; itor!=m_GuildAreaInfoVector.end(); ++itor)
|
|||
|
{
|
|||
|
TGuildAreaInfo & rInfo = *itor;
|
|||
|
if (fScreenX - m_fAtlasScreenX >= rInfo.fsxRender)
|
|||
|
if (fScreenY - m_fAtlasScreenY >= rInfo.fsyRender)
|
|||
|
if (fScreenX - m_fAtlasScreenX <= rInfo.fexRender)
|
|||
|
if (fScreenY - m_fAtlasScreenY <= rInfo.feyRender)
|
|||
|
{
|
|||
|
if (CPythonGuild::Instance().GetGuildName(rInfo.dwGuildID, &rReturnString))
|
|||
|
{
|
|||
|
*pdwGuildID = rInfo.dwGuildID;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
rReturnString = "empty_guild_area";
|
|||
|
}
|
|||
|
|
|||
|
*pReturnPosX = rInfo.lx + rInfo.lwidth/2;
|
|||
|
*pReturnPosY = rInfo.ly + rInfo.lheight/2;
|
|||
|
*pdwTextColor = CInstanceBase::GetIndexedNameColor(CInstanceBase::NAMECOLOR_PARTY);
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
bool CPythonMiniMap::GetAtlasSize(float * pfSizeX, float * pfSizeY)
|
|||
|
{
|
|||
|
CPythonBackground& rkBG=CPythonBackground::Instance();
|
|||
|
if (!rkBG.IsMapOutdoor())
|
|||
|
return false;
|
|||
|
|
|||
|
*pfSizeX = m_fAtlasImageSizeX;
|
|||
|
*pfSizeY = m_fAtlasImageSizeY;
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
// Atlas
|
|||
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
// WayPoint
|
|||
|
void CPythonMiniMap::AddWayPoint(BYTE byType, DWORD dwID, float fX, float fY, std::string strText, DWORD dwChrVID)
|
|||
|
{
|
|||
|
m_AtlasMarkInfoVectorIterator = m_AtlasWayPointInfoVector.begin();
|
|||
|
while (m_AtlasMarkInfoVectorIterator != m_AtlasWayPointInfoVector.end())
|
|||
|
{
|
|||
|
TAtlasMarkInfo & rAtlasMarkInfo = *m_AtlasMarkInfoVectorIterator;
|
|||
|
if (rAtlasMarkInfo.m_dwID == dwID)
|
|||
|
return;
|
|||
|
++m_AtlasMarkInfoVectorIterator;
|
|||
|
}
|
|||
|
|
|||
|
TAtlasMarkInfo aAtlasMarkInfo;
|
|||
|
aAtlasMarkInfo.m_byType = byType;
|
|||
|
aAtlasMarkInfo.m_dwID = dwID;
|
|||
|
aAtlasMarkInfo.m_fX = fX;
|
|||
|
aAtlasMarkInfo.m_fY = fY;
|
|||
|
aAtlasMarkInfo.m_fScreenX = 0.0f;
|
|||
|
aAtlasMarkInfo.m_fScreenY = 0.0f;
|
|||
|
aAtlasMarkInfo.m_fMiniMapX = 0.0f;
|
|||
|
aAtlasMarkInfo.m_fMiniMapY = 0.0f;
|
|||
|
aAtlasMarkInfo.m_strText = strText;
|
|||
|
aAtlasMarkInfo.m_dwChrVID = dwChrVID;
|
|||
|
__UpdateWayPoint(&aAtlasMarkInfo, fX, fY);
|
|||
|
m_AtlasWayPointInfoVector.push_back(aAtlasMarkInfo);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::RemoveWayPoint(DWORD dwID)
|
|||
|
{
|
|||
|
m_AtlasMarkInfoVectorIterator = m_AtlasWayPointInfoVector.begin();
|
|||
|
while (m_AtlasMarkInfoVectorIterator != m_AtlasWayPointInfoVector.end())
|
|||
|
{
|
|||
|
TAtlasMarkInfo & rAtlasMarkInfo = *m_AtlasMarkInfoVectorIterator;
|
|||
|
if (rAtlasMarkInfo.m_dwID == dwID)
|
|||
|
{
|
|||
|
m_AtlasMarkInfoVectorIterator = m_AtlasWayPointInfoVector.erase(m_AtlasMarkInfoVectorIterator);
|
|||
|
return;
|
|||
|
}
|
|||
|
++m_AtlasMarkInfoVectorIterator;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
bool CPythonMiniMap::__GetWayPoint(DWORD dwID, TAtlasMarkInfo ** ppkInfo)
|
|||
|
{
|
|||
|
TAtlasMarkInfoVectorIterator itor = m_AtlasWayPointInfoVector.begin();
|
|||
|
for (; itor != m_AtlasWayPointInfoVector.end(); ++itor)
|
|||
|
{
|
|||
|
TAtlasMarkInfo & rInfo = *itor;
|
|||
|
if (dwID == rInfo.m_dwID)
|
|||
|
{
|
|||
|
*ppkInfo = &rInfo;
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::__UpdateWayPoint(TAtlasMarkInfo * pkInfo, int ix, int iy)
|
|||
|
{
|
|||
|
pkInfo->m_fX = float(ix);
|
|||
|
pkInfo->m_fY = float(iy);
|
|||
|
pkInfo->m_fScreenX = pkInfo->m_fX / m_fAtlasMaxX * m_fAtlasImageSizeX;
|
|||
|
pkInfo->m_fScreenY = pkInfo->m_fY / m_fAtlasMaxY * m_fAtlasImageSizeY;
|
|||
|
}
|
|||
|
|
|||
|
// WayPoint
|
|||
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
void CPythonMiniMap::__RenderWayPointMark(int ixCenter, int iyCenter)
|
|||
|
{
|
|||
|
int iNum = (ELTimer_GetMSec() / 67) % WAYPOINT_IMAGE_COUNT;
|
|||
|
|
|||
|
CGraphicImageInstance & rInstance = m_WayPointGraphicImageInstances[iNum];
|
|||
|
rInstance.SetPosition(ixCenter - rInstance.GetWidth()/2, iyCenter - rInstance.GetHeight()/2);
|
|||
|
rInstance.Render();
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::__RenderMiniWayPointMark(int ixCenter, int iyCenter)
|
|||
|
{
|
|||
|
int iNum = (ELTimer_GetMSec() / 67) % MINI_WAYPOINT_IMAGE_COUNT;
|
|||
|
|
|||
|
CGraphicImageInstance & rInstance = m_MiniWayPointGraphicImageInstances[iNum];
|
|||
|
rInstance.SetPosition(ixCenter - rInstance.GetWidth()/2, iyCenter - rInstance.GetHeight()/2);
|
|||
|
rInstance.Render();
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::__RenderTargetMark(int ixCenter, int iyCenter)
|
|||
|
{
|
|||
|
int iNum = (ELTimer_GetMSec() / 80) % TARGET_MARK_IMAGE_COUNT;
|
|||
|
|
|||
|
CGraphicImageInstance & rInstance = m_TargetMarkGraphicImageInstances[iNum];
|
|||
|
rInstance.SetPosition(ixCenter - rInstance.GetWidth()/2, iyCenter - rInstance.GetHeight()/2);
|
|||
|
rInstance.Render();
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::AddSignalPoint(float fX, float fY)
|
|||
|
{
|
|||
|
static unsigned int g_id = 255;
|
|||
|
|
|||
|
TSignalPoint sp;
|
|||
|
sp.id = g_id;
|
|||
|
sp.v2Pos.x = fX;
|
|||
|
sp.v2Pos.y = fY;
|
|||
|
|
|||
|
m_SignalPointVector.push_back(sp);
|
|||
|
|
|||
|
AddWayPoint(TYPE_WAYPOINT, g_id, fX, fY, "");
|
|||
|
|
|||
|
g_id++;
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::ClearAllSignalPoint()
|
|||
|
{
|
|||
|
std::vector<TSignalPoint>::iterator it;
|
|||
|
for(it = m_SignalPointVector.begin();it!=m_SignalPointVector.end();++it)
|
|||
|
{
|
|||
|
RemoveWayPoint(it->id);
|
|||
|
}
|
|||
|
m_SignalPointVector.clear();
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::RegisterAtlasWindow(PyObject* poHandler)
|
|||
|
{
|
|||
|
m_poHandler = poHandler;
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::UnregisterAtlasWindow()
|
|||
|
{
|
|||
|
m_poHandler = 0;
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::OpenAtlasWindow()
|
|||
|
{
|
|||
|
if (m_poHandler)
|
|||
|
{
|
|||
|
PyCallClassMemberFunc(m_poHandler,"Show", Py_BuildValue("()"));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::SetAtlasCenterPosition(int x, int y)
|
|||
|
{
|
|||
|
if (m_poHandler)
|
|||
|
{
|
|||
|
//int sw = UI::CWindowManager::Instance().GetScreenWidth();
|
|||
|
//int sh = UI::CWindowManager::Instance().GetScreenHeight();
|
|||
|
//PyCallClassMemberFunc(m_poHandler,"SetPosition", Py_BuildValue("(ii)",sw/2+x,sh/2+y));
|
|||
|
PyCallClassMemberFunc(m_poHandler,"SetCenterPositionAdjust", Py_BuildValue("(ii)",x,y));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
bool CPythonMiniMap::IsAtlas()
|
|||
|
{
|
|||
|
return m_bAtlas;
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::ShowAtlas()
|
|||
|
{
|
|||
|
m_bShowAtlas=true;
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::HideAtlas()
|
|||
|
{
|
|||
|
m_bShowAtlas=false;
|
|||
|
}
|
|||
|
|
|||
|
bool CPythonMiniMap::CanShowAtlas()
|
|||
|
{
|
|||
|
return m_bShowAtlas;
|
|||
|
}
|
|||
|
|
|||
|
bool CPythonMiniMap::CanShow()
|
|||
|
{
|
|||
|
return m_bShow;
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::Show()
|
|||
|
{
|
|||
|
m_bShow=true;
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::Hide()
|
|||
|
{
|
|||
|
m_bShow=false;
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::__Initialize()
|
|||
|
{
|
|||
|
m_poHandler = 0;
|
|||
|
|
|||
|
SetMiniMapSize(128.0f, 128.0f);
|
|||
|
|
|||
|
m_fScale = 2.0f;
|
|||
|
|
|||
|
m_fCenterX = m_fWidth * 0.5f;
|
|||
|
m_fCenterY = m_fHeight * 0.5f;
|
|||
|
|
|||
|
m_fScreenX = 0.0f;
|
|||
|
m_fScreenY = 0.0f;
|
|||
|
|
|||
|
m_fAtlasScreenX = 0.0f;
|
|||
|
m_fAtlasScreenY = 0.0f;
|
|||
|
|
|||
|
m_dwAtlasBaseX = 0;
|
|||
|
m_dwAtlasBaseY = 0;
|
|||
|
|
|||
|
m_fAtlasMaxX = 0.0f;
|
|||
|
m_fAtlasMaxY = 0.0f;
|
|||
|
|
|||
|
m_fAtlasImageSizeX = 0.0f;
|
|||
|
m_fAtlasImageSizeY = 0.0f;
|
|||
|
|
|||
|
m_bAtlas = false;
|
|||
|
|
|||
|
m_bShow = false;
|
|||
|
m_bShowAtlas = false;
|
|||
|
|
|||
|
D3DXMatrixIdentity(&m_matIdentity);
|
|||
|
D3DXMatrixIdentity(&m_matWorld);
|
|||
|
D3DXMatrixIdentity(&m_matMiniMapCover);
|
|||
|
D3DXMatrixIdentity(&m_matWorldAtlas);
|
|||
|
}
|
|||
|
|
|||
|
void CPythonMiniMap::Destroy()
|
|||
|
{
|
|||
|
ClearAllSignalPoint();
|
|||
|
m_poHandler = 0;
|
|||
|
|
|||
|
m_VertexBuffer.Destroy();
|
|||
|
m_IndexBuffer.Destroy();
|
|||
|
|
|||
|
m_PlayerMark.Destroy();
|
|||
|
|
|||
|
m_MiniMapFilterGraphicImageInstance.Destroy();
|
|||
|
m_MiniMapCameraraphicImageInstance.Destroy();
|
|||
|
|
|||
|
m_AtlasWayPointInfoVector.clear();
|
|||
|
m_AtlasImageInstance.Destroy();
|
|||
|
m_AtlasPlayerMark.Destroy();
|
|||
|
m_WhiteMark.Destroy();
|
|||
|
|
|||
|
for (int i = 0; i < MINI_WAYPOINT_IMAGE_COUNT; ++i)
|
|||
|
m_MiniWayPointGraphicImageInstances[i].Destroy();
|
|||
|
for (int j = 0; j < WAYPOINT_IMAGE_COUNT; ++j)
|
|||
|
m_WayPointGraphicImageInstances[j].Destroy();
|
|||
|
for (int k = 0; k < TARGET_MARK_IMAGE_COUNT; ++k)
|
|||
|
m_TargetMarkGraphicImageInstances[k].Destroy();
|
|||
|
|
|||
|
m_GuildAreaFlagImageInstance.Destroy();
|
|||
|
|
|||
|
__Initialize();
|
|||
|
}
|
|||
|
|
|||
|
CPythonMiniMap::CPythonMiniMap()
|
|||
|
{
|
|||
|
__Initialize();
|
|||
|
}
|
|||
|
|
|||
|
CPythonMiniMap::~CPythonMiniMap()
|
|||
|
{
|
|||
|
Destroy();
|
|||
|
}
|