Wasabi
Public Member Functions | Static Public Member Functions | Friends | List of all members
WGeometry Class Reference

#include <WGeometry.hpp>

Inheritance diagram for WGeometry:
WFileAsset WBase

Public Member Functions

virtual std::string GetTypeName () const override
 
virtual void SetID (uint32_t newID) override
 
virtual void SetName (std::string newName) override
 
 WGeometry (Wasabi *const app, uint32_t ID=0)
 
virtual uint32_t GetVertexBufferCount () const
 
virtual W_VERTEX_DESCRIPTION GetVertexDescription (uint32_t layoutIndex=0) const
 
virtual size_t GetVertexDescriptionSize (uint32_t layoutIndex=0) const
 
WError CreateFromData (void *vb, uint32_t numVerts, void *ib, uint32_t numIndices, W_GEOMETRY_CREATE_FLAGS flags=W_GEOMETRY_CREATE_CPU_READABLE)
 
virtual WError CreateFromDefaultVerticesData (vector< WDefaultVertex > &default_vertices, vector< uint32_t > &indices, W_GEOMETRY_CREATE_FLAGS flags=W_GEOMETRY_CREATE_CPU_READABLE)
 
WError CreateCube (float size, W_GEOMETRY_CREATE_FLAGS flags=W_GEOMETRY_CREATE_CPU_READABLE)
 
WError CreateBox (WVector3 dimensions, W_GEOMETRY_CREATE_FLAGS flags=W_GEOMETRY_CREATE_CPU_READABLE)
 
WError CreatePlain (float size, int xsegs, int zsegs, W_GEOMETRY_CREATE_FLAGS flags=W_GEOMETRY_CREATE_CPU_READABLE)
 
WError CreateRectanglePlain (float sizeX, float sizeZ, int xsegs, int zsegs, W_GEOMETRY_CREATE_FLAGS flags=W_GEOMETRY_CREATE_CPU_READABLE)
 
WError CreateSphere (float radius, uint32_t vres=12, uint32_t ures=12, W_GEOMETRY_CREATE_FLAGS flags=W_GEOMETRY_CREATE_CPU_READABLE)
 
WError CreateCone (float radius, float height, uint32_t hsegs, uint32_t csegs, W_GEOMETRY_CREATE_FLAGS flags=W_GEOMETRY_CREATE_CPU_READABLE)
 
WError CreateCylinder (float radius, float height, uint32_t hsegs, uint32_t csegs, W_GEOMETRY_CREATE_FLAGS flags=W_GEOMETRY_CREATE_CPU_READABLE)
 
WError CopyFrom (WGeometry *const from, W_GEOMETRY_CREATE_FLAGS flags=W_GEOMETRY_CREATE_VB_CPU_READABLE|W_GEOMETRY_CREATE_IB_CPU_READABLE)
 
WError CreateAnimationData (void *animBuf, W_GEOMETRY_CREATE_FLAGS flags=W_GEOMETRY_CREATE_STATIC)
 
WError LoadFromHXM (std::string filename, W_GEOMETRY_CREATE_FLAGS flags=W_GEOMETRY_CREATE_CPU_READABLE)
 
WError MapVertexBuffer (void **const vb, W_MAP_FLAGS mapFlags)
 
WError MapIndexBuffer (void **const ib, W_MAP_FLAGS mapFlags)
 
WError MapAnimationBuffer (void **const ab, W_MAP_FLAGS mapFlags)
 
void UnmapVertexBuffer (bool recalculateBoundingBox=true)
 
void UnmapIndexBuffer ()
 
void UnmapAnimationBuffer ()
 
WError Scale (float mulFactor)
 
WError ScaleX (float mulFactor)
 
WError ScaleY (float mulFactor)
 
WError ScaleZ (float mulFactor)
 
WError ApplyOffset (float x, float y, float z)
 
WError ApplyOffset (WVector3 offset)
 
WError ApplyTransformation (WMatrix mtx)
 
bool Intersect (WVector3 p1, WVector3 p2, WVector3 *pt=nullptr, WVector2 *uv=nullptr, uint32_t *triangleIndex=nullptr)
 
WError Draw (class WRenderTarget *rt, uint32_t numIndices=-1, uint32_t numInstances=1, bool bindAnimation=true)
 
