Files
test/source/blender/blenkernel/BKE_subsurf.hh
Hans Goudey 7daefd730b Refactor: Sculpt: Change PBVH and PBVHNode to public classes
Part of #118145.

These days we aren't really benefiting from making PBVH an opaque type.
As we remove its responsibilities to focus it on being a BVH tree and look
to improve performance with data-oriented design, that will only become
more true.

There are some other future developments the current header structure
makes difficult:
- Storing selections of nodes with `IndexMask` for simpler iteration, etc.
- Specialization of node type for each PBVH type
- Reducing overhead of access to node data as nodes get smaller
- General C++ cleanliness and consistency

This PR moves `PBVH` to `blender::bke::pbvh::Tree` and moves `PBVHNode`
to `blender::bke::pbvh::Node`. Both are classes visible to elsewhere in Blender
but with private data fields.

The difficult part about the change is that we're in the middle of a transition
removing data from PBVH. Rather than making some data truly private I
chose to just give it the `_` suffix, since it will ideally be removed later.
Other things should be class methods or implemented as part of friend
classes. But the "fake" private status is much simpler for now and avoids
increasing the scope of this PR too much. Though that's a bit ugly, there's a
straightforward way to resolve these issues-- it just looks like the sort of
inconsistency you'd expect in the middle of a large refactor.

Pull Request: https://projects.blender.org/blender/blender/pulls/124919
2024-07-23 22:31:27 +02:00

122 lines
2.8 KiB
C++

/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#pragma once
/** \file
* \ingroup bke
*/
/* struct DerivedMesh is used directly */
#include "BKE_mesh_legacy_derived_mesh.hh"
/* Thread sync primitives used directly. */
#include "BLI_ordered_edge.hh"
#include "BLI_threads.h"
#include "BLI_utildefines.h"
#include "BLI_vector_set.hh"
struct CCGEdge;
struct CCGElem;
struct CCGFace;
struct CCGSubSurf;
struct CCGVert;
struct DerivedMesh;
struct Mesh;
struct MeshElemMap;
struct MultiresModifierData;
struct Object;
namespace blender::bke::pbvh {
class Tree;
}
struct SubsurfModifierData;
/**************************** External *****************************/
enum SubsurfFlags {
SUBSURF_USE_RENDER_PARAMS = 1,
SUBSURF_IS_FINAL_CALC = 2,
SUBSURF_FOR_EDIT_MODE = 4,
SUBSURF_IN_EDIT_MODE = 8,
SUBSURF_ALLOC_PAINT_MASK = 16,
SUBSURF_USE_GPU_BACKEND = 32,
SUBSURF_IGNORE_SIMPLIFY = 64,
};
ENUM_OPERATORS(SubsurfFlags, SUBSURF_IGNORE_SIMPLIFY);
DerivedMesh *subsurf_make_derived_from_derived(DerivedMesh *dm,
SubsurfModifierData *smd,
const Scene *scene,
float (*vertCos)[3],
SubsurfFlags flags);
void subsurf_calculate_limit_positions(Mesh *mesh, float (*r_positions)[3]);
/**
* Get grid-size from 'level', level must be greater than zero.
*/
int BKE_ccg_gridsize(int level);
/**
* X/Y grid coordinates at 'low_level' can be multiplied by the result
* of this function to convert to grid coordinates at 'high_level'.
*/
int BKE_ccg_factor(int low_level, int high_level);
enum MultiresModifiedFlags {
/* indicates the grids have been sculpted on, so MDisps
* have to be updated */
MULTIRES_COORDS_MODIFIED = 1,
/* indicates elements have been hidden or unhidden */
MULTIRES_HIDDEN_MODIFIED = 2,
};
/**************************** Internal *****************************/
struct CCGDerivedMesh {
DerivedMesh dm;
CCGSubSurf *ss;
int freeSS;
int drawInteriorEdges, useSubsurfUv;
struct {
int startVert;
CCGVert *vert;
} *vertMap;
struct {
int startVert;
int startEdge;
CCGEdge *edge;
} *edgeMap;
struct {
int startVert;
int startEdge;
int startFace;
CCGFace *face;
} *faceMap;
CCGElem **gridData;
int *gridOffset;
CCGFace **gridFaces;
unsigned int **gridHidden;
/* Elements in arrays above. */
unsigned int numGrid;
struct {
MultiresModifierData *mmd;
int local_mmd;
int lvl, totlvl;
float (*orco)[3];
Object *ob;
MultiresModifiedFlags modified_flags;
} multires;
blender::VectorSet<blender::OrderedEdge> *ehash;
ThreadMutex loops_cache_lock;
ThreadRWMutex origindex_cache_rwlock;
};