[Bf-blender-cvs] [57b624d] soc-2016-layer_manager: Wireframe/outline color from layer color-set
Julian Eisel
noreply at git.blender.org
Wed Jun 22 03:13:20 CEST 2016
Commit: 57b624d85c5795cd7d3d05482e2d64391c8698f6
Author: Julian Eisel
Date: Wed Jun 22 02:36:38 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rB57b624d85c5795cd7d3d05482e2d64391c8698f6
Wireframe/outline color from layer color-set
This commit makes wireframe/outline drawing of objects use the color-set of the highest layer in the hierarchy. This is an example of how a render engine (viewport in this case) can make use of the custom layer properties.
A local 3D View toggle allows quick toggling of the wireframe/outline colors.
On the general topic of custom wireframe colors: The layer based coloring makes it easy for users to assign colors that have meaning and are not just arbitrary choices. I discussed this with Ton, Sebastian König and others before, we all agreed that this is a pretty sane solution.
Also note that the colors are based on theme settings, which was a requirenment to avoid theme contrast issues.
Based on P158 by @campbellbarton.
===================================================================
M release/scripts/startup/bl_ui/space_view3d.py
M source/blender/blenkernel/BKE_object.h
M source/blender/blenkernel/intern/object_layer.c
M source/blender/editors/space_view3d/drawobject.c
M source/blender/editors/space_view3d/view3d_draw.c
M source/blender/editors/space_view3d/view3d_intern.h
M source/blender/makesdna/DNA_view3d_types.h
M source/blender/makesrna/intern/rna_space.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index b88b831..12fd776 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -3270,6 +3270,9 @@ class VIEW3D_PT_view3d_shading(Panel):
if not scene.render.use_shading_nodes:
col.prop(gs, "material_mode", text="")
+ if view.viewport_shade in {'BOUNDBOX', 'WIREFRAME', 'SOLID'}:
+ col.prop(view, "use_wire_color")
+
if view.viewport_shade == 'SOLID':
col.prop(view, "show_textured_solid")
col.prop(view, "use_matcap")
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 8ae9cc2..2553d5f 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -288,6 +288,7 @@ LayerTreeItem *BKE_objectlayer_add(
void BKE_objectlayer_free(LayerTreeItem *litem);
void BKE_objectlayer_base_assign(Base *base, LayerTreeItem *litem);
void BKE_objectlayer_base_unassign(const Base *base, LayerTreeItem *litem);
+LayerTypeObject *BKE_objectlayer_from_base(LayerTree *ltree, const Base *base, const bool inverse);
#ifdef __cplusplus
}
diff --git a/source/blender/blenkernel/intern/object_layer.c b/source/blender/blenkernel/intern/object_layer.c
index 62829cd..cdb61b5 100644
--- a/source/blender/blenkernel/intern/object_layer.c
+++ b/source/blender/blenkernel/intern/object_layer.c
@@ -93,3 +93,31 @@ void BKE_objectlayer_base_unassign(const Base *base, LayerTreeItem *litem)
objectlayer_array_resize(oblayer, oblayer->tot_bases - 1);
}
+
+/**
+ * Find the first layer that has \a base in it.
+ * \param inverse: Do inverse loockup to find last layer rather than first one.
+ */
+LayerTypeObject *BKE_objectlayer_from_base(LayerTree *ltree, const Base *base, const bool inverse)
+{
+ BLI_assert(ltree->type == LAYER_TREETYPE_OBJECT);
+
+ for (int i = inverse ? ltree->tot_items - 1 : 0;
+ inverse ? i >= 0 : i < ltree->tot_items;
+ inverse ? i-- : i++)
+ {
+ LayerTreeItem *litem = ltree->items_all[i];
+ if (litem->type->type == LAYER_ITEMTYPE_LAYER) {
+ LayerTypeObject *oblayer = (LayerTypeObject *)litem;
+ BKE_OBJECTLAYER_BASES_ITER_START(oblayer, j, iterbase)
+ {
+ if (iterbase == base) {
+ return oblayer;
+ }
+ }
+ BKE_OBJECTLAYER_BASES_ITER_END;
+ }
+ }
+
+ return NULL;
+}
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 07e8325..ee67850 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -7573,11 +7573,28 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short
/* which wire color */
if ((dflag & DRAW_CONSTCOLOR) == 0) {
+ const bool is_wire_color = V3D_IS_WIRECOLOR(v3d);
+ bool use_wire_color = false;
ED_view3d_project_base(ar, base);
- draw_object_wire_color(scene, base, _ob_wire_col);
- ob_wire_col = _ob_wire_col;
+ if (is_wire_color) {
+ ThemeWireColor *wcol = view3d_layer_color_from_base(scene->object_layers, base);
+ if (wcol) {
+ if (base->flag & SELECT) {
+ ob_wire_col = (unsigned char *)(scene->basact == base ? wcol->active : wcol->select);
+ }
+ else {
+ ob_wire_col = (unsigned char *)wcol->solid;
+ }
+ use_wire_color = true;
+ }
+ }
+ /* fallback to theme setting */
+ if (!use_wire_color) {
+ draw_object_wire_color(scene, base, _ob_wire_col);
+ ob_wire_col = _ob_wire_col;
+ }
glColor3ubv(ob_wire_col);
}
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index f292084..c41a435 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -92,6 +92,8 @@
#include "ED_screen_types.h"
#include "ED_transform.h"
+#include "RNA_access.h"
+
#include "UI_interface.h"
#include "UI_interface_icons.h"
#include "UI_resources.h"
@@ -121,6 +123,15 @@ extern void bl_debug_draw_edge_add(const float v0[3], const float v1[3]);
extern void bl_debug_color_set(const unsigned int col);
#endif
+ThemeWireColor *view3d_layer_color_from_base(LayerTree *ltree, const Base *base)
+{
+ bTheme *btheme = UI_GetTheme();
+ LayerTypeObject *oblayer = BKE_objectlayer_from_base(ltree, base, true);
+ const int col_idx = oblayer ? RNA_enum_get(oblayer->litem.ptr, "color_set") : 0;
+
+ return (col_idx > 0) ? &btheme->tarm[col_idx - 1] : NULL;
+}
+
void circf(float x, float y, float rad)
{
GLUquadricObj *qobj = gluNewQuadric();
@@ -2213,13 +2224,32 @@ static void draw_dupli_objects(Scene *scene, ARegion *ar, View3D *v3d, Base *bas
{
/* define the color here so draw_dupli_objects_color can be called
* from the set loop */
+ const bool is_wire_color = V3D_IS_WIRECOLOR(v3d);
+ bool use_wire_color = false;
+ short dflag;
+ int color;
+
+ if (is_wire_color) {
+ ThemeWireColor *wcol = view3d_layer_color_from_base(scene->object_layers, base);
+ if (wcol) {
+ glColor3ubv((unsigned char *)(base->flag & SELECT ? wcol->select : wcol->solid));
+
+ color = TH_UNDEFINED;
+ dflag = DRAW_CONSTCOLOR;
+ use_wire_color = true;
+ }
+ }
+
+ /* fallback to theme setting */
+ if (!use_wire_color) {
+ color = (base->flag & SELECT) ? TH_SELECT : TH_WIRE;
+ /* debug */
+ if (base->object->dup_group && base->object->dup_group->id.us < 1)
+ color = TH_REDALERT;
+ dflag = 0;
+ }
- int color = (base->flag & SELECT) ? TH_SELECT : TH_WIRE;
- /* debug */
- if (base->object->dup_group && base->object->dup_group->id.us < 1)
- color = TH_REDALERT;
-
- draw_dupli_objects_color(scene, ar, v3d, base, 0, color);
+ draw_dupli_objects_color(scene, ar, v3d, base, dflag, color);
}
/* XXX warning, not using gpu offscreen here */
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index 6d831c6..88bddf1 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -192,6 +192,7 @@ void ED_view3d_draw_depth(Scene *scene, struct ARegion *ar, View3D *v3d, bool al
void ED_view3d_draw_depth_gpencil(Scene *scene, ARegion *ar, View3D *v3d);
void ED_view3d_after_add(ListBase *lb, Base *base, const short dflag);
+struct ThemeWireColor *view3d_layer_color_from_base(struct LayerTree *ltree, const Base *base);
void circf(float x, float y, float rad);
void circ(float x, float y, float rad);
void view3d_update_depths_rect(struct ARegion *ar, struct ViewDepths *d, struct rcti *rect);
diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h
index 5b533d1..b7a336a 100644
--- a/source/blender/makesdna/DNA_view3d_types.h
+++ b/source/blender/makesdna/DNA_view3d_types.h
@@ -301,6 +301,7 @@ typedef struct View3D {
(((view) >= RV3D_VIEW_FRONT) && ((view) <= RV3D_VIEW_BOTTOM))
/* View3d->flag2 (short) */
+#define V3D_WIRE_COLOR_NOCUSTOM (1 << 1)
#define V3D_RENDER_OVERRIDE (1 << 2)
#define V3D_SOLID_TEX (1 << 3)
#define V3D_SHOW_GPENCIL (1 << 4)
@@ -388,6 +389,10 @@ enum {
#define V3D_BGPIC_EXPANDED (V3D_BGPIC_EXPANDED | V3D_BGPIC_CAMERACLIP)
+#define V3D_IS_WIRECOLOR(v3d) \
+ (((v3d)->drawtype <= OB_SOLID) && \
+ (((v3d)->flag2 & V3D_WIRE_COLOR_NOCUSTOM) == 0))
+
/* BGPic->source */
/* may want to use 1 for select ?*/
#define V3D_BGPIC_IMAGE 0
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index 77b55fa..741576e 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -2694,6 +2694,11 @@ static void rna_def_space_view3d(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Show 3D Marker Names", "Show names for reconstructed tracks objects");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+ prop = RNA_def_property(srna, "use_wire_color", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag2", V3D_WIRE_COLOR_NOCUSTOM);
+ RNA_def_property_ui_text(prop, "Color Wire", "Draw wireframes using layer color");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
prop = RNA_def_property(srna, "use_matcap", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag2", V3D_SOLID_MATCAP);
RNA_def_property_ui_text(prop, "Matcap", "Active Objects draw images mapped on normals, enhancing Solid Draw Mode");
More information about the Bf-blender-cvs
mailing list