Files
qt6-migration-pipeline/external/dtEntity/include/dtEntityOSG/osgdebugdrawinterface.h
T
torsten 99e70069ad
Qt6 Migration CI / migrate (push) Canceled after 0s
Adds external dep dtentity
2026-10-24 09:01:01 +00:00

294 lines
11 KiB
C++

#pragma once
/* -*-c++-*-
* dtEntity Game and Simulation Engine
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Martin Scheffler
*/
#include <dtEntity/core.h>
#include <dtEntity/debugdrawinterface.h>
#include <dtEntityOSG/export.h>
#include <dtEntity/entitymanager.h>
#include <dtEntityOSG/layerattachpointcomponent.h>
#include <osg/ref_ptr>
#include <osg/Group>
namespace osg
{
class Geode;
class Geometry;
}
namespace dtEntityOSG
{
/**
* Can be used to add simple debug geometry to the scene. Each debug graphics primitive is added
* together with a lifetime / duration.
* If you want to do per-frame drawing, simply set a duration of 0 and
* execute the draw each frame.
* Warning: To use, first do SetEnabled(true), it is off by default!
*/
class DTENTITY_OSG_EXPORT OSGDebugDrawInterface
: public dtEntity::DebugDrawInterface
{
public:
/**
* Constructor.
* @param layer Add debug draw manager to layer of this name
*/
OSGDebugDrawInterface(dtEntity::EntityManager& em,
dtEntity::StringId layer = dtEntity::StringId());
~OSGDebugDrawInterface();
/**
* message functors, don't call directly
*/
void Tick(const dtEntity::Message& msg);
void OnEnable(const dtEntity::Message& m);
/**
* Draw a single point
* @param position Draw point here
* @param color Draw with this color
* @param size Size of points in pixels
* @param duration Show for how many seconds. Value 0 means draw once
* @param depthTestEnabled if false, always draw on top
*/
void AddPoint(const dtEntity::Vec3f& position, const dtEntity::Vec4f& color,
int size = 1, float duration = 0, bool depthTestEnabled = true);
/**
* Draw multiple points
* @param positions A vector of point positions
* @param color Draw with this color
* @param size Size of points in pixels
* @param duration Show for how many seconds. Value 0 means draw once
* @param depthTestEnabled if false, always draw on top
*/
void AddPoints(const std::vector<dtEntity::Vec3f>& positions, const dtEntity::Vec4f& color,
int size = 1, float duration = 0, bool depthTestEnabled = true);
/**
* Draw a single line
* @param start Line starts here
* @param end Line ends here
* @param color Draw with this color
* @param linewidth Width of line in pixels
* @param duration Show for how many seconds. Value 0 means draw once
* @param depthTestEnabled if false, always draw on top
*/
void AddLine(const dtEntity::Vec3f& start, const dtEntity::Vec3f& end,
const dtEntity::Vec4f& color, int linewidth = 1, float duration = 0,
bool depthTestEnabled = true);
/**
* Draw a number of lines
* @param lines A vector containing two entries for each line. So to draw two lines you have to have four entries.
* @param color Draw with this color
* @param linewidth Width of line in pixels
* @param duration Show for how many seconds. Value 0 means draw once
* @param depthTestEnabled if false, always draw on top
*/
void AddLines(const std::vector<dtEntity::Vec3f>& lines, const dtEntity::Vec4f& color,
int linewidth = 1, float duration = 0, bool depthTestEnabled = true);
/**
* Draw a 3d cross
* @param position Draw point here
* @param color Draw with this color
* @param size length of each arm
* @param duration Show for how many seconds. Value 0 means draw once
* @param depthTestEnabled if false, always draw on top
*/
void AddCross(const dtEntity::Vec3f& position, const dtEntity::Vec4f& color, float size,
float duration = 0, bool depthTestEnabled = true);
/**
* Draw a sphere
* @param position Draw sphere here
* @param radius radius of sphere
* @param color Draw with this color
* @param duration Show for how many seconds. Value 0 means draw once
* @param depthTestEnabled if false, always draw on top
*/
void AddSphere(const dtEntity::Vec3f& position, float radius, const dtEntity::Vec4f& color,
float duration = 0, bool depthTestEnabled = true);
/**
* Draw a single triangle
* @param vert0 First vertex of triangle
* @param vert1 Second vertex of triangle
* @param vert2 Third vertex of triangle
* @param color Draw with this color
* @param lineWidth with of line to draw in pixels
* @param duration Show for how many seconds. Value 0 means draw once
* @param depthTestEnabled if false, always draw on top
*/
void AddTriangle(const dtEntity::Vec3f& vert0, const dtEntity::Vec3f& vert1,
const dtEntity::Vec3f& vert2, const dtEntity::Vec4f& color,
int lineWidth, float duration = 0, bool depthTestEnabled = true);
/**
* Draw multiple triangles
* @param verts A vector containing triangle verts. The vector should contain three entries for each triangle.
* @param color Draw with this color
* @param lineWidth with of line to draw in pixels
* @param duration Show for how many seconds. Value 0 means draw once
* @param depthTestEnabled if false, always draw on top
*/
void AddTriangles(const std::vector<dtEntity::Vec3f>& verts, const dtEntity::Vec4f& color,
int lineWidth, float duration = 0, bool depthTestEnabled = true);
/**
* Draw a mesh
* @param geometry The OSG geometry that should be drawn
* @param position Draw geometry here
* @param lineColor Draw wireframe with this color. If alpha value is 0 then wireframe will not be drawn
* @param lineWidth Draw wireframe with this line with. If value is 0 then wireframe will not be drawn
* @param faceColor Draw polygons with this color. Blending is enabled, so feel free to set an alpha value.
* Alpha value 0 means no polygons are drawn
* @param duration Show for how many seconds. Value 0 means draw once
* @param depthTestEnabled if false, always draw on top
*/
void AddMesh(osg::Geometry* geometry, const dtEntity::Vec3f& position,
const dtEntity::Vec4f& lineColor, int lineWidth,
const dtEntity::Vec4f& faceColor, float duration = 0,
bool depthTestEnabled = true);
/**
* Draw a circle
* @param position Center of circle is here
* @param planeNormal A normal vector pointing away from the face of the disk
* @param radius Radius of disk
* @param color Draw with this color
* @param duration Show for how many seconds. Value 0 means draw once
* @param depthTestEnabled if false, always draw on top
*/
void AddCircle(const dtEntity::Vec3f& position, const dtEntity::Vec3f& planeNormal,
float radius, const dtEntity::Vec4f& color, float duration = 0,
bool depthTestEnabled = true);
/**
* Draw a text string
* @param position Draw text here
* @param str The text to draw
* @param color Draw with this color
* @param duration Show for how many seconds. Value 0 means draw once
* @param depthTestEnabled if false, always draw on top
*/
void AddString(const dtEntity::Vec3f& position, const std::string& str,
const dtEntity::Vec4f& color, float duration = 0, bool depthTestEnabled = true);
/**
* Draw an axis aligned bounding box
* @param minCoords start box from here
* @param maxCoords end box here
* @param color Draw with this color
* @param lineWidth with of line to draw
* @param duration Show for how many seconds. Value 0 means draw once
* @param depthTestEnabled if false, always draw on top
*/
void AddAABB(const dtEntity::Vec3f& minCoords, const dtEntity::Vec3f& maxCoords,
const dtEntity::Vec4f& color, int lineWidth, float duration = 0,
bool depthTestEnabled = true);
/**
* Add an oriented bounding box
* @param matrix transformation matrix to apply to box
* @param minCoords start box from here
* @param maxCoords end box here
* @param color Draw with this color
* @param lineWidth with of line to draw
* @param duration Show for how many seconds. Value 0 means draw once
* @param depthTestEnabled if false, always draw on top
*/
void AddOBB(const dtEntity::Matrix& matrix, const dtEntity::Vec3f& minCoords,
const dtEntity::Vec3f& maxCoords, const dtEntity::Vec4f& color,
int lineWidth, float duration = 0, bool depthTestEnabled = true);
/**
* Add a cross showing coordinate orientation
* @param matrix transformation cross by this matrix
* @param color Draw with this color
* @param size length of cross arms
* @param duration Show for how many seconds. Value 0 means draw once
* @param depthTestEnabled if false, always draw on top
*/
void AddAxes(const dtEntity::Matrix& matrix, const dtEntity::Vec4f& color,
float size, float duration = 0, bool depthTestEnabled = true);
/**
* Add an OSG drawable
* @param drawable Add this drawable
* @param duration Show for how many seconds. Value 0 means draw once
* @param depthTestEnabled if false, always draw on top
*/
void AddDrawable(osg::Drawable* drawable, float duration = 0,
bool depthTestEnabled = true);
/**
* DebugDrawInterface is disabled by default, enable it!
*/
void SetEnabled(bool enabled);
bool IsEnabled() const;
/**
* Immediately remove all debug geometry
*/
void Clear();
/**
If context id is set then a redraw of that context is requested from OSG.
Only relevant when render on demand is used.
*/
void SetContextId(unsigned int v)
{
mContextId = v;
mContextIdSet = true;
}
unsigned int GetContextId() const { return mContextId; }
private:
bool mEnabled;
// osg group with stateset depth test enabled
osg::ref_ptr<osg::Group> mGroupDepthTest;
// osg group with stateset depth test disabled
osg::ref_ptr<osg::Group> mGroupNoDepthTest;
double mCurrentTime;
dtEntity::EntityManager* mEntityManager;
dtEntity::MessageFunctor mEnableFunctor;
dtEntity::MessageFunctor mTickFunctor;
dtEntity::StringId mLayerName;
int mContextId;
bool mContextIdSet;
void RequestRedraw();
};
inline OSGDebugDrawInterface* GetOSGDebugDrawInterface()
{
return static_cast<OSGDebugDrawInterface*>(dtEntity::GetDebugDrawInterface());
}
}