[Bf-blender-cvs] [7fefdaa] multiview: Merge remote-tracking branch 'origin/master' into multiview

Dalai Felinto noreply at git.blender.org
Tue Nov 25 16:36:38 CET 2014


Commit: 7fefdaadc88c02d0639befccb410a19592c81c1d
Author: Dalai Felinto
Date:   Tue Nov 25 13:35:58 2014 -0200
Branches: multiview
https://developer.blender.org/rB7fefdaadc88c02d0639befccb410a19592c81c1d

Merge remote-tracking branch 'origin/master' into multiview

Conflicts:
	source/blender/editors/space_view3d/view3d_draw.c
	source/blender/makesdna/DNA_view3d_types.h
	source/blender/makesdna/DNA_space_types.h

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



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

diff --cc source/blender/editors/space_view3d/view3d_draw.c
index 8e0e1ac,d4a0c01..d7fa680
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@@ -2871,15 -3016,13 +3041,15 @@@ void ED_view3d_draw_offscreen(Scene *sc
  	}
  	else {
  		glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ 		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);		
  	}
  
- 	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  
  	/* setup view matrices */
 -	view3d_main_area_setup_view(scene, v3d, ar, viewmat, winmat);
 -
 +	if ((viewname != NULL) && (viewmat == NULL))
 +		view3d_stereo3d_setup_offscreen(scene, v3d, ar, winmat, viewname);
 +	else
 +		view3d_main_area_setup_view(scene, v3d, ar, viewmat, winmat);
  
  	/* main drawing call */
  	view3d_draw_objects(NULL, scene, v3d, ar, NULL, do_bgpic, true);
@@@ -3236,275 -3374,6 +3406,104 @@@ static void view3d_main_area_draw_engin
  	ED_region_info_draw(ar, rv3d->render_engine->text, 1, fill_color);
  }
  
