Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2011-02-12 20:51:02 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2011-02-12 20:51:02 +0300
commitd909e61d99d760e9c5ae0c9e29804ac609bf7b5f (patch)
tree046c921a0670861cd0aca6813700001e052c19f9 /source/blender/blenkernel
parent673ac43f2ef06002d67f266ad2066b722654b5fc (diff)
Sculpting on deformed mesh
========================== Removed limitation of armatured-only objects for sculpting -- now all deformation modifiers are allowed in sculpt mode. Use crazyspace corrections like from transformation modules was used to support all deformation modifiers. Internal change: all crazyspace-related functions were noved to crazyspace.c P.S. Brush could make quite unexpected deformation for meshes which are deformed in specified way. Got patch for this and discussing with Brecht if it's really needed or maybe it could be done in better way.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_DerivedMesh.h5
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c107
2 files changed, 4 insertions, 108 deletions
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index e7ce3f27431..79e9b11d4db 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -512,8 +512,9 @@ void makeDerivedMesh(struct Scene *scene, struct Object *ob, struct EditMesh *em
int editmesh_get_first_deform_matrices(struct Scene *, struct Object *, struct EditMesh *em,
float (**deformmats)[3][3], float (**deformcos)[3]);
-/* returns an array of deform matrices for crazyspace correction when sculpting */
-void sculpt_get_deform_matrices(struct Scene *scene, struct Object *ob,
+/* returns an array of deform matrices for crazyspace correction when sculpting,
+ and the number of modifiers left */
+int sculpt_get_deform_matrices(struct Scene *scene, struct Object *ob,
float (**deformmats)[3][3], float (**deformcos)[3]);
void weight_to_rgb(float input, float *fr, float *fg, float *fb);
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index be9cda6c58f..eedc2636991 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -1721,12 +1721,6 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
if(useDeform < 0 && mti->dependsOnTime && mti->dependsOnTime(md)) continue;
if(mti->type == eModifierTypeType_OnlyDeform) {
- if(sculpt_mode && !has_multires)
- if(!ELEM(md->type, eModifierType_Armature, eModifierType_ShapeKey)) {
- modifier_setError(md, "Not supported in sculpt mode.");
- continue;
- }
-
if(!deformedVerts)
deformedVerts = mesh_getVertexCos(me, &numVerts);
@@ -1780,7 +1774,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
continue;
}
if(sculpt_mode && (!has_multires || multires_applied))
- if(md->type != eModifierType_Armature || multires_applied) {
+ if(mti->type != eModifierTypeType_OnlyDeform || multires_applied) {
modifier_setError(md, "Not supported in sculpt mode.");
continue;
}
@@ -2485,105 +2479,6 @@ float *mesh_get_mapped_verts_nors(Scene *scene, Object *ob)
return vertexcosnos;
}
-/* ********* crazyspace *************** */
-
-int editmesh_get_first_deform_matrices(Scene *scene, Object *ob, EditMesh *em, float (**deformmats)[3][3], float (**deformcos)[3])
-{
- ModifierData *md;
- DerivedMesh *dm;
- int i, a, numleft = 0, numVerts = 0;
- int cageIndex = modifiers_getCageIndex(scene, ob, NULL, 1);
- float (*defmats)[3][3] = NULL, (*deformedVerts)[3] = NULL;
-
- modifiers_clearErrors(ob);
-
- dm = NULL;
- md = modifiers_getVirtualModifierList(ob);
-
- /* compute the deformation matrices and coordinates for the first
- modifiers with on cage editing that are enabled and support computing
- deform matrices */
- for(i = 0; md && i <= cageIndex; i++, md = md->next) {
- ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-
- if(!editmesh_modifier_is_enabled(scene, md, dm))
- continue;
-
- if(mti->type==eModifierTypeType_OnlyDeform && mti->deformMatricesEM) {
- if(!defmats) {
- dm= editmesh_get_derived(em, NULL);
- deformedVerts= editmesh_get_vertex_cos(em, &numVerts);
- defmats= MEM_callocN(sizeof(*defmats)*numVerts, "defmats");
-
- for(a=0; a<numVerts; a++)
- unit_m3(defmats[a]);
- }
-
- mti->deformMatricesEM(md, ob, em, dm, deformedVerts, defmats,
- numVerts);
- }
- else
- break;
- }
-
- for(; md && i <= cageIndex; md = md->next, i++)
- if(editmesh_modifier_is_enabled(scene, md, dm) && modifier_isCorrectableDeformed(md))
- numleft++;
-
- if(dm)
- dm->release(dm);
-
- *deformmats= defmats;
- *deformcos= deformedVerts;
-
- return numleft;
-}
-
-void sculpt_get_deform_matrices(Scene *scene, Object *ob, float (**deformmats)[3][3], float (**deformcos)[3])
-{
- ModifierData *md;
- DerivedMesh *dm;
- int a, numVerts= 0;
- float (*defmats)[3][3]= NULL, (*deformedVerts)[3]= NULL;
- MultiresModifierData *mmd= get_multires_modifier(scene, ob, 0);
- int has_multires = mmd != NULL && mmd->sculptlvl > 0;
-
- if(has_multires) {
- *deformmats= NULL;
- *deformcos= NULL;
- return;
- }
-
- dm= NULL;
- md= modifiers_getVirtualModifierList(ob);
-
- for(; md; md= md->next) {
- ModifierTypeInfo *mti= modifierType_getInfo(md->type);
-
- if(!modifier_isEnabled(scene, md, eModifierMode_Realtime)) continue;
-
- if(mti->type==eModifierTypeType_OnlyDeform && mti->deformMatrices) {
- if(!defmats) {
- Mesh *me= (Mesh*)ob->data;
- dm= mesh_create_derived(me, ob, NULL);
- deformedVerts= mesh_getVertexCos(me, &numVerts);
- defmats= MEM_callocN(sizeof(*defmats)*numVerts, "defmats");
-
- for(a=0; a<numVerts; a++)
- unit_m3(defmats[a]);
- }
-
- mti->deformMatrices(md, ob, dm, deformedVerts, defmats, numVerts);
- }
- }
-
- if(dm)
- dm->release(dm);
-
- *deformmats= defmats;
- *deformcos= deformedVerts;
-}
-
/* ******************* GLSL ******************** */
void DM_add_tangent_layer(DerivedMesh *dm)