forked from metin-server/m2dev-client-src
character instance sorting to reduce overdraw
This commit is contained in:
@@ -422,11 +422,24 @@ bool CPythonCharacterManager::IsDeadVID(DWORD dwVID)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// let's sort character instances by their distance to the camera
|
||||||
|
// to avoid overdrawing
|
||||||
struct LessCharacterInstancePtrRenderOrder
|
struct LessCharacterInstancePtrRenderOrder
|
||||||
{
|
{
|
||||||
|
D3DXVECTOR3 v3CameraPosition;
|
||||||
bool operator() (CInstanceBase* pkLeft, CInstanceBase* pkRight)
|
bool operator() (CInstanceBase* pkLeft, CInstanceBase* pkRight)
|
||||||
{
|
{
|
||||||
return pkLeft->LessRenderOrder(pkRight);
|
D3DXVECTOR3 v3Left, v3Right;
|
||||||
|
pkLeft->NEW_GetPixelPosition(&v3Left);
|
||||||
|
pkRight->NEW_GetPixelPosition(&v3Right);
|
||||||
|
|
||||||
|
v3Left.y *= -1;
|
||||||
|
v3Right.y *= -1;
|
||||||
|
|
||||||
|
D3DXVECTOR3 v3LeftDiff = v3Left - v3CameraPosition;
|
||||||
|
D3DXVECTOR3 v3RightDiff = v3Right - v3CameraPosition;
|
||||||
|
|
||||||
|
return D3DXVec3Dot(&v3LeftDiff, &v3LeftDiff) < D3DXVec3Dot(&v3RightDiff, &v3RightDiff);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -459,12 +472,19 @@ void CPythonCharacterManager::__RenderSortedAliveActorList()
|
|||||||
static std::vector<CInstanceBase*> s_kVct_pkInstAliveSort;
|
static std::vector<CInstanceBase*> s_kVct_pkInstAliveSort;
|
||||||
s_kVct_pkInstAliveSort.clear();
|
s_kVct_pkInstAliveSort.clear();
|
||||||
|
|
||||||
|
CCamera* pCamera = CCameraManager::instance().GetCurrentCamera();
|
||||||
|
if (!pCamera)
|
||||||
|
return;
|
||||||
|
|
||||||
TCharacterInstanceMap& rkMap_pkInstAlive=m_kAliveInstMap;
|
TCharacterInstanceMap& rkMap_pkInstAlive=m_kAliveInstMap;
|
||||||
TCharacterInstanceMap::iterator i;
|
TCharacterInstanceMap::iterator i;
|
||||||
for (i=rkMap_pkInstAlive.begin(); i!=rkMap_pkInstAlive.end(); ++i)
|
for (i=rkMap_pkInstAlive.begin(); i!=rkMap_pkInstAlive.end(); ++i)
|
||||||
s_kVct_pkInstAliveSort.push_back(i->second);
|
s_kVct_pkInstAliveSort.push_back(i->second);
|
||||||
|
|
||||||
std::sort(s_kVct_pkInstAliveSort.begin(), s_kVct_pkInstAliveSort.end(), LessCharacterInstancePtrRenderOrder());
|
LessCharacterInstancePtrRenderOrder fSortFunc;
|
||||||
|
fSortFunc.v3CameraPosition = pCamera->GetEye();
|
||||||
|
|
||||||
|
std::sort(s_kVct_pkInstAliveSort.begin(), s_kVct_pkInstAliveSort.end(), fSortFunc);
|
||||||
std::for_each(s_kVct_pkInstAliveSort.begin(), s_kVct_pkInstAliveSort.end(), FCharacterInstanceRender());
|
std::for_each(s_kVct_pkInstAliveSort.begin(), s_kVct_pkInstAliveSort.end(), FCharacterInstanceRender());
|
||||||
std::for_each(s_kVct_pkInstAliveSort.begin(), s_kVct_pkInstAliveSort.end(), FCharacterInstanceRenderTrace());
|
std::for_each(s_kVct_pkInstAliveSort.begin(), s_kVct_pkInstAliveSort.end(), FCharacterInstanceRenderTrace());
|
||||||
}
|
}
|
||||||
@@ -474,12 +494,19 @@ void CPythonCharacterManager::__RenderSortedDeadActorList()
|
|||||||
static std::vector<CInstanceBase*> s_kVct_pkInstDeadSort;
|
static std::vector<CInstanceBase*> s_kVct_pkInstDeadSort;
|
||||||
s_kVct_pkInstDeadSort.clear();
|
s_kVct_pkInstDeadSort.clear();
|
||||||
|
|
||||||
|
CCamera* pCamera = CCameraManager::instance().GetCurrentCamera();
|
||||||
|
if (!pCamera)
|
||||||
|
return;
|
||||||
|
|
||||||
TCharacterInstanceList& rkLst_pkInstDead=m_kDeadInstList;
|
TCharacterInstanceList& rkLst_pkInstDead=m_kDeadInstList;
|
||||||
TCharacterInstanceList::iterator i;
|
TCharacterInstanceList::iterator i;
|
||||||
for (i=rkLst_pkInstDead.begin(); i!=rkLst_pkInstDead.end(); ++i)
|
for (i=rkLst_pkInstDead.begin(); i!=rkLst_pkInstDead.end(); ++i)
|
||||||
s_kVct_pkInstDeadSort.push_back(*i);
|
s_kVct_pkInstDeadSort.push_back(*i);
|
||||||
|
|
||||||
std::sort(s_kVct_pkInstDeadSort.begin(), s_kVct_pkInstDeadSort.end(), LessCharacterInstancePtrRenderOrder());
|
LessCharacterInstancePtrRenderOrder fSortFunc;
|
||||||
|
fSortFunc.v3CameraPosition = pCamera->GetEye();
|
||||||
|
|
||||||
|
std::sort(s_kVct_pkInstDeadSort.begin(), s_kVct_pkInstDeadSort.end(), fSortFunc);
|
||||||
std::for_each(s_kVct_pkInstDeadSort.begin(), s_kVct_pkInstDeadSort.end(), FCharacterInstanceRender());
|
std::for_each(s_kVct_pkInstDeadSort.begin(), s_kVct_pkInstDeadSort.end(), FCharacterInstanceRender());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user