Blender V4.3
dualcon_c_api.cpp
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include "ModelReader.h"
6#include "dualcon.h"
7#include "octree.h"
8#include <cassert>
9
10#include <cstdio>
11#include <float.h>
12
13#if defined(_WIN32)
14# define isnan(n) _isnan(n)
15#endif
16
17static void veccopy(float dst[3], const float src[3])
18{
19 dst[0] = src[0];
20 dst[1] = src[1];
21 dst[2] = src[2];
22}
23
24#define GET_TRI(_mesh, _n) \
25 (*(DualConTri)(((char *)(_mesh)->corner_tris) + ((_n) * (_mesh)->tri_stride)))
26
27#define GET_CO(_mesh, _n) (*(DualConCo)(((char *)(_mesh)->co) + ((_n) * (_mesh)->co_stride)))
28
29#define GET_LOOP(_mesh, _n) \
30 (*(DualConLoop)(((char *)(_mesh)->mloop) + ((_n) * (_mesh)->loop_stride)))
31
33 private:
34 const DualConInput *input_mesh;
35 int tottri, curtri;
36 float min[3], max[3], maxsize;
37 float scale;
38
39 public:
40 DualConInputReader(const DualConInput *mesh, float _scale) : input_mesh(mesh), scale(_scale)
41 {
42 reset();
43 }
44
45 void reset()
46 {
47 curtri = 0;
48 maxsize = 0;
49 tottri = input_mesh->tottri;
50
51 veccopy(min, input_mesh->min);
52 veccopy(max, input_mesh->max);
53
54 /* initialize maxsize */
55 for (int i = 0; i < 3; i++) {
56 float d = max[i] - min[i];
57 if (d > maxsize) {
58 maxsize = d;
59 }
60 }
61
62 /* redo the bounds */
63 for (int i = 0; i < 3; i++) {
64 min[i] = (max[i] + min[i]) / 2 - maxsize / 2;
65 max[i] = (max[i] + min[i]) / 2 + maxsize / 2;
66 }
67
68 for (int i = 0; i < 3; i++) {
69 min[i] -= maxsize * (1 / scale - 1) / 2;
70 }
71 maxsize *= 1 / scale;
72 }
73
75 {
76 if (curtri == input_mesh->tottri) {
77 return NULL;
78 }
79
80 Triangle *t = new Triangle();
81
82 const unsigned int *tr = GET_TRI(input_mesh, curtri);
83 veccopy(t->vt[0], GET_CO(input_mesh, GET_LOOP(input_mesh, tr[0])));
84 veccopy(t->vt[1], GET_CO(input_mesh, GET_LOOP(input_mesh, tr[1])));
85 veccopy(t->vt[2], GET_CO(input_mesh, GET_LOOP(input_mesh, tr[2])));
86
87 curtri++;
88
89 /* remove triangle if it contains invalid coords */
90 for (int i = 0; i < 3; i++) {
91 const float *co = t->vt[i];
92 if (isnan(co[0]) || isnan(co[1]) || isnan(co[2])) {
93 delete t;
94 return getNextTriangle();
95 }
96 }
97
98 return t;
99 }
100
101 int getNextTriangle(int t[3])
102 {
103 if (curtri == input_mesh->tottri) {
104 return 0;
105 }
106
107 const unsigned int *tr = GET_TRI(input_mesh, curtri);
108 t[0] = tr[0];
109 t[1] = tr[1];
110 t[2] = tr[2];
111
112 curtri++;
113
114 return 1;
115 }
116
118 {
119 return tottri;
120 }
121
123 {
124 return input_mesh->totco;
125 }
126
127 float getBoundingBox(float origin[3])
128 {
129 veccopy(origin, min);
130 return maxsize;
131 }
132
133 /* output */
134 void getNextVertex(float /*v*/[3])
135 {
136 /* not used */
137 }
138
139 /* stubs */
140 void printInfo() {}
142 {
143 return sizeof(DualConInputReader);
144 }
145
146#ifdef WITH_CXX_GUARDEDALLOC
147 MEM_CXX_CLASS_ALLOC_FUNCS("DUALCON:DualConInputReader")
148#endif
149};
150
151void *dualcon(const DualConInput *input_mesh,
152 /* callbacks for output */
153 DualConAllocOutput alloc_output,
154 DualConAddVert add_vert,
155 DualConAddQuad add_quad,
156
157 DualConFlags flags,
158 DualConMode mode,
159 float threshold,
160 float hermite_num,
161 float scale,
162 int depth)
163{
164 DualConInputReader r(input_mesh, scale);
165 Octree o(&r, alloc_output, add_vert, add_quad, flags, mode, depth, threshold, hermite_num);
166 o.scanConvert();
167 return o.getOutputMesh();
168}
int getNumVertices()
For explicit vertex models.
void reset()
Reset file reading location.
int getMemory()
Get storage size.
int getNextTriangle(int t[3])
DualConInputReader(const DualConInput *mesh, float _scale)
int getNumTriangles()
Get number of triangles.
void getNextVertex(float[3])
Triangle * getNextTriangle()
Get next triangle.
float getBoundingBox(float origin[3])
Get bounding box.
void * getOutputMesh()
Definition octree.h:282
void scanConvert()
Definition octree.cpp:99
#define NULL
DualConMode
Definition dualcon.h:49
void(* DualConAddQuad)(void *output, const int vert_indices[4])
Definition dualcon.h:43
void(* DualConAddVert)(void *output, const float co[3])
Definition dualcon.h:41
void *(* DualConAllocOutput)(int totvert, int totquad)
Definition dualcon.h:39
DualConFlags
Definition dualcon.h:45
void * dualcon(const DualConInput *input_mesh, DualConAllocOutput alloc_output, DualConAddVert add_vert, DualConAddQuad add_quad, DualConFlags flags, DualConMode mode, float threshold, float hermite_num, float scale, int depth)
static void veccopy(float dst[3], const float src[3])
#define GET_LOOP(_mesh, _n)
#define GET_CO(_mesh, _n)
#define GET_TRI(_mesh, _n)
#define min(a, b)
Definition sort.c:32
float min[3]
Definition dualcon.h:35
float max[3]
Definition dualcon.h:35
float vt[3][3]
Definition GeoCommon.h:31