[Bf-blender-cvs] [87cb1cc] temp_viewport_fx_merge: Merge branch 'master' into temp_viewport_fx_merge

Antony Riakiotakis noreply at git.blender.org
Fri Apr 10 11:30:35 CEST 2015


Commit: 87cb1cc2e6b3fddc86b416faff6dffbf50eea963
Author: Antony Riakiotakis
Date:   Fri Apr 10 11:29:19 2015 +0200
Branches: temp_viewport_fx_merge
https://developer.blender.org/rB87cb1cc2e6b3fddc86b416faff6dffbf50eea963

Merge branch 'master' into temp_viewport_fx_merge

Also tried to use gpuMatrix calls where possible in new code
- might have missed a few places.

Conflicts:
	source/blender/editors/space_view3d/view3d_edit.c
	source/blender/editors/transform/transform.c

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



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

diff --cc source/blender/editors/gpencil/drawgpencil.c
index 730179f,d4d601b..115b7d7
--- a/source/blender/editors/gpencil/drawgpencil.c
+++ b/source/blender/editors/gpencil/drawgpencil.c
@@@ -56,12 -59,11 +59,14 @@@
  #include "BIF_gl.h"
  #include "BIF_glutil.h"
  
 +#include "GPU_primitives.h"
 +#include "GPU_matrix.h"
 +
  #include "ED_gpencil.h"
+ #include "ED_screen.h"
  #include "ED_view3d.h"
  
+ #include "UI_interface_icons.h"
  #include "UI_resources.h"
  
  /* ************************************************** */
diff --cc source/blender/editors/space_view3d/drawobject.c
index c1a36cd,f0b7864..7d501c9
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@@ -1736,6 -1741,238 +1736,238 @@@ static void draw_viewport_reconstructio
  		GPU_select_load_id(base->selcol);
  }
  
