tornavis/source/blender/blenkernel/intern/multires_unsubdivide.hh

75 lines
2.0 KiB
C++

/* SPDX-FileCopyrightText: 2020 Blender Foundation
*
* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup bke
*/
#pragma once
#include "BLI_sys_types.h"
struct BMesh;
struct Mesh;
struct MultiresModifierData;
typedef struct MultiresUnsubdivideGrid {
/* For sanity checks. */
int grid_index;
int grid_size;
/** Grid coordinates in object space. */
float (*grid_co)[3];
} MultiresUnsubdivideGrid;
typedef struct MultiresUnsubdivideContext {
/* Input Mesh to un-subdivide. */
struct Mesh *original_mesh;
struct MDisps *original_mdisp;
/** Number of subdivision in the grids of the input mesh. */
int num_original_levels;
/** Level 0 base mesh after applying the maximum amount of unsubdivisions. */
struct Mesh *base_mesh;
/** Limit on how many levels down the unsubdivide operation should create, if possible. */
int max_new_levels;
/** New levels that were created after unsubdividing. */
int num_new_levels;
/**
* Number of subdivisions that should be applied to the base mesh.
* (num_new_levels + num_original_levels).
*/
int num_total_levels;
/** Data for the new grids, indexed by base mesh loop index. */
int num_grids;
struct MultiresUnsubdivideGrid *base_mesh_grids;
/* Private data. */
struct BMesh *bm_original_mesh;
blender::Array<int> loop_to_face_map;
const int *base_to_orig_vmap;
} MultiresUnsubdivideContext;
/* --------------------------------------------------------------------
* Construct/destruct reshape context.
*/
void multires_unsubdivide_context_init(MultiresUnsubdivideContext *context,
struct Mesh *original_mesh,
struct MultiresModifierData *mmd);
void multires_unsubdivide_context_free(MultiresUnsubdivideContext *context);
/* --------------------------------------------------------------------
* Rebuild Lower Subdivisions.
*/
/* Rebuilds all subdivision to the level 0 base mesh. */
bool multires_unsubdivide_to_basemesh(MultiresUnsubdivideContext *context);