mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-16 16:10:58 +00:00
c795e0bce6
Since actors can be active in 3x3 grid around the player, we need to first load all objects in a 5x5 grid around the player. Split load and unloading in 2 phases. Add an mInactiveCells set into the scene, which contains all cells inside the aforementioned 5x5 grid. These cells contains only heightfields and non-animated physics objects. Animated objects are tied to the scene graph, which doesn't exists yet in these cells, so we skip them.
63 lines
1.7 KiB
C++
63 lines
1.7 KiB
C++
#ifndef OPENMW_MWPHYSICS_OBJECT_H
|
|
#define OPENMW_MWPHYSICS_OBJECT_H
|
|
|
|
#include "ptrholder.hpp"
|
|
|
|
#include <LinearMath/btTransform.h>
|
|
#include <osg/Node>
|
|
|
|
#include <map>
|
|
#include <memory>
|
|
#include <mutex>
|
|
|
|
namespace Resource
|
|
{
|
|
class BulletShapeInstance;
|
|
}
|
|
|
|
class btCollisionObject;
|
|
class btQuaternion;
|
|
class btVector3;
|
|
|
|
namespace MWPhysics
|
|
{
|
|
class PhysicsTaskScheduler;
|
|
|
|
class Object final : public PtrHolder
|
|
{
|
|
public:
|
|
Object(const MWWorld::Ptr& ptr, osg::ref_ptr<Resource::BulletShapeInstance> shapeInstance, osg::Quat rotation, int collisionType, PhysicsTaskScheduler* scheduler);
|
|
~Object() override;
|
|
|
|
const Resource::BulletShapeInstance* getShapeInstance() const;
|
|
void setScale(float scale);
|
|
void setRotation(osg::Quat quat);
|
|
void setOrigin(const btVector3& vec);
|
|
void commitPositionChange();
|
|
btCollisionObject* getCollisionObject();
|
|
const btCollisionObject* getCollisionObject() const;
|
|
btTransform getTransform() const;
|
|
/// Return solid flag. Not used by the object itself, true by default.
|
|
bool isSolid() const;
|
|
void setSolid(bool solid);
|
|
bool isAnimated() const;
|
|
/// @brief update object shape
|
|
/// @return true if shape changed
|
|
bool animateCollisionShapes();
|
|
|
|
private:
|
|
std::unique_ptr<btCollisionObject> mCollisionObject;
|
|
osg::ref_ptr<Resource::BulletShapeInstance> mShapeInstance;
|
|
std::map<int, osg::NodePath> mRecIndexToNodePath;
|
|
bool mSolid;
|
|
btVector3 mScale;
|
|
btTransform mLocalTransform;
|
|
bool mScaleUpdatePending;
|
|
bool mTransformUpdatePending;
|
|
mutable std::mutex mPositionMutex;
|
|
PhysicsTaskScheduler* mTaskScheduler;
|
|
};
|
|
}
|
|
|
|
#endif
|