[Bf-blender-cvs] [1a6b97e98f1] blender2.8: Merge remote-tracking branch 'origin/master' into blender2.8

Dalai Felinto noreply at git.blender.org
Wed May 10 16:00:52 CEST 2017


Commit: 1a6b97e98f190cfe610d70d0e2a05e9e72cfbf33
Author: Dalai Felinto
Date:   Wed May 10 15:25:26 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB1a6b97e98f190cfe610d70d0e2a05e9e72cfbf33

Merge remote-tracking branch 'origin/master' into blender2.8

Note: Depth placement was working already for BI, and althugh this
commit breaks it for it, it makes it work for the draw manager engines.

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



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

diff --cc source/blender/editors/include/ED_view3d.h
index 24a1b06d940,bd0dd72bf70..ecd2cd9a267
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@@ -361,9 -356,12 +361,12 @@@ void ED_view3d_draw_offscreen
          float winmat[4][4], bool do_bgpic, bool do_sky, bool is_persp, const char *viewname,
          struct GPUFX *fx, struct GPUFXSettings *fx_settings,
          struct GPUOffScreen *ofs);
+ void ED_view3d_draw_setup_view(
+         struct wmWindow *win, struct Scene *scene, struct ARegion *ar, struct View3D *v3d,
+         float viewmat[4][4], float winmat[4][4]);
  
  struct ImBuf *ED_view3d_draw_offscreen_imbuf(
 -        struct Scene *scene, struct View3D *v3d, struct ARegion *ar, int sizex, int sizey,
 +        struct Scene *scene, struct SceneLayer *sl, struct View3D *v3d, struct ARegion *ar, int sizex, int sizey,
          unsigned int flag, bool draw_background,
          int alpha_mode, int samples, bool full_samples, const char *viewname,
          struct GPUFX *fx, struct GPUOffScreen *ofs, char err_out[256]);
diff --cc source/blender/editors/space_view3d/view3d_draw.c
index b54681dfde4,cd2a6fe0feb..fad3f73fcd7
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@@ -98,231 -105,322 +98,260 @@@
  #include "view3d_intern.h"  /* own include */
  
  /* prototypes */
 +static void draw_all_objects(const bContext *C, ARegion *ar, const bool only_depth, const bool use_depth);
