Cafu Engine
MapBezierPatchT Class Reference

This class represents a bezier patch. More...

#include "MapBezierPatch.hpp"

Inheritance diagram for MapBezierPatchT:

Public Types

enum  EndCapPosE { TOP_RIGHT =0, TOP_LEFT, BOTTOM_RIGHT, BOTTOM_LEFT }
 

Public Member Functions

 MapBezierPatchT (EditorMaterialI *Material_, cf::SceneGraph::LightMapManT &LMM_, int SubdivsHorz_=-1, int SubdivsVert_=-1)
 The default constructor. It creates an "empty" bezier patch. More...
 
 MapBezierPatchT (const MapBezierPatchT &BP)
 The copy constructor for copying a bezier patch. More...
 
 ~MapBezierPatchT ()
 The destructor. More...
 
MapBezierPatchTClone () const override
 The virtual copy constructor. More...
 
BoundingBox3fT GetBB () const
 Returns the spatial bounding-box of this map element. More...
 
bool TraceRay (const Vector3fT &RayOrigin, const Vector3fT &RayDir, float &Fraction, unsigned long &FaceNr) const
 Traces a ray against this map element, and returns whether it was hit. More...
 
bool TracePixel (const wxPoint &Pixel, int Radius, const ViewWindow2DT &ViewWin) const
 This method determines if this map element is intersected/affected by the specified disc in ViewWin. More...
 
TrafoMementoTGetTrafoState () const override
 Returns a memento that encapsulates the transform-related state of this element. More...
 
void RestoreTrafoState (const TrafoMementoT *TM) override
 Restores the transform-related state of this element from the given memento. More...
 
void TrafoMove (const Vector3fT &Delta, bool LockTexCoords) override
 Translates this element by the given vector (in world-space). More...
 
void TrafoRotate (const Vector3fT &RefPoint, const cf::math::AnglesfT &Angles, bool LockTexCoords) override
 Rotates this element about the given reference point (in world-space). More...
 
void TrafoScale (const Vector3fT &RefPoint, const Vector3fT &Scale, bool LockTexCoords) override
 Scales this element about the given reference point (in world-space). More...
 
void TrafoMirror (unsigned int NormalAxis, float Dist, bool LockTexCoords) override
 Mirrors this element along the given mirror plane (in world-space). More...
 
void Transform (const Matrix4x4fT &Matrix, bool LockTexCoords) override
 Why does this method not replace all the other Trafo*() methods? This method is the most generic, allowing transformations that e.g. More...
 
void Load_D3_map (TextParserT &TP, unsigned long patchDef, EditorMatManT &MatMan)
 
void Load_cmap (TextParserT &TP, MapDocumentT &MapDoc, bool IgnoreGroups) override
 
void Save_cmap (std::ostream &OutFile, unsigned long PatchNr, const MapDocumentT &MapDoc) const
 
bool IsTranslucent () const
 Returns whether this map element is (entirely or partially) translucent. More...
 
void Render2D (Renderer2DT &Renderer) const
 
void Render3D (Renderer3DT &Renderer) const
 
void SetMaterial (EditorMaterialI *Mat)
 
EditorMaterialIGetMaterial () const
 
const Vector3fTGetCvPos (unsigned long x, unsigned long y) const
 
void SetCvPos (unsigned long x, unsigned long y, const Vector3fT &Pos)
 
const Vector3fTGetCvUV (unsigned long x, unsigned long y) const
 
void SetCvUV (unsigned long x, unsigned long y, const Vector3fT &uv)
 
int GetSubdivsHorz () const
 
void SetSubdivsHorz (int subdivs)
 
int GetSubdivsVert () const
 
void SetSubdivsVert (int subdivs)
 
void InvertPatch ()
 
void SetSurfaceInfo (const SurfaceInfoT &SI)
 Set a new SurfaceInfoT. More...
 
const SurfaceInfoTGetSurfaceInfo () const
 Returns the surface info that is associated with this patch. More...
 
void SetSize (unsigned long width, unsigned long height)
 
unsigned long GetWidth () const
 
unsigned long GetHeight () const
 
unsigned long GetRenderWidth () const
 
unsigned long GetRenderHeight () const
 
Vector3fT GetRenderVertexPos (unsigned long x, unsigned long y) const
 
void Render3D_Basic (MatSys::RenderMaterialT *RenderMat, const wxColour &MeshColor, const int MeshAlpha) const
 A helper method for Render3D(), but also useful e.g. for preview renderings by the "New Bezier Patch" tool. More...
 
virtual const
cf::TypeSys::TypeInfoT
GetType () const
 
