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] =
55 #define GET_SKY_IMAGE(x,y,z) \
56 (fabs(x)>=fabs(y) && fabs(x)>=fabs(z)) ? (((x) > 0) ? 0 : 1) : \
57 (fabs(y)>=fabs(x) && fabs(y)>=fabs(z)) ? (((y) > 0) ? 2 : 3) : \
70 static const double skyboxvertex3f[6*4*3] =
104 void Unmap2f(double x, double y, const double *corners, double *u, double *v)
106 // x - corners[0] == *u * (corners[2] - corners[0]) + *v * (corners[4] - corners[2]);
107 // y - corners[1] == *u * (corners[3] - corners[1]) + *v * (corners[5] - corners[3]);
109 double xc0 = x - corners[0];
110 double yc1 = y - corners[1];
111 double c20 = corners[2] - corners[0];
112 double c31 = corners[3] - corners[1];
113 double c42 = corners[4] - corners[2];
114 double c53 = corners[5] - corners[3];
116 // xc0 == *u * c20 + *v * c42;
117 // yc1 == *u * c31 + *v * c53;
119 double det = c20 * c53 - c31 * c42;
120 double du = xc0 * c53 - yc1 * c42;
121 double dv = c20 * yc1 - c31 * xc0;
127 void Map3f(double u, double v, const double *corners, double *x, double *y, double *z)
129 *x = corners[0] + u * (corners[3] - corners[0]) + v * (corners[6] - corners[3]);
130 *y = corners[1] + u * (corners[4] - corners[1]) + v * (corners[7] - corners[4]);
131 *z = corners[2] + u * (corners[5] - corners[2]) + v * (corners[8] - corners[5]);
134 void Map2f(double u, double v, const double *corners, double *x, double *y)
136 *x = u * (corners[2] - corners[0]) + v * (corners[4] - corners[2]) + corners[0];
137 *y = u * (corners[3] - corners[1]) + v * (corners[5] - corners[3]) + corners[1];
140 void Unmap3f(double x, double y, double z, const double *corners, double *u, double *v)
142 //*x = corners[0] + u * (corners[3] - corners[0]) + v * (corners[6] - corners[3]);
143 //*y = corners[1] + u * (corners[4] - corners[1]) + v * (corners[7] - corners[4]);
144 //*z = corners[2] + u * (corners[5] - corners[2]) + v * (corners[8] - corners[5]);
145 // THREE equations, TWO would be better! Let's simply use the two "better" ones
147 double xc0 = x - corners[0];
148 double yc1 = y - corners[1];
149 double zc2 = z - corners[2];
150 double c30 = corners[3] - corners[0];
151 double c41 = corners[4] - corners[1];
152 double c52 = corners[5] - corners[2];
153 double c63 = corners[6] - corners[3];
154 double c74 = corners[7] - corners[4];
155 double c85 = corners[8] - corners[5];
157 double det_x = c41 * c85 - c52 * c74;
158 double det_y = c30 * c85 - c52 * c63;
159 double det_z = c30 * c74 - c41 * c63;
161 if(fabs(det_x) >= fabs(det_y) && fabs(det_x) >= fabs(det_z))
163 double du = yc1 * c85 - zc2 * c74;
164 double dv = c41 * zc2 - c52 * yc1;
168 else if(fabs(det_y) >= fabs(det_z))
170 double du = xc0 * c85 - zc2 * c63;
171 double dv = c30 * zc2 - c52 * xc0;
177 double du = xc0 * c74 - yc1 * c63;
178 double dv = c30 * yc1 - c41 * xc0;
184 void MapCoord(int pic, int y, int x, double vec[3])
187 int flipx = flip[3*pic+0];
188 int flipy = flip[3*pic+1];
189 int flipdiag = flip[3*pic+2];
203 Unmap2f((x + 0.5) / 512.0, (y + 0.5) / 512.0, skyboxtexcoord2f + 4*2*pic, &u, &v);
204 Map3f(u, v, skyboxvertex3f + 6*2*pic, &vec[0], &vec[1], &vec[2]);
207 void UnmapCoord(const double vec_[3], int *pic, int *y, int *x)
217 // identify which pic it is
218 *pic = GET_SKY_IMAGE(vec_[0], vec_[1], vec_[2]);
219 f = 16.0/fabs(vec_[highest[*pic]]);
220 vec[0] = vec_[0] * f;
221 vec[1] = vec_[1] * f;
222 vec[2] = vec_[2] * f;
223 flipx = flip[3*(*pic)+0];
224 flipy = flip[3*(*pic)+1];
225 flipdiag = flip[3*(*pic)+2];
228 Unmap3f(vec[0], vec[1], vec[2], skyboxvertex3f + 6*2*(*pic), &u, &v);
229 Map2f(u, v, skyboxtexcoord2f + 4*2*(*pic), &xx, &yy);
230 *x = (int) (xx * 512.0 + 0.5);
231 *y = (int) (yy * 512.0 + 0.5);
235 h = *x; *x = *y; *y = h;
245 int main(int argc, char **argv)
249 unsigned char picture[6][512][512];
252 double pitch, yaw, l;
256 fprintf(stderr, "Usage: %s imagefile.gray\n", *argv);
260 f = fopen(argv[1], "rb");
266 fread(&picture, sizeof(picture), 1, f);
269 brightvec[0] = brightvec[1] = brightvec[2] = 0;
271 for(i = 0; i < 6; ++i)
272 for(j = 0; j < 512; ++j)
273 for(k = 0; k < 512; ++k)
274 if(picture[i][j][k] > max)
275 max = picture[i][j][k];
276 for(i = 0; i < 6; ++i)
277 for(j = 0; j < 512; ++j)
278 for(k = 0; k < 512; ++k)
281 MapCoord(i, j, k, vec);
282 f = pow(vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2], -1.5); // I know what I am doing.
283 f *= exp(10 * (picture[i][j][k] - max));
284 brightvec[0] += f * vec[0];
285 brightvec[1] += f * vec[1];
286 brightvec[2] += f * vec[2];
289 l = sqrt(brightvec[0]*brightvec[0] + brightvec[1]*brightvec[1] + brightvec[2]*brightvec[2]);
294 fprintf(stderr, "vec = %f %f %f\n", brightvec[0], brightvec[1], brightvec[2]);
295 UnmapCoord(brightvec, &i, &j, &k);
296 fprintf(stderr, "picture %d pixel (%d %d) value %d\n", i, k, j, picture[i][j][k]);
298 pitch = atan2(brightvec[2], sqrt(brightvec[0]*brightvec[0] + brightvec[1]*brightvec[1]));
299 yaw = atan2(brightvec[1], brightvec[0]);
301 printf("%f %f\n", yaw * 180 / M_PI, pitch * 180 / M_PI);