[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12808] trunk/blender/source/blender:
Brecht Van Lommel
brechtvanlommel at pandora.be
Thu Dec 6 18:43:47 CET 2007
Revision: 12808
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12808
Author: blendix
Date: 2007-12-06 18:43:47 +0100 (Thu, 06 Dec 2007)
Log Message:
-----------
Particles
=========
- Normalize strand coordinates over the length of the strand, not
cut off when with e.g. length texture control.
- Weight paint and particle mode x-mirror now works with deformation
and shape keys active.
- X-ray is now disabled in particle mode, messed up depth tests.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_particle.h
trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
trunk/blender/source/blender/blenkernel/intern/particle.c
trunk/blender/source/blender/render/intern/source/convertblender.c
trunk/blender/source/blender/render/intern/source/renderdatabase.c
trunk/blender/source/blender/src/drawobject.c
trunk/blender/source/blender/src/editparticle.c
trunk/blender/source/blender/src/meshtools.c
Modified: trunk/blender/source/blender/blenkernel/BKE_particle.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_particle.h 2007-12-06 14:22:22 UTC (rev 12807)
+++ trunk/blender/source/blender/blenkernel/BKE_particle.h 2007-12-06 17:43:47 UTC (rev 12808)
@@ -265,6 +265,7 @@
//void psys_vec_rot_from_face(struct DerivedMesh *dm, struct ParticleData *pa, float *vec);
void psys_mat_hair_to_object(struct Object *ob, struct DerivedMesh *dm, short from, struct ParticleData *pa, float hairmat[][4]);
void psys_mat_hair_to_global(struct Object *ob, struct DerivedMesh *dm, short from, struct ParticleData *pa, float hairmat[][4]);
+void psys_mat_hair_to_orco(struct Object *ob, struct DerivedMesh *dm, short from, struct ParticleData *pa, float hairmat[][4]);
float *psys_cache_vgroup(struct DerivedMesh *dm, struct ParticleSystem *psys, int vgroup);
void psys_get_texture(struct Object *ob, struct Material *ma, struct ParticleSystemModifierData *psmd, struct ParticleSystem *psys, struct ParticleData *pa, struct ParticleTexture *ptex, int event);
Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c 2007-12-06 14:22:22 UTC (rev 12807)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c 2007-12-06 17:43:47 UTC (rev 12808)
@@ -2482,7 +2482,7 @@
ob->derivedFinal->getMinMax(ob->derivedFinal, min, max);
if(!ob->bb)
- ob->bb= MEM_mallocN(sizeof(BoundBox), "bb");
+ ob->bb= MEM_callocN(sizeof(BoundBox), "bb");
boundbox_set_from_min_max(ob->bb, min, max);
ob->derivedFinal->needsFree = 0;
@@ -2520,7 +2520,7 @@
em->derivedFinal->getMinMax(em->derivedFinal, min, max);
if(!G.obedit->bb)
- G.obedit->bb= MEM_mallocN(sizeof(BoundBox), "bb");
+ G.obedit->bb= MEM_callocN(sizeof(BoundBox), "bb");
boundbox_set_from_min_max(G.obedit->bb, min, max);
em->derivedFinal->needsFree = 0;
Modified: trunk/blender/source/blender/blenkernel/intern/particle.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle.c 2007-12-06 14:22:22 UTC (rev 12807)
+++ trunk/blender/source/blender/blenkernel/intern/particle.c 2007-12-06 17:43:47 UTC (rev 12808)
@@ -2240,33 +2240,52 @@
Crossf(mat[0], mat[1], mat[2]);
}
-static void psys_face_mat(DerivedMesh *dm, ParticleData *pa, float mat[][4])
+static void psys_face_mat(DerivedMesh *dm, ParticleData *pa, float mat[][4], int orco)
{
float v1[3], v2[3], v3[3];
MFace *mface;
OrigSpaceFace *osface;
+ float (*orcodata)[3];
int i = pa->num_dmcache==DMCACHE_NOTFOUND ? pa->num : pa->num_dmcache;
if (i==-1 || i >= dm->getNumFaces(dm)) { Mat4One(mat); return; }
+
mface=dm->getFaceData(dm,i,CD_MFACE);
osface=dm->getFaceData(dm,i,CD_ORIGSPACE);
- dm->getVertCo(dm,mface->v1,v1);
- dm->getVertCo(dm,mface->v2,v2);
- dm->getVertCo(dm,mface->v3,v3);
+ if(orco && (orcodata=dm->getVertDataArray(dm, CD_ORCO))) {
+ VECCOPY(v1, orcodata[mface->v1]);
+ VECCOPY(v2, orcodata[mface->v2]);
+ VECCOPY(v3, orcodata[mface->v3]);
+ }
+ else {
+ dm->getVertCo(dm,mface->v1,v1);
+ dm->getVertCo(dm,mface->v2,v2);
+ dm->getVertCo(dm,mface->v3,v3);
+ }
triatomat(v1, v2, v3, (osface)? osface->uv: NULL, mat);
}
+
void psys_mat_hair_to_object(Object *ob, DerivedMesh *dm, short from, ParticleData *pa, float hairmat[][4])
{
float vec[3];
- psys_face_mat(dm, pa, hairmat);
+ psys_face_mat(dm, pa, hairmat, 0);
psys_particle_on_dm(ob, dm, from, pa->num, pa->num_dmcache, pa->fuv, pa->foffset, vec, 0, 0, 0, 0, 0);
VECCOPY(hairmat[3],vec);
}
+void psys_mat_hair_to_orco(Object *ob, DerivedMesh *dm, short from, ParticleData *pa, float hairmat[][4])
+{
+ float vec[3], orco[3];
+
+ psys_face_mat(dm, pa, hairmat, 1);
+ psys_particle_on_dm(ob, dm, from, pa->num, pa->num_dmcache, pa->fuv, pa->foffset, vec, 0, 0, 0, orco, 0);
+ VECCOPY(hairmat[3],orco);
+}
+
/*
void psys_key_to_geometry(DerivedMesh *dm, ParticleData *pa, ParticleKey *key)
{
@@ -2319,7 +2338,7 @@
{
float mat[4][4];
- psys_face_mat(dm, pa, mat);
+ psys_face_mat(dm, pa, mat, 0);
Mat4Transp(mat); /* cheap inverse for rotation matrix */
Mat4Mul3Vecfl(mat, vec);
}
Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c 2007-12-06 14:22:22 UTC (rev 12807)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c 2007-12-06 17:43:47 UTC (rev 12808)
@@ -1734,7 +1734,7 @@
StrandRen *strand=0;
RNG *rng= 0;
float loc[3],loc1[3],loc0[3],vel[3],mat[4][4],nmat[3][3],co[3],nor[3],time;
- float *orco=0,*surfnor=0,*uvco=0;
+ float *orco=0,*surfnor=0,*uvco=0, strandlen=0.0f, curlen=0.0f;
float hasize, pa_size, pa_time, r_tilt, cfra=bsystem_time(ob,(float)CFRA,0.0);
float loc_tex[3], size_tex[3], adapt_angle=0.0, adapt_pix=0.0, random;
int i, a, k, max_k=0, totpart, totvlako, totverto, totuv=0, override_uv=-1;
@@ -2043,6 +2043,7 @@
orco[2] = (orco[2]-loc_tex[2])/size_tex[2];
}
+ /* surface normal shading setup */
if(ma->mode_l & MA_STR_SURFDIFF) {
Mat3MulVecfl(nmat, nor);
surfnor= nor;
@@ -2050,7 +2051,8 @@
else
surfnor= NULL;
- if(strandbuf) { /* strand render */
+ /* strand render setup */
+ if(strandbuf) {
strand= RE_findOrAddStrand(re, re->totstrand++);
strand->buffer= strandbuf;
strand->vert= svert;
@@ -2073,9 +2075,17 @@
}
}
+ /* strandco computation setup */
+ if(path_nbr) {
+ strandlen= 0.0f;
+ curlen= 0.0f;
+ for(k=1; k<=path_nbr; k++)
+ if(k<=max_k)
+ strandlen += VecLenf((cache+k-1)->co, (cache+k)->co);
+ }
+
for(k=0; k<=path_nbr; k++){
if(path_nbr){
- time=(float)k/(float)path_nbr;
if(k<=max_k){
//bti->convert_bake_key(bsys,cache+k,0,(void*)&state);
//copy_particle_key(&state,cache+k,0);
@@ -2084,6 +2094,10 @@
}
else
continue;
+
+ if(k > 0)
+ curlen += VecLenf((cache+k-1)->co, (cache+k)->co);
+ time= curlen/strandlen;
}
else{
time=0.0f;
Modified: trunk/blender/source/blender/render/intern/source/renderdatabase.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/renderdatabase.c 2007-12-06 14:22:22 UTC (rev 12807)
+++ trunk/blender/source/blender/render/intern/source/renderdatabase.c 2007-12-06 17:43:47 UTC (rev 12808)
@@ -548,11 +548,11 @@
float **uv= node->uv;
int size= (n+1)*256;
- node->uv= MEM_callocN(size*sizeof(MCol*), "Strand uv");
+ node->uv= MEM_callocN(size*sizeof(float*), "Strand uv");
if(uv) {
size= node->totuv*256;
- memcpy(node->uv, uv, size*sizeof(MCol*));
+ memcpy(node->uv, uv, size*sizeof(float*));
MEM_freeN(uv);
}
Modified: trunk/blender/source/blender/src/drawobject.c
===================================================================
--- trunk/blender/source/blender/src/drawobject.c 2007-12-06 14:22:22 UTC (rev 12807)
+++ trunk/blender/source/blender/src/drawobject.c 2007-12-06 17:43:47 UTC (rev 12808)
@@ -4706,10 +4706,13 @@
/* xray delay? */
if((flag & DRAW_PICKING)==0 && (base->flag & OB_FROMDUPLI)==0) {
- /* xray and transp are set when it is drawing the 2nd/3rd pass */
- if(!G.vd->xray && !G.vd->transp && (ob->dtx & OB_DRAWXRAY)) {
- add_view3d_after(G.vd, base, V3D_XRAY);
- return;
+ /* don't do xray in particle mode, need the z-buffer */
+ if(!(G.f & G_PARTICLEEDIT)) {
+ /* xray and transp are set when it is drawing the 2nd/3rd pass */
+ if(!G.vd->xray && !G.vd->transp && (ob->dtx & OB_DRAWXRAY)) {
+ add_view3d_after(G.vd, base, V3D_XRAY);
+ return;
+ }
}
}
Modified: trunk/blender/source/blender/src/editparticle.c
===================================================================
--- trunk/blender/source/blender/src/editparticle.c 2007-12-06 14:22:22 UTC (rev 12807)
+++ trunk/blender/source/blender/src/editparticle.c 2007-12-06 17:43:47 UTC (rev 12808)
@@ -546,7 +546,7 @@
/* insert particles into kd tree */
LOOP_PARTICLES(i,pa) {
- psys_mat_hair_to_object(ob, psmd->dm, psys->part->from, pa, mat);
+ psys_mat_hair_to_orco(ob, psmd->dm, psys->part->from, pa, mat);
VECCOPY(co, pa->hair[0].co);
Mat4MulVecfl(mat, co);
BLI_kdtree_insert(tree, i, co, NULL);
@@ -559,7 +559,7 @@
edit->mirror_cache= MEM_callocN(sizeof(int)*totpart, "PE mirror cache");
LOOP_PARTICLES(i,pa) {
- psys_mat_hair_to_object(ob, psmd->dm, psys->part->from, pa, mat);
+ psys_mat_hair_to_orco(ob, psmd->dm, psys->part->from, pa, mat);
VECCOPY(co, pa->hair[0].co);
Mat4MulVecfl(mat, co);
co[0]= -co[0];
@@ -628,8 +628,8 @@
}
/* mirror positions and tags */
- psys_mat_hair_to_object(ob, dm, psys->part->from, pa, mat);
- psys_mat_hair_to_object(ob, dm, psys->part->from, mpa, mmat);
+ psys_mat_hair_to_orco(ob, dm, psys->part->from, pa, mat);
+ psys_mat_hair_to_orco(ob, dm, psys->part->from, mpa, mmat);
Mat4Invert(immat, mmat);
hkey=pa->hair;
Modified: trunk/blender/source/blender/src/meshtools.c
===================================================================
--- trunk/blender/source/blender/src/meshtools.c 2007-12-06 14:22:22 UTC (rev 12807)
+++ trunk/blender/source/blender/src/meshtools.c 2007-12-06 17:43:47 UTC (rev 12808)
@@ -686,7 +686,7 @@
}
-static long mesh_octree_find_index(MocNode **bt, MVert *mvert, float *co)
+static long mesh_octree_find_index(MocNode **bt, float (*orco)[3], MVert *mvert, float *co)
{
float *vec;
int a;
@@ -697,7 +697,12 @@
for(a=0; a<MOC_NODE_RES; a++) {
if((*bt)->index[a]) {
/* does mesh verts and editmode, code looks potential dangerous, octree should really be filled OK! */
- if(mvert) {
+ if(orco) {
+ vec= orco[(*bt)->index[a]-1];
+ if(FloatCompare(vec, co, MOC_THRESH))
+ return (*bt)->index[a]-1;
+ }
+ else if(mvert) {
vec= (mvert+(*bt)->index[a]-1)->co;
if(FloatCompare(vec, co, MOC_THRESH))
return (*bt)->index[a]-1;
@@ -711,85 +716,117 @@
else return -1;
}
if( (*bt)->next)
- return mesh_octree_find_index(&(*bt)->next, mvert, co);
+ return mesh_octree_find_index(&(*bt)->next, orco, mvert, co);
return -1;
}
+static struct {
+ MocNode **table;
+ float offs[3], div[3];
+ float (*orco)[3];
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list