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 */

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

Reply via email to