![]() |
Plasma Engine
2.0
|
Provides functions to generate standard geometric shapes, such as boxes, spheres, cylinders, etc. More...
#include <Geometry.h>
Classes | |
struct | GeoOptions |
Options shared among all geometry creation functions. More... | |
struct | Line |
A line only references two vertices. More... | |
struct | Polygon |
Each polygon has a face normal and a set of indices, which vertices it references. More... | |
struct | Vertex |
The data that is stored per vertex. More... | |
Public Member Functions | |
plDeque< Vertex > & | GetVertices () |
Returns the entire vertex data. | |
plDeque< Polygon > & | GetPolygons () |
Returns the entire polygon data. | |
plDeque< Line > & | GetLines () |
Returns the entire line data. | |
const plDeque< Vertex > & | GetVertices () const |
Returns the entire vertex data. | |
const plDeque< Polygon > & | GetPolygons () const |
Returns the entire polygon data. | |
const plDeque< Line > & | GetLines () const |
Returns the entire line data. | |
void | Clear () |
Clears all data. | |
plUInt32 | AddVertex (const plVec3 &vPos, const plVec3 &vNormal, const plVec2 &vTexCoord, const plColor &color, const plVec4U16 &vBoneIndices=plVec4U16::MakeZero(), const plColorLinearUB &boneWeights=plColorLinearUB(255, 0, 0, 0)) |
Adds a vertex, returns the index to the added vertex. | |
plUInt32 | AddVertex (const plVec3 &vPos, const plVec3 &vNormal, const plVec2 &vTexCoord, const plColor &color, const plVec4U16 &vBoneIndices, const plColorLinearUB &boneWeights, const plMat4 &mTransform) |
Adds a vertex, returns the index to the added vertex. Position and normal are transformed with the given matrix. | |
plUInt32 | AddVertex (const plVec3 &vPos, const plVec3 &vNormal, const plVec2 &vTexCoord, const plColor &color, const plUInt16 uiBoneIndex, const plMat4 &mTransform) |
Adds a vertex with a single bone index, returns the index to the added vertex. Position and normal are transformed with the given matrix. | |
plUInt32 | AddVertex (const plVec3 &vPos, const plVec3 &vNormal, const plVec2 &vTexCoord, const GeoOptions &options) |
Adds a vertex with a single bone index, returns the index to the added vertex. Position and normal are transformed with the given matrix. | |
void | AddPolygon (const plArrayPtr< plUInt32 > &vertices, bool bFlipWinding) |
Adds a polygon that consists of all the referenced vertices. No face normal is computed at this point. | |
void | AddLine (plUInt32 uiStartVertex, plUInt32 uiEndVertex) |
Adds a line. | |
void | TriangulatePolygons (plUInt32 uiMaxVerticesInPolygon=3) |
Triangulates all polygons that have more than uiMaxVerticesInPolygon vertices. | |
void | ComputeFaceNormals () |
Computes normals for all polygons from the current vertex positions. Call this when you do not intend to make further modifications. | |
void | ComputeSmoothVertexNormals () |
Computes smooth (averaged) normals for each vertex. Requires that face normals are computed. | |
void | ComputeTangents () |
Computes tangents. This function can increase or reduce vertex count. | |
void | ValidateTangents (float fEpsilon=0.01f) |
Checks if present tangents are meaningful and resetting them if necessary. | |
plUInt32 | CalculateTriangleCount () const |
Returns the number of triangles that the polygons are made up of. | |
void | SetAllVertexBoneIndices (const plVec4U16 &vBoneIndices, plUInt32 uiFirstVertex=0) |
Changes the bone indices for all vertices (starting at vertex uiFirstVertex). | |
void | SetAllVertexColor (const plColor &color, plUInt32 uiFirstVertex=0) |
Changes the color for all vertices (starting at vertex uiFirstVertex). | |
void | SetAllVertexTexCoord (const plVec2 &vTexCoord, plUInt32 uiFirstVertex=0) |
Changes the texture coordinates for all vertices (starting at vertex uiFirstVertex). | |
void | Transform (const plMat4 &mTransform, bool bTransformPolyNormals) |
Transforms all vertices by the given transform. | |
void | Merge (const plGeometry &other) |
Merges the given mesh into this one. Use this to composite multiple shapes into one. | |
void | AddRectXY (const plVec2 &vSize, plUInt32 uiTesselationX=1, plUInt32 uiTesselationY=1, const GeoOptions &options=GeoOptions()) |
Adds a rectangle shape in the XY plane, with the front in positive Z direction. It is centered at the origin, extending half size.x and half size.y into direction +X, -X, +Y and -Y. Optionally tessellates the rectangle for more detail. | |
void | AddBox (const plVec3 &vFullExtents, bool bExtraVerticesForTexturing, const GeoOptions &options=GeoOptions()) |
Adds a box. If bExtraVerticesForTexturing is false, 8 shared vertices are added. If bExtraVerticesForTexturing is true, 24 separate vertices with UV coordinates are added. | |
void | AddLineBox (const plVec3 &vSize, const GeoOptions &options=GeoOptions()) |
Adds box out of lines (8 vertices). | |
void | AddLineBoxCorners (const plVec3 &vSize, float fCornerFraction, const GeoOptions &options=GeoOptions()) |
Adds the 8 corners of a box as lines. | |
void | AddPyramid (const plVec3 &vSize, bool bCap, const GeoOptions &options=GeoOptions()) |
Adds a pyramid. This is different to a low-res cone in that the corners are placed differently (like on a box). | |
void | AddGeodesicSphere (float fRadius, plUInt8 uiSubDivisions, const GeoOptions &options=GeoOptions()) |
Adds a geodesic sphere with radius 1 at the origin. | |
void | AddCylinder (float fRadiusTop, float fRadiusBottom, float fPositiveLength, float fNegativeLength, bool bCapTop, bool bCapBottom, plUInt16 uiSegments, const GeoOptions &options=GeoOptions(), plAngle fraction=plAngle::MakeFromDegree(360.0f)) |
Adds a cylinder. | |
void | AddCylinderOnePiece (float fRadiusTop, float fRadiusBottom, float fPositiveLength, float fNegativeLength, plUInt16 uiSegments, const GeoOptions &options=GeoOptions()) |
Same as AddCylinder(), but always adds caps and does not generate separate vertices for the caps. | |
void | AddCone (float fRadius, float fHeight, bool bCap, plUInt16 uiSegments, const GeoOptions &options=GeoOptions()) |
Adds a cone. The origin is at the center of the bottom. | |
void | AddSphere (float fRadius, plUInt16 uiSegments, plUInt16 uiStacks, const GeoOptions &options=GeoOptions()) |
Adds a sphere. | |
void | AddHalfSphere (float fRadius, plUInt16 uiSegments, plUInt16 uiStacks, bool bCap, const GeoOptions &options=GeoOptions()) |
Adds half a sphere. | |
void | AddCapsule (float fRadius, float fHeight, plUInt16 uiSegments, plUInt16 uiStacks, const GeoOptions &options=GeoOptions()) |
Adds a capsule. | |
void | AddTorus (float fInnerRadius, float fOuterRadius, plUInt16 uiSegments, plUInt16 uiSegmentDetail, bool bExtraVerticesForTexturing, const GeoOptions &options=GeoOptions()) |
Adds a full torus. | |
void | AddTexturedRamp (const plVec3 &vSize, const GeoOptions &options=GeoOptions()) |
Adds a ramp that has UV coordinates set. | |
void | AddStairs (const plVec3 &vSize, plUInt32 uiNumSteps, plAngle curvature, bool bSmoothSloped, const GeoOptions &options=GeoOptions()) |
Generates a straight stair mesh along the X axis. The number of steps determines the step height and depth. | |
void | AddArch (const plVec3 &vSize, plUInt32 uiNumSegments, float fThickness, plAngle angle, bool bMakeSteps, bool bSmoothBottom, bool bSmoothTop, bool bCapTopAndBottom, const GeoOptions &options=GeoOptions()) |
Provides functions to generate standard geometric shapes, such as boxes, spheres, cylinders, etc.
This class provides simple functions to create frequently used basic shapes. It allows to transform the shapes, merge them into a single mesh, compute normals, etc. It is meant for debug and editor geometry (gizmos, etc.). Vertices can have position, normal, color and 'shape index'.
void plGeometry::AddCapsule | ( | float | fRadius, |
float | fHeight, | ||
plUInt16 | uiSegments, | ||
plUInt16 | uiStacks, | ||
const GeoOptions & | options = GeoOptions() ) |
Adds a capsule.
The origin is at the center of the capsule. Radius and height are added to get the total height of the capsule. uiSegments is the detail around the up axis, must be at least 3. uiStacks is the detail of the rounded top and bottom, must be at least 1.
void plGeometry::AddCone | ( | float | fRadius, |
float | fHeight, | ||
bool | bCap, | ||
plUInt16 | uiSegments, | ||
const GeoOptions & | options = GeoOptions() ) |
Adds a cone. The origin is at the center of the bottom.
uiSegments is the detail around the up axis, must be at least 3.
void plGeometry::AddCylinder | ( | float | fRadiusTop, |
float | fRadiusBottom, | ||
float | fPositiveLength, | ||
float | fNegativeLength, | ||
bool | bCapTop, | ||
bool | bCapBottom, | ||
plUInt16 | uiSegments, | ||
const GeoOptions & | options = GeoOptions(), | ||
plAngle | fraction = plAngle::MakeFromDegree(360.0f) ) |
Adds a cylinder.
If fPositiveLength == fNegativeLength, the origin is at the center. If fNegativeLength is zero, the origin is at the bottom and so on.
uiSegments is the detail around the up axis, must be at least 3. The top or bottom caps can be removed using bCapTop and bCapBottom. When fraction is set to any value below 360 degree, a pie / pacman shaped cylinder is created.
void plGeometry::AddCylinderOnePiece | ( | float | fRadiusTop, |
float | fRadiusBottom, | ||
float | fPositiveLength, | ||
float | fNegativeLength, | ||
plUInt16 | uiSegments, | ||
const GeoOptions & | options = GeoOptions() ) |
Same as AddCylinder(), but always adds caps and does not generate separate vertices for the caps.
This is a more compact representation, but does not allow as good texturing.
void plGeometry::AddGeodesicSphere | ( | float | fRadius, |
plUInt8 | uiSubDivisions, | ||
const GeoOptions & | options = GeoOptions() ) |
Adds a geodesic sphere with radius 1 at the origin.
When uiSubDivisions is zero, the sphere will have 20 triangles.
For each subdivision step the number of triangles quadruples.
0 = 20 triangles, 12 vertices
1 = 80 triangles, 42 vertices
2 = 320 triangles, 162 vertices
3 = 1280 triangles, 642 vertices
4 = 5120 triangles, 2562 vertices
...
void plGeometry::AddHalfSphere | ( | float | fRadius, |
plUInt16 | uiSegments, | ||
plUInt16 | uiStacks, | ||
bool | bCap, | ||
const GeoOptions & | options = GeoOptions() ) |
Adds half a sphere.
The origin is at the 'full sphere center', ie. at the center of the cap. uiSegments is the detail around the up axis, must be at least 3. uiStacks is the detail of the rounded top and bottom, must be at least 1.
void plGeometry::AddLineBoxCorners | ( | const plVec3 & | vSize, |
float | fCornerFraction, | ||
const GeoOptions & | options = GeoOptions() ) |
Adds the 8 corners of a box as lines.
fCornerFraction must be between 1.0 and 0.0, with 1 making it a completely closed box and 0 no lines at all.
void plGeometry::AddPyramid | ( | const plVec3 & | vSize, |
bool | bCap, | ||
const GeoOptions & | options = GeoOptions() ) |
Adds a pyramid. This is different to a low-res cone in that the corners are placed differently (like on a box).
The origin is at the center of the base quad.size.z is the height of the pyramid.
void plGeometry::AddSphere | ( | float | fRadius, |
plUInt16 | uiSegments, | ||
plUInt16 | uiStacks, | ||
const GeoOptions & | options = GeoOptions() ) |
Adds a sphere.
uiSegments is the detail around the up axis, must be at least 3. uiStacks is the detail of the rounded top and bottom, must be at least 2.
void plGeometry::AddTorus | ( | float | fInnerRadius, |
float | fOuterRadius, | ||
plUInt16 | uiSegments, | ||
plUInt16 | uiSegmentDetail, | ||
bool | bExtraVerticesForTexturing, | ||
const GeoOptions & | options = GeoOptions() ) |
Adds a full torus.
The origin is at the center of the torus.
fInnerRadius | is the radius from the center to where the torus ring starts. |
fOuterRadius | is the radius to where the torus ring stops. |
uiSegments | is the detail around the up (Z) axis. |
uiSegmentDetail | is the number of segments around the torus ring (ie. the cylinder detail) |
bExtraVerticesForTexturing | specifies whether the torus should be one closed piece or have additional vertices at the seams, such that texturing works better. |
void plGeometry::ComputeSmoothVertexNormals | ( | ) |
Computes smooth (averaged) normals for each vertex. Requires that face normals are computed.
This only yields smooth normals for vertices that are shared among multiple polygons, otherwise a vertex will have the same normal as the one face that it is used in.
void plGeometry::ComputeTangents | ( | ) |
Computes tangents. This function can increase or reduce vertex count.
The tangent generation is done by Morten S. Mikkelsen's tangent space generation code.
void plGeometry::Transform | ( | const plMat4 & | mTransform, |
bool | bTransformPolyNormals ) |
Transforms all vertices by the given transform.
When bTransformPolyNormals is true, the polygon normals are transformed, as well. Set this to false when face normals are going to be computed later anyway.
void plGeometry::TriangulatePolygons | ( | plUInt32 | uiMaxVerticesInPolygon = 3 | ) |
Triangulates all polygons that have more than uiMaxVerticesInPolygon vertices.
Set uiMaxVerticesInPolygon to 4, if you want to keep quads unchanged.
void plGeometry::ValidateTangents | ( | float | fEpsilon = 0.01f | ) |
Checks if present tangents are meaningful and resetting them if necessary.
Checks if the tangents are approximately orthogonal to the vertex normal and of unit length. If this is not the case the respective tangent will be zeroed. The caller can provide a custom floating point comparison epsilon