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