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.
96 lines
3.1 KiB
C
96 lines
3.1 KiB
C
/* SPDX-FileCopyrightText: 2023 Blender Authors
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
#pragma once
|
|
|
|
/** \file
|
|
* \ingroup bmesh
|
|
*/
|
|
|
|
#include "BLI_compiler_attrs.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* Parameters used to determine which kinds of data needs to be generated.
|
|
*/
|
|
typedef struct BMPartialUpdate_Params {
|
|
bool do_normals;
|
|
bool do_tessellate;
|
|
} BMPartialUpdate_Params;
|
|
|
|
/**
|
|
* Cached data to speed up partial updates.
|
|
*
|
|
* Hints:
|
|
*
|
|
* - Avoid creating this data for single updates,
|
|
* it should be created and reused across multiple updates to gain a significant benefit
|
|
* (while transforming geometry for example).
|
|
*
|
|
* - Partial normal updates use face & loop indices,
|
|
* setting them to dirty values between updates will slow down normal recalculation.
|
|
*/
|
|
typedef struct BMPartialUpdate {
|
|
BMVert **verts;
|
|
BMFace **faces;
|
|
int verts_len, verts_len_alloc;
|
|
int faces_len, faces_len_alloc;
|
|
|
|
/** Store the parameters used in creation so invalid use can be asserted. */
|
|
BMPartialUpdate_Params params;
|
|
} BMPartialUpdate;
|
|
|
|
/**
|
|
* All Tagged & Connected, see: #BM_mesh_partial_create_from_verts
|
|
* Operate on everything that's tagged as well as connected geometry.
|
|
*/
|
|
BMPartialUpdate *BM_mesh_partial_create_from_verts(BMesh *bm,
|
|
const BMPartialUpdate_Params *params,
|
|
const unsigned int *verts_mask,
|
|
int verts_mask_count)
|
|
ATTR_NONNULL(1, 2, 3) ATTR_WARN_UNUSED_RESULT;
|
|
|
|
/**
|
|
* All Connected, operate on all faces that have both tagged and un-tagged vertices.
|
|
*
|
|
* Reduces computations when transforming isolated regions.
|
|
*/
|
|
BMPartialUpdate *BM_mesh_partial_create_from_verts_group_single(
|
|
BMesh *bm,
|
|
const BMPartialUpdate_Params *params,
|
|
const unsigned int *verts_mask,
|
|
int verts_mask_count) ATTR_NONNULL(1, 2, 3) ATTR_WARN_UNUSED_RESULT;
|
|
|
|
/**
|
|
* All Connected, operate on all faces that have vertices in the same group.
|
|
*
|
|
* Reduces computations when transforming isolated regions.
|
|
*
|
|
* This is a version of #BM_mesh_partial_create_from_verts_group_single
|
|
* that handles multiple groups instead of a bitmap mask.
|
|
*
|
|
* This is needed for example when transform has mirror enabled,
|
|
* since one side needs to have a different group to the other since a face that has vertices
|
|
* attached to both won't have an affine transformation.
|
|
*
|
|
* \param verts_group: Vertex aligned array of groups.
|
|
* Values are used as follows:
|
|
* - >0: Each face is grouped with other faces of the same group.
|
|
* - 0: Not in a group (don't handle these).
|
|
* - -1: Don't use grouping logic (include any face that contains a vertex with this group).
|
|
* \param verts_group_count: The number of non-zero values in `verts_groups`.
|
|
*/
|
|
BMPartialUpdate *BM_mesh_partial_create_from_verts_group_multi(
|
|
BMesh *bm, const BMPartialUpdate_Params *params, const int *verts_group, int verts_group_count)
|
|
ATTR_NONNULL(1, 2, 3) ATTR_WARN_UNUSED_RESULT;
|
|
|
|
void BM_mesh_partial_destroy(BMPartialUpdate *bmpinfo) ATTR_NONNULL(1);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|