- Public Member Functions inherited from MapPrimitiveT
 MapPrimitiveT (const wxColour &Color)
 The default constructor. More...
 
 MapPrimitiveT (const MapPrimitiveT &Prim)
 The copy constructor for copying a primitive. More...
 
wxColour GetColor (bool ConsiderGroup=true) const
 This method returns the "inherent" color of this map element. More...
 
- Public Member Functions inherited from MapElementT
 MapElementT ()
 The default constructor. More...
 
 MapElementT (const MapElementT &Elem)
 The copy constructor for copying a map element. More...
 
virtual ~MapElementT ()
 The virtual destructor. More...
 
MapEditor::CompMapEntityTGetParent () const
 Returns the entity that this element is a part of, or NULL if the element has no parent entity. More...
 
void SetParent (MapEditor::CompMapEntityT *Ent)
 Sets the parent entity that is element is a part of. More...
 
bool IsSelected () const
 Returns whether this element is currently selected in the map document. More...
 
void SetSelected (bool Selected=true)
 Sets the selection state of this element. More...
 
virtual wxString GetDescription () const
 
GroupTGetGroup () const
 Returns NULL when this map element is in no group, or the pionter to the group it is a member of otherwise. More...
 
void SetGroup (GroupT *Group)
 Sets the group this element is a member of (use NULL for "no group"). More...
 
bool IsVisible () const
 Returns whether this map element is currently visible (in the 2D, 3D and other views). More...
 
bool CanSelect () const
 Returns whether this map element can currently be selected (in the 2D, 3D and other views). More...
 
void GetToggleEffects (ArrayT< MapElementT * > &RemoveFromSel, ArrayT< MapElementT * > &AddToSel, bool AutoGroupEntities)
 Computes how the selection must be changed in order to toggle the given element when the element's entity and group memberships are taken into account. More...
 
virtual void AdvanceTime (float t)
 This is periodically called in order to have the element advance its internal clock by t seconds. More...
 
unsigned int GetFrameCount () const
 
void SetFrameCount (unsigned int FrameCount)
 

Static Public Member Functions

static MapBezierPatchTCreateSimplePatch (EditorMaterialI *Material_, cf::SceneGraph::LightMapManT &LMM_, unsigned long width, unsigned long height, const Vector3fT &min, const Vector3fT &max, int SubdivsHorz_=-1, int SubdivsVert_=-1)
 
static MapBezierPatchTCreatePatchCylinder (EditorMaterialI *Material_, cf::SceneGraph::LightMapManT &LMM_, unsigned long height, const Vector3fT &min, const Vector3fT &max, int SubdivsHorz_=-1, int SubdivsVert_=-1)
 
static MapBezierPatchTCreateSquareCylinder (EditorMaterialI *Material_, cf::SceneGraph::LightMapManT &LMM_, unsigned long height, const Vector3fT &min, const Vector3fT &max, int SubdivsHorz_=-1, int SubdivsVert_=-1)
 
static MapBezierPatchTCreateQuarterCylinder (EditorMaterialI *Material_, cf::SceneGraph::LightMapManT &LMM_, unsigned long height, const Vector3fT &min, const Vector3fT &max, int SubdivsHorz_=-1, int SubdivsVert_=-1)
 
static MapBezierPatchTCreateHalfCylinder (EditorMaterialI *Material_, cf::SceneGraph::LightMapManT &LMM_, unsigned long height, const Vector3fT &min, const Vector3fT &max, int SubdivsHorz_=-1, int SubdivsVert_=-1)
 
static MapBezierPatchTCreateEdgePipe (EditorMaterialI *Material_, cf::SceneGraph::LightMapManT &LMM_, const Vector3fT &min, const Vector3fT &max, int SubdivsHorz_=-1, int SubdivsVert_=-1)
 
static MapBezierPatchTCreateCone (EditorMaterialI *Material_, cf::SceneGraph::LightMapManT &LMM_, unsigned long height, const Vector3fT &min, const Vector3fT &max, int SubdivsHorz_=-1, int SubdivsVert_=-1)
 
static MapBezierPatchTCreateSphere (EditorMaterialI *Material_, cf::SceneGraph::LightMapManT &LMM_, const Vector3fT &min, const Vector3fT &max, int SubdivsHorz_=-1, int SubdivsVert_=-1)
 
static MapBezierPatchTCreateQuarterDisc (EditorMaterialI *Material_, cf::SceneGraph::LightMapManT &LMM_, const Vector3fT &min, const Vector3fT &max, int SubdivsHorz_=-1, int SubdivsVert_=-1, EndCapPosE pos=TOP_RIGHT, bool Inverted=false)
 
