File: ccGenericPrimitive.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 (140 lines) | stat: -rw-r--r-- 5,278 bytes parent folder | download
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
//##########################################################################
//#                                                                        #
//#                              CLOUDCOMPARE                              #
//#                                                                        #
//#  This program is free software; you can redistribute it and/or modify  #
//#  it under the terms of the GNU 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 CC_GENERIC_PRIMITIVE_HEADER
#define CC_GENERIC_PRIMITIVE_HEADER

//Local
#include "ccMesh.h"

class ccPointCloud;

//! Generic primitive interface
class QCC_DB_LIB_API ccGenericPrimitive : public ccMesh
{
public:

	//! Default constructor
	/** Warning: the associated transformation is purely for display purpose by default.
		Use 'ccHObject::applyGLTransformation_recursive' to 'apply' it to the mesh).
		\param name name
		\param transMat optional 3D transformation applied to the primitive vertices (can be set afterwards with ccDrawableObject::setGLTransformation + ccDrawableObject::applyGLTransformation_recursive)
		\param uniqueID unique ID (handle with care)
	**/
	ccGenericPrimitive(	QString name = QString(),
						const ccGLMatrix* transMat = nullptr,
						unsigned uniqueID = ccUniqueIDGenerator::InvalidUniqueID);

	//! Returns type name (sphere, cylinder, etc.)
	virtual QString getTypeName() const = 0;

	//! Clones primitive
	virtual ccGenericPrimitive* clone() const = 0;

	//! Returns class ID
	inline CC_CLASS_ENUM getClassID() const override { return CC_TYPES::PRIMITIVE; }

	//! Sets primitive color (shortcut)
	/** \param col rgb color
	**/
	virtual void setColor(const ccColor::Rgb& col);

	//! Add operator
	/** Warning: simply copies the input primitive vertices/triangles to this primitive mesh!
	**/
	const ccGenericPrimitive& operator += (const ccGenericPrimitive& prim);

	//! Whether drawing is dependent on 'precision' parameter
	virtual inline bool hasDrawingPrecision() const { return false; }

	//! Minimum drawing precision
	/** \warning Never pass a 'constant initializer' by reference
	**/
	static const int MIN_DRAWING_PRECISION = 4;

	//! Sets drawing precision
	/** Warnings:
		- steps should always be >= ccGenericPrimitive::MIN_DRAWING_PRECISION
		- changes primitive content (calls ccGenericPrimitive::updateRepresentation)
		- may fail if not enough memory!
		\param steps drawing precision
		\return success (false if not enough memory)
	**/
	virtual bool setDrawingPrecision(unsigned steps);

	//! Returns drawing precision (or 0 if feature is not supported)
	virtual inline unsigned getDrawingPrecision() const { return m_drawPrecision; }

	//! Returns the transformation that is currently applied to the vertices
	virtual inline ccGLMatrix& getTransformation() { return m_transformation; }

	//! Returns the transformation that is currently applied to the vertices (const version)
	virtual inline const ccGLMatrix& getTransformation() const { return m_transformation; }

	//inherited methods (ccHObject)
	const ccGLMatrix& getGLTransformationHistory() const override;

protected:

	//! Inherited from ccGenericMesh
	void applyGLTransformation(const ccGLMatrix& trans) override;

	//inherited from ccMesh
	bool toFile_MeOnly(QFile& out) const override;
	bool fromFile_MeOnly(QFile& in, short dataVersion, int flags, LoadedIDMap& oldToNewIDMap) override;

	//! Builds primitive
	/** Transformation will be applied afterwards!
		\return success
	**/
	virtual bool buildUp() = 0;

	//! Updates internal representation (as a mesh)
	/** Calls buildUp then applyTransformationToVertices.
		\return success of buildUp
	**/
	virtual bool updateRepresentation();

	//! Inits internal structures
	/** Warning: resets all!
	**/
	bool init(unsigned vertCount, bool vertNormals, unsigned faceCount, unsigned faceNormCount);

	//! Applies associated transformation to vertices
	/** Should be called only when (re)constructing primitive!
	**/
	void applyTransformationToVertices();

	//! Finished 'clone' job (vertices color, etc.)
	/** \param primitive primitive to 'pimp'
		\return pimped primitive
	**/
	ccGenericPrimitive* finishCloneJob(ccGenericPrimitive* primitive) const;

	//! Returns vertices
	ccPointCloud* vertices();

	//! Associated transformation (applied to vertices)
	/** Different from ccDrawableObject::m_glTrans!
	**/
	ccGLMatrix m_transformation;

	//! Drawing precision (for primitives that support this feature)
	unsigned m_drawPrecision;
};

#endif //CC_GENERIC_PRIMITIVE_HEADER