mirror of https://github.com/OpenMW/openmw.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
211 lines
5.6 KiB
C++
211 lines
5.6 KiB
C++
#ifndef OPENCS_VIEW_OBJECT_H
|
|
#define OPENCS_VIEW_OBJECT_H
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
|
|
#include <osg/Vec3f>
|
|
#include <osg/Vec4f>
|
|
#include <osg/ref_ptr>
|
|
|
|
#include <components/esm/position.hpp>
|
|
#include <components/esm/refid.hpp>
|
|
|
|
#include "tagbase.hpp"
|
|
|
|
class QModelIndex;
|
|
|
|
namespace osg
|
|
{
|
|
class PositionAttitudeTransform;
|
|
class Geometry;
|
|
class Group;
|
|
class Node;
|
|
}
|
|
|
|
namespace osgFX
|
|
{
|
|
class Scribe;
|
|
}
|
|
|
|
namespace Resource
|
|
{
|
|
class ResourceSystem;
|
|
}
|
|
|
|
namespace CSMWorld
|
|
{
|
|
class Data;
|
|
struct CellRef;
|
|
class CommandMacro;
|
|
}
|
|
|
|
namespace CSVRender
|
|
{
|
|
class Actor;
|
|
class Object;
|
|
struct WorldspaceHitResult;
|
|
|
|
// An object to attach as user data to the osg::Node, allows us to get an Object back from a Node when we are doing
|
|
// a ray query
|
|
class ObjectTag : public TagBase
|
|
{
|
|
public:
|
|
ObjectTag(Object* object);
|
|
|
|
Object* mObject;
|
|
|
|
QString getToolTip(bool hideBasics, const WorldspaceHitResult& hit) const override;
|
|
};
|
|
|
|
class ObjectMarkerTag : public ObjectTag
|
|
{
|
|
public:
|
|
ObjectMarkerTag(Object* object, int axis);
|
|
|
|
int mAxis;
|
|
};
|
|
|
|
class Object
|
|
{
|
|
public:
|
|
enum OverrideFlags
|
|
{
|
|
Override_Position = 1,
|
|
Override_Rotation = 2,
|
|
Override_Scale = 4
|
|
};
|
|
|
|
private:
|
|
static const float MarkerShaftWidth;
|
|
static const float MarkerShaftBaseLength;
|
|
static const float MarkerHeadWidth;
|
|
static const float MarkerHeadLength;
|
|
|
|
CSMWorld::Data& mData;
|
|
ESM::RefId mReferenceId;
|
|
ESM::RefId mReferenceableId;
|
|
osg::ref_ptr<osg::PositionAttitudeTransform> mRootNode;
|
|
osg::ref_ptr<osg::PositionAttitudeTransform> mBaseNode;
|
|
osg::ref_ptr<osgFX::Scribe> mOutline;
|
|
bool mSelected;
|
|
bool mSnapTarget;
|
|
osg::Group* mParentNode;
|
|
Resource::ResourceSystem* mResourceSystem;
|
|
bool mForceBaseToZero;
|
|
ESM::Position mPositionOverride;
|
|
float mScaleOverride;
|
|
int mOverrideFlags;
|
|
osg::ref_ptr<osg::Node> mMarker[3];
|
|
int mSubMode;
|
|
float mMarkerTransparency;
|
|
std::unique_ptr<Actor> mActor;
|
|
|
|
/// Not implemented
|
|
Object(const Object&);
|
|
|
|
/// Not implemented
|
|
Object& operator=(const Object&);
|
|
|
|
/// Remove object from node (includes deleting)
|
|
void clear();
|
|
|
|
/// Update model
|
|
/// @note Make sure adjustTransform() was called first so world space particles get positioned correctly
|
|
void update();
|
|
|
|
/// Adjust position, orientation and scale
|
|
void adjustTransform();
|
|
|
|
/// Throws an exception if *this was constructed with referenceable
|
|
const CSMWorld::CellRef& getReference() const;
|
|
|
|
void updateMarker();
|
|
|
|
osg::ref_ptr<osg::Node> makeMoveOrScaleMarker(int axis);
|
|
osg::ref_ptr<osg::Node> makeRotateMarker(int axis);
|
|
|
|
/// Sets up a stateset with properties common to all marker types.
|
|
void setupCommonMarkerState(osg::ref_ptr<osg::Geometry> geometry);
|
|
|
|
osg::Vec3f getMarkerPosition(float x, float y, float z, int axis);
|
|
|
|
public:
|
|
Object(CSMWorld::Data& data, osg::Group* cellNode, const std::string& id, bool referenceable,
|
|
bool forceBaseToZero = false);
|
|
/// \param forceBaseToZero If this is a reference ignore the coordinates and place
|
|
/// it at 0, 0, 0 instead.
|
|
|
|
~Object();
|
|
|
|
/// Mark the object as selected, selected objects show an outline effect
|
|
void setSelected(bool selected, const osg::Vec4f& color = osg::Vec4f(1, 1, 1, 1));
|
|
|
|
bool getSelected() const;
|
|
|
|
/// Mark Object as "snap target"
|
|
void setSnapTarget(bool isSnapTarget);
|
|
|
|
bool getSnapTarget() const;
|
|
|
|
/// Get object node with GUI graphics
|
|
osg::ref_ptr<osg::Group> getRootNode();
|
|
|
|
/// Get object node without GUI graphics
|
|
osg::ref_ptr<osg::Group> getBaseNode();
|
|
|
|
/// \return Did this call result in a modification of the visual representation of
|
|
/// this object?
|
|
bool referenceableDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight);
|
|
|
|
/// \return Did this call result in a modification of the visual representation of
|
|
/// this object?
|
|
bool referenceableAboutToBeRemoved(const QModelIndex& parent, int start, int end);
|
|
|
|
/// \return Did this call result in a modification of the visual representation of
|
|
/// this object?
|
|
bool referenceDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight);
|
|
|
|
/// Reloads the underlying asset
|
|
void reloadAssets();
|
|
|
|
/// Returns an empty string if this is a refereceable-type object.
|
|
std::string getReferenceId() const;
|
|
|
|
std::string getReferenceableId() const;
|
|
|
|
osg::ref_ptr<TagBase> getTag() const;
|
|
|
|
/// Is there currently an editing operation running on this object?
|
|
bool isEdited() const;
|
|
|
|
void setEdited(int flags);
|
|
|
|
ESM::Position getPosition() const;
|
|
|
|
float getScale() const;
|
|
|
|
/// Set override position.
|
|
void setPosition(const float position[3]);
|
|
|
|
/// Set override rotation
|
|
void setRotation(const float rotation[3]);
|
|
|
|
/// Set override scale
|
|
void setScale(float scale);
|
|
|
|
void setMarkerTransparency(float value);
|
|
|
|
/// Apply override changes via command and end edit mode
|
|
void apply(CSMWorld::CommandMacro& commands);
|
|
|
|
void setSubMode(int subMode);
|
|
|
|
/// Erase all overrides and restore the visual representation of the object to its
|
|
/// true state.
|
|
void reset();
|
|
};
|
|
}
|
|
|
|
#endif
|