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:
Diffstat (limited to 'source/blender/blenkernel/intern/mesh.c')
-rw-r--r--source/blender/blenkernel/intern/mesh.c135
1 files changed, 48 insertions, 87 deletions
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 61c75ef79e8..7aa5b8ca0b7 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -428,112 +428,73 @@ void mesh_get_texspace(Mesh *me, float *loc_r, float *rot_r, float *size_r)
if (size_r) VECCOPY(size_r, me->size);
}
-static float *make_orco_displist_mesh(Object *ob, int subdivlvl)
+static float *make_orco_mesh_internal(Mesh *me, int render)
{
- Mesh *me= ob->data;
+ float (*orcoData)[3];
+ int a, totvert;
+ float loc[3], size[3];
DerivedMesh *dm;
- DispListMesh *dlm;
- float *orco, *fp, loc[3], size[3];
- int i;
-
- if (G.obedit && G.obedit->data==me) {
- dm= subsurf_make_derived_from_editmesh(G.editMesh, subdivlvl, me->subsurftype, NULL);
- dlm= dm->convertToDispListMesh(dm);
- dm->release(dm);
- } else {
- /* if there's a key, set the first one */
- if(me->key && me->texcomesh==0) {
- cp_key(0, me->totvert, me->totvert, (char*) me->mvert->co, me->key, me->key->refkey, 0);
- }
+ float (*vcos)[3] = MEM_callocN(sizeof(*vcos)*me->totvert, "orco mesh");
- dm= subsurf_make_derived_from_mesh(ob, subdivlvl, 0);
- dlm= dm->convertToDispListMesh(dm);
- dm->release(dm);
-
- /* Restore correct key */
- do_ob_key(ob);
- }
+ /* Get appropriate vertex coordinates */
- fp= orco= MEM_mallocN(dlm->totvert*3*sizeof(float), "mesh displist orco");
-
- mesh_get_texspace(me, loc, NULL, size);
- for(i=0; i<dlm->totvert; i++,fp+=3) {
- fp[0]= (dlm->mvert[i].co[0] - loc[0])/size[0];
- fp[1]= (dlm->mvert[i].co[1] - loc[1])/size[1];
- fp[2]= (dlm->mvert[i].co[2] - loc[2])/size[2];
- }
-
- displistmesh_free(dlm);
-
- return orco;
-}
-
-static float *make_orco_mesh(Mesh *me)
-{
- MVert *mvert;
- KeyBlock *kb;
- float *orcoData, *orco, *fp;
- int a, totvert;
- float loc[3], size[3];
-
- totvert= me->totvert;
- orco= orcoData= MEM_mallocN(sizeof(float)*3*totvert, "orco mesh");
+ if(me->key && me->texcomesh==0 && me->key->refkey) {
+ KeyBlock *kb= me->key->refkey;
+ float *fp= kb->data;
+ totvert= MIN2(kb->totelem, me->totvert);
- mesh_get_texspace(me, loc, NULL, size);
- if(me->key && me->texcomesh==0) {
- kb= me->key->refkey;
- if (kb) { /***** BUG *****/
- fp= kb->data;
-
- for(a=0; a<totvert; a++, orco+=3) {
- orco[0]= (fp[0]-loc[0])/size[0];
- orco[1]= (fp[1]-loc[1])/size[1];
- orco[2]= (fp[2]-loc[2])/size[2];
-
- /* only increase mvert when totvert <= kb->totelem */
- if(a<kb->totelem) fp+=3;
- }
+ for(a=0; a<totvert; a++, fp+=3) {
+ vcos[a][0]= fp[0];
+ vcos[a][1]= fp[1];
+ vcos[a][2]= fp[2];
}
}
else {
- if(me->texcomesh) {
- me= me->texcomesh;
- }
-
- mvert= me->mvert;
- for(a=0; a<totvert; a++, orco+=3) {
- orco[0]= (mvert->co[0]-loc[0])/size[0];
- orco[1]= (mvert->co[1]-loc[1])/size[1];
- orco[2]= (mvert->co[2]-loc[2])/size[2];
-
- /* only increase mvert when totvert <= me->totvert */
- if(a<me->totvert) mvert++;
+ Mesh *tme = me->texcomesh?me->texcomesh:me;
+ MVert *mvert = tme->mvert;
+ totvert = MIN2(tme->totvert, me->totvert);
+
+ for(a=0; a<totvert; a++, mvert++) {
+ vcos[a][0]= mvert->co[0];
+ vcos[a][1]= mvert->co[1];
+ vcos[a][2]= mvert->co[2];
}
}
- return orcoData;
+ /* Apply orco-changing modifiers */
+
+ if (render) {
+ dm = mesh_create_derived_no_deform_render(me, vcos);
+ } else {
+ dm = mesh_create_derived_no_deform(me, vcos);
+ }
+ totvert = dm->getNumVerts(dm);
+
+ orcoData = MEM_mallocN(sizeof(*orcoData)*totvert, "orcoData");
+ dm->getVertCos(dm, orcoData);
+ dm->release(dm);
+ MEM_freeN(vcos);
+
+ mesh_get_texspace(me, loc, NULL, size);
+
+ for(a=0; a<totvert; a++) {
+ float *co = orcoData[a];
+ co[0] = (co[0]-loc[0])/size[0];
+ co[1] = (co[1]-loc[1])/size[1];
+ co[2] = (co[2]-loc[2])/size[2];
+ }
+
+ return (float*) orcoData;
}
float *mesh_create_orco_render(Object *ob)
{
- Mesh *me = ob->data;
-
- if ((me->flag&ME_SUBSURF) && me->subdivr) {
- return make_orco_displist_mesh(ob, me->subdivr);
- } else {
- return make_orco_mesh(me);
- }
+ return make_orco_mesh_internal(ob->data, 1);
}
float *mesh_create_orco(Object *ob)
{
- Mesh *me = ob->data;
-
- if ((me->flag&ME_SUBSURF) && me->subdiv) {
- return make_orco_displist_mesh(ob, me->subdiv);
- } else {
- return make_orco_mesh(me);
- }
+ return make_orco_mesh_internal(ob->data, 0);
}
/** rotates the vertices of a face in case v[2] or v[3] (vertex index)