| 1 | //************************************ bs::framework - Copyright 2018 Marko Pintera **************************************// |
| 2 | //*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********// |
| 3 | #pragma once |
| 4 | |
| 5 | #include "BsPrerequisites.h" |
| 6 | #include "Image/BsColor.h" |
| 7 | #include "Math/BsAABox.h" |
| 8 | |
| 9 | namespace bs |
| 10 | { |
| 11 | /** @addtogroup Utility-Engine |
| 12 | * @{ |
| 13 | */ |
| 14 | |
| 15 | /** Helper class for easily creating common 2D shapes. */ |
| 16 | class BS_EXPORT ShapeMeshes2D |
| 17 | { |
| 18 | public: |
| 19 | /** |
| 20 | * Fills the mesh data with vertices representing a quad (2 triangles). |
| 21 | * |
| 22 | * @param[in] area Area in which to draw the quad. |
| 23 | * @param[out] meshData Mesh data that will be populated. |
| 24 | * @param[in] vertexOffset Offset in number of vertices from the start of the buffer to start writing at. |
| 25 | * @param[in] indexOffset Offset in number of indices from the start of the buffer to start writing at. |
| 26 | * |
| 27 | * @note |
| 28 | * Provided MeshData must have some specific elements at least: |
| 29 | * Vector2 VES_POSITION |
| 30 | * 32bit index buffer |
| 31 | * Enough space for 4 vertices and 6 indices |
| 32 | * @note |
| 33 | * Primitives are output in the form of a triangle list. |
| 34 | */ |
| 35 | static void solidQuad(const Rect2& area, const SPtr<MeshData>& meshData, UINT32 vertexOffset, UINT32 indexOffset); |
| 36 | |
| 37 | /** |
| 38 | * Fills the mesh data with vertices representing a per-pixel line. |
| 39 | * |
| 40 | * @param[in] a Start point of the line. |
| 41 | * @param[in] b End point of the line. |
| 42 | * @param[out] meshData Mesh data that will be populated. |
| 43 | * @param[in] vertexOffset Offset in number of vertices from the start of the buffer to start writing at. |
| 44 | * @param[in] indexOffset Offset in number of indices from the start of the buffer to start writing at. |
| 45 | * |
| 46 | * @note |
| 47 | * Provided MeshData must have some specific elements at least: |
| 48 | * Vector2 VES_POSITION |
| 49 | * 32bit index buffer |
| 50 | * Enough space for 2 vertices and 2 indices |
| 51 | * @note |
| 52 | * Primitives are output in the form of a line list. |
| 53 | */ |
| 54 | static void pixelLine(const Vector2& a, const Vector2& b, const SPtr<MeshData>& meshData, UINT32 vertexOffset, |
| 55 | UINT32 indexOffset); |
| 56 | |
| 57 | /** |
| 58 | * Fills the mesh data with vertices representing a line of specific width as a quad. |
| 59 | * |
| 60 | * @param[in] a Start point of the line. |
| 61 | * @param[in] b End point of the line. |
| 62 | * @param[in] width Width of the line. |
| 63 | * @param[in] border Optional border that will increase the width and the length at both end-points. |
| 64 | * Useful if you are using some kind of filtering for the line rendering, as the |
| 65 | * filtered pixels can belong to the border region. |
| 66 | * @param[in] color Color of the line. |
| 67 | * @param[out] meshData Mesh data that will be populated by this method. |
| 68 | * @param[in] vertexOffset Offset in number of vertices from the start of the buffer to start writing at. |
| 69 | * @param[in] indexOffset Offset in number of indices from the start of the buffer to start writing at. |
| 70 | * |
| 71 | * @note |
| 72 | * Provided MeshData must have some specific elements at least: |
| 73 | * Vector2 VES_POSITION |
| 74 | * UINT32 VES_COLOR |
| 75 | * 32bit index buffer |
| 76 | * Enough space for 4 vertices and 6 indices |
| 77 | * @note |
| 78 | * Primitives are output in the form of a triangle list. |
| 79 | */ |
| 80 | static void quadLine(const Vector2& a, const Vector2& b, float width, float border, const Color& color, |
| 81 | const SPtr<MeshData>& meshData, UINT32 vertexOffset, UINT32 indexOffset); |
| 82 | |
| 83 | /** |
| 84 | * Fills the mesh data with vertices representing per-pixel lines. |
| 85 | * |
| 86 | * @param[in] linePoints A list of start and end points for the lines. Must be a multiple of 2. |
| 87 | * @param[out] meshData Mesh data that will be populated. |
| 88 | * @param[in] vertexOffset Offset in number of vertices from the start of the buffer to start writing at. |
| 89 | * @param[in] indexOffset Offset in number of indices from the start of the buffer to start writing at. |
| 90 | * |
| 91 | * @note |
| 92 | * Provided MeshData must have some specific elements at least: |
| 93 | * Vector2 VES_POSITION |
| 94 | * 32bit index buffer |
| 95 | * Enough space for (numLines * 2) vertices and (numLines * 2) indices |
| 96 | * @note |
| 97 | * Primitives are output in the form of a line list. |
| 98 | */ |
| 99 | static void pixelLineList(const Vector<Vector2>& linePoints, const SPtr<MeshData>& meshData, UINT32 vertexOffset, |
| 100 | UINT32 indexOffset); |
| 101 | |
| 102 | /** |
| 103 | * Fills the mesh data with vertices representing a polyline of specific width as a set of quads. |
| 104 | * |
| 105 | * @param[in] linePoints A list of start and end points for the lines. |
| 106 | * @param[in] width Width of the line. |
| 107 | * @param[in] border Optional border that will increase the width and the length at both end-points. |
| 108 | * Useful if you are using some kind of filtering for the line rendering, as the |
| 109 | * filtered pixels can belong to the border region. |
| 110 | * @param[in] color Color of the line. |
| 111 | * @param[out] meshData Mesh data that will be populated by this method. |
| 112 | * @param[in] vertexOffset Offset in number of vertices from the start of the buffer to start writing at. |
| 113 | * @param[in] indexOffset Offset in number of indices from the start of the buffer to start writing at. |
| 114 | * |
| 115 | * @note |
| 116 | * Provided MeshData must have some specific elements at least: |
| 117 | * Vector2 VES_POSITION |
| 118 | * UINT32 VES_COLOR |
| 119 | * 32bit index buffer |
| 120 | * Enough space for (numLines * 2) + 2 vertices and numLines * 6 indices |
| 121 | * @note |
| 122 | * Primitives are output in the form of a triangle list. |
| 123 | */ |
| 124 | static void quadLineList(const Vector<Vector2>& linePoints, float width, float border, |
| 125 | const Color& color, const SPtr<MeshData>& meshData, UINT32 vertexOffset, UINT32 indexOffset); |
| 126 | |
| 127 | /** |
| 128 | * Fills the provided buffers with vertices representing a polyline of specific width as a set of quads |
| 129 | * (triangle list). |
| 130 | * |
| 131 | * @param[in] linePoints A list of start and end points for the lines. |
| 132 | * @param[in] numPoints Number of points in the @p linePoints buffer. |
| 133 | * @param[in] width Width of the line. |
| 134 | * @param[in] border Optional border that will increase the width and the length at both end-points. |
| 135 | * Useful if you are using some kind of filtering for the line rendering, as the |
| 136 | * filtered pixels can belong to the border region. |
| 137 | * @param[out] outVertices Pre-allocated buffer for the vertices, of size ((numLines * 2) + 2) * @p vertexStride |
| 138 | * if @p indexed is true, or (numLines * 6) * @p vertexStride if false. |
| 139 | * @param[in] vertexStride Distance between two vertices in the output buffer. Must be at least sizeof(Vector2). |
| 140 | * @param[in] indexed If true there will be ((numLines * 2) + 2) vertices generated, assuming an index |
| 141 | * buffer will be used for rendering. If false then (numLines * 6) vertices will be |
| 142 | * generated. |
| 143 | */ |
| 144 | static void quadLineList(const Vector2* linePoints, UINT32 numPoints, float width, float border, UINT8* outVertices, |
| 145 | UINT32 vertexStride, bool indexed); |
| 146 | |
| 147 | static const UINT32 NUM_VERTICES_AA_LINE; |
| 148 | static const UINT32 NUM_INDICES_AA_LINE; |
| 149 | protected: |
| 150 | /** |
| 151 | * Fills the provided buffers with vertices representing a per-pixel line. |
| 152 | * |
| 153 | * @param[in] a Start point of the line. |
| 154 | * @param[in] b End point of the line. |
| 155 | * @param[out] outVertices Output buffer that will store the vertex position data. |
| 156 | * @param[in] vertexOffset Offset in number of vertices from the start of the buffer to start writing at. |
| 157 | * @param[in] vertexStride Size of a single vertex, in bytes. (Same for both position and color buffer) |
| 158 | * @param[out] outIndices Output buffer that will store the index data. Indices are 32bit. |
| 159 | * @param[in] indexOffset Offset in number of indices from the start of the buffer to start writing at. |
| 160 | */ |
| 161 | static void pixelLine(const Vector2& a, const Vector2& b, UINT8* outVertices, |
| 162 | UINT32 vertexOffset, UINT32 vertexStride, UINT32* outIndices, UINT32 indexOffset); |
| 163 | |
| 164 | /** |
| 165 | * Fills the provided buffers with position data and indices representing an inner |
| 166 | * area of a polygon (basically a normal non-antialiased polygon). |
| 167 | * |
| 168 | * @param[in] points Points defining the polygon. First point is assumed to be the start and end point. |
| 169 | * @param[out] outVertices Output buffer that will store the vertex position data. |
| 170 | * @param[in] vertexOffset Offset in number of vertices from the start of the buffer to start writing at. |
| 171 | * @param[in] vertexStride Size of a single vertex, in bytes. (Same for both position and color buffer) |
| 172 | * @param[out] outIndices Output buffer that will store the index data. Indices are 32bit. |
| 173 | * @param[in] indexOffset Offset in number of indices from the start of the buffer to start writing at. |
| 174 | */ |
| 175 | static void pixelSolidPolygon(const Vector<Vector2>& points, UINT8* outVertices, |
| 176 | UINT32 vertexOffset, UINT32 vertexStride, UINT32* outIndices, UINT32 indexOffset); |
| 177 | }; |
| 178 | |
| 179 | /** @} */ |
| 180 | } |