[Bf-blender-cvs] [e5a4756] gooseberry: Merge branch 'master' into gooseberry
Antony Riakiotakis
noreply at git.blender.org
Tue Apr 7 14:19:40 CEST 2015
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. @@
More information about the Bf-blender-cvs
mailing list