Commit: 581b0c9a4f80bb56e25622da3e526e7be24ea68a Author: Clément Foucault Date: Tue Jan 31 14:01:23 2017 +0100 Branches: clay-engine https://developer.blender.org/rB581b0c9a4f80bb56e25622da3e526e7be24ea68a
More Object mode work. =================================================================== M source/blender/blenkernel/BKE_layer.h M source/blender/draw/engines/clay/clay.c M source/blender/draw/intern/draw_manager.c M source/blender/draw/intern/draw_mode_pass.c M source/blender/draw/intern/draw_mode_pass.h =================================================================== diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h index 0f328700bf..ff5b16f208 100644 --- a/source/blender/blenkernel/BKE_layer.h +++ b/source/blender/blenkernel/BKE_layer.h @@ -143,6 +143,15 @@ void BKE_visible_bases_Iterator_end(Iterator *iter); } \ } +#define FOREACH_BASE(sl, _object_base) \ +{ \ + for (base = sl->object_bases.first; base; base = base->next) { \ + _object_base = base; + +#define FOREACH_BASE_END \ + } \ +} + #define FOREACH_OBJECT_FLAG(scene, sl, flag, _ob) \ { \ IteratorBeginCb func_begin; \ diff --git a/source/blender/draw/engines/clay/clay.c b/source/blender/draw/engines/clay/clay.c index a588412903..dabb500936 100644 --- a/source/blender/draw/engines/clay/clay.c +++ b/source/blender/draw/engines/clay/clay.c @@ -529,7 +529,7 @@ static void CLAY_create_cache(CLAY_PassList *passes, const struct bContext *C) { SceneLayer *sl = CTX_data_scene_layer(C); DRWShadingGroup *default_shgrp, *depthbatch; - Object *ob; + ObjectBase *base; /* Depth Pass */ { @@ -558,9 +558,10 @@ static void CLAY_create_cache(CLAY_PassList *passes, const struct bContext *C) } /* TODO Create hash table of batch based on material id*/ - FOREACH_OBJECT(sl, ob) + FOREACH_BASE(sl, base) { struct Batch *geom; + Object *ob = base->object; switch (ob->type) { case OB_MESH: @@ -583,14 +584,14 @@ static void CLAY_create_cache(CLAY_PassList *passes, const struct bContext *C) case OB_CAMERA: case OB_EMPTY: default: - DRW_shgroup_non_meshes(passes->non_meshes_pass, ob); + DRW_shgroup_non_meshes(passes->non_meshes_pass, base); break; } - DRW_shgroup_object_center(passes->ob_center_pass, ob); - DRW_shgroup_relationship_lines(passes->non_meshes_pass, ob); + DRW_shgroup_object_center(passes->ob_center_pass, base); + DRW_shgroup_relationship_lines(passes->non_meshes_pass, base); } - FOREACH_OBJECT_END + FOREACH_BASE_END } static void CLAY_view_draw(RenderEngine *UNUSED(engine), const struct bContext *context) diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 9fc020885d..3fff977bc9 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -544,7 +544,6 @@ static void shgroup_dynamic_batch_from_calls(DRWShadingGroup *shgroup) #ifdef WITH_VIEWPORT_CACHE_TEST if (shgroup->dyngeom) return; #endif - if (shgroup->dyntype == DRW_DYN_INSTANCE) { shgroup_dynamic_batch_instance(shgroup); } @@ -786,7 +785,7 @@ static void draw_shgroup(DRWShadingGroup *shgroup) float obmat[4][4]; unit_m4(obmat); - if (shgroup->dyntype == DRW_DYN_INSTANCE) { + if (shgroup->dyntype == DRW_DYN_INSTANCE && shgroup->instance_count > 0) { DRWCall *call = shgroup->calls.first; draw_geometry(shgroup, interface, call->geometry, shgroup->instance_vbo, shgroup->instance_count, obmat); } diff --git a/source/blender/draw/intern/draw_mode_pass.c b/source/blender/draw/intern/draw_mode_pass.c index d8db13925f..c93c9a1610 100644 --- a/source/blender/draw/intern/draw_mode_pass.c +++ b/source/blender/draw/intern/draw_mode_pass.c @@ -29,10 +29,30 @@ #include "UI_resources.h" +#include "BKE_global.h" + #include "draw_mode_pass.h" /* ************************** OBJECT MODE ******************************* */ +/* Store list of shading group for easy access*/ + +/* Empties */ +static DRWShadingGroup *empty_wire; +static DRWShadingGroup *empty_active; +static DRWShadingGroup *empty_select; +static DRWShadingGroup *empty_transform; +static DRWShadingGroup *empty_group; +static DRWShadingGroup *empty_group_active; + +/* Helpers */ +static DRWShadingGroup *relationship_lines; + +/* Objects Centers */ +static DRWShadingGroup *center_active; +static DRWShadingGroup *center_selected; +static DRWShadingGroup *center_deselected; + /* This Function setup the passes needed for the mode rendering. * The passes are populated by the rendering engine using the DRW_shgroup_* functions. */ void DRW_pass_setup_common(DRWPass **wire_overlay, DRWPass **wire_outline, DRWPass **non_meshes, DRWPass **ob_center) @@ -52,6 +72,22 @@ void DRW_pass_setup_common(DRWPass **wire_overlay, DRWPass **wire_outline, DRWPa } if (non_meshes) { + static float colorWire[4], colorWireEdit[4]; + static float colorActive[4], colorSelect[4], colorTransform[4], colorGroup[4], colorGroupActive[4]; + static float colorEmpty[4], colorLamp[4], colorCamera[4], colorSpeaker[4]; + + UI_GetThemeColor4fv(TH_WIRE, colorWire); + UI_GetThemeColor4fv(TH_WIRE_EDIT, colorWireEdit); + UI_GetThemeColor4fv(TH_ACTIVE, colorActive); + UI_GetThemeColor4fv(TH_SELECT, colorSelect); + UI_GetThemeColor4fv(TH_TRANSFORM, colorTransform); + UI_GetThemeColor4fv(TH_GROUP_ACTIVE, colorGroupActive); + UI_GetThemeColor4fv(TH_GROUP, colorGroup); + UI_GetThemeColor4fv(OB_LAMP, colorLamp); + UI_GetThemeColor4fv(OB_SPEAKER, colorSpeaker); + UI_GetThemeColor4fv(OB_CAMERA, colorCamera); + UI_GetThemeColor4fv(OB_EMPTY, colorEmpty); + /* Non Meshes Pass (Camera, empties, lamps ...) */ DRWShadingGroup *grp; @@ -69,14 +105,40 @@ void DRW_pass_setup_common(DRWPass **wire_overlay, DRWPass **wire_outline, DRWPa grp = DRW_shgroup_create(sh, *non_meshes); /* Empties */ - static float frontcol[4] = {0.0f, 0.0f, 0.0f, 1.0f}; - grp = DRW_shgroup_create(sh_inst, *non_meshes); - DRW_shgroup_uniform_vec4(grp, "color", frontcol, 1); - DRW_shgroup_dyntype_set(grp, DRW_DYN_INSTANCE); + { + grp = DRW_shgroup_create(sh_inst, *non_meshes); + DRW_shgroup_uniform_vec4(grp, "color", colorEmpty, 1); + DRW_shgroup_dyntype_set(grp, DRW_DYN_INSTANCE); + empty_wire = grp; + + grp = DRW_shgroup_create(sh_inst, *non_meshes); + DRW_shgroup_uniform_vec4(grp, "color", colorActive, 1); + DRW_shgroup_dyntype_set(grp, DRW_DYN_INSTANCE); + empty_active = grp; + + grp = DRW_shgroup_create(sh_inst, *non_meshes); + DRW_shgroup_uniform_vec4(grp, "color", colorSelect, 1); + DRW_shgroup_dyntype_set(grp, DRW_DYN_INSTANCE); + empty_select = grp; + + grp = DRW_shgroup_create(sh_inst, *non_meshes); + DRW_shgroup_uniform_vec4(grp, "color", colorTransform, 1); + DRW_shgroup_dyntype_set(grp, DRW_DYN_INSTANCE); + empty_transform = grp; + + grp = DRW_shgroup_create(sh_inst, *non_meshes); + DRW_shgroup_uniform_vec4(grp, "color", colorGroup, 1); + DRW_shgroup_dyntype_set(grp, DRW_DYN_INSTANCE); + empty_group = grp; + + grp = DRW_shgroup_create(sh_inst, *non_meshes); + DRW_shgroup_uniform_vec4(grp, "color", colorGroupActive, 1); + DRW_shgroup_dyntype_set(grp, DRW_DYN_INSTANCE); + empty_group_active = grp; + } /* Stipple Wires */ grp = DRW_shgroup_create(sh, *non_meshes); - DRW_shgroup_uniform_vec4(grp, "color", frontcol, 1); DRW_shgroup_state_set(grp, DRW_STATE_STIPPLE_2); grp = DRW_shgroup_create(sh, *non_meshes); @@ -86,9 +148,13 @@ void DRW_pass_setup_common(DRWPass **wire_overlay, DRWPass **wire_outline, DRWPa DRW_shgroup_state_set(grp, DRW_STATE_STIPPLE_4); /* Relationship Lines */ - grp = DRW_shgroup_create(sh, *non_meshes); - DRW_shgroup_state_set(grp, DRW_STATE_STIPPLE_3); - DRW_shgroup_dyntype_set(grp, DRW_DYN_LINES); + { + grp = DRW_shgroup_create(sh, *non_meshes); + DRW_shgroup_uniform_vec4(grp, "color", colorWire, 1); + DRW_shgroup_state_set(grp, DRW_STATE_STIPPLE_3); + DRW_shgroup_dyntype_set(grp, DRW_DYN_LINES); + relationship_lines = grp; + } } if (ob_center) { @@ -116,16 +182,19 @@ void DRW_pass_setup_common(DRWPass **wire_overlay, DRWPass **wire_outline, DRWPa DRW_shgroup_uniform_float(grp, "outlineWidth", &outlineWidth, 1); DRW_shgroup_uniform_vec4(grp, "color", colorActive, 1); DRW_shgroup_uniform_vec4(grp, "outlineColor", outlineColor, 1); + center_active = grp; /* Select */ grp = DRW_shgroup_create(sh, *ob_center); DRW_shgroup_dyntype_set(grp, DRW_DYN_POINTS); DRW_shgroup_uniform_vec4(grp, "color", colorSelect, 1); + center_selected = grp; /* Deselect */ grp = DRW_shgroup_create(sh, *ob_center); DRW_shgroup_dyntype_set(grp, DRW_DYN_POINTS); DRW_shgroup_uniform_vec4(grp, "color", colorDeselect, 1); + center_deselected = grp; } } @@ -219,40 +288,106 @@ void DRW_draw_lamp(DRWPass *non_meshes, Object *ob) /* TODO */ } -void DRW_shgroup_non_meshes(DRWPass *non_meshes, Object *ob) +/* TODO FINISH */ +static int draw_object_wire_theme(ObjectBase *base) +{ + Object *ob = base->object; + const bool is_edit = (ob->mode & OB_MODE_EDIT) != 0; + /* confusing logic here, there are 2 methods of setting the color + * 'colortab[colindex]' and 'theme_id', colindex overrides theme_id. + * + * note: no theme yet for 'colindex' */ + int theme_id = is_edit ? TH_WIRE_EDIT : TH_WIRE; + + if (//(scene->obedit == NULL) && + (G.moving & G_TRANSFORM_OBJ) && + (base->flag & BASE_SELECTED)) + { + theme_id = TH_TRANSFORM; + } + else { + /* Sets the 'theme_id' or fallback to wire */ + if ((ob->flag & OB_FROMGROUP) != 0) { + if (base->flag & BASE_SELECTED) { + /* uses darker active color for non-active + selected */ + theme_id = TH_GROUP_ACTIVE; + + // if (scene->basact != base) { + // theme_shade = -16; + // } + } + else { + theme_id = TH_GROUP; + } + } + else { + if (base->flag & BASE_SELECTED) { + theme_id = //scene->basact == base ? TH_ACTIVE : + TH_SELECT; + } + else { + if (ob->type == OB_LAMP) theme_id = TH_LAMP; + else if (ob->type == OB_SPEAKER) theme_id = TH_SPEAKER; + else if (ob->type == OB_CAMERA) theme_id = TH_CAMERA; + else if (ob->type == OB_EMPTY) theme_id = TH_EMPTY; + /* fallback to TH_WIRE */ + } + } + } + + return theme_id; +} + +void DRW_shgroup_non_meshes(DRWP @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs