]> icculus.org git repositories - divverent/nexuiz.git/blob - misc/brightspot.c
start of a bright spot finder for skyboxes
[divverent/nexuiz.git] / misc / brightspot.c
1 #include <stdio.h>
2 #include <math.h>
3
4 // USAGE:
5 //   for X in *.tga; do convert "$X" -geometry 512x512 -depth 8 GRAY:-; done > /tmp/foo
6 //   brightspot /tmp/foo
7 // It should output the right parameters for the sun direction in q3map2's format.
8 // But probably is broken.
9
10 #define false 0
11 #define true 1
12
13 int sides_alphabet[6] =
14 {
15         2, // bk
16         5, // dn
17         3, // ft
18         1, // lf
19         0, // rt
20         4  // up
21 };
22
23 int flip[6*3] =
24 {
25         false, false,  true, // "rt"
26          true,  true,  true, // "lf"
27         false,  true, false, // "bk"
28          true, false, false, // "ft"
29         false, false,  true, // "up"
30         false, false,  true  // "dn"
31 };
32
33 static const double skyboxvertex3f[6*4*3] =
34 {
35         // skyside[0]
36          16, -16,  16,
37          16, -16, -16,
38          16,  16, -16,
39          16,  16,  16,
40         // skyside[1]
41         -16,  16,  16,
42         -16,  16, -16,
43         -16, -16, -16,
44         -16, -16,  16,
45         // skyside[2]
46          16,  16,  16,
47          16,  16, -16,
48         -16,  16, -16,
49         -16,  16,  16,
50         // skyside[3]
51         -16, -16,  16,
52         -16, -16, -16,
53          16, -16, -16,
54          16, -16,  16,
55         // skyside[4]
56         -16, -16,  16,
57          16, -16,  16,
58          16,  16,  16,
59         -16,  16,  16,
60         // skyside[5]
61          16, -16, -16,
62         -16, -16, -16,
63         -16,  16, -16,
64          16,  16, -16
65 };
66
67 void MapCoord(int pic, int x, int y, double vec[3])
68 {
69         int h;
70         int flipx = flip[3*pic+0];
71         int flipy = flip[3*pic+1];
72         int flipdiag = flip[3*pic+2];
73
74         double a[3] = { skyboxvertex3f[pic*4*3+0*3+0], skyboxvertex3f[pic*4*3+0*3+1], skyboxvertex3f[pic*4*3+0*3+2] };
75         double b[3] = { skyboxvertex3f[pic*4*3+1*3+0], skyboxvertex3f[pic*4*3+1*3+1], skyboxvertex3f[pic*4*3+1*3+2] };
76         double c[3] = { skyboxvertex3f[pic*4*3+2*3+0], skyboxvertex3f[pic*4*3+2*3+1], skyboxvertex3f[pic*4*3+2*3+2] };
77         //double d[3] = { skyboxvertex3f[pic*4*3+3*3+0], skyboxvertex3f[pic*4*3+3*3+1], skyboxvertex3f[pic*4*3+3*3+2] };
78
79         if(flipx)
80         {
81                 x = 511 - x;
82         }
83
84         if(flipy)
85         {
86                 y = 511 - y;
87         }
88
89         if(flipdiag)
90         {
91                 h = x; x = y; y = h;
92         }
93
94         vec[0] = a[0] + (b[0] - a[0]) * (x + 0.5) / 512.0 + (c[0] - b[0]) * (y + 0.5) / 512.0;
95         vec[1] = a[1] + (b[1] - a[1]) * (x + 0.5) / 512.0 + (c[1] - b[1]) * (y + 0.5) / 512.0;
96         vec[2] = a[2] + (b[2] - a[2]) * (x + 0.5) / 512.0 + (c[2] - b[2]) * (y + 0.5) / 512.0;
97 }
98
99 int main(int argc, char **argv)
100 {
101         FILE *f;
102         int i, j, k;
103         unsigned char picture[6][512][512];
104         double brightvec[3];
105         double pitch, yaw;
106
107         if(argc != 2)
108         {
109                 fprintf(stderr, "Usage: %s imagefile.gray\n", *argv);
110                 return 1;
111         }
112
113         f = fopen(argv[1], "rb");
114         if(!f)
115         {
116                 perror("fopen");
117                 return 1;
118         }
119         fread(&picture, sizeof(picture), 1, f);
120         fclose(f);
121
122         brightvec[0] = brightvec[1] = brightvec[2] = 0;
123         for(i = 0; i < 6; ++i)
124                 for(j = 0; j < 512; ++j)
125                         for(k = 0; k < 512; ++k)
126                         {
127                                 double vec[3], f;
128                                 MapCoord(i, j, k, vec);
129                                 f = exp(10 * (picture[i][j][k] - 255)) / sqrt(vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2]);
130                                 brightvec[0] += f * vec[0];
131                                 brightvec[1] += f * vec[1];
132                                 brightvec[2] += f * vec[2];
133                         }
134         
135         pitch = -atan2(brightvec[2], sqrt(brightvec[0]*brightvec[0] + brightvec[1]*brightvec[1]));
136         yaw = atan2(brightvec[1], brightvec[0]);
137
138         printf("%f %f\n", yaw * 180 / M_PI, pitch * 180 / M_PI);
139         return 0;
140 }