+ static bool view3d_stereo3d_active(wmWindow *win, Scene *scene, View3D *v3d, RegionView3D *rv3d);
 -static void view3d_stereo3d_setup(Scene *scene, View3D *v3d, ARegion *ar);
 -static void view3d_stereo3d_setup_offscreen(Scene *scene, View3D *v3d, ARegion *ar,
 -                                            float winmat[4][4], const char *viewname);
 -
 -/* handy utility for drawing shapes in the viewport for arbitrary code.
 - * could add lines and points too */
 -// #define DEBUG_DRAW
 -#ifdef DEBUG_DRAW
 -static void bl_debug_draw(void);
 -/* add these locally when using these functions for testing */
 -extern void bl_debug_draw_quad_clear(void);
 -extern void bl_debug_draw_quad_add(const float v0[3], const float v1[3], const float v2[3], const float v3[3]);
 -extern void bl_debug_draw_edge_add(const float v0[3], const float v1[3]);
 -extern void bl_debug_color_set(const unsigned int col);
 -#endif
  
 -void circf(float x, float y, float rad)
 -{
 -	GLUquadricObj *qobj = gluNewQuadric(); 
 -	
 -	gluQuadricDrawStyle(qobj, GLU_FILL); 
 -	
 -	glPushMatrix(); 
 -	
 -	glTranslatef(x, y, 0.0);
 -	
 -	gluDisk(qobj, 0.0,  rad, 32, 1);
 -	
 -	glPopMatrix(); 
 -	
 -	gluDeleteQuadric(qobj);
 -}
 +typedef struct DrawData {
 +	rcti border_rect;
 +	bool render_border;
 +	bool clip_border;
 +	bool is_render;
 +	GPUViewport *viewport;
 +} DrawData;
  
 -void circ(float x, float y, float rad)
 +static void view3d_draw_data_init(const bContext *C, ARegion *ar, RegionView3D *rv3d, DrawData *draw_data)
  {
 -	GLUquadricObj *qobj = gluNewQuadric(); 
 -	
 -	gluQuadricDrawStyle(qobj, GLU_SILHOUETTE); 
 -	
 -	glPushMatrix(); 
 -	
 -	glTranslatef(x, y, 0.0);
 -	
 -	gluDisk(qobj, 0.0,  rad, 32, 1);
 -	
 -	glPopMatrix(); 
 -	
 -	gluDeleteQuadric(qobj);
 -}
 -
 +	Scene *scene = CTX_data_scene(C);
 +	View3D *v3d = CTX_wm_view3d(C);
  
 -/* ********* custom clipping *********** */
 +	draw_data->is_render = (v3d->drawtype == OB_RENDER);
  
 -static void view3d_draw_clipping(RegionView3D *rv3d)
 -{
 -	BoundBox *bb = rv3d->clipbb;
 -
 -	if (bb) {
 -		const unsigned int clipping_index[6][4] = {
 -			{0, 1, 2, 3},
 -			{0, 4, 5, 1},
 -			{4, 7, 6, 5},
 -			{7, 3, 2, 6},
 -			{1, 5, 6, 2},
 -			{7, 4, 0, 3}
 -		};
 -
 -		/* fill in zero alpha for rendering & re-projection [#31530] */
 -		unsigned char col[4];
 -		UI_GetThemeColor4ubv(TH_V3D_CLIPPING_BORDER, col);
 -		glColor4ubv(col);
 -
 -		glEnable(GL_BLEND);
 -		glEnableClientState(GL_VERTEX_ARRAY);
 -		glVertexPointer(3, GL_FLOAT, 0, bb->vec);
 -		glDrawElements(GL_QUADS, sizeof(clipping_index) / sizeof(unsigned int), GL_UNSIGNED_INT, clipping_index);
 -		glDisableClientState(GL_VERTEX_ARRAY);
 -		glDisable(GL_BLEND);
 -	}
 -}
 +	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));
  
 -void ED_view3d_clipping_set(RegionView3D *rv3d)
 -{
 -	double plane[4];
 -	const unsigned int tot = (rv3d->viewlock & RV3D_BOXCLIP) ? 4 : 6;
 -	unsigned int a;
 -
 -	for (a = 0; a < tot; a++) {
 -		copy_v4db_v4fl(plane, rv3d->clip[a]);
 -		glClipPlane(GL_CLIP_PLANE0 + a, plane);
 -		glEnable(GL_CLIP_PLANE0 + a);
 -	}
 +	draw_data->viewport = rv3d->viewport;
  }
  
 -/* use these to temp disable/enable clipping when 'rv3d->rflag & RV3D_CLIPPING' is set */
 -void ED_view3d_clipping_disable(void)
 -{
 -	unsigned int a;
 +/* ******************** general functions ***************** */
  
 -	for (a = 0; a < 6; a++) {
 -		glDisable(GL_CLIP_PLANE0 + a);
 -	}
 -}
 -void ED_view3d_clipping_enable(void)
 +static bool use_depth_doit(Scene *scene, View3D *v3d)
  {
 -	unsigned int a;
 +	if (v3d->drawtype > OB_WIRE)
 +		return true;
  
 -	for (a = 0; a < 6; a++) {
 -		glEnable(GL_CLIP_PLANE0 + a);
 +	/* special case (depth for wire color) */
 +	if (v3d->drawtype <= OB_WIRE) {
 +		if (scene->obedit && scene->obedit->type == OB_MESH) {
 +			Mesh *me = scene->obedit->data;
 +			if (me->drawflag & ME_DRAWEIGHT) {
 +				return true;
 +			}
 +		}
  	}
 +	return false;
  }
  
 -static bool view3d_clipping_test(const float co[3], const float clip[6][4])
 +static bool use_depth(const bContext *C)
  {
 -	if (plane_point_side_v3(clip[0], co) > 0.0f)
 -		if (plane_point_side_v3(clip[1], co) > 0.0f)
 -			if (plane_point_side_v3(clip[2], co) > 0.0f)
 -				if (plane_point_side_v3(clip[3], co) > 0.0f)
 -					return false;
 -
 -	return true;
 +	View3D *v3d = CTX_wm_view3d(C);
 +	Scene *scene = CTX_data_scene(C);
 +	return use_depth_doit(scene, v3d);
  }
  
 -/* for 'local' ED_view3d_clipping_local must run first
 - * then all comparisons can be done in localspace */
 -bool ED_view3d_clipping_test(const RegionView3D *rv3d, const float co[3], const bool is_local)
 +/**
 + * \note keep this synced with #ED_view3d_mats_rv3d_backup/#ED_view3d_mats_rv3d_restore
 + */
 +void ED_view3d_update_viewmat(Scene *scene, View3D *v3d, ARegion *ar, float viewmat[4][4], float winmat[4][4])
  {
 -	return view3d_clipping_test(co, is_local ? rv3d->clip_local : rv3d->clip);
 -}
 +	RegionView3D *rv3d = ar->regiondata;
  
 -/* ********* end custom clipping *********** */
  
 +	/* setup window matrices */
 +	if (winmat)
 +		copy_m4_m4(rv3d->winmat, winmat);
 +	else
 +		view3d_winmatrix_set(ar, v3d, NULL);
  
 -static void drawgrid_draw(ARegion *ar, double wx, double wy, double x, double y, double dx)
 -{	
 -	double verts[2][2];
 +	/* setup view matrix */
 +	if (viewmat)
 +		copy_m4_m4(rv3d->viewmat, viewmat);
 +	else
 +		view3d_viewmatrix_set(scene, v3d, rv3d);  /* note: calls BKE_object_where_is_calc for camera... */
  
 -	x += (wx);
 -	y += (wy);
 +	/* update utility matrices */
 +	mul_m4_m4m4(rv3d->persmat, rv3d->winmat, rv3d->viewmat);
 +	invert_m4_m4(rv3d->persinv, rv3d->persmat);
 +	invert_m4_m4(rv3d->viewinv, rv3d->viewmat);
  
 -	/* set fixed 'Y' */
 -	verts[0][1] = 0.0f;
 -	verts[1][1] = (double)ar->winy;
 +	/* calculate GLSL view dependent values */
  
 -	/* iter over 'X' */
 -	verts[0][0] = verts[1][0] = x - dx * floor(x / dx);
 -	glEnableClientState(GL_VERTEX_ARRAY);
 -	glVertexPointer(2, GL_DOUBLE, 0, verts);
 +	/* store window coordinates scaling/offset */
 +	if (rv3d->persp == RV3D_CAMOB && v3d->camera) {
 +		rctf cameraborder;
 +		ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, &cameraborder, false);
 +		rv3d->viewcamtexcofac[0] = (float)ar->winx / BLI_rctf_size_x(&cameraborder);
 +		rv3d->viewcamtexcofac[1] = (float)ar->winy / BLI_rctf_size_y(&cameraborder);
  
 -	while (verts[0][0] < ar->winx) {
 -		glDrawArrays(GL_LINES, 0, 2);
 -		verts[0][0] = verts[1][0] = verts[0][0] + dx;
 +		rv3d->viewcamtexcofac[2] = -rv3d->viewcamtexcofac[0] * cameraborder.xmin / (float)ar->winx;
 +		rv3d->viewcamtexcofac[3] = -rv3d->viewcamtexcofac[1] * cameraborder.ymin / (float)ar->winy;
 +	}
 +	else {
 +		rv3d->viewcamtexcofac[0] = rv3d->viewcamtexcofac[1] = 1.0f;
 +		rv3d->viewcamtexcofac[2] = rv3d->viewcamtexcofac[3] = 0.0f;
  	}
  
 -	/* set fixed 'X' */
 -	verts[0][0] = 0.0f;
 -	verts[1][0] = (double)ar->winx;
 +	/* calculate pixelsize factor once, is used for lamps and obcenters */
 +	{
 +		/* note:  '1.0f / len_v3(v1)'  replaced  'len_v3(rv3d->viewmat[0])'
 +		 * because of float point precision problems at large values [#23908] */
 +		float v1[3], v2[3];
 +		float len_px, len_sc;
  
 -	/* iter over 'Y' */
 -	verts[0][1] = verts[1][1] = y - dx * floor(y / dx);
 -	while (verts[0][1] < ar->winy) {
 -		glDrawArrays(GL_LINES, 0, 2);
 -		verts[0][1] = verts[1][1] = verts[0][1] + dx;
 -	}
 +		v1[0] = rv3d->persmat[0][0];
 +		v1[1] = rv3d->persmat[1][0];
 +		v1[2] = rv3d->persmat[2][0];
  
 -	glDisableClientState(GL_VERTEX_ARRAY);
 -}
 +		v2[0] = rv3d->persmat[0][1];
 +		v2[1] = rv3d->persmat[1][1];
 +		v2[2] = rv3d->persmat[2][1];
  
 -#define GRID_MIN_PX_D   6.0
 -#define GRID_MIN_PX_F 6.0f
 +		len_px = 2.0f / sqrtf(min_ff(len_squared_v3(v1), len_squared_v3(v2)));
 +		len_sc = (float)MAX2(ar->winx, ar->winy);
  
 -static void drawgrid(UnitSettings *unit, ARegion *ar, View3D *v3d, const char **grid_unit)
 +		rv3d->pixsize = len_px / len_sc;
 +	}
 +}
 +
 +static void view3d_main_region_setup_view(Scene *scene, View3D *v3d, ARegion *ar, float viewmat[4][4], float winmat[4][4])
  {
 -	/* extern short bgpicmode; */
  	RegionView3D *rv3d = ar->regiondata;
 -	double wx, wy, x, y, fw, fx, fy, dx;
 -	double vec4[4];
 -	unsigned char col[3], col2[3];
  
 -	fx = rv3d->persmat[3][0];
 -	fy = rv3d->persmat[3][1];
 -	fw = rv3d->persmat[3][3];
 +	ED_view3d_update_viewmat(scene, v3d, ar, viewmat, winmat);
  
 -	wx = (ar->winx / 2.0); /* because of rounding errors, grid at wrong location */
 -	wy = (ar->winy / 2.0);
 +	/* set for opengl */
 +	gpuLoadProjectionMat

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list