55 void (*update_cb)(
void *,
float progress,
int *cancel),
65 field.flag_preserve_sharp = 1;
68 field.flag_preserve_boundary = 1;
71 field.flag_adaptive_scale = 1;
74 field.flag_minimum_cost_flow = 1;
77 field.flag_aggresive_sat = 1;
80 field.hierarchy.rng_seed = qrd->
rng_seed;
88 std::vector<Vector3d> positions;
90 std::vector<ObjVertex> vertices;
94 positions.push_back(
v);
97 for (
int q = 0; q < qrd->
totfaces; q++) {
98 Vector3i f(qrd->
faces[q * 3], qrd->
faces[q * 3 + 1], qrd->
faces[q * 3 + 2]);
107 for (
int i = 0;
i < nVertices; ++
i) {
109 VertexMap::const_iterator it = vertexMap.find(
v);
110 if (it == vertexMap.end()) {
111 vertexMap[
v] = (uint32_t)vertices.size();
112 indices.push_back((uint32_t)vertices.size());
113 vertices.push_back(
v);
121 field.F.resize(3,
indices.size() / 3);
122 memcpy(field.F.data(),
indices.data(),
sizeof(uint32_t) *
indices.size());
124 field.V.resize(3, vertices.size());
125 for (uint32_t
i = 0;
i < vertices.size(); ++
i) {
126 field.V.col(
i) = positions.at(vertices[
i].p);
134 field.NormalizeMesh();
135 field.Initialize(
faces);
142 if (field.flag_preserve_boundary) {
143 Hierarchy &mRes = field.hierarchy;
144 mRes.clearConstraints();
145 for (uint32_t
i = 0;
i < 3 * mRes.mF.cols(); ++
i) {
146 if (mRes.mE2E[
i] == -1) {
147 uint32_t i0 = mRes.mF(
i % 3,
i / 3);
148 uint32_t i1 = mRes.mF((
i + 1) % 3,
i / 3);
149 Vector3d p0 = mRes.mV[0].col(i0), p1 = mRes.mV[0].col(i1);
150 Vector3d edge = p1 - p0;
151 if (edge.squaredNorm() > 0) {
153 mRes.mCO[0].col(i0) = p0;
154 mRes.mCO[0].col(i1) = p1;
155 mRes.mCQ[0].col(i0) = mRes.mCQ[0].col(i1) = edge;
156 mRes.mCQw[0][i0] = mRes.mCQw[0][i1] = mRes.mCOw[0][i0] = mRes.mCOw[0][i1] = 1.0;
160 mRes.propagateConstraints();
164 Optimizer::optimize_orientations(field.hierarchy);
165 field.ComputeOrientationSingularities();
171 if (field.flag_adaptive_scale == 1) {
172 field.EstimateSlope();
179 Optimizer::optimize_scale(field.hierarchy, field.rho, field.flag_adaptive_scale);
180 field.flag_adaptive_scale = 1;
182 Optimizer::optimize_positions(field.hierarchy, field.flag_adaptive_scale);
184 field.ComputePositionSingularities();
191 if (!field.ComputeIndexMap()) {
208 auto t = field.O_compact[
i] * field.normalize_scale + field.normalize_offset;