merge with/from trunk at r35190
[blender.git] / source / blender / editors / space_view3d / view3d_view.c
index 36485b9e20e7f5fd4eaadb4808d83fd817cd8904..794088de20c401781ad9a994170b51de71858bfb 100644 (file)
@@ -710,11 +710,12 @@ void view3d_unproject(bglMats *mats, float out[3], const short x, const short y,
        out[2] = uz;
 }
 
-/* use above call to get projecting mat */
+/* use view3d_get_object_project_mat to get projecting mat */
 void view3d_project_float(ARegion *ar, float *vec, float *adr, float mat[4][4])
 {
        float vec4[4];
        
+       VECCOPY(vec4, vec);
        adr[0]= IS_CLIPPED;
        copy_v3_v3(vec4, vec);
        vec4[3]= 1.0;
@@ -729,6 +730,26 @@ void view3d_project_float(ARegion *ar, float *vec, float *adr, float mat[4][4])
        }
 }
 
+/* use view3d_get_object_project_mat to get projecting mat */
+void 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 boundbox_clip(RegionView3D *rv3d, float obmat[][4], BoundBox *bb)
 {
        /* return 1: draw */