2010-04-11 22:12:30 +00:00
|
|
|
/*
|
2011-10-23 17:52:20 +00:00
|
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
|
|
*
|
|
|
|
* 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) 2005 by the Blender Foundation.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* Contributor(s): Daniel Dunbar
|
|
|
|
* Ton Roosendaal,
|
|
|
|
* Ben Batt,
|
|
|
|
* Brecht Van Lommel,
|
|
|
|
* Campbell Barton
|
|
|
|
*
|
|
|
|
* ***** END GPL LICENSE BLOCK *****
|
|
|
|
*
|
|
|
|
*/
|
2010-04-11 22:12:30 +00:00
|
|
|
|
2011-02-25 13:57:17 +00:00
|
|
|
/** \file blender/modifiers/intern/MOD_multires.c
|
|
|
|
* \ingroup modifiers
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
2010-06-02 18:04:31 +00:00
|
|
|
#include <stddef.h>
|
|
|
|
|
2011-12-23 20:30:23 +00:00
|
|
|
#include "DNA_mesh_types.h"
|
2012-03-14 06:32:13 +00:00
|
|
|
#include "DNA_object_types.h"
|
2011-12-23 20:30:23 +00:00
|
|
|
|
2010-04-11 22:12:30 +00:00
|
|
|
#include "BKE_cdderivedmesh.h"
|
2012-03-14 06:32:13 +00:00
|
|
|
#include "BKE_mesh.h"
|
2010-04-11 22:12:30 +00:00
|
|
|
#include "BKE_multires.h"
|
|
|
|
#include "BKE_modifier.h"
|
|
|
|
#include "BKE_paint.h"
|
2012-03-14 06:32:13 +00:00
|
|
|
#include "BKE_subsurf.h"
|
2010-04-11 22:12:30 +00:00
|
|
|
|
2011-02-13 14:16:36 +00:00
|
|
|
#include "MOD_util.h"
|
|
|
|
|
2010-04-11 22:12:30 +00:00
|
|
|
static void initData(ModifierData *md)
|
|
|
|
{
|
2012-05-06 13:38:33 +00:00
|
|
|
MultiresModifierData *mmd = (MultiresModifierData *)md;
|
2010-04-11 22:12:30 +00:00
|
|
|
|
|
|
|
mmd->lvl = 0;
|
|
|
|
mmd->sculptlvl = 0;
|
|
|
|
mmd->renderlvl = 0;
|
|
|
|
mmd->totlvl = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void copyData(ModifierData *md, ModifierData *target)
|
|
|
|
{
|
2012-05-06 13:38:33 +00:00
|
|
|
MultiresModifierData *mmd = (MultiresModifierData *) md;
|
|
|
|
MultiresModifierData *tmmd = (MultiresModifierData *) target;
|
2010-04-11 22:12:30 +00:00
|
|
|
|
|
|
|
tmmd->lvl = mmd->lvl;
|
|
|
|
tmmd->sculptlvl = mmd->sculptlvl;
|
|
|
|
tmmd->renderlvl = mmd->renderlvl;
|
|
|
|
tmmd->totlvl = mmd->totlvl;
|
2010-10-19 07:10:12 +00:00
|
|
|
tmmd->simple = mmd->simple;
|
|
|
|
tmmd->flags = mmd->flags;
|
2010-04-11 22:12:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm,
|
2012-05-09 15:00:26 +00:00
|
|
|
ModifierApplyFlag flag)
|
2010-04-11 22:12:30 +00:00
|
|
|
{
|
2012-05-06 13:38:33 +00:00
|
|
|
MultiresModifierData *mmd = (MultiresModifierData *)md;
|
2010-04-11 22:12:30 +00:00
|
|
|
DerivedMesh *result;
|
2012-05-06 13:38:33 +00:00
|
|
|
Mesh *me = (Mesh *)ob->data;
|
2012-05-09 15:00:26 +00:00
|
|
|
const int useRenderParams = flag & MOD_APPLY_RENDER;
|
2012-05-10 20:32:09 +00:00
|
|
|
MultiresFlags flags = 0;
|
2010-07-22 11:27:54 +00:00
|
|
|
|
2012-03-24 06:24:53 +00:00
|
|
|
if (mmd->totlvl) {
|
|
|
|
if (!CustomData_get_layer(&me->ldata, CD_MDISPS)) {
|
2010-09-09 00:14:51 +00:00
|
|
|
/* multires always needs a displacement layer */
|
2011-04-03 00:25:01 +00:00
|
|
|
CustomData_add_layer(&me->ldata, CD_MDISPS, CD_CALLOC, NULL, me->totloop);
|
2010-07-22 11:27:54 +00:00
|
|
|
}
|
|
|
|
}
|
2010-04-11 22:12:30 +00:00
|
|
|
|
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 20:34:08 +00:00
|
|
|
flags = MULTIRES_ALLOC_PAINT_MASK;
|
2012-05-10 20:32:09 +00:00
|
|
|
if (useRenderParams)
|
|
|
|
flags |= MULTIRES_USE_RENDER_PARAMS;
|
|
|
|
|
|
|
|
result = multires_make_derived_from_derived(dm, mmd, ob, flags);
|
2010-04-11 22:12:30 +00:00
|
|
|
|
2012-03-24 06:24:53 +00:00
|
|
|
if (result == dm)
|
2010-04-11 22:12:30 +00:00
|
|
|
return dm;
|
|
|
|
|
2012-05-09 15:00:26 +00:00
|
|
|
if(useRenderParams || !(flag & MOD_APPLY_USECACHE)) {
|
2012-03-14 06:32:13 +00:00
|
|
|
DerivedMesh *cddm;
|
|
|
|
|
2012-05-06 13:38:33 +00:00
|
|
|
cddm = CDDM_copy(result);
|
2012-03-14 06:32:13 +00:00
|
|
|
|
|
|
|
/* copy hidden flag to vertices */
|
2012-03-24 06:24:53 +00:00
|
|
|
if (!useRenderParams) {
|
2012-03-14 06:32:13 +00:00
|
|
|
struct MDisps *mdisps;
|
|
|
|
mdisps = CustomData_get_layer(&me->ldata, CD_MDISPS);
|
2012-03-24 06:24:53 +00:00
|
|
|
if (mdisps) {
|
2012-03-14 06:32:13 +00:00
|
|
|
subsurf_copy_grid_hidden(result, me->mpoly,
|
2012-05-06 13:38:33 +00:00
|
|
|
cddm->getVertArray(cddm),
|
|
|
|
mdisps);
|
2012-03-14 06:32:13 +00:00
|
|
|
|
2012-05-05 21:28:12 +00:00
|
|
|
BKE_mesh_flush_hidden_from_verts(cddm->getVertArray(cddm),
|
|
|
|
cddm->getLoopArray(cddm),
|
|
|
|
cddm->getEdgeArray(cddm),
|
|
|
|
cddm->getNumEdges(cddm),
|
|
|
|
cddm->getPolyArray(cddm),
|
|
|
|
cddm->getNumPolys(cddm));
|
2012-03-14 06:32:13 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-04-11 22:12:30 +00:00
|
|
|
result->release(result);
|
2012-05-06 13:38:33 +00:00
|
|
|
result = cddm;
|
2010-04-11 22:12:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ModifierTypeInfo modifierType_Multires = {
|
|
|
|
/* name */ "Multires",
|
|
|
|
/* structName */ "MultiresModifierData",
|
|
|
|
/* structSize */ sizeof(MultiresModifierData),
|
|
|
|
/* type */ eModifierTypeType_Constructive,
|
2012-05-06 13:38:33 +00:00
|
|
|
/* flags */ eModifierTypeFlag_AcceptsMesh |
|
|
|
|
eModifierTypeFlag_SupportsMapping |
|
|
|
|
eModifierTypeFlag_RequiresOriginalData,
|
2010-04-11 22:12:30 +00:00
|
|
|
|
|
|
|
/* copyData */ copyData,
|
2011-03-05 10:29:10 +00:00
|
|
|
/* deformVerts */ NULL,
|
|
|
|
/* deformMatrices */ NULL,
|
|
|
|
/* deformVertsEM */ NULL,
|
|
|
|
/* deformMatricesEM */ NULL,
|
2010-04-11 22:12:30 +00:00
|
|
|
/* applyModifier */ applyModifier,
|
2011-03-05 10:29:10 +00:00
|
|
|
/* applyModifierEM */ NULL,
|
2010-04-11 22:12:30 +00:00
|
|
|
/* initData */ initData,
|
2011-03-05 10:29:10 +00:00
|
|
|
/* requiredDataMask */ NULL,
|
|
|
|
/* freeData */ NULL,
|
|
|
|
/* isDisabled */ NULL,
|
|
|
|
/* updateDepgraph */ NULL,
|
|
|
|
/* dependsOnTime */ NULL,
|
|
|
|
/* dependsOnNormals */ NULL,
|
|
|
|
/* foreachObjectLink */ NULL,
|
|
|
|
/* foreachIDLink */ NULL,
|
2011-08-12 18:11:22 +00:00
|
|
|
/* foreachTexLink */ NULL,
|
2010-04-11 22:12:30 +00:00
|
|
|
};
|