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.
298 lines
13 KiB
C++
298 lines
13 KiB
C++
/*
|
|
* Copyright (c) Contributors to the Open 3D Engine Project. For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
*
|
|
*/
|
|
|
|
|
|
// Description : DisplayContext definition.
|
|
|
|
|
|
#ifndef CRYINCLUDE_EDITOR_OBJECTS_DISPLAYCONTEXT_H
|
|
#define CRYINCLUDE_EDITOR_OBJECTS_DISPLAYCONTEXT_H
|
|
#pragma once
|
|
|
|
|
|
#include "SandboxAPI.h"
|
|
#include <Cry_Color.h>
|
|
#include <Cry_Geo.h>
|
|
|
|
#include <QColor>
|
|
|
|
#define DC_DEFAULT_DOTLINE_STEPS 10
|
|
#define DC_UNIT_DEGREE 1
|
|
|
|
// forward declarations.
|
|
struct IDisplayViewport;
|
|
struct IRenderer;
|
|
struct IRenderAuxGeom;
|
|
struct IIconManager;
|
|
class CDisplaySettings;
|
|
class CCamera;
|
|
|
|
enum DisplayFlags
|
|
{
|
|
DISPLAY_2D = 0x01,
|
|
DISPLAY_HIDENAMES = 0x02,
|
|
DISPLAY_BBOX = 0x04,
|
|
DISPLAY_TRACKS = 0x08,
|
|
DISPLAY_TRACKTICKS = 0x010,
|
|
DISPLAY_WORLDSPACEAXIS = 0x020, //!< Set if axis must be displayed in world space.
|
|
DISPLAY_LINKS = 0x040,
|
|
DISPLAY_DEGRADATED = 0x080, //!< Display Objects in degradated quality (When moving/modifying).
|
|
DISPLAY_SELECTION_HELPERS = 0x100, //!< Display advanced selection helpers.
|
|
};
|
|
|
|
/*!
|
|
* DisplayContex is a structure passed to BaseObject Display method.
|
|
* It contains everything the object should know to display itself in a view.
|
|
* All fields must be filled before passing that structure to Display call.
|
|
*/
|
|
struct SANDBOX_API DisplayContext
|
|
{
|
|
enum ETextureIconFlags
|
|
{
|
|
TEXICON_ADDITIVE = 0x0001,
|
|
TEXICON_ALIGN_BOTTOM = 0x0002,
|
|
TEXICON_ALIGN_TOP = 0x0004,
|
|
TEXICON_ON_TOP = 0x0008,
|
|
};
|
|
|
|
CDisplaySettings* settings;
|
|
IDisplayViewport* view;
|
|
IRenderer* renderer;
|
|
IRenderAuxGeom* pRenderAuxGeom;
|
|
IIconManager* pIconManager;
|
|
CCamera* camera;
|
|
AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING
|
|
AABB box; // Bounding box of volume that need to be repainted.
|
|
AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING
|
|
int flags;
|
|
|
|
//! Ctor.
|
|
DisplayContext();
|
|
// Helper methods.
|
|
void SetView(IDisplayViewport* pView);
|
|
IDisplayViewport* GetView() const { return view; }
|
|
void Flush2D();
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// Draw functions
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//! Set current materialc color.
|
|
void SetColor(float r, float g, float b, float a = 1) { m_color4b = ColorB(int(r * 255.0f), int(g * 255.0f), int(b * 255.0f), int(a * 255.0f)); };
|
|
void SetColor(const Vec3& color, float a = 1) { m_color4b = ColorB(int(color.x * 255.0f), int(color.y * 255.0f), int(color.z * 255.0f), int(a * 255.0f)); };
|
|
void SetColor(const QColor& rgb, float a) { m_color4b = ColorB(rgb.red(), rgb.green(), rgb.blue(), int(a * 255.0f)); };
|
|
void SetColor(const QColor& color) { m_color4b = ColorB(color.red(), color.green(), color.blue(), color.alpha()); };
|
|
void SetColor(const ColorB& color) { m_color4b = color; };
|
|
void SetAlpha(float a = 1) { m_color4b.a = int(a * 255.0f); };
|
|
ColorB GetColor() const { return m_color4b; }
|
|
|
|
void SetSelectedColor(float fAlpha = 1);
|
|
void SetFreezeColor();
|
|
|
|
//! Get color to draw selectin of object.
|
|
QColor GetSelectedColor();
|
|
QColor GetFreezeColor();
|
|
|
|
// Draw 3D quad.
|
|
void DrawQuad(const Vec3& p1, const Vec3& p2, const Vec3& p3, const Vec3& p4);
|
|
void DrawQuad(float width, float height);
|
|
void DrawQuadGradient(const Vec3& p1, const Vec3& p2, const Vec3& p3, const Vec3& p4, ColorB firstColor, ColorB secondColor);
|
|
void DrawWireQuad(const Vec3& p1, const Vec3& p2, const Vec3& p3, const Vec3& p4);
|
|
void DrawWireQuad(float width, float height);
|
|
// Draw 3D Triangle.
|
|
void DrawTri(const Vec3& p1, const Vec3& p2, const Vec3& p3);
|
|
void DrawTriangles(const AZStd::vector<Vec3>& vertices, const ColorB& color);
|
|
void DrawTrianglesIndexed(const AZStd::vector<Vec3>& vertices, const AZStd::vector<vtx_idx>& indices, const ColorB& color);
|
|
// Draw wireframe box.
|
|
void DrawWireBox(const Vec3& min, const Vec3& max);
|
|
// Draw filled box
|
|
void DrawSolidBox(const Vec3& min, const Vec3& max);
|
|
void DrawSolidOBB(const Vec3& center, const Vec3& axisX, const Vec3& axisY, const Vec3& axisZ, const Vec3& halfExtents);
|
|
void DrawPoint(const Vec3& p, int nSize = 1);
|
|
void DrawLine(const Vec3& p1, const Vec3& p2);
|
|
void DrawLine(const Vec3& p1, const Vec3& p2, const ColorF& col1, const ColorF& col2);
|
|
void DrawLine(const Vec3& p1, const Vec3& p2, const QColor& rgb1, const QColor& rgb2);
|
|
void DrawLines(const AZStd::vector<Vec3>& vertices, const ColorF& color);
|
|
void DrawPolyLine(const Vec3* pnts, int numPoints, bool cycled = true);
|
|
|
|
// Vera, Confetti
|
|
void DrawDottedLine(const Vec3& p1, const Vec3& p2, const ColorF& col1, const ColorF& col2, const float numOfSteps = DC_DEFAULT_DOTLINE_STEPS);
|
|
void DrawWireQuad2d(const QPoint& p1, const QPoint& p2, float z);
|
|
void DrawLine2d(const QPoint& p1, const QPoint& p2, float z);
|
|
void DrawLine2dGradient(const QPoint& p1, const QPoint& p2, float z, ColorB firstColor, ColorB secondColor);
|
|
void DrawWireCircle2d(const QPoint& center, float radius, float z);
|
|
|
|
// Draw circle from lines on terrain, position is in world space.
|
|
void DrawTerrainCircle(const Vec3& worldPos, float radius, float height);
|
|
void DrawTerrainCircle(const Vec3& center, float radius, float angle1, float angle2, float height);
|
|
|
|
/// DrawArc
|
|
/// Draws an arc around the specified position from a given angle across the angular length given by sweepAngleDegrees
|
|
/// it orients the arc around the index of the given basis axis.
|
|
/// \param pos World space position on which to center the arc.
|
|
/// \param radius Radius that defines the size of the arc.
|
|
/// \param startAngleDegrees Angle in degrees measured clockwise from the basis axis to the starting point of the arc.
|
|
/// \param sweepAngleDegreees Angle in degrees measured clockwise from the startAngle parameter to ending point of the arc.
|
|
/// \param angularStepDegrees Defines the distance between vertices, a small value will result in a greater number of vertices.
|
|
/// \param referenceAxis Axis on which to align the arc (0 for X, 1 for Y, 2 for Z)
|
|
void DrawArc(const Vec3& pos, float radius, float startAngleDegrees, float sweepAngleDegrees, float angularStepDegrees, int referenceAxis = 2);
|
|
|
|
|
|
/// DrawArc
|
|
/// Draws an arc around the specified position from a given angle across the angular length given by sweepAngleDegrees
|
|
/// oriented around the specified axis.
|
|
/// \param pos World space position on which to center the arc.
|
|
/// \param radius Radius that defines the size of the arc.
|
|
/// \param startAngleDegrees Angle in degrees measured clockwise from the basis axis to the starting point of the arc.
|
|
/// \param sweepAngleDegreees Angle in degrees measured clockwise from the startAngle parameter to ending point of the arc.
|
|
/// \param angularStepDegrees Defines the distance between vertices, a small value will result in a greater number of vertices.
|
|
/// \param fixedAxis Normal axis on which to align the arc.
|
|
void DrawArc(const Vec3& pos, float radius, float startAngleDegrees, float sweepAngleDegrees, float angularStepDegrees, const Vec3& fixedAxis);
|
|
|
|
//Vera, Confetti:
|
|
//Draw an arc and an arrow at the end of the arc
|
|
void DrawArcWithArrow(const Vec3& pos, float radius, float startAngleDegrees, float sweepAngleDegrees, float angularStepDegrees, const Vec3& fixedAxis);
|
|
|
|
// Draw circle.
|
|
void DrawCircle(const Vec3& pos, float radius, int nUnchangedAxis = 2 /*z axis*/);
|
|
|
|
void DrawHalfDottedCircle(const Vec3& pos, float radius, const Vec3& viewPos, int nUnchangedAxis = 2 /*z axis*/);
|
|
|
|
// Vera, Confetti :
|
|
// Draw a dotted circle.
|
|
void DrawDottedCircle(const Vec3& pos, float radius, const Vec3& nUnchangedAxis, int numberOfArrows = 0, float stepDegree = DC_UNIT_DEGREE);
|
|
|
|
// Draw cylinder.
|
|
void DrawCylinder(const Vec3& p1, const Vec3& p2, float radius, float height);
|
|
|
|
void DrawCone(const Vec3& pos, const Vec3& dir, float radius, float height, bool drawShaded = true);
|
|
|
|
/// DrawWireCylinder
|
|
/// \param center Center of cylinder.
|
|
/// \param axis Axis along which cylinder is tall.
|
|
/// \param radius Radius of cylinder.
|
|
/// \param height Total height of cylinder.
|
|
void DrawWireCylinder(const Vec3& center, const Vec3& axis, float radius, float height);
|
|
|
|
/// DrawSolidCylinder
|
|
/// \param center Center of cylinder.
|
|
/// \param axis Axis along which cylinder is tall.
|
|
/// \param radius Radius of cylinder.
|
|
/// \param height Total height of cylinder.
|
|
void DrawSolidCylinder(const Vec3& center, const Vec3& axis, float radius, float height, bool drawShaded = true);
|
|
|
|
/// DrawWireCapsule
|
|
/// \param pos Center of capsule.
|
|
/// \param axis Axis along which capsule is tall.
|
|
/// \param radius Radius of capsule.
|
|
/// \param heightStraightSection Height of capsule's straight section (does not include caps).
|
|
void DrawWireCapsule(const Vec3& center, const Vec3& axis, float radius, float heightStraightSection);
|
|
|
|
//! Draw rectangle on top of terrain.
|
|
//! Coordinates are in world space.
|
|
void DrawTerrainRect(float x1, float y1, float x2, float y2, float height);
|
|
|
|
void DrawTerrainLine (Vec3 worldPos1, Vec3 worldPos2);
|
|
|
|
void DrawWireSphere(const Vec3& pos, float radius);
|
|
void DrawWireSphere(const Vec3& pos, const Vec3 radius);
|
|
|
|
void DrawWireDisk(const Vec3& pos, const Vec3& dir, float radius);
|
|
|
|
void PushMatrix(const Matrix34& tm);
|
|
void PopMatrix();
|
|
const Matrix34& GetMatrix();
|
|
|
|
// Draw special 3D objects.
|
|
void DrawBall(const Vec3& pos, float radius, bool drawShaded = true);
|
|
void DrawDisk(const Vec3& pos, const Vec3& dir, float radius);
|
|
|
|
//! Draws 3d arrow.
|
|
void DrawArrow(const Vec3& src, const Vec3& trg, float fHeadScale = 1, bool b2SidedArrow = false);
|
|
|
|
// Draw texture label in 2d view coordinates.
|
|
// w,h in pixels.
|
|
void DrawTextureLabel(const Vec3& pos, int nWidth, int nHeight, int nTexId, int nTexIconFlags = 0, int srcOffsetX = 0, int scrOffsetY = 0, bool bDistanceScaleIcons = false, float fDistanceScale = 1.0f);
|
|
|
|
void RenderObject(int objectType, const Vec3& pos, float scale);
|
|
void RenderObject(int objectType, const Matrix34& tm);
|
|
|
|
void DrawTextLabel(const Vec3& pos, float size, const char* text, const bool bCenter = false, int srcOffsetX = 0, int scrOffsetY = 0);
|
|
void Draw2dTextLabel(float x, float y, float size, const char* text, bool bCenter = false);
|
|
void SetLineWidth(float width);
|
|
|
|
//! Is given bbox visible in this display context.
|
|
bool IsVisible(const AABB& bounds);
|
|
|
|
//! Gets current render state.
|
|
uint32 GetState() const;
|
|
//! Set a new render state.
|
|
//! \param returns previous render state.
|
|
uint32 SetState(uint32 state);
|
|
//! Set a new render state flags.
|
|
//! \param returns previous render state.
|
|
uint32 SetStateFlag(uint32 state);
|
|
//! Clear specified flags in render state.
|
|
//! \param returns previous render state.
|
|
uint32 ClearStateFlag(uint32 state);
|
|
|
|
void DepthTestOff();
|
|
void DepthTestOn();
|
|
|
|
void DepthWriteOff();
|
|
void DepthWriteOn();
|
|
|
|
void CullOff();
|
|
void CullOn();
|
|
|
|
// Enables drawing helper lines in front of usual geometry, adds a small z offset to all drawn lines.
|
|
bool SetDrawInFrontMode(bool bOn);
|
|
|
|
// Description:
|
|
// Changes fill mode.
|
|
// Arguments:
|
|
// nFillMode is one of the values from EAuxGeomPublicRenderflags_FillMode
|
|
int SetFillMode(int nFillMode);
|
|
|
|
//! Convert position to world space.
|
|
Vec3 ToWorldSpacePosition(const Vec3& v) { return m_matrixStack[m_currentMatrix].TransformPoint(v); }
|
|
|
|
//! Convert direction to world space (translation is not considered)
|
|
Vec3 ToWorldSpaceVector(const Vec3& v) { return m_matrixStack[m_currentMatrix].TransformVector(v); }
|
|
|
|
float ToWorldSpaceMaxScale(float value);
|
|
|
|
float GetLineWidth() const { return m_thickness; }
|
|
|
|
private:
|
|
|
|
void InternalDrawLine(const Vec3& v0, const ColorB& colV0, const Vec3& v1, const ColorB& colV1);
|
|
|
|
AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING
|
|
ColorB m_color4b;
|
|
uint32 m_renderState;
|
|
float m_thickness;
|
|
float m_width;
|
|
float m_height;
|
|
|
|
int m_currentMatrix;
|
|
//! Matrix stack.
|
|
Matrix34 m_matrixStack[32];
|
|
|
|
struct STextureLabel
|
|
{
|
|
float x, y, z; // 2D position (z in world space).
|
|
float w, h; // Width height.
|
|
int nTexId; // Texture id.
|
|
int flags; // ETextureIconFlags
|
|
float color[4];
|
|
};
|
|
std::vector<STextureLabel> m_textureLabels;
|
|
AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING
|
|
};
|
|
|
|
#endif // CRYINCLUDE_EDITOR_OBJECTS_DISPLAYCONTEXT_H
|