/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * * For complete copyright and license terms please see the LICENSE at the root of this * distribution (the "License"). All use of this software is governed by the License, * or, if provided, by the license below or the license accompanying this file. Do not * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ // Original file Copyright Crytek GMBH or its affiliates, used under license. // Description : DisplayContext definition. #ifndef CRYINCLUDE_EDITOR_OBJECTS_DISPLAYCONTEXT_H #define CRYINCLUDE_EDITOR_OBJECTS_DISPLAYCONTEXT_H #pragma once #include "SandboxAPI.h" #include #include #include #define DC_DEFAULT_DOTLINE_STEPS 10 #define DC_UNIT_DEGREE 1 // forward declarations. struct IDisplayViewport; struct IRenderer; struct IRenderAuxGeom; struct IIconManager; struct I3DEngine; 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; I3DEngine* engine; 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& vertices, const ColorB& color); void DrawTrianglesIndexed(const AZStd::vector& vertices, const AZStd::vector& 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& 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 DrawTextOn2DBox(const Vec3& pos, const char* text, float textScale, const ColorF& TextColor, const ColorF& TextBackColor); 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 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 m_textureLabels; AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING }; #endif // CRYINCLUDE_EDITOR_OBJECTS_DISPLAYCONTEXT_H