forked from teamnwah/openmw-tes3coop
Unify raycasting techniques for "on touch" magic
We don't want pixel-precise raycasting here. Gets annoying when trying to hit a skeleton.
This commit is contained in:
parent
cee1db532f
commit
292fa0b5e3
1 changed files with 22 additions and 32 deletions
|
@ -2638,43 +2638,33 @@ namespace MWWorld
|
||||||
float distance = 192.f; // ??
|
float distance = 192.f; // ??
|
||||||
osg::Vec3f hitPosition = actor.getRefData().getPosition().asVec3();
|
osg::Vec3f hitPosition = actor.getRefData().getPosition().asVec3();
|
||||||
|
|
||||||
if (actor == getPlayerPtr())
|
// For NPCs use facing direction from Head node
|
||||||
{
|
osg::Vec3f origin(actor.getRefData().getPosition().asVec3());
|
||||||
// For the player, use camera to aim
|
|
||||||
target = getFacedObject(distance);
|
|
||||||
if (!target.isEmpty())
|
|
||||||
hitPosition = target.getRefData().getPosition().asVec3();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// For NPCs use facing direction from Head node
|
|
||||||
osg::Vec3f origin(actor.getRefData().getPosition().asVec3());
|
|
||||||
|
|
||||||
MWRender::Animation* anim = mRendering->getAnimation(actor);
|
MWRender::Animation* anim = mRendering->getAnimation(actor);
|
||||||
if (anim != NULL)
|
if (anim != NULL)
|
||||||
|
{
|
||||||
|
const osg::Node* node = anim->getNode("Head");
|
||||||
|
if (node == NULL)
|
||||||
|
node = anim->getNode("Bip01 Head");
|
||||||
|
if (node != NULL)
|
||||||
{
|
{
|
||||||
const osg::Node* node = anim->getNode("Head");
|
osg::MatrixList mats = node->getWorldMatrices();
|
||||||
if (node == NULL)
|
if (mats.size())
|
||||||
node = anim->getNode("Bip01 Head");
|
origin = mats[0].getTrans();
|
||||||
if (node != NULL)
|
|
||||||
{
|
|
||||||
osg::MatrixList mats = node->getWorldMatrices();
|
|
||||||
if (mats.size())
|
|
||||||
origin = mats[0].getTrans();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
osg::Quat orient = osg::Quat(actor.getRefData().getPosition().rot[0], osg::Vec3f(-1,0,0))
|
|
||||||
* osg::Quat(actor.getRefData().getPosition().rot[2], osg::Vec3f(0,0,-1));
|
|
||||||
|
|
||||||
osg::Vec3f direction = orient * osg::Vec3f(0,1,0);
|
|
||||||
osg::Vec3f dest = origin + direction * distance;
|
|
||||||
|
|
||||||
MWPhysics::PhysicsSystem::RayResult result = mPhysics->castRay(origin, dest, actor);
|
|
||||||
target = result.mHitObject;
|
|
||||||
hitPosition = result.mHitPos;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
osg::Quat orient = osg::Quat(actor.getRefData().getPosition().rot[0], osg::Vec3f(-1,0,0))
|
||||||
|
* osg::Quat(actor.getRefData().getPosition().rot[2], osg::Vec3f(0,0,-1));
|
||||||
|
|
||||||
|
osg::Vec3f direction = orient * osg::Vec3f(0,1,0);
|
||||||
|
osg::Vec3f dest = origin + direction * distance;
|
||||||
|
|
||||||
|
MWPhysics::PhysicsSystem::RayResult result = mPhysics->castRay(origin, dest, actor);
|
||||||
|
target = result.mHitObject;
|
||||||
|
hitPosition = result.mHitPos;
|
||||||
|
|
||||||
std::string selectedSpell = stats.getSpells().getSelectedSpell();
|
std::string selectedSpell = stats.getSpells().getSelectedSpell();
|
||||||
|
|
||||||
MWMechanics::CastSpell cast(actor, target);
|
MWMechanics::CastSpell cast(actor, target);
|
||||||
|
|
Loading…
Reference in a new issue