[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29479] trunk/blender/source/blender: scale option was only working for panoramic cameras

Campbell Barton ideasman42 at gmail.com
Tue Jun 15 23:46:02 CEST 2010


Revision: 29479
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29479
Author:   campbellbarton
Date:     2010-06-15 23:46:02 +0200 (Tue, 15 Jun 2010)

Log Message:
-----------
scale option was only working for panoramic cameras

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_uvproject.h
    trunk/blender/source/blender/blenlib/intern/uvproject.c
    trunk/blender/source/blender/modifiers/intern/MOD_uvproject.c

Modified: trunk/blender/source/blender/blenlib/BLI_uvproject.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_uvproject.h	2010-06-15 21:39:17 UTC (rev 29478)
+++ trunk/blender/source/blender/blenlib/BLI_uvproject.h	2010-06-15 21:46:02 UTC (rev 29479)
@@ -37,4 +37,7 @@
 /* apply ortho uv's */
 void project_from_view_ortho(float target[2], float source[3], float rotmat[4][4]);
 
+/* so we can adjust scale with keeping the struct private */
+void project_camera_info_scale(struct UvCameraInfo *uci, float scale_x, float scale_y);
+
 #endif

Modified: trunk/blender/source/blender/blenlib/intern/uvproject.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/uvproject.c	2010-06-15 21:39:17 UTC (rev 29478)
+++ trunk/blender/source/blender/blenlib/intern/uvproject.c	2010-06-15 21:46:02 UTC (rev 29479)
@@ -182,3 +182,10 @@
 	target[0] = -pv[0];
 	target[1] = pv[2];
 }
+
+
+void project_camera_info_scale(UvCameraInfo *uci, float scale_x, float scale_y)
+{
+	uci->xasp *= scale_x;
+	uci->yasp *= scale_y;
+}

Modified: trunk/blender/source/blender/modifiers/intern/MOD_uvproject.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_uvproject.c	2010-06-15 21:39:17 UTC (rev 29478)
+++ trunk/blender/source/blender/modifiers/intern/MOD_uvproject.c	2010-06-15 21:46:02 UTC (rev 29479)
@@ -176,51 +176,42 @@
 		projectors[i].uci= NULL;
 
 		if(projectors[i].ob->type == OB_CAMERA) {
+			
 			cam = (Camera *)projectors[i].ob->data;
-
 			if(cam->flag & CAM_PANORAMA) {
 				projectors[i].uci= project_camera_info(projectors[i].ob, NULL, aspx, aspy);
+				project_camera_info_scale(projectors[i].uci, scax, scay);
 				free_uci= 1;
 			}
-			else if(cam->type == CAM_PERSP) {
-				float perspmat[4][4];
-				float xmax; 
-				float xmin;
-				float ymax;
-				float ymin;
-				float pixsize = cam->clipsta * 32.0 / cam->lens;
+			else {
+				float scale= (cam->type == CAM_PERSP) ? cam->clipsta * 32.0 / cam->lens : cam->ortho_scale;
+				float xmax, xmin, ymax, ymin;
 
 				if(aspect > 1.0f) {
-					xmax = 0.5f * pixsize;
+					xmax = 0.5f * scale;
 					ymax = xmax / aspect;
 				} else {
-					ymax = 0.5f * pixsize;
-					xmax = ymax * aspect; 
+					ymax = 0.5f * scale;
+					xmax = ymax * aspect;
 				}
 				xmin = -xmax;
 				ymin = -ymax;
 
-				perspective_m4( perspmat,xmin, xmax, ymin, ymax, cam->clipsta, cam->clipend);
-				mul_m4_m4m4(tmpmat, projectors[i].projmat, perspmat);
-			} else if(cam->type == CAM_ORTHO) {
-				float orthomat[4][4];
-				float xmax; 
-				float xmin;
-				float ymax;
-				float ymin;
+				/* scale the matrix */
+				xmin *= scax;
+				xmax *= scax;
+				ymin *= scay;
+				ymax *= scay;
 
-				if(aspect > 1.0f) {
-					xmax = 0.5f * cam->ortho_scale; 
-					ymax = xmax / aspect;
-				} else {
-					ymax = 0.5f * cam->ortho_scale;
-					xmax = ymax * aspect; 
+				if(cam->type == CAM_PERSP) {
+					float perspmat[4][4];
+					perspective_m4( perspmat,xmin, xmax, ymin, ymax, cam->clipsta, cam->clipend);
+					mul_m4_m4m4(tmpmat, projectors[i].projmat, perspmat);
+				} else { /* if(cam->type == CAM_ORTHO) */
+					float orthomat[4][4];
+					orthographic_m4( orthomat,xmin, xmax, ymin, ymax, cam->clipsta, cam->clipend);
+					mul_m4_m4m4(tmpmat, projectors[i].projmat, orthomat);
 				}
-				xmin = -xmax;
-				ymin = -ymax;
-
-				orthographic_m4( orthomat,xmin, xmax, ymin, ymax, cam->clipsta, cam->clipend);
-				mul_m4_m4m4(tmpmat, projectors[i].projmat, orthomat);
 			}
 		} else {
 			copy_m4_m4(tmpmat, projectors[i].projmat);
@@ -278,42 +269,26 @@
 	/* apply coords as UVs, and apply image if tfaces are new */
 	for(i = 0, mf = mface; i < numFaces; ++i, ++mf, ++tface) {
 		if(override_image || !image || tface->tpage == image) {
-				if(num_projectors == 1) {
-					if(projectors[0].uci) {
-						project_from_camera(tface->uv[0], coords[mf->v1], projectors[0].uci);
-						project_from_camera(tface->uv[1], coords[mf->v2], projectors[0].uci);
-						project_from_camera(tface->uv[2], coords[mf->v3], projectors[0].uci);
-						if(mf->v3)
-							project_from_camera(tface->uv[3], coords[mf->v4], projectors[0].uci);
-						
-						if(scax != 1.0f) {
-							tface->uv[0][0] = ((tface->uv[0][0] - 0.5f) * scax) + 0.5f;
-							tface->uv[1][0] = ((tface->uv[1][0] - 0.5f) * scax) + 0.5f;
-							tface->uv[2][0] = ((tface->uv[2][0] - 0.5f) * scax) + 0.5f;
-							if(mf->v3)
-								tface->uv[3][0] = ((tface->uv[3][0] - 0.5f) * scax) + 0.5f;
-						}
-						
-						if(scay != 1.0f) {
-							tface->uv[0][1] = ((tface->uv[0][1] - 0.5f) * scay) + 0.5f;
-							tface->uv[1][1] = ((tface->uv[1][1] - 0.5f) * scay) + 0.5f;
-							tface->uv[2][1] = ((tface->uv[2][1] - 0.5f) * scay) + 0.5f;
-							if(mf->v3)
-								tface->uv[3][1] = ((tface->uv[3][1] - 0.5f) * scay) + 0.5f;
-						}
+			if(num_projectors == 1) {
+				if(projectors[0].uci) {
+					project_from_camera(tface->uv[0], coords[mf->v1], projectors[0].uci);
+					project_from_camera(tface->uv[1], coords[mf->v2], projectors[0].uci);
+					project_from_camera(tface->uv[2], coords[mf->v3], projectors[0].uci);
+					if(mf->v3)
+						project_from_camera(tface->uv[3], coords[mf->v4], projectors[0].uci);
+				}
+				else {
+					/* apply transformed coords as UVs */
+					tface->uv[0][0] = coords[mf->v1][0];
+					tface->uv[0][1] = coords[mf->v1][1];
+					tface->uv[1][0] = coords[mf->v2][0];
+					tface->uv[1][1] = coords[mf->v2][1];
+					tface->uv[2][0] = coords[mf->v3][0];
+					tface->uv[2][1] = coords[mf->v3][1];
+					if(mf->v4) {
+						tface->uv[3][0] = coords[mf->v4][0];
+						tface->uv[3][1] = coords[mf->v4][1];
 					}
-					else {
-						/* apply transformed coords as UVs */
-						tface->uv[0][0] = coords[mf->v1][0];
-						tface->uv[0][1] = coords[mf->v1][1];
-						tface->uv[1][0] = coords[mf->v2][0];
-						tface->uv[1][1] = coords[mf->v2][1];
-						tface->uv[2][0] = coords[mf->v3][0];
-						tface->uv[2][1] = coords[mf->v3][1];
-						if(mf->v4) {
-							tface->uv[3][0] = coords[mf->v4][0];
-							tface->uv[3][1] = coords[mf->v4][1];
-						}
 				}
 			} else {
 				/* multiple projectors, select the closest to face normal
@@ -351,7 +326,7 @@
 						best_projector = &projectors[j];
 					}
 				}
-				
+
 				if(best_projector->uci) {
 					project_from_camera(tface->uv[0], coords[mf->v1], best_projector->uci);
 					project_from_camera(tface->uv[1], coords[mf->v2], best_projector->uci);





More information about the Bf-blender-cvs mailing list