LightProbes: Change 3d view display shape.
Introduce specific shape for each probe type to easily identify them.
This commit is contained in:
parent
cbfdd02f2c
commit
6e83ace809
|
@ -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;
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue