[Bf-blender-cvs] [c94f100] soc-2016-layer_manager: Use array for storing object bases in layers
Julian Eisel
noreply at git.blender.org
Mon Jun 13 00:34:14 CEST 2016
Commit: c94f100aea3dd98b8dfce8668dbe47e161d18b80
Author: Julian Eisel
Date: Mon Jun 13 00:31:44 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rBc94f100aea3dd98b8dfce8668dbe47e161d18b80
Use array for storing object bases in layers
Reading bases of a layer from file still doesn't work :/
===================================================================
M source/blender/blenkernel/BKE_object.h
M source/blender/blenkernel/intern/object_layer.c
M source/blender/blenloader/intern/readfile.c
M source/blender/blenloader/intern/writefile.c
M source/blender/editors/space_layers/layers_ops.c
M source/blender/editors/space_view3d/view3d_draw.c
M source/blender/makesdna/DNA_space_types.h
===================================================================
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 65ffacf..e4cbdba 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -277,6 +277,11 @@ bool BKE_object_modifier_update_subframe(struct Scene *scene, struct Object *ob,
#include "BKE_layer.h" /* XXX */
+#define BKE_OBJECTLAYER_BASES_ITER_START(oblayer, idx_name, base_name) \
+ for (int idx_name = 0; idx_name < oblayer->tot_bases; idx_name++) { \
+ Base *base_name = oblayer->bases[idx_name];
+#define BKE_OBJECTLAYER_BASES_ITER_END } (void)0
+
LayerTreeItem *BKE_objectlayer_add(
LayerTree *tree, LayerTreeItem *parent, const char *name,
const LayerItemPollFunc poll, LayerItemDrawFunc draw, LayerItemDrawSettingsFunc draw_settings);
diff --git a/source/blender/blenkernel/intern/object_layer.c b/source/blender/blenkernel/intern/object_layer.c
index 7458aa8..ff9d79e 100644
--- a/source/blender/blenkernel/intern/object_layer.c
+++ b/source/blender/blenkernel/intern/object_layer.c
@@ -36,9 +36,8 @@
static void objectlayer_free(LayerTreeItem *litem)
{
LayerTypeObject *oblayer = (LayerTypeObject *)litem;
- if (oblayer->basehash) {
- BLI_ghash_free(oblayer->basehash, NULL, NULL);
- oblayer->basehash = NULL;
+ if (oblayer->bases) {
+ MEM_freeN(oblayer->bases);
}
}
@@ -50,21 +49,30 @@ LayerTreeItem *BKE_objectlayer_add(
BLI_assert(tree->type == LAYER_TREETYPE_OBJECT);
BKE_layeritem_register(tree, &oblayer->litem, parent, LAYER_ITEMTYPE_LAYER, name, poll, draw, draw_settings);
- oblayer->basehash = BLI_ghash_str_new(__func__);
oblayer->litem.free = objectlayer_free;
return &oblayer->litem;
}
+static void objectlayer_array_resize(LayerTypeObject *oblayer, unsigned int new_tot_objects)
+{
+ if (new_tot_objects > 0) {
+ oblayer->bases = MEM_reallocN(oblayer->bases, sizeof(*oblayer->bases) * new_tot_objects);
+ }
+ else {
+ MEM_SAFE_FREE(oblayer->bases);
+ }
+ oblayer->tot_bases = new_tot_objects;
+}
+
/**
* Assign \a base to object layer \a litem.
*/
void BKE_objectlayer_base_assign(Base *base, LayerTreeItem *litem)
{
LayerTypeObject *oblayer = (LayerTypeObject *)litem;
- if (!BLI_ghash_haskey(oblayer->basehash, base->object->id.name)) {
- BLI_ghash_insert(oblayer->basehash, base->object->id.name, base);
- }
+ objectlayer_array_resize(oblayer, oblayer->tot_bases + 1);
+ oblayer->bases[oblayer->tot_bases - 1] = base;
}
/**
@@ -72,6 +80,17 @@ void BKE_objectlayer_base_assign(Base *base, LayerTreeItem *litem)
*/
void BKE_objectlayer_base_unassign(const Base *base, LayerTreeItem *litem)
{
- const LayerTypeObject *oblayer = (LayerTypeObject *)litem;
- BLI_ghash_remove(oblayer->basehash, base->object->id.name, NULL, NULL);
+ LayerTypeObject *oblayer = (LayerTypeObject *)litem;
+
+ bool has_base = false;
+ for (int i = 0; i < oblayer->tot_bases; i++) {
+ if (has_base) {
+ oblayer->bases[i - 1] = oblayer->bases[i];
+ }
+ else if (oblayer->bases[i] == base) {
+ has_base = true;
+ }
+ }
+
+ objectlayer_array_resize(oblayer, oblayer->tot_bases - 1);
}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 80a1b4b..01b3efd 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5556,7 +5556,6 @@ static bool scene_validate_setscene__liblink(Scene *sce, const int totscene)
static void lib_link_scene(FileData *fd, Main *main)
{
Scene *sce;
- Base *base, *next;
Sequence *seq;
SceneRenderLayer *srl;
TimeMarker *marker;
@@ -5608,7 +5607,7 @@ static void lib_link_scene(FileData *fd, Main *main)
sce->toolsettings->particle.shape_object = newlibadr(fd, sce->id.lib, sce->toolsettings->particle.shape_object);
- for (base = sce->base.first; base; base = next) {
+ for (Base *base = sce->base.first, *next; base; base = next) {
next = base->next;
/* base->object= newlibadr_us(fd, sce->id.lib, base->object); */
@@ -5822,17 +5821,15 @@ static void direct_link_layeritems(FileData *fd, ListBase *layeritems, LayerTree
for (LayerTreeItem *litem = layeritems->first; litem; litem = litem->next) {
ltree->items_all[*counter] = litem;
(*counter)++;
- litem->free = newdataadr(fd, litem->free);
+
litem->tree = ltree;
litem->parent = newdataadr(fd, litem->parent);
+
if (litem->type == LAYER_ITEMTYPE_LAYER) {
LayerTypeObject *oblayer = (LayerTypeObject *)litem;
-#if 0
- /* TODO */
- oblayer->basehash = newdataadr(fd, oblayer->basehash);
-#else
- oblayer->basehash = NULL;
-#endif
+ if (oblayer->bases) {
+ oblayer->bases = newdataadr(fd, oblayer->bases);
+ }
}
direct_link_layeritems(fd, &litem->childs, ltree, counter);
}
@@ -6068,6 +6065,7 @@ static void direct_link_scene(FileData *fd, Scene *sce)
rbw->ltime = (float)rbw->pointcache->startframe;
}
}
+
#ifdef WITH_ADVANCED_LAYERS
sce->object_layers = newdataadr(fd, sce->object_layers);
if (sce->object_layers) {
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index a2ac415..21e1b9b 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -2402,10 +2402,6 @@ static void write_layeritems(WriteData *wd, Scene *scene, ListBase *layeritems)
if (scene->object_layers->type == LAYER_TREETYPE_OBJECT && litem->type == LAYER_ITEMTYPE_LAYER) {
LayerTypeObject *oblayer = (LayerTypeObject *)litem;
writestruct(wd, DATA, "LayerTypeObject", 1, oblayer);
-#if 0
- /* TODO hrmpf can't write hash */
- writedata(wd, DATA, , oblayer->basehash);
-#endif
}
else {
writestruct(wd, DATA, "LayerTreeItem", 1, litem);
diff --git a/source/blender/editors/space_layers/layers_ops.c b/source/blender/editors/space_layers/layers_ops.c
index f6d78f1..d5ba3d6 100644
--- a/source/blender/editors/space_layers/layers_ops.c
+++ b/source/blender/editors/space_layers/layers_ops.c
@@ -94,23 +94,21 @@ static void layers_remove_layer_objects(bContext *C, SpaceLayers *slayer, LayerT
Scene *scene = CTX_data_scene(C);
ListBase remlist = {NULL};
- const unsigned int tot_bases = BLI_ghash_size(oblayer->basehash);
- LinkData *base_links = BLI_array_alloca(base_links, tot_bases);
- GHashIterator gh_iter;
- int i;
+ LinkData *base_links = BLI_array_alloca(base_links, oblayer->tot_bases);
- GHASH_ITER_INDEX(gh_iter, oblayer->basehash, i) {
- Base *base = BLI_ghashIterator_getValue(&gh_iter);
+ BKE_OBJECTLAYER_BASES_ITER_START(oblayer, i, base)
+ {
base_links[i].data = base;
BLI_addhead(&remlist, &base_links[i]);
}
- BLI_assert(tot_bases == i);
+ BKE_OBJECTLAYER_BASES_ITER_END;
for (LinkData *base_link = remlist.first, *baselink_next; base_link; base_link = baselink_next) {
Base *base = base_link->data;
/* remove object from other layers */
/* XXX bases could have info about the layers they are in, then
* we could avoid loop in loop and do this all on BKE_ level */
+ GHashIterator gh_iter;
GHASH_ITER(gh_iter, slayer->tiles) {
BKE_objectlayer_base_unassign(base, BLI_ghashIterator_getKey(&gh_iter));
}
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 6ef1ecc..192f12a 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -2802,11 +2802,11 @@ static bool view3d_layer_objects_draw_cb(LayerTreeItem *litem, void *customdata)
LayerTypeObject *oblayer = (LayerTypeObject *)litem;
ObjectDrawData *ddata = customdata;
- GHashIterator gh_iter;
- GHASH_ITER(gh_iter, oblayer->basehash) {
- Base *base = BLI_ghashIterator_getValue(&gh_iter);
+ BKE_OBJECTLAYER_BASES_ITER_START(oblayer, i, base)
+ {
view3d_object_drawstep_draw(ddata, base);
}
+ BKE_OBJECTLAYER_BASES_ITER_END;
return true;
}
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index 94bb7ea..4f071da 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -1376,7 +1376,9 @@ typedef struct LayerTreeItem {
typedef struct LayerTypeObject {
LayerTreeItem litem;
- struct GHash *basehash; /* The objects of this layer. */
+ Base **bases; /* Array of objects assigned to this layer. */
+ unsigned int tot_bases; /* amount of objects assigned to this layer */
+ int pad;
} LayerTypeObject;
/* SpaceLayers->flag */
More information about the Bf-blender-cvs
mailing list