Listing the "Blender Foundation" as copyright holder implied the Blender Foundation holds copyright to files which may include work from many developers. While keeping copyright on headers makes sense for isolated libraries, Blender's own code may be refactored or moved between files in a way that makes the per file copyright holders less meaningful. Copyright references to the "Blender Foundation" have been replaced with "Blender Authors", with the exception of `./extern/` since these this contains libraries which are more isolated, any changed to license headers there can be handled on a case-by-case basis. Some directories in `./intern/` have also been excluded: - `./intern/cycles/` it's own `AUTHORS` file is planned. - `./intern/opensubdiv/`. An "AUTHORS" file has been added, using the chromium projects authors file as a template. Design task: #110784 Ref !110783.
147 lines
5.3 KiB
C
147 lines
5.3 KiB
C
/* SPDX-FileCopyrightText: 2004 Blender Authors
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
#pragma once
|
|
|
|
/** \file
|
|
* \ingroup bmesh
|
|
*
|
|
* The lowest level of functionality for manipulating bmesh structures.
|
|
* None of these functions should ever be exported to the rest of Blender.
|
|
*
|
|
* in the vast majority of cases there shouldn't be used directly.
|
|
* if absolutely necessary, see function definitions in code for
|
|
* descriptive comments. but seriously, don't use this stuff.
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* LOOP CYCLE MANAGEMENT */
|
|
/*****loop cycle functions, e.g. loops surrounding a face**** */
|
|
bool bmesh_loop_validate(BMFace *f) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
|
|
|
|
/* DISK CYCLE MANAGEMENT */
|
|
void bmesh_disk_edge_append(BMEdge *e, BMVert *v) ATTR_NONNULL();
|
|
void bmesh_disk_edge_remove(BMEdge *e, BMVert *v) ATTR_NONNULL();
|
|
BLI_INLINE BMEdge *bmesh_disk_edge_next_safe(const BMEdge *e,
|
|
const BMVert *v) ATTR_WARN_UNUSED_RESULT
|
|
ATTR_NONNULL();
|
|
BLI_INLINE BMEdge *bmesh_disk_edge_prev_safe(const BMEdge *e,
|
|
const BMVert *v) ATTR_WARN_UNUSED_RESULT
|
|
ATTR_NONNULL();
|
|
BLI_INLINE BMEdge *bmesh_disk_edge_next(const BMEdge *e, const BMVert *v) ATTR_WARN_UNUSED_RESULT
|
|
ATTR_NONNULL();
|
|
BLI_INLINE BMEdge *bmesh_disk_edge_prev(const BMEdge *e, const BMVert *v) ATTR_WARN_UNUSED_RESULT
|
|
ATTR_NONNULL();
|
|
int bmesh_disk_facevert_count_at_most(const BMVert *v, int count_max) ATTR_WARN_UNUSED_RESULT
|
|
ATTR_NONNULL();
|
|
/**
|
|
* \brief DISK COUNT FACE VERT
|
|
*
|
|
* Counts the number of loop users
|
|
* for this vertex. Note that this is
|
|
* equivalent to counting the number of
|
|
* faces incident upon this vertex
|
|
*/
|
|
int bmesh_disk_facevert_count(const BMVert *v) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
|
|
/**
|
|
* \brief FIND FIRST FACE EDGE
|
|
*
|
|
* Finds the first edge in a vertices
|
|
* Disk cycle that has one of this
|
|
* vert's loops attached
|
|
* to it.
|
|
*/
|
|
BMEdge *bmesh_disk_faceedge_find_first(const BMEdge *e, const BMVert *v) ATTR_WARN_UNUSED_RESULT
|
|
ATTR_NONNULL();
|
|
/**
|
|
* Special case for BM_LOOPS_OF_VERT & BM_FACES_OF_VERT, avoids 2x calls.
|
|
*
|
|
* The returned BMLoop.e matches the result of #bmesh_disk_faceedge_find_first
|
|
*/
|
|
BMLoop *bmesh_disk_faceloop_find_first(const BMEdge *e, const BMVert *v) ATTR_WARN_UNUSED_RESULT
|
|
ATTR_NONNULL();
|
|
/**
|
|
* A version of #bmesh_disk_faceloop_find_first that ignores hidden faces.
|
|
*/
|
|
BMLoop *bmesh_disk_faceloop_find_first_visible(const BMEdge *e,
|
|
const BMVert *v) ATTR_WARN_UNUSED_RESULT
|
|
ATTR_NONNULL();
|
|
BMEdge *bmesh_disk_faceedge_find_next(const BMEdge *e, const BMVert *v) ATTR_WARN_UNUSED_RESULT
|
|
ATTR_NONNULL();
|
|
|
|
/* RADIAL CYCLE MANAGEMENT */
|
|
void bmesh_radial_loop_append(BMEdge *e, BMLoop *l) ATTR_NONNULL();
|
|
/**
|
|
* \brief BMESH RADIAL REMOVE LOOP
|
|
*
|
|
* Removes a loop from an radial cycle. If edge e is non-NULL
|
|
* it should contain the radial cycle, and it will also get
|
|
* updated (in the case that the edge's link into the radial
|
|
* cycle was the loop which is being removed from the cycle).
|
|
*/
|
|
void bmesh_radial_loop_remove(BMEdge *e, BMLoop *l) ATTR_NONNULL();
|
|
/**
|
|
* A version of #bmesh_radial_loop_remove which only performs the radial unlink,
|
|
* leaving the edge untouched.
|
|
*/
|
|
void bmesh_radial_loop_unlink(BMLoop *l) ATTR_NONNULL();
|
|
/* NOTE:
|
|
* bmesh_radial_loop_next(BMLoop *l) / prev.
|
|
* just use member access l->radial_next, l->radial_prev now */
|
|
|
|
int bmesh_radial_facevert_count_at_most(const BMLoop *l,
|
|
const BMVert *v,
|
|
int count_max) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
|
|
/**
|
|
* \brief RADIAL COUNT FACE VERT
|
|
*
|
|
* Returns the number of times a vertex appears
|
|
* in a radial cycle
|
|
*/
|
|
int bmesh_radial_facevert_count(const BMLoop *l, const BMVert *v) ATTR_WARN_UNUSED_RESULT
|
|
ATTR_NONNULL();
|
|
/**
|
|
* \brief RADIAL CHECK FACE VERT
|
|
*
|
|
* Quicker check for `bmesh_radial_facevert_count(...) != 0`.
|
|
*/
|
|
bool bmesh_radial_facevert_check(const BMLoop *l, const BMVert *v) ATTR_WARN_UNUSED_RESULT
|
|
ATTR_NONNULL();
|
|
/**
|
|
* \brief BME RADIAL FIND FIRST FACE VERT
|
|
*
|
|
* Finds the first loop of v around radial
|
|
* cycle
|
|
*/
|
|
BMLoop *bmesh_radial_faceloop_find_first(const BMLoop *l, const BMVert *v) ATTR_WARN_UNUSED_RESULT
|
|
ATTR_NONNULL();
|
|
BMLoop *bmesh_radial_faceloop_find_next(const BMLoop *l, const BMVert *v) ATTR_WARN_UNUSED_RESULT
|
|
ATTR_NONNULL();
|
|
BMLoop *bmesh_radial_faceloop_find_vert(const BMFace *f, const BMVert *v) ATTR_WARN_UNUSED_RESULT
|
|
ATTR_NONNULL();
|
|
/*****radial cycle functions, e.g. loops surrounding edges**** */
|
|
bool bmesh_radial_validate(int radlen, BMLoop *l) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
|
|
|
|
/* EDGE UTILITIES */
|
|
void bmesh_disk_vert_swap(BMEdge *e, BMVert *v_dst, BMVert *v_src) ATTR_NONNULL();
|
|
/**
|
|
* Handles all connected data, use with care.
|
|
*
|
|
* Assumes caller has setup correct state before the swap is done.
|
|
*/
|
|
void bmesh_edge_vert_swap(BMEdge *e, BMVert *v_dst, BMVert *v_src) ATTR_NONNULL();
|
|
void bmesh_disk_vert_replace(BMEdge *e, BMVert *v_dst, BMVert *v_src) ATTR_NONNULL();
|
|
BMEdge *bmesh_disk_edge_exists(const BMVert *v1, const BMVert *v2) ATTR_WARN_UNUSED_RESULT
|
|
ATTR_NONNULL();
|
|
bool bmesh_disk_validate(int len, BMEdge *e, BMVert *v) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#include "intern/bmesh_structure_inline.h"
|