ftp.nice.ch/pub/next/graphics/3d/geomview.1.4.1.s.tar.gz#/Geomview/src/bin/geomutil/ucd/ucdtooff.c

This is ucdtooff.c in view mode; [Download] [Up]

/* File:	anytoucd.c:
   Author:	Charlie Gunn originally
                
   read a OOGL object on stdin, and write ucd format on stdout.
*/
#include "vec4.h"
#include "geom.h"
#include "ooglutil.h"
#include "3d.h"
#include "polylistP.h"
#include "plutil.h"
#include <stdio.h>
#include "time.h"

/*
#define DEBUG
*/

typedef struct {
    int id;
    HPoint3 v;
    }  ucdvert;

typedef struct {
    int id;
    int m;
    int n;
    int vlist[4];
    }  ucdpoly;

int
getcellsize(str)
char *str;
{
    if (strcmp(str,"line") == 0)  return(2);
    else if (strcmp(str,"tri") == 0)  return(3);
    else if (strcmp(str,"quad") == 0)  return(4);
    else return(0);
}

#define UCD_NORMAL	1
#define UCD_RGBA	2
#define UCD_RGB		3
#define UCD_Z		4
#define UCD_NUMDATAFIELDS	8

int 
gettype(str)
char *str;
{
    if (strcmp(str, "normal") == 0) return UCD_NORMAL; 
    else if (strcmp(str, "rgba") == 0) return UCD_RGBA; 
    else if (strcmp(str, "rgb") == 0) return UCD_RGB; 
    else return(0);
}

int
nodeidtoindex(id, v, num_nodes)
int id;
ucdvert *v;
int num_nodes;
{
    int i;
    for (i=0; i<num_nodes; ++i)	
	if (v[i].id == id) return(i);
    return(-1);
}

