File: SimpleMesh.h

package info (click to toggle)
cloudcompare 2.11.3-7.1
  • links: PTS
  • area: main
  • in suites: bookworm
  • size: 58,224 kB
  • sloc: cpp: 229,982; ansic: 30,723; makefile: 84; sh: 20
file content (120 lines) | stat: -rw-r--r-- 4,520 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
//##########################################################################
//#                                                                        #
//#                               CCLIB                                    #
//#                                                                        #
//#  This program is free software; you can redistribute it and/or modify  #
//#  it under the terms of the GNU Library General Public License as       #
//#  published by the Free Software Foundation; version 2 or later of the  #
//#  License.                                                              #
//#                                                                        #
//#  This program is distributed in the hope that it will be useful,       #
//#  but WITHOUT ANY WARRANTY; without even the implied warranty of        #
//#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the          #
//#  GNU General Public License for more details.                          #
//#                                                                        #
//#          COPYRIGHT: EDF R&D / TELECOM ParisTech (ENST-TSI)             #
//#                                                                        #
//##########################################################################

#ifndef SIMPLE_MESH_HEADER
#define SIMPLE_MESH_HEADER

//Local
#include "BoundingBox.h"
#include "GenericIndexedMesh.h"
#include "SimpleTriangle.h"

//System
#include <vector>

namespace CCLib
{

class GenericIndexedCloud;

//! A simple mesh structure, with index-based vertex access
/** Implements the GenericIndexedMesh interface. This mesh is always associated
	to a (index based) point cloud that stores the mesh vertexes.
**/
class CC_CORE_LIB_API SimpleMesh : public GenericIndexedMesh
{
public: //constructors

	//! SimpleMesh Constructor
	/** \param _theVertices the point cloud containing the vertices
		\param linkVerticesWithMesh specifies if the vertex cloud should be deleted when the SimpleMesh object is destructed
	**/
	SimpleMesh(GenericIndexedCloud* _theVertices, bool linkVerticesWithMesh = false);

	//! SimpleMesh destructor
	~SimpleMesh() override;

public: //inherited methods

	void forEach(genericTriangleAction action) override;
	void placeIteratorAtBeginning() override;
	GenericTriangle* _getNextTriangle() override; //temporary
	GenericTriangle* _getTriangle(unsigned triangleIndex) override; //temporary
	VerticesIndexes* getNextTriangleVertIndexes() override;
	VerticesIndexes* getTriangleVertIndexes(unsigned triangleIndex) override;
	unsigned size() const override { return static_cast<unsigned>(m_triIndexes.size()); }
	void getBoundingBox(CCVector3& bbMin, CCVector3& bbMax) override;
	void getTriangleVertices(unsigned triangleIndex, CCVector3& A, CCVector3& B, CCVector3& C) const override;

public: //specific methods

	//! Returns the mesh capacity
	inline unsigned capacity() const { return static_cast<unsigned>(m_triIndexes.capacity()); }

	//! Returns the vertices
	inline const GenericIndexedCloud* vertices() const { return theVertices; }

	//! Clears the mesh
	inline void clear() { m_triIndexes.resize(0); }

	//! Adds a triangle to the mesh
	/** Vertex indexes are expresesed relatively to the vertex cloud.
		\param i1 first vertex index
		\param i2 second vertex index
		\param i3 third vertex index
	**/
	virtual void addTriangle(unsigned i1, unsigned i2, unsigned i3);

	//! Reserves the memory to store the triangles (as 3 indexes each)
	/** \param n the number of triangles to reserve
		\return true if the method succeeds, false otherwise
	**/
	virtual bool reserve(unsigned n);

	//! Resizes the mesh database
	/** If the new number of elements is smaller than the actual size,
		the overflooding elements will be deleted.
		\param n the new number of triangles
		\return true if the method succeeds, false otherwise
	**/
	virtual bool resize(unsigned n);

protected:

	//! A triangle vertices indexes container
	using TriangleIndexesContainer = std::vector<VerticesIndexes>;
	//! The triangles indexes
	TriangleIndexesContainer m_triIndexes;

	//! Iterator on the list of triangles
	unsigned globalIterator;
	//! Dump triangle structure to transmit temporary data
	SimpleTriangle dummyTriangle;

	//! The associated point cloud (vertices)
	GenericIndexedCloud* theVertices;
	//! Specifies if the associated cloud should be deleted when the mesh is deleted
	bool verticesLinked;

	//! Bounding-box
	BoundingBox m_bbox;
};

}

#endif //SIMPLE_MESH_HEADER