diff options
-rw-r--r-- | source/blender/blenkernel/BKE_crazyspace.h | 54 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_paint.h | 11 | ||||
-rw-r--r-- | source/blender/blenkernel/CMakeLists.txt | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/crazyspace.c (renamed from source/blender/editors/util/crazyspace.c) | 7 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/paint.c | 241 | ||||
-rw-r--r-- | source/blender/editors/include/ED_sculpt.h | 7 | ||||
-rw-r--r-- | source/blender/editors/include/ED_util.h | 8 | ||||
-rw-r--r-- | source/blender/editors/object/object_modifier.c | 2 | ||||
-rw-r--r-- | source/blender/editors/sculpt_paint/sculpt.c | 231 | ||||
-rw-r--r-- | source/blender/editors/sculpt_paint/sculpt_intern.h | 5 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_conversions.c | 2 | ||||
-rw-r--r-- | source/blender/editors/util/CMakeLists.txt | 1 |
13 files changed, 317 insertions, 259 deletions
diff --git a/source/blender/blenkernel/BKE_crazyspace.h b/source/blender/blenkernel/BKE_crazyspace.h new file mode 100644 index 00000000000..89cbd9ec119 --- /dev/null +++ b/source/blender/blenkernel/BKE_crazyspace.h @@ -0,0 +1,54 @@ +/* + * ***** 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) 2008 Blender Foundation. + * All rights reserved. + * + * + * Contributor(s): Blender Foundation + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file BKE_crazyspace.h + * \ingroup bke + */ + +#ifndef __BKE_CRAZYSPACE_H__ +#define __BKE_CRAZYSPACE_H__ + +#ifdef __cplusplus +extern "C" { +#endif +struct Scene; +struct Object; +struct BMEditMesh; +struct Mesh; + +/* crazyspace.c */ +float (*crazyspace_get_mapped_editverts(struct Scene *scene, struct Object *obedit))[3]; +void crazyspace_set_quats_editmesh(struct BMEditMesh *em, float (*origcos)[3], float (*mappedcos)[3], float (*quats)[4], + const bool use_select); +void crazyspace_set_quats_mesh(struct Mesh *me, float (*origcos)[3], float (*mappedcos)[3], float (*quats)[4]); +int sculpt_get_first_deform_matrices(struct Scene *scene, struct Object *ob, float (**deformmats)[3][3], float (**deformcos)[3]); +void crazyspace_build_sculpt(struct Scene *scene, struct Object *ob, float (**deformmats)[3][3], float (**deformcos)[3]); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h index df72cb988b1..cb521382bd3 100644 --- a/source/blender/blenkernel/BKE_paint.h +++ b/source/blender/blenkernel/BKE_paint.h @@ -47,6 +47,7 @@ struct Object; struct Paint; struct PBVH; struct Scene; +struct Sculpt; struct StrokeCache; struct Tex; struct ImagePool; @@ -176,4 +177,14 @@ void free_sculptsession(struct Object *ob); void free_sculptsession_deformMats(struct SculptSession *ss); void sculptsession_bm_to_me(struct Object *ob, bool reorder); void sculptsession_bm_to_me_for_render(struct Object *object); +void sculpt_update_mesh_elements(struct Scene *scene, struct Sculpt *sd, struct Object *ob, + bool need_pmap, bool need_mask); +struct MultiresModifierData *sculpt_multires_active(struct Scene *scene, struct Object *ob); +int ED_sculpt_mask_layers_ensure(struct Object *ob, + struct MultiresModifierData *mmd); + +enum { + ED_SCULPT_MASK_LAYER_CALC_VERT = (1 << 0), + ED_SCULPT_MASK_LAYER_CALC_LOOP = (1 << 1) +}; #endif diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index 749a5eb408d..0caf7d11c55 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -78,7 +78,8 @@ set(SRC intern/colortools.c intern/constraint.c intern/context.c - intern/curve.c + intern/crazyspace.c + intern/curve.c intern/customdata.c intern/customdata_file.c intern/deform.c @@ -191,6 +192,7 @@ set(SRC BKE_colortools.h BKE_constraint.h BKE_context.h + BKE_crazyspace.h BKE_curve.h BKE_customdata.h BKE_customdata_file.h diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 26cc70e1089..228f4ce7730 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -2251,7 +2251,8 @@ static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask, if ((ob->mode & OB_MODE_SCULPT) && ob->sculpt) { /* create PBVH immediately (would be created on the fly too, * but this avoids waiting on first stroke) */ - ob->sculpt->pbvh = ob->derivedFinal->getPBVH(ob, ob->derivedFinal); + + sculpt_update_mesh_elements(scene, scene->toolsettings->sculpt, ob, false, false); } BLI_assert(!(ob->derivedFinal->dirty & DM_DIRTY_NORMALS)); diff --git a/source/blender/editors/util/crazyspace.c b/source/blender/blenkernel/intern/crazyspace.c index b90cfad28a5..610a0fe0fbc 100644 --- a/source/blender/editors/util/crazyspace.c +++ b/source/blender/blenkernel/intern/crazyspace.c @@ -25,8 +25,8 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/editors/util/crazyspace.c - * \ingroup edutil +/** \file blender/blenkernel/intern/crazyspace.c + * \ingroup bke */ @@ -42,14 +42,13 @@ #include "BLI_math.h" #include "BLI_bitmap.h" +#include "BKE_crazyspace.h" #include "BKE_DerivedMesh.h" #include "BKE_modifier.h" #include "BKE_multires.h" #include "BKE_mesh.h" #include "BKE_editmesh.h" -#include "ED_util.h" - typedef struct { float (*vertexcos)[3]; BLI_bitmap *vertex_visit; diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c index 1189b5715bb..d5059566dab 100644 --- a/source/blender/blenkernel/intern/paint.c +++ b/source/blender/blenkernel/intern/paint.c @@ -37,6 +37,7 @@ #include "DNA_object_types.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" +#include "DNA_modifier_types.h" #include "DNA_scene_types.h" #include "DNA_brush_types.h" #include "DNA_space_types.h" @@ -47,10 +48,14 @@ #include "BKE_brush.h" #include "BKE_context.h" +#include "BKE_crazyspace.h" #include "BKE_depsgraph.h" #include "BKE_global.h" #include "BKE_image.h" +#include "BKE_key.h" #include "BKE_library.h" +#include "BKE_mesh.h" +#include "BKE_modifier.h" #include "BKE_object.h" #include "BKE_paint.h" #include "BKE_pbvh.h" @@ -499,3 +504,239 @@ void free_sculptsession(Object *ob) ob->sculpt = NULL; } } + +/* Sculpt mode handles multires differently from regular meshes, but only if + * it's the last modifier on the stack and it is not on the first level */ +MultiresModifierData *sculpt_multires_active(Scene *scene, Object *ob) +{ + Mesh *me = (Mesh *)ob->data; + ModifierData *md; + VirtualModifierData virtualModifierData; + + if (ob->sculpt && ob->sculpt->bm) { + /* can't combine multires and dynamic topology */ + return NULL; + } + + if (!CustomData_get_layer(&me->ldata, CD_MDISPS)) { + /* multires can't work without displacement layer */ + return NULL; + } + + for (md = modifiers_getVirtualModifierList(ob, &virtualModifierData); md; md = md->next) { + if (md->type == eModifierType_Multires) { + MultiresModifierData *mmd = (MultiresModifierData *)md; + + if (!modifier_isEnabled(scene, md, eModifierMode_Realtime)) + continue; + + if (mmd->sculptlvl > 0) return mmd; + else return NULL; + } + } + + return NULL; +} + + +/* Checks if there are any supported deformation modifiers active */ +static bool sculpt_modifiers_active(Scene *scene, Sculpt *sd, Object *ob) +{ + ModifierData *md; + Mesh *me = (Mesh *)ob->data; + MultiresModifierData *mmd = sculpt_multires_active(scene, ob); + VirtualModifierData virtualModifierData; + + if (mmd || ob->sculpt->bm) + return 0; + + /* non-locked shape keys could be handled in the same way as deformed mesh */ + if ((ob->shapeflag & OB_SHAPE_LOCK) == 0 && me->key && ob->shapenr) + return 1; + + md = modifiers_getVirtualModifierList(ob, &virtualModifierData); + + /* exception for shape keys because we can edit those */ + for (; md; md = md->next) { + ModifierTypeInfo *mti = modifierType_getInfo(md->type); + if (!modifier_isEnabled(scene, md, eModifierMode_Realtime)) continue; + if (md->type == eModifierType_ShapeKey) continue; + + if (mti->type == eModifierTypeType_OnlyDeform) return 1; + else if ((sd->flags & SCULPT_ONLY_DEFORM) == 0) return 1; + } + + return 0; +} + +/** + * \param need_mask So the DerivedMesh thats returned has mask data + */ +void sculpt_update_mesh_elements(Scene *scene, Sculpt *sd, Object *ob, + bool need_pmap, bool need_mask) +{ + DerivedMesh *dm; + SculptSession *ss = ob->sculpt; + Mesh *me = ob->data; + MultiresModifierData *mmd = sculpt_multires_active(scene, ob); + + ss->modifiers_active = sculpt_modifiers_active(scene, sd, ob); + ss->show_diffuse_color = (sd->flags & SCULPT_SHOW_DIFFUSE) != 0; + + if (need_mask) { + if (mmd == NULL) { + if (!CustomData_has_layer(&me->vdata, CD_PAINT_MASK)) { + ED_sculpt_mask_layers_ensure(ob, NULL); + } + } + else { + if (!CustomData_has_layer(&me->ldata, CD_GRID_PAINT_MASK)) { +#if 1 + ED_sculpt_mask_layers_ensure(ob, mmd); +#else /* if we wanted to support adding mask data while multi-res painting, we would need to do this */ + if ((ED_sculpt_mask_layers_ensure(ob, mmd) & ED_SCULPT_MASK_LAYER_CALC_LOOP)) { + /* remake the derived mesh */ + ob->recalc |= OB_RECALC_DATA; + BKE_object_handle_update(scene, ob); + } +#endif + } + } + } + + /* BMESH ONLY --- at some point we should move sculpt code to use polygons only - but for now it needs tessfaces */ + BKE_mesh_tessface_ensure(me); + + if (!mmd) ss->kb = BKE_keyblock_from_object(ob); + else ss->kb = NULL; + + /* needs to be called after we ensure tessface */ + dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH); + + if (mmd) { + ss->multires = mmd; + ss->totvert = dm->getNumVerts(dm); + ss->totpoly = dm->getNumPolys(dm); + ss->mvert = NULL; + ss->mpoly = NULL; + ss->mloop = NULL; + ss->face_normals = NULL; + } + else { + ss->totvert = me->totvert; + ss->totpoly = me->totpoly; + ss->mvert = me->mvert; + ss->mpoly = me->mpoly; + ss->mloop = me->mloop; + ss->face_normals = NULL; + ss->multires = NULL; + ss->vmask = CustomData_get_layer(&me->vdata, CD_PAINT_MASK); + } + + ss->pbvh = dm->getPBVH(ob, dm); + ss->pmap = (need_pmap && dm->getPolyMap) ? dm->getPolyMap(ob, dm) : NULL; + + pbvh_show_diffuse_color_set(ss->pbvh, ss->show_diffuse_color); + + if (ss->modifiers_active) { + if (!ss->orig_cos) { + int a; + + free_sculptsession_deformMats(ss); + + ss->orig_cos = (ss->kb) ? BKE_key_convert_to_vertcos(ob, ss->kb) : BKE_mesh_vertexCos_get(me, NULL); + + crazyspace_build_sculpt(scene, ob, &ss->deform_imats, &ss->deform_cos); + BKE_pbvh_apply_vertCos(ss->pbvh, ss->deform_cos); + + for (a = 0; a < me->totvert; ++a) { + invert_m3(ss->deform_imats[a]); + } + } + } + else { + free_sculptsession_deformMats(ss); + } + + /* if pbvh is deformed, key block is already applied to it */ + if (ss->kb && !BKE_pbvh_isDeformed(ss->pbvh)) { + float (*vertCos)[3] = BKE_key_convert_to_vertcos(ob, ss->kb); + + if (vertCos) { + /* apply shape keys coordinates to PBVH */ + BKE_pbvh_apply_vertCos(ss->pbvh, vertCos); + MEM_freeN(vertCos); + } + } +} + +int ED_sculpt_mask_layers_ensure(Object *ob, MultiresModifierData *mmd) +{ + const float *paint_mask; + Mesh *me = ob->data; + int ret = 0; + + paint_mask = CustomData_get_layer(&me->vdata, CD_PAINT_MASK); + + /* if multires is active, create a grid paint mask layer if there + * isn't one already */ + if (mmd && !CustomData_has_layer(&me->ldata, CD_GRID_PAINT_MASK)) { + GridPaintMask *gmask; + int level = max_ii(1, mmd->sculptlvl); + int gridsize = BKE_ccg_gridsize(level); + int gridarea = gridsize * gridsize; + int i, j; + + gmask = CustomData_add_layer(&me->ldata, CD_GRID_PAINT_MASK, + CD_CALLOC, NULL, me->totloop); + + for (i = 0; i < me->totloop; i++) { + GridPaintMask *gpm = &gmask[i]; + + gpm->level = level; + gpm->data = MEM_callocN(sizeof(float) * gridarea, + "GridPaintMask.data"); + } + + /* if vertices already have mask, copy into multires data */ + if (paint_mask) { + for (i = 0; i < me->totpoly; i++) { + const MPoly *p = &me->mpoly[i]; + float avg = 0; + + /* mask center */ + for (j = 0; j < p->totloop; j++) { + const MLoop *l = &me->mloop[p->loopstart + j]; + avg += paint_mask[l->v]; + } + avg /= (float)p->totloop; + + /* fill in multires mask corner */ + for (j = 0; j < p->totloop; j++) { + GridPaintMask *gpm = &gmask[p->loopstart + j]; + const MLoop *l = &me->mloop[p->loopstart + j]; + const MLoop *prev = ME_POLY_LOOP_PREV(me->mloop, p, j); + const MLoop *next = ME_POLY_LOOP_NEXT(me->mloop, p, j); + + gpm->data[0] = avg; + gpm->data[1] = (paint_mask[l->v] + + paint_mask[next->v]) * 0.5f; + gpm->data[2] = (paint_mask[l->v] + + paint_mask[prev->v]) * 0.5f; + gpm->data[3] = paint_mask[l->v]; + } + } + } + + ret |= ED_SCULPT_MASK_LAYER_CALC_LOOP; + } + + /* create vertex paint mask layer if there isn't one already */ + if (!paint_mask) { + CustomData_add_layer(&me->vdata, CD_PAINT_MASK, + CD_CALLOC, NULL, me->totvert); + ret |= ED_SCULPT_MASK_LAYER_CALC_VERT; + } + + return ret; +} diff --git a/source/blender/editors/include/ED_sculpt.h b/source/blender/editors/include/ED_sculpt.h index ab8a65e9ef9..8fcb228803b 100644 --- a/source/blender/editors/include/ED_sculpt.h +++ b/source/blender/editors/include/ED_sculpt.h @@ -46,15 +46,8 @@ void sculpt_get_redraw_planes(float planes[4][4], struct ARegion *ar, struct RegionView3D *rv3d, struct Object *ob); void ED_sculpt_get_average_stroke(struct Object *ob, float stroke[3]); bool ED_sculpt_minmax(struct bContext *C, float min[3], float max[3]); -int ED_sculpt_mask_layers_ensure(struct Object *ob, - struct MultiresModifierData *mmd); int do_sculpt_mask_box_select(struct ViewContext *vc, struct rcti *rect, bool select, bool extend); -enum { - ED_SCULPT_MASK_LAYER_CALC_VERT = (1 << 0), - ED_SCULPT_MASK_LAYER_CALC_LOOP = (1 << 1) -}; - /* paint_ops.c */ void ED_operatortypes_paint(void); void ED_keymap_paint(struct wmKeyConfig *keyconf); diff --git a/source/blender/editors/include/ED_util.h b/source/blender/editors/include/ED_util.h index f268595ff52..6d9f1c4eda0 100644 --- a/source/blender/editors/include/ED_util.h +++ b/source/blender/editors/include/ED_util.h @@ -79,14 +79,6 @@ void undo_editmode_push(struct bContext *C, const char *name, void undo_editmode_clear(void); -/* crazyspace.c */ -float (*crazyspace_get_mapped_editverts(struct Scene *scene, struct Object *obedit))[3]; -void crazyspace_set_quats_editmesh(struct BMEditMesh *em, float (*origcos)[3], float (*mappedcos)[3], float (*quats)[4], - const bool use_select); -void crazyspace_set_quats_mesh(struct Mesh *me, float (*origcos)[3], float (*mappedcos)[3], float (*quats)[4]); -int sculpt_get_first_deform_matrices(struct Scene *scene, struct Object *ob, float (**deformmats)[3][3], float (**deformcos)[3]); -void crazyspace_build_sculpt(struct Scene *scene, struct Object *ob, float (**deformmats)[3][3], float (**deformcos)[3]); - /* cut-paste buffer free */ void ED_clipboard_posebuf_free(void); diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index 5dfcbc69640..c24e7746abb 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -69,6 +69,7 @@ #include "BKE_report.h" #include "BKE_object.h" #include "BKE_ocean.h" +#include "BKE_paint.h" #include "BKE_particle.h" #include "BKE_softbody.h" #include "BKE_editmesh.h" @@ -80,7 +81,6 @@ #include "ED_armature.h" #include "ED_object.h" #include "ED_screen.h" -#include "ED_sculpt.h" #include "ED_mesh.h" #include "WM_api.h" diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index 4a1a65832e6..3cd8cbab783 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -55,6 +55,7 @@ #include "BKE_brush.h" #include "BKE_ccg.h" #include "BKE_context.h" +#include "BKE_crazyspace.h" #include "BKE_depsgraph.h" #include "BKE_image.h" #include "BKE_key.h" @@ -76,7 +77,6 @@ #include "ED_object.h" #include "ED_screen.h" #include "ED_view3d.h" -#include "ED_util.h" /* for crazyspace correction */ #include "paint_intern.h" #include "sculpt_intern.h" @@ -137,38 +137,6 @@ bool ED_sculpt_minmax(bContext *C, float min[3], float max[3]) } } -/* Sculpt mode handles multires differently from regular meshes, but only if - * it's the last modifier on the stack and it is not on the first level */ -MultiresModifierData *sculpt_multires_active(Scene *scene, Object *ob) -{ - Mesh *me = (Mesh *)ob->data; - ModifierData *md; - VirtualModifierData virtualModifierData; - - if (ob->sculpt && ob->sculpt->bm) { - /* can't combine multires and dynamic topology */ - return NULL; - } - - if (!CustomData_get_layer(&me->ldata, CD_MDISPS)) { - /* multires can't work without displacement layer */ - return NULL; - } - - for (md = modifiers_getVirtualModifierList(ob, &virtualModifierData); md; md = md->next) { - if (md->type == eModifierType_Multires) { - MultiresModifierData *mmd = (MultiresModifierData *)md; - - if (!modifier_isEnabled(scene, md, eModifierMode_Realtime)) - continue; - - if (mmd->sculptlvl > 0) return mmd; - else return NULL; - } - } - - return NULL; -} /* Check if there are any active modifiers in stack (used for flushing updates at enter/exit sculpt mode) */ static bool sculpt_has_active_modifiers(Scene *scene, Object *ob) @@ -187,35 +155,7 @@ static bool sculpt_has_active_modifiers(Scene *scene, Object *ob) return 0; } -/* Checks if there are any supported deformation modifiers active */ -static bool sculpt_modifiers_active(Scene *scene, Sculpt *sd, Object *ob) -{ - ModifierData *md; - Mesh *me = (Mesh *)ob->data; - MultiresModifierData *mmd = sculpt_multires_active(scene, ob); - VirtualModifierData virtualModifierData; - - if (mmd || ob->sculpt->bm) - return 0; - - /* non-locked shape keys could be handled in the same way as deformed mesh */ - if ((ob->shapeflag & OB_SHAPE_LOCK) == 0 && me->key && ob->shapenr) - return 1; - - md = modifiers_getVirtualModifierList(ob, &virtualModifierData); - - /* exception for shape keys because we can edit those */ - for (; md; md = md->next) { - ModifierTypeInfo *mti = modifierType_getInfo(md->type); - if (!modifier_isEnabled(scene, md, eModifierMode_Realtime)) continue; - if (md->type == eModifierType_ShapeKey) continue; - - if (mti->type == eModifierTypeType_OnlyDeform) return 1; - else if ((sd->flags & SCULPT_ONLY_DEFORM) == 0) return 1; - } - return 0; -} typedef enum StrokeFlags { CLIP_X = 1, @@ -3561,106 +3501,7 @@ static void sculpt_update_tex(const Scene *scene, Sculpt *sd, SculptSession *ss) } } -/** - * \param need_mask So the DerivedMesh thats returned has mask data - */ -void sculpt_update_mesh_elements(Scene *scene, Sculpt *sd, Object *ob, - bool need_pmap, bool need_mask) -{ - DerivedMesh *dm; - SculptSession *ss = ob->sculpt; - Mesh *me = ob->data; - MultiresModifierData *mmd = sculpt_multires_active(scene, ob); - - ss->modifiers_active = sculpt_modifiers_active(scene, sd, ob); - ss->show_diffuse_color = (sd->flags & SCULPT_SHOW_DIFFUSE) != 0; - if (need_mask) { - if (mmd == NULL) { - if (!CustomData_has_layer(&me->vdata, CD_PAINT_MASK)) { - ED_sculpt_mask_layers_ensure(ob, NULL); - } - } - else { - if (!CustomData_has_layer(&me->ldata, CD_GRID_PAINT_MASK)) { -#if 1 - ED_sculpt_mask_layers_ensure(ob, mmd); -#else /* if we wanted to support adding mask data while multi-res painting, we would need to do this */ - if ((ED_sculpt_mask_layers_ensure(ob, mmd) & ED_SCULPT_MASK_LAYER_CALC_LOOP)) { - /* remake the derived mesh */ - ob->recalc |= OB_RECALC_DATA; - BKE_object_handle_update(scene, ob); - } -#endif - } - } - } - - /* BMESH ONLY --- at some point we should move sculpt code to use polygons only - but for now it needs tessfaces */ - BKE_mesh_tessface_ensure(me); - - if (!mmd) ss->kb = BKE_keyblock_from_object(ob); - else ss->kb = NULL; - - /* needs to be called after we ensure tessface */ - dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH); - - if (mmd) { - ss->multires = mmd; - ss->totvert = dm->getNumVerts(dm); - ss->totpoly = dm->getNumPolys(dm); - ss->mvert = NULL; - ss->mpoly = NULL; - ss->mloop = NULL; - ss->face_normals = NULL; - } - else { - ss->totvert = me->totvert; - ss->totpoly = me->totpoly; - ss->mvert = me->mvert; - ss->mpoly = me->mpoly; - ss->mloop = me->mloop; - ss->face_normals = NULL; - ss->multires = NULL; - ss->vmask = CustomData_get_layer(&me->vdata, CD_PAINT_MASK); - } - - ss->pbvh = dm->getPBVH(ob, dm); - ss->pmap = (need_pmap && dm->getPolyMap) ? dm->getPolyMap(ob, dm) : NULL; - - pbvh_show_diffuse_color_set(ss->pbvh, ss->show_diffuse_color); - - if (ss->modifiers_active) { - if (!ss->orig_cos) { - int a; - - free_sculptsession_deformMats(ss); - - ss->orig_cos = (ss->kb) ? BKE_key_convert_to_vertcos(ob, ss->kb) : BKE_mesh_vertexCos_get(me, NULL); - - crazyspace_build_sculpt(scene, ob, &ss->deform_imats, &ss->deform_cos); - BKE_pbvh_apply_vertCos(ss->pbvh, ss->deform_cos); - - for (a = 0; a < me->totvert; ++a) { - invert_m3(ss->deform_imats[a]); - } - } - } - else { - free_sculptsession_deformMats(ss); - } - - /* if pbvh is deformed, key block is already applied to it */ - if (ss->kb && !BKE_pbvh_isDeformed(ss->pbvh)) { - float (*vertCos)[3] = BKE_key_convert_to_vertcos(ob, ss->kb); - - if (vertCos) { - /* apply shape keys coordinates to PBVH */ - BKE_pbvh_apply_vertCos(ss->pbvh, vertCos); - MEM_freeN(vertCos); - } - } -} int sculpt_mode_poll(bContext *C) { @@ -5109,76 +4950,6 @@ static void sculpt_init_session(Scene *scene, Object *ob) sculpt_update_mesh_elements(scene, scene->toolsettings->sculpt, ob, 0, false); } -int ED_sculpt_mask_layers_ensure(Object *ob, MultiresModifierData *mmd) -{ - const float *paint_mask; - Mesh *me = ob->data; - int ret = 0; - - paint_mask = CustomData_get_layer(&me->vdata, CD_PAINT_MASK); - - /* if multires is active, create a grid paint mask layer if there - * isn't one already */ - if (mmd && !CustomData_has_layer(&me->ldata, CD_GRID_PAINT_MASK)) { - GridPaintMask *gmask; - int level = max_ii(1, mmd->sculptlvl); - int gridsize = BKE_ccg_gridsize(level); - int gridarea = gridsize * gridsize; - int i, j; - - gmask = CustomData_add_layer(&me->ldata, CD_GRID_PAINT_MASK, - CD_CALLOC, NULL, me->totloop); - - for (i = 0; i < me->totloop; i++) { - GridPaintMask *gpm = &gmask[i]; - - gpm->level = level; - gpm->data = MEM_callocN(sizeof(float) * gridarea, - "GridPaintMask.data"); - } - - /* if vertices already have mask, copy into multires data */ - if (paint_mask) { - for (i = 0; i < me->totpoly; i++) { - const MPoly *p = &me->mpoly[i]; - float avg = 0; - - /* mask center */ - for (j = 0; j < p->totloop; j++) { - const MLoop *l = &me->mloop[p->loopstart + j]; - avg += paint_mask[l->v]; - } - avg /= (float)p->totloop; - - /* fill in multires mask corner */ - for (j = 0; j < p->totloop; j++) { - GridPaintMask *gpm = &gmask[p->loopstart + j]; - const MLoop *l = &me->mloop[p->loopstart + j]; - const MLoop *prev = ME_POLY_LOOP_PREV(me->mloop, p, j); - const MLoop *next = ME_POLY_LOOP_NEXT(me->mloop, p, j); - - gpm->data[0] = avg; - gpm->data[1] = (paint_mask[l->v] + - paint_mask[next->v]) * 0.5f; - gpm->data[2] = (paint_mask[l->v] + - paint_mask[prev->v]) * 0.5f; - gpm->data[3] = paint_mask[l->v]; - } - } - } - - ret |= ED_SCULPT_MASK_LAYER_CALC_LOOP; - } - - /* create vertex paint mask layer if there isn't one already */ - if (!paint_mask) { - CustomData_add_layer(&me->vdata, CD_PAINT_MASK, - CD_CALLOC, NULL, me->totvert); - ret |= ED_SCULPT_MASK_LAYER_CALC_VERT; - } - - return ret; -} static int sculpt_mode_toggle_exec(bContext *C, wmOperator *op) { diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h index a4d2f0dc057..cd79f525d82 100644 --- a/source/blender/editors/sculpt_paint/sculpt_intern.h +++ b/source/blender/editors/sculpt_paint/sculpt_intern.h @@ -51,16 +51,11 @@ struct Sculpt; struct SculptStroke; struct SculptUndoNode; -/* Interface */ -struct MultiresModifierData *sculpt_multires_active(struct Scene *scene, struct Object *ob); - int sculpt_mode_poll(struct bContext *C); int sculpt_mode_poll_view3d(struct bContext *C); /* checks for a brush, not just sculpt mode */ int sculpt_poll(struct bContext *C); int sculpt_poll_view3d(struct bContext *C); -void sculpt_update_mesh_elements(struct Scene *scene, struct Sculpt *sd, struct Object *ob, - bool need_pmap, bool need_mask); /* Stroke */ bool sculpt_stroke_get_location(bContext *C, float out[3], const float mouse[2]); diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index c3a8784b6d3..0685561fab9 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -64,6 +64,7 @@ #include "BKE_armature.h" #include "BKE_constraint.h" #include "BKE_context.h" +#include "BKE_crazyspace.h" #include "BKE_curve.h" #include "BKE_depsgraph.h" #include "BKE_fcurve.h" @@ -104,7 +105,6 @@ #include "ED_uvedit.h" #include "ED_clip.h" #include "ED_mask.h" -#include "ED_util.h" /* for crazyspace correction */ #include "WM_api.h" /* for WM_event_add_notifier to deal with stabilization nodes */ #include "WM_types.h" diff --git a/source/blender/editors/util/CMakeLists.txt b/source/blender/editors/util/CMakeLists.txt index 95e01d8e454..3c051586282 100644 --- a/source/blender/editors/util/CMakeLists.txt +++ b/source/blender/editors/util/CMakeLists.txt @@ -40,7 +40,6 @@ set(SRC editmode_undo.c numinput.c undo.c - crazyspace.c util_intern.h # general includes |