WVector3 GetMinPoint () const
 
WVector3 GetMaxPoint () const
 
uint32_t GetNumVertices () const
 
uint32_t GetNumIndices () const
 
bool IsRigged () const
 
virtual bool Valid () const override
 
virtual WError SaveToStream (WFile *file, std::ostream &outputStream) override
 
virtual WError LoadFromStream (WFile *file, std::istream &inputStream, std::vector< void * > &args, std::string nameSuffix) override
 
- Public Member Functions inherited from WFileAsset
 WFileAsset (class Wasabi *const app, uint32_t ID=0)
 
virtual WError LoadFromStream (class WFile *file, std::istream &inputStream, vector< void * > &args, std::string nameSuffix)=0
 
- Public Member Functions inherited from WBase
 WBase (class Wasabi *const app, uint32_t ID=0)
 
uint32_t GetID () const
 
std::string GetName () const
 
class WasabiGetAppPtr () const
 
void AddReference ()
 
void RemoveReference ()
 

Static Public Member Functions

static std::string _GetTypeName ()
 
static std::vector< void * > LoadArgs (W_GEOMETRY_CREATE_FLAGS flags=W_GEOMETRY_CREATE_CPU_READABLE)
 

Friends

class WGeometryManager
 

Additional Inherited Members

- Protected Attributes inherited from WBase
class Wasabim_app
 
uint32_t m_ID
 
std::string m_name
 

Detailed Description

A WGeometry is a flexible way to represent any geometry that is needed for rendering or any general computation or usage. WGeometry can be derived such that one can modify the composition of the geometry (the attributes).

