4 // USAGE: see brightspot.sh (and in the future brightspot.bat)
5 // It should output the right parameters for the sun direction in q3map2's format.
6 // But probably is broken.
13 false, false, true, // "rt"
14 true, true, true, // "lf"
15 false, true, false, // "bk"
16 true, false, false, // "ft"
17 false, false, true, // "up"
18 false, false, true // "dn"
21 static const double skyboxtexcoord2f[6*4*2] =
56 static const double skyboxvertex3f[6*4*3] =
90 void Unmap2f(double x, double y, const double *corners, double *u, double *v)
92 // x - corners[0] == *u * (corners[2] - corners[0]) + *v * (corners[4] - corners[2]);
93 // y - corners[1] == *u * (corners[3] - corners[1]) + *v * (corners[5] - corners[3]);
95 double xc0 = x - corners[0];
96 double yc1 = y - corners[1];
97 double c20 = corners[2] - corners[0];
98 double c31 = corners[3] - corners[1];
99 double c42 = corners[4] - corners[2];
100 double c53 = corners[5] - corners[3];
102 // xc0 == *u * c20 + *v * c42;
103 // yc1 == *u * c31 + *v * c53;
105 double det = c20 * c53 - c31 * c42;
106 double du = xc0 * c53 - yc1 * c42;
107 double dv = c20 * yc1 - c31 * xc0;
113 void Map3f(double u, double v, const double *corners, double *x, double *y, double *z)
115 *x = corners[0] + u * (corners[3] - corners[0]) + v * (corners[6] - corners[3]);
116 *y = corners[1] + u * (corners[4] - corners[1]) + v * (corners[7] - corners[4]);
117 *z = corners[2] + u * (corners[5] - corners[2]) + v * (corners[8] - corners[5]);
120 void MapCoord(int pic, int y, int x, double vec[3])
123 int flipx = flip[3*pic+0];
124 int flipy = flip[3*pic+1];
125 int flipdiag = flip[3*pic+2];
139 Unmap2f((x + 0.5) / 512.0, (y + 0.5) / 512.0, skyboxtexcoord2f + 4*2*pic, &u, &v);
140 Map3f(u, v, skyboxvertex3f + 6*2*pic, &vec[0], &vec[1], &vec[2]);
143 int main(int argc, char **argv)
147 unsigned char picture[6][512][512];
150 double pitch, yaw, l;
154 fprintf(stderr, "Usage: %s imagefile.gray\n", *argv);
158 f = fopen(argv[1], "rb");
164 fread(&picture, sizeof(picture), 1, f);
167 brightvec[0] = brightvec[1] = brightvec[2] = 0;
169 for(i = 0; i < 6; ++i)
170 for(j = 0; j < 512; ++j)
171 for(k = 0; k < 512; ++k)
172 if(picture[i][j][k] > max)
173 max = picture[i][j][k];
174 for(i = 0; i < 6; ++i)
175 for(j = 0; j < 512; ++j)
176 for(k = 0; k < 512; ++k)
179 MapCoord(i, j, k, vec);
180 f = pow(vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2], -1.5); // I know what I am doing.
181 f *= exp(10 * (picture[i][j][k] - max));
182 brightvec[0] += f * vec[0];
183 brightvec[1] += f * vec[1];
184 brightvec[2] += f * vec[2];
187 l = sqrt(brightvec[0]*brightvec[0] + brightvec[1]*brightvec[1] + brightvec[2]*brightvec[2]);
188 fprintf(stderr, "vec = %f %f %f\n", brightvec[0] / l, brightvec[1] / l, brightvec[2] / l);
190 pitch = atan2(brightvec[2], sqrt(brightvec[0]*brightvec[0] + brightvec[1]*brightvec[1]));
191 yaw = atan2(brightvec[1], brightvec[0]);
193 printf("%f %f\n", yaw * 180 / M_PI, pitch * 180 / M_PI);