openmw/components/debug/debugdraw.hpp
florent.teppe e811f7ed00 Simplified the data structures.
DebugCustomDraw owns the vector of drawcalls and the line geometry.
There are two DebugCustomDraw, so anything they own is double buffered.
Because DebugDrawer has a ref_ptr on the DebugCustomDraw, they live at least as long as DebugDrawer, making memory access from it safe.

removed redundent this
2022-09-13 18:26:33 +02:00

92 lines
2.9 KiB
C++

#ifndef OPENMW_COMPONENTS_DEBUG_DEBUGDRAW_H
#define OPENMW_COMPONENTS_DEBUG_DEBUGDRAW_H
#include <osg/Drawable>
#include <osg/Vec3>
#include <osg/ref_ptr>
#include <array>
#include <memory>
#include <vector>
namespace osg
{
class Group;
class Geometry;
class Geometry;
class RenderInfo;
}
namespace Shader
{
class ShaderManager;
}
namespace Debug
{
static const osg::Vec3f colorWhite = osg::Vec3(1., 1., 1.);
static const osg::Vec3f colorRed = osg::Vec3(1., 0., 0.);
static const osg::Vec3f colorBlue = osg::Vec3(0., 0., 1.);
static const osg::Vec3f colorGreen = osg::Vec3(0., 1., 0.);
static const osg::Vec3f colorMagenta = osg::Vec3(1., 0., 1.);
static const osg::Vec3f colorYellow = osg::Vec3(1., 1., 0.);
static const osg::Vec3f colorCyan = osg::Vec3(0., 1., 1.);
static const osg::Vec3f colorBlack = osg::Vec3(0., 0., 0.);
static const osg::Vec3f colorDarkGrey = osg::Vec3(0.25, 0.25, 0.25);
class DebugDrawCallback;
enum class DrawShape
{
Cube,
Cylinder,
WireCube,
};
struct DrawCall
{
osg::Vec3f mPosition;
osg::Vec3f mDims;
osg::Vec3f mColor;
DrawShape mDrawShape;
static DrawCall cube(osg::Vec3f pos, osg::Vec3 dims = osg::Vec3(50., 50., 50.), osg::Vec3 color = colorWhite) { return { pos, dims, color, DrawShape::Cube }; }
static DrawCall wireCube(osg::Vec3f pos, osg::Vec3 dims = osg::Vec3(50., 50., 50.), osg::Vec3 color = colorWhite) { return { pos, dims, color, DrawShape::WireCube }; }
static DrawCall cylinder(osg::Vec3f pos, osg::Vec3 dims = osg::Vec3(50., 50., 50.), osg::Vec3 color = colorWhite) { return { pos, dims, color, DrawShape::Cylinder }; }
};
class DebugCustomDraw : public osg::Drawable
{
public:
DebugCustomDraw();
mutable std::vector<DrawCall> mShapesToDraw;
osg::ref_ptr<osg::Geometry> mLinesToDraw;
osg::ref_ptr<osg::Geometry> mCubeGeometry;
osg::ref_ptr<osg::Geometry> mCylinderGeometry;
osg::ref_ptr<osg::Geometry> mWireCubeGeometry;
virtual void drawImplementation(osg::RenderInfo&) const;
};
struct DebugDrawer
{
friend DebugDrawCallback;
DebugDrawer(Shader::ShaderManager& shaderManager, osg::ref_ptr<osg::Group> parentNode);
~DebugDrawer();
void drawCube(osg::Vec3f mPosition, osg::Vec3f mDims = osg::Vec3(50., 50., 50.), osg::Vec3f mColor = colorWhite);
void drawCubeMinMax(osg::Vec3f min, osg::Vec3f max, osg::Vec3f mColor = colorWhite);
void addDrawCall(const DrawCall& draw);
void addLine(const osg::Vec3& start, const osg::Vec3& end, const osg::Vec3 color = colorWhite);
private:
long long int mCurrentFrame;
std::array<osg::ref_ptr<DebugCustomDraw>, 2> mCustomDebugDrawer;
osg::ref_ptr<osg::Group> mDebugDrawSceneObjects;
};
}
#endif // !