[Bf-blender-cvs] [1458f01] blender2.8: Viewport: move the background to the "modern" viewport

Dalai Felinto noreply at git.blender.org
Mon Oct 24 21:06:04 CEST 2016


Commit: 1458f0136d5e34307563a72144ddee88304fc318
Author: Dalai Felinto
Date:   Mon Oct 24 18:58:12 2016 +0000
Branches: blender2.8
https://developer.blender.org/rB1458f0136d5e34307563a72144ddee88304fc318

Viewport: move the background to the "modern" viewport

This also leaves room for the gradient background Mike Erwin wants to
implement.

===================================================================

M	release/scripts/startup/bl_ui/space_view3d.py
M	source/blender/blenloader/intern/versioning_270.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/editors/space_view3d/view3d_draw_legacy.c
M	source/blender/editors/space_view3d/view3d_intern.h
M	source/blender/makesdna/DNA_view3d_types.h
M	source/blender/makesrna/intern/rna_space.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 232b46c..d0d76bf 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -3014,6 +3014,9 @@ class VIEW3D_PT_viewport_debug(Panel):
         row.prop(view, "debug_near")
         row.prop(view, "debug_far")
 
+        col.label(text="Background:")
+        col.row(align=True).prop(view, "debug_background", expand=True)
+
 
 class VIEW3D_PT_grease_pencil(GreasePencilDataPanel, Panel):
     bl_space_type = 'VIEW_3D'
diff --git a/source/blender/blenloader/intern/versioning_270.c b/source/blender/blenloader/intern/versioning_270.c
index 9374198..e9c51d5 100644
--- a/source/blender/blenloader/intern/versioning_270.c
+++ b/source/blender/blenloader/intern/versioning_270.c
@@ -1337,4 +1337,27 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *main)
 			}
 		}
 	}
+
+	{
+		if (!DNA_struct_elem_find(fd->filesdna, "View3DDebug", "char", "background")) {
+			bScreen *screen;
+
+			for (screen = main->screen.first; screen; screen = screen->id.next) {
+				ScrArea *sa;
+				for (sa = screen->areabase.first; sa; sa = sa->next) {
+					SpaceLink *sl;
+
+					for (sl = sa->spacedata.first; sl; sl = sl->next) {
+						switch (sl->spacetype) {
+							case SPACE_VIEW3D:
+							{
+								View3D *v3d = (View3D *)sl;
+								v3d->debug.background = V3D_DEBUG_BACKGROUND_NONE;
+							}
+						}
+					}
+				}
+			}
+		}
+	}
 }
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 44382b0..11fff7e 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -54,6 +54,7 @@
 #include "ED_transform.h"
 
 #include "GPU_immediate.h"
+#include "GPU_material.h"
 #include "GPU_viewport.h"
 
 #include "MEM_guardedalloc.h"
@@ -784,16 +785,76 @@ static bool view3d_draw_render_draw(const bContext *C, Scene *scene,
 	return true;
 }
 
+/* ******************** background plates ***************** */
+
+static void view3d_draw_background_none()
+{
+	UI_ThemeClearColorAlpha(TH_HIGH_GRAD, 1.0f);
+	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+static void view3d_draw_background_gradient()
+{
+	/* TODO viewport */
+	view3d_draw_background_none();
+}
+
+static void view3d_draw_background_world(Scene *scene, View3D *v3d, RegionView3D *rv3d)
+{
+	if (scene->world) {
+		GPUMaterial *gpumat = GPU_material_world(scene, scene->world);
+
+		/* calculate full shader for background */
+		GPU_material_bind(gpumat, 1, 1, 1.0f, false, rv3d->viewmat, rv3d->viewinv, rv3d->viewcamtexcofac, (v3d->scenelock != 0));
+
+		if (!GPU_material_bound(gpumat)) {
+			view3d_draw_background_none();
+		}
+
+		glClear(GL_DEPTH_BUFFER_BIT);
+		glDisable(GL_DEPTH_TEST);
+
+		/* TODO viewport (dfelinto): GPU_material_bind relies on immediate mode,
+		* we can't get rid of the following code without a bigger refactor
+		* or we dropping this functionality. */
+
+		glBegin(GL_TRIANGLE_STRIP);
+		glVertex2f(-1.0f, -1.0f);
+		glVertex2f(1.0f, -1.0f);
+		glVertex2f(-1.0f, 1.0f);
+		glVertex2f(1.0f, 1.0f);
+		glEnd();
+
+		GPU_material_unbind(gpumat);
+	}
+	else {
+		view3d_draw_background_none();
+	}
+}
+
 /* ******************** solid plates ***************** */
 
 /**
- *
+ * Clear the buffer and draw the proper shader
  */
 static void view3d_draw_background(const bContext *C)
 {
-	/* TODO viewport */
-	UI_ThemeClearColor(TH_HIGH_GRAD);
-	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+	Scene *scene = CTX_data_scene(C);
+	View3D *v3d = CTX_wm_view3d(C);
+	RegionView3D *rv3d = CTX_wm_region_view3d(C);
+
+	switch (v3d->debug.background) {
+		case V3D_DEBUG_BACKGROUND_WORLD:
+			view3d_draw_background_world(scene, v3d, rv3d);
+			break;
+		case V3D_DEBUG_BACKGROUND_GRADIENT:
+			view3d_draw_background_gradient();
+			break;
+		case V3D_DEBUG_BACKGROUND_NONE:
+		default:
+			view3d_draw_background_none(v3d);
+			break;
+	}
 }
 
 /**
@@ -1749,3 +1810,13 @@ void VP_drawrenderborder(ARegion *ar, View3D *v3d)
 {
 	drawrenderborder(ar, v3d);
 }
+
+void VP_view3d_draw_background_none(void)
+{
+	view3d_draw_background_none();
+}
+
+void VP_view3d_draw_background_world(Scene *scene, View3D *v3d, RegionView3D *rv3d)
+{
+	view3d_draw_background_world(scene, v3d, rv3d);
+}
diff --git a/source/blender/editors/space_view3d/view3d_draw_legacy.c b/source/blender/editors/space_view3d/view3d_draw_legacy.c
index c260ab2..8042890 100644
--- a/source/blender/editors/space_view3d/view3d_draw_legacy.c
+++ b/source/blender/editors/space_view3d/view3d_draw_legacy.c
@@ -2246,109 +2246,10 @@ void ED_view3d_draw_offscreen_init(Scene *scene, View3D *v3d)
 static void view3d_main_region_clear(Scene *scene, View3D *v3d, ARegion *ar)
 {
 	if (scene->world && (v3d->flag3 & V3D_SHOW_WORLD)) {
-		RegionView3D *rv3d = ar->regiondata;
-		GPUMaterial *gpumat = GPU_material_world(scene, scene->world);
-
-		/* calculate full shader for background */
-		GPU_material_bind(gpumat, 1, 1, 1.0, false, rv3d->viewmat, rv3d->viewinv, rv3d->viewcamtexcofac, (v3d->scenelock != 0));
-
-		bool material_not_bound = !GPU_material_bound(gpumat);
-
-		/* Draw world */
-		glEnable(GL_DEPTH_TEST);
-		glDepthFunc(GL_ALWAYS);
-
-		if (material_not_bound) {
-			GPU_material_unbind(gpumat);
-
-			glMatrixMode(GL_PROJECTION);
-			glPushMatrix();
-			glLoadIdentity();
-			glMatrixMode(GL_MODELVIEW);
-			glPushMatrix();
-			glLoadIdentity();
-
-			unsigned pos = add_attrib(immVertexFormat(), "pos", GL_FLOAT, 3, KEEP_FLOAT);
-			immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
-			immUniformColor4ub(0.0f, 0.0f, 0.0f, 1.0f);
-
-			immBegin(GL_TRIANGLE_STRIP, 4);
-			immVertex3f(pos, -1.0f, -1.0f, 1.0f);
-			immVertex3f(pos, 1.0f, -1.0f, 1.0f);
-			immVertex3f(pos, -1.0f, 1.0f, 1.0f);
-			immVertex3f(pos, 1.0f, 1.0f, 1.0f);
-			immEnd();
-
-			immUnbindProgram();
-
-			glMatrixMode(GL_PROJECTION);
-			glPopMatrix();
-			glMatrixMode(GL_MODELVIEW);
-			glPopMatrix();
-		}
-		else {
-			/* TODO viewport (dfelinto): GPU_material_bind relies on immediate mode,
-			 * we can't get rid of the following code without a bigger refactor
-			 * or we dropping this functionality. */
-			glBegin(GL_TRIANGLE_STRIP);
-			glVertex3f(-1.0f, -1.0f, 1.0f);
-			glVertex3f(1.0f, -1.0f, 1.0f);
-			glVertex3f(-1.0f, 1.0f, 1.0f);
-			glVertex3f(1.0f, 1.0f, 1.0f);
-			glEnd();
-			GPU_material_unbind(gpumat);
-		}
-
-		glDepthFunc(GL_LEQUAL);
-		glDisable(GL_DEPTH_TEST);
+		VP_view3d_draw_background_world(scene, v3d, ar->regiondata);
 	}
 	else {
-		if (UI_GetThemeValue(TH_SHOW_BACK_GRAD)) {
-			glMatrixMode(GL_PROJECTION);
-			glPushMatrix();
-			glLoadIdentity();
-			glMatrixMode(GL_MODELVIEW);
-			glPushMatrix();
-			glLoadIdentity();
-
-			glEnable(GL_DEPTH_TEST);
-			glDepthFunc(GL_ALWAYS);
-
-			VertexFormat *format = immVertexFormat();
-			unsigned pos = add_attrib(format, "pos", GL_FLOAT, 3, KEEP_FLOAT);
-			unsigned color = add_attrib(format, "color", GL_UNSIGNED_BYTE, 3, NORMALIZE_INT_TO_FLOAT);
-			unsigned char col_hi[3], col_lo[3];
-
-			immBindBuiltinProgram(GPU_SHADER_3D_FLAT_COLOR);
-
-			UI_GetThemeColor3ubv(TH_LOW_GRAD, col_lo);
-			UI_GetThemeColor3ubv(TH_LOW_GRAD, col_hi);
-
-			immBegin(GL_QUADS, 4);
-			immAttrib3ubv(color, col_lo);
-			immVertex3f(pos, -1.0f, -1.0f, 1.0f);
-			immVertex3f(pos, 1.0f, -1.0f, 1.0f);
-
-			immAttrib3ubv(color, col_hi);
-			immVertex3f(pos, 1.0f, 1.0f, 1.0f);
-			immVertex3f(pos, -1.0f, 1.0f, 1.0f);
-			immEnd();
-
-			immUnbindProgram();
-
-			glDepthFunc(GL_LEQUAL);
-			glDisable(GL_DEPTH_TEST);
-
-			glMatrixMode(GL_PROJECTION);
-			glPopMatrix();
-
-			glMatrixMode(GL_MODELVIEW);
-			glPopMatrix();
-		}
-		else {
-			UI_ThemeClearColorAlpha(TH_HIGH_GRAD, 1.0f);
-			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-		}
+		VP_view3d_draw_background_none();
 	}
 }
 
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index fd85527..fb3ef8b 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -342,5 +342,7 @@ void draw_dupli_objects(Scene *scene, ARegion *ar, View3D *v3d, Base *base);
 bool VP_legacy_use_depth(Scene *scene, View3D *v3d);
 void VP_drawviewborder(Scene *scene, ARegion *ar, View3D *v3d);
 void VP_drawrenderborder(ARegion *ar, View3D *v3d);
+void VP_view3d_draw_background_none(void);
+void VP_view3d_draw_background_world(Scene *scene, View3D *v3d, RegionView3D *rv3d);
 
 #endif /* __VIEW3D_INTERN_H__ */
diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h
index 3a990a1..f84a6c3 100644
--- a/source/blender/makesdna/DNA_view3d_types.h
+++ b/source/blender/makesdna/DNA_view3d_types.h
@@ -69,6 +69,8 @@ struct GPUViewport;
 
 typedef struct View3DDebug {
 	float znear, zfar;
+	char background;
+	char pad[7];
 } View3DDebug;
  
 /* Background Picture in 3D-View */
@@ -337,6 +339,13 @@ enum {
 	V3D_DEBUG_SHOW_COMBINED_DEPTH = (1 << 2),
 };
 
+/* View3d->debug.background */
+enum {
+	V3D_DEBUG_BACKGROUND_NONE     = (1 << 0),
+	V3D_DEBUG_BACKGROUND_GRADIENT = (1 << 1),
+	V3D_DEBUG_BACKGROUND_WORLD    = (1 << 2),
+};
+
 /* View3D->around */
 enum {
 	/* center of the bounding box */
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index a1e1c80..7580bd9 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -2379,6 +2379,13 @@ static void rna_def_space_view3d(BlenderRNA *brna)
 		{0, NULL, 0, NULL, NULL}
 	};
 	
+	static EnumPropertyItem debug_background_items[] = {
+		{V3D_DEBUG_BACKGROUND_NONE, "NONE", 0, "None", ""},
+		{V3D_DEBUG_BACKGROUND_GRADIENT, "GRADIENT", 0, "Gradient", ""},
+		{V3D_DEBUG_BACKGROUND_WORLD, "WORLD", 0, "World", ""},
+		{0, NULL, 0, NULL, NULL}
+	};
+
 	srna = RNA_def_struct(brna, "SpaceView3D", "Space");
 	RNA_def_struct_sdna(srna, "View3D");
 	RNA_def_struct_ui_text(srna, "3D View Space", "3D View space data");
@@ -2801,6 +2808,12 @@ static void rna_def_space_view3d(BlenderRNA *brna)
 	RNA_def_property_ui_text(

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list