From a5906de7c4f1bd188030ee4b8d9822c7c31fc2ea Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 8 Jul 2011 13:22:58 +0000 Subject: Fix #26962: softbody collision doesn't respect subsurf+displace modifiers. Softbody was still using a flag to determine if it should use the final or deform derivedmesh, but this wans't exposed in the UI. Others systems use the collision modifier, now softbody uses it also to get vertices and faces, but with own collision code. --- source/blender/blenkernel/intern/softbody.c | 82 +++++++++++------------------ 1 file changed, 30 insertions(+), 52 deletions(-) (limited to 'source/blender/blenkernel/intern') diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c index ff238678eeb..2960d8a41e5 100644 --- a/source/blender/blenkernel/intern/softbody.c +++ b/source/blender/blenkernel/intern/softbody.c @@ -75,6 +75,7 @@ variables on the UI for now #include "BKE_curve.h" #include "BKE_effect.h" #include "BKE_global.h" +#include "BKE_modifier.h" #include "BKE_softbody.h" #include "BKE_DerivedMesh.h" #include "BKE_pointcache.h" @@ -289,21 +290,24 @@ typedef struct ccd_Mesh { -static ccd_Mesh *ccd_mesh_make(Object *ob, DerivedMesh *dm) +static ccd_Mesh *ccd_mesh_make(Object *ob) { + CollisionModifierData *cmd; ccd_Mesh *pccd_M = NULL; ccdf_minmax *mima =NULL; MFace *mface=NULL; float v[3],hull; int i; + cmd =(CollisionModifierData *)modifiers_findByType(ob, eModifierType_Collision); + /* first some paranoia checks */ - if (!dm) return NULL; - if (!dm->getNumVerts(dm) || !dm->getNumFaces(dm)) return NULL; + if (!cmd) return NULL; + if (!cmd->numverts || !cmd->numfaces) return NULL; pccd_M = MEM_mallocN(sizeof(ccd_Mesh),"ccd_Mesh"); - pccd_M->totvert = dm->getNumVerts(dm); - pccd_M->totface = dm->getNumFaces(dm); + pccd_M->totvert = cmd->numverts; + pccd_M->totface = cmd->numfaces; pccd_M->savety = CCD_SAVETY; pccd_M->bbmin[0]=pccd_M->bbmin[1]=pccd_M->bbmin[2]=1e30f; pccd_M->bbmax[0]=pccd_M->bbmax[1]=pccd_M->bbmax[2]=-1e30f; @@ -314,12 +318,10 @@ static ccd_Mesh *ccd_mesh_make(Object *ob, DerivedMesh *dm) hull = MAX2(ob->pd->pdef_sbift,ob->pd->pdef_sboft); /* alloc and copy verts*/ - pccd_M->mvert = dm->dupVertArray(dm); - /* ah yeah, put the verices to global coords once */ - /* and determine the ortho BB on the fly */ + pccd_M->mvert = MEM_dupallocN(cmd->xnew); + /* note that xnew coords are already in global space, */ + /* determine the ortho BB */ for(i=0; i < pccd_M->totvert; i++){ - mul_m4_v3(ob->obmat, pccd_M->mvert[i].co); - /* evaluate limits */ VECCOPY(v,pccd_M->mvert[i].co); pccd_M->bbmin[0] = MIN2(pccd_M->bbmin[0],v[0]-hull); @@ -332,7 +334,7 @@ static ccd_Mesh *ccd_mesh_make(Object *ob, DerivedMesh *dm) } /* alloc and copy faces*/ - pccd_M->mface = dm->dupFaceArray(dm); + pccd_M->mface = MEM_dupallocN(cmd->mfaces); /* OBBs for idea1 */ pccd_M->mima = MEM_mallocN(sizeof(ccdf_minmax)*pccd_M->totface,"ccd_Mesh_Faces_mima"); @@ -386,19 +388,22 @@ static ccd_Mesh *ccd_mesh_make(Object *ob, DerivedMesh *dm) } return pccd_M; } -static void ccd_mesh_update(Object *ob,ccd_Mesh *pccd_M, DerivedMesh *dm) +static void ccd_mesh_update(Object *ob,ccd_Mesh *pccd_M) { - ccdf_minmax *mima =NULL; + CollisionModifierData *cmd; + ccdf_minmax *mima =NULL; MFace *mface=NULL; float v[3],hull; int i; + cmd =(CollisionModifierData *)modifiers_findByType(ob, eModifierType_Collision); + /* first some paranoia checks */ - if (!dm) return ; - if (!dm->getNumVerts(dm) || !dm->getNumFaces(dm)) return ; + if (!cmd) return ; + if (!cmd->numverts || !cmd->numfaces) return ; - if ((pccd_M->totvert != dm->getNumVerts(dm)) || - (pccd_M->totface != dm->getNumFaces(dm))) return; + if ((pccd_M->totvert != cmd->numverts) || + (pccd_M->totface != cmd->numfaces)) return; pccd_M->bbmin[0]=pccd_M->bbmin[1]=pccd_M->bbmin[2]=1e30f; pccd_M->bbmax[0]=pccd_M->bbmax[1]=pccd_M->bbmax[2]=-1e30f; @@ -411,12 +416,10 @@ static void ccd_mesh_update(Object *ob,ccd_Mesh *pccd_M, DerivedMesh *dm) if(pccd_M->mprevvert) MEM_freeN(pccd_M->mprevvert); pccd_M->mprevvert = pccd_M->mvert; /* alloc and copy verts*/ - pccd_M->mvert = dm->dupVertArray(dm); - /* ah yeah, put the verices to global coords once */ - /* and determine the ortho BB on the fly */ + pccd_M->mvert = MEM_dupallocN(cmd->xnew); + /* note that xnew coords are already in global space, */ + /* determine the ortho BB */ for(i=0; i < pccd_M->totvert; i++){ - mul_m4_v3(ob->obmat, pccd_M->mvert[i].co); - /* evaluate limits */ VECCOPY(v,pccd_M->mvert[i].co); pccd_M->bbmin[0] = MIN2(pccd_M->bbmin[0],v[0]-hull); @@ -555,21 +558,8 @@ static void ccd_build_deflector_hash(Scene *scene, Object *vertexowner, GHash *h /*+++ only with deflecting set */ if(ob->pd && ob->pd->deflect && BLI_ghash_lookup(hash, ob) == NULL) { - DerivedMesh *dm= NULL; - - if(ob->softflag & OB_SB_COLLFINAL) /* so maybe someone wants overkill to collide with subsurfed */ - dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH); - else - dm = mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH); - - if(dm){ - ccd_Mesh *ccdmesh = ccd_mesh_make(ob, dm); - BLI_ghash_insert(hash, ob, ccdmesh); - - /* we did copy & modify all we need so give 'em away again */ - dm->release(dm); - - } + ccd_Mesh *ccdmesh = ccd_mesh_make(ob); + BLI_ghash_insert(hash, ob, ccdmesh); }/*--- only with deflecting set */ }/* mesh && layer*/ @@ -595,21 +585,9 @@ static void ccd_update_deflector_hash(Scene *scene, Object *vertexowner, GHash * /*+++ only with deflecting set */ if(ob->pd && ob->pd->deflect) { - DerivedMesh *dm= NULL; - - if(ob->softflag & OB_SB_COLLFINAL) { /* so maybe someone wants overkill to collide with subsurfed */ - dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH); - } else { - dm = mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH); - } - if(dm){ - ccd_Mesh *ccdmesh = BLI_ghash_lookup(hash,ob); - if (ccdmesh) - ccd_mesh_update(ob,ccdmesh,dm); - - /* we did copy & modify all we need so give 'em away again */ - dm->release(dm); - } + ccd_Mesh *ccdmesh = BLI_ghash_lookup(hash,ob); + if (ccdmesh) + ccd_mesh_update(ob,ccdmesh); }/*--- only with deflecting set */ }/* mesh && layer*/ -- cgit v1.2.3 From abdf420a6dbb4dbccba0d0d6b8ca2d7370681f4f Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Fri, 8 Jul 2011 19:58:02 +0000 Subject: == GPU Buffers == This patch attempts to clean up and document the GPU buffers code. There are a few bug fixes as well. Patch reviewed here: http://codereview.appspot.com/4631052/ Summary: * Bugfix: make GPU_buffer_copy_normal convert from shorts to floats correctly, also fixed the use of cached face normal CustomData. * Bugfix: changed the `mat_nr' field of GPUBufferMaterial from char to short. * Changed color buffer setup to not alloc a temporary copy of color data, just passes the MCol data in directly. * Changed the GPU buffer pool code to make clearer what operates specifically on the global pool. * Lots of refactoring for GPU_drawobject_new; should operate mostly the same (except got rid of one unecessary allocation), just split into more functions and without macros now. * Converted some #defines into enumerations. * Made some stuff private, pulled out of header file. * Deleted unused function GPU_buffer_pool_free_unused(). * Removed GPU_interleaved_setup and related #defines. (I think this was used for editmode VBOs, but those were disabled.) * Added lots of comments. * Added a few comments in the code signed `--nicholas' to note places where I am unsure about design or usage, would be good to address these better. * Code formatting changed to be more consistent with the rest of Blender. * Renamed some fields and variables to be more consistent with Blender's naming conventions. * Renamed some fields and variables to use more descriptive names, e.g. renamed `redir' to `mat_orig_to_new'. * Removed print outs with DEBUG_VBO -- don't feel too strongly about this one, just not used elsewhere in Blender, could be easily added back if others disagree though. * Moved the PBVH drawing code down to the bottom of the file, before was sitting in the middle of the other VBO code --- source/blender/blenkernel/intern/cdderivedmesh.c | 43 +++++++++++++----------- 1 file changed, 23 insertions(+), 20 deletions(-) (limited to 'source/blender/blenkernel/intern') diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 72ee9b55800..3abfa05e1fd 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -284,8 +284,10 @@ static void cdDM_drawVerts(DerivedMesh *dm) else { /* use OpenGL VBOs or Vertex Arrays instead for better, faster rendering */ GPU_vertex_setup(dm); if( !GPU_buffer_legacy(dm) ) { - if(dm->drawObject->nelements) glDrawArrays(GL_POINTS,0, dm->drawObject->nelements); - else glDrawArrays(GL_POINTS,0, dm->drawObject->nlooseverts); + if(dm->drawObject->tot_triangle_point) + glDrawArrays(GL_POINTS,0, dm->drawObject->tot_triangle_point); + else + glDrawArrays(GL_POINTS,0, dm->drawObject->tot_loose_point); } GPU_buffer_unbind(); } @@ -547,9 +549,10 @@ static void cdDM_drawFacesSolid(DerivedMesh *dm, GPU_normal_setup( dm ); if( !GPU_buffer_legacy(dm) ) { glShadeModel(GL_SMOOTH); - for( a = 0; a < dm->drawObject->nmaterials; a++ ) { + for( a = 0; a < dm->drawObject->totmaterial; a++ ) { if( setMaterial(dm->drawObject->materials[a].mat_nr+1, NULL) ) - glDrawArrays(GL_TRIANGLES, dm->drawObject->materials[a].start, dm->drawObject->materials[a].end-dm->drawObject->materials[a].start); + glDrawArrays(GL_TRIANGLES, dm->drawObject->materials[a].start, + dm->drawObject->materials[a].totpoint); } } GPU_buffer_unbind( ); @@ -629,13 +632,13 @@ static void cdDM_drawFacesColored(DerivedMesh *dm, int useTwoSided, unsigned cha GPU_color_setup(dm); if( !GPU_buffer_legacy(dm) ) { glShadeModel(GL_SMOOTH); - glDrawArrays(GL_TRIANGLES, 0, dm->drawObject->nelements); + glDrawArrays(GL_TRIANGLES, 0, dm->drawObject->tot_triangle_point); if( useTwoSided ) { GPU_color4_upload(dm,cp2); GPU_color_setup(dm); glCullFace(GL_FRONT); - glDrawArrays(GL_TRIANGLES, 0, dm->drawObject->nelements); + glDrawArrays(GL_TRIANGLES, 0, dm->drawObject->tot_triangle_point); glCullFace(GL_BACK); } } @@ -787,8 +790,8 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm, glShadeModel( GL_SMOOTH ); lastFlag = 0; - for(i = 0; i < dm->drawObject->nelements/3; i++) { - int actualFace = dm->drawObject->faceRemap[i]; + for(i = 0; i < dm->drawObject->tot_triangle_point/3; i++) { + int actualFace = dm->drawObject->triangle_to_mface[i]; int flag = 1; if(drawParams) { @@ -819,13 +822,13 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm, startFace = i; } } - if( startFace < dm->drawObject->nelements/3 ) { + if( startFace < dm->drawObject->tot_triangle_point/3 ) { if( lastFlag != 0 ) { /* if the flag is 0 it means the face is hidden or invisible */ if (lastFlag==1 && col) GPU_color_switch(1); else GPU_color_switch(0); - glDrawArrays(GL_TRIANGLES,startFace*3,dm->drawObject->nelements-startFace*3); + glDrawArrays(GL_TRIANGLES, startFace*3, dm->drawObject->tot_triangle_point - startFace*3); } } } @@ -935,7 +938,7 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *us if( useColors && mc ) GPU_color_setup(dm); if( !GPU_buffer_legacy(dm) ) { - int tottri = dm->drawObject->nelements/3; + int tottri = dm->drawObject->tot_triangle_point/3; glShadeModel(GL_SMOOTH); if(tottri == 0) { @@ -947,17 +950,17 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *us } else { /* we need to check if the next material changes */ - int next_actualFace= dm->drawObject->faceRemap[0]; + int next_actualFace= dm->drawObject->triangle_to_mface[0]; for( i = 0; i < tottri; i++ ) { - //int actualFace = dm->drawObject->faceRemap[i]; + //int actualFace = dm->drawObject->triangle_to_mface[i]; int actualFace = next_actualFace; MFace *mface= mf + actualFace; int drawSmooth= (mface->flag & ME_SMOOTH); int draw = 1; if(i != tottri-1) - next_actualFace= dm->drawObject->faceRemap[i+1]; + next_actualFace= dm->drawObject->triangle_to_mface[i+1]; orig= (index==NULL) ? actualFace : index[actualFace]; @@ -1129,9 +1132,9 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo GPU_normal_setup(dm); if( !GPU_buffer_legacy(dm) ) { - for( i = 0; i < dm->drawObject->nelements/3; i++ ) { + for( i = 0; i < dm->drawObject->tot_triangle_point/3; i++ ) { - a = dm->drawObject->faceRemap[i]; + a = dm->drawObject->triangle_to_mface[i]; mface = mf + a; new_matnr = mface->mat_nr + 1; @@ -1153,7 +1156,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo if( numdata != 0 ) { - GPU_buffer_free(buffer, NULL); + GPU_buffer_free(buffer); buffer = NULL; } @@ -1193,7 +1196,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo } if( numdata != 0 ) { elementsize = GPU_attrib_element_size( datatypes, numdata ); - buffer = GPU_buffer_alloc( elementsize*dm->drawObject->nelements, NULL ); + buffer = GPU_buffer_alloc( elementsize*dm->drawObject->tot_triangle_point); if( buffer == NULL ) { GPU_buffer_unbind(); dm->drawObject->legacy = 1; @@ -1202,7 +1205,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo varray = GPU_buffer_lock_stream(buffer); if( varray == NULL ) { GPU_buffer_unbind(); - GPU_buffer_free(buffer, NULL); + GPU_buffer_free(buffer); dm->drawObject->legacy = 1; return; } @@ -1341,7 +1344,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo } GPU_buffer_unbind(); } - GPU_buffer_free( buffer, NULL ); + GPU_buffer_free(buffer); } glShadeModel(GL_FLAT); -- cgit v1.2.3 From 5506d18fa8b185924799ee5b370253e79029a1e4 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Sat, 9 Jul 2011 14:22:52 +0000 Subject: Fox #27866: Curve handle snaps/locks when it shouldnt It was a precision error in calchandleNurb. Do not align handles along handle which si too short. --- source/blender/blenkernel/intern/curve.c | 41 +++++++++++++++++++------------- 1 file changed, 25 insertions(+), 16 deletions(-) (limited to 'source/blender/blenkernel/intern') diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 704af73dd10..202a3f28d9a 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -2431,6 +2431,7 @@ void calchandleNurb(BezTriple *bezt, BezTriple *prev, BezTriple *next, int mode) { float *p1,*p2,*p3, pt[3]; float dx1,dy1,dz1,dx,dy,dz,vx,vy,vz,len,len1,len2; + const float eps= 1e-5; if(bezt->h1==0 && bezt->h2==0) return; @@ -2587,30 +2588,38 @@ void calchandleNurb(BezTriple *bezt, BezTriple *prev, BezTriple *next, int mode) if(bezt->f1 & SELECT) { /* order of calculation */ if(bezt->h2==HD_ALIGN) { /* aligned */ - len= len2/len1; - p2[3]= p2[0]+len*(p2[0]-p2[-3]); - p2[4]= p2[1]+len*(p2[1]-p2[-2]); - p2[5]= p2[2]+len*(p2[2]-p2[-1]); + if(len1>eps) { + len= len2/len1; + p2[3]= p2[0]+len*(p2[0]-p2[-3]); + p2[4]= p2[1]+len*(p2[1]-p2[-2]); + p2[5]= p2[2]+len*(p2[2]-p2[-1]); + } } if(bezt->h1==HD_ALIGN) { - len= len1/len2; - p2[-3]= p2[0]+len*(p2[0]-p2[3]); - p2[-2]= p2[1]+len*(p2[1]-p2[4]); - p2[-1]= p2[2]+len*(p2[2]-p2[5]); + if(len2>eps) { + len= len1/len2; + p2[-3]= p2[0]+len*(p2[0]-p2[3]); + p2[-2]= p2[1]+len*(p2[1]-p2[4]); + p2[-1]= p2[2]+len*(p2[2]-p2[5]); + } } } else { if(bezt->h1==HD_ALIGN) { - len= len1/len2; - p2[-3]= p2[0]+len*(p2[0]-p2[3]); - p2[-2]= p2[1]+len*(p2[1]-p2[4]); - p2[-1]= p2[2]+len*(p2[2]-p2[5]); + if(len2>eps) { + len= len1/len2; + p2[-3]= p2[0]+len*(p2[0]-p2[3]); + p2[-2]= p2[1]+len*(p2[1]-p2[4]); + p2[-1]= p2[2]+len*(p2[2]-p2[5]); + } } if(bezt->h2==HD_ALIGN) { /* aligned */ - len= len2/len1; - p2[3]= p2[0]+len*(p2[0]-p2[-3]); - p2[4]= p2[1]+len*(p2[1]-p2[-2]); - p2[5]= p2[2]+len*(p2[2]-p2[-1]); + if(len1>eps) { + len= len2/len1; + p2[3]= p2[0]+len*(p2[0]-p2[-3]); + p2[4]= p2[1]+len*(p2[1]-p2[-2]); + p2[5]= p2[2]+len*(p2[2]-p2[-1]); + } } } } -- cgit v1.2.3 From de10ffab754d218e451078203cfa7e7d7da12eac Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Sat, 9 Jul 2011 17:03:35 +0000 Subject: Bugfix #27761 Material nodes: when no output node was active, it sets one. Not common to happen anymore, only for deleting output nodes without clicking on nodes. --- source/blender/blenkernel/intern/node.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'source/blender/blenkernel/intern') diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 518ee3c341a..13469e0b58b 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -2418,6 +2418,11 @@ void ntreeBeginExecTree(bNodeTree *ntree) if(ntree->type==NTREE_COMPOSIT) composit_begin_exec(ntree, ntree->stack); + + /* ensures only a single output node is enabled, texnode allows multiple though */ + if(ntree->type!=NTREE_TEXTURE) + ntreeSetOutput(ntree); + } ntree->init |= NTREE_EXEC_INIT; @@ -2765,9 +2770,6 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview) /* fixed seed, for example noise texture */ BLI_srandom(rd->cfra); - /* ensures only a single output node is enabled */ - ntreeSetOutput(ntree); - /* sets need_exec tags in nodes */ curnode = totnode= setExecutableNodes(ntree, &thdata); -- cgit v1.2.3 From de7592b48900221844fa8d687e9d850294c90746 Mon Sep 17 00:00:00 2001 From: Janne Karhu Date: Sun, 10 Jul 2011 17:04:56 +0000 Subject: Fix for [#26873] Animated displacement modifier on an object doesn't work with hair particle objects * Noise is now considered an animated texture as it changes with every frame * Converted a few places in particles code to use the particle system's own random table instead of BLI_frand. --- source/blender/blenkernel/intern/boids.c | 6 +++--- source/blender/blenkernel/intern/particle.c | 2 -- source/blender/blenkernel/intern/particle_system.c | 5 ----- source/blender/blenkernel/intern/texture.c | 4 ++++ 4 files changed, 7 insertions(+), 10 deletions(-) (limited to 'source/blender/blenkernel/intern') diff --git a/source/blender/blenkernel/intern/boids.c b/source/blender/blenkernel/intern/boids.c index 9f808704eee..a0f38e675f9 100644 --- a/source/blender/blenkernel/intern/boids.c +++ b/source/blender/blenkernel/intern/boids.c @@ -937,6 +937,7 @@ void boid_brain(BoidBrainData *bbd, int p, ParticleData *pa) BoidValues val; BoidState *state = get_boid_state(boids, pa); BoidParticle *bpa = pa->boid; + ParticleSystem *psys = bbd->sim->psys; int rand; //BoidCondition *cond; @@ -959,9 +960,8 @@ void boid_brain(BoidBrainData *bbd, int p, ParticleData *pa) bbd->wanted_co[0]=bbd->wanted_co[1]=bbd->wanted_co[2]=bbd->wanted_speed=0.0f; /* create random seed for every particle & frame */ - BLI_srandom(bbd->sim->psys->seed + p); - rand = BLI_rand(); - BLI_srandom((int)bbd->cfra + rand); + rand = (int)(PSYS_FRAND(psys->seed + p) * 1000); + rand = (int)(PSYS_FRAND((int)bbd->cfra + rand) * 1000); set_boid_values(&val, bbd->part->boids, pa); diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 72c92eed312..5e615a28eb2 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -2889,8 +2889,6 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra) if(psys_in_edit_mode(sim->scene, psys)) if(psys->renderdata==0 && (psys->edit==NULL || pset->flag & PE_DRAW_PART)==0) return; - - BLI_srandom(psys->seed); keyed = psys->flag & PSYS_KEYED; baked = psys->pointcache->mem_cache.first && psys->part->type != PART_HAIR; diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index b2e5c059edf..50f39704488 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -3514,8 +3514,6 @@ static void hair_step(ParticleSimulationData *sim, float cfra) PARTICLE_P; float disp = (float)psys_get_current_display_percentage(psys)/100.0f; - BLI_srandom(psys->seed); - LOOP_PARTICLES { if(PSYS_FRAND(p) > disp) pa->flag |= PARS_NO_DISP; @@ -3801,8 +3799,6 @@ static void cached_step(ParticleSimulationData *sim, float cfra) PARTICLE_P; float disp, dietime; - BLI_srandom(psys->seed); - psys_update_effectors(sim); disp= (float)psys_get_current_display_percentage(psys)/100.0f; @@ -4054,7 +4050,6 @@ static void system_step(ParticleSimulationData *sim, float cfra) /* set particles to be not calculated TODO: can't work with pointcache */ disp= (float)psys_get_current_display_percentage(psys)/100.0f; - BLI_srandom(psys->seed); LOOP_PARTICLES { if(PSYS_FRAND(p) > disp) pa->flag |= PARS_NO_DISP; diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c index 64f3c111434..036ba34d0c8 100644 --- a/source/blender/blenkernel/intern/texture.c +++ b/source/blender/blenkernel/intern/texture.c @@ -1486,6 +1486,10 @@ int BKE_texture_dependsOnTime(const struct Tex *texture) // assume anything in adt means the texture is animated return 1; } + else if(texture->type == TEX_NOISE) { + // noise always varies with time + return 1; + } return 0; } -- cgit v1.2.3 From 2fb4a37baaac6c7045ea0d7ace2826f1112714c5 Mon Sep 17 00:00:00 2001 From: Janne Karhu Date: Sun, 10 Jul 2011 17:30:31 +0000 Subject: Fix for [#27289] Hair: Render Option - Object does not point objects to end of "hair path" * Objects are now always rotated in the directions of the hair paths * Secondary fix: particle size wasn't updated for hair particles, so dupliobject size couldn't be change after the hair was edited --- source/blender/blenkernel/intern/particle.c | 75 +++++++++------------- source/blender/blenkernel/intern/particle_system.c | 6 +- 2 files changed, 36 insertions(+), 45 deletions(-) (limited to 'source/blender/blenkernel/intern') diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 5e615a28eb2..5995b895061 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -4372,58 +4372,45 @@ void psys_get_dupli_path_transform(ParticleSimulationData *sim, ParticleData *pa Object *ob = sim->ob; ParticleSystem *psys = sim->psys; ParticleSystemModifierData *psmd = sim->psmd; - float loc[3], nor[3], vec[3], side[3], len, obrotmat[4][4], qmat[4][4]; - float xvec[3] = {-1.0, 0.0, 0.0}, q[4], nmat[3][3]; + float loc[3], nor[3], vec[3], side[3], len; + float xvec[3] = {-1.0, 0.0, 0.0}, nmat[3][3]; sub_v3_v3v3(vec, (cache+cache->steps)->co, cache->co); len= normalize_v3(vec); - if(psys->part->rotmode) { - if(pa == NULL) - pa= psys->particles+cpa->pa[0]; + if(pa == NULL && psys->part->childflat != PART_CHILD_FACES) + pa = psys->particles + cpa->pa[0]; - vec_to_quat( q,xvec, ob->trackflag, ob->upflag); - quat_to_mat4( obrotmat,q); - obrotmat[3][3]= 1.0f; - - quat_to_mat4( qmat,pa->state.rot); - mul_m4_m4m4(mat, obrotmat, qmat); - } - else { - if(pa == NULL && psys->part->childflat != PART_CHILD_FACES) - pa = psys->particles + cpa->pa[0]; - - if(pa) - psys_particle_on_emitter(psmd,sim->psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,nor,0,0,0,0); - else - psys_particle_on_emitter(psmd,PART_FROM_FACE,cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,loc,nor,0,0,0,0); + if(pa) + psys_particle_on_emitter(psmd,sim->psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,nor,0,0,0,0); + else + psys_particle_on_emitter(psmd,PART_FROM_FACE,cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,loc,nor,0,0,0,0); - copy_m3_m4(nmat, ob->imat); - transpose_m3(nmat); - mul_m3_v3(nmat, nor); - - /* make sure that we get a proper side vector */ - if(fabs(dot_v3v3(nor,vec))>0.999999) { - if(fabs(dot_v3v3(nor,xvec))>0.999999) { - nor[0] = 0.0f; - nor[1] = 1.0f; - nor[2] = 0.0f; - } - else { - nor[0] = 1.0f; - nor[1] = 0.0f; - nor[2] = 0.0f; - } - } - cross_v3_v3v3(side, nor, vec); - normalize_v3(side); - cross_v3_v3v3(nor, vec, side); + copy_m3_m4(nmat, ob->imat); + transpose_m3(nmat); + mul_m3_v3(nmat, nor); - unit_m4(mat); - VECCOPY(mat[0], vec); - VECCOPY(mat[1], side); - VECCOPY(mat[2], nor); + /* make sure that we get a proper side vector */ + if(fabs(dot_v3v3(nor,vec))>0.999999) { + if(fabs(dot_v3v3(nor,xvec))>0.999999) { + nor[0] = 0.0f; + nor[1] = 1.0f; + nor[2] = 0.0f; + } + else { + nor[0] = 1.0f; + nor[1] = 0.0f; + nor[2] = 0.0f; + } } + cross_v3_v3v3(side, nor, vec); + normalize_v3(side); + cross_v3_v3v3(nor, vec, side); + + unit_m4(mat); + VECCOPY(mat[0], vec); + VECCOPY(mat[1], side); + VECCOPY(mat[2], nor); *scale= len; } diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index 50f39704488..63a9c224971 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -3510,11 +3510,15 @@ static void do_hair_dynamics(ParticleSimulationData *sim) static void hair_step(ParticleSimulationData *sim, float cfra) { ParticleSystem *psys = sim->psys; -/* ParticleSettings *part = psys->part; */ + ParticleSettings *part = psys->part; PARTICLE_P; float disp = (float)psys_get_current_display_percentage(psys)/100.0f; LOOP_PARTICLES { + pa->size = part->size; + if(part->randsize > 0.0f) + pa->size *= 1.0f - part->randsize * PSYS_FRAND(p + 1); + if(PSYS_FRAND(p) > disp) pa->flag |= PARS_NO_DISP; else -- cgit v1.2.3 From 897cbe4b42a31ad7afe6ab3e4e89ac5318eef91a Mon Sep 17 00:00:00 2001 From: Janne Karhu Date: Sun, 10 Jul 2011 23:49:59 +0000 Subject: Fix for [#27398] Particle systems with animated groups render incorrectly in viewport * Hmph.. depsgraph and group duplication == illogical. --- source/blender/blenkernel/intern/depsgraph.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/blender/blenkernel/intern') diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c index c2800410657..d39be9d683c 100644 --- a/source/blender/blenkernel/intern/depsgraph.c +++ b/source/blender/blenkernel/intern/depsgraph.c @@ -599,7 +599,7 @@ static void build_dag_object(DagForest *dag, DagNode *scenenode, Scene *scene, O if(part->ren_as == PART_DRAW_GR && part->dup_group) { for(go=part->dup_group->gobject.first; go; go=go->next) { node2 = dag_get_node(dag, go->ob); - dag_add_relation(dag, node, node2, DAG_RL_OB_OB, "Particle Group Visualisation"); + dag_add_relation(dag, node2, node, DAG_RL_OB_OB, "Particle Group Visualisation"); } } -- cgit v1.2.3 From 8ca556a32a1ce2b90881aadfa88239dfb7bb5f9e Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 11 Jul 2011 09:05:10 +0000 Subject: Fix #27921: optimal display with 2 subsurf modifiers fails. --- source/blender/blenkernel/intern/subsurf_ccg.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'source/blender/blenkernel/intern') diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index a66caf8879f..67d7e7bffd6 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -1176,7 +1176,8 @@ static void ccgDM_drawEdges(DerivedMesh *dm, int drawLooseEdges, int UNUSED(draw CCGSubSurf *ss = ccgdm->ss; CCGEdgeIterator *ei = ccgSubSurf_getEdgeIterator(ss); CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss); - int i, edgeSize = ccgSubSurf_getEdgeSize(ss); + int i, j, edgeSize = ccgSubSurf_getEdgeSize(ss); + int totedge = ccgSubSurf_getNumEdges(ss); int gridSize = ccgSubSurf_getGridSize(ss); int useAging; @@ -1184,13 +1185,16 @@ static void ccgDM_drawEdges(DerivedMesh *dm, int drawLooseEdges, int UNUSED(draw ccgSubSurf_getUseAgeCounts(ss, &useAging, NULL, NULL, NULL); - for (; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) { - CCGEdge *e = ccgEdgeIterator_getCurrent(ei); + for (j=0; j< totedge; j++) { + CCGEdge *e = ccgdm->edgeMap[j].edge; DMGridData *edgeData = ccgSubSurf_getEdgeDataArray(ss, e); if (!drawLooseEdges && !ccgSubSurf_getEdgeNumFaces(e)) continue; + if(ccgdm->edgeFlags && !(ccgdm->edgeFlags[j] & ME_EDGEDRAW)) + continue; + if (useAging && !(G.f&G_BACKBUFSEL)) { int ageCol = 255-ccgSubSurf_getEdgeAge(ss, e)*4; glColor3ub(0, ageCol>0?ageCol:0, 0); -- cgit v1.2.3 From 7dfe34864e019fe08fbdfa62d4dacf158a0602bf Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 11 Jul 2011 09:08:08 +0000 Subject: Fix #27912: crash after mesh.materials.pop(). --- source/blender/blenkernel/intern/material.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/blender/blenkernel/intern') diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 2f29074834b..962c7fd5e86 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -550,7 +550,7 @@ Material *material_pop_id(ID *id, int index) Material **mat; if(index + 1 != (*totcol)) - memmove((*matar), (*matar) + 1, (*totcol) - (index + 1)); + memmove((*matar), (*matar) + 1, sizeof(void *) * ((*totcol) - (index + 1))); (*totcol)--; -- cgit v1.2.3