1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-01-25 15:35:23 +00:00
OpenMW/apps/openmw/mwrender/characterpreview.hpp
madsbuvi dd5901d351 Initial commit
Multiview shaders.

Refactor Frustum management

Rewrite shared shadow map

cull mask should respect stereo

Stereo savegame screencap

LocalMap refactoring

use the vertex buffer hint instead of the display list patch to enable/disable display lists

Character preview fixes
2022-04-28 21:05:34 +02:00

130 lines
3.2 KiB
C++

#ifndef MWRENDER_CHARACTERPREVIEW_H
#define MWRENDER_CHARACTERPREVIEW_H
#include <osg/ref_ptr>
#include <memory>
#include <osg/PositionAttitudeTransform>
#include <components/esm3/loadnpc.hpp>
#include <components/resource/resourcesystem.hpp>
#include "../mwworld/ptr.hpp"
namespace osg
{
class Texture2D;
class Camera;
class Group;
class Viewport;
class StateSet;
}
namespace MWRender
{
class NpcAnimation;
class DrawOnceCallback;
class CharacterPreviewRTTNode;
class CharacterPreview
{
public:
CharacterPreview(osg::Group* parent, Resource::ResourceSystem* resourceSystem, const MWWorld::Ptr& character, int sizeX, int sizeY,
const osg::Vec3f& position, const osg::Vec3f& lookAt);
virtual ~CharacterPreview();
int getTextureWidth() const;
int getTextureHeight() const;
void redraw();
void rebuild();
osg::ref_ptr<osg::Texture2D> getTexture();
/// Get the osg::StateSet required to render the texture correctly, if any.
osg::StateSet* getTextureStateSet() { return mTextureStateSet; }
private:
CharacterPreview(const CharacterPreview&);
CharacterPreview& operator=(const CharacterPreview&);
protected:
virtual bool renderHeadOnly() { return false; }
void setBlendMode();
virtual void onSetup();
osg::ref_ptr<osg::Group> mParent;
Resource::ResourceSystem* mResourceSystem;
osg::ref_ptr<osg::StateSet> mTextureStateSet;
osg::ref_ptr<DrawOnceCallback> mDrawOnceCallback;
osg::ref_ptr<CharacterPreviewRTTNode> mRTTNode;
osg::Vec3f mPosition;
osg::Vec3f mLookAt;
MWWorld::Ptr mCharacter;
osg::ref_ptr<MWRender::NpcAnimation> mAnimation;
osg::ref_ptr<osg::PositionAttitudeTransform> mNode;
std::string mCurrentAnimGroup;
int mSizeX;
int mSizeY;
};
class InventoryPreview : public CharacterPreview
{
public:
InventoryPreview(osg::Group* parent, Resource::ResourceSystem* resourceSystem, const MWWorld::Ptr& character);
void updatePtr(const MWWorld::Ptr& ptr);
void update(); // Render preview again, e.g. after changed equipment
void setViewport(int sizeX, int sizeY);
int getSlotSelected(int posX, int posY);
protected:
osg::ref_ptr<osg::Viewport> mViewport;
void onSetup() override;
};
class UpdateCameraCallback;
class RaceSelectionPreview : public CharacterPreview
{
ESM::NPC mBase;
MWWorld::LiveCellRef<ESM::NPC> mRef;
protected:
bool renderHeadOnly() override { return true; }
void onSetup() override;
public:
RaceSelectionPreview(osg::Group* parent, Resource::ResourceSystem* resourceSystem);
virtual ~RaceSelectionPreview();
void setAngle(float angleRadians);
const ESM::NPC &getPrototype() const {
return mBase;
}
void setPrototype(const ESM::NPC &proto);
private:
osg::ref_ptr<UpdateCameraCallback> mUpdateCameraCallback;
float mPitchRadians;
};
}
#endif