Converted to Point3D class.
This commit is contained in:
parent
8f9a1bcb56
commit
71f2e4342c
1 changed files with 136 additions and 117 deletions
253
FixObj/obj.cxx
253
FixObj/obj.cxx
|
@ -23,20 +23,32 @@
|
|||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <iostream>
|
||||
#include <string.h>
|
||||
|
||||
#include <vector>
|
||||
#include "Include/compiler.h"
|
||||
|
||||
#ifdef NEEDNAMESPACESTD
|
||||
using namespace std;
|
||||
#endif
|
||||
|
||||
#include "obj.hxx"
|
||||
|
||||
#include <Math/mat3.h>
|
||||
#include <Math/point3d.hxx>
|
||||
|
||||
|
||||
typedef vector < Point3D > container3;
|
||||
typedef container3::iterator iterator3;
|
||||
typedef container3::const_iterator const_iterator3;
|
||||
|
||||
|
||||
// what do ya' know, here's some global variables
|
||||
static double nodes[MAXNODES][3];
|
||||
static double normals[MAXNODES][3];
|
||||
container3 nodes;
|
||||
container3 normals;
|
||||
static int faces[MAXNODES][3];
|
||||
int ncount, vncount, fcount;
|
||||
int vncount, fcount;
|
||||
|
||||
static int ccw_list[MAXNODES];
|
||||
int ccw_list_ptr;
|
||||
|
@ -46,7 +58,7 @@ int cw_list_ptr;
|
|||
|
||||
FILE *in, *out;
|
||||
|
||||
double refx, refy, refz;
|
||||
Point3D ref;
|
||||
|
||||
|
||||
// some simple list routines
|
||||
|
@ -131,66 +143,78 @@ void fix_cw_list(int *list, int list_ptr) {
|
|||
}
|
||||
|
||||
|
||||
// Calculate distance between (0,0,0) and the specified point
|
||||
static double calc_dist(double x, double y, double z) {
|
||||
return ( sqrt(x*x + y*y + z*z) );
|
||||
}
|
||||
|
||||
|
||||
void dump_global_bounds( void ) {
|
||||
double dist, radius;
|
||||
int i;
|
||||
|
||||
radius = 0.0;
|
||||
|
||||
fprintf(out, "\n");
|
||||
|
||||
for ( i = 1; i < ncount; i++ ) {
|
||||
|
||||
iterator3 current = nodes.begin();
|
||||
iterator3 last = nodes.end();
|
||||
|
||||
dist = calc_dist(nodes[i][0] - refx, nodes[i][1] - refy,
|
||||
nodes[i][2] - refz);
|
||||
// printf("node = %.2f %.2f %.2f dist = %.2f\n",
|
||||
// nodes[i][0], nodes[i][1], nodes[i][2],
|
||||
// dist);
|
||||
// skip first dummy node
|
||||
++current;
|
||||
|
||||
for ( ; current != last; ++current ) {
|
||||
dist = ref.distance3D(*current);
|
||||
// cout << "node = " << *current << " dist = " << dist << endl;
|
||||
|
||||
if ( dist > radius ) {
|
||||
radius = dist;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fprintf(out, "gbs %.5f %.5f %.5f %.2f\n", refx, refy, refz, radius);
|
||||
fprintf( out,
|
||||
"gbs %.5f %.5f %.5f %.2f\n",
|
||||
ref.x(), ref.y(), ref.z(), radius);
|
||||
}
|
||||
|
||||
|
||||
// dump nodes
|
||||
void dump_nodes( void ) {
|
||||
int i;
|
||||
Point3D p;
|
||||
|
||||
fprintf(out, "\n");
|
||||
for ( i = 1; i < ncount; i++ ) {
|
||||
fprintf(out, "v %.5f %.5f %.5f\n",
|
||||
nodes[i][0] - refx, nodes[i][1] - refy, nodes[i][2] - refz);
|
||||
|
||||
iterator3 current = nodes.begin();
|
||||
iterator3 last = nodes.end();
|
||||
|
||||
// skip first dummy node
|
||||
++current;
|
||||
|
||||
for ( ; current != last; ++current ) {
|
||||
p = *current - ref;
|
||||
fprintf( out, "v %.5f %.5f %.5f\n", p.x(), p.y(), p.z() );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// dump normals
|
||||
void dump_normals( void ) {
|
||||
int i;
|
||||
Point3D p;
|
||||
|
||||
fprintf(out, "\n");
|
||||
for ( i = 1; i < vncount; i++ ) {
|
||||
fprintf(out, "vn %.5f %.5f %.5f\n",
|
||||
normals[i][0], normals[i][1], normals[i][2]);
|
||||
|
||||
iterator3 current = normals.begin();
|
||||
iterator3 last = normals.end();
|
||||
|
||||
// skip first dummy normal
|
||||
++current;
|
||||
|
||||
for ( ; current != last; ++current ) {
|
||||
p = *current;
|
||||
fprintf(out, "vn %.5f %.5f %.5f\n", p.x(), p.y(), p.z() );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// dump faces
|
||||
void dump_faces( void ) {
|
||||
Point3D p;
|
||||
int i, n1, n2, n3;
|
||||
double x, y, z, xmax, xmin, ymax, ymin, zmax, zmin, dist, radius;
|
||||
double xmax, xmin, ymax, ymin, zmax, zmin, dist, radius;
|
||||
|
||||
fprintf(out, "\n");
|
||||
for ( i = 1; i < fcount; i++ ) {
|
||||
|
@ -199,40 +223,39 @@ void dump_faces( void ) {
|
|||
n3 = faces[i][2];
|
||||
|
||||
// calc center of face
|
||||
xmin = xmax = nodes[n1][0];
|
||||
ymin = ymax = nodes[n1][1];
|
||||
zmin = zmax = nodes[n1][2];
|
||||
xmin = xmax = nodes[n1].x();
|
||||
ymin = ymax = nodes[n1].y();
|
||||
zmin = zmax = nodes[n1].z();
|
||||
|
||||
if ( nodes[n2][0] < xmin ) { xmin = nodes[n2][0]; }
|
||||
if ( nodes[n2][0] > xmax ) { xmax = nodes[n2][0]; }
|
||||
if ( nodes[n2][1] < ymin ) { ymin = nodes[n2][1]; }
|
||||
if ( nodes[n2][1] > ymax ) { ymax = nodes[n2][1]; }
|
||||
if ( nodes[n2][2] < zmin ) { zmin = nodes[n2][2]; }
|
||||
if ( nodes[n2][2] > zmax ) { zmax = nodes[n2][2]; }
|
||||
if ( nodes[n2].x() < xmin ) { xmin = nodes[n2].x(); }
|
||||
if ( nodes[n2].x() > xmax ) { xmax = nodes[n2].x(); }
|
||||
if ( nodes[n2].y() < ymin ) { ymin = nodes[n2].y(); }
|
||||
if ( nodes[n2].y() > ymax ) { ymax = nodes[n2].y(); }
|
||||
if ( nodes[n2].z() < zmin ) { zmin = nodes[n2].z(); }
|
||||
if ( nodes[n2].z() > zmax ) { zmax = nodes[n2].z(); }
|
||||
|
||||
if ( nodes[n3][0] < xmin ) { xmin = nodes[n3][0]; }
|
||||
if ( nodes[n3][0] > xmax ) { xmax = nodes[n3][0]; }
|
||||
if ( nodes[n3][1] < ymin ) { ymin = nodes[n3][1]; }
|
||||
if ( nodes[n3][1] > ymax ) { ymax = nodes[n3][1]; }
|
||||
if ( nodes[n3][2] < zmin ) { zmin = nodes[n3][2]; }
|
||||
if ( nodes[n3][2] > zmax ) { zmax = nodes[n3][2]; }
|
||||
if ( nodes[n3].x() < xmin ) { xmin = nodes[n3].x(); }
|
||||
if ( nodes[n3].x() > xmax ) { xmax = nodes[n3].x(); }
|
||||
if ( nodes[n3].y() < ymin ) { ymin = nodes[n3].y(); }
|
||||
if ( nodes[n3].y() > ymax ) { ymax = nodes[n3].y(); }
|
||||
if ( nodes[n3].z() < zmin ) { zmin = nodes[n3].z(); }
|
||||
if ( nodes[n3].z() > zmax ) { zmax = nodes[n3].z(); }
|
||||
|
||||
x = (xmin + xmax) / 2.0;
|
||||
y = (ymin + ymax) / 2.0;
|
||||
z = (zmin + zmax) / 2.0;
|
||||
p = Point3D( (xmin + xmax) / 2.0,
|
||||
(ymin + ymax) / 2.0,
|
||||
(zmin + zmax) / 2.0 );
|
||||
|
||||
// calc bounding radius
|
||||
radius = calc_dist(nodes[n1][0] - x, nodes[n1][1] - y,
|
||||
nodes[n1][2] - z);
|
||||
radius = p.distance3D(nodes[n1]);
|
||||
|
||||
dist = calc_dist(nodes[n2][0] - x, nodes[n2][1] - y, nodes[n2][2] - z);
|
||||
dist = p.distance3D(nodes[n2]);
|
||||
if ( dist > radius ) { radius = dist; }
|
||||
|
||||
dist = calc_dist(nodes[n3][0] - x, nodes[n3][1] - y, nodes[n3][2] - z);
|
||||
dist = p.distance3D(nodes[n3]);
|
||||
if ( dist > radius ) { radius = dist; }
|
||||
|
||||
// output data
|
||||
fprintf(out, "bs %.2f %.2f %.2f %.2f\n", x, y, z, radius);
|
||||
fprintf(out, "bs %.2f %.2f %.2f %.2f\n", p.x(), p.y(), p.z(), radius);
|
||||
fprintf(out, "f %d %d %d\n", n1, n2, n3);
|
||||
}
|
||||
}
|
||||
|
@ -240,7 +263,8 @@ void dump_faces( void ) {
|
|||
|
||||
// dump list
|
||||
void dump_list(int *list, int list_ptr) {
|
||||
double x, y, z, xmax, xmin, ymax, ymin, zmax, zmin, dist, radius;
|
||||
Point3D p;
|
||||
double xmax, xmin, ymax, ymin, zmax, zmin, dist, radius;
|
||||
int i, j, len, n;
|
||||
|
||||
if ( list_ptr < 3 ) {
|
||||
|
@ -271,41 +295,40 @@ void dump_list(int *list, int list_ptr) {
|
|||
|
||||
// calc center of face
|
||||
n = list[i];
|
||||
xmin = xmax = nodes[n][0];
|
||||
ymin = ymax = nodes[n][1];
|
||||
zmin = zmax = nodes[n][2];
|
||||
// printf("%.2f %.2f %.2f\n", nodes[n][0], nodes[n][1], nodes[n][2]);
|
||||
xmin = xmax = nodes[n].x();
|
||||
ymin = ymax = nodes[n].y();
|
||||
zmin = zmax = nodes[n].z();
|
||||
// printf("%.2f %.2f %.2f\n", nodes[n].x(), nodes[n].y(), nodes[n].z());
|
||||
|
||||
for ( j = i + 1; j < i + len; j++ ) {
|
||||
// printf("j = %d\n", j);
|
||||
n = list[j];
|
||||
if ( nodes[n][0] < xmin ) { xmin = nodes[n][0]; }
|
||||
if ( nodes[n][0] > xmax ) { xmax = nodes[n][0]; }
|
||||
if ( nodes[n][1] < ymin ) { ymin = nodes[n][1]; }
|
||||
if ( nodes[n][1] > ymax ) { ymax = nodes[n][1]; }
|
||||
if ( nodes[n][2] < zmin ) { zmin = nodes[n][2]; }
|
||||
if ( nodes[n][2] > zmax ) { zmax = nodes[n][2]; }
|
||||
// printf("%.2f %.2f %.2f\n", nodes[n][0], nodes[n][1], nodes[n][2]);
|
||||
}
|
||||
x = (xmin + xmax) / 2.0;
|
||||
y = (ymin + ymax) / 2.0;
|
||||
z = (zmin + zmax) / 2.0;
|
||||
// printf("center = %.2f %.2f %.2f\n", x, y, z);
|
||||
if ( nodes[n].x() < xmin ) { xmin = nodes[n].x(); }
|
||||
if ( nodes[n].x() > xmax ) { xmax = nodes[n].x(); }
|
||||
if ( nodes[n].y() < ymin ) { ymin = nodes[n].y(); }
|
||||
if ( nodes[n].y() > ymax ) { ymax = nodes[n].y(); }
|
||||
if ( nodes[n].z() < zmin ) { zmin = nodes[n].z(); }
|
||||
if ( nodes[n].z() > zmax ) { zmax = nodes[n].z(); }
|
||||
// printf("%.2f %.2f %.2f\n", nodes[n].x(), nodes[n].y(), nodes[n].z());
|
||||
}
|
||||
p = Point3D( (xmin + xmax) / 2.0,
|
||||
(ymin + ymax) / 2.0,
|
||||
(zmin + zmax) / 2.0 );
|
||||
// printf("center = %.2f %.2f %.2f\n", p.x(), p.y(), p.z());
|
||||
|
||||
// calc bounding radius
|
||||
n = list[i];
|
||||
radius = calc_dist(nodes[n][0] - x, nodes[n][1] - y, nodes[n][2] - z);
|
||||
radius = p.distance3D(nodes[n]);
|
||||
|
||||
for ( j = i + 1; j < i + len; j++ ) {
|
||||
n = list[j];
|
||||
dist = calc_dist(nodes[n][0] - x, nodes[n][1] - y,
|
||||
nodes[n][2] - z);
|
||||
dist = p.distance3D(nodes[n]);
|
||||
if ( dist > radius ) { radius = dist; }
|
||||
}
|
||||
// printf("radius = %.2f\n", radius);
|
||||
|
||||
// dump bounding sphere and header
|
||||
fprintf(out, "bs %.2f %.2f %.2f %.2f\n", x, y, z, radius);
|
||||
fprintf(out, "bs %.2f %.2f %.2f %.2f\n", p.x(), p.y(), p.z(), radius);
|
||||
fprintf(out, "t %d %d %d\n", list[i], list[i+1], list[i+2]);
|
||||
// printf("t %d %d %d\n", list[i], list[i+1], list[i+2]);
|
||||
i += 3;
|
||||
|
@ -335,12 +358,12 @@ double check_cur_face(int n1, int n2, int n3) {
|
|||
|
||||
// check for the proper rotation by calculating an approximate
|
||||
// normal and seeing if it is close to the precalculated normal
|
||||
v1[0] = nodes[n2][0] - nodes[n1][0];
|
||||
v1[1] = nodes[n2][1] - nodes[n1][1];
|
||||
v1[2] = nodes[n2][2] - nodes[n1][2];
|
||||
v2[0] = nodes[n3][0] - nodes[n1][0];
|
||||
v2[1] = nodes[n3][1] - nodes[n1][1];
|
||||
v2[2] = nodes[n3][2] - nodes[n1][2];
|
||||
v1[0] = nodes[n2].x() - nodes[n1].x();
|
||||
v1[1] = nodes[n2].y() - nodes[n1].y();
|
||||
v1[2] = nodes[n2].z() - nodes[n1].z();
|
||||
v2[0] = nodes[n3].x() - nodes[n1].x();
|
||||
v2[1] = nodes[n3].y() - nodes[n1].y();
|
||||
v2[2] = nodes[n3].z() - nodes[n1].z();
|
||||
|
||||
MAT3cross_product(approx_normal, v1, v2);
|
||||
MAT3_NORMALIZE_VEC(approx_normal,temp);
|
||||
|
@ -362,6 +385,7 @@ double check_cur_face(int n1, int n2, int n3) {
|
|||
|
||||
// Load a .obj file
|
||||
void obj_fix(char *infile, char *outfile) {
|
||||
Point3D node, normal;
|
||||
char line[256];
|
||||
double dot_prod;
|
||||
int first, n1, n2, n3, n4;
|
||||
|
@ -378,13 +402,20 @@ void obj_fix(char *infile, char *outfile) {
|
|||
exit(-1);
|
||||
}
|
||||
|
||||
// push dummy records onto the lists since we start counting with "1"
|
||||
node = Point3D(0.0, 0.0, 0.0);
|
||||
nodes.push_back(node);
|
||||
|
||||
normal = Point3D(0.0, 0.0, 0.0);
|
||||
normals.push_back(normal);
|
||||
|
||||
// initialize other lists
|
||||
list_init(&ccw_list_ptr);
|
||||
list_init(&cw_list_ptr);
|
||||
|
||||
// I start counting at one because that is how the triangle
|
||||
// program refers to nodes and normals
|
||||
first = 1;
|
||||
ncount = 1;
|
||||
vncount = 1;
|
||||
fcount = 1;
|
||||
|
||||
|
@ -399,52 +430,37 @@ void obj_fix(char *infile, char *outfile) {
|
|||
// fprintf(out, "%s", line);
|
||||
} else if ( strncmp(line, "v ", 2) == 0 ) {
|
||||
// save vertex to memory and output to file
|
||||
if ( ncount < MAXNODES ) {
|
||||
// printf("vertex = %s", line);
|
||||
sscanf(line, "v %lf %lf %lf\n", &x, &y, &z);
|
||||
nodes[ncount][0] = x;
|
||||
nodes[ncount][1] = y;
|
||||
nodes[ncount][2] = z;
|
||||
// printf("vertex = %s", line);
|
||||
sscanf(line, "v %lf %lf %lf\n", &x, &y, &z);
|
||||
|
||||
if ( nodes.size() == 1 ) {
|
||||
// first time through set min's and max'es
|
||||
if ( ncount == 1 ) {
|
||||
xmin = x;
|
||||
xmax = x;
|
||||
ymin = y;
|
||||
ymax = y;
|
||||
zmin = z;
|
||||
zmax = z;
|
||||
}
|
||||
|
||||
// keep track of min/max vertex values
|
||||
xmin = x;
|
||||
xmax = x;
|
||||
ymin = y;
|
||||
ymax = y;
|
||||
zmin = z;
|
||||
zmax = z;
|
||||
} else {
|
||||
// update min/max vertex values
|
||||
if ( x < xmin ) xmin = x;
|
||||
if ( x > xmax ) xmax = x;
|
||||
if ( y < ymin ) ymin = y;
|
||||
if ( y > ymax ) ymax = y;
|
||||
if ( z < zmin ) zmin = z;
|
||||
if ( z > zmax ) zmax = z;
|
||||
}
|
||||
|
||||
// fprintf(out, "v %.2f %.2f %.2f\n",
|
||||
// nodes[ncount][0], nodes[ncount][1], nodes[ncount][2]);
|
||||
ncount++;
|
||||
} else {
|
||||
printf("Read too many nodes ... dying :-(\n");
|
||||
exit(-1);
|
||||
}
|
||||
node = Point3D(x, y, z);
|
||||
nodes.push_back(node);
|
||||
// fprintf(out, "v %.2f %.2f %.2f\n",
|
||||
// node.x(), node.y(), node.z());
|
||||
} else if ( strncmp(line, "vn ", 3) == 0 ) {
|
||||
// save vertex normals to memory and output to file
|
||||
if ( vncount < MAXNODES ) {
|
||||
// printf("vertex normal = %s", line);
|
||||
sscanf(line, "vn %lf %lf %lf\n",
|
||||
&normals[vncount][0], &normals[vncount][1],
|
||||
&normals[vncount][2]);
|
||||
// fprintf(out, "vn %.4f %.4f %.4f\n", normals[vncount][0],
|
||||
// normals[vncount][1], normals[vncount][2]);
|
||||
vncount++;
|
||||
} else {
|
||||
printf("Read too many vertex normals ... dying :-(\n");
|
||||
exit(-1);
|
||||
}
|
||||
// printf("vertex normal = %s", line);
|
||||
sscanf(line, "vn %lf %lf %lf\n", &x, &y, &z);
|
||||
normal = Point3D(x, y, z);
|
||||
normals.push_back(normal);
|
||||
} else if ( line[0] == 't' ) {
|
||||
// starting a new triangle strip
|
||||
|
||||
|
@ -539,9 +555,9 @@ void obj_fix(char *infile, char *outfile) {
|
|||
}
|
||||
|
||||
// reference point is the "center"
|
||||
refx = (xmin + xmax) / 2.0;
|
||||
refy = (ymin + ymax) / 2.0;
|
||||
refz = (zmin + zmax) / 2.0;
|
||||
ref = Point3D( (xmin + xmax) / 2.0,
|
||||
(ymin + ymax) / 2.0,
|
||||
(zmin + zmax) / 2.0 );
|
||||
|
||||
// convert the cw_list to ccw add append to ccw_list
|
||||
fix_cw_list(cw_list, cw_list_ptr);
|
||||
|
@ -561,6 +577,9 @@ void obj_fix(char *infile, char *outfile) {
|
|||
|
||||
|
||||
// $Log$
|
||||
// Revision 1.2 1998/10/21 14:55:55 curt
|
||||
// Converted to Point3D class.
|
||||
//
|
||||
// Revision 1.1 1998/06/08 17:11:46 curt
|
||||
// Renamed *.[ch] to *.[ch]xx
|
||||
//
|
||||
|
|
Loading…
Reference in a new issue