[Bf-blender-cvs] [73162d80c25] tmp-overlay-engine: Overlay Engine: Image Empties
Clément Foucault
noreply at git.blender.org
Fri Nov 15 01:35:33 CET 2019
Commit: 73162d80c2502333471cbb88268967996e814b73
Author: Clément Foucault
Date: Thu Nov 14 02:00:45 2019 +0100
Branches: tmp-overlay-engine
https://developer.blender.org/rB73162d80c2502333471cbb88268967996e814b73
Overlay Engine: Image Empties
===================================================================
M source/blender/draw/CMakeLists.txt
M source/blender/draw/engines/overlay/overlay_engine.c
M source/blender/draw/engines/overlay/overlay_extra.c
A source/blender/draw/engines/overlay/overlay_image.c
M source/blender/draw/engines/overlay/overlay_private.h
M source/blender/draw/engines/overlay/overlay_shader.c
A source/blender/draw/engines/overlay/shaders/image_frag.glsl
A source/blender/draw/engines/overlay/shaders/image_vert.glsl
M source/blender/draw/intern/draw_cache.c
M source/blender/draw/intern/draw_cache.h
M source/blender/draw/modes/object_mode.c
M source/blender/makesdna/DNA_world_types.h
===================================================================
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 0139d452baa..69261ac8369 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -140,6 +140,7 @@ set(SRC
engines/overlay/overlay_extra.c
engines/overlay/overlay_facing.c
engines/overlay/overlay_grid.c
+ engines/overlay/overlay_image.c
engines/overlay/overlay_outline.c
engines/overlay/overlay_shader.c
engines/overlay/overlay_wireframe.c
@@ -406,6 +407,8 @@ data_to_c_simple(engines/overlay/shaders/facing_frag.glsl SRC)
data_to_c_simple(engines/overlay/shaders/facing_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/grid_frag.glsl SRC)
data_to_c_simple(engines/overlay/shaders/grid_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/image_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/image_frag.glsl SRC)
data_to_c_simple(engines/overlay/shaders/outline_detect_frag.glsl SRC)
data_to_c_simple(engines/overlay/shaders/outline_expand_frag.glsl SRC)
data_to_c_simple(engines/overlay/shaders/outline_prepass_frag.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index 38a059f3b83..eab0d0701db 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -153,6 +153,7 @@ static void OVERLAY_cache_init(void *vedata)
OVERLAY_extra_cache_init(vedata);
OVERLAY_facing_cache_init(vedata);
OVERLAY_grid_cache_init(vedata);
+ OVERLAY_image_cache_init(vedata);
OVERLAY_outline_cache_init(vedata);
OVERLAY_wireframe_cache_init(vedata);
}
@@ -250,9 +251,6 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
// if (scuplt_mode) {
// OVERLAY_sculpt_cache_populate();
// }
- // if (draw_wires) {
- // OVERLAY_wireframe_cache_populate();
- // }
// }
switch (ob->type) {
@@ -300,11 +298,17 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
}
}
+static void OVERLAY_cache_finish(void *vedata)
+{
+ OVERLAY_image_cache_finish(vedata);
+}
+
static void OVERLAY_draw_scene(void *vedata)
{
OVERLAY_Data *data = vedata;
OVERLAY_PrivateData *pd = data->stl->pd;
+ OVERLAY_image_draw(vedata);
OVERLAY_facing_draw(vedata);
OVERLAY_wireframe_draw(vedata);
OVERLAY_extra_draw(vedata);
@@ -343,7 +347,7 @@ DrawEngineType draw_engine_overlay_type = {
&OVERLAY_engine_free,
&OVERLAY_cache_init,
&OVERLAY_cache_populate,
- NULL,
+ &OVERLAY_cache_finish,
NULL,
&OVERLAY_draw_scene,
NULL,
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index 430818d807e..b89561c9f2d 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -139,6 +139,7 @@ void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
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_image_frame = BUF_INSTANCE(grp_sub, format, DRW_cache_empty_image_frame_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());
@@ -247,7 +248,7 @@ void OVERLAY_extra_line(OVERLAY_ExtraCallBuffers *cb,
DRW_buffer_add_entry(cb->extra_lines, end, &color_id);
}
-static OVERLAY_ExtraCallBuffers *OVERLAY_extra_call_buffer_get(OVERLAY_Data *vedata, Object *ob)
+OVERLAY_ExtraCallBuffers *OVERLAY_extra_call_buffer_get(OVERLAY_Data *vedata, Object *ob)
{
bool do_in_front = (ob->dtx & OB_DRAWXRAY) != 0;
OVERLAY_PrivateData *pd = vedata->stl->pd;
@@ -291,7 +292,8 @@ void OVERLAY_empty_shape(OVERLAY_ExtraCallBuffers *cb,
DRW_buffer_add_entry(cb->empty_axes, color, instdata);
break;
case OB_EMPTY_IMAGE:
- BLI_assert(!"Should never happen, use DRW_shgroup_empty instead.");
+ /* This only show the frame. See OVERLAY_image_empty_cache_populate() for the image. */
+ DRW_buffer_add_entry(cb->empty_image_frame, color, instdata);
break;
}
}
@@ -321,7 +323,7 @@ void OVERLAY_empty_cache_populate(OVERLAY_Data *vedata, Object *ob)
OVERLAY_empty_shape(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);
+ OVERLAY_image_empty_cache_populate(vedata, ob);
break;
}
}
diff --git a/source/blender/draw/engines/overlay/overlay_image.c b/source/blender/draw/engines/overlay/overlay_image.c
new file mode 100644
index 00000000000..91cb026e8c4
--- /dev/null
+++ b/source/blender/draw/engines/overlay/overlay_image.c
@@ -0,0 +1,185 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Copyright 2019, Blender Foundation.
+ */
+
+/** \file
+ * \ingroup draw_engine
+ */
+
+#include "DRW_render.h"
+
+#include "BKE_object.h"
+
+#include "overlay_private.h"
+
+void OVERLAY_image_cache_init(OVERLAY_Data *vedata)
+{
+ OVERLAY_PassList *psl = vedata->psl;
+ OVERLAY_PrivateData *pd = vedata->stl->pd;
+
+ DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA_UNDER_PREMUL;
+ DRW_PASS_CREATE(psl->image_background_ps, state);
+
+ state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS;
+ DRW_PASS_CREATE(psl->image_empties_ps, state | pd->clipping_state);
+
+ state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_BLEND_ALPHA;
+ DRW_PASS_CREATE(psl->image_empties_back_ps, state | pd->clipping_state);
+ DRW_PASS_CREATE(psl->image_empties_blend_ps, state | pd->clipping_state);
+
+ state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA;
+ DRW_PASS_CREATE(psl->image_empties_front_ps, state);
+ DRW_PASS_CREATE(psl->image_foreground_ps, state);
+}
+
+static void overlay_image_calc_aspect(Image *ima, const int size[2], float r_image_aspect[2])
+{
+ float ima_x, ima_y;
+ if (ima) {
+ ima_x = size[0];
+ ima_y = size[1];
+ }
+ else {
+ /* if no image, make it a 1x1 empty square, honor scale & offset */
+ ima_x = ima_y = 1.0f;
+ }
+ /* Get the image aspect even if the buffer is invalid */
+ float sca_x = 1.0f, sca_y = 1.0f;
+ if (ima) {
+ if (ima->aspx > ima->aspy) {
+ sca_y = ima->aspy / ima->aspx;
+ }
+ else if (ima->aspx < ima->aspy) {
+ sca_x = ima->aspx / ima->aspy;
+ }
+ }
+
+ const float scale_x_inv = ima_x * sca_x;
+ const float scale_y_inv = ima_y * sca_y;
+ if (scale_x_inv > scale_y_inv) {
+ r_image_aspect[0] = 1.0f;
+ r_image_aspect[1] = scale_y_inv / scale_x_inv;
+ }
+ else {
+ r_image_aspect[0] = scale_x_inv / scale_y_inv;
+ r_image_aspect[1] = 1.0f;
+ }
+}
+
+void OVERLAY_image_camera_cache_populate(OVERLAY_Data *vedata, Object *ob)
+{
+ // OVERLAY_PrivateData *pd = vedata->stl->pd;
+ // DRWShadingGroup *grp = DRW_shgroup_create_sub(pd->image_background);
+ // DRW_shgroup_uniform_texture(grp, "imgTexture", tex);
+ // DRW_shgroup_call_obmat(grp, batch, NULL);
+}
+
+void OVERLAY_image_empty_cache_populate(OVERLAY_Data *vedata, Object *ob)
+{
+ OVERLAY_PassList *psl = vedata->psl;
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ const RegionView3D *rv3d = draw_ctx->rv3d;
+ GPUTexture *tex = NULL;
+ Image *ima = ob->data;
+ float mat[4][4];
+
+ const bool show_frame = BKE_object_empty_image_frame_is_visible_in_view3d(ob, rv3d);
+ const bool show_image = show_frame && BKE_object_empty_image_data_is_visible_in_view3d(ob, rv3d);
+ const bool use_alpha_blend = (ob->empty_image_flag & OB_EMPTY_IMAGE_USE_ALPHA_BLEND) != 0;
+ const bool use_alpha_premult = ima && (ima->alpha_mode == IMA_ALPHA_PREMUL);
+
+ if (!show_frame) {
+ return;
+ }
+
+ {
+ /* Calling 'BKE_image_get_size' may free the texture. Get the size from 'tex' instead,
+ * see: T59347 */
+ int size[2] = {0};
+ if (ima != NULL) {
+ tex = GPU_texture_from_blender(ima, ob->iuser, GL_TEXTURE_2D);
+ if (tex) {
+ size[0] = GPU_texture_orig_width(tex);
+ size[1] = GPU_texture_orig_height(tex);
+ }
+ }
+ CLAMP_MIN(size[0], 1);
+ CLAMP_MIN(size[1], 1);
+
+ float image_aspect[2];
+ overlay_image_calc_aspect(ob->data, size, image_aspect);
+
+ copy_m4_m4(mat, ob->obmat);
+ mul_v3_fl(mat[0], image_aspect[0] * 0.5f * ob->empty_drawsize);
+ mul_v3_fl(mat[1], image_aspect[1] * 0.5f * ob->empty_drawsize);
+ madd_v3_v3fl(mat[3], mat[0], ob->ima_ofs[0] * 2.0f + 1.0f);
+ madd_v3_v3fl(mat[3], mat[1], ob->ima_ofs[1] * 2.0f + 1.0f);
+ }
+
+ /* Use the actual depth if we are doing depth tests to determine the distance to the object */
+ char depth_mode = DRW_state_is_depth() ? OB_EMPTY_IMAGE_DEPTH_DEFAULT : ob->empty_image_depth;
+ DRWPass *pass = NULL;
+ switch (depth_mode) {
+ case OB_EMPTY_IMAGE_DEPTH_DEFAULT:
+ pass = (use_alpha_blend) ? psl->image_empties_blend_ps : psl->image_empties_ps;
+ break;
+ case OB_EMPTY_IMAGE_DEPTH_BACK:
+ pass = psl->image_empties_back_ps;
+ break;
+ case OB_EMPTY_IMAGE_DEPTH_FRONT:
+ pass = psl->image_empties_front_ps;
+ break;
+ }
+
+ if (show_frame) {
+ OVERLAY_ExtraCallBuffers *cb = OVERL
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list