1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-01-16 08:49:55 +00:00
openmw-tes3mp/apps/openmw/mwvr/vranimation.hpp
2020-03-28 16:30:56 +01:00

86 lines
3.1 KiB
C++

#ifndef MWVR_VRANIMATION_H
#define MWVR_VRANIMATION_H
#include "../mwrender/npcanimation.hpp"
#include "../mwrender/renderingmanager.hpp"
#include "openxrmanager.hpp"
#include "openxrsession.hpp"
namespace MWVR
{
class HandController;
class FingerController;
class ForearmController;
/// Subclassing NpcAnimation to override behaviours not compatible with VR
class VRAnimation : public MWRender::NpcAnimation
{
protected:
virtual void addControllers();
public:
/**
* @param ptr
* @param disableListener Don't listen for equipment changes and magic effects. InventoryStore only supports
* one listener at a time, so you shouldn't do this if creating several NpcAnimations
* for the same Ptr, eg preview dolls for the player.
* Those need to be manually rendered anyway.
* @param disableSounds Same as \a disableListener but for playing items sounds
* @param xrSession The XR session that shall be used to track limbs
*/
VRAnimation(const MWWorld::Ptr& ptr, osg::ref_ptr<osg::Group> parentNode, Resource::ResourceSystem* resourceSystem,
bool disableSounds, std::shared_ptr<OpenXRSession> xrSession );
virtual ~VRAnimation();
/// Overridden to always be false
virtual void enableHeadAnimation(bool enable);
/// Overridden to always be false
virtual void setAccurateAiming(bool enabled);
/// Overridden, implementation tbd
virtual osg::Vec3f runAnimation(float timepassed);
/// A relative factor (0-1) that decides if and how much the skeleton should be pitched
/// to indicate the facing orientation of the character.
virtual void setPitchFactor(float factor) { mPitchFactor = factor; }
/// Overriden to always be a variant of VM_VR*
virtual void setViewMode(ViewMode viewMode);
/// Overriden to include VR modifications
virtual void updateParts();
/// Overrides finger animations to point forward
void setPointForward(bool enabled);
bool canPlaceObject();
///< @return true if it is possible to place on object where the player is currently pointing
const MWRender::RayResult& getPointerTarget() const;
///< @return pointer to the object the player's melee weapon is currently intersecting.
void updatePointerTarget();
public:
static osg::ref_ptr<osg::Geometry> createPointerGeometry(void);
public:
std::shared_ptr<OpenXRSession> mSession;
osg::ref_ptr<ForearmController> mForearmControllers[2];
osg::ref_ptr<HandController> mHandControllers[2];
osg::ref_ptr<FingerController> mIndexFingerControllers[2];
osg::ref_ptr<osg::MatrixTransform> mModelOffset;
osg::ref_ptr<osg::Geometry> mPointerGeometry{ nullptr };
osg::ref_ptr<osg::MatrixTransform> mPointerRescale{ nullptr };
osg::ref_ptr<osg::MatrixTransform> mPointerTransform{ nullptr };
osg::ref_ptr<osg::MatrixTransform> mWeaponDirectionTransform{ nullptr };
osg::ref_ptr<osg::MatrixTransform> mWeaponPointerTransform{ nullptr };
MWRender::RayResult mPointerTarget{};
float mDistanceToPointerTarget{ -1.f };
};
}
#endif