[Bf-blender-cvs] [0b0d2a4] soc-2016-layer_manager: Use new array based iterator for object drawing
Julian Eisel
noreply at git.blender.org
Mon Jun 13 01:22:12 CEST 2016
Commit: 0b0d2a4b662cfa8d84aa694855eb97ffaa22a446
Author: Julian Eisel
Date: Mon Jun 13 01:20:57 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rB0b0d2a4b662cfa8d84aa694855eb97ffaa22a446
Use new array based iterator for object drawing
===================================================================
M source/blender/editors/space_view3d/view3d_draw.c
===================================================================
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 192f12a..d16d0bf 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -2727,111 +2727,89 @@ typedef enum {
OB_DRAWSTEP_SEL_EDIT,
} ObjectDrawStep;
-typedef struct {
- Scene *scene;
- View3D *v3d;
- ARegion *ar;
-
- ObjectDrawStep drawstep;
- int dflag;
-
- /* return values */
- unsigned int r_lay_used;
-} ObjectDrawData;
-
/**
* Low-level drawing function to draw an object based on ObjectDrawData.drawstep.
*/
-static void view3d_object_drawstep_draw(ObjectDrawData *ddata, Base *base)
+static void view3d_object_drawstep_draw(
+ Scene *scene, View3D *v3d, ARegion *ar,
+ Base *base, ObjectDrawStep drawstep, int dflag,
+ unsigned int *r_lay_used)
{
-#define DRAW_OBJECT draw_object(ddata->scene, ddata->ar, ddata->v3d, base, ddata->dflag)
-#define DRAW_DUPLI draw_dupli_objects(ddata->scene, ddata->ar, ddata->v3d, base)
-
- switch (ddata->drawstep) {
+ switch (drawstep) {
case OB_DRAWSTEP_SET:
UI_ThemeColorBlend(TH_WIRE, TH_BACK, 0.6f);
- DRAW_OBJECT;
+ draw_object(scene, ar, v3d, base, dflag);
if (base->object->transflag & OB_DUPLI) {
- draw_dupli_objects_color(ddata->scene, ddata->ar, ddata->v3d, base, ddata->dflag, TH_UNDEFINED);
+ draw_dupli_objects_color(scene, ar, v3d, base, dflag, TH_UNDEFINED);
}
break;
case OB_DRAWSTEP_DUPLI_UNSEL:
- ddata->r_lay_used |= base->lay;
+ (*r_lay_used) |= base->lay;
/* dupli drawing */
if (base->object->transflag & OB_DUPLI) {
- DRAW_DUPLI;
+ draw_dupli_objects(scene, ar, v3d, base);
}
if ((base->flag & SELECT) == 0) {
- if (base->object != ddata->scene->obedit)
- DRAW_OBJECT;
+ if (base->object != scene->obedit)
+ draw_object(scene, ar, v3d, base, dflag);
}
break;
case OB_DRAWSTEP_SEL_EDIT:
- if (base->object == ddata->scene->obedit || (base->flag & SELECT)) {
- DRAW_OBJECT;
+ if (base->object == scene->obedit || (base->flag & SELECT)) {
+ draw_object(scene, ar, v3d, base, dflag);
}
break;
case OB_DRAWSTEP_OFFSCREEN:
/* dupli drawing */
if (base->object->transflag & OB_DUPLI)
- DRAW_DUPLI;
+ draw_dupli_objects(scene, ar, v3d, base);
- DRAW_OBJECT;
+ draw_object(scene, ar, v3d, base, dflag);
break;
default:
BLI_assert(0);
}
-
-#undef DRAW_OBJECT
-#undef DRAW_DUPLI
-}
-
-#ifdef WITH_ADVANCED_LAYERS
-/**
- * \brief Main object layer draw callback.
- *
- * Callback for drawing objects of the active layer, based on ObjectDrawData.drawstep.
- */
-static bool view3d_layer_objects_draw_cb(LayerTreeItem *litem, void *customdata)
-{
- LayerTypeObject *oblayer = (LayerTypeObject *)litem;
- ObjectDrawData *ddata = customdata;
-
- BKE_OBJECTLAYER_BASES_ITER_START(oblayer, i, base)
- {
- view3d_object_drawstep_draw(ddata, base);
- }
- BKE_OBJECTLAYER_BASES_ITER_END;
-
- return true;
}
-#endif
/**
* \brief Draw all object layers.
*
* Draw objects by iterating over object layers in the scene. Uses
- * #view3d_layer_objects_draw_cb to draw the individual layers.
+ * #view3d_object_drawstep_draw to draw the individual layers.
*
- * \param step: Tells the layer draw callback what and how to draw.
+ * \param drawstep: Tells the layer draw callback what and how to draw.
*/
-static void view3d_objectlayers_drawstep_draw(ObjectDrawData *ddata, ObjectDrawStep step)
+static void view3d_objectlayers_drawstep_draw(
+ Scene *scene, View3D *v3d, ARegion *ar,
+ ObjectDrawStep drawstep, int drawflag,
+ unsigned int *r_lay_used)
{
- ddata->drawstep = step;
#ifdef WITH_ADVANCED_LAYERS
- BKE_layertree_iterate(ddata->scene->object_layers, view3d_layer_objects_draw_cb, ddata, false);
+ BKE_LAYERTREE_ITER_START(scene->object_layers, 0, i, litem)
+ {
+ if (litem->type == LAYER_ITEMTYPE_LAYER) {
+ LayerTypeObject *oblayer = (LayerTypeObject *)litem;
+ BKE_OBJECTLAYER_BASES_ITER_START(oblayer, j, base)
+ {
+ view3d_object_drawstep_draw(scene, v3d, ar, base, drawstep, drawflag, r_lay_used);
+ }
+ BKE_OBJECTLAYER_BASES_ITER_END;
+ }
+ }
+ BKE_LAYERTREE_ITER_END;
+
#else
- for (Base *base = ddata->scene->base.first; base; base = base->next) {
- if (ddata->v3d->lay & base->lay) {
- view3d_object_drawstep_draw(ddata, base);
+ for (Base *base = scene->base.first; base; base = base->next) {
+ if (v3d->lay & base->lay) {
+ view3d_object_drawstep_draw(scene, v3d, ar, base, drawstep, drawflag, r_lay_used);
}
- else if (ddata->drawstep == OB_DRAWSTEP_DUPLI_UNSEL) {
- ddata->r_lay_used |= base->lay;
+ else if (drawstep == OB_DRAWSTEP_DUPLI_UNSEL) {
+ *r_lay_used |= base->lay;
}
}
#endif
@@ -2850,7 +2828,7 @@ static void view3d_draw_objects(
const bool do_bgpic, const bool draw_offscreen, GPUFX *fx)
{
RegionView3D *rv3d = ar->regiondata;
- ObjectDrawData ddata = {scene, v3d, ar, -1};
+ unsigned int lay_used = 0;
const bool do_camera_frame = !draw_offscreen;
const bool draw_grids = !draw_offscreen && (v3d->flag2 & V3D_RENDER_OVERRIDE) == 0;
const bool draw_floor = (rv3d->view == RV3D_VIEW_USER) || (rv3d->persp != RV3D_ORTHO);
@@ -2920,12 +2898,10 @@ static void view3d_draw_objects(
/* draw background set first */
if (scene->set) {
- ObjectDrawData ddata_set = ddata;
-
- ddata_set.dflag = DRAW_CONSTCOLOR | DRAW_SCENESET;
for (Scene *sce_iter = scene->set; sce_iter; sce_iter = sce_iter->set) {
- ddata_set.scene = sce_iter;
- view3d_objectlayers_drawstep_draw(&ddata_set, OB_DRAWSTEP_SET);
+ view3d_objectlayers_drawstep_draw(
+ sce_iter, v3d, ar, OB_DRAWSTEP_SET, DRAW_CONSTCOLOR | DRAW_SCENESET,
+ &lay_used);
}
/* Transp and X-ray afterdraw stuff for sets is done later */
@@ -2933,17 +2909,17 @@ static void view3d_draw_objects(
if (draw_offscreen) {
- view3d_objectlayers_drawstep_draw(&ddata, OB_DRAWSTEP_OFFSCREEN);
+ view3d_objectlayers_drawstep_draw(scene, v3d, ar, OB_DRAWSTEP_OFFSCREEN, 0, &lay_used);
}
else {
/* then draw not selected and the duplis, but skip editmode object */
- view3d_objectlayers_drawstep_draw(&ddata, OB_DRAWSTEP_DUPLI_UNSEL);
+ view3d_objectlayers_drawstep_draw(scene, v3d, ar, OB_DRAWSTEP_DUPLI_UNSEL, 0, &lay_used);
/* mask out localview */
- v3d->lay_used = ddata.r_lay_used & ((1 << 20) - 1);
+ v3d->lay_used = lay_used & ((1 << 20) - 1);
/* draw selected and editmode */
- view3d_objectlayers_drawstep_draw(&ddata, OB_DRAWSTEP_SEL_EDIT);
+ view3d_objectlayers_drawstep_draw(scene, v3d, ar, OB_DRAWSTEP_SEL_EDIT, 0, &lay_used);
}
/* perspective floor goes last to use scene depth and avoid writing to depth buffer */
More information about the Bf-blender-cvs
mailing list