Moved POI mapping dialog to be a sidebar instead, fixed standable collision visualization in MP2/3

This commit is contained in:
Aruki
2017-02-20 16:02:05 -07:00
parent a88afe31e3
commit e89d44f7a7
20 changed files with 478 additions and 459 deletions

View File

@@ -7,48 +7,10 @@
CPoiMapModel::CPoiMapModel(CWorldEditor *pEditor, QObject *pParent /*= 0*/)
: QAbstractListModel(pParent)
, mpEditor(pEditor)
, mpArea(pEditor->ActiveArea())
, mpPoiToWorld(mpArea->PoiToWorldMap())
, mpArea(nullptr)
, mpPoiToWorld(nullptr)
{
if (mpPoiToWorld)
{
// Create an ID -> Model Node lookup map
QMap<u32,CModelNode*> NodeMap;
for (CSceneIterator It(mpEditor->Scene(), eModelNode, true); !It.DoneIterating(); ++It)
{
CModelNode *pNode = static_cast<CModelNode*>(*It);
NodeMap[pNode->FindMeshID()] = pNode;
}
// Create internal model map
for (u32 iPoi = 0; iPoi < mpPoiToWorld->NumMappedPOIs(); iPoi++)
{
const CPoiToWorld::SPoiMap *pkMap = mpPoiToWorld->MapByIndex(iPoi);
CScriptNode *pPoiNode = mpEditor->Scene()->NodeForInstanceID(pkMap->PoiID);
if (pPoiNode)
{
QList<CModelNode*> *pModelList = new QList<CModelNode*>;
for (auto it = pkMap->ModelIDs.begin(); it != pkMap->ModelIDs.end(); it++)
{
if (NodeMap.contains(*it))
*pModelList << NodeMap[*it];
}
mModelMap[pPoiNode] = pModelList;
}
}
}
}
CPoiMapModel::~CPoiMapModel()
{
QList<QList<CModelNode*>*> Lists = mModelMap.values();
for (auto it = Lists.begin(); it != Lists.end(); it++)
delete *it;
connect(pEditor, SIGNAL(MapChanged(CWorld*,CGameArea*)), this, SLOT(OnMapChange(CWorld*,CGameArea*)));
}
QVariant CPoiMapModel::headerData(int Section, Qt::Orientation Orientation, int Role) const
@@ -61,7 +23,7 @@ QVariant CPoiMapModel::headerData(int Section, Qt::Orientation Orientation, int
int CPoiMapModel::rowCount(const QModelIndex& /*rkParent*/) const
{
return mpPoiToWorld->NumMappedPOIs();
return mpPoiToWorld ? mpPoiToWorld->NumMappedPOIs() : 0;
}
QVariant CPoiMapModel::data(const QModelIndex& rkIndex, int Role) const
@@ -199,3 +161,54 @@ const QList<CModelNode*>& CPoiMapModel::GetPoiMeshList(CScriptNode *pPOI) const
{
return *mModelMap[pPOI];
}
void CPoiMapModel::OnMapChange(CWorld*, CGameArea *pArea)
{
beginResetModel();
mpArea = pArea;
mpPoiToWorld = (pArea ? pArea->PoiToWorldMap() : nullptr);
if (mpPoiToWorld)
{
// Create an ID -> Model Node lookup map
QMap<u32,CModelNode*> NodeMap;
for (CSceneIterator It(mpEditor->Scene(), eModelNode, true); !It.DoneIterating(); ++It)
{
CModelNode *pNode = static_cast<CModelNode*>(*It);
NodeMap[pNode->FindMeshID()] = pNode;
}
// Create internal model map
for (u32 iPoi = 0; iPoi < mpPoiToWorld->NumMappedPOIs(); iPoi++)
{
const CPoiToWorld::SPoiMap *pkMap = mpPoiToWorld->MapByIndex(iPoi);
CScriptNode *pPoiNode = mpEditor->Scene()->NodeForInstanceID(pkMap->PoiID);
if (pPoiNode)
{
QList<CModelNode*> *pModelList = new QList<CModelNode*>;
for (auto it = pkMap->ModelIDs.begin(); it != pkMap->ModelIDs.end(); it++)
{
if (NodeMap.contains(*it))
*pModelList << NodeMap[*it];
}
mModelMap[pPoiNode] = pModelList;
}
}
}
else
{
QList<QList<CModelNode*>*> Lists = mModelMap.values();
for (auto it = Lists.begin(); it != Lists.end(); it++)
delete *it;
mModelMap.clear();
}
endResetModel();
}