- /*
-  * Function to clear the view
-  */
- static void view3d_main_area_clear(Scene *scene, View3D *v3d, ARegion *ar)
- {
- 	/* clear background */
- 	if (scene->world && (v3d->flag2 & V3D_RENDER_OVERRIDE)) {  /* clear with solid color */
- 		if (scene->world->skytype & WO_SKYBLEND) {  /* blend sky */
- 			int x, y;
- 			float col_hor[3];
- 			float col_zen[3];
- 
- #define VIEWGRAD_RES_X 16
- #define VIEWGRAD_RES_Y 16
- 
- 			GLubyte grid_col[VIEWGRAD_RES_X][VIEWGRAD_RES_Y][4];
- 			static float   grid_pos[VIEWGRAD_RES_X][VIEWGRAD_RES_Y][3];
- 			static GLushort indices[VIEWGRAD_RES_X - 1][VIEWGRAD_RES_X - 1][4];
- 			static bool buf_calculated = false;
- 
- 			IMB_colormanagement_pixel_to_display_space_v3(col_hor, &scene->world->horr, &scene->view_settings,
- 			                                              &scene->display_settings);
- 			IMB_colormanagement_pixel_to_display_space_v3(col_zen, &scene->world->zenr, &scene->view_settings,
- 			                                              &scene->display_settings);
- 
- 			glMatrixMode(GL_PROJECTION);
- 			glPushMatrix();
- 			glLoadIdentity();
- 			glMatrixMode(GL_MODELVIEW);
- 			glPushMatrix();
- 			glLoadIdentity();
- 
- 			glShadeModel(GL_SMOOTH);
- 
- 			/* calculate buffers the first time only */
- 			if (!buf_calculated) {
- 				for (x = 0; x < VIEWGRAD_RES_X; x++) {
- 					for (y = 0; y < VIEWGRAD_RES_Y; y++) {
- 						const float xf = (float)x / (float)(VIEWGRAD_RES_X - 1);
- 						const float yf = (float)y / (float)(VIEWGRAD_RES_Y - 1);
- 
- 						/* -1..1 range */
- 						grid_pos[x][y][0] = (xf - 0.5f) * 2.0f;
- 						grid_pos[x][y][1] = (yf - 0.5f) * 2.0f;
- 						grid_pos[x][y][2] = 1.0;
- 					}
- 				}
- 
- 				for (x = 0; x < VIEWGRAD_RES_X - 1; x++) {
- 					for (y = 0; y < VIEWGRAD_RES_Y - 1; y++) {
- 						indices[x][y][0] = x * VIEWGRAD_RES_X + y;
- 						indices[x][y][1] = x * VIEWGRAD_RES_X + y + 1;
- 						indices[x][y][2] = (x + 1) * VIEWGRAD_RES_X + y + 1;
- 						indices[x][y][3] = (x + 1) * VIEWGRAD_RES_X + y;
- 					}
- 				}
- 
- 				buf_calculated = true;
- 			}
- 
- 			for (x = 0; x < VIEWGRAD_RES_X; x++) {
- 				for (y = 0; y < VIEWGRAD_RES_Y; y++) {
- 					const float xf = (float)x / (float)(VIEWGRAD_RES_X - 1);
- 					const float yf = (float)y / (float)(VIEWGRAD_RES_Y - 1);
- 					const float mval[2] = {xf * (float)ar->winx, yf * ar->winy};
- 					const float z_up[3] = {0.0f, 0.0f, 1.0f};
- 					float out[3];
- 					GLubyte *col_ub = grid_col[x][y];
- 
- 					float col_fac;
- 					float col_fl[3];
- 
- 					ED_view3d_win_to_vector(ar, mval, out);
- 
- 					if (scene->world->skytype & WO_SKYPAPER) {
- 						if (scene->world->skytype & WO_SKYREAL) {
- 							col_fac = fabsf(((float)y / (float)VIEWGRAD_RES_Y) - 0.5f) * 2.0f;
- 						}
- 						else {
- 							col_fac = (float)y / (float)VIEWGRAD_RES_Y;
- 						}
- 					}
- 					else {
- 						if (scene->world->skytype & WO_SKYREAL) {
- 							col_fac = fabsf((angle_normalized_v3v3(z_up, out) / (float)M_PI) - 0.5f) * 2.0f;
- 						}
- 						else {
- 							col_fac = 1.0f - (angle_normalized_v3v3(z_up, out) / (float)M_PI);
- 						}
- 					}
- 
- 					interp_v3_v3v3(col_fl, col_hor, col_zen, col_fac);
- 
- 					rgb_float_to_uchar(col_ub, col_fl);
- 					col_ub[3] = 0;
- 				}
- 			}
- 
- 			glEnable(GL_DEPTH_TEST);
- 			glDepthFunc(GL_ALWAYS);
- 
- 			glEnableClientState(GL_VERTEX_ARRAY);
- 			glEnableClientState(GL_COLOR_ARRAY);
- 			glVertexPointer(3, GL_FLOAT, 0, grid_pos);
- 			glColorPointer(4, GL_UNSIGNED_BYTE, 0, grid_col);
- 
- 			glDrawElements(GL_QUADS, (VIEWGRAD_RES_X - 1) * (VIEWGRAD_RES_Y - 1) * 4, GL_UNSIGNED_SHORT, indices);
- 
- 			glDisableClientState(GL_VERTEX_ARRAY);
- 			glDisableClientState(GL_COLOR_ARRAY);
- 
- 			glDepthFunc(GL_LEQUAL);
- 			glDisable(GL_DEPTH_TEST);
- 
- 			glMatrixMode(GL_PROJECTION);
- 			glPopMatrix();
- 			glMatrixMode(GL_MODELVIEW);
- 			glPopMatrix();
- 
- 			glShadeModel(GL_FLAT);
- 
- #undef VIEWGRAD_RES_X
- #undef VIEWGRAD_RES_Y
- 		}
- 		else {  /* solid sky */
- 			float col_hor[3];
- 			IMB_colormanagement_pixel_to_display_space_v3(col_hor, &scene->world->horr, &scene->view_settings,
- 			                                              &scene->display_settings);
- 
- 			glClearColor(col_hor[0], col_hor[1], col_hor[2], 0.0f);
- 			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- 		}
- 	}
- 	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);
- 			glShadeModel(GL_SMOOTH);
- 			glBegin(GL_QUADS);
- 			UI_ThemeColor(TH_LOW_GRAD);
- 			glVertex3f(-1.0, -1.0, 1.0);
- 			glVertex3f(1.0, -1.0, 1.0);
- 			UI_ThemeColor(TH_HIGH_GRAD);
- 			glVertex3f(1.0, 1.0, 1.0);
- 			glVertex3f(-1.0, 1.0, 1.0);
- 			glEnd();
- 			glShadeModel(GL_FLAT);
- 
- 			glDepthFunc(GL_LEQUAL);
- 			glDisable(GL_DEPTH_TEST);
- 
- 			glMatrixMode(GL_PROJECTION);
- 			glPopMatrix();
- 
- 			glMatrixMode(GL_MODELVIEW);
- 			glPopMatrix();
- 		}
- 		else {
- 			UI_ThemeClearColor(TH_HIGH_GRAD);
- 			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- 		}
- 	}
- }
- 
 +static bool view3d_stereo3d_active(const bContext *C, Scene *scene, View3D *v3d, RegionView3D *rv3d)
 +{
 +	wmWindow *win = CTX_wm_window(C);
 +
 +	if ((scene->r.scemode & R_MULTIVIEW) == 0)
 +		return false;
 +
 +	if (WM_stereo_enabled(C, win, true) == false)
 +		return false;
 +	
 +	if ((v3d->camera == NULL) || rv3d->persp != RV3D_CAMOB)
 +		return false;
 +
 +	if (scene->r.views_setup & SCE_VIEWS_SETUP_MULTIVIEW) {
 +		if (v3d->stereo3d_camera == STEREO_MONO_ID)
 +			return false;
 +
 +		return BKE_scene_is_stereo3d(&scene->r);
 +	}
 +
 +	return true;
 +}
 +
 +/* setup the view and win matrices for the multiview cameras
 + *
 + * unlike view3d_stereo3d_setup_offscreen, when view3d_stereo3d_setup is called
 + * we have no winmatrix (i.e., projection matrix) defined at that time.
 + * Since the camera and the camera shift are needed for the winmat calculation
 + * we do a small hack to replace it temporarily so we don't need to change the
 + * view3d)main_area_setup_view() code to account for that.
 + */
 +static void view3d_stereo3d_setup(Scene *scene, View3D *v3d, ARegion *ar)
 +{
 +	bool is_left;
 +	const char *names[2] = {STEREO_LEFT_NAME, STEREO_RIGHT_NAME};
 +	const char *viewname;
 +
 +	/* show only left or right camera */
 +	if (v3d->stereo3d_camera != STEREO_3D_ID)
 +		v3d->eye = v3d->stereo3d_camera;
 +
 +	is_left = v3d->eye == STEREO_LEFT_ID;
 +	viewname = names[is_left ? STEREO_LEFT_ID : STEREO_RIGHT_ID];
 +
 +	/* update the viewport matrices with the new camera */
 +	if (scene->r.views_setup == SCE_VIEWS_SETUP_STEREO_3D) {
 +		Camera *data;
 +		float viewmat[4][4];
 +		float shiftx;
 +
 +		data = (Camera *)v3d->camera->data;
 +		shiftx = data->shiftx;
 +
 +		BLI_lock_thread(LOCK_VIEW3D);
 +		data->shiftx = BKE_camera_shift_x(&scene->r, v3d->camera, viewname);
 +
 +		BKE_camera_view_matrix(&scene->r, v3d->camera, is_left, viewmat);
 +		view3d_main_area_setup_view(scene, v3d, ar, viewmat, NULL);
 +
 +		data->shiftx = shiftx;
 +		BLI_unlock_thread(LOCK_VIEW3D);
 +	}
 +	else { /* SCE_VIEWS_SETUP_MULTIVIEW */
 +		float viewmat[4][4];
 +		Object *view_ob = v3d->camera;
 +		Object *camera = BKE_camera_render(scene, v3d->camera, viewname);
 +
 +		BLI_lock_thread(LOCK_VIEW3D);
 +		v3d->camera = camera;
 +
 +		BKE_camera_view_matrix(&scene->r, camera, false, viewmat);
 +		view3d_main_area_setup_view(scene, v3d, ar, viewmat, NULL);
 +
 +		v3d->camera = view_ob;
 +		BLI_unlock_thread(LOCK_VIEW3D);
 +	}
 +}
 +
 +static void view3d_stereo3d_setup_offscreen(Scene *scene, View3D *v3d, ARegion *ar,
 +                                            float winmat[4][4], const char *viewname)
 +{
 +	/* update the viewport matrices with the new camera */
 +	if (scene->r.views_setup == SCE_VIEWS_SETUP_STEREO_3D) {
 +		float viewmat[4][4];
 +		const bool is_left = STREQ(viewname, STEREO_LEFT_NAME);
 +
 +		BKE_camera_view_matrix(&scene->r, v3d->camera, is_left, viewmat);
 +		view3d_main_area_setup_view(scene, v3d, ar, viewmat, winmat);
 +	}
 +	else { /* SCE_VIEWS_SETUP_MULTIVIEW */
 +		float viewmat[4][4];
 +		Object *camera = BKE_camera_render(scene, v3d->camera, viewname);
 +
 +		BKE_camera_view_matrix(&scene->r, camera, false, viewmat);
 +		view3d_main_area_setup_view(scene, v3d, ar, viewmat, winmat);
 +	}
 +}
 +
  #ifdef WITH_GAMEENGINE
  static void update_lods(Scene *scene, float camera_pos[3])
  {
diff --cc source/blender/makesdna/DNA_space_types.h
index 3a5ccc0,dd661d0..cea37a1
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@@ -501,9 -503,6 +503,9 @@@ typedef struct SpaceSeq 
  	struct bGPdata *gpd;        /* grease-pencil data */
  
  	struct SequencerScopes scopes;  /* different scoped displayed in space */
 +
 +	char eye;				/* multiview current eye - for internal use */
- 	char pad[7];
++	char pad2[7];
  } SpaceSeq;




More information about the Bf-blender-cvs mailing list