A geometry can be made immutable, making it use less memory, at the cost of having several functions not work (functions that require access to the geometry's vertex data).

WGeometry can hold several vertex buffers. By default, Wasabi uses the first buffer to render (with indices) and uses the second buffer (if available) for animation data.

Member Function Documentation

◆ _GetTypeName()

static std::string WGeometry::_GetTypeName ( )
static

Returns "Geometry" string.

Returns
Returns "Geometry" string

◆ ApplyOffset() [1/2]

WError WGeometry::ApplyOffset ( float  x,
float  y,
float  z 
)

Applies an offset to all vertices in the geometry. The geometry must be valid and must have an attribute in its geometry buffer named "position". The geometry must be dynamic and not immutable.

Parameters
xx offset to apply
yy offset to apply
zz offset to apply
Returns
Error code, see WError.h

◆ ApplyOffset() [2/2]

WError WGeometry::ApplyOffset ( WVector3  offset)

Applies an offset to all vertices in the geometry. The geometry must be valid and must have an attribute in its geometry buffer named "position". The geometry must be dynamic and not immutable.

Parameters
offsetOffset to apply
Returns
Error code, see WError.h

◆ ApplyTransformation()

WError WGeometry::ApplyTransformation ( WMatrix  mtx)

Applies a transformation matrix to all vertices in the geometry. The geometry must be valid and must have an attribute in its geometry buffer named "position". The geometry must be dynamic and not immutable.

Parameters
mtxTransformation matrix to apply
Returns
Error code, see WError.h

◆ CopyFrom()

WError WGeometry::CopyFrom ( WGeometry *const  from,
W_GEOMETRY_CREATE_FLAGS  flags = W_GEOMETRY_CREATE_VB_CPU_READABLE|W_GEOMETRY_CREATE_IB_CPU_READABLE 
)

Copy another (non-immutable) geometry.

Parameters
fromGeometry to copy
flagsCreation flags, see W_GEOMETRY_CREATE_FLAGS
Returns
Error code, see WError.h

◆ CreateAnimationData()

WError WGeometry::CreateAnimationData ( void *  animBuf,
W_GEOMETRY_CREATE_FLAGS  flags = W_GEOMETRY_CREATE_STATIC 
)

Creates animation data vertex buffer. The geometry must have GetVertexBufferCount() > 1. The buffer will be dynamic if the first vertex buffer (created from a Load*, CreateFromData() or CopyFrom() call) was dynamic, false otherwise. If the geometry of this object is immutable, the the animation buffer will also be.

Parameters
animBufA pointer to the memory to create the animation buffer from, which must be a valid contiguous memory of size GetNumVertices()*GetVertexDescription(1).GetSize()
flagsCreation flags, see W_GEOMETRY_CREATE_FLAGS
Returns
Error code, see WError.h

◆ CreateBox()

WError WGeometry::CreateBox ( WVector3  dimensions,
W_GEOMETRY_CREATE_FLAGS  flags = W_GEOMETRY_CREATE_CPU_READABLE 
)

Creates a box geometry.

Parameters
dimensionsDimensions of the box
flagsCreation flags, see W_GEOMETRY_CREATE_FLAGS
Returns
Error code, see WError.h

◆ CreateCone()

WError WGeometry::CreateCone ( float  radius,
float  height,
uint32_t  hsegs,
uint32_t  csegs,
W_GEOMETRY_CREATE_FLAGS  flags = W_GEOMETRY_CREATE_CPU_READABLE 
)

Creates a cone geometry, with csegs segments at the bottom circle and hsegs segments along the cone's height.

Parameters
radiusRadius of the bottom circle
heightHeight of the cone
hsegsNumber of segments along the height, minimum is 0
csegsNumber of segments at the bottom circle, minimum is 3
flagsCreation flags, see W_GEOMETRY_CREATE_FLAGS
Returns
Error code, see WError.h

◆ CreateCube()

WError WGeometry::CreateCube ( float  size,
W_GEOMETRY_CREATE_FLAGS  flags = W_GEOMETRY_CREATE_CPU_READABLE 
)

Creates a cube geometry.

If this function is called while the engine parameter "geometryImmutable" (see Wasabi::engineParams) is set to true, then the geometry will be made immutable, regardless of the bDynamic parameter. Immutable geometry cannot have the following function calls work: SaveToWGM(), all map and unmap functions, all scaling functions, all offset functions and Intersect(). Immutable geometry cannot be copied. Immutable geometry uses less memory.

Parameters
sizeDimension of the cube
flagsCreation flags, see W_GEOMETRY_CREATE_FLAGS
Returns
Error code, see WError.h

◆ CreateCylinder()

WError WGeometry::CreateCylinder ( float  radius,
float  height,
uint32_t  hsegs,
uint32_t  csegs,
W_GEOMETRY_CREATE_FLAGS  flags = W_GEOMETRY_CREATE_CPU_READABLE 
)

Creates a cylinder geometry, with csegs segments at the bottom and top circles and hsegs segments along the cylinder's height.

Parameters
radiusRadius of the cylinder
heightHeight of the cylinder
hsegsNumber of segments along the height, minimum is 0
csegsNumber of segments at the bottom and top circles, minimum is 3
flagsCreation flags, see W_GEOMETRY_CREATE_FLAGS
Returns
Error code, see WError.h

◆ CreateFromData()

WError WGeometry::CreateFromData ( void *  vb,
uint32_t  numVerts,
void *  ib,
uint32_t  numIndices,
W_GEOMETRY_CREATE_FLAGS  flags = W_GEOMETRY_CREATE_CPU_READABLE 
)

Creates a geometry from buffers in memory. The buffers must be formatted such that they match what GetVertexDescription() returns. This function fills up only the first (0th) vertex buffer that is accompanied with an index buffer for rendering use.

If this function is called while the engine parameter "geometryImmutable" (see Wasabi::engineParams) is set to true, then the geometry will be made immutable, regardless of the bDynamic parameter. Immutable geometry cannot have the following function calls work: SaveToWGM(), all map and unmap functions, all scaling functions, all offset functions and Intersect(). Immutable geometry cannot be copied. Immutable geometry uses less memory.

Examples: Create a triangle:

WDefaultVertex vertices[] = {
WDefaultVertex(-0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, -1.0f, 0.0f, 1.0f),
WDefaultVertex(-0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, -1.0f, 0.0f, 0.0f),
WDefaultVertex(0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, -1.0f, 1.0f, 0.0f)
};
uint32_t indices[] = {0, 1, 2};
WGeomery* geometry = GeometryManager->CreateFromData(vertices, 3, indices, 3);
Parameters
vbA pointer to the memory containing the vertex data, which must be a valid contiguous memory of size num_verts*GetVertexDescription(0).GetSize()
numVertsNumber of vertices in vb
ibA pointer to the memory containing the index data, which must be a valid contiguous memory of size num_indices*sizeof(uint)
numIndicesNumber of indices in ab
flagsCreation flags, see W_GEOMETRY_CREATE_FLAGS
Returns
Error code, see WError.h

◆ CreateFromDefaultVerticesData()

virtual WError WGeometry::CreateFromDefaultVerticesData ( vector< WDefaultVertex > &  default_vertices,
vector< uint32_t > &  indices,
W_GEOMETRY_CREATE_FLAGS  flags = W_GEOMETRY_CREATE_CPU_READABLE 
)
virtual

Called by CreateBox, CreateSphere, etc... to convert the given default vertices (of type WDefaultVertex) to the custom type for this geometry. This can be overrided to utilize the Create* functions while using a custom vertex format

◆ CreatePlain()

WError WGeometry::CreatePlain ( float  size,
int  xsegs,
int  zsegs,
W_GEOMETRY_CREATE_FLAGS  flags = W_GEOMETRY_CREATE_CPU_READABLE 
)

Creates a plain geometry that is segmented. The plain will be split into (xsegs+1)*(zsegs+1) squares, which will have 2 triangles each.

Parameters
sizeSize (dimension) of the plain
xsegsNumber of segments on the X axis, minimum is 0
zsegsNumber of segments on the Z axis, minimum is 0
flagsCreation flags, see W_GEOMETRY_CREATE_FLAGS
Returns
Error code, see WError.h

◆ CreateRectanglePlain()

WError WGeometry::CreateRectanglePlain ( float  sizeX,
float  sizeZ,
int  xsegs,
int  zsegs,
W_GEOMETRY_CREATE_FLAGS  flags = W_GEOMETRY_CREATE_CPU_READABLE 
)

Creates a plain geometry that is segmented. The plain will be split into (xsegs+1)*(zsegs+1) squares, which will have 2 triangles each.

Parameters
sizeXSize (dimension) of the plain on the X axis
sizeZSize (dimension) of the plain on the Z axis
xsegsNumber of segments on the X axis, minimum is 0
zsegsNumber of segments on the Z axis, minimum is 0
flagsCreation flags, see W_GEOMETRY_CREATE_FLAGS
Returns
Error code, see WError.h

◆ CreateSphere()

WError WGeometry::CreateSphere ( float  radius,
uint32_t  vres = 12,
uint32_t  ures = 12,
W_GEOMETRY_CREATE_FLAGS  flags = W_GEOMETRY_CREATE_CPU_READABLE 
)

Creates a sphere geometry, with VRes vertical segments and URes horizontal segments.

Parameters
radiusRadius of the sphere
vresVertical resolution, or number of vertical splits, minimum is 3
uresHorizontal resolution, or number of horizontal splits, minimum is 2
flagsCreation flags, see W_GEOMETRY_CREATE_FLAGS
Returns
Error code, see WError.h

◆ Draw()

WError WGeometry::Draw ( class WRenderTarget rt,
uint32_t  numIndices = -1,
uint32_t  numInstances = 1,
bool  bindAnimation = true 
)

Draw the geometry to the render target. This function will bind the geometry buffer to vertex buffer slot 0 in Vulkan, and will bind the animation buffer (if available and requested) to slot 1. The render target must have its Begin() function called before this function is called.

Parameters
rtRender target to draw to
numIndicesNumber of indices to draw, -1 for all. If the geometry has no indices, this is the number of vertices to draw, -1 for all
numInstancesNumber of instances to draw
bindAnimationtrue to bind the animation buffer (if not available, the geometry buffer will be bound twice), false otherwise
Returns
[description]

◆ GetMaxPoint()

WVector3 WGeometry::GetMaxPoint ( ) const

Retrieves the point that represents the maximum boundary of the geometry.

Returns
The maximum boundary for the geometry

◆ GetMinPoint()

WVector3 WGeometry::GetMinPoint ( ) const

Retrieves the point that represents the minimum boundary of the geometry.

Returns
The minimum boundary for the geometry

◆ GetNumIndices()

uint32_t WGeometry::GetNumIndices ( ) const

Retrieves the number of indices in the geometry.

Returns
Number of indices

◆ GetNumVertices()

uint32_t WGeometry::GetNumVertices ( ) const

Retrieves the number of vertices in the geometry.

Returns
Number of vertices

◆ GetTypeName()

virtual std::string WGeometry::GetTypeName ( ) const
overridevirtual

This function must be implemented by a child class. This is used for debugging, in which a class should return its name.

Returns
The name of the class

Implements WBase.

◆ GetVertexBufferCount()

virtual uint32_t WGeometry::GetVertexBufferCount ( ) const
inlinevirtual

This function should return the number of vertex descriptions that GetVertexDescription() can return, which represents the number of vertex buffers this geometry class can hold.

Returns
The number of vertex buffers this geometry can hold

◆ GetVertexDescription()

virtual W_VERTEX_DESCRIPTION WGeometry::GetVertexDescription ( uint32_t  layoutIndex = 0) const
virtual

Retrieves the vertex description of a vertex buffer. Should return valid descriptions for all layout_index values between 0 and GetVertexBufferCount()-1.

The default vertex description (for default geometry) is:

  • layout 0: (vertex buffer)
    • W_ATTRIBUTE_POSITION
    • W_ATTRIBUTE_TANGENT
    • W_ATTRIBUTE_NORMAL
    • W_ATTRIBUTE_UV
  • layout 1: (animation buffer)
    • W_ATTRIBUTE_BONE_INDEX
    • W_ATTRIBUTE_BONE_WEIGHT
      Parameters
      layoutIndexIndex of the vertex buffer
      Returns
      The description of a vertex in the layout_index 'th vertex buffer

◆ GetVertexDescriptionSize()

virtual size_t WGeometry::GetVertexDescriptionSize ( uint32_t  layoutIndex = 0) const
virtual

Retrieves the size of the vertex description at the given index.

Parameters
layoutIndexIndex of the vertex buffer
Returns
The size of the vertex description at the given index

◆ Intersect()

bool WGeometry::Intersect ( WVector3  p1,
WVector3  p2,
WVector3 pt = nullptr,
WVector2 uv = nullptr,
uint32_t *  triangleIndex = nullptr 
)

Checks if a ray intersects the geometry. The geometry must be valid and must have an attribute in its geometry buffer named "position". The geometry must be dynamic and not immutable.

Parameters
p1Origin of the ray
p2A vector that points in the same direction as the ray
ptA pointer to a 3D vector to be populated with the point of intersection, if any
uvA pointer to a 2D vector to be populated with the UV coordinates at the intersection point, if any. If the vertices don't have a an attribute named uv (with at least two components) then this will be the UV coordinates local to the triangle intersected
triangleIndexA pointer to an integer to be populated with the index of the triangle that was intersected, if any
Returns
true if there was an intersection, false otherwise

◆ IsRigged()

bool WGeometry::IsRigged ( ) const

Checks if the geometry has an animation vertex buffer.

Returns
true if the geometry has animation data, false otherwise

◆ LoadFromHXM()

WError WGeometry::LoadFromHXM ( std::string  filename,
W_GEOMETRY_CREATE_FLAGS  flags = W_GEOMETRY_CREATE_CPU_READABLE 
)

Load a geometry from an HXM file. The geometry in the HXM file may be of a different format, in which case this function will try to fill in the attributes that the two formats share, discarding the rest. If no normal or tangent data are found in the file, but are available in this geometry's description, the function will attempt to fill them in automatically.

Parameters
filenameName of the file to load
flagsCreation flags, see W_GEOMETRY_CREATE_FLAGS
Returns
Error code, see WError.h

◆ MapAnimationBuffer()

WError WGeometry::MapAnimationBuffer ( void **const  ab,
W_MAP_FLAGS  mapFlags 
)

Map the animation buffer of this geometry. This will fail if there is no animation data, the geometry is dynamic or if the geometry is immutable.

Parameters
abThe address of a pointer to have it point to the mapped memory of the animation vertices
flagsMap flags (bitwise OR'd), specifying read/write intention
Returns
Error code, see WError.h

◆ MapIndexBuffer()

WError WGeometry::MapIndexBuffer ( void **const  ib,
W_MAP_FLAGS  mapFlags 
)

Map the index buffer of this geometry. This will fail if there is no geometry, the geometry is dynamic or if the geometry is immutable. Indices are stored in 32-bits-per-index (uint32_t).

Examples: Flip this first triangle

// Assuming geometry is valid and dynamic
uint* indices;
geometry->MapIndexBuffer((void**)&indices);
uint32_t temp = indices[0];
indices[0] = indices[2];
indices[2] = temp;
geometry->UnmapIndexBuffer();
Parameters
ibThe address of a pointer to have it point to the mapped memory of the indices
flagsMap flags (bitwise OR'd), specifying read/write intention
Returns
Error code, see WError.h

◆ MapVertexBuffer()

WError WGeometry::MapVertexBuffer ( void **const  vb,
W_MAP_FLAGS  mapFlags 
)

Map the vertex buffer of this geometry. This will fail if there is no geometry, the geometry is dynamic or if the geometry is immutable.

Examples: Move the first vertex a bit

// Assuming geometry is valid and dynamic
WDefaultVertex* vertices;
geometry->MapVertexBuffer((void**)&vertices);
vertices[0].pos.x += 5;
geometry->UnmapVertexBuffer();
Parameters
vbThe address of a pointer to have it point to the mapped memory of the vertices
flagsMap flags (bitwise OR'd), specifying read/write intention
Returns
Error code, see WError.h

◆ Scale()

WError WGeometry::Scale ( float  mulFactor)

Scale the geometry. The geometry must be valid and must have an attribute in its geometry buffer named "position". The geometry must be dynamic and not immutable.

Parameters
mulFactorScale factor
Returns
Error code, see WError.h

◆ ScaleX()

WError WGeometry::ScaleX ( float  mulFactor)

Scale the geometry on the X axis. The geometry must be valid and must have an attribute in its geometry buffer named "position". The geometry must be dynamic and not immutable.

Parameters
mulFactorX scale factor
Returns
Error code, see WError.h

◆ ScaleY()

WError WGeometry::ScaleY ( float  mulFactor)

Scale the geometry on the Y axis. The geometry must be valid and must have an attribute in its geometry buffer named "position". The geometry must be dynamic and not immutable.

Parameters
mulFactorY scale factor
Returns
Error code, see WError.h

◆ ScaleZ()

WError WGeometry::ScaleZ ( float  mulFactor)

Scale the geometry on the Z axis. The geometry must be valid and must have an attribute in its geometry buffer named "position". The geometry must be dynamic and not immutable.

Parameters
mulFactorZ scale factor
Returns
Error code, see WError.h

◆ SetID()

virtual void WGeometry::SetID ( uint32_t  newID)
overridevirtual

Sets the ID of this object and notifies its manager.

Parameters
newIDNew ID

Implements WBase.

◆ SetName()

virtual void WGeometry::SetName ( std::string  newName)
overridevirtual

Sets the name of this object.

Parameters
nameNew name for the object

Implements WBase.

◆ UnmapAnimationBuffer()

void WGeometry::UnmapAnimationBuffer ( )

Unmap animation vertices from a previous MapAnimationBuffer() call. If MapAnimationBuffer() was called with bReadOnly == false, the this will apply the changes to the animation data.

◆ UnmapIndexBuffer()

void WGeometry::UnmapIndexBuffer ( )

Unmap indices from a previous MapIndexBuffer() call. If MapIndexBuffer() was called with bReadOnly == false, the this will apply the changes to the geometry.

◆ UnmapVertexBuffer()

void WGeometry::UnmapVertexBuffer ( bool  recalculateBoundingBox = true)

Unmap vertices from a previous MapVertexBuffer() call. If MapVertexBuffer() was called with bReadOnly == false, the this will apply the changes to the geometry.

Parameters
recalculateBoundingBoxWhether or not to recalculate the geometry's bounding box information

◆ Valid()

virtual bool WGeometry::Valid ( ) const
overridevirtual

Checks the validity of the geometry. A geometry is valid if it has a vertex and an index buffer.

Returns
true if the geometry is valid, false otherwise

Implements WBase.


The documentation for this class was generated from the following file:
WVector3::x
float x
Definition: WMath.hpp:292
WDefaultVertex::pos
WVector3 pos
Definition: WGeometry.hpp:105
Wasabi::GeometryManager
class WGeometryManager * GeometryManager
Definition: WCore.hpp:77
WDefaultVertex
Definition: WGeometry.hpp:98