From 292fa0b5e319081a48e2065f92fb3c769bc881bf Mon Sep 17 00:00:00 2001 From: scrawl Date: Wed, 3 Jun 2015 03:13:51 +0200 Subject: [PATCH] Unify raycasting techniques for "on touch" magic We don't want pixel-precise raycasting here. Gets annoying when trying to hit a skeleton. --- apps/openmw/mwworld/worldimp.cpp | 54 +++++++++++++------------------- 1 file changed, 22 insertions(+), 32 deletions(-) diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index 6376772c3..2f9a13f78 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -2638,43 +2638,33 @@ namespace MWWorld float distance = 192.f; // ?? osg::Vec3f hitPosition = actor.getRefData().getPosition().asVec3(); - if (actor == getPlayerPtr()) - { - // 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()); + // For NPCs use facing direction from Head node + osg::Vec3f origin(actor.getRefData().getPosition().asVec3()); - MWRender::Animation* anim = mRendering->getAnimation(actor); - if (anim != NULL) + MWRender::Animation* anim = mRendering->getAnimation(actor); + 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"); - if (node == NULL) - node = anim->getNode("Bip01 Head"); - if (node != NULL) - { - osg::MatrixList mats = node->getWorldMatrices(); - if (mats.size()) - origin = mats[0].getTrans(); - } + 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(); MWMechanics::CastSpell cast(actor, target);