diff options
author | Nicholas Bishop <nicholasbishop@gmail.com> | 2010-10-18 06:43:53 +0400 |
---|---|---|
committer | Nicholas Bishop <nicholasbishop@gmail.com> | 2010-10-18 06:43:53 +0400 |
commit | 08232350d5797302e3638e69ec78657d853976aa (patch) | |
tree | ad5ff38236343cdcb5eee6d8c6711cb1b32a1912 /source/blender/blenkernel/intern | |
parent | 5b31d545dfae5ee3fd5f4a5d0e9497a1c7c2a86b (diff) | |
parent | a6d62bf0db09ae2759fd45abb3af563fefc13690 (diff) |
svn merge https://svn.blender.org/svnroot/bf-blender/trunk/blender -r32200:32300
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 26 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/curve.c | 12 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/customdata.c | 29 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node.c | 80 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/pointcache.c | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/report.c | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/seqeffects.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/smoke.c | 33 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/sound.c | 4 |
9 files changed, 132 insertions, 60 deletions
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index ae99e2c9242..8dd71a60bbc 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -1675,8 +1675,20 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos DerivedMesh *dm, *orcodm, *clothorcodm, *finaldm; int numVerts = me->totvert; int required_mode; + int isPrevDeform= FALSE; + int skipVirtualArmature = (useDeform < 0); - md = firstmd = (useDeform<0) ? ob->modifiers.first : modifiers_getVirtualModifierList(ob); + if(!skipVirtualArmature) { + firstmd = modifiers_getVirtualModifierList(ob); + } + else { + /* game engine exception */ + firstmd = ob->modifiers.first; + if(firstmd && firstmd->type == eModifierType_Armature) + firstmd = firstmd->next; + } + + md = firstmd; modifiers_clearErrors(ob); @@ -1792,6 +1804,16 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos } } + /* if this is not the last modifier in the stack then recalculate the normals + * to avoid giving bogus normals to the next modifier see: [#23673] */ + if(isPrevDeform && mti->dependsOnNormals && mti->dependsOnNormals(md)) { + /* XXX, this covers bug #23673, but we may need normal calc for other types */ + if(dm->type == DM_TYPE_CDDM) { + CDDM_apply_vert_coords(dm, deformedVerts); + CDDM_calc_normals(dm); + } + } + mti->deformVerts(md, ob, dm, deformedVerts, numVerts, useRenderParams, useDeform); } else { DerivedMesh *ndm; @@ -1902,6 +1924,8 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos } } + isPrevDeform= (mti->type == eModifierTypeType_OnlyDeform); + /* grab modifiers until index i */ if((index >= 0) && (modifiers_indexInObject(ob, md) >= index)) break; diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index d13738808d1..9578b5185af 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -636,7 +636,7 @@ static void makecyclicknots(float *knots, short pnts, short order) -void makeknots(Nurb *nu, short uv) +static void makeknots(Nurb *nu, short uv) { if(nu->type == CU_NURBS) { if(uv == 1) { @@ -668,6 +668,16 @@ void makeknots(Nurb *nu, short uv) } } +void nurbs_knot_calc_u(Nurb *nu) +{ + makeknots(nu, 1); +} + +void nurbs_knot_calc_v(Nurb *nu) +{ + makeknots(nu, 2); +} + static void basisNurb(float t, short order, short pnts, float *knots, float *basis, int *start, int *end) { float d, e; diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index 1214572e844..7e4de5e36d6 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -42,6 +42,7 @@ #include "BLI_blenlib.h" #include "BLI_linklist.h" +#include "BLI_math.h" #include "BLI_mempool.h" #include "BKE_customdata.h" @@ -454,22 +455,27 @@ static void layerSwap_mdisps(void *data, const int *ci) int corners, cornersize, S; /* this function is untested .. */ - corners = mdisp_corners(s); - cornersize = s->totdisp/corners; + if(s->disps) { + corners = mdisp_corners(s); + cornersize = s->totdisp/corners; - d = MEM_callocN(sizeof(float) * 3 * s->totdisp, "mdisps swap"); + d = MEM_callocN(sizeof(float) * 3 * s->totdisp, "mdisps swap"); - for(S = 0; S < corners; S++) - memcpy(d + cornersize*S, s->disps + cornersize*ci[S], cornersize*3*sizeof(float)); - - if(s->disps) - MEM_freeN(s->disps); - s->disps = d; + for(S = 0; S < corners; S++) + memcpy(d + cornersize*S, s->disps + cornersize*ci[S], cornersize*3*sizeof(float)); + + if(s->disps) + MEM_freeN(s->disps); + s->disps = d; + } } static void layerInterp_mdisps(void **sources, float *weights, float *sub_weights, int count, void *dest) { + MDisps *d = dest; + int i; + // XXX #if 0 MDisps *d = dest; @@ -516,6 +522,11 @@ static void layerInterp_mdisps(void **sources, float *weights, float *sub_weight copy_v3_v3(d->disps[y * st + x], srcdisp); } } +#else + if(d->disps) { + for(i = 0; i < d->totdisp; ++i) + zero_v3(d->disps[i]); + } #endif } diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 135ddbab2b7..cb98c2282bc 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -1690,6 +1690,45 @@ static int node_recurs_check(bNode *node, bNode ***nsort, int level) return 0xFFF; } + +static void ntreeSetOutput(bNodeTree *ntree) +{ + bNode *node; + + /* find the active outputs, might become tree type dependant handler */ + for(node= ntree->nodes.first; node; node= node->next) { + if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) { + bNode *tnode; + int output= 0; + + /* we need a check for which output node should be tagged like this, below an exception */ + if(node->type==CMP_NODE_OUTPUT_FILE) + continue; + + /* there is more types having output class, each one is checked */ + for(tnode= ntree->nodes.first; tnode; tnode= tnode->next) { + if(tnode->typeinfo->nclass==NODE_CLASS_OUTPUT) { + /* same type, exception for viewer */ + if(tnode->type==node->type || + (ELEM(tnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER) && + ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))) { + if(tnode->flag & NODE_DO_OUTPUT) { + output++; + if(output>1) + tnode->flag &= ~NODE_DO_OUTPUT; + } + } + } + } + if(output==0) + node->flag |= NODE_DO_OUTPUT; + } + } + + /* here we could recursively set which nodes have to be done, + might be different for editor or for "real" use... */ +} + void ntreeSolveOrder(bNodeTree *ntree) { bNode *node, **nodesort, **nsort; @@ -1738,38 +1777,11 @@ void ntreeSolveOrder(bNodeTree *ntree) } MEM_freeN(nodesort); - - /* find the active outputs, might become tree type dependant handler */ - for(node= ntree->nodes.first; node; node= node->next) { - if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) { - bNode *tnode; - int output= 0; - - /* we need a check for which output node should be tagged like this, below an exception */ - if(node->type==CMP_NODE_OUTPUT_FILE) - continue; - - /* there is more types having output class, each one is checked */ - for(tnode= ntree->nodes.first; tnode; tnode= tnode->next) { - if(tnode->typeinfo->nclass==NODE_CLASS_OUTPUT) { - if(tnode->type==node->type) { - if(tnode->flag & NODE_DO_OUTPUT) { - output++; - if(output>1) - tnode->flag &= ~NODE_DO_OUTPUT; - } - } - } - } - if(output==0) - node->flag |= NODE_DO_OUTPUT; - } - } - - /* here we could recursively set which nodes have to be done, - might be different for editor or for "real" use... */ + + ntreeSetOutput(ntree); } + /* Should be callback! */ /* Do not call execs here */ void NodeTagChanged(bNodeTree *ntree, bNode *node) @@ -2466,6 +2478,9 @@ 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); @@ -2564,7 +2579,10 @@ bNodeTree *ntreeLocalize(bNodeTree *ntree) } /* end animdata uglyness */ - + + /* ensures only a single output node is enabled */ + ntreeSetOutput(ntree); + /* move over the compbufs */ /* right after ntreeCopyTree() oldsock pointers are valid */ for(node= ntree->nodes.first; node; node= node->next) { diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c index 784f6e40706..e1006cd99cd 100644 --- a/source/blender/blenkernel/intern/pointcache.c +++ b/source/blender/blenkernel/intern/pointcache.c @@ -1015,8 +1015,9 @@ void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob, Scene *scene, int dup if(ELEM(psys->part->phystype, PART_PHYS_NO, PART_PHYS_KEYED)) continue; - if(psys->part->type == PART_HAIR && (psys->flag & PSYS_HAIR_DYNAMICS)==0) - continue; + /* hair needs to be included in id-list for cache edit mode to work */ + /* if(psys->part->type == PART_HAIR && (psys->flag & PSYS_HAIR_DYNAMICS)==0) */ + /* continue; */ if(psys->part->type == PART_FLUID) continue; diff --git a/source/blender/blenkernel/intern/report.c b/source/blender/blenkernel/intern/report.c index 3773757f5d5..f69547fd1da 100644 --- a/source/blender/blenkernel/intern/report.c +++ b/source/blender/blenkernel/intern/report.c @@ -127,6 +127,7 @@ void BKE_reportf(ReportList *reports, ReportType type, const char *format, ...) va_start(args, format); vprintf(format, args); va_end(args); + fprintf(stdout, "\n"); /* otherise each report needs to include a \n */ fflush(stdout); /* this ensures the message is printed before a crash */ } diff --git a/source/blender/blenkernel/intern/seqeffects.c b/source/blender/blenkernel/intern/seqeffects.c index 4a00922f1d2..7b428661c6d 100644 --- a/source/blender/blenkernel/intern/seqeffects.c +++ b/source/blender/blenkernel/intern/seqeffects.c @@ -3007,7 +3007,7 @@ void sequence_effect_speed_rebuild_map(Scene *scene, Sequence * seq, int force) } if (v->flags & SEQ_SPEED_COMPRESS_IPO_Y) { - facf *= v->length; + facf *= seq->seq1->len; } facf *= v->globalSpeed; diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c index d0fcde0da58..965ce9801d7 100644 --- a/source/blender/blenkernel/intern/smoke.c +++ b/source/blender/blenkernel/intern/smoke.c @@ -800,20 +800,25 @@ static float calc_voxel_transp(float *result, float *input, int res[3], int *pix static int get_lamp(Scene *scene, float *light) { Base *base_tmp = NULL; - for(base_tmp = scene->base.first; base_tmp; base_tmp= base_tmp->next) - { - if(base_tmp->object->type == OB_LAMP) - { - Lamp *la = (Lamp *)base_tmp->object->data; - - if(la->type == LA_LOCAL) - { - VECCOPY(light, base_tmp->object->obmat[3]); - return 1; - } - } - } - return 0; + int found_lamp = 0; + + // try to find a lamp, preferably local + for(base_tmp = scene->base.first; base_tmp; base_tmp= base_tmp->next) { + if(base_tmp->object->type == OB_LAMP) { + Lamp *la = base_tmp->object->data; + + if(la->type == LA_LOCAL) { + copy_v3_v3(light, base_tmp->object->obmat[3]); + return 1; + } + else if(!found_lamp) { + copy_v3_v3(light, base_tmp->object->obmat[3]); + found_lamp = 1; + } + } + } + + return found_lamp; } static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd) diff --git a/source/blender/blenkernel/intern/sound.c b/source/blender/blenkernel/intern/sound.c index 26392132038..5e95b19b64f 100644 --- a/source/blender/blenkernel/intern/sound.c +++ b/source/blender/blenkernel/intern/sound.c @@ -433,9 +433,11 @@ void sound_seek_scene(struct bContext *C) if(scene->audio.flag & AUDIO_SCRUB && !CTX_wm_screen(C)->animtimer) { - // AUD_XXX TODO: fix scrubbing, it currently doesn't stop playing if(scene->audio.flag & AUDIO_SYNC) + { + AUD_seek(scene->sound_scene_handle, CFRA / FPS); AUD_seekSequencer(scene->sound_scene_handle, CFRA / FPS); + } else AUD_seek(scene->sound_scene_handle, CFRA / FPS); AUD_resume(scene->sound_scene_handle); |