1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-01-01 03:21:41 +00:00
OpenMW/apps/opencs/view/render/pathgrid.hpp
florent.teppe 65cdd489fb create a specific esm reader function for RefID to avoid allocation for string and then again for RefId
Fixed some types

removed useless header

applied clang format

fixed compile tests

fixed clang tidy, and closer to logic before this MR

Removed hardcoded refids

unless there is a returned value we don't use static RefIds
can use == between RefId and hardcoded string

Fix clang format

Fixed a few instances where std::string was used, when only const std::string& was needed

removed unused variable
2022-12-27 19:15:57 +01:00

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