2011-10-10 11:38:02 +02:00
|
|
|
/*
|
2008-01-07 20:13:47 +01:00
|
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
2002-10-12 13:37:38 +02:00
|
|
|
*
|
|
|
|
* 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
|
2008-01-07 20:13:47 +01:00
|
|
|
* of the License, or (at your option) any later version.
|
2002-10-12 13:37:38 +02:00
|
|
|
*
|
|
|
|
* 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,
|
2010-02-12 14:34:04 +01:00
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2002-10-12 13:37:38 +02:00
|
|
|
*
|
|
|
|
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* The Original Code is: all of this file.
|
|
|
|
*
|
|
|
|
* Contributor(s): none yet.
|
|
|
|
*
|
2008-01-07 20:13:47 +01:00
|
|
|
* ***** END GPL LICENSE BLOCK *****
|
2002-10-12 13:37:38 +02:00
|
|
|
*/
|
2012-02-17 19:59:41 +01:00
|
|
|
#ifndef __BKE_SUBSURF_H__
|
|
|
|
#define __BKE_SUBSURF_H__
|
2002-10-12 13:37:38 +02:00
|
|
|
|
2011-02-18 14:05:18 +01:00
|
|
|
/** \file BKE_subsurf.h
|
|
|
|
* \ingroup bke
|
|
|
|
*/
|
|
|
|
|
2012-03-14 07:31:24 +01:00
|
|
|
/* struct DerivedMesh is used directly */
|
|
|
|
#include "BKE_DerivedMesh.h"
|
|
|
|
|
2017-12-22 12:45:06 +01:00
|
|
|
/* Thread sync primitives used directly. */
|
|
|
|
#include "BLI_threads.h"
|
|
|
|
|
2012-05-10 22:33:09 +02:00
|
|
|
struct CCGElem;
|
2012-03-06 03:40:08 +01:00
|
|
|
struct DMFlagMat;
|
2010-03-22 12:59:36 +01:00
|
|
|
struct DMGridAdjacency;
|
2005-03-29 18:43:39 +02:00
|
|
|
struct DerivedMesh;
|
2012-03-17 05:41:36 +01:00
|
|
|
struct MeshElemMap;
|
2010-03-22 12:59:36 +01:00
|
|
|
struct Mesh;
|
2012-03-14 07:32:13 +01:00
|
|
|
struct MPoly;
|
2010-03-22 12:59:36 +01:00
|
|
|
struct Object;
|
|
|
|
struct PBVH;
|
- shuffled editmesh derived function name/function
- added ModifierTypeInfo.freeData function
- added modifier_{new,free] utility function
- added ccgSubSurf_getUseAgeCounts to query info
- removed subsurf modifier faking (ME_SUBSURF flag is no
longer valid). subsurf modifier gets converted on file load
although there is obscure linked mesh situation where this
can go wrong, will fix shortly. this also means that some
places in the code that test/copy subsurf settings are broken
for the time being.
- shuffled modifier calculation to be simpler. note that
all modifiers are currently disabled in editmode (including
subsurf). don't worry, will return shortly.
- bug fix, build modifier didn't randomize meshes with only verts
- cleaned up subsurf_ccg and adapted for future editmode modifier
work
- added editmesh.derived{Cage,Final}, not used yet
- added SubsurfModifierData.{mCache,emCache}, will be used to cache
subsurf instead of caching in derivedmesh itself
- removed old subsurf buttons
- added do_modifiers_buttons to handle modifier events
- removed count_object counting of modifier (subsurfed) objects...
this would be nice to add back at some point but requires care.
probably requires rewrite of counting system.
New feature: Incremental Subsurf in Object Mode
The previous release introduce incremental subsurf calculation during
editmode but it was not turned on during object mode. In general it
does not make sense to have it always enabled during object mode because
it requires caching a fair amount of information about the mesh which
is a waste of memory unless the mesh is often recalculated.
However, for mesh's that have subsurfed armatures for example, or that
have other modifiers so that the mesh is essentially changing on every
frame, it makes a lot of sense to keep the subsurf'd object around and
that is what the new incremental subsurf modifier toggle is for. The
intent is that the user will enable this option for (a) a mesh that is
currently under active editing or (b) a mesh that is heavily updated
in the scene, such as a character.
I will try to write more about this feature for release, because it
has advantages and disadvantages that are not immediately obvious (the
first user reaction will be to turn it on for ever object, which is
probably not correct).
2005-07-21 22:30:33 +02:00
|
|
|
struct SubsurfModifierData;
|
2012-02-26 07:50:54 +01:00
|
|
|
struct CCGEdge;
|
|
|
|
struct CCGFace;
|
|
|
|
struct CCGVert;
|
2010-01-05 23:33:41 +01:00
|
|
|
struct EdgeHash;
|
2009-11-25 14:11:44 +01:00
|
|
|
struct PBVH;
|
2004-01-07 11:17:37 +01:00
|
|
|
|
2009-11-25 14:11:44 +01:00
|
|
|
/**************************** External *****************************/
|
2002-10-12 13:37:38 +02:00
|
|
|
|
2012-05-10 22:31:55 +02:00
|
|
|
typedef enum {
|
|
|
|
SUBSURF_USE_RENDER_PARAMS = 1,
|
|
|
|
SUBSURF_IS_FINAL_CALC = 2,
|
|
|
|
SUBSURF_FOR_EDIT_MODE = 4,
|
Add mask support to CCGSubSurf and multires.
* Add new CCG function ccgSubSurf_setAllocMask(). Similar to to
ccgSubSurf_setCalcVertexNormals(), it sets whether the CCG elements
have a mask layer and what that layer's offset is. Unlike normals
however, it doesn't change any behavior during CCG calculation; it's
there only to give CCGKey information on the mask.
* Add a new flag to _getSubSurf(), CCG_ALLOC_MASK. If set, space for
an extra layer is allocated, but the number of CCG layers is not set
to include it. This is done because GridPaintMasks are absolute,
rather than being relative to the subdivided output (as MDisp
displacements are), so we skip subdividing paint masks here.
* Add a new flag to subsurf_make_derived_from_derived(),
SUBSURF_ALLOC_PAINT_MASK. This controls whether CCG_ALLOC_MASK is
set for _getSubSurf(). Related, masks are never loaded in during
ss_sync_from_derivedmesh(). After subdivision is finished, if the
alloc mask flag is set, the number of CCG layers is increase to 4
with ccgSubSurf_setNumLayers().
* Add a new flag to multires_make_from_derived(),
MULTIRES_ALLOC_PAINT_MASK. Not all multires functions need paint
mask data (e.g. multiresModifier_base_apply.) This flag is always
set in MOD_multires.c so that subdividing a mesh with a mask updates
properly even when not in sculpt mode.
* Update multiresModifier_disp_run() to apply, calculate, and add mask
elements. It's almost the same as the existing operations with xyz
coordinates, but treats masks as absolute rather than displacements
relative to subdivided values.
* Update multires_customdata_delete to free CD_GRID_PAINT_MASK in
addition to CD_MDISPS.
* Update multires_del_higher() to call the new function
multires_grid_paint_mask_downsample(), which allocates a
lower-resolution paint mask grid and copies values over from the
high-resolution grid.
2012-05-10 22:34:08 +02:00
|
|
|
SUBSURF_IN_EDIT_MODE = 8,
|
2015-07-20 16:08:06 +02:00
|
|
|
SUBSURF_ALLOC_PAINT_MASK = 16,
|
|
|
|
SUBSURF_USE_GPU_BACKEND = 32,
|
2012-05-10 22:31:55 +02:00
|
|
|
} SubsurfFlags;
|
|
|
|
|
2009-11-25 14:11:44 +01:00
|
|
|
struct DerivedMesh *subsurf_make_derived_from_derived(
|
2012-11-03 16:35:03 +01:00
|
|
|
struct DerivedMesh *dm,
|
|
|
|
struct SubsurfModifierData *smd,
|
2018-06-18 11:51:02 +02:00
|
|
|
struct Scene *scene,
|
2012-11-03 16:35:03 +01:00
|
|
|
float (*vertCos)[3],
|
|
|
|
SubsurfFlags flags);
|
2009-01-06 19:59:03 +01:00
|
|
|
|
2014-03-15 17:24:05 +01:00
|
|
|
void subsurf_calculate_limit_positions(struct Mesh *me, float (*r_positions)[3]);
|
2002-10-12 13:37:38 +02:00
|
|
|
|
2012-03-14 07:31:24 +01:00
|
|
|
/* get gridsize from 'level', level must be greater than zero */
|
2013-10-01 11:17:35 +02:00
|
|
|
int BKE_ccg_gridsize(int level);
|
2012-03-14 07:31:24 +01:00
|
|
|
|
|
|
|
/* x/y grid coordinates at 'low_level' can be multiplied by the result
|
2012-04-22 13:54:53 +02:00
|
|
|
* of this function to convert to grid coordinates at 'high_level' */
|
2013-10-01 11:17:35 +02:00
|
|
|
int BKE_ccg_factor(int low_level, int high_level);
|
2012-03-14 07:31:24 +01:00
|
|
|
|
2012-03-14 07:32:13 +01:00
|
|
|
void subsurf_copy_grid_hidden(struct DerivedMesh *dm,
|
2012-05-11 10:05:47 +02:00
|
|
|
const struct MPoly *mpoly,
|
|
|
|
struct MVert *mvert,
|
|
|
|
const struct MDisps *mdisps);
|
2012-03-14 07:32:13 +01:00
|
|
|
|
2012-05-10 22:34:23 +02:00
|
|
|
void subsurf_copy_grid_paint_mask(struct DerivedMesh *dm,
|
2012-05-11 10:05:47 +02:00
|
|
|
const struct MPoly *mpoly, float *paint_mask,
|
|
|
|
const struct GridPaintMask *grid_paint_mask);
|
2012-05-10 22:34:23 +02:00
|
|
|
|
2015-08-05 15:11:50 +02:00
|
|
|
bool subsurf_has_edges(struct DerivedMesh *dm);
|
|
|
|
bool subsurf_has_faces(struct DerivedMesh *dm);
|
|
|
|
|
2012-03-14 07:32:03 +01:00
|
|
|
typedef enum MultiresModifiedFlags {
|
|
|
|
/* indicates the grids have been sculpted on, so MDisps
|
2012-04-22 13:54:53 +02:00
|
|
|
* have to be updated */
|
2012-03-14 07:32:03 +01:00
|
|
|
MULTIRES_COORDS_MODIFIED = 1,
|
|
|
|
/* indicates elements have been hidden or unhidden */
|
|
|
|
MULTIRES_HIDDEN_MODIFIED = 2
|
|
|
|
} MultiresModifiedFlags;
|
|
|
|
|
2009-11-25 14:11:44 +01:00
|
|
|
/**************************** Internal *****************************/
|
|
|
|
|
|
|
|
typedef struct CCGDerivedMesh {
|
|
|
|
DerivedMesh dm;
|
|
|
|
|
2012-02-26 07:50:54 +01:00
|
|
|
struct CCGSubSurf *ss;
|
2009-11-25 14:11:44 +01:00
|
|
|
int freeSS;
|
2015-07-20 16:08:06 +02:00
|
|
|
int drawInteriorEdges, useSubsurfUv, useGpuBackend;
|
2009-11-25 14:11:44 +01:00
|
|
|
|
2012-05-11 10:05:47 +02:00
|
|
|
struct {int startVert; struct CCGVert *vert; } *vertMap;
|
|
|
|
struct {int startVert; int startEdge; struct CCGEdge *edge; } *edgeMap;
|
2009-11-25 14:11:44 +01:00
|
|
|
struct {int startVert; int startEdge;
|
2012-05-12 22:39:39 +02:00
|
|
|
int startFace; struct CCGFace *face; } *faceMap;
|
2009-11-25 14:11:44 +01:00
|
|
|
|
|
|
|
short *edgeFlags;
|
2012-03-06 03:40:08 +01:00
|
|
|
struct DMFlagMat *faceFlags;
|
2009-11-25 14:11:44 +01:00
|
|
|
|
2010-01-05 23:33:41 +01:00
|
|
|
int *reverseFaceMap;
|
|
|
|
|
2009-11-25 14:11:44 +01:00
|
|
|
struct PBVH *pbvh;
|
|
|
|
|
2012-03-17 05:41:36 +01:00
|
|
|
struct MeshElemMap *pmap;
|
|
|
|
int *pmap_mem;
|
2012-02-05 07:20:51 +01:00
|
|
|
|
2012-05-10 22:33:09 +02:00
|
|
|
struct CCGElem **gridData;
|
2009-12-03 19:35:37 +01:00
|
|
|
int *gridOffset;
|
2012-02-26 07:50:54 +01:00
|
|
|
struct CCGFace **gridFaces;
|
2012-03-06 03:40:08 +01:00
|
|
|
struct DMFlagMat *gridFlagMats;
|
2012-03-14 07:31:49 +01:00
|
|
|
unsigned int **gridHidden;
|
2017-11-19 06:45:27 +01:00
|
|
|
/* Elements in arrays above. */
|
|
|
|
unsigned int numGrid;
|
2009-11-25 14:11:44 +01:00
|
|
|
|
|
|
|
struct {
|
|
|
|
struct MultiresModifierData *mmd;
|
|
|
|
int local_mmd;
|
|
|
|
|
|
|
|
int lvl, totlvl;
|
|
|
|
float (*orco)[3];
|
|
|
|
|
2010-04-12 02:36:50 +02:00
|
|
|
struct Object *ob;
|
2012-03-14 07:32:03 +01:00
|
|
|
MultiresModifiedFlags modified_flags;
|
2009-11-25 14:11:44 +01:00
|
|
|
} multires;
|
2010-01-05 23:33:41 +01:00
|
|
|
|
|
|
|
struct EdgeHash *ehash;
|
2017-12-22 12:45:06 +01:00
|
|
|
|
2018-01-11 14:32:56 +01:00
|
|
|
ThreadMutex loops_cache_lock;
|
2017-12-22 12:45:06 +01:00
|
|
|
ThreadRWMutex origindex_cache_rwlock;
|
2009-11-25 14:11:44 +01:00
|
|
|
} CCGDerivedMesh;
|
|
|
|
|
2015-11-04 17:30:25 +01:00
|
|
|
#ifdef WITH_OPENSUBDIV
|
|
|
|
/* TODO(sergey): Not really ideal place, but we don't currently have better one. */
|
|
|
|
void BKE_subsurf_osd_init(void);
|
|
|
|
void BKE_subsurf_free_unused_buffers(void);
|
|
|
|
void BKE_subsurf_osd_cleanup(void);
|
2002-10-12 13:37:38 +02:00
|
|
|
#endif
|
2002-10-30 03:07:20 +01:00
|
|
|
|
2015-11-04 17:30:25 +01:00
|
|
|
#endif
|