1 | /*
|
---|
2 | Copyright (C) 2005-2006 Feeling Software Inc.
|
---|
3 | MIT License: http://www.opensource.org/licenses/mit-license.php
|
---|
4 | */
|
---|
5 | /*
|
---|
6 | Based on the FS Import classes:
|
---|
7 | Copyright (C) 2005-2006 Feeling Software Inc
|
---|
8 | Copyright (C) 2005-2006 Autodesk Media Entertainment
|
---|
9 | MIT License: http://www.opensource.org/licenses/mit-license.php
|
---|
10 | */
|
---|
11 |
|
---|
12 | /**
|
---|
13 | @file FCDGeometryMesh.h
|
---|
14 | This file contains the FCDGeometryMesh class.
|
---|
15 | */
|
---|
16 |
|
---|
17 | #ifndef _FCD_GEOMETRY_MESH_H_
|
---|
18 | #define _FCD_GEOMETRY_MESH_H_
|
---|
19 |
|
---|
20 | #include "FCDocument/FCDObject.h"
|
---|
21 | #include "FUtils/FUDaeEnum.h"
|
---|
22 |
|
---|
23 | class FCDocument;
|
---|
24 | class FCDGeometry;
|
---|
25 | class FCDGeometryPolygons;
|
---|
26 | class FCDGeometrySource;
|
---|
27 |
|
---|
28 | /** A dynamically-sized array of FCDGeometrySource objects. */
|
---|
29 | typedef vector<FCDGeometrySource*> FCDGeometrySourceList;
|
---|
30 | /** A dynamically-sized array of FCDGeometryPolygons objects. */
|
---|
31 | typedef vector<FCDGeometryPolygons*> FCDGeometryPolygonsList;
|
---|
32 |
|
---|
33 | /**
|
---|
34 | A COLLADA geometric mesh.
|
---|
35 | A COLLADA geometric mesh is a list of vertices tied together in polygons.
|
---|
36 | A set of per-vertex data is used to determine the vertices of the mesh.
|
---|
37 | This data usually includes a single list: of vertex positions, but it may also
|
---|
38 | contain per-vertex colors, per-vertex normals or per-vertex texture coordinates.
|
---|
39 | The other data sources declare per-vertex-face data.
|
---|
40 |
|
---|
41 | The faces of a mesh may be split across different groups, as they may have
|
---|
42 | different materials assigned to them. The FCDGeometryPolygons objects contains one such group
|
---|
43 | of faces.
|
---|
44 |
|
---|
45 | @ingroup FCDGeometry
|
---|
46 | */
|
---|
47 | class FCOLLADA_EXPORT FCDGeometryMesh : public FCDObject
|
---|
48 | {
|
---|
49 | private:
|
---|
50 | DeclareObjectType;
|
---|
51 |
|
---|
52 | FCDGeometry* parent;
|
---|
53 | FCDGeometrySourceList sources;
|
---|
54 | FCDGeometryPolygonsList polygons;
|
---|
55 |
|
---|
56 | FCDGeometrySourceList vertexSources;
|
---|
57 | size_t faceCount, holeCount;
|
---|
58 | size_t faceVertexCount;
|
---|
59 | bool isDoubleSided; // Maya-specific, defaults to true
|
---|
60 |
|
---|
61 | public:
|
---|
62 | /** Contructor: do not use directly. Use FCDGeometry::AddMesh instead.
|
---|
63 | @param document The COLLADA document which owns this mesh.
|
---|
64 | @param parent The geometry entity which contains this mesh. */
|
---|
65 | FCDGeometryMesh(FCDocument* document, FCDGeometry* parent);
|
---|
66 |
|
---|
67 | /** Destructor: do not use directly. All geometric meshes are released with the geometry that they belong to. */
|
---|
68 | virtual ~FCDGeometryMesh();
|
---|
69 |
|
---|
70 | /** Retrieves the number of faces within the geometric mesh.
|
---|
71 | @return The number of faces within the geometric mesh. */
|
---|
72 | inline size_t GetFaceCount() const { return faceCount; }
|
---|
73 |
|
---|
74 | /** Retrieves the number of holes within the faces of the geometric mesh.
|
---|
75 | As one face may contain multiple holes, this value may be larger than the number of faces.
|
---|
76 | @return The number of holes within the faces of the geometric mesh. */
|
---|
77 | inline size_t GetHoleCount() const { return holeCount; }
|
---|
78 |
|
---|
79 | /** Retrieves the total number of per-face vertices in the mesh.
|
---|
80 | This function makes no assumption about the uniqueness of the per-face vertices.
|
---|
81 | @return The total number of per-face vertices in the mesh. */
|
---|
82 | inline size_t GetFaceVertexCount() const { return faceVertexCount; }
|
---|
83 |
|
---|
84 | /** Retrieves whether the mesh should be treated as double-sided.
|
---|
85 | This flag does not belong to COLLADA but is exported at the geometric-level by ColladaMaya.
|
---|
86 | @return Whether the mesh is double-sided. */
|
---|
87 | inline bool IsDoubleSided() const { return isDoubleSided; }
|
---|
88 |
|
---|
89 | /** Retrieves the COLLADA id of the mesh.
|
---|
90 | This is a shortcut to the parent geometry's COLLADA id.
|
---|
91 | @return The COLLADA id of the mesh. */
|
---|
92 | const string& GetDaeId() const;
|
---|
93 |
|
---|
94 | /** Retrieves the number of independent polygon groups.
|
---|
95 | Each polygon group is represented within a FCDGeometryPolygons object.
|
---|
96 | An independent polygon group is usually created to assign a different material to different parts of the mesh
|
---|
97 | or to assign partial texture coordinates and texture tangents to different parts of the mesh.
|
---|
98 | @return The number of independent polygon groups. */
|
---|
99 | inline size_t GetPolygonsCount() const { return polygons.size(); }
|
---|
100 |
|
---|
101 | /** Retrieves a specific polygon group.
|
---|
102 | Each polygon group is represented within a FCDGeometryPolygons object.
|
---|
103 | An independent polygon group is usually created to assign a different material to different parts of the mesh
|
---|
104 | or to assign partial texture coordinates and texture tangents to different parts of the mesh.
|
---|
105 | @param index The index of the polygon group. This index should be less than the number
|
---|
106 | of independent polygon groups returned by the GetPolygonsCount function.
|
---|
107 | @return The polygon group. This pointer will be NULL if the index is out-of-bounds. */
|
---|
108 | inline FCDGeometryPolygons* GetPolygons(size_t index) { FUAssert(index < GetPolygonsCount(), return NULL); return polygons.at(index); }
|
---|
109 | inline const FCDGeometryPolygons* GetPolygons(size_t index) const { FUAssert(index < GetPolygonsCount(), return NULL); return polygons.at(index); } /**< See above. */
|
---|
110 |
|
---|
111 | /** Creates a new polygon group.
|
---|
112 | Each polygon group is represented within a FCDGeometryPolygons object.
|
---|
113 | The new polygon group will be assigned all the existing per-vertex data sources.
|
---|
114 | No material will be assigned to the new polygon group.
|
---|
115 | @return The new polygon group. This pointer should never be NULL. */
|
---|
116 | FCDGeometryPolygons* AddPolygons();
|
---|
117 |
|
---|
118 | /** [INTERNAL] Retrieves the list of per-vertex data sources.
|
---|
119 | There should usually be one per-vertex data source that contains positions.
|
---|
120 | All the sources within this list are also present within the data source list.
|
---|
121 | @return The list of per-vertex data sources. */
|
---|
122 | inline FCDGeometrySourceList& GetVertexSources() { return vertexSources; }
|
---|
123 | inline const FCDGeometrySourceList& GetVertexSources() const { return vertexSources; } /**< See above. */
|
---|
124 |
|
---|
125 | /** Retrieves the number of per-vertex data sources.
|
---|
126 | This number should always be lesser or equal to the number of data sources, as each per-vertex
|
---|
127 | data source is also included within the list of data sources.
|
---|
128 | @return The number of per-vertex data sources. */
|
---|
129 | inline size_t GetVertexSourceCount() const { return vertexSources.size(); }
|
---|
130 |
|
---|
131 | /** Retrieves a specific per-vertex data source.
|
---|
132 | All the per-vertex data sources are also included in the list of data sources.
|
---|
133 | @param index The index of the per-vertex data source. This index should be less than the number of
|
---|
134 | per-vertex data sources returns by the GetVertexSourceCount function.
|
---|
135 | @return The per-vertex data source. This pointer will be NULL if the index is out-of-bounds. */
|
---|
136 | inline FCDGeometrySource* GetVertexSource(size_t index) { FUAssert(index < GetVertexSourceCount(), return NULL); return vertexSources.at(index); }
|
---|
137 | inline const FCDGeometrySource* GetVertexSource(size_t index) const { FUAssert(index < GetVertexSourceCount(), return NULL); return vertexSources.at(index); } /**< See above. */
|
---|
138 |
|
---|
139 | /** Creates a new per-vertex data source for this geometric mesh.
|
---|
140 | The per-vertex data source will be added to both the per-vertex data source list and the data source list.
|
---|
141 | The new per-vertex data source will automatically be added to all the existing polygon groups.
|
---|
142 | @return The new per-vertex data source. This pointer should never be NULL. */
|
---|
143 | FCDGeometrySource* AddVertexSource();
|
---|
144 |
|
---|
145 | /** [INTERNAL] Retrieves the data source that matches the given COLLADA id.
|
---|
146 | @param id A valid COLLADA id.
|
---|
147 | @return The data source. This pointer will be NULL if no matching data source was found. */
|
---|
148 | FCDGeometrySource* FindSourceById(const string& id);
|
---|
149 | const FCDGeometrySource* FindSourceById(const string& id) const; /**< See above. */
|
---|
150 |
|
---|
151 | /** Retrieves the per-vertex data that specifically contains the vertex positions.
|
---|
152 | If there are more than one per-vertex data source that contains vertex positions, the first one is returned.
|
---|
153 | @return A per-vertex data source that contains vertex positions. This pointer will be NULL
|
---|
154 | in the unlikely possibility that there are no per-vertex data source that contains vertex positions. */
|
---|
155 | FCDGeometrySource* GetPositionSource();
|
---|
156 | const FCDGeometrySource* GetPositionSource() const; /**< See above. */
|
---|
157 |
|
---|
158 | /** Retrieves the number of data sources contained within this geometric mesh.
|
---|
159 | @return The number of data sources within the mesh. */
|
---|
160 | inline size_t GetSourceCount() const { return sources.size(); }
|
---|
161 |
|
---|
162 | /** Retrieves a specific data source.
|
---|
163 | @param index The index of the data source. This index should be less than the number of
|
---|
164 | data sources returns by the GetSourceCount function.
|
---|
165 | @return The data source. This pointer will be NULL if the index is out-of-bounds. */
|
---|
166 | inline FCDGeometrySource* GetSource(size_t index) { FUAssert(index < GetSourceCount(), return NULL); return sources.at(index); }
|
---|
167 | inline const FCDGeometrySource* GetSource(size_t index) const { FUAssert(index < GetSourceCount(), return NULL); return sources.at(index); } /**< See above. */
|
---|
168 |
|
---|
169 | /** Creates a new data source for this geometric mesh.
|
---|
170 | The new data source will not be added to any of the existing polygon groups.
|
---|
171 | @return The new per-vertex data source. This pointer should never be NULL. */
|
---|
172 | FCDGeometrySource* AddSource();
|
---|
173 |
|
---|
174 | /** Triangulates the mesh.
|
---|
175 | A simple fanning techique is currently used: holes will not be triangulated correctly. */
|
---|
176 | void Triangulate();
|
---|
177 |
|
---|
178 | /** [INTERNAL] Forces the recalculation of the hole count, vertex count, face-vertex counts and their offsets.
|
---|
179 | Since the counts and offsets are buffered at the geometric mesh object level, this function allows the polygon
|
---|
180 | groups to force the recalculation of the buffered values, when they are modified. */
|
---|
181 | void Recalculate();
|
---|
182 |
|
---|
183 | /** [INTERNAL] Creates a copy of this mesh. You may use the FCDGeometry::Clone function instead of this function.
|
---|
184 | Creates a full copy of the geometry, with the vertices overwritten
|
---|
185 | by the given data: this is used when importing COLLADA 1.3 skin controllers.
|
---|
186 | You will need to release the cloned entity.
|
---|
187 | @see FCDGeometry::Clone.
|
---|
188 | @param newPositions The list of vertex position that will
|
---|
189 | overwrite the current mesh vertex positions. This list may be empty.
|
---|
190 | @param newPositionsStride The stride, in bytes, of the newPositions list.
|
---|
191 | For an empty newPositions list, this value is discarded.
|
---|
192 | @param newNormals The list of vertex normals that will overwrite
|
---|
193 | the current mesh vertex normals. This list may be empty.
|
---|
194 | @param newNormalsStride The stride, in bytes, of the newNormals list.
|
---|
195 | For an empty newNormals list, this value is discarded.
|
---|
196 | @return The cloned geometry entity. You will need to release this pointer. */
|
---|
197 | FCDGeometryMesh* Clone(FloatList& newPositions, uint32 newPositionsStride, FloatList& newNormals, uint32 newNormalsStride);
|
---|
198 |
|
---|
199 | /** [INTERNAL] Reads in the \<mesh\> element from a given COLLADA XML tree node.
|
---|
200 | @param meshNode The COLLADA XML tree node.
|
---|
201 | @return The status of the import. If the status is not successful,
|
---|
202 | it may be dangerous to extract information from the geometric mesh.*/
|
---|
203 | FUStatus LoadFromXML(xmlNode* meshNode);
|
---|
204 |
|
---|
205 | /** [INTERNAL] Writes out the \<mesh\> element to the given COLLADA XML tree node.
|
---|
206 | @param parentNode The COLLADA XML parent node in which to insert the geometric mesh.
|
---|
207 | @return The created \<mesh\> element XML tree node. */
|
---|
208 | xmlNode* WriteToXML(xmlNode* parentNode) const;
|
---|
209 | };
|
---|
210 |
|
---|
211 | #endif // _FCD_GEOMETRY_MESH_H_
|
---|