123 lines
3.9 KiB
C++
123 lines
3.9 KiB
C++
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
#pragma once
|
|
|
|
#include "BLI_sys_types.h" /* for intptr_t support */
|
|
|
|
/** \file
|
|
* \ingroup geo
|
|
*/
|
|
|
|
namespace blender::geometry {
|
|
|
|
struct ParamHandle; /* Handle to an array of charts. */
|
|
using ParamKey = uintptr_t; /* Key (hash) for identifying verts and faces. */
|
|
#define PARAM_KEY_MAX UINTPTR_MAX
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/** \name Chart Construction:
|
|
*
|
|
* Faces and seams may only be added between #geometry::uv_parametrizer_construct_begin and
|
|
* #geometry::uv_parametrizer_construct_end.
|
|
*
|
|
* The pointers to `co` and `uv` are stored, rather than being copied. Vertices are implicitly
|
|
* created.
|
|
*
|
|
* In #geometry::uv_parametrizer_construct_end the mesh will be split up according to the seams.
|
|
* The resulting charts must be manifold, connected and open (at least one boundary loop). The
|
|
* output will be written to the `uv` pointers.
|
|
*
|
|
* \{ */
|
|
|
|
ParamHandle *uv_parametrizer_construct_begin();
|
|
|
|
void uv_parametrizer_aspect_ratio(ParamHandle *handle, float aspx, float aspy);
|
|
|
|
void uv_prepare_pin_index(ParamHandle *handle, const int bmvertindex, const float uv[2]);
|
|
|
|
ParamKey uv_find_pin_index(ParamHandle *handle, const int bmvertindex, const float uv[2]);
|
|
|
|
void uv_parametrizer_face_add(ParamHandle *handle,
|
|
const ParamKey key,
|
|
const int nverts,
|
|
const ParamKey *vkeys,
|
|
const float **co,
|
|
float **uv, /* Output will eventually be written to `uv`. */
|
|
const bool *pin,
|
|
const bool *select);
|
|
|
|
void uv_parametrizer_edge_set_seam(ParamHandle *handle, ParamKey *vkeys);
|
|
|
|
void uv_parametrizer_construct_end(ParamHandle *handle,
|
|
bool fill_holes,
|
|
bool topology_from_uvs,
|
|
int *r_count_failed = nullptr);
|
|
void uv_parametrizer_delete(ParamHandle *handle);
|
|
|
|
/** \} */
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/** \name Least Squares Conformal Maps:
|
|
*
|
|
* Charts with less than two pinned vertices are assigned two pins. LSCM is divided to three steps:
|
|
*
|
|
* 1. Begin: compute matrix and its factorization (expensive).
|
|
* 2. Solve using pinned coordinates (cheap).
|
|
* 3. End: clean up.
|
|
*
|
|
* UV coordinates are allowed to change within begin/end, for quick re-solving.
|
|
*
|
|
* \{ */
|
|
|
|
void uv_parametrizer_lscm_begin(ParamHandle *handle, bool live, bool abf);
|
|
void uv_parametrizer_lscm_solve(ParamHandle *handle, int *count_changed, int *count_failed);
|
|
void uv_parametrizer_lscm_end(ParamHandle *handle);
|
|
|
|
/** \} */
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/** \name Stretch
|
|
* \{ */
|
|
|
|
void uv_parametrizer_stretch_begin(ParamHandle *handle);
|
|
void uv_parametrizer_stretch_blend(ParamHandle *handle, float blend);
|
|
void uv_parametrizer_stretch_iter(ParamHandle *handle);
|
|
void uv_parametrizer_stretch_end(ParamHandle *handle);
|
|
|
|
/** \} */
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/** \name Packing
|
|
* \{ */
|
|
|
|
void uv_parametrizer_pack(ParamHandle *handle, float margin, bool do_rotate, bool ignore_pinned);
|
|
|
|
/** \} */
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/** \name Average area for all charts
|
|
* \{ */
|
|
|
|
void uv_parametrizer_average(ParamHandle *handle, bool ignore_pinned, bool scale_uv, bool shear);
|
|
|
|
/** \} */
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/** \name Simple x,y scale
|
|
* \{ */
|
|
|
|
void uv_parametrizer_scale(ParamHandle *handle, float x, float y);
|
|
|
|
/** \} */
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/** \name Flushing
|
|
* \{ */
|
|
|
|
void uv_parametrizer_flush(ParamHandle *handle);
|
|
void uv_parametrizer_flush_restore(ParamHandle *handle);
|
|
|
|
/** \} */
|
|
|
|
} // namespace blender::geometry
|