mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-04-18 10:36:49 +00:00
Ignore caster collision shape. Sometimes the magic bolt get launched
inside too near its caster.
This commit is contained in:
parent
7e85235220
commit
4fbe1ed12c
6 changed files with 25 additions and 15 deletions
|
@ -25,14 +25,18 @@ namespace MWPhysics
|
||||||
|
|
||||||
if (convexResult.m_hitCollisionObject->getBroadphaseHandle()->m_collisionFilterGroup == CollisionType_Projectile)
|
if (convexResult.m_hitCollisionObject->getBroadphaseHandle()->m_collisionFilterGroup == CollisionType_Projectile)
|
||||||
{
|
{
|
||||||
Projectile* projectileHolder = static_cast<Projectile*>(convexResult.m_hitCollisionObject->getUserPointer());
|
auto* projectileHolder = static_cast<Projectile*>(convexResult.m_hitCollisionObject->getUserPointer());
|
||||||
if (!projectileHolder->isActive())
|
if (!projectileHolder->isActive())
|
||||||
return btScalar(1);
|
return btScalar(1);
|
||||||
PtrHolder* targetHolder = static_cast<PtrHolder*>(mMe->getUserPointer());
|
auto* targetHolder = static_cast<PtrHolder*>(mMe->getUserPointer());
|
||||||
const MWWorld::Ptr target = targetHolder->getPtr();
|
const MWWorld::Ptr target = targetHolder->getPtr();
|
||||||
|
// do nothing if we hit the caster. Sometimes the launching origin is inside of caster collision shape
|
||||||
|
if (projectileHolder->getCaster() != target)
|
||||||
|
{
|
||||||
projectileHolder->hit(target, convexResult.m_hitPointLocal, convexResult.m_hitNormalLocal);
|
projectileHolder->hit(target, convexResult.m_hitPointLocal, convexResult.m_hitNormalLocal);
|
||||||
return btScalar(1);
|
return btScalar(1);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
btVector3 hitNormalWorld;
|
btVector3 hitNormalWorld;
|
||||||
if (normalInWorldSpace)
|
if (normalInWorldSpace)
|
||||||
|
|
|
@ -661,10 +661,10 @@ namespace MWPhysics
|
||||||
mActors.emplace(ptr, std::move(actor));
|
mActors.emplace(ptr, std::move(actor));
|
||||||
}
|
}
|
||||||
|
|
||||||
int PhysicsSystem::addProjectile (const osg::Vec3f& position)
|
int PhysicsSystem::addProjectile (const MWWorld::Ptr& caster, const osg::Vec3f& position)
|
||||||
{
|
{
|
||||||
mProjectileId++;
|
mProjectileId++;
|
||||||
auto projectile = std::make_shared<Projectile>(mProjectileId, position, mTaskScheduler.get(), this);
|
auto projectile = std::make_shared<Projectile>(mProjectileId, caster, position, mTaskScheduler.get(), this);
|
||||||
mProjectiles.emplace(mProjectileId, std::move(projectile));
|
mProjectiles.emplace(mProjectileId, std::move(projectile));
|
||||||
|
|
||||||
return mProjectileId;
|
return mProjectileId;
|
||||||
|
|
|
@ -128,7 +128,7 @@ namespace MWPhysics
|
||||||
void addObject (const MWWorld::Ptr& ptr, const std::string& mesh, int collisionType = CollisionType_World);
|
void addObject (const MWWorld::Ptr& ptr, const std::string& mesh, int collisionType = CollisionType_World);
|
||||||
void addActor (const MWWorld::Ptr& ptr, const std::string& mesh);
|
void addActor (const MWWorld::Ptr& ptr, const std::string& mesh);
|
||||||
|
|
||||||
int addProjectile(const osg::Vec3f& position);
|
int addProjectile(const MWWorld::Ptr& caster, const osg::Vec3f& position);
|
||||||
void updateProjectile(const int projectileId, const osg::Vec3f &position);
|
void updateProjectile(const int projectileId, const osg::Vec3f &position);
|
||||||
void removeProjectile(const int projectileId);
|
void removeProjectile(const int projectileId);
|
||||||
|
|
||||||
|
|
|
@ -18,8 +18,9 @@
|
||||||
|
|
||||||
namespace MWPhysics
|
namespace MWPhysics
|
||||||
{
|
{
|
||||||
Projectile::Projectile(int projectileId, const osg::Vec3f& position, PhysicsTaskScheduler* scheduler, PhysicsSystem* physicssystem)
|
Projectile::Projectile(int projectileId, const MWWorld::Ptr& caster, const osg::Vec3f& position, PhysicsTaskScheduler* scheduler, PhysicsSystem* physicssystem)
|
||||||
: mActive(true)
|
: mActive(true)
|
||||||
|
, mCaster(caster)
|
||||||
, mPhysics(physicssystem)
|
, mPhysics(physicssystem)
|
||||||
, mTaskScheduler(scheduler)
|
, mTaskScheduler(scheduler)
|
||||||
, mProjectileId(projectileId)
|
, mProjectileId(projectileId)
|
||||||
|
|
|
@ -32,7 +32,7 @@ namespace MWPhysics
|
||||||
class Projectile final : public PtrHolder
|
class Projectile final : public PtrHolder
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Projectile(const int projectileId, const osg::Vec3f& position, PhysicsTaskScheduler* scheduler, PhysicsSystem* physicssystem);
|
Projectile(const int projectileId, const MWWorld::Ptr& caster, const osg::Vec3f& position, PhysicsTaskScheduler* scheduler, PhysicsSystem* physicssystem);
|
||||||
~Projectile() override;
|
~Projectile() override;
|
||||||
|
|
||||||
btConvexShape* getConvexShape() const { return mConvexShape; }
|
btConvexShape* getConvexShape() const { return mConvexShape; }
|
||||||
|
@ -62,6 +62,8 @@ namespace MWPhysics
|
||||||
return mHitTarget;
|
return mHitTarget;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MWWorld::Ptr getCaster() const { return mCaster; }
|
||||||
|
|
||||||
osg::Vec3f getHitPos() const
|
osg::Vec3f getHitPos() const
|
||||||
{
|
{
|
||||||
assert(!mActive);
|
assert(!mActive);
|
||||||
|
@ -80,6 +82,7 @@ namespace MWPhysics
|
||||||
btTransform mLocalTransform;
|
btTransform mLocalTransform;
|
||||||
bool mTransformUpdatePending;
|
bool mTransformUpdatePending;
|
||||||
std::atomic<bool> mActive;
|
std::atomic<bool> mActive;
|
||||||
|
MWWorld::Ptr mCaster;
|
||||||
MWWorld::Ptr mHitTarget;
|
MWWorld::Ptr mHitTarget;
|
||||||
btVector3 mHitPosition;
|
btVector3 mHitPosition;
|
||||||
btVector3 mHitNormal;
|
btVector3 mHitNormal;
|
||||||
|
|
|
@ -316,7 +316,7 @@ namespace MWWorld
|
||||||
state.mSounds.push_back(sound);
|
state.mSounds.push_back(sound);
|
||||||
}
|
}
|
||||||
|
|
||||||
state.mProjectileId = mPhysics->addProjectile(pos);
|
state.mProjectileId = mPhysics->addProjectile(caster, pos);
|
||||||
state.mToDelete = false;
|
state.mToDelete = false;
|
||||||
mMagicBolts.push_back(state);
|
mMagicBolts.push_back(state);
|
||||||
}
|
}
|
||||||
|
@ -340,7 +340,7 @@ namespace MWWorld
|
||||||
if (!ptr.getClass().getEnchantment(ptr).empty())
|
if (!ptr.getClass().getEnchantment(ptr).empty())
|
||||||
SceneUtil::addEnchantedGlow(state.mNode, mResourceSystem, ptr.getClass().getEnchantmentColor(ptr));
|
SceneUtil::addEnchantedGlow(state.mNode, mResourceSystem, ptr.getClass().getEnchantmentColor(ptr));
|
||||||
|
|
||||||
state.mProjectileId = mPhysics->addProjectile(pos);
|
state.mProjectileId = mPhysics->addProjectile(actor, pos);
|
||||||
state.mToDelete = false;
|
state.mToDelete = false;
|
||||||
mProjectiles.push_back(state);
|
mProjectiles.push_back(state);
|
||||||
}
|
}
|
||||||
|
@ -546,7 +546,8 @@ namespace MWWorld
|
||||||
const auto target = projectile->getTarget();
|
const auto target = projectile->getTarget();
|
||||||
const auto pos = projectile->getHitPos();
|
const auto pos = projectile->getHitPos();
|
||||||
MWWorld::Ptr caster = projectileState.getCaster();
|
MWWorld::Ptr caster = projectileState.getCaster();
|
||||||
if (caster == target || !isValidTarget(caster, target))
|
assert(target != caster);
|
||||||
|
if (!isValidTarget(caster, target))
|
||||||
{
|
{
|
||||||
projectile->activate();
|
projectile->activate();
|
||||||
continue;
|
continue;
|
||||||
|
@ -581,7 +582,8 @@ namespace MWWorld
|
||||||
const auto target = projectile->getTarget();
|
const auto target = projectile->getTarget();
|
||||||
const auto pos = projectile->getHitPos();
|
const auto pos = projectile->getHitPos();
|
||||||
MWWorld::Ptr caster = magicBoltState.getCaster();
|
MWWorld::Ptr caster = magicBoltState.getCaster();
|
||||||
if (caster == target || !isValidTarget(caster, target))
|
assert(target != caster);
|
||||||
|
if (!isValidTarget(caster, target))
|
||||||
{
|
{
|
||||||
projectile->activate();
|
projectile->activate();
|
||||||
continue;
|
continue;
|
||||||
|
@ -724,7 +726,7 @@ namespace MWWorld
|
||||||
int weaponType = ptr.get<ESM::Weapon>()->mBase->mData.mType;
|
int weaponType = ptr.get<ESM::Weapon>()->mBase->mData.mType;
|
||||||
state.mThrown = MWMechanics::getWeaponType(weaponType)->mWeaponClass == ESM::WeaponType::Thrown;
|
state.mThrown = MWMechanics::getWeaponType(weaponType)->mWeaponClass == ESM::WeaponType::Thrown;
|
||||||
|
|
||||||
state.mProjectileId = mPhysics->addProjectile(osg::Vec3f(esm.mPosition));
|
state.mProjectileId = mPhysics->addProjectile(state.getCaster(), osg::Vec3f(esm.mPosition));
|
||||||
}
|
}
|
||||||
catch(...)
|
catch(...)
|
||||||
{
|
{
|
||||||
|
@ -769,7 +771,7 @@ namespace MWWorld
|
||||||
MWWorld::ManualRef ref(MWBase::Environment::get().getWorld()->getStore(), state.mIdMagic.at(0));
|
MWWorld::ManualRef ref(MWBase::Environment::get().getWorld()->getStore(), state.mIdMagic.at(0));
|
||||||
MWWorld::Ptr ptr = ref.getPtr();
|
MWWorld::Ptr ptr = ref.getPtr();
|
||||||
model = ptr.getClass().getModel(ptr);
|
model = ptr.getClass().getModel(ptr);
|
||||||
state.mProjectileId = mPhysics->addProjectile(osg::Vec3f(esm.mPosition));
|
state.mProjectileId = mPhysics->addProjectile(state.getCaster(), osg::Vec3f(esm.mPosition));
|
||||||
}
|
}
|
||||||
catch(...)
|
catch(...)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue