Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--release/scripts/startup/bl_ui/space_view3d.py13
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c77
-rw-r--r--source/blender/gpu/GPU_viewport.h11
-rw-r--r--source/blender/gpu/intern/gpu_viewport.c89
-rw-r--r--source/blender/makesdna/DNA_view3d_types.h9
-rw-r--r--source/blender/makesrna/intern/rna_space.c24
6 files changed, 220 insertions, 3 deletions
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 36ada1eb1db..232b46c3c35 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -3000,6 +3000,19 @@ class VIEW3D_PT_viewport_debug(Panel):
col = layout.column()
col.label(text="Placeholder for debugging options")
+ col.separator()
+
+ row = col.row()
+ row.active = not view.show_combined_depth
+ row.prop(view, "show_scene_depth")
+ row = col.row()
+ row.active = not view.show_scene_depth
+ row.prop(view, "show_combined_depth")
+
+ row = col.row(align=True)
+ row.active = view.show_scene_depth or view.show_combined_depth
+ row.prop(view, "debug_near")
+ row.prop(view, "debug_far")
class VIEW3D_PT_grease_pencil(GreasePencilDataPanel, Panel):
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 4a2a04359f7..941315961b3 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -56,6 +56,8 @@
#include "GPU_immediate.h"
#include "GPU_viewport.h"
+#include "MEM_guardedalloc.h"
+
#include "UI_interface.h"
#include "UI_resources.h"
@@ -73,9 +75,10 @@ typedef struct DrawData {
bool render_border;
bool clip_border;
bool is_render;
+ GPUViewport *viewport;
} DrawData;
-static void view3d_draw_data_init(const bContext *C, ARegion *ar, DrawData *draw_data)
+static void view3d_draw_data_init(const bContext *C, ARegion *ar, RegionView3D *rv3d, DrawData *draw_data)
{
Scene *scene = CTX_data_scene(C);
View3D *v3d = CTX_wm_view3d(C);
@@ -84,6 +87,8 @@ static void view3d_draw_data_init(const bContext *C, ARegion *ar, DrawData *draw
draw_data->render_border = ED_view3d_calc_render_border(scene, v3d, ar, &draw_data->border_rect);
draw_data->clip_border = (draw_data->render_border && !BLI_rcti_compare(&ar->drawrct, &draw_data->border_rect));
+
+ draw_data->viewport = rv3d->viewport;
}
/* ******************** general functions ***************** */
@@ -266,6 +271,70 @@ static void view3d_stereo3d_setup(Scene *scene, View3D *v3d, ARegion *ar)
}
}
+/* ******************** debug ***************** */
+
+static void view3d_draw_debug_store_depth(ARegion *ar, DrawData *draw_data)
+{
+ GPUViewport *viewport = draw_data->viewport;
+ GLint viewport_size[4];
+ glGetIntegerv(GL_VIEWPORT, viewport_size);
+
+ const int x = viewport_size[0];
+ const int y = viewport_size[1];
+ const int w = viewport_size[2];
+ const int h = viewport_size[3];
+
+ if (GPU_viewport_debug_depth_is_valid(viewport)) {
+ if ((GPU_viewport_debug_depth_width(viewport) != w) ||
+ (GPU_viewport_debug_depth_height(viewport) != h))
+ {
+ GPU_viewport_debug_depth_free(viewport);
+ }
+ }
+
+ if (!GPU_viewport_debug_depth_is_valid(viewport)) {
+ char error[256];
+ if (!GPU_viewport_debug_depth_create(viewport, w, h, 0, error)) {
+ fprintf(stderr, "Failed to create depth buffer for debug: %s\n", error);
+ return;
+ }
+ }
+
+ GPU_viewport_debug_depth_store(viewport, x, y);
+}
+
+static void view3d_draw_debug_post_solid(const bContext *C, ARegion *ar, DrawData *draw_data)
+{
+ View3D *v3d = CTX_wm_view3d(C);
+
+ if ((v3d->tmp_compat_flag & V3D_DEBUG_SHOW_SCENE_DEPTH) != 0) {
+ view3d_draw_debug_store_depth(ar, draw_data);
+ }
+}
+
+static void view3d_draw_debug(const bContext *C, ARegion *ar, DrawData *draw_data)
+{
+ View3D *v3d = CTX_wm_view3d(C);
+
+ if ((v3d->tmp_compat_flag & V3D_DEBUG_SHOW_COMBINED_DEPTH) != 0) {
+ /* store */
+ view3d_draw_debug_store_depth(ar, draw_data);
+ }
+
+ if (((v3d->tmp_compat_flag & V3D_DEBUG_SHOW_SCENE_DEPTH) != 0) ||
+ ((v3d->tmp_compat_flag & V3D_DEBUG_SHOW_COMBINED_DEPTH) != 0))
+ {
+ /* draw */
+ if (GPU_viewport_debug_depth_is_valid(draw_data->viewport)) {
+ GPU_viewport_debug_depth_draw(draw_data->viewport, v3d->debug.znear, v3d->debug.zfar);
+ }
+ }
+ else {
+ /* cleanup */
+ GPU_viewport_debug_depth_free(draw_data->viewport);
+ }
+}
+
/* ******************** view border ***************** */
static void view3d_camera_border(
@@ -1481,6 +1550,9 @@ static void view3d_draw_solid_plates(const bContext *C, ARegion *ar, DrawData *d
if (draw_data->is_render) {
view3d_draw_render_draw(C, scene, ar, v3d, draw_data->clip_border, &draw_data->border_rect);
}
+
+ /* debug */
+ view3d_draw_debug_post_solid(C, ar, draw_data);
}
/**
@@ -1606,6 +1678,7 @@ static void view3d_draw_view(const bContext *C, ARegion *ar, DrawData *draw_data
view3d_draw_reference_images(C);
view3d_draw_manipulator(C);
view3d_draw_region_info(C, ar);
+ view3d_draw_debug(C, ar, draw_data);
}
void view3d_main_region_draw(const bContext *C, ARegion *ar)
@@ -1625,7 +1698,7 @@ void view3d_main_region_draw(const bContext *C, ARegion *ar)
* before we even call the drawing routine, but let's move on for now (dfelinto)
* but this is a provisory way to start seeing things in the viewport */
DrawData draw_data;
- view3d_draw_data_init(C, ar, &draw_data);
+ view3d_draw_data_init(C, ar, rv3d, &draw_data);
view3d_draw_view(C, ar, &draw_data);
v3d->flag |= V3D_INVALID_BACKBUF;
diff --git a/source/blender/gpu/GPU_viewport.h b/source/blender/gpu/GPU_viewport.h
index 82b537e1c3d..e2519484eb4 100644
--- a/source/blender/gpu/GPU_viewport.h
+++ b/source/blender/gpu/GPU_viewport.h
@@ -32,10 +32,21 @@
#ifndef __GPU_VIEWPORT_H__
#define __GPU_VIEWPORT_H__
+#include <stdbool.h>
+
typedef struct GPUViewport GPUViewport;
GPUViewport *GPU_viewport_create(void);
void GPU_viewport_free(GPUViewport *viewport);
+/* debug */
+bool GPU_viewport_debug_depth_create(GPUViewport *viewport, int width, int height, int samples, char err_out[256]);
+void GPU_viewport_debug_depth_free(GPUViewport *viewport);
+void GPU_viewport_debug_depth_store(GPUViewport *viewport, const int x, const int y);
+void GPU_viewport_debug_depth_draw(GPUViewport *viewport, const float znear, const float zfar);
+bool GPU_viewport_debug_depth_is_valid(GPUViewport *viewport);
+int GPU_viewport_debug_depth_width(const GPUViewport *viewport);
+int GPU_viewport_debug_depth_height(const GPUViewport *viewport);
+
#endif // __GPU_VIEWPORT_H__
diff --git a/source/blender/gpu/intern/gpu_viewport.c b/source/blender/gpu/intern/gpu_viewport.c
index bae2fdc552d..6cad0506cf4 100644
--- a/source/blender/gpu/intern/gpu_viewport.c
+++ b/source/blender/gpu/intern/gpu_viewport.c
@@ -31,12 +31,19 @@
* System that manages viewport drawing.
*/
+#include "GPU_glew.h"
+#include "GPU_immediate.h"
#include "GPU_viewport.h"
+#include "GPU_texture.h"
#include "MEM_guardedalloc.h"
struct GPUViewport {
float pad[4];
+
+ /* debug */
+ GPUTexture *debug_depth;
+ int debug_width, debug_height;
};
GPUViewport *GPU_viewport_create(void)
@@ -47,6 +54,88 @@ GPUViewport *GPU_viewport_create(void)
void GPU_viewport_free(GPUViewport *viewport)
{
+ GPU_viewport_debug_depth_free(viewport);
MEM_freeN(viewport);
}
+/****************** debug ********************/
+
+bool GPU_viewport_debug_depth_create(GPUViewport *viewport, int width, int height, int samples, char err_out[256])
+{
+ viewport->debug_depth = GPU_texture_create_2D(width, height, NULL, GPU_HDR_HALF_FLOAT, err_out);
+ return (viewport->debug_depth != NULL);
+}
+
+void GPU_viewport_debug_depth_free(GPUViewport *viewport)
+{
+ if (viewport->debug_depth != NULL) {
+ MEM_freeN(viewport->debug_depth);
+ viewport->debug_depth = NULL;
+ }
+}
+
+void GPU_viewport_debug_depth_store(GPUViewport *viewport, const int x, const int y)
+{
+ const int w = GPU_texture_width(viewport->debug_depth);
+ const int h = GPU_texture_height(viewport->debug_depth);
+
+ GPU_texture_bind(viewport->debug_depth, 0);
+ glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, x, y, w, h, 0);
+ GPU_texture_unbind(viewport->debug_depth);
+}
+
+void GPU_viewport_debug_depth_draw(GPUViewport *viewport, const float znear, const float zfar)
+{
+ const float w = (float)GPU_texture_width(viewport->debug_depth);
+ const float h = (float)GPU_texture_height(viewport->debug_depth);
+
+ const int activeTex = GL_TEXTURE0;
+ glActiveTexture(activeTex);
+
+ VertexFormat *format = immVertexFormat();
+ unsigned texcoord = add_attrib(format, "texCoord", GL_FLOAT, 2, KEEP_FLOAT);
+ unsigned pos = add_attrib(format, "pos", GL_FLOAT, 2, KEEP_FLOAT);
+
+ immBindBuiltinProgram(GPU_SHADER_3D_IMAGE_DEPTH);
+
+ GPU_texture_bind(viewport->debug_depth, 0);
+
+ immUniform1f("znear", znear);
+ immUniform1f("zfar", zfar);
+ immUniform1i("image", activeTex);
+
+ immBegin(GL_QUADS, 4);
+
+ immAttrib2f(texcoord, 0.0f, 0.0f);
+ immVertex2f(pos, 0.0f, 0.0f);
+
+ immAttrib2f(texcoord, 1.0f, 0.0f);
+ immVertex2f(pos, w, 0.0f);
+
+ immAttrib2f(texcoord, 1.0f, 1.0f);
+ immVertex2f(pos, w, h);
+
+ immAttrib2f(texcoord, 0.0f, 1.0f);
+ immVertex2f(pos, 0.0f, h);
+
+ immEnd();
+
+ GPU_texture_unbind(viewport->debug_depth);
+
+ immUnbindProgram();
+}
+
+int GPU_viewport_debug_depth_width(const GPUViewport *viewport)
+{
+ return GPU_texture_width(viewport->debug_depth);
+}
+
+int GPU_viewport_debug_depth_height(const GPUViewport *viewport)
+{
+ return GPU_texture_height(viewport->debug_depth);
+}
+
+bool GPU_viewport_debug_depth_is_valid(GPUViewport *viewport)
+{
+ return viewport->debug_depth != NULL;
+}
diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h
index 7e0adf48849..3a990a183c5 100644
--- a/source/blender/makesdna/DNA_view3d_types.h
+++ b/source/blender/makesdna/DNA_view3d_types.h
@@ -66,6 +66,10 @@ struct GPUViewport;
/* The near/far thing is a Win EXCEPTION. Thus, leave near/far in the
* code, and patch for windows. */
+
+typedef struct View3DDebug {
+ float znear, zfar;
+} View3DDebug;
/* Background Picture in 3D-View */
typedef struct BGpic {
@@ -249,6 +253,7 @@ typedef struct View3D {
short prev_drawtype;
short pad1;
float pad2;
+ View3DDebug debug;
} View3D;
@@ -327,7 +332,9 @@ typedef struct View3D {
/* View3d->tmp_compat_flag */
enum {
- V3D_NEW_VIEWPORT = (1 << 0),
+ V3D_NEW_VIEWPORT = (1 << 0),
+ V3D_DEBUG_SHOW_SCENE_DEPTH = (1 << 1),
+ V3D_DEBUG_SHOW_COMBINED_DEPTH = (1 << 2),
};
/* View3D->around */
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index feec66ee3ed..a1e1c804873 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -2777,6 +2777,30 @@ static void rna_def_space_view3d(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Modern Viewport", "Use modern viewport");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+ prop = RNA_def_property(srna, "show_scene_depth", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "tmp_compat_flag", V3D_DEBUG_SHOW_SCENE_DEPTH);
+ RNA_def_property_ui_text(prop, "Show Scene Depth", "Debug option to show the depth in the viewport");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
+ prop = RNA_def_property(srna, "show_combined_depth", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "tmp_compat_flag", V3D_DEBUG_SHOW_COMBINED_DEPTH);
+ RNA_def_property_ui_text(prop, "Show Combined Depth", "Debug option to show the depth in the viewport");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
+ prop = RNA_def_property(srna, "debug_near", PROP_FLOAT, PROP_DISTANCE);
+ RNA_def_property_float_sdna(prop, NULL, "debug.znear");
+ RNA_def_property_ui_text(prop, "Near", "Near distance for depth debugging");
+ RNA_def_property_range(prop, 1e-6f, FLT_MAX);
+ RNA_def_property_ui_range(prop, 0.001f, FLT_MAX, 10, 3);
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
+ prop = RNA_def_property(srna, "debug_far", PROP_FLOAT, PROP_DISTANCE);
+ RNA_def_property_float_sdna(prop, NULL, "debug.zfar");
+ RNA_def_property_range(prop, 1e-6f, FLT_MAX);
+ RNA_def_property_ui_range(prop, 0.001f, FLT_MAX, 10, 3);
+ RNA_def_property_ui_text(prop, "Far", "Far distance for depth debugging");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
/* *** Animated *** */
RNA_define_animate_sdna(true);
/* region */