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.