#include #include #include #include #include #define _R(i,j) R[(i)*3+(j)] static inline float distance(const float *a, const float *b) { float xd = b[0] - a[0]; float yd = b[1] - a[1]; float zd = b[2] - a[2]; return sqrt(xd * xd + yd * yd + zd * zd); } static inline void subtract(float *res, const float *a, const float *b) { res[0] = a[0] - b[0]; res[1] = a[1] - b[1]; res[2] = a[2] - b[2]; } static inline void matrix(float *R, float ax, float ay, float az, float bx, float by, float bz) { float l, k; l = 1.0 / sqrt(ax * ax + ay * ay + az * az); ax *= l; ay *= l; az *= l; k = ax * bx + ay * by + az * bz; bx -= k * ax; by -= k * ay; bz -= k * az; l = 1.0 / sqrt(bx * bx + by * by + bz * bz); bx *= l; by *= l; bz *= l; _R(0,0) = ax; _R(1,0) = ay; _R(2,0) = az; _R(0,1) = bx; _R(1,1) = by; _R(2,1) = bz; _R(0,2) = - by * az + ay * bz; _R(1,2) = - bz * ax + az * bx; _R(2,2) = - bx * ay + ax * by; } int main(int argc, char *argv[]) { FILE *f; char s[8192], *p, *q; struct { float v[8][3]; float d[3]; float p[3]; float R[9]; } v[100]; float l, w, h; int n = 0, k; if (argc != 3) { fprintf(stderr, "usage: %s html-template solution\n", argv[0]); exit(1); } if (!(f = fopen(argv[2], "r"))) { fprintf(stderr, "fopen: %s: %s\n", argv[2], strerror(errno)); exit(1); } if (!fgets(s, sizeof(s), f) || sscanf(s, "%f %f %f", &l, &w, &h) != 3) { fprintf(stderr, "error: reading dimensions\n"); exit(1); } while (fgets(s, sizeof(s), f)) { if (n == 100) { fprintf(stderr, "error: too many lines\n"); exit(1); } if (sscanf(s, "%d", &k) != 1) { fprintf(stderr, "error: reading id: %s", s); exit(1); } p = s; for (int i = 0; i < 8 && p; ++i) { if (!(p = strchr(p, '(')) || !(q = strchr(p, ')')) || sscanf(p + 1, "%f, %f, %f", &v[n].v[i][0], &v[n].v[i][1], &v[n].v[i][2]) != 3) { fprintf(stderr, "error: reading: %s", s); exit(1); } p = q; } if (!p) { fprintf(stderr, "error: reading: %s", s); exit(1); } v[n].d[0] = distance(v[n].v[0], v[n].v[1]); v[n].d[1] = distance(v[n].v[0], v[n].v[3]); v[n].d[2] = distance(v[n].v[0], v[n].v[4]); v[n].p[0] = (v[n].v[0][0] + v[n].v[6][0]) / 2.0; v[n].p[1] = (v[n].v[0][1] + v[n].v[6][1]) / 2.0; v[n].p[2] = (v[n].v[0][2] + v[n].v[6][2]) / 2.0; float a[3], b[3]; subtract(a, v[n].v[1], v[n].v[0]); subtract(b, v[n].v[3], v[n].v[0]); matrix(v[n].R, a[0], a[1], a[2], b[0], b[1], b[2]); n++; } fclose(f); if (!(f = fopen(argv[1], "r"))) { fprintf(stderr, "fopen: %s: %s\n", argv[1], strerror(errno)); exit(1); } while (fgets(s, sizeof(s), f)) { if (strstr(s, "//XXX")) break; printf("%s", s); } printf("var matrix = new THREE.Matrix4();\n"); for (int i = 0; i < n; ++i) { printf("material = new THREE.MeshLambertMaterial({ color: " "0x%2.2x%2.2x%2.2x });\n", arc4random_uniform(200) + 56, arc4random_uniform(200) + 56, arc4random_uniform(200) + 56); printf("geometry = new THREE.BoxGeometry(%.2f, %.2f, %.2f);\n", v[i].d[0], v[i].d[1], v[i].d[2]); printf("mesh = new THREE.Mesh(geometry, material);\n"); printf("mesh.position.set(%.2f, %.2f, %.2f);\n", v[i].p[0], v[i].p[1], v[i].p[2]); printf("matrix.set(%.2f, %.2f, %.2f, 0.0, " "%.2f, %.2f, %.2f, 0.0, " "%.2f, %.2f, %.2f, 0.0, 0.0, 0.0, 0.0, 0.0);\n", v[i].R[0], v[i].R[1], v[i].R[2], v[i].R[3], v[i].R[4], v[i].R[5], v[i].R[6], v[i].R[7], v[i].R[8]); printf("mesh.rotation.setFromRotationMatrix(matrix, 'XYZ');\n"); printf("scene.add(mesh);\n"); } while (fgets(s, sizeof(s), f)) printf("%s", s); fclose(f); return 0; }