Blender  V3.3
IndexedFaceSet.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
8 #include "IndexedFaceSet.h"
9 
10 namespace Freestyle {
11 
13 {
14  _Vertices = nullptr;
15  _Normals = nullptr;
16  _FrsMaterials = nullptr;
17  _TexCoords = nullptr;
18  _FaceEdgeMarks = nullptr;
19  _VSize = 0;
20  _NSize = 0;
21  _MSize = 0;
22  _TSize = 0;
23  _NumFaces = 0;
24  _NumVertexPerFace = nullptr;
25  _FaceStyle = nullptr;
26  _VIndices = nullptr;
27  _VISize = 0;
28  _NIndices = nullptr;
29  _NISize = 0;
30  _MIndices = nullptr;
31  _MISize = 0;
32  _TIndices = nullptr;
33  _TISize = 0;
34 }
35 
37  unsigned iVSize,
38  float *iNormals,
39  unsigned iNSize,
40  FrsMaterial **iMaterials,
41  unsigned iMSize,
42  float *iTexCoords,
43  unsigned iTSize,
44  unsigned iNumFaces,
45  unsigned *iNumVertexPerFace,
46  TRIANGLES_STYLE *iFaceStyle,
47  FaceEdgeMark *iFaceEdgeMarks,
48  unsigned *iVIndices,
49  unsigned iVISize,
50  unsigned *iNIndices,
51  unsigned iNISize,
52  unsigned *iMIndices,
53  unsigned iMISize,
54  unsigned *iTIndices,
55  unsigned iTISize,
56  unsigned iCopy)
57 {
58  if (1 == iCopy) {
59  _VSize = iVSize;
60  _Vertices = new float[_VSize];
61  memcpy(_Vertices, iVertices, iVSize * sizeof(float));
62 
63  _NSize = iNSize;
64  _Normals = new float[_NSize];
65  memcpy(_Normals, iNormals, iNSize * sizeof(float));
66 
67  _MSize = iMSize;
68  _FrsMaterials = nullptr;
69  if (iMaterials) {
71  for (unsigned int i = 0; i < _MSize; ++i) {
72  _FrsMaterials[i] = new FrsMaterial(*(iMaterials[i]));
73  }
74  }
75  _TSize = iTSize;
76  _TexCoords = nullptr;
77  if (_TSize) {
78  _TexCoords = new float[_TSize];
79  memcpy(_TexCoords, iTexCoords, iTSize * sizeof(float));
80  }
81 
82  _NumFaces = iNumFaces;
83  _NumVertexPerFace = new unsigned[_NumFaces];
84  memcpy(_NumVertexPerFace, iNumVertexPerFace, _NumFaces * sizeof(unsigned));
85 
87  memcpy(_FaceStyle, iFaceStyle, _NumFaces * sizeof(TRIANGLES_STYLE));
88 
90  memcpy(_FaceEdgeMarks, iFaceEdgeMarks, _NumFaces * sizeof(FaceEdgeMark));
91 
92  _VISize = iVISize;
93  _VIndices = new unsigned[_VISize];
94  memcpy(_VIndices, iVIndices, _VISize * sizeof(unsigned));
95 
96  _NISize = iNISize;
97  _NIndices = new unsigned[_NISize];
98  memcpy(_NIndices, iNIndices, _NISize * sizeof(unsigned));
99 
100  _MISize = iMISize;
101  _MIndices = nullptr;
102  if (iMIndices) {
103  _MIndices = new unsigned[_MISize];
104  memcpy(_MIndices, iMIndices, _MISize * sizeof(unsigned));
105  }
106  _TISize = iTISize;
107  _TIndices = nullptr;
108  if (_TISize) {
109  _TIndices = new unsigned[_TISize];
110  memcpy(_TIndices, iTIndices, _TISize * sizeof(unsigned));
111  }
112  }
113  else {
114  _VSize = iVSize;
115  _Vertices = iVertices;
116 
117  _NSize = iNSize;
118  _Normals = iNormals;
119 
120  _MSize = iMSize;
121  _FrsMaterials = nullptr;
122  if (iMaterials) {
123  _FrsMaterials = iMaterials;
124  }
125 
126  _TSize = iTSize;
127  _TexCoords = iTexCoords;
128 
129  _NumFaces = iNumFaces;
130  _NumVertexPerFace = iNumVertexPerFace;
131  _FaceStyle = iFaceStyle;
132  _FaceEdgeMarks = iFaceEdgeMarks;
133 
134  _VISize = iVISize;
135  _VIndices = iVIndices;
136 
137  _NISize = iNISize;
138  _NIndices = iNIndices;
139 
140  _MISize = iMISize;
141  _MIndices = nullptr;
142  if (iMISize) {
143  _MIndices = iMIndices;
144  }
145 
146  _TISize = iTISize;
147  _TIndices = iTIndices;
148  }
149 }
150 
152 {
153  _VSize = iBrother.vsize();
154  _Vertices = new float[_VSize];
155  memcpy(_Vertices, iBrother.vertices(), _VSize * sizeof(float));
156 
157  _NSize = iBrother.nsize();
158  _Normals = new float[_NSize];
159  memcpy(_Normals, iBrother.normals(), _NSize * sizeof(float));
160 
161  _MSize = iBrother.msize();
162  if (_MSize) {
164  for (unsigned int i = 0; i < _MSize; ++i) {
165  _FrsMaterials[i] = new FrsMaterial(*(iBrother._FrsMaterials[i]));
166  }
167  }
168  else {
169  _FrsMaterials = nullptr;
170  }
171 
172  _TSize = iBrother.tsize();
173  _TexCoords = nullptr;
174  if (_TSize) {
175  _TexCoords = new float[_TSize];
176  memcpy(_TexCoords, iBrother.texCoords(), _TSize * sizeof(float));
177  }
178 
179  _NumFaces = iBrother.numFaces();
180  _NumVertexPerFace = new unsigned[_NumFaces];
181  memcpy(_NumVertexPerFace, iBrother.numVertexPerFaces(), _NumFaces * sizeof(unsigned));
182 
184  memcpy(_FaceStyle, iBrother.trianglesStyle(), _NumFaces * sizeof(TRIANGLES_STYLE));
185 
187  memcpy(_FaceEdgeMarks, iBrother.faceEdgeMarks(), _NumFaces * sizeof(FaceEdgeMark));
188 
189  _VISize = iBrother.visize();
190  _VIndices = new unsigned[_VISize];
191  memcpy(_VIndices, iBrother.vindices(), _VISize * sizeof(unsigned));
192 
193  _NISize = iBrother.nisize();
194  _NIndices = new unsigned[_NISize];
195  memcpy(_NIndices, iBrother.nindices(), _NISize * sizeof(unsigned));
196 
197  _MISize = iBrother.misize();
198  if (_MISize) {
199  _MIndices = new unsigned[_MISize];
200  memcpy(_MIndices, iBrother.mindices(), _MISize * sizeof(unsigned));
201  }
202  else {
203  _MIndices = nullptr;
204  }
205 
206  _TISize = iBrother.tisize();
207  _TIndices = nullptr;
208  if (_TISize) {
209  _TIndices = new unsigned[_TISize];
210  memcpy(_TIndices, iBrother.tindices(), _TISize * sizeof(unsigned));
211  }
212 }
213 
215 {
216  if (nullptr != _Vertices) {
217  delete[] _Vertices;
218  _Vertices = nullptr;
219  }
220 
221  if (nullptr != _Normals) {
222  delete[] _Normals;
223  _Normals = nullptr;
224  }
225 
226  if (nullptr != _FrsMaterials) {
227  for (unsigned int i = 0; i < _MSize; ++i) {
228  delete _FrsMaterials[i];
229  }
230  delete[] _FrsMaterials;
231  _FrsMaterials = nullptr;
232  }
233 
234  if (nullptr != _TexCoords) {
235  delete[] _TexCoords;
236  _TexCoords = nullptr;
237  }
238 
239  if (nullptr != _NumVertexPerFace) {
240  delete[] _NumVertexPerFace;
241  _NumVertexPerFace = nullptr;
242  }
243 
244  if (nullptr != _FaceStyle) {
245  delete[] _FaceStyle;
246  _FaceStyle = nullptr;
247  }
248 
249  if (nullptr != _FaceEdgeMarks) {
250  delete[] _FaceEdgeMarks;
251  _FaceEdgeMarks = nullptr;
252  }
253 
254  if (nullptr != _VIndices) {
255  delete[] _VIndices;
256  _VIndices = nullptr;
257  }
258 
259  if (nullptr != _NIndices) {
260  delete[] _NIndices;
261  _NIndices = nullptr;
262  }
263 
264  if (nullptr != _MIndices) {
265  delete[] _MIndices;
266  _MIndices = nullptr;
267  }
268  if (nullptr != _TIndices) {
269  delete[] _TIndices;
270  _TIndices = nullptr;
271  }
272 }
273 
275 {
276  Rep::accept(v);
277  v.visitIndexedFaceSet(*this);
278 }
279 
281 {
282  float XMax = _Vertices[0];
283  float YMax = _Vertices[1];
284  float ZMax = _Vertices[2];
285 
286  float XMin = _Vertices[0];
287  float YMin = _Vertices[1];
288  float ZMin = _Vertices[2];
289 
290  // parse all the coordinates to find the Xmax, YMax, ZMax
291  float *v = _Vertices;
292 
293  for (unsigned int i = 0; i < (_VSize / 3); ++i) {
294  if (*v > XMax) {
295  XMax = *v;
296  }
297  if (*v < XMin) {
298  XMin = *v;
299  }
300  ++v;
301 
302  if (*v > YMax) {
303  YMax = *v;
304  }
305  if (*v < YMin) {
306  YMin = *v;
307  }
308  ++v;
309 
310  if (*v > ZMax) {
311  ZMax = *v;
312  }
313  if (*v < ZMin) {
314  ZMin = *v;
315  }
316  ++v;
317  }
318 
319  setBBox(BBox<Vec3f>(Vec3f(XMin, YMin, ZMin), Vec3f(XMax, YMax, ZMax)));
320 }
321 
322 } /* namespace Freestyle */
A Set of indexed faces to represent a surface object.
ATTR_WARN_UNUSED_RESULT const BMVert * v
virtual const unsigned nisize() const
virtual const unsigned * nindices() const
virtual const unsigned tisize() const
virtual const float * normals() const
virtual const unsigned vsize() const
virtual const float * texCoords() const
virtual const unsigned char * faceEdgeMarks() const
virtual void accept(SceneVisitor &v)
virtual const unsigned numFaces() const
virtual const unsigned * vindices() const
virtual const unsigned * mindices() const
virtual const unsigned tsize() const
FaceEdgeMark * _FaceEdgeMarks
FrsMaterial ** _FrsMaterials
virtual const unsigned * numVertexPerFaces() const
virtual const unsigned nsize() const
virtual const unsigned visize() const
virtual const unsigned * tindices() const
virtual const float * vertices() const
virtual const TRIANGLES_STYLE * trianglesStyle() const
virtual const unsigned misize() const
virtual const unsigned msize() const
TRIANGLES_STYLE * _FaceStyle
virtual void accept(SceneVisitor &v)
Definition: Rep.h:94
virtual void setBBox(const BBox< Vec3f > &iBox)
Definition: Rep.h:135
struct Vec3f Vec3f
inherits from class Rep
Definition: AppCanvas.cpp:18