LightProbes: Change 3d view display shape.

Introduce specific shape for each probe type to easily identify them.
This commit is contained in:
Clément Foucault 2017-06-27 14:59:53 +02:00
parent cbfdd02f2c
commit 6e83ace809
3 changed files with 152 additions and 40 deletions

View File

@ -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);
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);
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]);
}
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_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;
#undef CIRCLE_RESOL
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[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);
}
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_planar;
}
/** \} */

View File

@ -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);

View File

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