Commit: 6e83ace809be366f7e8ba55bf0d9e5b2d819b587
Author: Clément Foucault
Date:   Tue Jun 27 14:59:53 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB6e83ace809be366f7e8ba55bf0d9e5b2d819b587

LightProbes: Change 3d view display shape.

Introduce specific shape for each probe type to easily identify them.

===================================================================

M       source/blender/draw/intern/draw_cache.c
M       source/blender/draw/intern/draw_cache.h
M       source/blender/draw/modes/object_mode.c

===================================================================

diff --git a/source/blender/draw/intern/draw_cache.c 
b/source/blender/draw/intern/draw_cache.c
index 5d0485b03e6..82a26582421 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -68,7 +68,9 @@ static struct DRWShapeCache {
        Gwn_Batch *drw_lamp_spot;
        Gwn_Batch *drw_lamp_spot_square;
        Gwn_Batch *drw_speaker;
-       Gwn_Batch *drw_lightprobe;
+       Gwn_Batch *drw_lightprobe_cube;
+       Gwn_Batch *drw_lightprobe_planar;
+       Gwn_Batch *drw_lightprobe_grid;
        Gwn_Batch *drw_bone_octahedral;
        Gwn_Batch *drw_bone_octahedral_wire;
        Gwn_Batch *drw_bone_box;
@@ -118,7 +120,9 @@ void DRW_shape_cache_free(void)
        BATCH_DISCARD_ALL_SAFE(SHC.drw_lamp_spot);
        BATCH_DISCARD_ALL_SAFE(SHC.drw_lamp_spot_square);
        BATCH_DISCARD_ALL_SAFE(SHC.drw_speaker);
-       BATCH_DISCARD_ALL_SAFE(SHC.drw_lightprobe);
+       BATCH_DISCARD_ALL_SAFE(SHC.drw_lightprobe_cube);
+       BATCH_DISCARD_ALL_SAFE(SHC.drw_lightprobe_planar);
+       BATCH_DISCARD_ALL_SAFE(SHC.drw_lightprobe_grid);
        BATCH_DISCARD_ALL_SAFE(SHC.drw_bone_octahedral);
        BATCH_DISCARD_ALL_SAFE(SHC.drw_bone_octahedral_wire);
        BATCH_DISCARD_ALL_SAFE(SHC.drw_bone_box);
@@ -1329,13 +1333,21 @@ Gwn_Batch *DRW_cache_speaker_get(void)
 /** \name Probe
  * \{ */
 
-Gwn_Batch *DRW_cache_lightprobe_get(void)
+Gwn_Batch *DRW_cache_lightprobe_cube_get(void)
 {
-#define CIRCLE_RESOL 16
-       if (!SHC.drw_lightprobe) {
+       if (!SHC.drw_lightprobe_cube) {
                int v_idx = 0;
-               float v[3] = {0.0f, 1.0f, 0.0f};
-               /* TODO something nicer than just a circle */
+               const float sin_pi_3 = 0.86602540378f;
+               const float cos_pi_3 = 0.5f;
+               float v[7][3] = {
+                       {0.0f, 1.0f, 0.0f},
+                       {sin_pi_3, cos_pi_3, 0.0f},
+                       {sin_pi_3, -cos_pi_3, 0.0f},
+                       {0.0f, -1.0f, 0.0f},
+                       {-sin_pi_3, -cos_pi_3, 0.0f},
+                       {-sin_pi_3, cos_pi_3, 0.0f},
+                       {0.0f, 0.0f, 0.0f},
+               };
 
                /* Position Only 3D format */
                static Gwn_VertFormat format = { 0 };
@@ -1345,35 +1357,114 @@ Gwn_Batch *DRW_cache_lightprobe_get(void)
                }
 
                Gwn_VertBuf *vbo = GWN_vertbuf_create_with_format(&format);
-               GWN_vertbuf_data_alloc(vbo, CIRCLE_RESOL * 2 + 8);
+               GWN_vertbuf_data_alloc(vbo, (6 + 3) * 2);
 
-               GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, v);
-               for (int a = 1; a < CIRCLE_RESOL; a++) {
-                       v[0] = sinf((2.0f * M_PI * a) / ((float)CIRCLE_RESOL));
-                       v[1] = cosf((2.0f * M_PI * a) / ((float)CIRCLE_RESOL));
-                       GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, v);
+               for (int i = 0; i < 6; ++i)     {
+                       GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, v[i]);
+                       GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, v[(i + 
1) % 6]);
+               }
 
