=bmesh= modifiers can now be applied with shapekeys
This commit is contained in:
parent
d1c55039eb
commit
798e0b02c0
Notes:
blender-bot
2023-02-13 23:39:48 +01:00
Referenced by issue #103929, Applying Data Transfer Modifier - only the active Shape Key is taken into account
|
@ -446,7 +446,7 @@ int DM_release(DerivedMesh *dm);
|
|||
|
||||
/* utility function to convert a DerivedMesh to a Mesh
|
||||
*/
|
||||
void DM_to_mesh(DerivedMesh *dm, struct Mesh *me);
|
||||
void DM_to_mesh(DerivedMesh *dm, struct Mesh *me, struct Object *ob);
|
||||
|
||||
/* utility function to convert a DerivedMesh to a shape key block
|
||||
*/
|
||||
|
@ -585,7 +585,8 @@ DerivedMesh *mesh_get_derived_final(struct Scene *scene, struct Object *ob,
|
|||
DerivedMesh *mesh_get_derived_deform(struct Scene *scene, struct Object *ob,
|
||||
CustomDataMask dataMask);
|
||||
|
||||
DerivedMesh *mesh_create_derived_for_modifier(struct Scene *scene, struct Object *ob, struct ModifierData *md);
|
||||
DerivedMesh *mesh_create_derived_for_modifier(struct Scene *scene, struct Object *ob,
|
||||
struct ModifierData *md, int build_shapekey_layers);
|
||||
|
||||
DerivedMesh *mesh_create_derived_render(struct Scene *scene, struct Object *ob,
|
||||
CustomDataMask dataMask);
|
||||
|
@ -620,7 +621,8 @@ DerivedMesh *editbmesh_get_derived_cage_and_final(struct Scene *scene, struct Ob
|
|||
CustomDataMask dataMask);
|
||||
float (*editbmesh_get_vertex_cos(struct BMEditMesh *em, int *numVerts_r))[3];
|
||||
int editbmesh_modifier_is_enabled(struct Scene *scene, struct ModifierData *md, DerivedMesh *dm);
|
||||
void makeDerivedMesh(struct Scene *scene, struct Object *ob, struct BMEditMesh *em, CustomDataMask dataMask);
|
||||
void makeDerivedMesh(struct Scene *scene, struct Object *ob, struct BMEditMesh *em,
|
||||
CustomDataMask dataMask, int build_shapekey_layers);
|
||||
|
||||
/* returns an array of deform matrices for crazyspace correction, and the
|
||||
number of modifiers left */
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "limits.h"
|
||||
|
||||
#include "MEM_guardedalloc.h"
|
||||
|
||||
|
@ -77,7 +77,10 @@
|
|||
|
||||
#include "ED_sculpt.h" /* for ED_sculpt_modifiers_changed */
|
||||
|
||||
///////////////////////////////////
|
||||
static void add_shapekey_layers(DerivedMesh *dm, Mesh *me, Object *ob);
|
||||
static void shapekey_layers_to_keyblocks(DerivedMesh *dm, Mesh *me, int actshape_uid);
|
||||
|
||||
///////////////////////////////////
|
||||
///////////////////////////////////
|
||||
|
||||
static MVert *dm_getVertArray(DerivedMesh *dm)
|
||||
|
@ -364,13 +367,14 @@ void DM_DupPolys(DerivedMesh *source, DerivedMesh *target)
|
|||
target->numPolyData = source->getNumFaces(source);
|
||||
}
|
||||
|
||||
void DM_to_mesh(DerivedMesh *dm, Mesh *me)
|
||||
void DM_to_mesh(DerivedMesh *dm, Mesh *me, Object *ob)
|
||||
{
|
||||
/* dm might depend on me, so we need to do everything with a local copy */
|
||||
Mesh tmp = *me;
|
||||
DMFaceIter *iter;
|
||||
int totvert, totedge, totface, totloop, totpoly;
|
||||
|
||||
int did_shapekeys=0;
|
||||
|
||||
memset(&tmp.vdata, 0, sizeof(tmp.vdata));
|
||||
memset(&tmp.edata, 0, sizeof(tmp.edata));
|
||||
memset(&tmp.fdata, 0, sizeof(tmp.fdata));
|
||||
|
@ -396,6 +400,31 @@ void DM_to_mesh(DerivedMesh *dm, Mesh *me)
|
|||
CustomData_copy(&dm->loopData, &tmp.ldata, CD_MASK_MESH, CD_DUPLICATE, totloop);
|
||||
CustomData_copy(&dm->polyData, &tmp.pdata, CD_MASK_MESH, CD_DUPLICATE, totpoly);
|
||||
|
||||
if (CustomData_has_layer(&dm->vertData, CD_SHAPEKEY)) {
|
||||
KeyBlock *kb;
|
||||
int i=0;
|
||||
|
||||
if (ob) {
|
||||
for (kb=me->key->block.first; kb; kb=kb->next, i++) {
|
||||
if (i == ob->shapenr-1) {
|
||||
i = kb->uid;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!kb) {
|
||||
printf("error in DM_to_mesh: could not find active shapekey! eek!!\n");
|
||||
i = INT_MAX;
|
||||
}
|
||||
} else {
|
||||
/*if no object, set to INT_MAX so we don't mess up any shapekey layers*/
|
||||
i = INT_MAX;
|
||||
}
|
||||
|
||||
shapekey_layers_to_keyblocks(dm, me, i);
|
||||
did_shapekeys = 1;
|
||||
}
|
||||
|
||||
/* not all DerivedMeshes store their verts/edges/faces in CustomData, so
|
||||
we set them here in case they are missing */
|
||||
if(!CustomData_has_layer(&tmp.vdata, CD_MVERT))
|
||||
|
@ -409,10 +438,10 @@ void DM_to_mesh(DerivedMesh *dm, Mesh *me)
|
|||
|
||||
/* object had got displacement layer, should copy this layer to save sculpted data */
|
||||
/* NOTE: maybe some other layers should be copied? nazgul */
|
||||
if(CustomData_has_layer(&me->fdata, CD_MDISPS)) {
|
||||
if (totface == me->totface) {
|
||||
MDisps *mdisps = CustomData_get_layer(&me->fdata, CD_MDISPS);
|
||||
CustomData_add_layer(&tmp.fdata, CD_MDISPS, CD_DUPLICATE, mdisps, totface);
|
||||
if(CustomData_has_layer(&me->ldata, CD_MDISPS)) {
|
||||
if (totloop == me->totloop) {
|
||||
MDisps *mdisps = CustomData_get_layer(&me->ldata, CD_MDISPS);
|
||||
CustomData_add_layer(&tmp.ldata, CD_MDISPS, CD_DUPLICATE, mdisps, totloop);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -424,10 +453,10 @@ void DM_to_mesh(DerivedMesh *dm, Mesh *me)
|
|||
CustomData_free(&me->ldata, me->totloop);
|
||||
CustomData_free(&me->pdata, me->totpoly);
|
||||
|
||||
/* BMESH_TODO/XXX: ok, this should use new CD shapekey data,
|
||||
which shouuld be fed through the modifier
|
||||
stack*/
|
||||
if(tmp.totvert != me->totvert) {
|
||||
/* ok, this should now use new CD shapekey data,
|
||||
which shouuld be fed through the modifier
|
||||
stack*/
|
||||
if(tmp.totvert != me->totvert && !did_shapekeys) {
|
||||
printf("YEEK! this should be recoded! Shape key loss!!!\n");
|
||||
if(tmp.key) tmp.key->id.us--;
|
||||
tmp.key = NULL;
|
||||
|
@ -672,7 +701,8 @@ DerivedMesh *mesh_create_derived(Mesh *me, Object *ob, float (*vertCos)[3])
|
|||
|
||||
/***/
|
||||
|
||||
DerivedMesh *mesh_create_derived_for_modifier(Scene *scene, Object *ob, ModifierData *md)
|
||||
DerivedMesh *mesh_create_derived_for_modifier(Scene *scene, Object *ob,
|
||||
ModifierData *md, int build_shapekey_layers)
|
||||
{
|
||||
Mesh *me = ob->data;
|
||||
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
|
||||
|
@ -682,7 +712,11 @@ DerivedMesh *mesh_create_derived_for_modifier(Scene *scene, Object *ob, Modifier
|
|||
|
||||
if (!(md->mode&eModifierMode_Realtime)) return NULL;
|
||||
if (mti->isDisabled && mti->isDisabled(md, 0)) return NULL;
|
||||
|
||||
|
||||
if (build_shapekey_layers && me->key && ob->shapenr <= BLI_countlist(&me->key->block)) {
|
||||
key_to_mesh(BLI_findlink(&me->key->block, ob->shapenr-1), me);
|
||||
}
|
||||
|
||||
if (mti->type==eModifierTypeType_OnlyDeform) {
|
||||
int numVerts;
|
||||
float (*deformedVerts)[3] = mesh_getVertexCos(me, &numVerts);
|
||||
|
@ -690,9 +724,16 @@ DerivedMesh *mesh_create_derived_for_modifier(Scene *scene, Object *ob, Modifier
|
|||
mti->deformVerts(md, ob, NULL, deformedVerts, numVerts, 0, 0);
|
||||
dm = mesh_create_derived(me, ob, deformedVerts);
|
||||
|
||||
if (build_shapekey_layers)
|
||||
add_shapekey_layers(dm, me, ob);
|
||||
|
||||
MEM_freeN(deformedVerts);
|
||||
} else {
|
||||
DerivedMesh *tdm = mesh_create_derived(me, ob, NULL);
|
||||
|
||||
if (build_shapekey_layers)
|
||||
add_shapekey_layers(tdm, me, ob);
|
||||
|
||||
dm = mti->applyModifier(md, ob, tdm, 0, 0);
|
||||
|
||||
if(tdm != dm) tdm->release(tdm);
|
||||
|
@ -924,6 +965,92 @@ static void add_weight_mcol_dm(Object *ob, DerivedMesh *dm)
|
|||
dfiter->free(dfiter);
|
||||
}
|
||||
|
||||
|
||||
static void shapekey_layers_to_keyblocks(DerivedMesh *dm, Mesh *me, int actshape_uid)
|
||||
{
|
||||
KeyBlock *kb;
|
||||
int i, j, tot;
|
||||
|
||||
if (!me->key)
|
||||
return;
|
||||
|
||||
tot = CustomData_number_of_layers(&dm->vertData, CD_SHAPEKEY);
|
||||
for (i=0; i<tot; i++) {
|
||||
CustomDataLayer *layer = &dm->vertData.layers[CustomData_get_layer_index_n(&dm->vertData, CD_SHAPEKEY, i)];
|
||||
float (*cos)[3], (*kbcos)[3];
|
||||
|
||||
for (kb=me->key->block.first; kb; kb=kb->next) {
|
||||
if (kb->uid == layer->uid)
|
||||
break;
|
||||
}
|
||||
|
||||
if (!kb) {
|
||||
kb = add_keyblock(me->key, layer->name);
|
||||
kb->uid = layer->uid;
|
||||
}
|
||||
|
||||
if (kb->data)
|
||||
MEM_freeN(kb->data);
|
||||
|
||||
cos = CustomData_get_layer_n(&dm->vertData, CD_SHAPEKEY, i);
|
||||
kb->totelem = dm->numVertData;
|
||||
|
||||
kb->data = kbcos = MEM_mallocN(sizeof(float)*3*kb->totelem, "kbcos DerivedMesh.c");
|
||||
if (kb->uid == actshape_uid) {
|
||||
MVert *mvert = dm->getVertArray(dm);
|
||||
|
||||
for (j=0; j<dm->numVertData; j++, kbcos++, mvert++) {
|
||||
copy_v3_v3(*kbcos, mvert->co);
|
||||
}
|
||||
} else {
|
||||
for (j=0; j<kb->totelem; j++, cos++, kbcos++) {
|
||||
copy_v3_v3(*kbcos, *cos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (kb=me->key->block.first; kb; kb=kb->next) {
|
||||
if (kb->totelem != dm->numVertData) {
|
||||
if (kb->data)
|
||||
MEM_freeN(kb->data);
|
||||
|
||||
kb->totelem = dm->numVertData;
|
||||
kb->data = MEM_callocN(sizeof(float)*3*kb->totelem, "kb->data derivedmesh.c");
|
||||
printf("eek! lost a shapekey layer!\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void add_shapekey_layers(DerivedMesh *dm, Mesh *me, Object *ob)
|
||||
{
|
||||
KeyBlock *kb;
|
||||
Key *key = me->key;
|
||||
int a, b;
|
||||
|
||||
if (!me->key)
|
||||
return;
|
||||
|
||||
if (dm->numVertData != me->totvert) {
|
||||
printf("error in add_shapekey_layers: dm isn't the same size as me\n");
|
||||
return;
|
||||
}
|
||||
|
||||
for (a=0, kb=key->block.first; kb; kb=kb->next, a++) {
|
||||
float (*cos)[3] = CustomData_add_layer_named(&dm->vertData, CD_SHAPEKEY, CD_CALLOC, NULL, dm->numVertData, kb->name);
|
||||
int ci = CustomData_get_layer_index_n(&dm->vertData, CD_SHAPEKEY, a);
|
||||
|
||||
dm->vertData.layers[ci].uid = kb->uid;
|
||||
if (kb->totelem != dm->numVertData) {
|
||||
printf("error in add_shapekey_layers: totelem and totvert don't match");
|
||||
continue;
|
||||
}
|
||||
|
||||
for (b=0; b<kb->totelem; b++, cos++) {
|
||||
copy_v3_v3(cos, ((float*)kb->data)+b*3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* new value for useDeform -1 (hack for the gameengine):
|
||||
* - apply only the modifier stack of the object, skipping the virtual modifiers,
|
||||
* - don't apply the key
|
||||
|
@ -932,7 +1059,8 @@ static void add_weight_mcol_dm(Object *ob, DerivedMesh *dm)
|
|||
static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos)[3],
|
||||
DerivedMesh **deform_r, DerivedMesh **final_r,
|
||||
int useRenderParams, int useDeform,
|
||||
int needMapping, CustomDataMask dataMask, int index, int useCache)
|
||||
int needMapping, CustomDataMask dataMask,
|
||||
int index, int useCache, int build_shapekey_layers)
|
||||
{
|
||||
Mesh *me = ob->data;
|
||||
ModifierData *firstmd, *md;
|
||||
|
@ -1007,7 +1135,10 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
|
|||
*/
|
||||
if (deform_r) {
|
||||
*deform_r = CDDM_from_mesh(me, ob);
|
||||
|
||||
|
||||
if (build_shapekey_layers)
|
||||
add_shapekey_layers(dm, me, ob);
|
||||
|
||||
if(deformedVerts) {
|
||||
CDDM_apply_vert_coords(*deform_r, deformedVerts);
|
||||
CDDM_calc_normals(*deform_r);
|
||||
|
@ -1081,7 +1212,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
|
|||
|
||||
/* if this is not the last modifier in the stack then recalculate the normals
|
||||
* to avoid giving bogus normals to the next modifier see: [#23673] */
|
||||
if(isPrevDeform && mti->dependsOnNormals && mti->dependsOnNormals(md)) {
|
||||
if(dm && isPrevDeform && mti->dependsOnNormals && mti->dependsOnNormals(md)) {
|
||||
/* XXX, this covers bug #23673, but we may need normal calc for other types */
|
||||
if(dm->type == DM_TYPE_CDDM) {
|
||||
CDDM_apply_vert_coords(dm, deformedVerts);
|
||||
|
@ -1112,6 +1243,9 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
|
|||
} else {
|
||||
dm = CDDM_from_mesh(me, ob);
|
||||
|
||||
if (build_shapekey_layers)
|
||||
add_shapekey_layers(dm, me, ob);
|
||||
|
||||
if(deformedVerts) {
|
||||
CDDM_apply_vert_coords(dm, deformedVerts);
|
||||
CDDM_calc_normals(dm);
|
||||
|
@ -1239,14 +1373,19 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
|
|||
finaldm = dm;
|
||||
} else {
|
||||
finaldm = CDDM_from_mesh(me, ob);
|
||||
|
||||
|
||||
if (build_shapekey_layers)
|
||||
add_shapekey_layers(finaldm, me, ob);
|
||||
|
||||
if(deformedVerts) {
|
||||
CDDM_apply_vert_coords(finaldm, deformedVerts);
|
||||
CDDM_calc_normals(finaldm);
|
||||
}
|
||||
|
||||
CDDM_calc_normals(finaldm);
|
||||
|
||||
if((dataMask & CD_MASK_WEIGHT_MCOL) && (ob->mode & OB_MODE_WEIGHT_PAINT))
|
||||
add_weight_mcol_dm(ob, finaldm);
|
||||
|
||||
}
|
||||
|
||||
/* add an orco layer if needed */
|
||||
|
@ -1519,7 +1658,8 @@ static void clear_mesh_caches(Object *ob)
|
|||
}
|
||||
}
|
||||
|
||||
static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask)
|
||||
static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask,
|
||||
int build_shapekey_layers)
|
||||
{
|
||||
Object *obact = scene->basact?scene->basact->object:NULL;
|
||||
int editing = paint_facesel_test(ob);
|
||||
|
@ -1530,7 +1670,7 @@ static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask)
|
|||
|
||||
mesh_calc_modifiers(scene, ob, NULL, &ob->derivedDeform,
|
||||
&ob->derivedFinal, 0, 1,
|
||||
needMapping, dataMask, -1, 1);
|
||||
needMapping, dataMask, -1, 1, build_shapekey_layers);
|
||||
|
||||
DM_set_object_boundbox (ob, ob->derivedFinal);
|
||||
|
||||
|
@ -1564,12 +1704,13 @@ static void editbmesh_build_data(Scene *scene, Object *obedit, BMEditMesh *em, C
|
|||
em->derivedCage->needsFree = 0;
|
||||
}
|
||||
|
||||
void makeDerivedMesh(Scene *scene, Object *ob, BMEditMesh *em, CustomDataMask dataMask)
|
||||
void makeDerivedMesh(Scene *scene, Object *ob, BMEditMesh *em,
|
||||
CustomDataMask dataMask, int build_shapekey_layers)
|
||||
{
|
||||
if (em) {
|
||||
editbmesh_build_data(scene, ob, em, dataMask);
|
||||
} else {
|
||||
mesh_build_data(scene, ob, dataMask);
|
||||
mesh_build_data(scene, ob, dataMask, build_shapekey_layers);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1581,7 +1722,7 @@ DerivedMesh *mesh_get_derived_final(Scene *scene, Object *ob, CustomDataMask dat
|
|||
* the data we need, rebuild the derived mesh
|
||||
*/
|
||||
if(!ob->derivedFinal || (dataMask & ob->lastDataMask) != dataMask)
|
||||
mesh_build_data(scene, ob, dataMask);
|
||||
mesh_build_data(scene, ob, dataMask, 0);
|
||||
|
||||
return ob->derivedFinal;
|
||||
}
|
||||
|
@ -1592,7 +1733,7 @@ DerivedMesh *mesh_get_derived_deform(Scene *scene, Object *ob, CustomDataMask da
|
|||
* the data we need, rebuild the derived mesh
|
||||
*/
|
||||
if(!ob->derivedDeform || (dataMask & ob->lastDataMask) != dataMask)
|
||||
mesh_build_data(scene, ob, dataMask);
|
||||
mesh_build_data(scene, ob, dataMask, 0);
|
||||
|
||||
return ob->derivedDeform;
|
||||
}
|
||||
|
@ -1601,7 +1742,7 @@ DerivedMesh *mesh_create_derived_render(Scene *scene, Object *ob, CustomDataMask
|
|||
{
|
||||
DerivedMesh *final;
|
||||
|
||||
mesh_calc_modifiers(scene, ob, NULL, NULL, &final, 1, 1, 0, dataMask, -1, 0);
|
||||
mesh_calc_modifiers(scene, ob, NULL, NULL, &final, 1, 1, 0, dataMask, -1, 0, 0);
|
||||
|
||||
return final;
|
||||
}
|
||||
|
@ -1610,7 +1751,7 @@ DerivedMesh *mesh_create_derived_index_render(Scene *scene, Object *ob, CustomDa
|
|||
{
|
||||
DerivedMesh *final;
|
||||
|
||||
mesh_calc_modifiers(scene, ob, NULL, NULL, &final, 1, 1, 0, dataMask, index, 0);
|
||||
mesh_calc_modifiers(scene, ob, NULL, NULL, &final, 1, 1, 0, dataMask, index, 0, 0);
|
||||
|
||||
return final;
|
||||
}
|
||||
|
@ -1619,7 +1760,7 @@ DerivedMesh *mesh_create_derived_view(Scene *scene, Object *ob, CustomDataMask d
|
|||
{
|
||||
DerivedMesh *final;
|
||||
|
||||
mesh_calc_modifiers(scene, ob, NULL, NULL, &final, 0, 1, 0, dataMask, -1, 0);
|
||||
mesh_calc_modifiers(scene, ob, NULL, NULL, &final, 0, 1, 0, dataMask, -1, 0, 0);
|
||||
|
||||
return final;
|
||||
}
|
||||
|
@ -1629,7 +1770,7 @@ DerivedMesh *mesh_create_derived_no_deform(Scene *scene, Object *ob, float (*ver
|
|||
{
|
||||
DerivedMesh *final;
|
||||
|
||||
mesh_calc_modifiers(scene, ob, vertCos, NULL, &final, 0, 0, 0, dataMask, -1, 0);
|
||||
mesh_calc_modifiers(scene, ob, vertCos, NULL, &final, 0, 0, 0, dataMask, -1, 0, 0);
|
||||
|
||||
return final;
|
||||
}
|
||||
|
@ -1639,7 +1780,7 @@ DerivedMesh *mesh_create_derived_no_virtual(Scene *scene, Object *ob, float (*ve
|
|||
{
|
||||
DerivedMesh *final;
|
||||
|
||||
mesh_calc_modifiers(scene, ob, vertCos, NULL, &final, 0, -1, 0, dataMask, -1, 0);
|
||||
mesh_calc_modifiers(scene, ob, vertCos, NULL, &final, 0, -1, 0, dataMask, -1, 0, 0);
|
||||
|
||||
return final;
|
||||
}
|
||||
|
@ -1649,7 +1790,7 @@ DerivedMesh *mesh_create_derived_physics(Scene *scene, Object *ob, float (*vertC
|
|||
{
|
||||
DerivedMesh *final;
|
||||
|
||||
mesh_calc_modifiers(scene, ob, vertCos, NULL, &final, 0, -1, 1, dataMask, -1, 0);
|
||||
mesh_calc_modifiers(scene, ob, vertCos, NULL, &final, 0, -1, 1, dataMask, -1, 0, 0);
|
||||
|
||||
return final;
|
||||
}
|
||||
|
@ -1660,7 +1801,7 @@ DerivedMesh *mesh_create_derived_no_deform_render(Scene *scene, Object *ob,
|
|||
{
|
||||
DerivedMesh *final;
|
||||
|
||||
mesh_calc_modifiers(scene, ob, vertCos, NULL, &final, 1, 0, 0, dataMask, -1, 0);
|
||||
mesh_calc_modifiers(scene, ob, vertCos, NULL, &final, 1, 0, 0, dataMask, -1, 0, 0);
|
||||
|
||||
return final;
|
||||
}
|
||||
|
|
|
@ -1872,6 +1872,10 @@ DerivedMesh *CDDM_from_BMEditMesh(BMEditMesh *em, Mesh *me, int use_mdisps)
|
|||
add_orig = !CustomData_has_layer(&em->bm->pdata, CD_ORIGINDEX);
|
||||
|
||||
flag = use_mdisps ? CD_MASK_DERIVEDMESH|CD_MASK_MDISPS : CD_MASK_DERIVEDMESH;
|
||||
|
||||
/*don't process shapekeys, we only feed them through the modifier stack as needed,
|
||||
e.g. for applying modifiers or the like*/
|
||||
flag &= ~CD_SHAPEKEY;
|
||||
CustomData_merge(&em->bm->vdata, &dm->vertData, flag,
|
||||
CD_CALLOC, dm->numVertData);
|
||||
CustomData_merge(&em->bm->edata, &dm->edgeData, flag,
|
||||
|
|
|
@ -969,7 +969,7 @@ const CustomDataMask CD_MASK_DERIVEDMESH =
|
|||
CD_MASK_MCOL | CD_MASK_ORIGINDEX | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_CLOTH_ORCO |
|
||||
CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY | CD_MASK_WEIGHT_MLOOPCOL |
|
||||
CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORCO | CD_MASK_TANGENT |
|
||||
CD_MASK_WEIGHT_MCOL | CD_MASK_NORMAL;
|
||||
CD_MASK_WEIGHT_MCOL | CD_MASK_NORMAL | CD_MASK_SHAPEKEY;
|
||||
const CustomDataMask CD_MASK_BMESH = CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY |
|
||||
CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_PROP_FLT | CD_MASK_PROP_INT |
|
||||
CD_MASK_PROP_STR | CD_MASK_SHAPEKEY | CD_MASK_SHAPE_KEYINDEX | CD_MASK_MDISPS;
|
||||
|
@ -1050,6 +1050,8 @@ void CustomData_merge(const struct CustomData *source, struct CustomData *dest,
|
|||
layer->data, totelem, layer->name);
|
||||
|
||||
if(newlayer) {
|
||||
newlayer->uid = layer->uid;
|
||||
|
||||
newlayer->active = lastactive;
|
||||
newlayer->active_rnd = lastrender;
|
||||
newlayer->active_clone = lastclone;
|
||||
|
|
|
@ -1433,7 +1433,7 @@ void nurbs_to_mesh(Object *ob)
|
|||
mesh_calc_normals(me->mvert, me->totvert, me->mloop, me->mpoly, me->totloop, me->totpoly, NULL, NULL, 0, NULL, NULL);
|
||||
} else {
|
||||
me= add_mesh("Mesh");
|
||||
DM_to_mesh(dm, me);
|
||||
DM_to_mesh(dm, me, ob);
|
||||
}
|
||||
|
||||
me->totcol= cu->totcol;
|
||||
|
@ -1715,7 +1715,7 @@ void mesh_calc_normals(MVert *mverts, int numVerts, MLoop *mloop, MPoly *mpolys,
|
|||
ml = mloop + mp->loopstart;
|
||||
/*this is kindof hackish, probably need to calculate quads around face center for
|
||||
ngons, not this weird quad-fitting thing I've got going here*/
|
||||
for (j=0; j<mp->totloop; j += 4, ml++) {
|
||||
for (j=0; j<mp->totloop; j += 4, ml += 4) {
|
||||
int v1, v2, v3, v4;
|
||||
|
||||
v1 = ml->v;
|
||||
|
@ -1744,7 +1744,7 @@ void mesh_calc_normals(MVert *mverts, int numVerts, MLoop *mloop, MPoly *mpolys,
|
|||
mf = mfaces;
|
||||
for (i=0; i<numFaces; i++, mf++, origIndexFace++) {
|
||||
if (*origIndexFace < numPolys) {
|
||||
VECCOPY(fnors[i], tnorms[*origIndexFace]);
|
||||
VECCOPY(fnors[i], pnors[*origIndexFace]);
|
||||
} else {
|
||||
/*eek, we're not corrusponding to polys*/
|
||||
printf("error in mesh_calc_normals; tesselation face indices are incorrect. normals may look bad.\n");
|
||||
|
|
|
@ -2610,16 +2610,16 @@ void object_handle_update(Scene *scene, Object *ob)
|
|||
BMEditMesh *em = (ob == scene->obedit)? ((Mesh*)ob->data)->edit_btmesh : NULL;
|
||||
BLI_assert((scene->customdata_mask & CD_MASK_BAREMESH) == CD_MASK_BAREMESH);
|
||||
if(em) {
|
||||
makeDerivedMesh(scene, ob, em, scene->customdata_mask); /* was CD_MASK_BAREMESH */
|
||||
makeDerivedMesh(scene, ob, em, scene->customdata_mask, 0); /* was CD_MASK_BAREMESH */
|
||||
} else
|
||||
makeDerivedMesh(scene, ob, NULL, scene->customdata_mask);
|
||||
makeDerivedMesh(scene, ob, NULL, scene->customdata_mask, 0);
|
||||
|
||||
#else /* ensure CD_MASK_BAREMESH for now */
|
||||
BMEditMesh *em = (ob == scene->obedit)? ((Mesh*)ob->data)->edit_btmesh : NULL;
|
||||
if(em) {
|
||||
makeDerivedMesh(scene, ob, em, scene->customdata_mask | CD_MASK_BAREMESH); /* was CD_MASK_BAREMESH */
|
||||
makeDerivedMesh(scene, ob, em, scene->customdata_mask | CD_MASK_BAREMESH, 0); /* was CD_MASK_BAREMESH */
|
||||
} else
|
||||
makeDerivedMesh(scene, ob, NULL, scene->customdata_mask | CD_MASK_BAREMESH);
|
||||
makeDerivedMesh(scene, ob, NULL, scene->customdata_mask | CD_MASK_BAREMESH, 0);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
|
|
@ -263,9 +263,7 @@ BMEdge *BM_Connect_Verts(BMesh *bm, BMVert *v1, BMVert *v2, BMFace **nf) {
|
|||
BMLoop *nl;
|
||||
BMFace *face;
|
||||
|
||||
/*this isn't the best thing in the world. it doesn't handle cases where there's
|
||||
multiple faces yet. that might require a convexity test to figure out which
|
||||
face is "best," and who knows what for non-manifold conditions.*/
|
||||
/*be warned: this can do weird things in some ngon situation, see BM_LegalSplits*/
|
||||
for (face = BMIter_New(&iter, bm, BM_FACES_OF_VERT, v1); face; face=BMIter_Step(&iter)) {
|
||||
for (v=BMIter_New(&iter2, bm, BM_VERTS_OF_FACE, face); v; v=BMIter_Step(&iter2)) {
|
||||
if (v == v2) {
|
||||
|
|
|
@ -118,7 +118,7 @@ static int facesel_face_pick(struct bContext *C, Mesh *me, Object *ob, short *mv
|
|||
me->totface = mesh_recalcTesselation(&me->fdata, &me->ldata, &me->pdata,
|
||||
me->mvert, me->totface, me->totloop, me->totpoly, 0, 0);
|
||||
mesh_update_customdata_pointers(me);
|
||||
makeDerivedMesh(scene, ob, NULL, CD_MASK_BAREMESH);
|
||||
makeDerivedMesh(scene, ob, NULL, CD_MASK_BAREMESH, 0);
|
||||
|
||||
// XXX if (v3d->flag & V3D_INVALID_BACKBUF) {
|
||||
// XXX drawview.c! check_backbuf();
|
||||
|
|
|
@ -1175,7 +1175,7 @@ static int convert_exec(bContext *C, wmOperator *op)
|
|||
dm= mesh_get_derived_final(scene, newob, CD_MASK_MESH);
|
||||
/* dm= mesh_create_derived_no_deform(ob1, NULL); this was called original (instead of get_derived). man o man why! (ton) */
|
||||
|
||||
DM_to_mesh(dm, newob->data);
|
||||
DM_to_mesh(dm, newob->data, newob);
|
||||
|
||||
dm->release(dm);
|
||||
object_free_modifiers(newob); /* after derivedmesh calls! */
|
||||
|
|
|
@ -412,7 +412,7 @@ static int modifier_apply_shape(ReportList *reports, Scene *scene, Object *ob, M
|
|||
}
|
||||
mesh_pmv_off(me);
|
||||
|
||||
dm = mesh_create_derived_for_modifier(scene, ob, md);
|
||||
dm = mesh_create_derived_for_modifier(scene, ob, md, 0);
|
||||
if (!dm) {
|
||||
BKE_report(reports, RPT_ERROR, "Modifier is disabled or returned error, skipping apply");
|
||||
return 0;
|
||||
|
@ -452,12 +452,7 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob,
|
|||
DerivedMesh *dm;
|
||||
Mesh *me = ob->data;
|
||||
MultiresModifierData *mmd= find_multires_modifier_before(scene, md);
|
||||
|
||||
if( me->key) {
|
||||
BKE_report(reports, RPT_ERROR, "Modifier cannot be applied to Mesh with Shape Keys");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
mesh_pmv_off(me);
|
||||
|
||||
/* Multires: ensure that recent sculpting is applied */
|
||||
|
@ -470,19 +465,19 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob,
|
|||
return 0;
|
||||
}
|
||||
} else {
|
||||
dm = mesh_create_derived_for_modifier(scene, ob, md);
|
||||
dm = mesh_create_derived_for_modifier(scene, ob, md, 1);
|
||||
if (!dm) {
|
||||
BKE_report(reports, RPT_ERROR, "Modifier returned error, skipping apply");
|
||||
return 0;
|
||||
}
|
||||
|
||||
DM_to_mesh(dm, me);
|
||||
DM_to_mesh(dm, me, ob);
|
||||
|
||||
dm->release(dm);
|
||||
|
||||
if(md->type == eModifierType_Multires) {
|
||||
CustomData_external_remove(&me->fdata, &me->id, CD_MDISPS, me->totface);
|
||||
CustomData_free_layer_active(&me->fdata, CD_MDISPS, me->totface);
|
||||
CustomData_external_remove(&me->ldata, &me->id, CD_MDISPS, me->totloop);
|
||||
CustomData_free_layer_active(&me->ldata, CD_MDISPS, me->totloop);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1166,7 +1161,7 @@ static int multires_external_save_exec(bContext *C, wmOperator *op)
|
|||
if(!me)
|
||||
return OPERATOR_CANCELLED;
|
||||
|
||||
if(CustomData_external_test(&me->fdata, CD_MDISPS))
|
||||
if(CustomData_external_test(&me->ldata, CD_MDISPS))
|
||||
return OPERATOR_CANCELLED;
|
||||
|
||||
RNA_string_get(op->ptr, "filepath", path);
|
||||
|
@ -1174,8 +1169,8 @@ static int multires_external_save_exec(bContext *C, wmOperator *op)
|
|||
if(relative)
|
||||
BLI_path_rel(path, G.main->name);
|
||||
|
||||
CustomData_external_add(&me->fdata, &me->id, CD_MDISPS, me->totface, path);
|
||||
CustomData_external_write(&me->fdata, &me->id, CD_MASK_MESH, me->totface, 0);
|
||||
CustomData_external_add(&me->ldata, &me->id, CD_MDISPS, me->totloop, path);
|
||||
CustomData_external_write(&me->ldata, &me->id, CD_MASK_MESH, me->totloop, 0);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
@ -1195,7 +1190,7 @@ static int multires_external_save_invoke(bContext *C, wmOperator *op, wmEvent *U
|
|||
if (!mmd)
|
||||
return OPERATOR_CANCELLED;
|
||||
|
||||
if(CustomData_external_test(&me->fdata, CD_MDISPS))
|
||||
if(CustomData_external_test(&me->ldata, CD_MDISPS))
|
||||
return OPERATOR_CANCELLED;
|
||||
|
||||
if(!RNA_property_is_set(op->ptr, "relative_path"))
|
||||
|
@ -1239,11 +1234,11 @@ static int multires_external_pack_exec(bContext *C, wmOperator *UNUSED(op))
|
|||
Object *ob = ED_object_active_context(C);
|
||||
Mesh *me= ob->data;
|
||||
|
||||
if(!CustomData_external_test(&me->fdata, CD_MDISPS))
|
||||
if(!CustomData_external_test(&me->ldata, CD_MDISPS))
|
||||
return OPERATOR_CANCELLED;
|
||||
|
||||
// XXX don't remove..
|
||||
CustomData_external_remove(&me->fdata, &me->id, CD_MDISPS, me->totface);
|
||||
CustomData_external_remove(&me->ldata, &me->id, CD_MDISPS, me->totloop);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
|
|
@ -4723,7 +4723,7 @@ static int texture_paint_init(bContext *C, wmOperator *op)
|
|||
mesh_update_customdata_pointers(me);
|
||||
|
||||
/*force customdata update*/
|
||||
makeDerivedMesh(scene, pop->ps.ob, NULL, CD_MASK_BAREMESH);
|
||||
makeDerivedMesh(scene, pop->ps.ob, NULL, CD_MASK_BAREMESH, 0);
|
||||
|
||||
/* Dont allow brush size below 2 */
|
||||
if (pop->ps.brush && pop->ps.brush->size<=1)
|
||||
|
|
|
@ -1403,7 +1403,7 @@ static int wpaint_stroke_test_start(bContext *C, wmOperator *op, wmEvent *UNUSED
|
|||
me->totface = mesh_recalcTesselation(&me->fdata, &me->ldata, &me->pdata,
|
||||
me->mvert, me->totface, me->totloop, me->totpoly, 1, 0);
|
||||
mesh_update_customdata_pointers(me);
|
||||
makeDerivedMesh(scene, ob, NULL, CD_MASK_BAREMESH);
|
||||
makeDerivedMesh(scene, ob, NULL, CD_MASK_BAREMESH, 0);
|
||||
|
||||
/* if nothing was added yet, we make dverts and a vertex deform group */
|
||||
if (!me->dvert) {
|
||||
|
@ -1854,7 +1854,7 @@ static void vpaint_build_poly_facemap(struct VPaintData *vd, Mesh *me,
|
|||
me->totface = mesh_recalcTesselation(&me->fdata, &me->ldata, &me->pdata,
|
||||
me->mvert, me->totface, me->totloop, me->totpoly, 1, 0);
|
||||
mesh_update_customdata_pointers(me);
|
||||
makeDerivedMesh(scene, ob, NULL, CD_MASK_BAREMESH);
|
||||
makeDerivedMesh(scene, ob, NULL, CD_MASK_BAREMESH, 0);
|
||||
|
||||
origIndex = CustomData_get_layer(&me->fdata, CD_ORIGINDEX);
|
||||
mf = me->mface;
|
||||
|
|
|
@ -84,6 +84,7 @@ typedef struct TransVert {
|
|||
float *val, oldval;
|
||||
int flag;
|
||||
float *nor;
|
||||
int f1;
|
||||
} TransVert;
|
||||
|
||||
static TransVert *transvmain=NULL;
|
||||
|
@ -197,8 +198,10 @@ static void set_mapped_co(void *vuserdata, int index, float *co, float *no, shor
|
|||
TransVert *tv = userdata[1];
|
||||
BMVert *eve = EDBM_get_vert_for_index(em, index);
|
||||
|
||||
if (BMINDEX_GET(eve) != -1)
|
||||
if (BMINDEX_GET(eve) != -1 && !tv[BMINDEX_GET(eve)].f1) {
|
||||
copy_v3_v3(tv[BMINDEX_GET(eve)].maploc, co);
|
||||
tv[BMINDEX_GET(eve)].f1 = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* copied from editobject.c, needs to be replaced with new transform code still */
|
||||
|
|
|
@ -2009,7 +2009,7 @@ static float *get_crazy_mapped_editverts(TransInfo *t)
|
|||
/* disable subsurf temporal, get mapped cos, and enable it */
|
||||
if(modifiers_disable_subsurf_temporary(t->obedit)) {
|
||||
/* need to make new derivemesh */
|
||||
makeDerivedMesh(t->scene, t->obedit, me->edit_btmesh, CD_MASK_BAREMESH);
|
||||
makeDerivedMesh(t->scene, t->obedit, me->edit_btmesh, CD_MASK_BAREMESH, 0);
|
||||
}
|
||||
|
||||
/* now get the cage */
|
||||
|
|
|
@ -116,7 +116,7 @@ float *crazyspace_get_mapped_editverts(Scene *scene, Object *obedit)
|
|||
/* disable subsurf temporal, get mapped cos, and enable it */
|
||||
if(modifiers_disable_subsurf_temporary(obedit)) {
|
||||
/* need to make new derivemesh */
|
||||
makeDerivedMesh(scene, obedit, me->edit_btmesh, CD_MASK_BAREMESH);
|
||||
makeDerivedMesh(scene, obedit, me->edit_btmesh, CD_MASK_BAREMESH, 0);
|
||||
}
|
||||
|
||||
/* now get the cage */
|
||||
|
|
|
@ -406,7 +406,7 @@ static int rna_MultiresModifier_external_get(PointerRNA *ptr)
|
|||
Object *ob= (Object*)ptr->id.data;
|
||||
Mesh *me= ob->data;
|
||||
|
||||
return CustomData_external_test(&me->fdata, CD_MDISPS);
|
||||
return CustomData_external_test(&me->ldata, CD_MDISPS);
|
||||
}
|
||||
|
||||
static void rna_MultiresModifier_filepath_get(PointerRNA *ptr, char *value)
|
||||
|
|
|
@ -160,7 +160,7 @@ static Mesh *rna_Object_to_mesh(Object *ob, ReportList *reports, Scene *sce, int
|
|||
dm = mesh_create_derived_view( sce, ob, mask );
|
||||
|
||||
tmpmesh = add_mesh( "Mesh" );
|
||||
DM_to_mesh( dm, tmpmesh );
|
||||
DM_to_mesh( dm, tmpmesh, ob );
|
||||
dm->release( dm );
|
||||
}
|
||||
|
||||
|
|
|
@ -576,7 +576,7 @@ int NewBooleanMesh(Scene *scene, Base *base, Base *base_select, int int_op_type)
|
|||
ob_new= AddNewBlenderMesh(scene, base_select);
|
||||
me_new= ob_new->data;
|
||||
|
||||
DM_to_mesh(result, me_new);
|
||||
DM_to_mesh(result, me_new, ob_new);
|
||||
result->release(result);
|
||||
|
||||
dm->release(dm);
|
||||
|
|
|
@ -113,7 +113,7 @@ DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
|
|||
float mtx[4][4], imtx[4][4];
|
||||
int i, j, *vtargetmap = NULL;
|
||||
BLI_array_declare(vtargetmap);
|
||||
int vector_size=0, a, b;
|
||||
int vector_size=0, a, b, totshape;
|
||||
|
||||
origdm = dm;
|
||||
if (!CDDM_Check(dm))
|
||||
|
@ -164,6 +164,15 @@ DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
|
|||
} else BLI_array_append(vtargetmap, -1);
|
||||
}
|
||||
|
||||
/*handle shape keys*/
|
||||
totshape = CustomData_number_of_layers(&cddm->vertData, CD_SHAPEKEY);
|
||||
for (a=0; a<totshape; a++) {
|
||||
float (*cos)[3] = CustomData_get_layer_n(&cddm->vertData, CD_SHAPEKEY, a);
|
||||
for (i=dm->numVertData; i<cddm->numVertData; i++) {
|
||||
cos[i][axis] = -cos[i][axis];
|
||||
}
|
||||
}
|
||||
|
||||
for (i=0; i<dm->numVertData; i++) {
|
||||
BLI_array_append(vtargetmap, -1);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue