Commit: e5a47562eb55b6434b8a141f896c1ee0f89d4b25
Author: Antony Riakiotakis
Date:   Tue Apr 7 14:19:16 2015 +0200
Branches: gooseberry
https://developer.blender.org/rBe5a47562eb55b6434b8a141f896c1ee0f89d4b25

Merge branch 'master' into gooseberry

Conflicts:
        source/blender/blenkernel/intern/image.c
        source/blender/blenkernel/intern/object_dupli.c
        source/blender/blenkernel/intern/sequencer.c
        source/blender/blenloader/intern/versioning_270.c
        source/blender/editors/space_view3d/view3d_draw.c
        source/blender/editors/space_view3d/view3d_ops.c
        source/blender/makesdna/DNA_sequence_types.h
        source/blender/makesdna/DNA_view3d_types.h
        source/blender/windowmanager/CMakeLists.txt
        source/blender/windowmanager/intern/wm_operators.c
        source/blenderplayer/bad_level_call_stubs/stubs.c

===================================================================



===================================================================

diff --cc source/blender/blenkernel/BKE_sequencer.h
index 494caa2,4a45489..0e3fb5c
--- a/source/blender/blenkernel/BKE_sequencer.h
+++ b/source/blender/blenkernel/BKE_sequencer.h
@@@ -223,8 -225,8 +225,9 @@@ void BKE_sequencer_base_clipboard_point
  void BKE_sequencer_base_clipboard_pointers_restore(struct ListBase *seqbase, 
struct Main *bmain);
  
  void BKE_sequence_free(struct Scene *scene, struct Sequence *seq);
+ void BKE_sequence_free_anim(struct Sequence *seq);
  const char *BKE_sequence_give_name(struct Sequence *seq);
 +ListBase *BKE_sequence_seqbase_get(struct Sequence *seq, int *r_offset);
  void BKE_sequence_calc(struct Scene *scene, struct Sequence *seq);
  void BKE_sequence_calc_disp(struct Scene *scene, struct Sequence *seq);
  void BKE_sequence_reload_new_file(struct Scene *scene, struct Sequence *seq, 
const bool lock_range);
diff --cc source/blender/blenkernel/CMakeLists.txt
index 636a4cd,67c8f0f..fb87aa8
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@@ -217,8 -211,9 +217,10 @@@ set(SR
        BKE_depsgraph.h
        BKE_displist.h
        BKE_dynamicpaint.h
+       BKE_editmesh.h
+       BKE_editmesh_bvh.h
        BKE_effect.h
 +      BKE_facemap.h
        BKE_fcurve.h
        BKE_fluidsim.h
        BKE_font.h
@@@ -271,11 -267,8 +274,9 @@@
        BKE_softbody.h
        BKE_sound.h
        BKE_speaker.h
 +      BKE_strands.h
        BKE_subsurf.h
        BKE_suggestions.h
-       BKE_editmesh.h
-       BKE_editmesh_bvh.h
        BKE_text.h
        BKE_texture.h
        BKE_tracking.h
diff --cc source/blender/blenkernel/intern/object_dupli.c
index 9dccda9,8abe4bd..7ec0a8d
--- a/source/blender/blenkernel/intern/object_dupli.c
+++ b/source/blender/blenkernel/intern/object_dupli.c
@@@ -1324,405 -1237,7 +1324,405 @@@ int count_duplilist(Object *ob
        return 1;
  }
  
 +/* ------------------------------------------------------------------------- 
*/
 +
 +static void dupli_cache_calc_boundbox(DupliObjectData *data)
 +{
 +      float min[3], max[3];
 +      
 +      if (data->dm) {
 +              INIT_MINMAX(min, max);
 +              data->dm->getMinMax(data->dm, min, max);
 +      }
 +      else {
 +              zero_v3(min);
 +              zero_v3(max);
 +      }
 +      
 +      BKE_boundbox_init_from_minmax(&data->bb, min, max);
 +}
 +
 +static bool UNUSED_FUNCTION(dupli_object_data_strands_unique_name)(ListBase 
*lb, DupliObjectDataStrands *link)
 +{
 +      if (lb && link) {
 +              return BLI_uniquename(lb, link, DATA_("Strands"), '.', 
offsetof(DupliObjectDataStrands, name), sizeof(link->name));
 +      }
 +      return false;
 +}
 +
 +void BKE_dupli_object_data_init(DupliObjectData *data, Object *ob)
 +{
 +      data->ob = ob;
 +      
 +      data->dm = NULL;
 +      BLI_listbase_clear(&data->strands);
 +      
 +      memset(&data->bb, 0, sizeof(data->bb));
 +      dupli_cache_calc_boundbox(data);
 +}
 +
 +void BKE_dupli_object_data_clear(DupliObjectData *data)
 +{
 +      DupliObjectDataStrands *link;
 +      
 +      if (data->dm) {
 +              /* we lock DMs in the cache to prevent freeing outside,
 +               * now allow releasing again
 +               */
 +              data->dm->needsFree = true;
 +              data->dm->release(data->dm);
 +      }
 +      
 +      for (link = data->strands.first; link; link = link->next) {
 +              if (link->strands)
 +                      BKE_strands_free(link->strands);
 +      }
 +      BLI_freelistN(&data->strands);
 +}
 +
 +void BKE_dupli_object_data_set_mesh(DupliObjectData *data, DerivedMesh *dm)
 +{
 +      if (data->dm) {
 +              /* we lock DMs in the cache to prevent freeing outside,
 +               * now allow releasing again
 +               */
 +              data->dm->needsFree = true;
 +              data->dm->release(data->dm);
 +      }
 +      
 +      data->dm = dm;
 +      /* we own this dm now and need to protect it until we free it ourselves 
*/
 +      dm->needsFree = false;
 +      
 +      dupli_cache_calc_boundbox(data);
 +}
 +
 +void BKE_dupli_object_data_add_strands(DupliObjectData *data, const char 
*name, Strands *strands)
 +{
 +      DupliObjectDataStrands *link = NULL;
 +      for (link = data->strands.first; link; link = link->next) {
 +              if (STREQ(link->name, name))
 +                      break;
 +      }
 +      
 +      if (!link) {
 +              link = MEM_callocN(sizeof(DupliObjectDataStrands), "strands 
link");
 +              BLI_strncpy(link->name, name, sizeof(link->name));
 +              link->strands = strands;
 +              
 +              BLI_addtail(&data->strands, link);
 +      }
 +      else {
 +              if (link->strands && link->strands != strands)
 +                      BKE_strands_free(link->strands);
 +              link->strands = strands;
 +      }
 +      
 +      dupli_cache_calc_boundbox(data);
 +}
 +
 +Strands *BKE_dupli_object_data_find_strands(DupliObjectData *data, const char 
*name)
 +{
 +      DupliObjectDataStrands *link;
 +      for (link = data->strands.first; link; link = link->next) {
 +              if (STREQ(link->name, name))
 +                      return link->strands;
 +      }
 +      return NULL;
 +}
 +
 +/* ------------------------------------------------------------------------- 
*/
 +
 +static void dupli_object_data_free(DupliObjectData *data)
 +{
 +      BKE_dupli_object_data_clear(data);
 +      MEM_freeN(data);
 +}
 +
 +static void dupli_object_free(DupliObject *dob)
 +{
 +      MEM_freeN(dob);
 +}
 +
 +DupliCache *BKE_dupli_cache_new(void)
 +{
 +      DupliCache *dupcache = MEM_callocN(sizeof(DupliCache), "dupli object 
cache");
 +      
 +      dupcache->ghash = BLI_ghash_new(BLI_ghashutil_ptrhash, 
BLI_ghashutil_ptrcmp, "dupli object data hash");
 +      
 +      return dupcache;
 +}
 +
 +void BKE_dupli_cache_free(DupliCache *dupcache)
 +{
 +      BKE_dupli_cache_clear(dupcache);
 +      
 +      BLI_ghash_free(dupcache->ghash, NULL, 
(GHashValFreeFP)dupli_object_data_free);
 +      MEM_freeN(dupcache);
 +}
 +
 +void BKE_dupli_cache_clear(DupliCache *dupcache)
 +{
 +      DupliObject *dob, *dob_next;
 +      for (dob = dupcache->duplilist.first; dob; dob = dob_next) {
 +              dob_next = dob->next;
 +              
 +              dupli_object_free(dob);
 +      }
 +      BLI_listbase_clear(&dupcache->duplilist);
 +      
 +      BLI_ghash_clear(dupcache->ghash, NULL, 
(GHashValFreeFP)dupli_object_data_free);
 +}
 +
 +void BKE_dupli_cache_clear_instances(DupliCache *dupcache)
 +{
 +      DupliObject *dob, *dob_next;
 +      for (dob = dupcache->duplilist.first; dob; dob = dob_next) {
 +              dob_next = dob->next;
 +              
 +              dupli_object_free(dob);
 +      }
 +      BLI_listbase_clear(&dupcache->duplilist);
 +}
 +
 +static DupliObjectData *dupli_cache_add_object_data(DupliCache *dupcache, 
Object *ob)
 +{
 +      DupliObjectData *data = MEM_callocN(sizeof(DupliObjectData), "dupli 
object data");
 +      
 +      data->ob = ob;
 +      BLI_ghash_insert(dupcache->ghash, data->ob, data);
 +      return data;
 +}
 +
 +static DupliObject *dupli_cache_add_object(DupliCache *dupcache)
 +{
 +      DupliObject *dob = MEM_callocN(sizeof(DupliObject), "dupli object");
 +      
 +      unit_m4(dob->mat);
 +      
 +      BLI_addtail(&dupcache->duplilist, dob);
 +      return dob;
 +}
 +
 +static int count_hair_verts(ParticleSystem *psys)
 +{
 +      int numverts = 0;
 +      int p;
 +      for (p = 0; p < psys->totpart; ++p) {
 +              numverts += psys->particles[p].totkey;
 +      }
 +      return numverts;
 +}
 +
 +void BKE_dupli_cache_from_group(Scene *scene, Group *group, CacheLibrary 
*cachelib, DupliCache *dupcache, EvaluationContext *eval_ctx)
 +{
 +      DupliObject *dob;
 +      
 +      BKE_dupli_cache_clear(dupcache);
 +      
 +      if (!(group && cachelib))
 +              return;
 +      
 +      {
 +              /* copy duplilist to the cache */
 +              ListBase *duplilist = group_duplilist(eval_ctx, scene, group);
 +              dupcache->duplilist = *duplilist;
 +              MEM_freeN(duplilist);
 +      }
 +      
 +      for (dob = dupcache->duplilist.first; dob; dob = dob->next) {
 +              DupliObjectData *data = BKE_dupli_cache_find_data(dupcache, 
dob->ob);
 +              if (!data) {
 +                      ParticleSystem *psys;
 +                      
 +                      data = dupli_cache_add_object_data(dupcache, dob->ob);
 +                      
 +                      if (cachelib->data_types & CACHE_TYPE_DERIVED_MESH) {
 +                              if (dob->ob->type == OB_MESH) {
 +                                      DerivedMesh *dm;
 +                                      
 +                                      if (eval_ctx->mode == DAG_EVAL_RENDER) {
 +                                              dm = 
mesh_create_derived_render(scene, dob->ob, CD_MASK_BAREMESH);
 +                                      }
 +                                      else {
 +                                              dm = 
mesh_create_derived_view(scene, dob->ob, CD_MASK_BAREMESH);
 +                                      }
 +                                      
 +                                      if (dm)
 +                                              
BKE_dupli_object_data_set_mesh(data, dm);
 +                              }
 +                      }
 +                      
 +                      for (psys = dob->ob->particlesystem.first; psys; psys = 
psys->next) {
 +                              if (cachelib->data_types & CACHE_TYPE_HAIR) {
 +                                      if (psys->part && psys->part->type == 
PART_HAIR) {
 +                                              int numstrands = psys->totpart;
 +                                              int numverts = 
count_hair_verts(psys);
 +                                              ParticleData *pa;
 +                                              HairKey *hkey;
 +                                              int p, k;
 +                                              
 +                                              Strands *strands = 
BKE_strands_new(numstrands, numverts);
 +                                              StrandsCurve *scurve = 
strands->curves;
 +                                              StrandsVertex *svert = 
strands->verts;
 +                                              
 +                                              for (p = 0, pa = 
psys->particles; p < psys->totpart; ++p, ++pa) {
 +                                                      scurve->numverts = 
pa->totkey;
 +                                                      
 +                                                      for (k = 0, hkey = 
pa->hair; k < pa->totkey; ++k, ++hkey) {
 +                                                              
copy_v3_v3(svert->co, hkey->co);
 +                                                              svert->time = 
hkey->time;
 +                                                              svert->weight = 
hkey->weight;
 +                                                              
 +                                                              ++svert;
 +                                                      }
 +                                                      
 +                                                      ++scurve;
 +                                              }
 +                                              
 +                                              
BKE_dupli_object_data_add_strands(data, psys->name, strands);
 +                                      }
 +                              }
 +                      }
 +              }
 +      }
 +}
 +
 +/* ------------------------------------------------------------------------- 
*/
 +
 +void BKE_object_dupli_cache_update(Scene *scene, Object *ob, 
EvaluationContext *eval_ctx, float frame)
 +{
 +      const eCacheLibrary_EvalMode eval_mode = eval_ctx->mode == 
DAG_EVAL_RENDER ? CACHE_LIBRARY_EVAL_RENDER : CACHE_LIBRARY_EVAL_REALTIME;
 +      
 +      bool is_dupligroup = (ob->transflag & OB_DUPLIGROUP) && ob->dup_group;
 +      bool is_cached = ob->cache_library && (ob->cache_library->source_mode 
== CACHE_LIBRARY_SOURCE_CACHE || ob->cache_library->display_mode == 
CACHE_LIBRARY_DISPLAY_RESULT);
 +      
 +      /* cache is a group duplicator feature only */
 +      if (is_dupligroup && is_cached) {
 +              
 +              if (ob->dup_cache && !(ob->dup_cache->flag & 
DUPCACHE_FLAG_DIRTY)) {
 +                      /* skip if cache is valid */
 +              }
 +              else {
 +                      if (G.debug & G_DEBUG)
 +                              printf("Update dupli cache for object '%s'\n", 
ob->id.name+2);
 +                      
 +                      if (ob->dup_cache) {
 +                              BKE_dupli_cache_clear(ob->dup_cache);
 +                      }
 +                      else {
 +                              ob->dup_cache = BKE_dupli_cache_new();
 +                      }
 +                      
 +                      /* skip reading when the cachelib is baking, avoids 
unnecessary memory allocation */
 +                      if (!(ob->cache_library->flag & CACHE_LIBRARY_BAKING)) {
 +                              /* TODO at this point we could apply animation 
offset */
 +                              BKE_cache_read_dupli_cache(ob->cache_library, 
ob->dup_cache, scene, ob->dup_group, frame, eval_mode);
 +                      }
 +                      
 +                      ob->dup_cache->flag &= ~DUPCACHE_FL

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to