Revision control

- //
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// * Neither the name of NVIDIA CORPORATION nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
- // Copyright (c) 2008-2021 NVIDIA Corporation. All rights reserved.
+ // Copyright (c) 2008-2026 NVIDIA Corporation. All rights reserved.
// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
-
#include "NpRigidStatic.h"
- #include "NpPhysics.h"
- #include "ScbNpDeps.h"
- #include "NpScene.h"
#include "NpRigidActorTemplateInternal.h"
+ #include "omnipvd/NpOmniPvdSetData.h"
using namespace physx;
- NpRigidStatic::NpRigidStatic(const PxTransform& pose)
- : NpRigidStaticT(PxConcreteType::eRIGID_STATIC, PxBaseFlag::eOWNS_MEMORY | PxBaseFlag::eIS_RELEASABLE)
- , mRigidStatic(pose)
+ NpRigidStatic::NpRigidStatic(const PxTransform& pose) :
+ NpRigidStaticT (PxConcreteType::eRIGID_STATIC, PxBaseFlag::eOWNS_MEMORY | PxBaseFlag::eIS_RELEASABLE, NpType::eRIGID_STATIC),
+ mCore (pose)
{
}
NpRigidStatic::~NpRigidStatic()
{
}
// PX_SERIALIZATION
-
void NpRigidStatic::requiresObjects(PxProcessPxBaseCallback& c)
{
NpRigidStaticT::requiresObjects(c);
}
NpRigidStatic* NpRigidStatic::createObject(PxU8*& address, PxDeserializationContext& context)
{
- NpRigidStatic* obj = new (address) NpRigidStatic(PxBaseFlag::eIS_RELEASABLE);
+ NpRigidStatic* obj = PX_PLACEMENT_NEW(address, NpRigidStatic(PxBaseFlag::eIS_RELEASABLE));
address += sizeof(NpRigidStatic);
obj->importExtraData(context);
obj->resolveReferences(context);
return obj;
}
//~PX_SERIALIZATION
void NpRigidStatic::release()
{
- releaseActorT(this, mRigidStatic);
+ if(releaseRigidActorT<PxRigidStatic>(*this))
+ {
+ PX_ASSERT(!isAPIWriteForbidden()); // the code above should return false in that case
+ NpDestroyRigidActor(this);
+ }
}
void NpRigidStatic::setGlobalPose(const PxTransform& pose, bool /*wake*/)
{
+ NpScene* npScene = getNpScene();
+ NP_WRITE_CHECK(npScene);
PX_CHECK_AND_RETURN(pose.isSane(), "PxRigidStatic::setGlobalPose: pose is not valid.");
- NP_WRITE_CHECK(NpActor::getOwnerScene(*this));
+ PX_CHECK_SCENE_API_WRITE_FORBIDDEN(npScene, "PxRigidStatic::setGlobalPose() not allowed while simulation is running. Call will be ignored.")
- NpScene* npScene = NpActor::getAPIScene(*this);
#if PX_CHECKED
if(npScene)
npScene->checkPositionSanity(*this, pose, "PxRigidStatic::setGlobalPose");
#endif
- mRigidStatic.setActor2World(pose.getNormalized());
+ const PxTransform newPose = pose.getNormalized(); //AM: added to fix 1461 where users read and write orientations for no reason.
+
+ mCore.setActor2World(newPose);
+ UPDATE_PVD_PROPERTY
+ OMNI_PVD_WRITE_SCOPE_BEGIN(pvdWriter, pvdRegData)
+ OMNI_PVD_SET_EXPLICIT(pvdWriter, pvdRegData, OMNI_PVD_CONTEXT_HANDLE, PxRigidActor, globalPose, *static_cast<PxRigidActor*>(this), newPose);
+ OMNI_PVD_WRITE_SCOPE_END
if(npScene)
- {
- mShapeManager.markAllSceneQueryForUpdate(npScene->getSceneQueryManagerFast(), *this);
- npScene->getSceneQueryManagerFast().get(Sq::PruningIndex::eSTATIC).invalidateTimestamp();
- }
-
- #if PX_SUPPORT_PVD
- // have to do this here since this call gets not forwarded to Scb::RigidStatic
- Scb::Scene* scbScene = NpActor::getScbFromPxActor(*this).getScbSceneForAPI();
- if(scbScene)
- scbScene->getScenePvdClient().updatePvdProperties(&mRigidStatic);
- #endif
+ mShapeManager.markActorForSQUpdate(npScene->getSQAPI(), *this);
// invalidate the pruning structure if the actor bounds changed
- if (mShapeManager.getPruningStructure())
+ if(mShapeManager.getPruningStructure())
{
- Ps::getFoundation().error(PxErrorCode::eINVALID_OPERATION, __FILE__, __LINE__, "PxRigidStatic::setGlobalPose: Actor is part of a pruning structure, pruning structure is now invalid!");
+ PxGetFoundation().error(PxErrorCode::eINVALID_OPERATION, PX_FL, "PxRigidStatic::setGlobalPose: Actor is part of a pruning structure, pruning structure is now invalid!");
mShapeManager.getPruningStructure()->invalidate(this);
}
updateShaderComs();
}
PxTransform NpRigidStatic::getGlobalPose() const
{
- NP_READ_CHECK(NpActor::getOwnerScene(*this));
- return mRigidStatic.getActor2World();
+ NP_READ_CHECK(getNpScene());
+ return mCore.getActor2World();
}
- PxU32 physx::NpRigidStaticGetShapes(Scb::RigidStatic& rigid, void* const *&shapes)
+ PxU32 physx::NpRigidStaticGetShapes(NpRigidStatic& rigid, NpShape* const *&shapes)
{
- NpRigidStatic* a = static_cast<NpRigidStatic*>(rigid.getScRigidCore().getPxActor());
- NpShapeManager& sm = a->getShapeManager();
- shapes = reinterpret_cast<void *const *>(sm.getShapes());
+ NpShapeManager& sm = rigid.getShapeManager();
+ shapes = sm.getShapes();
return sm.getNbShapes();
}
void NpRigidStatic::switchToNoSim()
{
- getScbRigidStaticFast().switchToNoSim(false);
+ NpActor::scSwitchToNoSim();
}
void NpRigidStatic::switchFromNoSim()
{
- getScbRigidStaticFast().switchFromNoSim(false);
+ NpActor::scSwitchFromNoSim();
}
#if PX_CHECKED
bool NpRigidStatic::checkConstraintValidity() const
{
// Perhaps NpConnectorConstIterator would be worth it...
NpConnectorIterator iter = (const_cast<NpRigidStatic*>(this))->getConnectorIterator(NpConnectorType::eConstraint);
while (PxBase* ser = iter.getNext())
{
NpConstraint* c = static_cast<NpConstraint*>(ser);
if(!c->NpConstraint::isValid())
return false;
}
return true;
}
#endif
- #if PX_ENABLE_DEBUG_VISUALIZATION
- void NpRigidStatic::visualize(Cm::RenderOutput& out, NpScene* scene)
- {
- NpRigidStaticT::visualize(out, scene);
-
- if (getScbRigidStaticFast().getActorFlags() & PxActorFlag::eVISUALIZATION)
- {
- Scb::Scene& scbScene = scene->getScene();
- PxReal scale = scbScene.getVisualizationParameter(PxVisualizationParameter::eSCALE);
-
- //visualize actor frames
- PxReal actorAxes = scale * scbScene.getVisualizationParameter(PxVisualizationParameter::eACTOR_AXES);
- if (actorAxes != 0)
- out << getGlobalPose() << Cm::DebugBasis(PxVec3(actorAxes));
- }
- }
- #endif