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:
authorJoseph Eagar <joeedh@gmail.com>2010-07-19 08:44:37 +0400
committerJoseph Eagar <joeedh@gmail.com>2010-07-19 08:44:37 +0400
commitc11c196efadf5ef52293d782638497f86a209722 (patch)
tree43abcd60b2400d28db8686f4dbea68f17475ef58 /source/blender/blenkernel/intern/modifiers_bmesh.c
parentf54aa7811029c90b6071ccc9e27e57a758e5884d (diff)
parent7f083c45bee15f7540e2a35a725efe28fc962239 (diff)
part 1 of merge from trunk at r30358; it compiles, but doesn't link quite yet :)
Diffstat (limited to 'source/blender/blenkernel/intern/modifiers_bmesh.c')
-rw-r--r--source/blender/blenkernel/intern/modifiers_bmesh.c499
1 files changed, 0 insertions, 499 deletions
diff --git a/source/blender/blenkernel/intern/modifiers_bmesh.c b/source/blender/blenkernel/intern/modifiers_bmesh.c
index 250a272015e..8b437635b2a 100644
--- a/source/blender/blenkernel/intern/modifiers_bmesh.c
+++ b/source/blender/blenkernel/intern/modifiers_bmesh.c
@@ -99,7 +99,6 @@
#include "depsgraph_private.h"
#include "BKE_deform.h"
#include "BKE_shrinkwrap.h"
-#include "BKE_simple_deform.h"
#include "CCGSubSurf.h"
#include "RE_shader_ext.h"
@@ -225,501 +224,3 @@ BMEditMesh *CDDM_To_BMesh(DerivedMesh *dm, BMEditMesh *existing)
return em;
}
-static float vertarray_size(MVert *mvert, int numVerts, int axis)
-{
- int i;
- float min_co, max_co;
-
- /* if there are no vertices, width is 0 */
- if(numVerts == 0) return 0;
-
- /* find the minimum and maximum coordinates on the desired axis */
- min_co = max_co = mvert->co[axis];
- ++mvert;
- for(i = 1; i < numVerts; ++i, ++mvert) {
- if(mvert->co[axis] < min_co) min_co = mvert->co[axis];
- if(mvert->co[axis] > max_co) max_co = mvert->co[axis];
- }
-
- return max_co - min_co;
-}
-
-/* finds the best possible flipped name. For renaming; check for unique names afterwards */
-/* if strip_number: removes number extensions */
-static void vertgroup_flip_name (char *name, int strip_number)
-{
- int len;
- char prefix[128]={""}; /* The part before the facing */
- char suffix[128]={""}; /* The part after the facing */
- char replace[128]={""}; /* The replacement string */
- char number[128]={""}; /* The number extension string */
- char *index=NULL;
-
- len= strlen(name);
- if(len<3) return; // we don't do names like .R or .L
-
- /* We first check the case with a .### extension, let's find the last period */
- if(isdigit(name[len-1])) {
- index= strrchr(name, '.'); // last occurrance
- if (index && isdigit(index[1]) ) { // doesnt handle case bone.1abc2 correct..., whatever!
- if(strip_number==0)
- strcpy(number, index);
- *index= 0;
- len= strlen(name);
- }
- }
-
- strcpy (prefix, name);
-
-#define IS_SEPARATOR(a) ((a)=='.' || (a)==' ' || (a)=='-' || (a)=='_')
-
- /* first case; separator . - _ with extensions r R l L */
- if( IS_SEPARATOR(name[len-2]) ) {
- switch(name[len-1]) {
- case 'l':
- prefix[len-1]= 0;
- strcpy(replace, "r");
- break;
- case 'r':
- prefix[len-1]= 0;
- strcpy(replace, "l");
- break;
- case 'L':
- prefix[len-1]= 0;
- strcpy(replace, "R");
- break;
- case 'R':
- prefix[len-1]= 0;
- strcpy(replace, "L");
- break;
- }
- }
- /* case; beginning with r R l L , with separator after it */
- else if( IS_SEPARATOR(name[1]) ) {
- switch(name[0]) {
- case 'l':
- strcpy(replace, "r");
- strcpy(suffix, name+1);
- prefix[0]= 0;
- break;
- case 'r':
- strcpy(replace, "l");
- strcpy(suffix, name+1);
- prefix[0]= 0;
- break;
- case 'L':
- strcpy(replace, "R");
- strcpy(suffix, name+1);
- prefix[0]= 0;
- break;
- case 'R':
- strcpy(replace, "L");
- strcpy(suffix, name+1);
- prefix[0]= 0;
- break;
- }
- }
- else if(len > 5) {
- /* hrms, why test for a separator? lets do the rule 'ultimate left or right' */
- index = BLI_strcasestr(prefix, "right");
- if (index==prefix || index==prefix+len-5) {
- if(index[0]=='r')
- strcpy (replace, "left");
- else {
- if(index[1]=='I')
- strcpy (replace, "LEFT");
- else
- strcpy (replace, "Left");
- }
- *index= 0;
- strcpy (suffix, index+5);
- }
- else {
- index = BLI_strcasestr(prefix, "left");
- if (index==prefix || index==prefix+len-4) {
- if(index[0]=='l')
- strcpy (replace, "right");
- else {
- if(index[1]=='E')
- strcpy (replace, "RIGHT");
- else
- strcpy (replace, "Right");
- }
- *index= 0;
- strcpy (suffix, index+4);
- }
- }
- }
-
-#undef IS_SEPARATOR
-
- sprintf (name, "%s%s%s%s", prefix, replace, suffix, number);
-}
-
-typedef struct IndexMapEntry {
- /* the new vert index that this old vert index maps to */
- int new;
- /* -1 if this vert isn't merged, otherwise the old vert index it
- * should be replaced with
- */
- int merge;
- /* 1 if this vert's first copy is merged with the last copy of its
- * merge target, otherwise 0
- */
- short merge_final;
-} IndexMapEntry;
-
-/* indexMap - an array of IndexMap entries
- * oldIndex - the old index to map
- * copyNum - the copy number to map to (original = 0, first copy = 1, etc.)
- */
-static int calc_mapping(IndexMapEntry *indexMap, int oldIndex, int copyNum)
-{
- if(indexMap[oldIndex].merge < 0) {
- /* vert wasn't merged, so use copy of this vert */
- return indexMap[oldIndex].new + copyNum;
- } else if(indexMap[oldIndex].merge == oldIndex) {
- /* vert was merged with itself */
- return indexMap[oldIndex].new;
- } else {
- /* vert was merged with another vert */
- /* follow the chain of merges to the end, or until we've passed
- * a number of vertices equal to the copy number
- */
- if(copyNum <= 0)
- return indexMap[oldIndex].new;
- else
- return calc_mapping(indexMap, indexMap[oldIndex].merge,
- copyNum - 1);
- }
-}
-
-static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
- Scene *scene, Object *ob, DerivedMesh *dm,
- int initFlags)
-{
- DerivedMesh *cddm = dm; //copying shouldn't be necassary here, as all modifiers return CDDM's
- BMEditMesh *em = CDDM_To_BMesh(cddm, NULL);
- BMOperator op, oldop, weldop;
- int i, j, indexLen;
- /* offset matrix */
- float offset[4][4];
- float final_offset[4][4];
- float tmp_mat[4][4];
- float length = amd->length;
- int count = amd->count, maxVerts;
- int finalVerts, finalEdges, finalFaces;
- int *indexMap = NULL;
- DerivedMesh *start_cap = NULL, *end_cap = NULL;
- MVert *src_mvert;
-
- /* need to avoid infinite recursion here */
- if(amd->start_cap && amd->start_cap != ob)
- start_cap = mesh_get_derived_final(scene, amd->start_cap, CD_MASK_MESH);
- if(amd->end_cap && amd->end_cap != ob)
- end_cap = mesh_get_derived_final(scene, amd->end_cap, CD_MASK_MESH);
-
- unit_m4(offset);
-
- src_mvert = cddm->getVertArray(dm);
- maxVerts = cddm->getNumVerts(dm);
-
- if(amd->offset_type & MOD_ARR_OFF_CONST)
- add_v3_v3v3(offset[3], offset[3], amd->offset);
- if(amd->offset_type & MOD_ARR_OFF_RELATIVE) {
- for(j = 0; j < 3; j++)
- offset[3][j] += amd->scale[j] * vertarray_size(src_mvert,
- maxVerts, j);
- }
-
- if((amd->offset_type & MOD_ARR_OFF_OBJ) && (amd->offset_ob)) {
- float obinv[4][4];
- float result_mat[4][4];
-
- if(ob)
- invert_m4_m4(obinv, ob->obmat);
- else
- unit_m4(obinv);
-
- mul_serie_m4(result_mat, offset,
- obinv, amd->offset_ob->obmat,
- NULL, NULL, NULL, NULL, NULL);
- copy_m4_m4(offset, result_mat);
- }
-
- if(amd->fit_type == MOD_ARR_FITCURVE && amd->curve_ob) {
- Curve *cu = amd->curve_ob->data;
- if(cu) {
- float tmp_mat[3][3];
- float scale;
-
- object_to_mat3(amd->curve_ob, tmp_mat);
- scale = mat3_to_scale(tmp_mat);
-
- if(!cu->path) {
- cu->flag |= CU_PATH; // needed for path & bevlist
- makeDispListCurveTypes(scene, amd->curve_ob, 0);
- }
- if(cu->path)
- length = scale*cu->path->totdist;
- }
- }
-
- /* calculate the maximum number of copies which will fit within the
- prescribed length */
- if(amd->fit_type == MOD_ARR_FITLENGTH
- || amd->fit_type == MOD_ARR_FITCURVE)
- {
- float dist = sqrt(INPR(offset[3], offset[3]));
-
- if(dist > 1e-6f)
- /* this gives length = first copy start to last copy end
- add a tiny offset for floating point rounding errors */
- count = (length + 1e-6f) / dist;
- else
- /* if the offset has no translation, just make one copy */
- count = 1;
- }
-
- if(count < 1)
- count = 1;
-
- /* allocate memory for count duplicates (including original) plus
- * start and end caps
- */
- finalVerts = dm->getNumVerts(dm) * count;
- finalEdges = dm->getNumEdges(dm) * count;
- finalFaces = dm->getNumFaces(dm) * count;
- if(start_cap) {
- finalVerts += start_cap->getNumVerts(start_cap);
- finalEdges += start_cap->getNumEdges(start_cap);
- finalFaces += start_cap->getNumFaces(start_cap);
- }
- if(end_cap) {
- finalVerts += end_cap->getNumVerts(end_cap);
- finalEdges += end_cap->getNumEdges(end_cap);
- finalFaces += end_cap->getNumFaces(end_cap);
- }
-
- /* calculate the offset matrix of the final copy (for merging) */
- unit_m4(final_offset);
-
- for(j=0; j < count - 1; j++) {
- mul_m4_m4m4(tmp_mat, final_offset, offset);
- copy_m4_m4(final_offset, tmp_mat);
- }
-
- BMO_Init_Op(&weldop, "weldverts");
- BMO_InitOpf(em->bm, &op, "dupe geom=%avef");
- oldop = op;
- for (j=0; j < count; j++) {
- BMVert *v, *v2;
- BMOpSlot *s1;
- BMOpSlot *s2;
-
- BMO_InitOpf(em->bm, &op, "dupe geom=%s", &oldop, j==0 ? "geom" : "newout");
- BMO_Exec_Op(em->bm, &op);
-
- s1 = BMO_GetSlot(&op, "geom");
- s2 = BMO_GetSlot(&op, "newout");
-
- BMO_CallOpf(em->bm, "transform mat=%m4 verts=%s", offset, &op, "newout");
-
- #define _E(s, i) ((BMVert**)(s)->data.buf)[i]
-
- /*calculate merge mapping*/
- if (j == 0) {
- BMOperator findop;
- BMOIter oiter;
- BMVert *v, *v2;
- BMHeader *h;
-
- BMO_InitOpf(em->bm, &findop,
- "finddoubles verts=%av dist=%f keepverts=%s",
- amd->merge_dist, &op, "geom");
-
- i = 0;
- BMO_ITER(h, &oiter, em->bm, &op, "geom", BM_ALL) {
- BMINDEX_SET(h, i);
- i++;
- }
-
- BMO_ITER(h, &oiter, em->bm, &op, "newout", BM_ALL) {
- BMINDEX_SET(h, i);
- i++;
- }
-
- BMO_Exec_Op(em->bm, &findop);
-
- indexLen = i;
- indexMap = MEM_callocN(sizeof(int)*indexLen, "indexMap");
-
- /*element type argument doesn't do anything here*/
- BMO_ITER(v, &oiter, em->bm, &findop, "targetmapout", 0) {
- v2 = BMO_IterMapValp(&oiter);
-
- indexMap[BMINDEX_GET(v)] = BMINDEX_GET(v2)+1;
- }
-
- BMO_Finish_Op(em->bm, &findop);
- }
-
- /*generate merge mappping using index map. we do this by using the
- operator slots as lookup arrays.*/
- #define E(i) (i) < s1->len ? _E(s1, i) : _E(s2, (i)-s1->len)
-
- for (i=0; i<indexLen; i++) {
- if (!indexMap[i]) continue;
-
- v = E(i);
- v2 = E(indexMap[i]-1);
-
- BMO_Insert_MapPointer(em->bm, &weldop, "targetmap", v, v2);
- }
-
- #undef E
- #undef _E
-
- BMO_Finish_Op(em->bm, &oldop);
- oldop = op;
- }
-
- if (j > 0) BMO_Finish_Op(em->bm, &op);
-
- if (amd->flags & MOD_ARR_MERGE)
- BMO_Exec_Op(em->bm, &weldop);
-
- BMO_Finish_Op(em->bm, &weldop);
-
- BMEdit_RecalcTesselation(em);
- cddm = CDDM_from_BMEditMesh(em, NULL);
-
- BMEdit_Free(em);
- MEM_freeN(indexMap);
-
- return cddm;
-}
-
-DerivedMesh *arrayModifier_applyModifier(ModifierData *md, Object *ob,
- DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
-{
- DerivedMesh *result;
- ArrayModifierData *amd = (ArrayModifierData*) md;
-
- result = arrayModifier_doArray(amd, md->scene, ob, derivedData, 0);
-
- //if(result != derivedData)
- // CDDM_calc_normals(result);
-
- return result;
-}
-
-DerivedMesh *arrayModifier_applyModifierEM(ModifierData *md, Object *ob,
- BMEditMesh *editData,
- DerivedMesh *derivedData)
-{
- return arrayModifier_applyModifier(md, ob, derivedData, 0, 1);
-}
-
-/* Mirror */
-#define VERT_NEW 1
-
-DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
- Object *ob,
- DerivedMesh *dm,
- int initFlags,
- int axis)
-{
- float tolerance = mmd->tolerance;
- DerivedMesh *result, *cddm;
- BMEditMesh *em;
- BMesh *bm;
- BMOIter siter1;
- BMOperator op;
- BMVert *v1;
- int vector_size=0, a, b;
- bDeformGroup *def, *defb;
- bDeformGroup **vector_def = NULL;
- float mtx[4][4], imtx[4][4];
- int j;
-
- cddm = dm; //copying shouldn't be necassary here, as all modifiers return CDDM's
- em = CDDM_To_BMesh(dm, NULL);
-
- /*convienence variable*/
- bm = em->bm;
-
- if (mmd->flag & MOD_MIR_VGROUP) {
- /* calculate the number of deformedGroups */
- for(vector_size = 0, def = ob->defbase.first; def;
- def = def->next, vector_size++);
-
- /* load the deformedGroups for fast access */
- vector_def =
- (bDeformGroup **)MEM_mallocN(sizeof(bDeformGroup*) * vector_size,
- "group_index");
- for(a = 0, def = ob->defbase.first; def; def = def->next, a++) {
- vector_def[a] = def;
- }
- }
-
- if (mmd->mirror_ob) {
- float mtx2[4][4], vec[3];
-
- invert_m4_m4(mtx2, mmd->mirror_ob->obmat);
- mul_m4_m4m4(mtx, ob->obmat, mtx2);
- } else {
- unit_m4(mtx);
- }
-
- BMO_InitOpf(bm, &op, "mirror geom=%avef mat=%m4 mergedist=%f axis=%d",
- mtx, mmd->tolerance, axis);
-
- BMO_Exec_Op(bm, &op);
-
- BMO_CallOpf(bm, "reversefaces faces=%s", &op, "newout");
-
- /*handle vgroup stuff*/
- if (mmd->flag & MOD_MIR_VGROUP) {
- BMO_ITER(v1, &siter1, bm, &op, "newout", BM_VERT) {
- MDeformVert *dvert = CustomData_bmesh_get(&bm->vdata, v1->head.data, CD_MDEFORMVERT);
-
- if (dvert) {
- for(j = 0; j < dvert[0].totweight; ++j) {
- char tmpname[32];
-
- if(dvert->dw[j].def_nr < 0 ||
- dvert->dw[j].def_nr >= vector_size)
- continue;
-
- def = vector_def[dvert->dw[j].def_nr];
- strcpy(tmpname, def->name);
- vertgroup_flip_name(tmpname,0);
-
- for(b = 0, defb = ob->defbase.first; defb;
- defb = defb->next, b++)
- {
- if(!strcmp(defb->name, tmpname))
- {
- dvert->dw[j].def_nr = b;
- break;
- }
- }
- }
- }
- }
- }
-
- BMO_Finish_Op(bm, &op);
-
- BMEdit_RecalcTesselation(em);
- result = CDDM_from_BMEditMesh(em, NULL); //CDDM_copy(getEditDerivedBMesh(em, ob, NULL), 0);
-
- BMEdit_Free(em);
- MEM_freeN(em);
-
- if (vector_def) MEM_freeN(vector_def);
-
- return result;
-}