[Bf-blender-cvs] [6e83ace809b] blender2.8: LightProbes: Change 3d view display shape.

Clément Foucault noreply at git.blender.org
Tue Jun 27 14:48:39 CEST 2017


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) {




More information about the Bf-blender-cvs mailing list