static MapBezierPatchTCreateConcaveEndcap (EditorMaterialI *Material_, cf::SceneGraph::LightMapManT &LMM_, const Vector3fT &min, const Vector3fT &max, int SubdivsHorz_=-1, int SubdivsVert_=-1, EndCapPosE pos=TOP_RIGHT)
 
static void * CreateInstance (const cf::TypeSys::CreateParamsT &Params)
 
- Static Public Member Functions inherited from MapPrimitiveT
static void * CreateInstance (const cf::TypeSys::CreateParamsT &Params)
 
- Static Public Member Functions inherited from MapElementT
static void * CreateInstance (const cf::TypeSys::CreateParamsT &Params)
 

Static Public Attributes

static const cf::TypeSys::TypeInfoT TypeInfo
 
- Static Public Attributes inherited from MapPrimitiveT
static const cf::TypeSys::TypeInfoT TypeInfo
 
- Static Public Attributes inherited from MapElementT
static const cf::TypeSys::TypeInfoT TypeInfo
 

Additional Inherited Members

- Protected Attributes inherited from MapElementT
MapEditor::CompMapEntityTm_Parent
 The entity that this element is a part of. More...
 
bool m_IsSelected
 Is this element currently selected in the map document? More...
 
GroupTm_Group
 The group this element is in, NULL if in no group. More...
 
unsigned int m_FrameCount
 The number of the frame in which this element was last rendered in a 3D view, used in order to avoid processing/rendering it twice. More...
 

Detailed Description

This class represents a bezier patch.

Implementation notes:

Patches consist of several distinct parts: The control-vertices (with position and texture-coordinates each), a mesh for rendering, and auxiliary data that allows the user to scale, shift and rotate the texture-coordinates in a GUI dialog. The auxiliary data consists of a duplicate of the control-vertices (texture-coords only, no positions), used as "reference", plus a transformation matrix. The result of the transformation being applied to the reference tex-coords is always kept identical to the tex-coords of the control-vertices.

Several dependency relationships exist between these components:

  1. The control-vertices are the authoritative master data. Only those are ever loaded from and saved to disk.
  2. If the positions of the control-vertices change, the render mesh (positions, normals, tangets, binormals, ...) must be updated.
  3. If the tex-coords of the control-vertices change, a) the render mesh (its tex-coords) must be updated, and b) also the auxiliary data must be reset: The transformation must be set to identity and the reference tex-coords must be set equal to those of the control-vertices, so that the auxiliary data describes the same tex-coords as the control-vertices.
  4. If the transformation matrix of the auxiliary data changes (as a result of user interactivity), the tex-coords of the control-vertices must be set to the transformed reference tex-coords of the auxiliary data. Doing so should recurse into the render mesh (case 3a), but not into the auxiliary data (case 3b).

Constructor & Destructor Documentation

MapBezierPatchT::MapBezierPatchT ( EditorMaterialI Material_,
cf::SceneGraph::LightMapManT LMM_,
int  SubdivsHorz_ = -1,
int  SubdivsVert_ = -1 
)

The default constructor. It creates an "empty" bezier patch.

MapBezierPatchT::MapBezierPatchT ( const MapBezierPatchT BP)

The copy constructor for copying a bezier patch.

Parameters
BPThe bezier patch to copy-construct this bezier patch from.
MapBezierPatchT::~MapBezierPatchT ( )

The destructor.

Member Function Documentation

MapBezierPatchT * MapBezierPatchT::Clone ( ) const
overridevirtual

The virtual copy constructor.