+ static void drawcamera_volume(float near_plane[4][3], float far_plane[4][3], const GLenum mode)
+ {
+ 	glBegin(mode);
+ 	glVertex3fv(near_plane[0]);
+ 	glVertex3fv(far_plane[0]);
+ 	glVertex3fv(far_plane[1]);
+ 	glVertex3fv(near_plane[1]);
+ 	glEnd();
+ 
+ 	glBegin(mode);
+ 	glVertex3fv(near_plane[1]);
+ 	glVertex3fv(far_plane[1]);
+ 	glVertex3fv(far_plane[2]);
+ 	glVertex3fv(near_plane[2]);
+ 	glEnd();
+ 
+ 	glBegin(mode);
+ 	glVertex3fv(near_plane[2]);
+ 	glVertex3fv(near_plane[1]);
+ 	glVertex3fv(far_plane[1]);
+ 	glVertex3fv(far_plane[2]);
+ 	glEnd();
+ 
+ 	glBegin(mode);
+ 	glVertex3fv(far_plane[0]);
+ 	glVertex3fv(near_plane[0]);
+ 	glVertex3fv(near_plane[3]);
+ 	glVertex3fv(far_plane[3]);
+ 	glEnd();
+ }
+ 
+ /* camera frame */
+ static void drawcamera_frame(float vec[4][3], const GLenum mode)
+ {
+ 	glBegin(mode);
+ 	glVertex3fv(vec[0]);
+ 	glVertex3fv(vec[1]);
+ 	glVertex3fv(vec[2]);
+ 	glVertex3fv(vec[3]);
+ 	glEnd();
+ }
+ 
+ /* center point to camera frame */
+ static void drawcamera_framelines(float vec[4][3], float origin[3])
+ {
+ 	glBegin(GL_LINE_STRIP);
+ 	glVertex3fv(vec[1]);
+ 	glVertex3fv(origin);
+ 	glVertex3fv(vec[0]);
+ 	glVertex3fv(vec[3]);
+ 	glVertex3fv(origin);
+ 	glVertex3fv(vec[2]);
+ 	glEnd();
+ }
+ 
+ static bool drawcamera_is_stereo3d(Scene *scene, View3D *v3d, Object *ob)
+ {
+ 	return (ob == v3d->camera) &&
+ 	        (scene->r.scemode & R_MULTIVIEW) != 0 &&
+ 	        (v3d->stereo3d_flag);
+ }
+ 
+ static void drawcamera_stereo3d(
+         Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, const Camera *cam,
+         float vec[4][3], float drawsize, const float scale[3])
+ {
+ 	int i, j;
+ 	float obmat[4][4];
+ 	float vec_lr[2][4][3];
+ 	const float fac = (cam->stereo.pivot == CAM_S3D_PIVOT_CENTER) ? 2.0f : 1.0f;
+ 	float origin[2][3] = {{0}};
+ 	float tvec[3];
+ 	const Camera *cam_lr[2];
+ 	const char *names[2] = {STEREO_LEFT_NAME, STEREO_RIGHT_NAME};
+ 
+ 	const bool is_stereo3d_cameras = (v3d->stereo3d_flag & V3D_S3D_DISPCAMERAS) && (scene->r.views_format == SCE_VIEWS_FORMAT_STEREO_3D);
+ 	const bool is_stereo3d_plane = (v3d->stereo3d_flag & V3D_S3D_DISPPLANE) && (scene->r.views_format == SCE_VIEWS_FORMAT_STEREO_3D);
+ 	const bool is_stereo3d_volume = (v3d->stereo3d_flag & V3D_S3D_DISPVOLUME);
+ 
+ 	zero_v3(tvec);
+ 
 -	glPushMatrix();
++	gpuPushMatrix(GPU_MODELVIEW);
+ 
+ 	for (i = 0; i < 2; i++) {
+ 		ob = BKE_camera_multiview_render(scene, ob, names[i]);
+ 		cam_lr[i] = ob->data;
+ 
 -		glLoadMatrixf(rv3d->viewmat);
++		gpuLoadMatrix(GPU_MODELVIEW, rv3d->viewmat[0]);
+ 		BKE_camera_multiview_model_matrix(&scene->r, ob, names[i], obmat);
 -		glMultMatrixf(obmat);
++		gpuMultMatrix(GPU_MODELVIEW, obmat[0]);
+ 
+ 		copy_m3_m3(vec_lr[i], vec);
+ 		copy_v3_v3(vec_lr[i][3], vec[3]);
+ 
+ 		if (cam->stereo.convergence_mode == CAM_S3D_OFFAXIS) {
+ 			const float shift_x =
+ 			        ((BKE_camera_multiview_shift_x(&scene->r, ob, names[i]) - cam->shiftx) *
+ 			         (drawsize * scale[0] * fac));
+ 
+ 			for (j = 0; j < 4; j++) {
+ 				vec_lr[i][j][0] += shift_x;
+ 			}
+ 		}
+ 
+ 		if (is_stereo3d_cameras) {
+ 			/* camera frame */
+ 			drawcamera_frame(vec_lr[i], GL_LINE_LOOP);
+ 
+ 			/* center point to camera frame */
+ 			drawcamera_framelines(vec_lr[i], tvec);
+ 		}
+ 
+ 		/* connecting line */
+ 		mul_m4_v3(obmat, origin[i]);
+ 
+ 		/* convergence plane */
+ 		if (is_stereo3d_plane || is_stereo3d_volume) {
+ 			for (j = 0; j < 4; j++) {
+ 				mul_m4_v3(obmat, vec_lr[i][j]);
+ 			}
+ 		}
+ 	}
+ 
+ 
+ 	/* the remaining drawing takes place in the view space */
 -	glLoadMatrixf(rv3d->viewmat);
++	gpuLoadMatrix(GPU_MODELVIEW, rv3d->viewmat[0]);
+ 
+ 	if (is_stereo3d_cameras) {
+ 		/* draw connecting lines */
+ 		glPushAttrib(GL_ENABLE_BIT);
+ 
+ 		glLineStipple(2, 0xAAAA);
+ 		glEnable(GL_LINE_STIPPLE);
+ 
+ 		glBegin(GL_LINES);
+ 		glVertex3fv(origin[0]);
+ 		glVertex3fv(origin[1]);
+ 		glEnd();
+ 		glPopAttrib();
+ 	}
+ 
+ 	/* draw convergence plane*/
+ 	if (is_stereo3d_plane) {
+ 		float axis_center[3], screen_center[3];
+ 		float world_plane[4][3];
+ 		float local_plane[4][3];
+ 		float offset;
+ 
+ 		mid_v3_v3v3(axis_center, origin[0], origin[1]);
+ 
+ 		for (i = 0; i < 4; i++) {
+ 			mid_v3_v3v3(world_plane[i], vec_lr[0][i], vec_lr[1][i]);
+ 			sub_v3_v3v3(local_plane[i], world_plane[i], axis_center);
+ 		}
+ 
+ 		mid_v3_v3v3(screen_center, world_plane[0], world_plane[2]);
+ 		offset = cam->stereo.convergence_distance / len_v3v3(screen_center, axis_center);
+ 
+ 		for (i = 0; i < 4; i++) {
+ 			mul_v3_fl(local_plane[i], offset);
+ 			add_v3_v3(local_plane[i], axis_center);
+ 		}
+ 
+ 		glColor3f(0.0f, 0.0f, 0.0f);
+ 
+ 		/* camera frame */
+ 		drawcamera_frame(local_plane, GL_LINE_LOOP);
+ 
+ 		if (v3d->stereo3d_convergence_alpha > 0.0f) {
+ 			glEnable(GL_BLEND);
+ 			glDepthMask(0);  /* disable write in zbuffer, needed for nice transp */
+ 
+ 			glColor4f(0.0f, 0.0f, 0.0f, v3d->stereo3d_convergence_alpha);
+ 
+ 			drawcamera_frame(local_plane, GL_QUADS);
+ 
+ 			glDisable(GL_BLEND);
+ 			glDepthMask(1);  /* restore write in zbuffer */
+ 		}
+ 	}
+ 
+ 	/* draw convergence plane*/
+ 	if (is_stereo3d_volume) {
+ 		float screen_center[3];
+ 		float near_plane[4][3], far_plane[4][3];
+ 		float offset;
+ 		int j;
+ 
+ 		for (i = 0; i < 2; i++) {
+ 			mid_v3_v3v3(screen_center, vec_lr[i][0], vec_lr[i][2]);
+ 
+ 			offset = len_v3v3(screen_center, origin[i]);
+ 
+ 			for (j = 0; j < 4; j++) {
+ 				sub_v3_v3v3(near_plane[j], vec_lr[i][j], origin[i]);
+ 				mul_v3_fl(near_plane[j], cam_lr[i]->clipsta / offset);
+ 				add_v3_v3(near_plane[j], origin[i]);
+ 
+ 				sub_v3_v3v3(far_plane[j], vec_lr[i][j], origin[i]);
+ 				mul_v3_fl(far_plane[j], cam_lr[i]->clipend / offset);
+ 				add_v3_v3(far_plane[j], origin[i]);
+ 			}
+ 
+ 			/* camera frame */
+ 			glColor3f(0.0f, 0.0f, 0.0f);
+ 
+ 			drawcamera_frame(near_plane, GL_LINE_LOOP);
+ 			drawcamera_frame(far_plane, GL_LINE_LOOP);
+ 			drawcamera_volume(near_plane, far_plane, GL_LINE_LOOP);
+ 
+ 			if (v3d->stereo3d_volume_alpha > 0.0f) {
+ 				glEnable(GL_BLEND);
+ 				glDepthMask(0);  /* disable write in zbuffer, needed for nice transp */
+ 
+ 				if (i == 0)
+ 					glColor4f(0.0f, 1.0f, 1.0f, v3d->stereo3d_volume_alpha);
+ 				else
+ 					glColor4f(1.0f, 0.0f, 0.0f, v3d->stereo3d_volume_alpha);
+ 
+ 				drawcamera_frame(near_plane, GL_QUADS);
+ 				drawcamera_frame(far_plane, GL_QUADS);
+ 				drawcamera_volume(near_plane, far_plane, GL_QUADS);
+ 
+ 				glDisable(GL_BLEND);
+ 				glDepthMask(1);  /* restore write in zbuffer */
+ 			}
+ 		}
+ 	}
+ 
 -	glPopMatrix();
++	gpuPopMatrix(GPU_MODELVIEW);
+ }
+ 
  /* flag similar to draw_object() */
  static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
                         const short dflag, const unsigned char ob_wire_col[4])
@@@ -1859,9 -2090,14 +2085,14 @@@
  					draw_limit_line(world->miststa, world->miststa + world->mistdist, dflag, 0xFFFFFF);
  				}
  			}
 -			glPopMatrix();
 +			gpuPopMatrix(GPU_MODELVIEW);
  		}
  	}
+ 
+ 	/* stereo cameras drawing */
+ 	if (is_stereo3d) {
+ 		drawcamera_stereo3d(scene, v3d, rv3d, ob, cam, vec, drawsize, scale);
+ 	}
  }
  
  /* flag similar to draw_object() */
diff --cc source/blender/editors/space_view3d/view3d_edit.c
index 1b0ee23,236fefc..6e6ded5
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@@ -4704,19 -4699,33 +4704,28 @@@ bool ED_view3d_autodist(Scene *scene, A
                          const bool alphaoverride, const float fallback_depth_pt[3])
  {
  	bglMats mats; /* ZBuffer depth vars */
+ 	float depth_close;
 -	double cent[2],  p[3];
 +	float cent[3];
+ 	int margin_arr[] = {0, 2, 4};
+ 	int i;
+ 	bool depth_ok = false;
  
  	/* Get Z Depths, needed for perspective, nice for ortho */
  	bgl_get_mats(&mats);
  	ED_view3d_draw_depth(scene, ar, v3d, alphaoverride);
  
- 	cent[2] = view_autodist_depth_margin(ar, mval, 4);
+ 	/* Attempt with low margin's first */
+ 	i = 0;
+ 	do {
+ 		depth_close = view_autodist_depth_margin(ar, mval, margin_arr[i++] * U.pixelsize);
+ 		depth_ok = (depth_close != FLT_MAX);
+ 	} while ((depth_ok == false) && (i < ARRAY_SIZE(margin_arr)));
  
- 	if (cent[2] != FLT_MAX) {
- 		cent[0] = mval[0];
- 		cent[1] = mval[1];
+ 	if (depth_ok) {
 -		cent[0] = (double)mval[0] + 0.5;
 -		cent[1] = (double)mval[1] + 0.5;
++		cent[0] = mval[0] + 0.5;
++		cent[1] = mval[1] + 0.5;
  
 -		if (gluUnProject(cent[0], cent[1], depth_close,
 -		                 mats.modelview, mats.projection, (GLint *)mats.viewport, &p[0], &p[1], &p[2]))
 -		{
 -			mouse_worldloc[0] = (float)p[0];
 -			mouse_worldloc[1] = (float)p[1];
 -			mouse_worldloc[2] = (float)p[2];
 +		if (gpuUnProject(cent, mats.modelview, mats.projection, (GLint *)mats.viewport, mouse_worldloc) != 0) {
  			return true;
  		}
  	}
@@@ -4752,15 -4762,15 +4761,15 @@@ bool ED_view3d_autodist_simple(ARegion 
  
  	/* Get Z Depths, needed for perspective, nice for ortho */
  	if (force_depth)
 -		depth = *force_depth;
 +		cent[2] = *force_depth;
  	else
 -		depth = view_autodist_depth_margin(ar, mval, margin);
 +		cent[2] = view_autodist_depth_margin(ar, mval, margin);
  
 -	if (depth == FLT_MAX)
 +	if (cent[2] == FLT_MAX)
  		return false;
  
- 	cent[0] = (float)mval[0];
- 	cent[1] = (float)mval[1];
 -	cent[0] = (double)mval[0] + 0.5;
 -	cent[1] = (double)mva

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list