![]() |
3DCoat
3D-COAT 4.9.xx
3DCoat is the one application that has all the tools you need to take your 3D idea from a block of digital clay all the way to a production ready, fully textured organic or hard surface model.
|
General class for work with mesh. More...
#include <cMeshContainer.h>
Classes | |
| struct | PlaneArgs |
See GenPlane. More... | |
Public Member Functions | |
| cMeshContainer () | |
| cMeshContainer (const figures_t &, float fusionDistance) | |
| Build a correct mesh by set of figures. More... | |
| bool | IsValid (const bool ShowWarning=false) const |
| bool | IsValidRawSequence () const |
| Verify the error (from Blender by import OBJ): "the same vertex of face used multiple times". More... | |
| const cVec3 & | GetPosition (int vertex) const |
| int | GetVertex (const cVec3 &) const |
| const VecArray & | GetNormals () const |
| const cVec3 & | GetNormal (int vertex) const |
| cList< int > | GetNeighboursForFace (int beginRawFigure, cVec3 *avgNormal=NULL, cVec3 *avgCenter=NULL) const |
| bool | Contains (const cVec3 &) const |
| bool | Contains (const cVec3 &a, const cVec3 &b) const |
| bool | Contains (const VecArray &figure) const |
| void | InvertRaw () |
| template<bool withErase> | |
| ::std::pair< cVec3, cVec3 > | Divide (int a, int b, float tAB, int c, int d, float tCD, int *beginRemovedRawBlock=NULL, int *sizeRemovedRawBlock=NULL,::std::pair< int, int > *changedBeginRawBlock=NULL) |
| Divide a figure on two parts with declared line. More... | |
| template<bool withErase> | |
| void | Divide (int a, int b, const cVec3 &m, int c, int d, const cVec3 &n, int *beginRemovedRawBlock=NULL, int *sizeRemovedRawBlock=NULL,::std::pair< int, int > *changedBeginRawBlock=NULL) |
| void | Erase (int beginRawFigure, bool withOptimize=false) |
| Remove a point / line / polygon (represent as raw-block) from this mesh. More... | |
| void | EraseByCount (int n) |
Remove raw-blocks which a count of vertices is equal n. More... | |
| void | EraseByCount (int a, int b) |
| Remove raw-blocks which a count of vertices in the diapason [a; b]. More... | |
| void | EraseClearConfluent (float tolerance) |
| Remove figures which all vertices are confluent to line. More... | |
| void | EraseClearConfluentByIndexOnly () |
| Verify only indices of vertices. More... | |
| void | Invert (int beginRawFigure) |
| Invert a figure. More... | |
| cList< int > | Find (const cVec3 &nodeCoord) const |
| cList< int > | Find (const edgeI_t &, const edgeI_t &) const |
| int | Find (const VecArray &figure) const |
| cList< int > | FindClearConfluent (float tolerance) const |
| void | CorrectFaces (int beginRawBlockEtalon, uni_hash< bool, int > *fixed=NULL) |
| Fixed a direction for every face by neighbours. More... | |
| void | CorrectRawSequence () |
| Fixed the error (from Blender by import OBJ): "the same vertex of face used multiple times". More... | |
| void | MergeFaces (float fusionDistance) |
| Merge faces of mesh which side by side. More... | |
| int | Insert (int a, int b, float t, cList< int > *beginRawFigures=NULL, cList< int > *beginRawForRemoved=NULL) |
| Insert vertext on the line 'ab' (as verticies). More... | |
| int | Insert (int a, int b, const cVec3 &m, cList< int > *beginRawFigures=NULL, cList< int > *beginRawForRemoved=NULL) |
| void | Insert (const figureI_t &, int *beginRawFigure=NULL) |
| Insert a figure (index of verticies) into the mesh. More... | |
| figureI_t | Insert (int a, int *beginRawFigure=NULL) |
| Insert a point. More... | |
| figureI_t | Insert (int a, int b, int *beginRawFigure=NULL) |
| Insert a line. More... | |
| figureI_t | Insert (int a, int b, int c, int *beginRawFigure=NULL) |
| Insert a triangle. More... | |
| figureI_t | Insert (int a, int b, int c, int d, int *beginRawFigure=NULL) |
| Insert a polygon with 4 vertices. More... | |
| void | Insert (const figures_t &, float fusionDistance=-FLT_MAX) |
| Insert a set of figures (positions of verticies) into the mesh. More... | |
| void | Insert (const figure_t &, figureI_t *=NULL) |
| Insert a figure (positions of verticies) into the mesh. More... | |
| figure_t | Insert (const cVec3 &a, int *ai=NULL) |
| Insert a point. More... | |
| figure_t | Insert (const cVec3 &a, const cVec3 &b, int *ai=NULL, int *bi=NULL) |
| Insert a line. More... | |
| figure_t | Insert (const cVec3 &a, const cVec3 &b, const cVec3 &c, int *ai=NULL, int *bi=NULL, int *ci=NULL) |
| Insert a triangle. More... | |
| figure_t | Insert (const cVec3 &a, const cVec3 &b, const cVec3 &c, const cVec3 &d, int *ai=NULL, int *bi=NULL, int *ci=NULL, int *di=NULL) |
| Insert a polygon with 4 vertices. More... | |
| void | Insert (const cMeshContainer &) |
| Insert a mesh to this mesh. More... | |
| bool | IsClearConfluent (const figure_t &, float tolerance) const |
| bool | IsClearConfluentByIndexOnly (int beginRawFigure) const |
| Verify only indices of vertices. More... | |
| bool | IsClockwiseOrder (int beginRawFigure, const cVec3 &observer) const |
| bool | PerformBooleanOp (cMeshContainer &src1, cMeshContainer &src2, int operation, cList< ::std::pair< comms::cVec3, comms::cVec3 > > *dividers=NULL) |
| Build mesh from 'src1' and 'src2' to 'this'. More... | |
| void | QuadQuantSubd (const cMat4 &M, float quant, float dotp,::std::function< int(int, int)> *divider=nullptr) |
| Try to divide all quads in approx equal sub-quads. More... | |
| void | TriSubd (int N, SubdSnapEdgeCallback *dive=NULL, SubdSnapMiddlePointCallback *divm=NULL, void *context=NULL) |
| Divide triangular mesh on N^2 triangles. More... | |
| StaticMesh * | CreateStaticMesh () |
| Creation for rendering. More... | |
| StaticMesh * | CreateStaticMeshMC () |
| Create mesh with smoothed normals and mcubes - like shader. More... | |
| StaticMesh * | CreateHardsurfaceStaticMesh () |
Create faceted mesh. Shader mpreview1 used. More... | |
| StaticMesh * | CreateStaticMeshUV () |
| Create mstatic mesh with UV, skypreview shader used. More... | |
| cVec3 | GetFaceCoord (int pos) const |
| void | DrawDbg (const cMat4 &T, DWORD Color, DWORD FillColor=0, DWORD DetailColor=0) |
| void | DbgDrawMeshWithUVGrid () |
| use this function within __thumbnail(...) section to visualuse mesh with UV, seek "__thumbnail(test1)" as example. More... | |
| void | PickObjectEdges (cSeg &Ray, const cMat4 &M, cVec3 &RayPt, cVec3 &ObjPt) |
| returns (xyz = nearest_edge_point_pos,w = distance_from_the_ray) More... | |
| void | DivideMesh (MeshDivider< int > &) const |
| Divide the mesh on two meshes (harvest vertices). More... | |
| bool | FlipEdge (int V1, int V2, int *valence=NULL) |
| flip edge, requires fone, requires 2 faces over the edge. More... | |
| bool | OptimizeTriangularMesh () |
| tries to set valence 6 whenever possible unsing edge-flip More... | |
| cVec3 | GetFaceNormalByNubmer (int indx) |
| Max indx can Get by GetPolyCount() see GetFaceNormal(int pos) More... | |
Protected Attributes | |
| cList< cVec< cVec3, 2 > > | m_Tangents |
| Tangent and BiTangent. More... | |
| RawArray | m_Raw |
| cList< DWORD > | m_VertexSpecular |
| RGB - specular color, A - glossness. More... | |
General class for work with mesh.
| cMeshContainer::cMeshContainer | ( | ) |
CreateDefaultObjMtl() manually for create a defaul object and material. | cMeshContainer::cMeshContainer | ( | const figures_t & | , |
| float | fusionDistance | ||
| ) |
Build a correct mesh by set of figures.
| fusionDistance | See MergeFaces() for details. |
| bool cMeshContainer::Contains | ( | const cVec3 & | ) | const |
ab has in the mesh. | bool cMeshContainer::Contains | ( | const VecArray & | figure | ) | const |
| void cMeshContainer::CorrectFaces | ( | int | beginRawBlockEtalon, |
| uni_hash< bool, int > * | fixed = NULL |
||
| ) |
Fixed a direction for every face by neighbours.
| beginRawBlockEtalon | Start of block for faces which was as etalon for "direction of all other face". |
| fixed | List of 'beginRawFigure' when already fixed. |
| void cMeshContainer::CorrectRawSequence | ( | ) |
Fixed the error (from Blender by import OBJ): "the same vertex of face used multiple times".
| StaticMesh* cMeshContainer::CreateHardsurfaceStaticMesh | ( | ) |
Create faceted mesh. Shader mpreview1 used.
| StaticMesh* cMeshContainer::CreateStaticMesh | ( | ) |
Creation for rendering.
Create mesh with smoothed normals. Shader mpreview1 used.
| StaticMesh* cMeshContainer::CreateStaticMeshMC | ( | ) |
Create mesh with smoothed normals and mcubes - like shader.
| StaticMesh* cMeshContainer::CreateStaticMeshUV | ( | ) |
Create mstatic mesh with UV, skypreview shader used.
| void cMeshContainer::DbgDrawMeshWithUVGrid | ( | ) |
use this function within __thumbnail(...) section to visualuse mesh with UV, seek "__thumbnail(test1)" as example.
| ::std::pair< cVec3, cVec3 > cMeshContainer::Divide | ( | int | a, |
| int | b, | ||
| float | tAB, | ||
| int | c, | ||
| int | d, | ||
| float | tCD, | ||
| int * | beginRemovedRawBlock = NULL, |
||
| int * | sizeRemovedRawBlock = NULL, |
||
| ::std::pair< int, int > * | changedBeginRawBlock = NULL |
||
| ) |
Divide a figure on two parts with declared line.
| withErase | True, when need delete a figure which divided. |
| a,b,c,d | Vertices of figure. |
| tAB,tCD | Neppers of new vertices on the edges ab and cd. |
When ab, cd are not of part of 1 (one!) figure, exception is throw.
| void cMeshContainer::Divide | ( | int | a, |
| int | b, | ||
| const cVec3 & | m, | ||
| int | c, | ||
| int | d, | ||
| const cVec3 & | n, | ||
| int * | beginRemovedRawBlock = NULL, |
||
| int * | sizeRemovedRawBlock = NULL, |
||
| ::std::pair< int, int > * | changedBeginRawBlock = NULL |
||
| ) |
| m | Point for insert between points ab. |
| n | Point for insert between points cd. |
| void cMeshContainer::DivideMesh | ( | MeshDivider< int > & | ) | const |
Divide the mesh on two meshes (harvest vertices).
| void cMeshContainer::DrawDbg | ( | const cMat4 & | T, |
| DWORD | Color, | ||
| DWORD | FillColor = 0, |
||
| DWORD | DetailColor = 0 |
||
| ) |
| void cMeshContainer::Erase | ( | int | beginRawFigure, |
| bool | withOptimize = false |
||
| ) |
| void cMeshContainer::EraseByCount | ( | int | n | ) |
Remove raw-blocks which a count of vertices is equal n.
| void cMeshContainer::EraseByCount | ( | int | a, |
| int | b | ||
| ) |
Remove raw-blocks which a count of vertices in the diapason [a; b].
| void cMeshContainer::EraseClearConfluent | ( | float | tolerance | ) |
Remove figures which all vertices are confluent to line.
| void cMeshContainer::EraseClearConfluentByIndexOnly | ( | ) |
Verify only indices of vertices.
| int cMeshContainer::Find | ( | const VecArray & | figure | ) | const |
| cList< int > cMeshContainer::FindClearConfluent | ( | float | tolerance | ) | const |
| tolerance | Value at angle for include a figure. |
| bool cMeshContainer::FlipEdge | ( | int | V1, |
| int | V2, | ||
| int * | valence = NULL |
||
| ) |
flip edge, requires fone, requires 2 faces over the edge.
| cVec3 cMeshContainer::GetFaceCoord | ( | int | pos | ) | const |
| cVec3 cMeshContainer::GetFaceNormalByNubmer | ( | int | indx | ) |
Max indx can Get by GetPolyCount() see GetFaceNormal(int pos)
| cList< int > cMeshContainer::GetNeighboursForFace | ( | int | beginRawFigure, |
| cVec3 * | avgNormal = NULL, |
||
| cVec3 * | avgCenter = NULL |
||
| ) | const |
| const cVec3& cMeshContainer::GetNormal | ( | int | vertex | ) | const |
|
inline |
| const cVec3& cMeshContainer::GetPosition | ( | int | vertex | ) | const |
First vertex of mesh is 0.
| int cMeshContainer::GetVertex | ( | const cVec3 & | ) | const |
| int cMeshContainer::Insert | ( | int | a, |
| int | b, | ||
| float | t, | ||
| cList< int > * | beginRawFigures = NULL, |
||
| cList< int > * | beginRawForRemoved = NULL |
||
| ) |
Insert vertext on the line 'ab' (as verticies).
| t | Distance on the line as a nepper. [ 0.0 (a) .. 0.5 (half of length 'ab') .. 1.0 (b) ] |
| beginRawFigure | Starts of blocks when point or figure was inserted. |
| beginRawForRemoved | Starts of blocks which clear confluented. |
| int cMeshContainer::Insert | ( | int | a, |
| int | b, | ||
| const cVec3 & | m, | ||
| cList< int > * | beginRawFigures = NULL, |
||
| cList< int > * | beginRawForRemoved = NULL |
||
| ) |
| m | Point for insert between points ab. |
| void cMeshContainer::Insert | ( | const figureI_t & | , |
| int * | beginRawFigure = NULL |
||
| ) |
Insert a figure (index of verticies) into the mesh.
| figureI_t cMeshContainer::Insert | ( | int | a, |
| int * | beginRawFigure = NULL |
||
| ) |
Insert a point.
| figureI_t cMeshContainer::Insert | ( | int | a, |
| int | b, | ||
| int * | beginRawFigure = NULL |
||
| ) |
Insert a line.
| figureI_t cMeshContainer::Insert | ( | int | a, |
| int | b, | ||
| int | c, | ||
| int * | beginRawFigure = NULL |
||
| ) |
Insert a triangle.
| figureI_t cMeshContainer::Insert | ( | int | a, |
| int | b, | ||
| int | c, | ||
| int | d, | ||
| int * | beginRawFigure = NULL |
||
| ) |
Insert a polygon with 4 vertices.
| void cMeshContainer::Insert | ( | const figures_t & | , |
| float | fusionDistance = -FLT_MAX |
||
| ) |
Insert a set of figures (positions of verticies) into the mesh.
| fusionDistance | Call MergeFaces() when this param is positive or zero. |
| void cMeshContainer::Insert | ( | const figure_t & | , |
| figureI_t * | = NULL |
||
| ) |
Insert a figure (positions of verticies) into the mesh.
Added coords are not containes dublicates.
Use MergeFaces() for fixed faces after insert positions.
| figureI_t | Accumulte indices of vertices when defined. |
| ai,bi,... | By analogy of 'figureI_t'. |
| figure_t cMeshContainer::Insert | ( | const cVec3 & | a, |
| int * | ai = NULL |
||
| ) |
Insert a point.
| figure_t cMeshContainer::Insert | ( | const cVec3 & | a, |
| const cVec3 & | b, | ||
| int * | ai = NULL, |
||
| int * | bi = NULL |
||
| ) |
Insert a line.
| figure_t cMeshContainer::Insert | ( | const cVec3 & | a, |
| const cVec3 & | b, | ||
| const cVec3 & | c, | ||
| int * | ai = NULL, |
||
| int * | bi = NULL, |
||
| int * | ci = NULL |
||
| ) |
Insert a triangle.
| figure_t cMeshContainer::Insert | ( | const cVec3 & | a, |
| const cVec3 & | b, | ||
| const cVec3 & | c, | ||
| const cVec3 & | d, | ||
| int * | ai = NULL, |
||
| int * | bi = NULL, |
||
| int * | ci = NULL, |
||
| int * | di = NULL |
||
| ) |
Insert a polygon with 4 vertices.
| void cMeshContainer::Insert | ( | const cMeshContainer & | ) |
Insert a mesh to this mesh.
Vertices are not dublicate.
| void cMeshContainer::Invert | ( | int | beginRawFigure | ) |
Invert a figure.
| void cMeshContainer::InvertRaw | ( | ) |
| bool cMeshContainer::IsClearConfluent | ( | const figure_t & | , |
| float | tolerance | ||
| ) | const |
| tolerance | Value at angle for detect figure as confluent to line. |
| bool cMeshContainer::IsClearConfluentByIndexOnly | ( | int | beginRawFigure | ) | const |
Verify only indices of vertices.
| bool cMeshContainer::IsClockwiseOrder | ( | int | beginRawFigure, |
| const cVec3 & | observer | ||
| ) | const |
true when line / face is clockwise order.false when 'beginRawFigure' aim to point. | bool cMeshContainer::IsValid | ( | const bool | ShowWarning = false | ) | const |
ShowWarning to configure of project or set always true when a debug-mode. | bool cMeshContainer::IsValidRawSequence | ( | ) | const |
Verify the error (from Blender by import OBJ): "the same vertex of face used multiple times".
| void cMeshContainer::MergeFaces | ( | float | fusionDistance | ) |
Merge faces of mesh which side by side.
| fusionDistance | Distance between vertex and edge when initiate a merge. |
| bool cMeshContainer::OptimizeTriangularMesh | ( | ) |
tries to set valence 6 whenever possible unsing edge-flip
| bool cMeshContainer::PerformBooleanOp | ( | cMeshContainer & | src1, |
| cMeshContainer & | src2, | ||
| int | operation, | ||
| cList< ::std::pair< comms::cVec3, comms::cVec3 > > * | dividers = NULL |
||
| ) |
Build mesh from 'src1' and 'src2' to 'this'.
| operation | Variants:
|
returns (xyz = nearest_edge_point_pos,w = distance_from_the_ray)
| void cMeshContainer::QuadQuantSubd | ( | const cMat4 & | M, |
| float | quant, | ||
| float | dotp, | ||
| ::std::function< int(int, int)> * | divider = nullptr |
||
| ) |
Try to divide all quads in approx equal sub-quads.
| void cMeshContainer::TriSubd | ( | int | N, |
| SubdSnapEdgeCallback * | dive = NULL, |
||
| SubdSnapMiddlePointCallback * | divm = NULL, |
||
| void * | context = NULL |
||
| ) |
Divide triangular mesh on N^2 triangles.
|
protected |
Polygon info or 3 references to the arrays of positions, texture coordinates, and normals with tangents (optional) respectively.
|
protected |
RGB - specular color, A - glossness.