Creates a copy of this primitive that is of the same class as the original, even when called via a base class pointer (the caller doesn't need to know the exact derived class).

Implements MapPrimitiveT.

BoundingBox3fT MapBezierPatchT::GetBB ( ) const
virtual

Returns the spatial bounding-box of this map element.

Implements MapElementT.

const SurfaceInfoT& MapBezierPatchT::GetSurfaceInfo ( ) const
inline

Returns the surface info that is associated with this patch.

TrafoMementoT * MapBezierPatchT::GetTrafoState ( ) const
overridevirtual

Returns a memento that encapsulates the transform-related state of this element.

The method saves all state in the memento that calls to the Trafo*() methods can possibly modify.

Reimplemented from MapElementT.

bool MapBezierPatchT::IsTranslucent ( ) const
virtual

Returns whether this map element is (entirely or partially) translucent.

Translucent map elements are typically implemented with "alpha blending" and require rendering in back-to-front order.

See Also
EditorMaterialI::IsTranslucent()

Reimplemented from MapElementT.

void MapBezierPatchT::Render3D_Basic ( MatSys::RenderMaterialT RenderMat,
const wxColour &  MeshColor,
const int  MeshAlpha 
) const

A helper method for Render3D(), but also useful e.g. for preview renderings by the "New Bezier Patch" tool.

void MapBezierPatchT::RestoreTrafoState ( const TrafoMementoT TM)
overridevirtual

Restores the transform-related state of this element from the given memento.

The method restores all state from the memento that calls to the Trafo*() methods have possibly modified.

Reimplemented from MapElementT.

void MapBezierPatchT::SetSurfaceInfo ( const SurfaceInfoT SI)

Set a new SurfaceInfoT.

bool MapBezierPatchT::TracePixel ( const wxPoint &  Pixel,
int  Radius,
const ViewWindow2DT ViewWin 
) const
virtual

This method determines if this map element is intersected/affected by the specified disc in ViewWin.

The disc for the test is defined by the given center pixel and the given radius. For example, the caller can learn by the result of this method whether the map element should respond to a mouse-click at the same pixel. Therefore, this method can be considered as the 2D analogue of the TraceRay() method.

Reimplemented from MapElementT.

bool MapBezierPatchT::TraceRay ( const Vector3fT RayOrigin,
const Vector3fT RayDir,
float &  Fraction,
unsigned long &  FaceNr 
) const
virtual

Traces a ray against this map element, and returns whether it was hit.

The ray for the trace is defined by RayOrigin + RayDir*Fraction, where Fraction is a scalar >= 0. If a hit was detected, the Fraction is returned. Hit brushes return the number of the hit face as well. This method has been implemented mainly for "picking", that is, left-click selection in the 3D views (it makes sure that also objects that "clip nothing" in the engine can be picked), but it can also be used for any other purpose.

Parameters
RayOriginThe point in world space where the ray starts.
RayDirA unit vector in world space that describes the direction the ray extends to.
FractionOn hit, the scalar along RayDir at which the hit occurred is returned here.
FaceNrIf this map element is a brush and it was hit, the number of the hit face is returned here.
Returns
true if the ray hit this map element, false otherwise. Additional hit data (i.e. Fraction and FaceNr) is returned via reference paramaters.

Reimplemented from MapElementT.

void MapBezierPatchT::TrafoMirror ( unsigned int  NormalAxis,
float  Dist,
bool  LockTexCoords 
)
overridevirtual

Mirrors this element along the given mirror plane (in world-space).

Parameters
NormalAxisThe number of the axis along which the normal vector of the mirror plane points: 0, 1 or 2 for the x-, y- or z-axis respectively.
DistThe position of the mirror plane along its normal vector, where it intersects the NormalAxis.
LockTexCoordsTransform the texture-space along with the geometry. Note that the mirroring is not necessarily "perfect", because for some elements like models or plants, only their point of origin can be mirrored, but not their mesh.

Reimplemented from MapElementT.

void MapBezierPatchT::TrafoMove ( const Vector3fT Delta,
bool  LockTexCoords 
)
overridevirtual

Translates this element by the given vector (in world-space).

Parameters
DeltaThe offset by which to translate the element.
LockTexCoordsTransform the texture-space along with the geometry.

Reimplemented from MapElementT.

void MapBezierPatchT::TrafoRotate ( const Vector3fT RefPoint,
const cf::math::AnglesfT Angles,
bool  LockTexCoords 
)
overridevirtual

Rotates this element about the given reference point (in world-space).

Parameters
RefPointThe reference point (origin) for the rotation.
AnglesThe rotation angles for the three axes.
LockTexCoordsTransform the texture-space along with the geometry.

Reimplemented from MapElementT.

void MapBezierPatchT::TrafoScale ( const Vector3fT RefPoint,
const Vector3fT Scale,
bool  LockTexCoords 
)
overridevirtual

Scales this element about the given reference point (in world-space).

Parameters
RefPointThe reference point (origin) for the scale.
ScaleThe scale factors for the three axes.
LockTexCoordsTransform the texture-space along with the geometry.
Exceptions
DivisionByZeroE,e.g.when Scale is too small and the element becomes degenerate (e.g. a brush with too small faces).

Reimplemented from MapElementT.

void MapBezierPatchT::Transform ( const Matrix4x4fT Matrix,
bool  LockTexCoords 
)
overridevirtual

Why does this method not replace all the other Trafo*() methods? This method is the most generic, allowing transformations that e.g.

are non-orthogonal (like shears or non-uniform scales). This in turn conflicts with map primitives that can only store and deal with a restricted fixed set of transformations, e.g. an origin, a rotation and a uniform scale. These values cannot properly be re-computed from a general matrix with non-orthogonal basis vectors.

Parameters
MatrixThe matrix that describes the transform to be applied.
LockTexCoordsTransform the texture-space along with the geometry.

Reimplemented from MapElementT.


The documentation for this class was generated from the following files: