CSceneNode: Make NodeType() const

These don't modify member state.
This commit is contained in:
Lioncache
2025-12-09 15:14:10 -05:00
parent c662ef6266
commit da5197b6c4
23 changed files with 76 additions and 70 deletions

View File

@@ -10,7 +10,7 @@ CCharacterNode::CCharacterNode(CScene *pScene, uint32 NodeID, CAnimSet *pChar /*
SetCharSet(pChar);
}
ENodeType CCharacterNode::NodeType()
ENodeType CCharacterNode::NodeType() const
{
return ENodeType::Character;
}

View File

@@ -19,7 +19,7 @@ class CCharacterNode : public CSceneNode
public:
explicit CCharacterNode(CScene *pScene, uint32 NodeID, CAnimSet *pChar = nullptr, CSceneNode *pParent = nullptr);
ENodeType NodeType() override;
ENodeType NodeType() const override;
void PostLoad() override;
void AddToRenderer(CRenderer *pRenderer, const SViewInfo& rkViewInfo) override;
void Draw(FRenderOptions Options, int ComponentIndex, ERenderCommand Command, const SViewInfo& rkViewInfo) override;

View File

@@ -11,7 +11,7 @@ CCollisionNode::CCollisionNode(CScene *pScene, uint32 NodeID, CSceneNode *pParen
SetName("Collision");
}
ENodeType CCollisionNode::NodeType()
ENodeType CCollisionNode::NodeType() const
{
return ENodeType::Collision;
}

View File

@@ -10,7 +10,7 @@ class CCollisionNode : public CSceneNode
public:
CCollisionNode(CScene *pScene, uint32 NodeID, CSceneNode *pParent = nullptr, CCollisionMeshGroup *pCollision = nullptr);
ENodeType NodeType() override;
ENodeType NodeType() const override;
void AddToRenderer(CRenderer *pRenderer, const SViewInfo& rkViewInfo) override;
void Draw(FRenderOptions Options, int ComponentIndex, ERenderCommand Command, const SViewInfo& rkViewInfo) override;
void RayAABoxIntersectTest(CRayCollisionTester& rTester, const SViewInfo& rkViewInfo) override;

View File

@@ -20,7 +20,7 @@ CLightNode::CLightNode(CScene *pScene, uint32 NodeID, CSceneNode *pParent, CLigh
}
}
ENodeType CLightNode::NodeType()
ENodeType CLightNode::NodeType() const
{
return ENodeType::Light;
}

View File

@@ -9,7 +9,7 @@ class CLightNode : public CSceneNode
CLight *mpLight;
public:
CLightNode(CScene *pScene, uint32 NodeID, CSceneNode *pParent = nullptr, CLight *Light = nullptr);
ENodeType NodeType() override;
ENodeType NodeType() const override;
void AddToRenderer(CRenderer* pRenderer, const SViewInfo& ViewInfo) override;
void Draw(FRenderOptions Options, int ComponentIndex, ERenderCommand Command, const SViewInfo& ViewInfo) override;
void DrawSelection() override;

View File

@@ -11,7 +11,7 @@ CModelNode::CModelNode(CScene *pScene, uint32 NodeID, CSceneNode *pParent, CMode
SetModel(pModel);
}
ENodeType CModelNode::NodeType()
ENodeType CModelNode::NodeType() const
{
return ENodeType::Model;
}

View File

@@ -17,7 +17,7 @@ class CModelNode : public CSceneNode
public:
explicit CModelNode(CScene *pScene, uint32 NodeID, CSceneNode *pParent = nullptr, CModel *pModel = nullptr);
ENodeType NodeType() override;
ENodeType NodeType() const override;
void PostLoad() override;
void AddToRenderer(CRenderer* pRenderer, const SViewInfo& rkViewInfo) override;
void Draw(FRenderOptions Options, int ComponentIndex, ERenderCommand Command, const SViewInfo& rkViewInfo) override;

View File

@@ -11,7 +11,7 @@ public:
: CSceneNode(pScene, NodeID, pParent) {}
~CRootNode() override = default;
ENodeType NodeType() override
ENodeType NodeType() const override
{
return ENodeType::Root;
}

View File

@@ -104,7 +104,7 @@ protected:
public:
explicit CSceneNode(CScene *pScene, uint32 NodeID, CSceneNode *pParent = nullptr);
~CSceneNode() override;
virtual ENodeType NodeType() = 0;
virtual ENodeType NodeType() const = 0;
virtual void PostLoad() {}
virtual void OnTransformed() {}
void AddToRenderer(CRenderer* /*pRenderer*/, const SViewInfo& /*rkViewInfo*/) override {}

