58 void (*update_cb)(
void *,
float progress,
int *cancel),
68 field.flag_preserve_sharp = 1;
71 field.flag_preserve_boundary = 1;
74 field.flag_adaptive_scale = 1;
77 field.flag_minimum_cost_flow = 1;
80 field.flag_aggresive_sat = 1;
83 field.hierarchy.rng_seed = qrd->
rng_seed;
91 std::vector<Vector3d> positions;
93 std::vector<ObjVertex> vertices;
95 for (
int i = 0; i < qrd->
totverts; i++) {
97 positions.push_back(
v);
100 for (
int q = 0; q < qrd->
totfaces; q++) {
101 Vector3i f(qrd->
faces[q * 3], qrd->
faces[q * 3 + 1], qrd->
faces[q * 3 + 2]);
110 for (
int i = 0; i < nVertices; ++i) {
112 VertexMap::const_iterator it = vertexMap.find(
v);
113 if (it == vertexMap.end()) {
114 vertexMap[
v] = (
uint32_t)vertices.size();
115 indices.push_back((
uint32_t)vertices.size());
116 vertices.push_back(
v);
119 indices.push_back(it->second);
124 field.F.resize(3, indices.size() / 3);
125 memcpy(field.F.data(), indices.data(),
sizeof(
uint32_t) * indices.size());
127 field.V.resize(3, vertices.size());
128 for (
uint32_t i = 0; i < vertices.size(); ++i) {
129 field.V.col(i) = positions.at(vertices[i].p);
137 field.NormalizeMesh();
138 field.Initialize(faces);
145 if (field.flag_preserve_boundary) {
146 Hierarchy &mRes = field.hierarchy;
147 mRes.clearConstraints();
148 for (
uint32_t i = 0; i < 3 * mRes.mF.cols(); ++i) {
149 if (mRes.mE2E[i] == -1) {
150 uint32_t i0 = mRes.mF(i % 3, i / 3);
151 uint32_t i1 = mRes.mF((i + 1) % 3, i / 3);
152 Vector3d p0 = mRes.mV[0].col(i0), p1 = mRes.mV[0].col(i1);
153 Vector3d edge = p1 - p0;
154 if (edge.squaredNorm() > 0) {
156 mRes.mCO[0].col(i0) = p0;
157 mRes.mCO[0].col(i1) = p1;
158 mRes.mCQ[0].col(i0) = mRes.mCQ[0].col(i1) = edge;
159 mRes.mCQw[0][i0] = mRes.mCQw[0][i1] = mRes.mCOw[0][i0] = mRes.mCOw[0][i1] = 1.0;
163 mRes.propagateConstraints();
167 Optimizer::optimize_orientations(field.hierarchy);
168 field.ComputeOrientationSingularities();
174 if (field.flag_adaptive_scale == 1) {
175 field.EstimateSlope();
182 Optimizer::optimize_scale(field.hierarchy, field.rho, field.flag_adaptive_scale);
183 field.flag_adaptive_scale = 1;
185 Optimizer::optimize_positions(field.hierarchy, field.flag_adaptive_scale);
187 field.ComputePositionSingularities();
194 field.ComputeIndexMap();
208 auto t = field.O_compact[i] * field.normalize_scale + field.normalize_offset;
215 qrd->
out_faces[i * 4] = field.F_compact[i][0];
216 qrd->
out_faces[i * 4 + 1] = field.F_compact[i][1];
217 qrd->
out_faces[i * 4 + 2] = field.F_compact[i][2];
218 qrd->
out_faces[i * 4 + 3] = field.F_compact[i][3];