[Bf-blender-cvs] [38ef4c02e1a] tmp-overlay-engine: Overlay Engine: Empties
Clément Foucault
noreply at git.blender.org
Fri Nov 15 01:35:04 CET 2019
Commit: 38ef4c02e1a696e56add58b22021025d0d994cee
Author: Clément Foucault
Date: Fri Nov 8 02:51:58 2019 +0100
Branches: tmp-overlay-engine
https://developer.blender.org/rB38ef4c02e1a696e56add58b22021025d0d994cee
Overlay Engine: Empties
===================================================================
M source/blender/draw/engines/overlay/overlay_extra.c
M source/blender/draw/engines/overlay/overlay_private.h
M source/blender/draw/engines/overlay/shaders/extra_vert.glsl
M source/blender/draw/intern/draw_cache.c
===================================================================
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index 908d9870f91..0bc65809f29 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -164,10 +164,6 @@ void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
cb->mball_handle = buffer_instance_mball_handles(cb->non_meshes, draw_ctx->sh_cfg);
#endif
- /* Lights */
- /* TODO
- * for now we create multiple times the same VBO with only light center coordinates
- * but ideally we would only create it once */
#define BUF_INSTANCE DRW_shgroup_call_buffer_instance
#define BUF_POINT(grp, format) DRW_shgroup_call_buffer(grp, format, GPU_PRIM_POINTS)
@@ -194,6 +190,18 @@ void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
cb->camera_tria[1] = BUF_INSTANCE(grp_sub, format, DRW_cache_camera_tria_get());
cb->camera_distances = BUF_INSTANCE(grp_sub, format, DRW_cache_camera_distances_get());
+ cb->empty_axes = BUF_INSTANCE(grp_sub, format, DRW_cache_bone_arrows_get());
+ cb->empty_capsule_body = BUF_INSTANCE(grp_sub, format, DRW_cache_empty_capsule_body_get());
+ cb->empty_capsule_cap = BUF_INSTANCE(grp_sub, format, DRW_cache_empty_capsule_cap_get());
+ cb->empty_circle = BUF_INSTANCE(grp_sub, format, DRW_cache_circle_get());
+ cb->empty_cone = BUF_INSTANCE(grp_sub, format, DRW_cache_empty_cone_get());
+ cb->empty_cube = BUF_INSTANCE(grp_sub, format, DRW_cache_empty_cube_get());
+ cb->empty_cylinder = BUF_INSTANCE(grp_sub, format, DRW_cache_empty_cylinder_get());
+ cb->empty_plain_axes = BUF_INSTANCE(grp_sub, format, DRW_cache_plain_axes_get());
+ cb->empty_single_arrow = BUF_INSTANCE(grp_sub, format, DRW_cache_single_arrow_get());
+ cb->empty_sphere = BUF_INSTANCE(grp_sub, format, DRW_cache_empty_sphere_get());
+ cb->empty_sphere_solid = BUF_INSTANCE(grp_sub, format, DRW_cache_sphere_get());
+
/* TODO Own move to transparent pass. */
grp_sub = DRW_shgroup_create_sub(grp);
DRW_shgroup_state_enable(grp_sub, DRW_STATE_CULL_BACK | DRW_STATE_BLEND_ALPHA);
@@ -301,6 +309,71 @@ void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
}
}
+/* -------------------------------------------------------------------- */
+/** \name Empties
+ * \{ */
+
+static void DRW_shgroup_empty_ex(OVERLAY_ExtraCallBuffers *cb,
+ const float mat[4][4],
+ const float *draw_size,
+ char draw_type,
+ const float color[4])
+{
+ float instdata[4][4];
+ copy_m4_m4(instdata, mat);
+ instdata[3][3] = *draw_size;
+
+ switch (draw_type) {
+ case OB_PLAINAXES:
+ DRW_buffer_add_entry(cb->empty_plain_axes, color, instdata);
+ break;
+ case OB_SINGLE_ARROW:
+ DRW_buffer_add_entry(cb->empty_single_arrow, color, instdata);
+ break;
+ case OB_CUBE:
+ DRW_buffer_add_entry(cb->empty_cube, color, instdata);
+ break;
+ case OB_CIRCLE:
+ DRW_buffer_add_entry(cb->empty_circle, color, instdata);
+ break;
+ case OB_EMPTY_SPHERE:
+ DRW_buffer_add_entry(cb->empty_sphere, color, instdata);
+ break;
+ case OB_EMPTY_CONE:
+ DRW_buffer_add_entry(cb->empty_cone, color, instdata);
+ break;
+ case OB_ARROWS:
+ DRW_buffer_add_entry(cb->empty_axes, color, instdata);
+ break;
+ case OB_EMPTY_IMAGE:
+ BLI_assert(!"Should never happen, use DRW_shgroup_empty instead.");
+ break;
+ }
+}
+
+static void DRW_shgroup_empty(OVERLAY_ExtraCallBuffers *cb, Object *ob, ViewLayer *view_layer)
+{
+ float *color;
+ DRW_object_wire_theme_get(ob, view_layer, &color);
+
+ switch (ob->empty_drawtype) {
+ case OB_PLAINAXES:
+ case OB_SINGLE_ARROW:
+ case OB_CUBE:
+ case OB_CIRCLE:
+ case OB_EMPTY_SPHERE:
+ case OB_EMPTY_CONE:
+ case OB_ARROWS:
+ DRW_shgroup_empty_ex(cb, ob->obmat, &ob->empty_drawsize, ob->empty_drawtype, color);
+ break;
+ case OB_EMPTY_IMAGE:
+ // DRW_shgroup_empty_image(sh_data, sgl, ob, color, rv3d, sh_cfg);
+ break;
+ }
+}
+
+/** \} */
+
/* -------------------------------------------------------------------- */
/** \name Lights
* \{ */
@@ -733,10 +806,10 @@ void OVERLAY_extra_cache_populate(OVERLAY_Data *vedata,
// DRW_shgroup_lightprobe(sh_data, stl, psl, ob, view_layer, draw_ctx->sh_cfg);
break;
case OB_EMPTY:
- // if (!(((ob->base_flag & BASE_FROM_DUPLI) != 0) &&
- // ((ob->transflag & OB_DUPLICOLLECTION) != 0) && ob->instance_collection)) {
- // DRW_shgroup_empty(sh_data, sgl, ob, view_layer, rv3d, draw_ctx->sh_cfg);
- // }
+ if (!(((ob->base_flag & BASE_FROM_DUPLI) != 0) &&
+ ((ob->transflag & OB_DUPLICOLLECTION) != 0) && ob->instance_collection)) {
+ DRW_shgroup_empty(cb, ob, view_layer);
+ }
break;
}
diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h
index fc1e2284dfb..6bc4423548c 100644
--- a/source/blender/draw/engines/overlay/overlay_private.h
+++ b/source/blender/draw/engines/overlay/overlay_private.h
@@ -87,6 +87,19 @@ typedef struct OVERLAY_ShadingData {
typedef struct OVERLAY_ExtraCallBuffers {
DRWCallBuffer *groundline;
+ DRWCallBuffer *empty_axes;
+ DRWCallBuffer *empty_capsule_body;
+ DRWCallBuffer *empty_capsule_cap;
+ DRWCallBuffer *empty_circle;
+ DRWCallBuffer *empty_cone;
+ DRWCallBuffer *empty_cube;
+ DRWCallBuffer *empty_cylinder;
+ DRWCallBuffer *empty_plain_axes;
+ DRWCallBuffer *empty_single_arrow_line;
+ DRWCallBuffer *empty_single_arrow;
+ DRWCallBuffer *empty_sphere;
+ DRWCallBuffer *empty_sphere_solid;
+
DRWCallBuffer *light_point;
DRWCallBuffer *light_sun;
DRWCallBuffer *light_spot;
diff --git a/source/blender/draw/engines/overlay/shaders/extra_vert.glsl b/source/blender/draw/engines/overlay/shaders/extra_vert.glsl
index 59a7cb91732..210beb1cddf 100644
--- a/source/blender/draw/engines/overlay/shaders/extra_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/extra_vert.glsl
@@ -23,6 +23,8 @@ in vec4 color;
#define camera_dist_end inst_data.w
#define camera_distance_color inst_data.x
+#define empty_scale inst_data.w
+
#define VCLASS_LIGHT_AREA_SHAPE (1 << 0)
#define VCLASS_LIGHT_SPOT_SHAPE (1 << 1)
#define VCLASS_LIGHT_SPOT_BLEND (1 << 2)
@@ -36,6 +38,11 @@ in vec4 color;
#define VCLASS_SCREENSPACE (1 << 8)
#define VCLASS_SCREENALIGNED (1 << 9)
+#define VCLASS_EMPTY_SCALED (1 << 10)
+#define VCLASS_EMPTY_AXES (1 << 11)
+#define VCLASS_EMPTY_AXES_NAME (1 << 12)
+#define VCLASS_EMPTY_AXES_SHADOW (1 << 13)
+
flat out vec4 finalColor;
float mul_project_m4_v3_zfac(in vec3 co)
@@ -126,7 +133,20 @@ void main()
}
}
}
+ /* Empties */
+ else if ((vclass & VCLASS_EMPTY_SCALED) != 0) {
+ /* This is a bit silly but we avoid scalling the object matrix on CPU (saving a mat4 mul) */
+ vpos *= empty_scale;
+ }
+ else if ((vclass & VCLASS_EMPTY_AXES) != 0) {
+ float axis = vpos.z;
+ vec3 chosen_axis = obmat[int(axis)].xyz;
+ vofs = chosen_axis * (1.0 + fract(axis)) * empty_scale;
+ /* Scale uniformly by axis length */
+ vpos *= length(chosen_axis) * empty_scale;
+ }
+ /* Not exclusive with previous flags. */
if ((vclass & VCLASS_CAMERA_VOLUME) != 0) {
/* Unpack final color. */
int color_class = int(floor(color.r));
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index d22458d9e9e..20a11d27cb5 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -57,6 +57,11 @@
#define VCLASS_SCREENSPACE (1 << 8)
#define VCLASS_SCREENALIGNED (1 << 9)
+#define VCLASS_EMPTY_SCALED (1 << 10)
+#define VCLASS_EMPTY_AXES (1 << 11)
+#define VCLASS_EMPTY_AXES_NAME (1 << 12)
+#define VCLASS_EMPTY_AXES_SHADOW (1 << 13)
+
typedef struct Vert {
float pos[3];
int class;
@@ -308,21 +313,16 @@ static GPUVertBuf *fill_arrows_vbo(const float scale)
}
#endif /* UNUSED */
-static GPUVertBuf *sphere_wire_vbo(const float rad)
+static GPUVertBuf *sphere_wire_vbo(const float rad, int flag)
{
#define NSEGMENTS 32
/* Position Only 3D format */
- static GPUVertFormat format = {0};
- static struct {
- uint pos;
- } attr_id;
- if (format.attr_len == 0) {
- attr_id.pos = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
- }
+ GPUVertFormat format = extra_vert_format();
GPUVertBuf *vbo = GPU_vertbuf_create_with_format(&format);
GPU_vertbuf_data_alloc(vbo, NSEGMENTS * 2 * 3);
+ int v = 0;
/* a single ring of vertices */
float p[NSEGMENTS][2];
for (int i = 0; i < NSEGMENTS; i++) {
@@ -334,21 +334,20 @@ static GPUVertBuf *sphere_wire_vbo(const float rad)
for (int axis = 0; axis < 3; axis++) {
for (int i = 0; i < NSEGMENTS; i++) {
for (int j = 0; j < 2; j++) {
- float cv[2], v[3];
+ float cv[2];
cv[0] = p[(i + j) % NSEGMENTS][0];
cv[1] = p[(i + j) % NSEGMENTS][1];
if (axis == 0) {
- ARRAY_SET_ITEMS(v, cv[0], cv[1], 0.0f);
+ GPU_vertbuf_vert_set(vbo, v++, &(Vert){{cv[0], cv[1], 0.0f}, flag});
}
else if (axis == 1) {
- ARRAY_SET_ITEMS(v, cv[0], 0.0f, cv[1]);
+ GPU_vertbuf_vert_set(vbo, v++, &(Vert){{cv[0], 0.0f, cv[1]}, flag});
}
else {
- ARRAY_SET_ITEMS(v, 0.0f, cv[0], cv[1]);
+ GPU_vertbuf_vert_set(vbo, v++, &(Vert){{0.0f, cv[0], cv[1]}, flag});
}
- GPU_vertbuf_attr_set(vbo, attr_id.pos, i * 2 + j + (NSEGMENTS * 2 * axis), v);
}
}
}
@@ -509,111 +508,164 @@ GPUBatch *DRW_cache_sphere_get(void)
/** \name Common
* \{ */
-GPUBatch *DRW_cache_cube_get(void)
-{
- if (!SHC.drw_cube) {
- const GLfloat verts[8][3] = {
- {-1.0f, -1.0f, -1.0f},
- {-1.0f, -1.0f, 1.0f},
- {-1.0f, 1.0f, -1.0f},
- {-1.0f, 1.0f, 1.0f},
- {1.0f, -1.0f, -1.0f},
- {1.0f, -1.0f, 1.0f},
- {1.0f, 1.0f, -1.0f},
- {1.0f, 1.0f, 1.0f},
- };
+/*
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list