2011-10-10 11:38:02 +02:00
|
|
|
/*
|
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.
|
|
|
|
*/
|
2012-02-17 19:59:41 +01:00
|
|
|
#ifndef __BKE_SUBSURF_H__
|
|
|
|
#define __BKE_SUBSURF_H__
|
2002-10-12 13:37:38 +02:00
|
|
|
|
2019-02-17 22:08:12 +01:00
|
|
|
/** \file
|
|
|
|
* \ingroup bke
|
2011-02-18 14:05:18 +01:00
|
|
|
*/
|
|
|
|
|
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"
|
|
|
|
|
2019-01-28 11:08:24 +01:00
|
|
|
struct CCGEdge;
|
2012-05-10 22:33:09 +02:00
|
|
|
struct CCGElem;
|
2019-01-28 11:08:24 +01:00
|
|
|
struct CCGFace;
|
|
|
|
struct CCGVert;
|
2012-03-06 03:40:08 +01:00
|
|
|
struct DMFlagMat;
|
2005-03-29 18:43:39 +02:00
|
|
|
struct DerivedMesh;
|
2019-01-28 11:08:24 +01:00
|
|
|
struct EdgeHash;
|
2012-03-14 07:32:13 +01:00
|
|
|
struct MPoly;
|
2019-01-28 11:08:24 +01:00
|
|
|
struct Mesh;
|
|
|
|
struct MeshElemMap;
|
2010-03-22 12:59:36 +01:00
|
|
|
struct Object;
|
|
|
|
struct PBVH;
|
2009-11-25 14:11:44 +01:00
|
|
|
struct PBVH;
|
2019-01-28 11:08:24 +01:00
|
|
|
struct SubsurfModifierData;
|
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 {
|
2019-04-17 06:17:24 +02:00
|
|
|
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,
|
2012-05-10 22:31:55 +02:00
|
|
|
} SubsurfFlags;
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
struct DerivedMesh *subsurf_make_derived_from_derived(struct DerivedMesh *dm,
|
|
|
|
struct SubsurfModifierData *smd,
|
|
|
|
struct Scene *scene,
|
|
|
|
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,
|
2019-04-17 06:17:24 +02:00
|
|
|
const struct MPoly *mpoly,
|
|
|
|
float *paint_mask,
|
2012-05-11 10:05:47 +02:00
|
|
|
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 {
|
2019-04-17 06:17:24 +02:00
|
|
|
/* 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,
|
2012-03-14 07:32:03 +01:00
|
|
|
} MultiresModifiedFlags;
|
|
|
|
|
2009-11-25 14:11:44 +01:00
|
|
|
/**************************** Internal *****************************/
|
|
|
|
|
|
|
|
typedef struct CCGDerivedMesh {
|
2019-04-17 06:17:24 +02:00
|
|
|
DerivedMesh dm;
|
|
|
|
|
|
|
|
struct CCGSubSurf *ss;
|
|
|
|
int freeSS;
|
|
|
|
int drawInteriorEdges, useSubsurfUv, useGpuBackend;
|
|
|
|
|
|
|
|
struct {
|
|
|
|
int startVert;
|
|
|
|
struct CCGVert *vert;
|
|
|
|
} * vertMap;
|
|
|
|
struct {
|
|
|
|
int startVert;
|
|
|
|
int startEdge;
|
|
|
|
struct CCGEdge *edge;
|
|
|
|
} * edgeMap;
|
|
|
|
struct {
|
|
|
|
int startVert;
|
|
|
|
int startEdge;
|
|
|
|
int startFace;
|
|
|
|
struct CCGFace *face;
|
|
|
|
} * faceMap;
|
|
|
|
|
|
|
|
short *edgeFlags;
|
|
|
|
struct DMFlagMat *faceFlags;
|
|
|
|
|
|
|
|
int *reverseFaceMap;
|
|
|
|
|
|
|
|
struct PBVH *pbvh;
|
|
|
|
|
|
|
|
struct MeshElemMap *pmap;
|
|
|
|
int *pmap_mem;
|
|
|
|
|
|
|
|
struct CCGElem **gridData;
|
|
|
|
int *gridOffset;
|
|
|
|
struct CCGFace **gridFaces;
|
|
|
|
struct DMFlagMat *gridFlagMats;
|
|
|
|
unsigned int **gridHidden;
|
|
|
|
/* Elements in arrays above. */
|
|
|
|
unsigned int numGrid;
|
|
|
|
|
|
|
|
struct {
|
|
|
|
struct MultiresModifierData *mmd;
|
|
|
|
int local_mmd;
|
|
|
|
|
|
|
|
int lvl, totlvl;
|
|
|
|
float (*orco)[3];
|
|
|
|
|
|
|
|
struct Object *ob;
|
|
|
|
MultiresModifiedFlags modified_flags;
|
|
|
|
} multires;
|
|
|
|
|
|
|
|
struct EdgeHash *ehash;
|
|
|
|
|
|
|
|
ThreadMutex loops_cache_lock;
|
|
|
|
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
|