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

Reply via email to