[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