svn merge -r39831:39877 https://svn.blender.org/svnroot/bf-blender/trunk/blender
[blender.git] / source / blender / editors / space_view3d / view3d_view.c
index 44ae6837aa2ab7c8f3cd9f4b75e986a5c6f916e8..cd99546d3f76a4e69d8387ac079f2bd7b9d50996 100644 (file)
@@ -698,7 +698,6 @@ void ED_view3d_ob_project_mat_get(RegionView3D *rv3d, Object *ob, float pmat[4][
        mul_m4_m4m4(pmat, vmat, rv3d->winmat);
 }
 
-#if 0
 /* Uses window coordinates (x,y) and depth component z to find a point in
    modelspace */
 void view3d_unproject(bglMats *mats, float out[3], const short x, const short y, const float z)
@@ -711,13 +710,13 @@ void view3d_unproject(bglMats *mats, float out[3], const short x, const short y,
        out[1] = uy;
        out[2] = uz;
 }
-#endif
 
-/* use above call to get projecting mat */
+/* use view3d_get_object_project_mat to get projecting mat */
 void ED_view3d_project_float(ARegion *ar, const float vec[3], float adr[2], float mat[4][4])
 {
        float vec4[4];
        
+       VECCOPY(vec4, vec);
        adr[0]= IS_CLIPPED;
        copy_v3_v3(vec4, vec);
        vec4[3]= 1.0;
@@ -732,6 +731,26 @@ void ED_view3d_project_float(ARegion *ar, const float vec[3], float adr[2], floa
        }
 }
 
+/* use view3d_get_object_project_mat to get projecting mat */
+void ED_view3d_project_float_v3(ARegion *ar, float *vec, float *adr, float mat[4][4])
+{
+       float vec4[4];
+       
+       VECCOPY(vec4, vec);
+       adr[0]= IS_CLIPPED;
+       vec4[3]= 1.0;
+       
+       mul_m4_v4(mat, vec4);
+       
+       if( vec4[3]>FLT_EPSILON ) {
+               adr[0] = (float)(ar->winx/2.0f)+(ar->winx/2.0f)*vec4[0]/vec4[3];        
+               adr[1] = (float)(ar->winy/2.0f)+(ar->winy/2.0f)*vec4[1]/vec4[3];
+               adr[2] = vec4[2]/vec4[3];
+       } else {
+               adr[0] = adr[1] = adr[2] = 0.0f;
+       }
+}
+
 int ED_view3d_boundbox_clip(RegionView3D *rv3d, float obmat[][4], BoundBox *bb)
 {
        /* return 1: draw */
@@ -1791,7 +1810,7 @@ static int game_engine_exec(bContext *C, wmOperator *op)
 
        if(rv3d->persp==RV3D_CAMOB && startscene->gm.framing.type == SCE_GAMEFRAMING_BARS && startscene->gm.stereoflag != STEREO_DOME) { /* Letterbox */
                rctf cam_framef;
-               ED_view3d_calc_camera_border(startscene, ar, CTX_wm_view3d(C), rv3d, &cam_framef, FALSE);
+               ED_view3d_calc_camera_border(startscene, ar, rv3d, CTX_wm_view3d(C), &cam_framef, FALSE);
                cam_frame.xmin = cam_framef.xmin + ar->winrct.xmin;
                cam_frame.xmax = cam_framef.xmax + ar->winrct.xmin;
                cam_frame.ymin = cam_framef.ymin + ar->winrct.ymin;