#include "tri2obj.h"
-#include "../../Src/constants.h"
-#include "../../Src/types.h"
+#include "../../Src/Include/constants.h"
+#include "../../Src/Include/types.h"
#include "../../Src/Math/fg_geodesy.h"
#include "../../Src/Math/mat3.h"
#include "../../Src/Math/polar.h"
MAT3cross_product(normal, v1, v2);
MAT3_NORMALIZE_VEC(normal,temp);
- /* printf("Normal = %.2f %.2f %.2f\n", normal[0], normal[1], normal[2]); */
+/* printf(" Normal = %.2f %.2f %.2f\n", normal[0], normal[1], normal[2]); */
}
/* return the index of all triangles containing the specified node */
-void find_tris(int n, int *t1, int *t2, int *t3) {
+void find_tris(int n, int *t1, int *t2, int *t3, int *t4, int *t5) {
int i;
- *t1 = *t2 = *t3 = 0;
+ *t1 = *t2 = *t3 = *t4 = *t5 = 0;
i = 1;
while ( i <= tricount ) {
*t1 = i;
} else if ( *t2 == 0 ) {
*t2 = i;
- } else {
+ } else if ( *t3 == 0 ) {
*t3 = i;
+ } else if ( *t4 == 0 ) {
+ *t4 = i;
+ } else {
+ *t5 = i;
}
}
i++;
for ( i = 1; i <= nodecount; i++ ) {
fscanf(node, "%d %lf %lf %lf %d\n", &junk1,
&n[0], &n[1], &n[2], &junk2);
- printf("%d %.2f %.2f %.2f\n", junk1, n[0], n[1], n[2]);
+ /* printf("%d %.2f %.2f %.2f\n", junk1, n[0], n[1], n[2]); */
nodes[i] = geod_to_cart(n);
- printf("%d %.2f %.2f %.2f\n",
- junk1, nodes[i].x, nodes[i].y, nodes[i].z);
+ /* printf("%d %.2f %.2f %.2f\n",
+ junk1, nodes[i].x, nodes[i].y, nodes[i].z); */
}
fclose(node);
/* dump in WaveFront .obj format */
void dump_obj(char *basename) {
char objname[256];
- double n1[3], n2[3], n3[3];
+ double n1[3], n2[3], n3[3], n4[3], n5[3], norm[3], temp;
FILE *obj;
- int i, t1, t2, t3, count;
+ int i, t1, t2, t3, t4, t5, count;
strcpy(objname, basename);
strcat(objname, ".obj");
obj = fopen(objname, "w");
/* dump vertices */
+ printf(" writing vertices\n");
for ( i = 1; i <= nodecount; i++ ) {
fprintf(obj, "v %.2f %.2f %.2f\n",
nodes[i].x, nodes[i].y, nodes[i].z);
}
+ printf(" calculating and writing normals\n");
/* calculate and generate normals */
for ( i = 1; i <= nodecount; i++ ) {
- find_tris(i, &t1, &t2, &t3);
+/* printf("Finding normal\n"); */
+
+ find_tris(i, &t1, &t2, &t3, &t4, &t5);
n1[0] = n1[1] = n1[2] = 0.0;
n2[0] = n2[1] = n2[2] = 0.0;
- n3[0] = n3[1] = n3[3] = 0.0;
+ n3[0] = n3[1] = n3[2] = 0.0;
+ n4[0] = n4[1] = n4[2] = 0.0;
+ n5[0] = n5[1] = n5[2] = 0.0;
count = 1;
calc_normal(nodes[tris[t1][0]], nodes[tris[t1][1]], nodes[tris[t1][2]],
count = 3;
}
- fprintf(obj, "vn %.4f %.4f %.4f\n",
- ( n1[0] + n2[0] + n3[0] ) / (double)count,
- ( n1[1] + n2[1] + n3[1] ) / (double)count,
- ( n1[2] + n2[2] + n3[2] ) / (double)count );
+ if ( t4 > 0 ) {
+ calc_normal(nodes[tris[t4][0]], nodes[tris[t4][1]],
+ nodes[tris[t4][2]], n4);
+ count = 4;
+ }
+
+ if ( t5 > 0 ) {
+ calc_normal(nodes[tris[t5][0]], nodes[tris[t5][1]],
+ nodes[tris[t5][2]], n5);
+ count = 5;
+ }
+
+/* printf(" norm[2] = %.2f %.2f %.2f\n", n1[2], n2[2], n3[2]); */
+
+ norm[0] = ( n1[0] + n2[0] + n3[0] + n4[0] + n5[0] ) / (double)count;
+ norm[1] = ( n1[1] + n2[1] + n3[1] + n4[1] + n5[1] ) / (double)count;
+ norm[2] = ( n1[2] + n2[2] + n3[2] + n4[2] + n5[2] ) / (double)count;
+
+/* printf(" count = %d\n", count); */
+/* printf(" Ave. normal = %.4f %.4f %.4f\n", norm[0], norm[1], norm[2]);*/
+ MAT3_NORMALIZE_VEC(norm, temp);
+/* printf(" Normalized ave. normal = %.4f %.4f %.4f\n", */
+/* norm[0], norm[1], norm[2]); */
+
+ fprintf(obj, "vn %.4f %.4f %.4f\n", norm[0], norm[1], norm[2]);
}
/* dump faces */
+ printf(" writing faces\n");
for ( i = 1; i <= tricount; i++ ) {
- fprintf(obj, "f %d//%d %d//%d %d//%d\n",
- tris[i][0], tris[i][0],
- tris[i][1], tris[i][1],
- tris[i][2], tris[i][2]);
+ fprintf(obj, "f %d %d %d\n", tris[i][0], tris[i][1], tris[i][2]);
}
fclose(obj);
/* $Log$
-/* Revision 1.2 1997/11/14 00:29:13 curt
-/* Transform scenery coordinates at this point in pipeline when scenery is
-/* being translated to .obj format, not when it is being loaded into the end
-/* renderer. Precalculate normals for each node as average of the normals
-/* of each containing polygon so Garoude shading is now supportable.
+/* Revision 1.7 1998/01/12 02:42:00 curt
+/* Average up to five triangles per vertex instead of three.
/*
+ * Revision 1.6 1998/01/09 23:03:15 curt
+ * Restructured to split 1deg x 1deg dem's into 64 subsections.
+ *
+ * Revision 1.5 1997/12/08 19:17:50 curt
+ * Fixed a type in the normal generation code.
+ *
+ * Revision 1.4 1997/12/02 13:13:32 curt
+ * Fixed problem with averaged vertex normals.
+ *
+ * Revision 1.3 1997/11/15 18:05:05 curt
+ * minor tweaks ...
+ *
+ * Revision 1.2 1997/11/14 00:29:13 curt
+ * Transform scenery coordinates at this point in pipeline when scenery is
+ * being translated to .obj format, not when it is being loaded into the end
+ * renderer. Precalculate normals for each node as average of the normals
+ * of each containing polygon so Garoude shading is now supportable.
+ *
* Revision 1.1 1997/10/29 23:05:15 curt
* Initial revision.
*