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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2007-12-11 23:02:21 +0300
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2007-12-11 23:02:21 +0300
commit457057a9e817d5cb410b9464616b6e05cfb054ee (patch)
treee576a995c7df2979b9c369b07ce5fedbcea7564e /source/blender/src
parent160e6afdb8dc36b7d3a982a0411e633be165d2f4 (diff)
Fix for mirroring issues in particle mode, where the particles were
not mirrored exactly, though the problem is not completely solved. The way local frames are computed for particles is still not fully symmetric, which shows especially on long hairs... Also made the shift+o subsurf switch work recursively into dupli-groups, did only the first level before.
Diffstat (limited to 'source/blender/src')
-rw-r--r--source/blender/src/editobject.c80
-rw-r--r--source/blender/src/editparticle.c9
-rw-r--r--source/blender/src/meshtools.c22
3 files changed, 51 insertions, 60 deletions
diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c
index 1bf3fe7ea72..193bd0f46c4 100644
--- a/source/blender/src/editobject.c
+++ b/source/blender/src/editobject.c
@@ -2822,44 +2822,51 @@ void convertmenu(void)
* level==-1 then toggle subsurf, else set to level.
* *set allows to toggle multiple selections
*/
-static void object_flip_subdivison(Object *ob, int *set, int level, int mode)
+static void object_flip_subdivison(Object *ob, int *set, int level, int mode, int ingroup)
{
ModifierData *md;
- if(ob->type!=OB_MESH)
- return;
-
- md = modifiers_findByType(ob, eModifierType_Subsurf);
-
- if (md) {
- SubsurfModifierData *smd = (SubsurfModifierData*) md;
-
- if (level == -1) {
- if(*set == -1)
- *set= smd->modifier.mode&(mode);
-
- if (*set) {
- smd->modifier.mode &= ~(mode);
+ if(ob->type==OB_MESH) {
+ md = modifiers_findByType(ob, eModifierType_Subsurf);
+
+ if (md) {
+ SubsurfModifierData *smd = (SubsurfModifierData*) md;
+
+ if (level == -1) {
+ if(*set == -1)
+ *set= smd->modifier.mode&(mode);
+
+ if (*set) {
+ smd->modifier.mode &= ~(mode);
+ } else {
+ smd->modifier.mode |= (mode);
+ }
} else {
- smd->modifier.mode |= (mode);
+ smd->levels = level;
}
- } else {
- smd->levels = level;
- }
- }
- else if(*set != 0) {
- SubsurfModifierData *smd = (SubsurfModifierData*) modifier_new(eModifierType_Subsurf);
+ }
+ else if(!ingroup && *set != 0) {
+ SubsurfModifierData *smd = (SubsurfModifierData*) modifier_new(eModifierType_Subsurf);
- BLI_addtail(&ob->modifiers, smd);
+ BLI_addtail(&ob->modifiers, smd);
- if (level!=-1) {
- smd->levels = level;
+ if (level!=-1) {
+ smd->levels = level;
+ }
+
+ if(*set == -1)
+ *set= 1;
}
-
- if(*set == -1)
- *set= 1;
+
+ ob->recalc |= OB_RECALC_DATA;
+ }
+
+ if(ob->dup_group) {
+ GroupObject *go;
+
+ for(go= ob->dup_group->gobject.first; go; go= go->next)
+ object_flip_subdivison(go->ob, set, level, mode, 1);
}
- ob->recalc |= OB_RECALC_DATA;
}
/* Change subdivision properties of mesh object ob, if
@@ -2877,18 +2884,9 @@ void flip_subdivison(int level)
else
mode= eModifierMode_Render|eModifierMode_Realtime;
- for(base= G.scene->base.first; base; base= base->next) {
- if(((level==-1) && (TESTBASE(base))) || (TESTBASELIB(base))) {
- object_flip_subdivison(base->object, &set, level, mode);
-
- if(base->object->dup_group) {
- GroupObject *go;
- for(go= base->object->dup_group->gobject.first; go; go= go->next)
- if( modifiers_findByType(go->ob, eModifierType_Subsurf)) /* only when exists */
- object_flip_subdivison(go->ob, &set, level, mode);
- }
- }
- }
+ for(base= G.scene->base.first; base; base= base->next)
+ if(((level==-1) && (TESTBASE(base))) || (TESTBASELIB(base)))
+ object_flip_subdivison(base->object, &set, level, mode, 0);
countall();
allqueue(REDRAWVIEW3D, 0);
diff --git a/source/blender/src/editparticle.c b/source/blender/src/editparticle.c
index 3611efed995..411a45d0a53 100644
--- a/source/blender/src/editparticle.c
+++ b/source/blender/src/editparticle.c
@@ -56,6 +56,7 @@
#include "BKE_global.h"
#include "BKE_object.h"
+#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_particle.h"
#include "BKE_scene.h"
@@ -560,7 +561,7 @@ static void PE_update_mirror_cache(Object *ob, ParticleSystem *psys)
/* lookup particles and set in mirror cache */
if(!edit->mirror_cache)
edit->mirror_cache= MEM_callocN(sizeof(int)*totpart, "PE mirror cache");
-
+
LOOP_PARTICLES(i,pa) {
psys_mat_hair_to_orco(ob, psmd->dm, psys->part->from, pa, mat);
VECCOPY(co, pa->hair[0].co);
@@ -599,11 +600,11 @@ static void PE_mirror_particle(Object *ob, DerivedMesh *dm, ParticleSystem *psys
edit= psys->edit;
i= pa - psys->particles;
+ if(!edit->mirror_cache)
+ PE_update_mirror_cache(ob, psys);
+
/* find mirrored particle if needed */
if(!mpa) {
- if(!edit->mirror_cache)
- PE_update_mirror_cache(ob, psys);
-
mi= edit->mirror_cache[i];
if(mi == -1)
return;
diff --git a/source/blender/src/meshtools.c b/source/blender/src/meshtools.c
index 6bda8d36158..bcf07c9b594 100644
--- a/source/blender/src/meshtools.c
+++ b/source/blender/src/meshtools.c
@@ -725,6 +725,7 @@ static struct {
MocNode **table;
float offs[3], div[3];
float (*orco)[3];
+ float orcoloc[3];
} MeshOctree = {NULL, {0, 0, 0}, {0, 0, 0}, NULL};
/* mode is 's' start, or 'e' end, or 'u' use */
@@ -767,6 +768,7 @@ long mesh_octree_table(Object *ob, float *co, char mode)
int a, totvert;
MeshOctree.orco= mesh_getRefKeyCos(me, &totvert);
+ mesh_get_texspace(me, MeshOctree.orcoloc, NULL, NULL);
for(a=0, mvert= me->mvert; a<me->totvert; a++, mvert++) {
co= (MeshOctree.orco)? MeshOctree.orco[a]: mvert->co;
@@ -838,7 +840,9 @@ int mesh_get_x_mirror_vert(Object *ob, int index)
float vec[3];
if(MeshOctree.orco) {
- vec[0]= -MeshOctree.orco[index][0];
+ float *loc= MeshOctree.orcoloc;
+
+ vec[0]= -(MeshOctree.orco[index][0] + loc[0]) - loc[0];
vec[1]= MeshOctree.orco[index][1];
vec[2]= MeshOctree.orco[index][2];
}
@@ -920,7 +924,6 @@ int *mesh_get_x_mirror_faces(Object *ob)
MFace mirrormf, *mf, *hashmf, *mface= me->mface;
GHash *fhash;
int *mirrorverts, *mirrorfaces;
- float vec[3];
int a;
mirrorverts= MEM_callocN(sizeof(int)*me->totvert, "MirrorVerts");
@@ -928,19 +931,8 @@ int *mesh_get_x_mirror_faces(Object *ob)
mesh_octree_table(ob, NULL, 's');
- for(a=0, mv=mvert; a<me->totvert; a++, mv++) {
- if(MeshOctree.orco) {
- vec[0]= -MeshOctree.orco[a][0];
- vec[1]= MeshOctree.orco[a][1];
- vec[2]= MeshOctree.orco[a][2];
- }
- else {
- vec[0]= -mv->co[0];
- vec[1]= mv->co[1];
- vec[2]= mv->co[2];
- }
- mirrorverts[a]= mesh_octree_table(ob, vec, 'u');
- }
+ for(a=0, mv=mvert; a<me->totvert; a++, mv++)
+ mirrorverts[a]= mesh_get_x_mirror_vert(ob, a);
mesh_octree_table(ob, NULL, 'e');