int
cellidtoindex(id, p, num_cells)
int id;
ucdpoly *p;
int num_cells;
{
    int i;
    for (i=0; i<num_cells; ++i)	
	if (p[i].id == id) return(i);
    return(-1);
}
main(argc, argv)	int argc; char **argv;
{
    FILE *fp = stdin;
    int num_nodes, 
	num_node_data_comp,
	*node_data_comp = NULL,
	num_cells, 
	num_cell_data_comp,
	num_model_data,
	*cell_data_comp = NULL,
	buff[5], 
	i,j,k,id,index,n, plflags = 0;
    HPoint3 *verts;
    int *nverts, *vertlist;
    Point3 *normal = NULL;
    ColorA *color = NULL;
    ucdvert *ucdv;
    ucdpoly *ucdp;
    char str[UCD_NUMDATAFIELDS][32], label[UCD_NUMDATAFIELDS][32];
    PolyList *mypl;

    {
    char *timestring;
    long mytime;
    time_t myt;
    myt = time(&mytime);
    timestring = ctime(&myt);
    fprintf(fp,"#  Created by ucdtooff on %s \n",timestring);
    }

    {
    int buff[5];
    /* get the header; fgetni skips ucd comments  */
    fgetni(fp,5,buff,0);
    num_nodes = buff[0];
    num_cells = buff[1];
    num_node_data_comp = buff[2];
    num_cell_data_comp = buff[3];
    num_model_data = buff[4];
    }

    ucdv  = OOGLNewN(ucdvert, num_nodes); 
    verts = OOGLNewN(HPoint3, num_nodes); 
    nverts = OOGLNewN(int, num_cells); 
    ucdp = OOGLNewN(ucdpoly, num_cells); 
    vertlist = OOGLNewN(int, 4*num_cells); 	/* assume no face has more than 4 vertices */
    if (num_node_data_comp)
        node_data_comp = OOGLNewN(int, num_node_data_comp);
    if (num_cell_data_comp)
        cell_data_comp = OOGLNewN(int, num_cell_data_comp);

    /* read the vertices */
    for (i=0; i<num_nodes; ++i)
 	{
	fscanf(fp,"%d%g%g%g",&ucdv[i].id,&ucdv[i].v.x,&ucdv[i].v.y,&ucdv[i].v.z);
	ucdv[i].v.w = 1.0;
	}
    /* translate the id's into indices */
    for (i=0; i<num_nodes; ++i)	{
	index = nodeidtoindex(ucdv[i].id, ucdv, num_nodes); 
	if (index < 0) OOGLError(1,"Bad node id %d in ucdtooff\n",id);
	verts[index] = ucdv[i].v;
	}

    /* read the faces */
    for (i=0; i<num_cells; ++i)	{
	fscanf(fp,"%d",&ucdp[i].id);
	fscanf(fp,"%d",&ucdp[i].m);	/* unused ? */
	fscanf(fp,"%s",str);
	ucdp[i].n = getcellsize(str);
	for (j=0; j<ucdp[i].n; ++j)
	    fscanf(fp,"%d",&ucdp[i].vlist[j]);
	}
    /* translate the id's into indices */
    {
    int total;
    for (total = 0, i=0; i<num_cells; ++i)	{
	for (j=0; j<ucdp[i].n; ++j)	{
	    index = nodeidtoindex(ucdp[i].vlist[j], ucdv, num_nodes); 
	    if (index < 0) OOGLError(1,"Bad node id %d in ucdtooff\n",id);
	    nverts[i] = ucdp[i].n;
	    vertlist[total++] = nodeidtoindex(ucdp[i].vlist[j], ucdv, num_nodes); 
	    }
	}
    }

    /* theoretically, we could get a reasonable polylist at this point */
	
    /* get the node data descriptor */
  if (num_node_data_comp != 0)  {
    fscanf(fp,"%d", &num_node_data_comp);
    for (i=0; i<num_node_data_comp; ++i)
        fscanf(fp,"%d", &node_data_comp[i]);

    /* get the node labels */
    for (i=0; i<num_node_data_comp; ++i)	{
	fscanf(fp,"%s",str+i);
	fscanf(fp,"%s",label+i);	/* this is ignored */
	}

    /* get the node data */
    for (i=0; i<num_node_data_comp; ++i)	{
	n = strlen(str[i]);
	/* get rid of commas */
  	if (str[i][n-1] == ',')  str[i][n-1] = '\0';
	switch (gettype(str[i]))	{
	    case UCD_NORMAL:
		if (node_data_comp[i] != 3)
		    OOGLError(1,"ucdtooff: bad normal descriptor\n");
		plflags |= PL_HASVN;
		normal = OOGLNewN(Point3, num_nodes);	
		for (j=0;j<num_nodes; ++j)	{
		    fscanf(fp,"%d",&id);
		    index = nodeidtoindex(id, ucdv, num_nodes);
		    if (index < 0) OOGLError(1,"Bad node id %d in ucdtooff\n",id);
		    fscanf(fp,"%g%g%g",&normal[index].x,&normal[index].y,&normal[index].z);
		    }
		break;

	    case UCD_RGBA:
		if (node_data_comp[i] != 4)
		    OOGLError(1,"ucdtooff: bad colora descriptor\n");
		plflags |= PL_HASVCOL;
		color = OOGLNewN(ColorA, num_nodes);	
		for (j=0;j<num_nodes; ++j)	{
		    fscanf(fp,"%d",&id);
		    index = nodeidtoindex(id, ucdv, num_nodes);
		    if (index < 0) OOGLError(1,"Bad node id %d in ucdtooff\n",id);
		    fscanf(fp,"%g%g%g%g",&color[index].r,&color[index].g,&color[index].b, &color[index].a);
		    } 
		break;

	    case UCD_RGB:
		if (node_data_comp[i] != 3)
		    OOGLError(1,"ucdtooff: bad color descriptor\n");
		plflags |= PL_HASVCOL;
		color = OOGLNewN(ColorA, num_nodes);	
		for (j=0;j<num_nodes; ++j)	{
		    fscanf(fp,"%d",&id);
		    index = nodeidtoindex(id, ucdv, num_nodes);
		    if (index < 0) OOGLError(1,"Bad node id %d in ucdtooff\n",id);
		    fscanf(fp,"%g%g%g",&color[index].r,&color[index].g,&color[index].b);
		    color[index].b = 1.0;
		    }
		break;
	    default:
		{
		float tt;
		fprintf(stderr,"ucdtooff: unknown type %s\n",str[i]);
		/* skip over the data */
		for (j=0;j<num_nodes; ++j)	{
		    fscanf(fp,"%d",&id);
		    for (k=0;k<node_data_comp[i]; ++k)	
			fscanf(fp,"%g",&tt);
		    }
		}
		break;
	    }	
	}
    }

    /* get the cell data descriptor */
  if (num_cell_data_comp != 0)  {
    fscanf(fp,"%d", &num_cell_data_comp);
    for (i=0; i<num_cell_data_comp; ++i)
        fscanf(fp,"%d", &cell_data_comp[i]);

    /* get the cell labels */
    for (i=0; i<num_cell_data_comp; ++i)	{
	fscanf(fp,"%s",str+i);
	fscanf(fp,"%s",label+i);	/* this is ignored */
	}

    /* get the cell data */
    for (i=0; i<num_cell_data_comp; ++i)	{
	n = strlen(str[i]);
	/* get rid of commas */
  	if (str[i][n-1] == ',')  str[i][n-1] = '\0';
	switch (gettype(str[i]))	{
	    case UCD_NORMAL:
		if (cell_data_comp[i] != 3)
		    OOGLError(1,"ucdtooff: bad normal descriptor\n");
		plflags |= PL_HASPN;
		normal = OOGLNewN(Point3, num_cells);	
		for (j=0;j<num_cells; ++j)	{
		    fscanf(fp,"%d",&id);
		    index = cellidtoindex(id, ucdp, num_cells);
		    if (index < 0) OOGLError(1,"Bad cell id %d in ucdtooff\n",id);
		    fscanf(fp,"%g%g%g",&normal[index].x,&normal[index].y,&normal[index].z);
		    }
		break;

	    case UCD_RGBA:
		if (cell_data_comp[i] != 4)
		    OOGLError(1,"ucdtooff: bad colora descriptor\n");
		plflags |= PL_HASPCOL;
		color = OOGLNewN(ColorA, num_cells);	
		for (j=0;j<num_cells; ++j)	{
		    fscanf(fp,"%d",&id);
		    index = cellidtoindex(id, ucdp, num_cells);
		    if (index < 0) OOGLError(1,"Bad cell id %d in ucdtooff\n",id);
		    fscanf(fp,"%g%g%g%g",&color[index].r,&color[index].g,&color[index].b, &color[index].a);
		    } 
		break;

	    case UCD_RGB:
		if (cell_data_comp[i] != 3)
		    OOGLError(1,"ucdtooff: bad color descriptor\n");
		plflags |= PL_HASPCOL;
		color = OOGLNewN(ColorA, num_cells);	
		for (j=0;j<num_cells; ++j)	{
		    fscanf(fp,"%d",&id);
		    index = cellidtoindex(id, ucdp, num_cells);
		    if (index < 0) OOGLError(1,"Bad cell id %d in ucdtooff\n",id);
		    fscanf(fp,"%g%g%g",&color[index].r,&color[index].g,&color[index].b);
		    color[index].b = 1.0;
		    }
		break;
	    default:
		{
		float tt;
		fprintf(stderr,"ucdtooff: unknown type %s\n",str[i]);
		/* skip over the data */
		for (j=0;j<num_cells; ++j)	{
		    fscanf(fp,"%d",&id);
		    for (k=0;k<cell_data_comp[i]; ++k)	
			fscanf(fp,"%g",&tt);
		    }
		}
		break;
	    }	
	}
    }

    {
    int cflag, nflag;
    Geom *mypl;

    if (plflags & PL_HASPCOL)  cflag = CR_POLYCOLOR;
    else if (plflags & PL_HASVCOL) cflag = CR_COLOR;
    else cflag = CR_COLOR;

    if (plflags & PL_HASPN)  nflag = CR_POLYNORMAL;
    else if (plflags & PL_HASVN) nflag = CR_NORMAL;
    else nflag = CR_NORMAL;

    mypl = GeomCreate("polylist",
                /*CR_NOCOPY,            isn't supported for polylists! */
                CR_NPOLY, num_cells,
                CR_NVERT, nverts,
                CR_VERT,  vertlist,
                CR_POINT4, verts,
                cflag, color,
                nflag, normal,
                CR_FLAG, plflags, CR_END
	 	);
    GeomFSave(mypl, stdout, NULL);
    }
}


These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.