mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-03-14 01:19:59 +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
@ -25,13 +25,17 @@ namespace MWPhysics
|
||||
|
||||
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())
|
||||
return btScalar(1);
|
||||
PtrHolder* targetHolder = static_cast<PtrHolder*>(mMe->getUserPointer());
|
||||
auto* targetHolder = static_cast<PtrHolder*>(mMe->getUserPointer());
|
||||
const MWWorld::Ptr target = targetHolder->getPtr();
|
||||
projectileHolder->hit(target, convexResult.m_hitPointLocal, convexResult.m_hitNormalLocal);
|
||||
return btScalar(1);
|
||||
// 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);
|
||||
return btScalar(1);
|
||||
}
|
||||
}
|
||||
|
||||
btVector3 hitNormalWorld;
|
||||
|
@ -661,10 +661,10 @@ namespace MWPhysics
|
||||
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++;
|
||||
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));
|
||||
|
||||
return mProjectileId;
|
||||
|
@ -128,7 +128,7 @@ namespace MWPhysics
|
||||
void addObject (const MWWorld::Ptr& ptr, const std::string& mesh, int collisionType = CollisionType_World);
|
||||
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 removeProjectile(const int projectileId);
|
||||
|
||||
|
@ -18,8 +18,9 @@
|
||||
|
||||
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)
|
||||
, mCaster(caster)
|
||||
, mPhysics(physicssystem)
|
||||
, mTaskScheduler(scheduler)
|
||||
, mProjectileId(projectileId)
|
||||
|
@ -32,7 +32,7 @@ namespace MWPhysics
|
||||
class Projectile final : public PtrHolder
|
||||
{
|
||||
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;
|
||||
|
||||
btConvexShape* getConvexShape() const { return mConvexShape; }
|
||||
@ -62,6 +62,8 @@ namespace MWPhysics
|
||||
return mHitTarget;
|
||||
}
|
||||
|
||||
MWWorld::Ptr getCaster() const { return mCaster; }
|
||||
|
||||
osg::Vec3f getHitPos() const
|
||||
{
|
||||
assert(!mActive);
|
||||
@ -80,6 +82,7 @@ namespace MWPhysics
|
||||
btTransform mLocalTransform;
|
||||
bool mTransformUpdatePending;
|
||||
std::atomic<bool> mActive;
|
||||
MWWorld::Ptr mCaster;
|
||||
MWWorld::Ptr mHitTarget;
|
||||
btVector3 mHitPosition;
|
||||
btVector3 mHitNormal;
|
||||
|
@ -316,7 +316,7 @@ namespace MWWorld
|
||||
state.mSounds.push_back(sound);
|
||||
}
|
||||
|
||||
state.mProjectileId = mPhysics->addProjectile(pos);
|
||||
state.mProjectileId = mPhysics->addProjectile(caster, pos);
|
||||
state.mToDelete = false;
|
||||
mMagicBolts.push_back(state);
|
||||
}
|
||||
@ -340,7 +340,7 @@ namespace MWWorld
|
||||
if (!ptr.getClass().getEnchantment(ptr).empty())
|
||||
SceneUtil::addEnchantedGlow(state.mNode, mResourceSystem, ptr.getClass().getEnchantmentColor(ptr));
|
||||
|
||||
state.mProjectileId = mPhysics->addProjectile(pos);
|
||||
state.mProjectileId = mPhysics->addProjectile(actor, pos);
|
||||
state.mToDelete = false;
|
||||
mProjectiles.push_back(state);
|
||||
}
|
||||
@ -546,7 +546,8 @@ namespace MWWorld
|
||||
const auto target = projectile->getTarget();
|
||||
const auto pos = projectile->getHitPos();
|
||||
MWWorld::Ptr caster = projectileState.getCaster();
|
||||
if (caster == target || !isValidTarget(caster, target))
|
||||
assert(target != caster);
|
||||
if (!isValidTarget(caster, target))
|
||||
{
|
||||
projectile->activate();
|
||||
continue;
|
||||
@ -581,7 +582,8 @@ namespace MWWorld
|
||||
const auto target = projectile->getTarget();
|
||||
const auto pos = projectile->getHitPos();
|
||||
MWWorld::Ptr caster = magicBoltState.getCaster();
|
||||
if (caster == target || !isValidTarget(caster, target))
|
||||
assert(target != caster);
|
||||
if (!isValidTarget(caster, target))
|
||||
{
|
||||
projectile->activate();
|
||||
continue;
|
||||
@ -724,7 +726,7 @@ namespace MWWorld
|
||||
int weaponType = ptr.get<ESM::Weapon>()->mBase->mData.mType;
|
||||
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(...)
|
||||
{
|
||||
@ -769,7 +771,7 @@ namespace MWWorld
|
||||
MWWorld::ManualRef ref(MWBase::Environment::get().getWorld()->getStore(), state.mIdMagic.at(0));
|
||||
MWWorld::Ptr ptr = ref.getPtr();
|
||||
model = ptr.getClass().getModel(ptr);
|
||||
state.mProjectileId = mPhysics->addProjectile(osg::Vec3f(esm.mPosition));
|
||||
state.mProjectileId = mPhysics->addProjectile(state.getCaster(), osg::Vec3f(esm.mPosition));
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user