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.
137 lines
3.8 KiB
C++
137 lines
3.8 KiB
C++
#ifndef CSV_RENDER_PATHGRID_H
|
|
#define CSV_RENDER_PATHGRID_H
|
|
|
|
#include <algorithm>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include <QString>
|
|
#include <osg/Vec3d>
|
|
#include <osg/ref_ptr>
|
|
|
|
#include "../../model/world/cellcoordinates.hpp"
|
|
#include "../../model/world/subcellcollection.hpp"
|
|
#include "tagbase.hpp"
|
|
#include <components/esm/refid.hpp>
|
|
|
|
namespace osg
|
|
{
|
|
class Vec3f;
|
|
class Geometry;
|
|
class Group;
|
|
class PositionAttitudeTransform;
|
|
}
|
|
|
|
namespace CSMWorld
|
|
{
|
|
class CommandMacro;
|
|
class Data;
|
|
struct Pathgrid;
|
|
}
|
|
|
|
namespace CSVRender
|
|
{
|
|
class Pathgrid;
|
|
|
|
struct WorldspaceHitResult;
|
|
|
|
class PathgridTag : public TagBase
|
|
{
|
|
public:
|
|
PathgridTag(Pathgrid* pathgrid);
|
|
|
|
Pathgrid* getPathgrid() const;
|
|
|
|
QString getToolTip(bool hideBasics, const WorldspaceHitResult& hit) const override;
|
|
|
|
private:
|
|
Pathgrid* mPathgrid;
|
|
};
|
|
|
|
class Pathgrid
|
|
{
|
|
public:
|
|
typedef std::vector<unsigned short> NodeList;
|
|
|
|
Pathgrid(CSMWorld::Data& data, osg::Group* parent, const std::string& pathgridId,
|
|
const CSMWorld::CellCoordinates& coordinates);
|
|
|
|
~Pathgrid();
|
|
|
|
const CSMWorld::CellCoordinates& getCoordinates() const;
|
|
const std::string& getId() const;
|
|
|
|
bool isSelected() const;
|
|
const NodeList& getSelected() const;
|
|
void selectAll();
|
|
void toggleSelected(unsigned short node); // Adds to end of vector
|
|
void invertSelected();
|
|
void clearSelected();
|
|
|
|
void moveSelected(const osg::Vec3d& offset);
|
|
void setDragOrigin(unsigned short node);
|
|
void setDragEndpoint(unsigned short node);
|
|
void setDragEndpoint(const osg::Vec3d& pos);
|
|
|
|
void resetIndicators();
|
|
|
|
void applyPoint(CSMWorld::CommandMacro& commands, const osg::Vec3d& worldPos);
|
|
void applyPosition(CSMWorld::CommandMacro& commands);
|
|
void applyEdge(CSMWorld::CommandMacro& commands, unsigned short node1, unsigned short node2);
|
|
void applyEdges(CSMWorld::CommandMacro& commands, unsigned short node);
|
|
void applyRemoveNodes(CSMWorld::CommandMacro& commands);
|
|
void applyRemoveEdges(CSMWorld::CommandMacro& commands);
|
|
|
|
osg::ref_ptr<PathgridTag> getTag() const;
|
|
|
|
void recreateGeometry();
|
|
void removeGeometry();
|
|
|
|
void update();
|
|
|
|
private:
|
|
CSMWorld::Data& mData;
|
|
CSMWorld::SubCellCollection<CSMWorld::Pathgrid>& mPathgridCollection;
|
|
ESM::RefId mId;
|
|
CSMWorld::CellCoordinates mCoords;
|
|
bool mInterior;
|
|
|
|
NodeList mSelected;
|
|
osg::Vec3d mMoveOffset;
|
|
unsigned short mDragOrigin;
|
|
|
|
bool mChangeGeometry;
|
|
bool mRemoveGeometry;
|
|
bool mUseOffset;
|
|
|
|
osg::Group* mParent;
|
|
osg::ref_ptr<osg::PositionAttitudeTransform> mBaseNode;
|
|
osg::ref_ptr<osg::Group> mPathgridGroup;
|
|
osg::ref_ptr<osg::Geometry> mPathgridGeometry;
|
|
osg::ref_ptr<osg::Geometry> mSelectedGeometry;
|
|
osg::ref_ptr<osg::Geometry> mDragGeometry;
|
|
|
|
osg::ref_ptr<PathgridTag> mTag;
|
|
|
|
void createGeometry();
|
|
void createSelectedGeometry();
|
|
void createSelectedGeometry(const CSMWorld::Pathgrid& source);
|
|
void removePathgridGeometry();
|
|
void removeSelectedGeometry();
|
|
|
|
void createDragGeometry(const osg::Vec3f& start, const osg::Vec3f& end, bool valid);
|
|
|
|
const CSMWorld::Pathgrid* getPathgridSource();
|
|
|
|
int edgeExists(const CSMWorld::Pathgrid& source, unsigned short node1, unsigned short node2);
|
|
void addEdge(CSMWorld::CommandMacro& commands, const CSMWorld::Pathgrid& source, unsigned short node1,
|
|
unsigned short node2);
|
|
void removeEdge(CSMWorld::CommandMacro& commands, const CSMWorld::Pathgrid& source, unsigned short node1,
|
|
unsigned short node2);
|
|
|
|
int clampToCell(int v);
|
|
};
|
|
}
|
|
|
|
#endif
|