-                       if ((a % 2 == 0) && (a % 4 != 0)) {
-                               v[0] *= 0.5f;
-                               v[1] *= 0.5f;
-                               GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, 
v);
-                               v[0] *= 3.0f;
-                               v[1] *= 3.0f;
-                               GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, 
v);
-                               v[0] /= 1.5f;
-                               v[1] /= 1.5f;
+               GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, v[1]);
+               GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, v[6]);
+
+               GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, v[5]);
+               GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, v[6]);
+
+               GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, v[3]);
+               GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, v[6]);
+
+               SHC.drw_lightprobe_cube = GWN_batch_create(GWN_PRIM_LINES, vbo, 
NULL);
+       }
+       return SHC.drw_lightprobe_cube;
+}
+
+Gwn_Batch *DRW_cache_lightprobe_grid_get(void)
+{
+       if (!SHC.drw_lightprobe_grid) {
+               int v_idx = 0;
+               const float sin_pi_3 = 0.86602540378f;
+               const float cos_pi_3 = 0.5f;
+               const float v[7][3] = {
+                       {0.0f, 1.0f, 0.0f},
+                       {sin_pi_3, cos_pi_3, 0.0f},
+                       {sin_pi_3, -cos_pi_3, 0.0f},
+                       {0.0f, -1.0f, 0.0f},
+                       {-sin_pi_3, -cos_pi_3, 0.0f},
+                       {-sin_pi_3, cos_pi_3, 0.0f},
+                       {0.0f, 0.0f, 0.0f},
+               };
+
+               /* Position Only 3D format */
+               static Gwn_VertFormat format = { 0 };
+               static struct { uint pos; } attr_id;
+               if (format.attrib_ct == 0) {
+                       attr_id.pos = GWN_vertformat_attr_add(&format, "pos", 
GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
+               }
+
+               Gwn_VertBuf *vbo = GWN_vertbuf_create_with_format(&format);
+               GWN_vertbuf_data_alloc(vbo, (6 * 3 + 3) * 2);
+
+               for (int i = 0; i < 6; ++i)     {
+                       float tmp_v1[3], tmp_v2[3], tmp_tr[3];
+                       copy_v3_v3(tmp_v1, v[i]);
+                       copy_v3_v3(tmp_v2, v[(i + 1) % 6]);
+                       GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, tmp_v1);
+                       GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, tmp_v2);
+
+                       /* Internal wires. */
+                       for (int j = 1; j < 2; ++j) {
+                               mul_v3_v3fl(tmp_tr, v[(i / 2) * 2 + 1], -0.5f * 
j);
+                               add_v3_v3v3(tmp_v1, v[i], tmp_tr);
+                               add_v3_v3v3(tmp_v2, v[(i + 1) % 6], tmp_tr);
+                               GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, 
tmp_v1);
+                               GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, 
tmp_v2);
                        }
+               }
 
-                       GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, v);
+               GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, v[1]);
+               GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, v[6]);
+
+               GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, v[5]);
+               GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, v[6]);
+
+               GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, v[3]);
+               GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, v[6]);
+
+               SHC.drw_lightprobe_grid = GWN_batch_create(GWN_PRIM_LINES, vbo, 
NULL);
+       }
+       return SHC.drw_lightprobe_grid;
+}
+
+Gwn_Batch *DRW_cache_lightprobe_planar_get(void)
+{
+       if (!SHC.drw_lightprobe_planar) {
+               int v_idx = 0;
+               const float sin_pi_3 = 0.86602540378f;
+               float v[4][3] = {
+                       {0.0f, 0.5f, 0.0f},
+                       {sin_pi_3, 0.0f, 0.0f},
+                       {0.0f, -0.5f, 0.0f},
+                       {-sin_pi_3, 0.0f, 0.0f},
+               };
+
+               /* Position Only 3D format */
+               static Gwn_VertFormat format = { 0 };
+               static struct { uint pos; } attr_id;
+               if (format.attrib_ct == 0) {
+                       attr_id.pos = GWN_vertformat_attr_add(&format, "pos", 
GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
                }
-               v[0] = 0.0f;
-               v[1] = 1.0f;
-               GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, v);
 
-               SHC.drw_lightprobe = GWN_batch_create(GWN_PRIM_LINES, vbo, 
NULL);
+               Gwn_VertBuf *vbo = GWN_vertbuf_create_with_format(&format);
+               GWN_vertbuf_data_alloc(vbo, 4 * 2);
+
+               for (int i = 0; i < 4; ++i)     {
+                       GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, v[i]);
+                       GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, v[(i + 
1) % 4]);
+               }
+
+               SHC.drw_lightprobe_planar = GWN_batch_create(GWN_PRIM_LINES, 
vbo, NULL);
        }
-       return SHC.drw_lightprobe;
-#undef CIRCLE_RESOL
+       return SHC.drw_lightprobe_planar;
 }
 
 /** \} */
diff --git a/source/blender/draw/intern/draw_cache.h 
b/source/blender/draw/intern/draw_cache.h
index 857d4c60053..82ff949c5c8 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -81,7 +81,9 @@ struct Gwn_Batch *DRW_cache_camera_tria_get(void);
 struct Gwn_Batch *DRW_cache_speaker_get(void);
 
 /* Probe */
-struct Gwn_Batch *DRW_cache_lightprobe_get(void);
+struct Gwn_Batch *DRW_cache_lightprobe_cube_get(void);
+struct Gwn_Batch *DRW_cache_lightprobe_grid_get(void);
+struct Gwn_Batch *DRW_cache_lightprobe_planar_get(void);
 
 /* Bones */
 struct Gwn_Batch *DRW_cache_bone_octahedral_get(void);
diff --git a/source/blender/draw/modes/object_mode.c 
b/source/blender/draw/modes/object_mode.c
index f6220a70f9c..10ec2101e6e 100644
--- a/source/blender/draw/modes/object_mode.c
+++ b/source/blender/draw/modes/object_mode.c
@@ -143,8 +143,10 @@ typedef struct OBJECT_PrivateData{
        /* Speaker */
        DRWShadingGroup *speaker;
 
-       /* Speaker */
-       DRWShadingGroup *probe;
+       /* Probe */
+       DRWShadingGroup *probe_cube;
+       DRWShadingGroup *probe_planar;
+       DRWShadingGroup *probe_grid;
 
        /* Lamps */
        DRWShadingGroup *lamp_center;
@@ -907,9 +909,16 @@ static void OBJECT_cache_init(void *vedata)
                stl->g_data->speaker = shgroup_instance(psl->non_meshes, geom);
 
                /* Probe */
-               static float probeSize = 10.0f;
-               geom = DRW_cache_lightprobe_get();
-               stl->g_data->probe = 
shgroup_instance_screenspace(psl->non_meshes, geom, &probeSize);
+               static float probeSize = 14.0f;
+               geom = DRW_cache_lightprobe_cube_get();
+               stl->g_data->probe_cube = 
shgroup_instance_screenspace(psl->non_meshes, geom, &probeSize);
+
+               geom = DRW_cache_lightprobe_grid_get();
+               stl->g_data->probe_grid = 
shgroup_instance_screenspace(psl->non_meshes, geom, &probeSize);
+
+               static float probePlanarSize = 20.0f;
+               geom = DRW_cache_lightprobe_planar_get();
+               stl->g_data->probe_planar = 
shgroup_instance_screenspace(psl->non_meshes, geom, &probePlanarSize);
 
                /* Camera */
                geom = DRW_cache_camera_get();
@@ -1415,7 +1424,18 @@ static void DRW_shgroup_lightprobe(OBJECT_StorageList 
*stl, Object *ob, SceneLay
        LightProbe *prb = (LightProbe *)ob->data;
        DRW_object_wire_theme_get(ob, sl, &color);
 
-       DRW_shgroup_call_dynamic_add(stl->g_data->probe, ob->obmat[3], color);
+       switch (prb->type) {
+               case LIGHTPROBE_TYPE_PLANAR:
+                       DRW_shgroup_call_dynamic_add(stl->g_data->probe_planar, 
ob->obmat[3], color);
+                       break;
+               case LIGHTPROBE_TYPE_GRID:
+                       DRW_shgroup_call_dynamic_add(stl->g_data->probe_grid, 
ob->obmat[3], color);
+                       break;
+               case LIGHTPROBE_TYPE_CUBE:
+               default:
+                       DRW_shgroup_call_dynamic_add(stl->g_data->probe_cube, 
ob->obmat[3], color);
+                       break;
+       }
 
        float **prb_mats = (float **)DRW_object_engine_data_get(ob, 
&draw_engine_object_type, NULL);
        if (*prb_mats == NULL) {
@@ -1523,7 +1543,6 @@ static void DRW_shgroup_lightprobe(OBJECT_StorageList 
*stl, Object *ob, SceneLay
                        }
                }
        }
-       DRW_shgroup_call_dynamic_add(stl->g_data->lamp_center_group, 
ob->obmat[3]);
 
        /* Line and point going to the ground */
        if (prb->type == LIGHTPROBE_TYPE_CUBE) {

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to