View File

@@ -26,7 +26,7 @@ public:
void ParentDisplayAssetChanged(CResource *pNewDisplayAsset);
CModel* Model() const;
ENodeType NodeType() override { return ENodeType::ScriptAttach; }
ENodeType NodeType() const override { return ENodeType::ScriptAttach; }
void AddToRenderer(CRenderer* pRenderer, const SViewInfo& rkViewInfo) override;
void Draw(FRenderOptions Options, int ComponentIndex, ERenderCommand Command, const SViewInfo& rkViewInfo) override;
void DrawSelection() override;

View File

@@ -73,7 +73,7 @@ CScriptNode::CScriptNode(CScene *pScene, uint32 NodeID, CSceneNode *pParent, CSc
mpExtra = CScriptExtra::CreateExtra(this);
}
ENodeType CScriptNode::NodeType()
ENodeType CScriptNode::NodeType() const
{
return ENodeType::Script;
}

View File

@@ -37,7 +37,7 @@ public:
EGameModeVisibility mGameModeVisibility{EGameModeVisibility::Untested};
CScriptNode(CScene *pScene, uint32 NodeID, CSceneNode *pParent = nullptr, CScriptObject *pObject = nullptr);
ENodeType NodeType() override;
ENodeType NodeType() const override;
void PostLoad() override;
void OnTransformed() override;
void AddToRenderer(CRenderer* pRenderer, const SViewInfo& rkViewInfo) override;

View File

@@ -13,7 +13,7 @@ CStaticNode::CStaticNode(CScene *pScene, uint32 NodeID, CSceneNode *pParent, CSt
SetName("Static Node");
}
ENodeType CStaticNode::NodeType()
ENodeType CStaticNode::NodeType() const
{
return ENodeType::Static;
}

View File

@@ -10,7 +10,7 @@ class CStaticNode : public CSceneNode
public:
CStaticNode(CScene *pScene, uint32 NodeID, CSceneNode *pParent = nullptr, CStaticModel *pModel = nullptr);
ENodeType NodeType() override;
ENodeType NodeType() const override;
void PostLoad() override;
void AddToRenderer(CRenderer* pRenderer, const SViewInfo& rkViewInfo) override;
void Draw(FRenderOptions Options, int ComponentIndex, ERenderCommand Command, const SViewInfo& rkViewInfo) override;

View File

@@ -39,7 +39,7 @@ public:
EGame Game() const { return mGame; }
// Default implementations for CSceneNode
ENodeType NodeType() override { return ENodeType::ScriptExtra; }
ENodeType NodeType() const override { return ENodeType::ScriptExtra; }
void RayAABoxIntersectTest(CRayCollisionTester& /*rTester*/, const SViewInfo& /*rkViewInfo*/) override {}
SRayIntersection RayNodeIntersectTest(const CRay& /*rkRay*/, uint32 /*AssetID*/, const SViewInfo& /*rkViewInfo*/) override
{

View File

@@ -118,7 +118,7 @@ public:
void UpdateBounds() { mBoundsDirty = true; }
void SetAllowedNodeTypes(FNodeFlags Types) { mAllowedNodes = Types; }
bool IsAllowedType(ENodeType Type) const { return (mAllowedNodes & Type) != 0; }
bool IsAllowedType(CSceneNode *pNode) const { return (mAllowedNodes & pNode->NodeType()) != 0; }
bool IsAllowedType(const CSceneNode *pNode) const { return (mAllowedNodes & pNode->NodeType()) != 0; }
const QList<CSceneNode*>& SelectedNodeList() const { return mSelectedNodes; }
signals:

View File

@@ -86,15 +86,17 @@ void CSceneViewport::CheckGizmoInput(const CRay& rkRay)
else
mGizmoHovering = false;
}
// Gizmo transforming: Run gizmo input with ray/mouse coords
else if (mGizmoTransforming)
{
bool transformed = pGizmo->TransformFromInput(rkRay, mCamera);
if (transformed) emit GizmoMoved();
const bool transformed = pGizmo->TransformFromInput(rkRay, mCamera);
if (transformed)
emit GizmoMoved();
}
else
{
mGizmoHovering = false;
}
else mGizmoHovering = false;
}
SRayIntersection CSceneViewport::SceneRayCast(const CRay& rkRay)
@@ -105,8 +107,7 @@ SRayIntersection CSceneViewport::SceneRayCast(const CRay& rkRay)
return SRayIntersection();
}
SRayIntersection Intersect = mpScene->SceneRayCast(rkRay, mViewInfo);
const SRayIntersection Intersect = mpScene->SceneRayCast(rkRay, mViewInfo);
if (Intersect.Hit)
{
if (mpHoverNode)
@@ -116,7 +117,6 @@ SRayIntersection CSceneViewport::SceneRayCast(const CRay& rkRay)
mpHoverNode->SetMouseHovering(true);
mHoverPoint = rkRay.PointOnRay(Intersect.Distance);
}
else
{
mHoverPoint = rkRay.PointOnRay(10.f);
@@ -128,7 +128,9 @@ SRayIntersection CSceneViewport::SceneRayCast(const CRay& rkRay)
void CSceneViewport::ResetHover()
{
if (mpHoverNode) mpHoverNode->SetMouseHovering(false);
if (mpHoverNode)
mpHoverNode->SetMouseHovering(false);
mpHoverNode = nullptr;
}
@@ -243,17 +245,18 @@ QMouseEvent CSceneViewport::CreateMouseEvent()
void CSceneViewport::FindConnectedObjects(uint32 InstanceID, bool SearchOutgoing, bool SearchIncoming, QList<uint32>& rIDList)
{
CScriptNode *pScript = mpScene->NodeForInstanceID(InstanceID);
if (!pScript) return;
const CScriptNode* pScript = mpScene->NodeForInstanceID(InstanceID);
if (!pScript)
return;
CScriptObject *pInst = pScript->Instance();
const CScriptObject* pInst = pScript->Instance();
rIDList.push_back(InstanceID);
if (SearchOutgoing)
{
for (size_t iLink = 0; iLink < pInst->NumLinks(ELinkType::Outgoing); iLink++)
{
CLink *pLink = pInst->Link(ELinkType::Outgoing, iLink);
const CLink* pLink = pInst->Link(ELinkType::Outgoing, iLink);
if (!rIDList.contains(pLink->ReceiverID()))
FindConnectedObjects(pLink->ReceiverID(), SearchOutgoing, SearchIncoming, rIDList);
@@ -264,7 +267,7 @@ void CSceneViewport::FindConnectedObjects(uint32 InstanceID, bool SearchOutgoing
{
for (size_t iLink = 0; iLink < pInst->NumLinks(ELinkType::Incoming); iLink++)
{
CLink *pLink = pInst->Link(ELinkType::Incoming, iLink);
const CLink* pLink = pInst->Link(ELinkType::Incoming, iLink);
if (!rIDList.contains(pLink->SenderID()))
FindConnectedObjects(pLink->SenderID(), SearchOutgoing, SearchIncoming, rIDList);
@@ -293,9 +296,10 @@ void CSceneViewport::CheckUserInput()
if (!mpEditor->Gizmo()->IsTransforming())
mRayIntersection = SceneRayCast(Ray);
}
else
{
mRayIntersection = SRayIntersection();
}
QMouseEvent Event = CreateMouseEvent();
emit InputProcessed(mRayIntersection, &Event);
@@ -309,10 +313,10 @@ void CSceneViewport::Paint()
mpRenderer->BeginFrame();
// todo: The sky should really just be a regular node in the background depth group instead of having special rendering code here
if ((mViewInfo.ShowFlags & EShowFlag::Sky) || mViewInfo.GameMode)
if ((mViewInfo.ShowFlags & EShowFlag::Sky) != 0 || mViewInfo.GameMode)
{
CModel *pSky = mpScene->ActiveSkybox();
if (pSky) mpRenderer->RenderSky(pSky, mViewInfo);
if (CModel* pSky = mpScene->ActiveSkybox())
mpRenderer->RenderSky(pSky, mViewInfo);
}
mCamera.LoadMatrices();
@@ -331,7 +335,8 @@ void CSceneViewport::Paint()
mGrid.AddToRenderer(mpRenderer.get(), mViewInfo);
// Draw the line for the link the user is editing.
if (mLinkLineEnabled) mLinkLine.AddToRenderer(mpRenderer.get(), mViewInfo);
if (mLinkLineEnabled)
mLinkLine.AddToRenderer(mpRenderer.get(), mViewInfo);
mpRenderer->RenderBuckets(mViewInfo);
mpRenderer->EndFrame();
@@ -344,12 +349,12 @@ void CSceneViewport::ContextMenu(QContextMenuEvent *pEvent)
// Set up actions
TString NodeName;
bool HasHoverNode = (mpHoverNode && (mpHoverNode->NodeType() != ENodeType::Static) && (mpHoverNode->NodeType() != ENodeType::Model));
bool HasSelection = mpEditor->HasSelection();
bool IsScriptNode = (mpHoverNode && mpHoverNode->NodeType() == ENodeType::Script);
const bool HasHoverNode = (mpHoverNode && (mpHoverNode->NodeType() != ENodeType::Static) && (mpHoverNode->NodeType() != ENodeType::Model));
const bool HasSelection = mpEditor->HasSelection();
const bool IsScriptNode = (mpHoverNode && mpHoverNode->NodeType() == ENodeType::Script);
CWorldEditor* pOwnerWorldEd = qobject_cast<CWorldEditor*>(mpEditor);
bool QuickplayEnabled = (pOwnerWorldEd && pOwnerWorldEd->IsQuickplayEnabled());
const auto* pOwnerWorldEd = qobject_cast<const CWorldEditor*>(mpEditor);
const bool QuickplayEnabled = (pOwnerWorldEd && pOwnerWorldEd->IsQuickplayEnabled());
mpToggleSelectAction->setVisible(HasHoverNode);
mpSelectConnectedMenu->menuAction()->setVisible(IsScriptNode);
@@ -381,10 +386,10 @@ void CSceneViewport::ContextMenu(QContextMenuEvent *pEvent)
mpHideHoverTypeAction->setText(tr("Hide all %1 objects").arg(TO_QSTRING(pScript->Template()->Name())));
mpHideHoverLayerAction->setText(tr("Hide layer %1").arg(TO_QSTRING(pScript->Instance()->Layer()->Name())));
}
else if (HasHoverNode)
{
NodeName = mpHoverNode->Name();
}
mpHideHoverNodeAction->setText(tr("Hide %1").arg(TO_QSTRING(NodeName)));
// Show menu
@@ -424,10 +429,10 @@ void CSceneViewport::OnMouseRelease(QMouseEvent *pEvent)
mpEditor->EndGizmoTransform();
mGizmoTransforming = false;
}
// Object selection/deselection
else
else // Object selection/deselection
{
emit ViewportClick(mRayIntersection, pEvent);
}
}
}

View File

@@ -86,28 +86,30 @@ void CPasteNodesCommand::redo()
// 1. If the link receiver has also been copied then redirect to the copied version.
// 2. If we're pasting into the same area that this data was copied from and the receiver still exists, connect to original receiver.
// 3. If neither of those things is true, then delete the link.
for (CSceneNode *pNode : PastedNodes)
for (const CSceneNode* pNode : PastedNodes)
{
if (pNode && pNode->NodeType() == ENodeType::Script)
{
CScriptObject *pInstance = static_cast<CScriptNode*>(pNode)->Instance();
const auto* pInstance = static_cast<const CScriptNode*>(pNode)->Instance();
for (size_t iLink = 0; iLink < pInstance->NumLinks(ELinkType::Outgoing); iLink++)
{
CLink *pLink = pInstance->Link(ELinkType::Outgoing, iLink);
int Index = mpMimeData->IndexOfInstanceID(pLink->ReceiverID());
CLink* pLink = pInstance->Link(ELinkType::Outgoing, iLink);
const int Index = mpMimeData->IndexOfInstanceID(pLink->ReceiverID());
if (Index != -1)
{
CScriptObject *pNewTarget = static_cast<CScriptNode*>(PastedNodes[Index])->Instance();
const auto* pNewTarget = static_cast<CScriptNode*>(PastedNodes[Index])->Instance();
pLink->SetReceiver(pNewTarget->InstanceID());
}
else if (mpMimeData->AreaID() != pArea->ID() || pArea->InstanceByID(pLink->ReceiverID()) == nullptr)
{
CScriptObject *pSender = pLink->Sender();
CScriptObject *pReceiver = pLink->Receiver();
if (pSender) pSender->RemoveLink(ELinkType::Outgoing, pLink);
if (pReceiver) pReceiver->RemoveLink(ELinkType::Incoming, pLink);
CScriptObject* pSender = pLink->Sender();
CScriptObject* pReceiver = pLink->Receiver();
if (pSender)
pSender->RemoveLink(ELinkType::Outgoing, pLink);
if (pReceiver)
pReceiver->RemoveLink(ELinkType::Incoming, pLink);
delete pLink;
iLink--;

View File

@@ -411,7 +411,7 @@ void CInstancesModel::NodeCreated(CSceneNode *pNode)
{
if (pNode->NodeType() == ENodeType::Script)
{
CScriptNode *pScript = static_cast<CScriptNode*>(pNode);
const auto* pScript = static_cast<const CScriptNode*>(pNode);
CScriptObject *pObj = pScript->Instance();
pObj->Template()->SortObjects();
@@ -441,8 +441,8 @@ void CInstancesModel::NodeAboutToBeDeleted(CSceneNode *pNode)
if (mModelType == EInstanceModelType::Types)
{
const auto *pScript = static_cast<CScriptNode*>(pNode);
const CScriptObject *pObj = pScript->Instance();
const auto* pScript = static_cast<const CScriptNode*>(pNode);
const CScriptObject* pObj = pScript->Instance();
if (pObj->Template()->NumObjects() <= 1)
{

View File

@@ -800,7 +800,7 @@ void CWorldEditor::UpdateStatusBar()
{
if (ui->MainViewport->underMouse())
{
CSceneNode *pHoverNode = ui->MainViewport->HoverNode();
const CSceneNode* pHoverNode = ui->MainViewport->HoverNode();
if (pHoverNode && mpSelection->IsAllowedType(pHoverNode))
StatusText = TO_QSTRING(pHoverNode->Name());
@@ -895,11 +895,11 @@ void CWorldEditor::UpdateCursor()
{
if (ui->MainViewport->IsCursorVisible() && !mPickMode)
{
CSceneNode *pHoverNode = ui->MainViewport->HoverNode();
const CSceneNode* pHoverNode = ui->MainViewport->HoverNode();
if (ui->MainViewport->IsHoveringGizmo())
ui->MainViewport->SetCursorState(Qt::SizeAllCursor);
else if ((pHoverNode) && mpSelection->IsAllowedType(pHoverNode))
else if (pHoverNode && mpSelection->IsAllowedType(pHoverNode))
ui->MainViewport->SetCursorState(Qt::PointingHandCursor);
else
ui->MainViewport->SetCursorState(Qt::ArrowCursor);
@@ -955,7 +955,7 @@ void CWorldEditor::UpdateNewLinkLine()
if (ui->MainViewport->underMouse() && !ui->MainViewport->IsMouseInputActive() && IsPicking)
{
CSceneNode* pHoverNode = ui->MainViewport->HoverNode();
const CSceneNode* pHoverNode = ui->MainViewport->HoverNode();
const CScriptObject* pInst = (pSender ? pSender : pReceiver);
CVector3f Start = mScene.NodeForInstance(pInst)->CenterPoint();

View File

@@ -74,8 +74,8 @@ void WEditorProperties::SetLayerComboBox()
if (mpDisplayNode && mpDisplayNode->NodeType() == ENodeType::Script)
{
CScriptNode *pScript = static_cast<CScriptNode*>(mpDisplayNode);
CScriptLayer *pLayer = pScript->Instance()->Layer();
const auto* pScript = static_cast<const CScriptNode*>(mpDisplayNode);
const auto* pLayer = pScript->Instance()->Layer();
for (size_t iLyr = 0; iLyr < mpEditor->ActiveArea()->NumScriptLayers(); iLyr++)
{
if (mpEditor->ActiveArea()->ScriptLayer(iLyr) == pLayer)
@@ -98,7 +98,7 @@ void WEditorProperties::SetLayerComboBox()
// ************ PUBLIC SLOTS ************
void WEditorProperties::OnSelectionModified()
{
CNodeSelection *pSelection = mpEditor->Selection();
const CNodeSelection* pSelection = mpEditor->Selection();
mpDisplayNode = (pSelection->Size() == 1 ? pSelection->Front() : nullptr);
if (pSelection->IsEmpty() || pSelection->Size() != 1 || mpDisplayNode->NodeType() != ENodeType::Script)
@@ -125,7 +125,6 @@ void WEditorProperties::OnSelectionModified()
mpInstanceInfoLabel->setToolTip({});
}
else
{
CScriptNode *pScript = static_cast<CScriptNode*>(mpDisplayNode);

View File

@@ -81,8 +81,8 @@ void WModifyTab::GenerateUI()
if (mpSelectedNode->NodeType() == ENodeType::Script)
{
CScriptNode *pScriptNode = static_cast<CScriptNode*>(mpSelectedNode);
CScriptObject *pObj = pScriptNode->Instance();
const auto* pScriptNode = static_cast<const CScriptNode*>(mpSelectedNode);
CScriptObject* pObj = pScriptNode->Instance();
// Set up UI
ui->ObjectsTabWidget->show();
@@ -118,7 +118,7 @@ void WModifyTab::OnInstanceLinksModified(const QList<CScriptObject*>& rkInstance
{
if (mpSelectedNode && mpSelectedNode->NodeType() == ENodeType::Script)
{
CScriptObject *pInstance = static_cast<CScriptNode*>(mpSelectedNode)->Instance();
const auto* pInstance = static_cast<const CScriptNode*>(mpSelectedNode)->Instance();
if (pInstance && rkInstances.contains(pInstance))
{
@@ -247,7 +247,7 @@ void WModifyTab::OnEditLinkClicked()
if (SelectedIndices.size() == 1)
{
CScriptObject *pInst = static_cast<CScriptNode*>(mpSelectedNode)->Instance();
const auto* pInst = static_cast<const CScriptNode*>(mpSelectedNode)->Instance();
CLinkDialog *pDialog = mpWorldEditor->LinkDialog();
pDialog->EditLink(pInst->Link(Type, SelectedIndices.front().row()));
pDialog->show();