Clay Engine: draw Speaker
This commit is contained in:
parent
cd472bc7de
commit
b0c125bcd3
|
@ -51,6 +51,7 @@ static struct DRWShapeCache{
|
|||
Batch *drw_axis_names;
|
||||
Batch *drw_lamp;
|
||||
Batch *drw_lamp_sunrays;
|
||||
Batch *drw_speaker;
|
||||
} SHC = {NULL};
|
||||
|
||||
void DRW_shape_cache_free(void)
|
||||
|
@ -81,6 +82,8 @@ void DRW_shape_cache_free(void)
|
|||
Batch_discard_all(SHC.drw_lamp);
|
||||
if (SHC.drw_lamp_sunrays)
|
||||
Batch_discard_all(SHC.drw_lamp_sunrays);
|
||||
if (SHC.drw_speaker)
|
||||
Batch_discard_all(SHC.drw_speaker);
|
||||
}
|
||||
|
||||
/* Quads */
|
||||
|
@ -548,6 +551,64 @@ Batch *DRW_cache_lamp_sunrays_get(void)
|
|||
return SHC.drw_lamp_sunrays;
|
||||
}
|
||||
|
||||
/* Speaker */
|
||||
Batch *DRW_cache_speaker_get(void)
|
||||
{
|
||||
if (!SHC.drw_speaker) {
|
||||
float v[3];
|
||||
const int segments = 16;
|
||||
int vidx = 0;
|
||||
|
||||
/* Position Only 3D format */
|
||||
static VertexFormat format = { 0 };
|
||||
static unsigned pos_id;
|
||||
if (format.attrib_ct == 0) {
|
||||
pos_id = add_attrib(&format, "pos", GL_FLOAT, 3, KEEP_FLOAT);
|
||||
}
|
||||
|
||||
VertexBuffer *vbo = VertexBuffer_create_with_format(&format);
|
||||
VertexBuffer_allocate_data(vbo, 3 * segments * 2 + 4 * 4);
|
||||
|
||||
for (int j = 0; j < 3; j++) {
|
||||
float z = 0.25f * j - 0.125f;
|
||||
float r = (j == 0 ? 0.5f : 0.25f);
|
||||
|
||||
copy_v3_fl3(v, r, 0.0f, z);
|
||||
setAttrib(vbo, pos_id, vidx++, v);
|
||||
for (int i = 1; i < segments; i++) {
|
||||
float x = cosf(2.f * (float)M_PI * i / segments) * r;
|
||||
float y = sinf(2.f * (float)M_PI * i / segments) * r;
|
||||
copy_v3_fl3(v, x, y, z);
|
||||
setAttrib(vbo, pos_id, vidx++, v);
|
||||
setAttrib(vbo, pos_id, vidx++, v);
|
||||
}
|
||||
copy_v3_fl3(v, r, 0.0f, z);
|
||||
setAttrib(vbo, pos_id, vidx++, v);
|
||||
}
|
||||
|
||||
for (int j = 0; j < 4; j++) {
|
||||
float x = (((j + 1) % 2) * (j - 1)) * 0.5f;
|
||||
float y = ((j % 2) * (j - 2)) * 0.5f;
|
||||
for (int i = 0; i < 3; i++) {
|
||||
if (i == 1) {
|
||||
x *= 0.5f;
|
||||
y *= 0.5f;
|
||||
}
|
||||
|
||||
float z = 0.25f * i - 0.125f;
|
||||
copy_v3_fl3(v, x, y, z);
|
||||
setAttrib(vbo, pos_id, vidx++, v);
|
||||
if (i == 1) {
|
||||
setAttrib(vbo, pos_id, vidx++, v);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SHC.drw_speaker = Batch_create(GL_LINES, vbo, NULL);
|
||||
}
|
||||
return SHC.drw_speaker;
|
||||
}
|
||||
|
||||
|
||||
/* Object Center */
|
||||
Batch *DRW_cache_single_vert_get(void)
|
||||
|
|
|
@ -50,6 +50,9 @@ struct Batch *DRW_cache_axis_names_get(void);
|
|||
struct Batch *DRW_cache_lamp_get(void);
|
||||
struct Batch *DRW_cache_lamp_sunrays_get(void);
|
||||
|
||||
/* Speaker */
|
||||
struct Batch *DRW_cache_speaker_get(void);
|
||||
|
||||
/* Meshes */
|
||||
struct Batch *DRW_cache_wire_overlay_get(struct Object *ob);
|
||||
struct Batch *DRW_cache_wire_outline_get(struct Object *ob);
|
||||
|
|
|
@ -50,6 +50,9 @@ static DRWShadingGroup *single_arrow_line;
|
|||
static DRWShadingGroup *arrows;
|
||||
static DRWShadingGroup *axis_names;
|
||||
|
||||
/* Speaker */
|
||||
static DRWShadingGroup *speaker;
|
||||
|
||||
/* Lamps */
|
||||
static DRWShadingGroup *lamp_center;
|
||||
static DRWShadingGroup *lamp_center_group;
|
||||
|
@ -228,6 +231,10 @@ void DRW_pass_setup_common(DRWPass **wire_overlay, DRWPass **wire_outline, DRWPa
|
|||
geom = DRW_cache_axis_names_get();
|
||||
axis_names = shgroup_instance_axis_names(*non_meshes, geom);
|
||||
|
||||
/* Speaker */
|
||||
geom = DRW_cache_speaker_get();
|
||||
speaker = shgroup_instance(*non_meshes, geom);
|
||||
|
||||
/* Lamps */
|
||||
lampCenterSize = (U.obcenter_dia + 1.5f) * U.pixelsize;
|
||||
lampCircleRad = U.pixelsize * 9.0f;
|
||||
|
@ -515,6 +522,15 @@ static void DRW_draw_empty(Object *ob)
|
|||
}
|
||||
}
|
||||
|
||||
static void DRW_draw_speaker(Object *ob)
|
||||
{
|
||||
float *color;
|
||||
static float one = 1.0f;
|
||||
draw_object_wire_theme(ob, &color);
|
||||
|
||||
DRW_shgroup_dynamic_call_add(speaker, color, &one, ob->obmat);
|
||||
}
|
||||
|
||||
void DRW_shgroup_non_meshes(DRWPass *UNUSED(non_meshes), Object *ob)
|
||||
{
|
||||
switch (ob->type) {
|
||||
|
@ -524,6 +540,10 @@ void DRW_shgroup_non_meshes(DRWPass *UNUSED(non_meshes), Object *ob)
|
|||
case OB_CAMERA:
|
||||
case OB_EMPTY:
|
||||
DRW_draw_empty(ob);
|
||||
break;
|
||||
case OB_SPEAKER:
|
||||
DRW_draw_speaker(ob);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue