259 lines
9.4 KiB
C
259 lines
9.4 KiB
C
/*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* The Original Code is Copyright (C) 2018 by Blender Foundation.
|
|
* All rights reserved.
|
|
*/
|
|
|
|
/** \file
|
|
* \ingroup bke
|
|
*/
|
|
|
|
#ifndef __BKE_SUBDIV_CCG_H__
|
|
#define __BKE_SUBDIV_CCG_H__
|
|
|
|
#include "BKE_customdata.h"
|
|
#include "BKE_DerivedMesh.h"
|
|
#include "BLI_bitmap.h"
|
|
#include "BLI_sys_types.h"
|
|
|
|
struct CCGElem;
|
|
struct CCGFace;
|
|
struct CCGKey;
|
|
struct DMFlagMat;
|
|
struct Mesh;
|
|
struct Subdiv;
|
|
|
|
/* =============================================================================
|
|
* Masks.
|
|
*/
|
|
|
|
/* Functor which evaluates mask value at a given (u, v) of given ptex face. */
|
|
typedef struct SubdivCCGMaskEvaluator {
|
|
float (*eval_mask)(struct SubdivCCGMaskEvaluator *mask_evaluator,
|
|
const int ptex_face_index,
|
|
const float u,
|
|
const float v);
|
|
|
|
/* Free the data, not the evaluator itself. */
|
|
void (*free)(struct SubdivCCGMaskEvaluator *mask_evaluator);
|
|
|
|
void *user_data;
|
|
} SubdivCCGMaskEvaluator;
|
|
|
|
/* Return true if mesh has mask and evaluator can be used. */
|
|
bool BKE_subdiv_ccg_mask_init_from_paint(SubdivCCGMaskEvaluator *mask_evaluator,
|
|
const struct Mesh *mesh);
|
|
|
|
/* =============================================================================
|
|
* Materials.
|
|
*/
|
|
|
|
/* Functor which evaluates material and flags of a given coarse face. */
|
|
typedef struct SubdivCCGMaterialFlagsEvaluator {
|
|
DMFlagMat (*eval_material_flags)(
|
|
struct SubdivCCGMaterialFlagsEvaluator *material_flags_evaluator,
|
|
const int coarse_face_index);
|
|
|
|
/* Free the data, not the evaluator itself. */
|
|
void (*free)(struct SubdivCCGMaterialFlagsEvaluator *material_flags_evaluator);
|
|
|
|
void *user_data;
|
|
} SubdivCCGMaterialFlagsEvaluator;
|
|
|
|
void BKE_subdiv_ccg_material_flags_init_from_mesh(
|
|
SubdivCCGMaterialFlagsEvaluator *material_flags_evaluator, const struct Mesh *mesh);
|
|
|
|
/* =============================================================================
|
|
* SubdivCCG.
|
|
*/
|
|
|
|
typedef struct SubdivToCCGSettings {
|
|
/* Resolution at which regular ptex (created for quad polygon) are being
|
|
* evaluated. This defines how many vertices final mesh will have: every
|
|
* regular ptex has resolution^2 vertices. Special (irregular, or ptex
|
|
* created for a corner of non-quad polygon) will have resolution of
|
|
* `resolution - 1`. */
|
|
int resolution;
|
|
/* Denotes which extra layers to be added to CCG elements. */
|
|
bool need_normal;
|
|
bool need_mask;
|
|
} SubdivToCCGSettings;
|
|
|
|
/* This is actually a coarse face, which consists of multiple CCG grids. */
|
|
typedef struct SubdivCCGFace {
|
|
/* Total number of grids in this face.
|
|
*
|
|
* This 1:1 corresponds to a number of corners (or loops) from a coarse
|
|
* face. */
|
|
int num_grids;
|
|
/* Index of first grid from this face in SubdivCCG->grids array. */
|
|
int start_grid_index;
|
|
} SubdivCCGFace;
|
|
|
|
/* Definition of an edge which is adjacent to at least one of the faces. */
|
|
typedef struct SubdivCCGAdjacentEdge {
|
|
int num_adjacent_faces;
|
|
/* Indexed by adjacent face index. */
|
|
SubdivCCGFace **faces;
|
|
/* Indexed by adjacent face index, then by point index on the edge.
|
|
* points to a grid element. */
|
|
struct CCGElem ***boundary_elements;
|
|
} SubdivCCGAdjacentEdge;
|
|
|
|
/* Definition of a vertex which is adjacent to at least one of the faces. */
|
|
typedef struct SubdivCCGAdjacentVertex {
|
|
int num_adjacent_faces;
|
|
/* Indexed by adjacent face index. */
|
|
SubdivCCGFace **faces;
|
|
/* Indexed by adjacent face index, points to a grid element. */
|
|
struct CCGElem **corner_elements;
|
|
} SubdivCCGAdjacentVertex;
|
|
|
|
/* Representation of subdivision surface which uses CCG grids. */
|
|
typedef struct SubdivCCG {
|
|
/* This is a subdivision surface this CCG was created for.
|
|
*
|
|
* TODO(sergey): Make sure the whole descriptor is valid, including all the
|
|
* displacement attached to the surface. */
|
|
struct Subdiv *subdiv;
|
|
/* A level at which geometry was subdivided. This is what defines grid
|
|
* resolution. It is NOT the topology refinement level. */
|
|
int level;
|
|
/* Resolution of grid. All grids have matching resolution, and resolution
|
|
* is same as ptex created for non-quad polygons. */
|
|
int grid_size;
|
|
/* Grids represent limit surface, with displacement applied. Grids are
|
|
* corresponding to face-corners of coarse mesh, each grid has
|
|
* grid_size^2 elements.
|
|
*/
|
|
/* Indexed by a grid index, points to a grid data which is stored in
|
|
* grids_storage. */
|
|
struct CCGElem **grids;
|
|
/* Flat array of all grids' data. */
|
|
unsigned char *grids_storage;
|
|
int num_grids;
|
|
/* Loose edges, each array element contains grid_size elements
|
|
* corresponding to vertices created by subdividing coarse edges. */
|
|
struct CCGElem **edges;
|
|
int num_edges;
|
|
/* Loose vertices. Every element corresponds to a loose vertex from a coarse
|
|
* mesh, every coarse loose vertex corresponds to a single sundivided
|
|
* element. */
|
|
struct CCGElem *vertices;
|
|
int num_vertices;
|
|
/* Denotes which layers present in the elements.
|
|
*
|
|
* Grids always has coordinates, followed by extra layers which are set to
|
|
* truth here.
|
|
*/
|
|
bool has_normal;
|
|
bool has_mask;
|
|
/* Offsets of corresponding data layers in the elements. */
|
|
int normal_offset;
|
|
int mask_offset;
|
|
|
|
/* Faces from which grids are emitted. */
|
|
int num_faces;
|
|
SubdivCCGFace *faces;
|
|
/* Indexed by grid index, points to corresponding face from `faces`. */
|
|
SubdivCCGFace **grid_faces;
|
|
|
|
/* Edges which are adjacent to faces.
|
|
* Used for faster grid stitching, in the cost of extra memory.
|
|
*/
|
|
int num_adjacent_edges;
|
|
SubdivCCGAdjacentEdge *adjacent_edges;
|
|
|
|
/* Vertices which are adjacent to faces
|
|
* Used for faster grid stitching, in the cost of extra memory.
|
|
*/
|
|
int num_adjacent_vertices;
|
|
SubdivCCGAdjacentVertex *adjacent_vertices;
|
|
|
|
struct DMFlagMat *grid_flag_mats;
|
|
BLI_bitmap **grid_hidden;
|
|
|
|
/* TODO(sergey): Consider adding some accessors to a "decoded" geometry,
|
|
* to make integration with draw manager and such easy.
|
|
*/
|
|
|
|
/* TODO(sergey): Consider adding CD layers here, so we can draw final mesh
|
|
* from grids, and have UVs and such work.
|
|
*/
|
|
|
|
/* Integration with sculpting. */
|
|
/* TODO(sergey): Is this really best way to go? Kind of annoying to have
|
|
* such use-related flags in a more or less generic structure. */
|
|
struct {
|
|
/* Corresponds to MULTIRES_COORDS_MODIFIED. */
|
|
bool coords;
|
|
/* Corresponds to MULTIRES_HIDDEN_MODIFIED. */
|
|
bool hidden;
|
|
} dirty;
|
|
} SubdivCCG;
|
|
|
|
/* Create real hi-res CCG from subdivision.
|
|
*
|
|
* NOTE: Subdiv is expected to be refined and ready for evaluation.
|
|
* NOTE: CCG becomes an owner of subdiv.
|
|
*
|
|
* TODO(sergey): Allow some user-counter or more explicit control over who owns
|
|
* the Subdiv. The goal should be to allow viewport GL Mesh and CCG to share
|
|
* same Subsurf without conflicts. */
|
|
struct SubdivCCG *BKE_subdiv_to_ccg(struct Subdiv *subdiv,
|
|
const SubdivToCCGSettings *settings,
|
|
SubdivCCGMaskEvaluator *mask_evaluator,
|
|
SubdivCCGMaterialFlagsEvaluator *material_flags_evaluator);
|
|
|
|
/* Destroy CCG representation of subdivision surface. */
|
|
void BKE_subdiv_ccg_destroy(SubdivCCG *subdiv_ccg);
|
|
|
|
/* Helper function, creates Mesh structure which is properly setup to use
|
|
* grids.
|
|
*/
|
|
struct Mesh *BKE_subdiv_to_ccg_mesh(struct Subdiv *subdiv,
|
|
const SubdivToCCGSettings *settings,
|
|
const struct Mesh *coarse_mesh);
|
|
|
|
/* Create a key for accessing grid elements at a given level. */
|
|
void BKE_subdiv_ccg_key(struct CCGKey *key, const SubdivCCG *subdiv_ccg, int level);
|
|
void BKE_subdiv_ccg_key_top_level(struct CCGKey *key, const SubdivCCG *subdiv_ccg);
|
|
|
|
/* Recalculate all normals based on grid element coordinates. */
|
|
void BKE_subdiv_ccg_recalc_normals(SubdivCCG *subdiv_ccg);
|
|
|
|
/* Update normals of affected faces. */
|
|
void BKE_subdiv_ccg_update_normals(SubdivCCG *subdiv_ccg,
|
|
struct CCGFace **effected_faces,
|
|
int num_effected_faces);
|
|
|
|
/* Average grid coordinates and normals along the grid boundatries. */
|
|
void BKE_subdiv_ccg_average_grids(SubdivCCG *subdiv_ccg);
|
|
|
|
/* Similar to above, but only updates given faces. */
|
|
void BKE_subdiv_ccg_average_stitch_faces(SubdivCCG *subdiv_ccg,
|
|
struct CCGFace **effected_faces,
|
|
int num_effected_faces);
|
|
|
|
/* Get geometry counters at the current subdivision level. */
|
|
void BKE_subdiv_ccg_topology_counters(const SubdivCCG *subdiv_ccg,
|
|
int *r_num_vertices,
|
|
int *r_num_edges,
|
|
int *r_num_faces,
|
|
int *r_num_loops);
|
|
|
|
#endif /* __BKE_SUBDIV_CCG_H__ */
|