r3982 - trunk/misc
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Wed Jul 30 12:05:51 EDT 2008
Author: div0
Date: 2008-07-30 12:05:50 -0400 (Wed, 30 Jul 2008)
New Revision: 3982
Added:
trunk/misc/brightspot.c
Log:
start of a bright spot finder for skyboxes
Added: trunk/misc/brightspot.c
===================================================================
--- trunk/misc/brightspot.c (rev 0)
+++ trunk/misc/brightspot.c 2008-07-30 16:05:50 UTC (rev 3982)
@@ -0,0 +1,140 @@
+#include <stdio.h>
+#include <math.h>
+
+// USAGE:
+// for X in *.tga; do convert "$X" -geometry 512x512 -depth 8 GRAY:-; done > /tmp/foo
+// brightspot /tmp/foo
+// It should output the right parameters for the sun direction in q3map2's format.
+// But probably is broken.
+
+#define false 0
+#define true 1
+
+int sides_alphabet[6] =
+{
+ 2, // bk
+ 5, // dn
+ 3, // ft
+ 1, // lf
+ 0, // rt
+ 4 // up
+};
+
+int flip[6*3] =
+{
+ false, false, true, // "rt"
+ true, true, true, // "lf"
+ false, true, false, // "bk"
+ true, false, false, // "ft"
+ false, false, true, // "up"
+ false, false, true // "dn"
+};
+
+static const double skyboxvertex3f[6*4*3] =
+{
+ // skyside[0]
+ 16, -16, 16,
+ 16, -16, -16,
+ 16, 16, -16,
+ 16, 16, 16,
+ // skyside[1]
+ -16, 16, 16,
+ -16, 16, -16,
+ -16, -16, -16,
+ -16, -16, 16,
+ // skyside[2]
+ 16, 16, 16,
+ 16, 16, -16,
+ -16, 16, -16,
+ -16, 16, 16,
+ // skyside[3]
+ -16, -16, 16,
+ -16, -16, -16,
+ 16, -16, -16,
+ 16, -16, 16,
+ // skyside[4]
+ -16, -16, 16,
+ 16, -16, 16,
+ 16, 16, 16,
+ -16, 16, 16,
+ // skyside[5]
+ 16, -16, -16,
+ -16, -16, -16,
+ -16, 16, -16,
+ 16, 16, -16
+};
+
+void MapCoord(int pic, int x, int y, double vec[3])
+{
+ int h;
+ int flipx = flip[3*pic+0];
+ int flipy = flip[3*pic+1];
+ int flipdiag = flip[3*pic+2];
+
+ 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] };
+ double c[3] = { skyboxvertex3f[pic*4*3+2*3+0], skyboxvertex3f[pic*4*3+2*3+1], skyboxvertex3f[pic*4*3+2*3+2] };
+ //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;
+}
+
+int main(int argc, char **argv)
+{
+ FILE *f;
+ int i, j, k;
+ unsigned char picture[6][512][512];
+ double brightvec[3];
+ double pitch, yaw;
+
+ if(argc != 2)
+ {
+ fprintf(stderr, "Usage: %s imagefile.gray\n", *argv);
+ return 1;
+ }
+
+ f = fopen(argv[1], "rb");
+ if(!f)
+ {
+ perror("fopen");
+ return 1;
+ }
+ fread(&picture, sizeof(picture), 1, f);
+ fclose(f);
+
+ brightvec[0] = brightvec[1] = brightvec[2] = 0;
+ for(i = 0; i < 6; ++i)
+ for(j = 0; j < 512; ++j)
+ for(k = 0; k < 512; ++k)
+ {
+ 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]);
+ 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]));
+ yaw = atan2(brightvec[1], brightvec[0]);
+
+ printf("%f %f\n", yaw * 180 / M_PI, pitch * 180 / M_PI);
+ return 0;
+}
More information about the nexuiz-commits
mailing list