CScene: General tidying up
- Ranged for, sign conversion fixes, etc.
This commit is contained in:
parent
1adb20dc0b
commit
d7574a1965
|
@ -25,12 +25,12 @@ CScene::~CScene()
|
|||
|
||||
bool CScene::IsNodeIDUsed(uint32 ID) const
|
||||
{
|
||||
return (mNodeMap.find(ID) != mNodeMap.end());
|
||||
return mNodeMap.find(ID) != mNodeMap.cend();
|
||||
}
|
||||
|
||||
uint32 CScene::CreateNodeID(uint32 SuggestedID) const
|
||||
{
|
||||
if (SuggestedID != -1)
|
||||
if (SuggestedID != UINT32_MAX)
|
||||
{
|
||||
if (IsNodeIDUsed(SuggestedID))
|
||||
errorf("Suggested node ID is already being used! New ID will be created.");
|
||||
|
@ -48,51 +48,55 @@ uint32 CScene::CreateNodeID(uint32 SuggestedID) const
|
|||
|
||||
CModelNode* CScene::CreateModelNode(CModel *pModel, uint32 NodeID)
|
||||
{
|
||||
if (pModel == nullptr) return nullptr;
|
||||
if (pModel == nullptr)
|
||||
return nullptr;
|
||||
|
||||
uint32 ID = CreateNodeID(NodeID);
|
||||
CModelNode *pNode = new CModelNode(this, ID, mpAreaRootNode, pModel);
|
||||
const uint32 ID = CreateNodeID(NodeID);
|
||||
auto* pNode = new CModelNode(this, ID, mpAreaRootNode, pModel);
|
||||
mNodes[ENodeType::Model].push_back(pNode);
|
||||
mNodeMap[ID] = pNode;
|
||||
mNodeMap.insert_or_assign(ID, pNode);
|
||||
mNumNodes++;
|
||||
return pNode;
|
||||
}
|
||||
|
||||
CStaticNode* CScene::CreateStaticNode(CStaticModel *pModel, uint32 NodeID)
|
||||
{
|
||||
if (pModel == nullptr) return nullptr;
|
||||
if (pModel == nullptr)
|
||||
return nullptr;
|
||||
|
||||
uint32 ID = CreateNodeID(NodeID);
|
||||
CStaticNode *pNode = new CStaticNode(this, ID, mpAreaRootNode, pModel);
|
||||
const uint32 ID = CreateNodeID(NodeID);
|
||||
auto* pNode = new CStaticNode(this, ID, mpAreaRootNode, pModel);
|
||||
mNodes[ENodeType::Static].push_back(pNode);
|
||||
mNodeMap[ID] = pNode;
|
||||
mNodeMap.insert_or_assign(ID, pNode);
|
||||
mNumNodes++;
|
||||
return pNode;
|
||||
}
|
||||
|
||||
CCollisionNode* CScene::CreateCollisionNode(CCollisionMeshGroup *pMesh, uint32 NodeID)
|
||||
{
|
||||
if (pMesh == nullptr) return nullptr;
|
||||
if (pMesh == nullptr)
|
||||
return nullptr;
|
||||
|
||||
uint32 ID = CreateNodeID(NodeID);
|
||||
CCollisionNode *pNode = new CCollisionNode(this, ID, mpAreaRootNode, pMesh);
|
||||
const uint32 ID = CreateNodeID(NodeID);
|
||||
auto* pNode = new CCollisionNode(this, ID, mpAreaRootNode, pMesh);
|
||||
mNodes[ENodeType::Collision].push_back(pNode);
|
||||
mNodeMap[ID] = pNode;
|
||||
mNodeMap.insert_or_assign(ID, pNode);
|
||||
mNumNodes++;
|
||||
return pNode;
|
||||
}
|
||||
|
||||
CScriptNode* CScene::CreateScriptNode(CScriptObject *pObj, uint32 NodeID)
|
||||
{
|
||||
if (pObj == nullptr) return nullptr;
|
||||
if (pObj == nullptr)
|
||||
return nullptr;
|
||||
|
||||
uint32 ID = CreateNodeID(NodeID);
|
||||
uint32 InstanceID = pObj->InstanceID();
|
||||
const uint32 ID = CreateNodeID(NodeID);
|
||||
const uint32 InstanceID = pObj->InstanceID();
|
||||
|
||||
CScriptNode *pNode = new CScriptNode(this, ID, mpAreaRootNode, pObj);
|
||||
auto *pNode = new CScriptNode(this, ID, mpAreaRootNode, pObj);
|
||||
mNodes[ENodeType::Script].push_back(pNode);
|
||||
mNodeMap[ID] = pNode;
|
||||
mScriptMap[InstanceID] = pNode;
|
||||
mNodeMap.insert_or_assign(ID, pNode);
|
||||
mScriptMap.insert_or_assign(InstanceID, pNode);
|
||||
pNode->BuildLightList(mpArea);
|
||||
|
||||
// AreaAttributes check
|
||||
|
@ -100,7 +104,7 @@ CScriptNode* CScene::CreateScriptNode(CScriptObject *pObj, uint32 NodeID)
|
|||
{
|
||||
case 0x4E: // MP1 AreaAttributes ID
|
||||
case FOURCC('REAA'): // MP2/MP3/DKCR AreaAttributes ID
|
||||
mAreaAttributesObjects.emplace_back( CAreaAttributes(pObj) );
|
||||
mAreaAttributesObjects.emplace_back(pObj);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -110,21 +114,22 @@ CScriptNode* CScene::CreateScriptNode(CScriptObject *pObj, uint32 NodeID)
|
|||
|
||||
CLightNode* CScene::CreateLightNode(CLight *pLight, uint32 NodeID)
|
||||
{
|
||||
if (pLight == nullptr) return nullptr;
|
||||
if (pLight == nullptr)
|
||||
return nullptr;
|
||||
|
||||
uint32 ID = CreateNodeID(NodeID);
|
||||
CLightNode *pNode = new CLightNode(this, ID, mpAreaRootNode, pLight);
|
||||
const uint32 ID = CreateNodeID(NodeID);
|
||||
auto *pNode = new CLightNode(this, ID, mpAreaRootNode, pLight);
|
||||
mNodes[ENodeType::Light].push_back(pNode);
|
||||
mNodeMap[ID] = pNode;
|
||||
mNodeMap.insert_or_assign(ID, pNode);
|
||||
mNumNodes++;
|
||||
return pNode;
|
||||
}
|
||||
|
||||
void CScene::DeleteNode(CSceneNode *pNode)
|
||||
{
|
||||
ENodeType Type = pNode->NodeType();
|
||||
const ENodeType Type = pNode->NodeType();
|
||||
|
||||
for (auto it = mNodes[Type].begin(); it != mNodes[Type].end(); it++)
|
||||
for (auto it = mNodes[Type].begin(); it != mNodes[Type].end(); ++it)
|
||||
{
|
||||
if (*it == pNode)
|
||||
{
|
||||
|
@ -133,23 +138,21 @@ void CScene::DeleteNode(CSceneNode *pNode)
|
|||
}
|
||||
}
|
||||
|
||||
auto MapIt = mNodeMap.find(pNode->ID());
|
||||
if (MapIt != mNodeMap.end())
|
||||
if (const auto MapIt = mNodeMap.find(pNode->ID()); MapIt != mNodeMap.end())
|
||||
mNodeMap.erase(MapIt);
|
||||
|
||||
if (Type == ENodeType::Script)
|
||||
{
|
||||
CScriptNode *pScript = static_cast<CScriptNode*>(pNode);
|
||||
auto *pScript = static_cast<CScriptNode*>(pNode);
|
||||
|
||||
auto it = mScriptMap.find(pScript->Instance()->InstanceID());
|
||||
if (it != mScriptMap.end())
|
||||
if (const auto it = mScriptMap.find(pScript->Instance()->InstanceID()); it != mScriptMap.end())
|
||||
mScriptMap.erase(it);
|
||||
|
||||
switch (pScript->Instance()->ObjectTypeID())
|
||||
{
|
||||
case 0x4E:
|
||||
case FOURCC('REAA'):
|
||||
for (auto it = mAreaAttributesObjects.begin(); it != mAreaAttributesObjects.end(); it++)
|
||||
for (auto it = mAreaAttributesObjects.begin(); it != mAreaAttributesObjects.end(); ++it)
|
||||
{
|
||||
if ((*it).Instance() == pScript->Instance())
|
||||
{
|
||||
|
@ -275,8 +278,8 @@ void CScene::AddSceneToRenderer(CRenderer *pRenderer, const SViewInfo& rkViewInf
|
|||
PostLoad();
|
||||
|
||||
// Override show flags in game mode
|
||||
FShowFlags ShowFlags = (rkViewInfo.GameMode ? gkGameModeShowFlags : rkViewInfo.ShowFlags);
|
||||
FNodeFlags NodeFlags = NodeFlagsForShowFlags(ShowFlags);
|
||||
const FShowFlags ShowFlags = rkViewInfo.GameMode ? gkGameModeShowFlags : rkViewInfo.ShowFlags;
|
||||
const FNodeFlags NodeFlags = NodeFlagsForShowFlags(ShowFlags);
|
||||
|
||||
for (CSceneIterator It(this, NodeFlags, false); It; ++It)
|
||||
{
|
||||
|
@ -287,8 +290,8 @@ void CScene::AddSceneToRenderer(CRenderer *pRenderer, const SViewInfo& rkViewInf
|
|||
|
||||
SRayIntersection CScene::SceneRayCast(const CRay& rkRay, const SViewInfo& rkViewInfo)
|
||||
{
|
||||
FShowFlags ShowFlags = (rkViewInfo.GameMode ? gkGameModeShowFlags : rkViewInfo.ShowFlags);
|
||||
FNodeFlags NodeFlags = NodeFlagsForShowFlags(ShowFlags);
|
||||
const FShowFlags ShowFlags = rkViewInfo.GameMode ? gkGameModeShowFlags : rkViewInfo.ShowFlags;
|
||||
const FNodeFlags NodeFlags = NodeFlagsForShowFlags(ShowFlags);
|
||||
CRayCollisionTester Tester(rkRay);
|
||||
|
||||
for (CSceneIterator It(this, NodeFlags, false); It; ++It)
|
||||
|
@ -302,18 +305,22 @@ SRayIntersection CScene::SceneRayCast(const CRay& rkRay, const SViewInfo& rkView
|
|||
|
||||
CSceneNode* CScene::NodeByID(uint32 NodeID)
|
||||
{
|
||||
auto it = mNodeMap.find(NodeID);
|
||||
const auto it = mNodeMap.find(NodeID);
|
||||
|
||||
if (it != mNodeMap.end()) return it->second;
|
||||
else return nullptr;
|
||||
if (it != mNodeMap.cend())
|
||||
return it->second;
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
CScriptNode* CScene::NodeForInstanceID(uint32 InstanceID)
|
||||
{
|
||||
auto it = mScriptMap.find(InstanceID);
|
||||
const auto it = mScriptMap.find(InstanceID);
|
||||
|
||||
if (it != mScriptMap.end()) return it->second;
|
||||
else return nullptr;
|
||||
if (it != mScriptMap.cend())
|
||||
return it->second;
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
CScriptNode* CScene::NodeForInstance(CScriptObject *pObj)
|
||||
|
@ -326,23 +333,23 @@ CLightNode* CScene::NodeForLight(CLight *pLight)
|
|||
// Slow. Is there a better way to do this?
|
||||
std::vector<CSceneNode*>& rLights = mNodes[ENodeType::Light];
|
||||
|
||||
for (auto it = rLights.begin(); it != rLights.end(); it++)
|
||||
{
|
||||
CLightNode *pNode = static_cast<CLightNode*>(*it);
|
||||
if (pNode->Light() == pLight) return pNode;
|
||||
}
|
||||
const auto iter = std::find_if(rLights.begin(), rLights.end(),
|
||||
[pLight](const auto* entry) { return static_cast<const CLightNode*>(entry)->Light() == pLight; });
|
||||
|
||||
return nullptr;
|
||||
if (iter == rLights.cend())
|
||||
return nullptr;
|
||||
|
||||
return static_cast<CLightNode*>(*iter);
|
||||
}
|
||||
|
||||
CModel* CScene::ActiveSkybox()
|
||||
{
|
||||
bool SkyEnabled = false;
|
||||
|
||||
for (uint32 iAtt = 0; iAtt < mAreaAttributesObjects.size(); iAtt++)
|
||||
for (auto& rkAttributes : mAreaAttributesObjects)
|
||||
{
|
||||
const CAreaAttributes& rkAttributes = mAreaAttributesObjects[iAtt];
|
||||
if (rkAttributes.IsSkyEnabled()) SkyEnabled = true;
|
||||
if (rkAttributes.IsSkyEnabled())
|
||||
SkyEnabled = true;
|
||||
|
||||
if (rkAttributes.IsLayerEnabled())
|
||||
{
|
||||
|
@ -350,13 +357,16 @@ CModel* CScene::ActiveSkybox()
|
|||
{
|
||||
SkyEnabled = true;
|
||||
CModel *pSky = rkAttributes.SkyModel();
|
||||
if (pSky) return pSky;
|
||||
if (pSky != nullptr)
|
||||
return pSky;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (SkyEnabled) return mpWorld->DefaultSkybox();
|
||||
else return nullptr;
|
||||
if (SkyEnabled)
|
||||
return mpWorld->DefaultSkybox();
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
CGameArea* CScene::ActiveArea()
|
||||
|
@ -368,21 +378,21 @@ CGameArea* CScene::ActiveArea()
|
|||
FShowFlags CScene::ShowFlagsForNodeFlags(FNodeFlags NodeFlags)
|
||||
{
|
||||
FShowFlags Out;
|
||||
if (NodeFlags & ENodeType::Model) Out |= EShowFlag::SplitWorld;
|
||||
if (NodeFlags & ENodeType::Static) Out |= EShowFlag::MergedWorld;
|
||||
if (NodeFlags & ENodeType::Script) Out |= EShowFlag::Objects;
|
||||
if (NodeFlags & ENodeType::Collision) Out |= EShowFlag::WorldCollision;
|
||||
if (NodeFlags & ENodeType::Light) Out |= EShowFlag::Lights;
|
||||
if ((NodeFlags & ENodeType::Model) != 0) Out |= EShowFlag::SplitWorld;
|
||||
if ((NodeFlags & ENodeType::Static) != 0) Out |= EShowFlag::MergedWorld;
|
||||
if ((NodeFlags & ENodeType::Script) != 0) Out |= EShowFlag::Objects;
|
||||
if ((NodeFlags & ENodeType::Collision) != 0) Out |= EShowFlag::WorldCollision;
|
||||
if ((NodeFlags & ENodeType::Light) != 0) Out |= EShowFlag::Lights;
|
||||
return Out;
|
||||
}
|
||||
|
||||
FNodeFlags CScene::NodeFlagsForShowFlags(FShowFlags ShowFlags)
|
||||
{
|
||||
FNodeFlags Out = ENodeType::Root;
|
||||
if (ShowFlags & EShowFlag::SplitWorld) Out |= ENodeType::Model;
|
||||
if (ShowFlags & EShowFlag::MergedWorld) Out |= ENodeType::Static;
|
||||
if (ShowFlags & EShowFlag::WorldCollision) Out |= ENodeType::Collision;
|
||||
if (ShowFlags & EShowFlag::Objects) Out |= ENodeType::Script | ENodeType::ScriptExtra;
|
||||
if (ShowFlags & EShowFlag::Lights) Out |= ENodeType::Light;
|
||||
if ((ShowFlags & EShowFlag::SplitWorld) != 0) Out |= ENodeType::Model;
|
||||
if ((ShowFlags & EShowFlag::MergedWorld) != 0) Out |= ENodeType::Static;
|
||||
if ((ShowFlags & EShowFlag::WorldCollision) != 0) Out |= ENodeType::Collision;
|
||||
if ((ShowFlags & EShowFlag::Objects) != 0) Out |= ENodeType::Script | ENodeType::ScriptExtra;
|
||||
if ((ShowFlags & EShowFlag::Lights) != 0) Out |= ENodeType::Light;
|
||||
return Out;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue