r3984 - trunk/misc

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Wed Jul 30 13:23:11 EDT 2008


Author: div0
Date: 2008-07-30 13:23:11 -0400 (Wed, 30 Jul 2008)
New Revision: 3984

Modified:
   trunk/misc/autoshader.sh
   trunk/misc/brightspot.c
Log:
fix brightspot tool, support it in autoshader


Modified: trunk/misc/autoshader.sh
===================================================================
--- trunk/misc/autoshader.sh	2008-07-30 16:39:25 UTC (rev 3983)
+++ trunk/misc/autoshader.sh	2008-07-30 17:23:11 UTC (rev 3984)
@@ -5,6 +5,15 @@
 	exit 1
 fi
 
+case "$0" in
+	*/*)
+		mydir=${0%/*}
+		;;
+	*)
+		mydir=.
+		;;
+esac
+
 makeshader()
 {
 	s=`texnormalize "$1"`
@@ -39,6 +48,15 @@
 makeskyshader()
 {
 	s=`texnormalize "$1"`
+	coords=`sh "$mydir/brightspot.sh" "$s"`
+	case "$coords" in
+		*\ *)
+			;;
+		*)
+			coords="-42 -42"
+			echo >&2 "NOTE: brightspot tool did not work"
+			;;
+	esac
 	s=${s%_up}
 	s=${s#env/}
 	dir=${s%%/*}
@@ -53,7 +71,7 @@
 	surfaceparm nolightmap
 	surfaceparm sky
 	surfaceparm nomarks
-	q3map_sunExt .5 .5 .7 42 90 2 16 // red green blue intensity degrees elevation deviance samples
+	q3map_sunExt .5 .5 .7 $coords 2 16 // red green blue intensity degrees elevation deviance samples
 	q3map_surfacelight 150 // intensity
 	skyparms env/$s - -
 }

Modified: trunk/misc/brightspot.c
===================================================================
--- trunk/misc/brightspot.c	2008-07-30 16:39:25 UTC (rev 3983)
+++ trunk/misc/brightspot.c	2008-07-30 17:23:11 UTC (rev 3984)
@@ -18,6 +18,41 @@
 	false, false,  true  // "dn"
 };
 
+static const double skyboxtexcoord2f[6*4*2] =
+{
+    // skyside[0]
+    0, 1,
+    1, 1,
+    1, 0,
+    0, 0,
+    // skyside[1]
+    1, 0,
+    0, 0,
+    0, 1,
+    1, 1,
+    // skyside[2]
+    1, 1,
+    1, 0,
+    0, 0,
+    0, 1,
+    // skyside[3]
+    0, 0,
+    0, 1,
+    1, 1,
+    1, 0,
+    // skyside[4]
+    0, 1,
+    1, 1,
+    1, 0,
+    0, 0,
+    // skyside[5]
+    0, 1,
+    1, 1,
+    1, 0,
+    0, 0
+};
+
+
 static const double skyboxvertex3f[6*4*3] =
 {
         // skyside[0]
@@ -52,12 +87,43 @@
          16,  16, -16
 };
 
-void MapCoord(int pic, int x, int y, double vec[3])
+void Unmap2f(double x, double y, const double *corners, double *u, double *v)
 {
+	// x - corners[0] == *u * (corners[2] - corners[0]) + *v * (corners[4] - corners[2]);
+	// y - corners[1] == *u * (corners[3] - corners[1]) + *v * (corners[5] - corners[3]);
+	
+	double xc0 = x - corners[0];
+	double yc1 = y - corners[1];
+	double c20 = corners[2] - corners[0];
+	double c31 = corners[3] - corners[1];
+	double c42 = corners[4] - corners[2];
+	double c53 = corners[5] - corners[3];
+
+	// xc0 == *u * c20 + *v * c42;
+	// yc1 == *u * c31 + *v * c53;
+
+	double det = c20 * c53 - c31 * c42;
+	double du = xc0 * c53 - yc1 * c42;
+	double dv = c20 * yc1 - c31 * xc0;
+
+	*u = du / det;
+	*v = dv / det;
+}
+
+void Map3f(double u, double v, const double *corners, double *x, double *y, double *z)
+{
+	*x = corners[0] + u * (corners[3] - corners[0]) + v * (corners[6] - corners[3]);
+	*y = corners[1] + u * (corners[4] - corners[1]) + v * (corners[7] - corners[4]);
+	*z = corners[2] + u * (corners[5] - corners[2]) + v * (corners[8] - corners[5]);
+}
+
+void MapCoord(int pic, int y, int x, double vec[3])
+{
 	int h;
 	int flipx = flip[3*pic+0];
 	int flipy = flip[3*pic+1];
 	int flipdiag = flip[3*pic+2];
+	double u, v;
 
 	double a[3] = { skyboxvertex3f[pic*4*3+0*3+0], skyboxvertex3f[pic*4*3+0*3+1], skyboxvertex3f[pic*4*3+0*3+2] };
 	double b[3] = { skyboxvertex3f[pic*4*3+1*3+0], skyboxvertex3f[pic*4*3+1*3+1], skyboxvertex3f[pic*4*3+1*3+2] };
@@ -65,23 +131,18 @@
 	//double d[3] = { skyboxvertex3f[pic*4*3+3*3+0], skyboxvertex3f[pic*4*3+3*3+1], skyboxvertex3f[pic*4*3+3*3+2] };
 
 	if(flipx)
-	{
 		x = 511 - x;
-	}
 
 	if(flipy)
-	{
 		y = 511 - y;
-	}
 
 	if(flipdiag)
 	{
 		h = x; x = y; y = h;
 	}
 
-	vec[0] = a[0] + (b[0] - a[0]) * (x + 0.5) / 512.0 + (c[0] - b[0]) * (y + 0.5) / 512.0;
-	vec[1] = a[1] + (b[1] - a[1]) * (x + 0.5) / 512.0 + (c[1] - b[1]) * (y + 0.5) / 512.0;
-	vec[2] = a[2] + (b[2] - a[2]) * (x + 0.5) / 512.0 + (c[2] - b[2]) * (y + 0.5) / 512.0;
+	Unmap2f((x + 0.5) / 512.0, (y + 0.5) / 512.0, skyboxtexcoord2f + 4*2*pic, &u, &v);
+	Map3f(u, v, skyboxvertex3f + 6*2*pic, &vec[0], &vec[1], &vec[2]);
 }
 
 int main(int argc, char **argv)
@@ -114,13 +175,14 @@
 			{
 				double vec[3], f;
 				MapCoord(i, j, k, vec);
-				f = exp(10 * (picture[i][j][k] - 255)) / sqrt(vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2]);
+				f = pow(vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2], -1.5); // I know what I am doing.
+				f *= exp(10 * (picture[i][j][k] - 255));
 				brightvec[0] += f * vec[0];
 				brightvec[1] += f * vec[1];
 				brightvec[2] += f * vec[2];
 			}
 	
-	pitch = -atan2(brightvec[2], sqrt(brightvec[0]*brightvec[0] + brightvec[1]*brightvec[1]));
+	pitch = atan2(brightvec[2], sqrt(brightvec[0]*brightvec[0] + brightvec[1]*brightvec[1]));
 	yaw = atan2(brightvec[1], brightvec[0]);
 
 	printf("%f %f\n", yaw * 180 / M_PI, pitch * 180 / M_PI);




More information about the nexuiz-commits mailing list