Metropoli BBS
VIEWER: model.inc MODE: TEXT (ASCII)
/* ***********************************************************************
   *									 *
   *                         Variable Declarations	 		 *
   *									 *
   *		 Original Material by Christopher D. Watkins		 *
   *									 *
   *			     'C' conversion by				 *
   *                            Larry Sharp				 *
   *									 *
   ***********************************************************************
*/

#define NumVerticiesInFacet 4
#define MaxVertexNumInFacet 4
#define ScaleData 23000
#define ScaleImage 100

/*
#define MaxFacet 1678	     	      independant : MaxFacet  = n
#define MaxVertex 6712	     	      verticies   MaxVertex = 4 * n
*/

#define MaxFacet 3600
#define MaxVertex 3721

int LastVertex, LastFacet;
int LastVertexNumInFacet;
int VertexNum, FacetNum;
int VertexNumInFacet;
TDIA Vertex[MaxVertex+1];
static int far *Facet;

/* ***********************************************************************
   *									 *
   *	       Routines to Load and Save Vertex and Facet Data		 *
   *									 *
   ***********************************************************************

   InitVertexBuffer - clear memory for facet and vertex data
   LoadData         - load facet and vertex data
   SaveData	    - save facet and vertex data
*/

float InvScaleData, InvScaleImage;

void InitVertexBuffer()
{
  InvScaleData=1.0/ScaleData;
  InvScaleImage=1.0/ScaleImage;
  for(VertexNum=0; VertexNum<=MaxVertex; VertexNum++)
    VecNullInt(Vertex[VertexNum]);
  for(FacetNum=0; FacetNum<=MaxFacet; FacetNum++)
  {
    for(VertexNumInFacet=0; VertexNumInFacet<=MaxVertexNumInFacet; VertexNumInFacet++)
      Facet[(FacetNum*5)+VertexNumInFacet]=0;
  }
}

typedef char Name[20];

FILE *DiskFile;
Name FileName;

void LoadData(Name FileName)
{
  TDIA temp;
  int x, y, z;

  DiskFile=fopen(FileName, "r+b");
  LastVertex=getw(DiskFile);
  LastFacet=getw(DiskFile);
  LastVertexNumInFacet=getw(DiskFile);
  for(VertexNum=1; VertexNum<=LastVertex; VertexNum++)
  {
    x=getw(DiskFile);
    y=getw(DiskFile);
    z=getw(DiskFile);
    if((abs(x)>ScaleData) || (abs(y)>ScaleData) || (abs(z)>ScaleData))
    {
      printf("Error : data out of range - Vertex #%d\n", VertexNum);
      exit(1);
    }
    else
      VecInt(x, y, z, Vertex[VertexNum]);
  }
  for(FacetNum=1; FacetNum<=LastFacet; FacetNum++)
  {
    for(VertexNumInFacet=1; VertexNumInFacet<=LastVertexNumInFacet; VertexNumInFacet++)
      Facet[(FacetNum*5)+VertexNumInFacet]=getw(DiskFile);
  }
  fclose(DiskFile);
}

void SaveData(Name FileName)
{
  int x, y, z;

  DiskFile=fopen(FileName, "w+b");
  putw(LastVertex, DiskFile);
  putw(LastFacet, DiskFile);
  putw(LastVertexNumInFacet, DiskFile);
  for(VertexNum=1; VertexNum<=LastVertex; VertexNum++)
  {
    UnVecInt(Vertex[VertexNum], &x, &y, &z);
    putw(x, DiskFile);
    putw(y, DiskFile);
    putw(z, DiskFile);
  }
  for(FacetNum=1; FacetNum<=LastFacet; FacetNum++)
  {
    for(VertexNumInFacet=1; VertexNumInFacet<=LastVertexNumInFacet; VertexNumInFacet++)
      putw(Facet[(FacetNum*5)+VertexNumInFacet], DiskFile);
  }
  fclose(DiskFile);
}

typedef struct{
  int x;
  int y;
} PixelVector;

typedef PixelVector PixelArray[NumVerticiesInFacet+2];
typedef TDA VoxelArray[NumVerticiesInFacet+1];

/* ***********************************************************************
   *									 *
   *			     Draw a Wire Facet				 *
   *									 *
   ***********************************************************************

   PutWireFacet - draws a wire outline of a facet
*/

void PutWireFacet(PixelArray Pts, Byte Color)
{
  int t;

  for(t=1; t<=4; t++)
    Draw(Pts[t].x, Pts[t].y, Pts[t+1].x, Pts[t+1].y, Color);
}

/* ***********************************************************************
   *									 *
   *			    Place a Solid Facet				 *
   *									 *
   ***********************************************************************

   PutFacet - Place a Facet
*/

void PutFacet(PixelArray Face2d, Byte Color, Byte Intens)
{
  int xc, yc;
  int i, x;
  int OldVertNum;
  int VertNum;
  int mnx, mxx;
  int mny, mxy;
  float slope;

  mny=Face2d[1].y;
  mxy=Face2d[1].y;
  for(i=2; i<=LastVertexNumInFacet; i++)
  {
    if(Face2d[i].y>mxy)
      mxy=Face2d[i].y;
    if(Face2d[i].y<mny)
      mny=Face2d[i].y;
  }
  if(mny<0)
    mny=0;
  if(mxy>MaxY)
    mxy=MaxY;
  for(yc=mny; yc<=mxy; yc++)
  {
    mnx=MaxX+1;
    mxx=-1;
    OldVertNum=LastVertexNumInFacet;
    for(VertNum=1; VertNum<=LastVertexNumInFacet; VertNum++)
    {
      if((Face2d[OldVertNum].y>=yc) || (Face2d[VertNum].y>=yc))
      {
	if((Face2d[OldVertNum].y<=yc) || (Face2d[VertNum].y<=yc))
	{
	  if(Face2d[OldVertNum].y != Face2d[VertNum].y)
	  {
	    slope=(float)(Face2d[VertNum].x-Face2d[OldVertNum].x)/
		  (float)(Face2d[VertNum].y-Face2d[OldVertNum].y);
	    x=Round(slope*(float)((yc-Face2d[OldVertNum].y))+
				     Face2d[OldVertNum].x);
	    if(x<mnx)
	      mnx=x;
	    if(x>mxx)
	      mxx=x;
	  }
	}
      }
      OldVertNum=VertNum;
    }
    if(mnx<0)
      mnx=0;
    if(mxx>MaxX)
      mxx=MaxX;
    if(mnx<=mxx)
    {
      for(xc=mnx; xc<=mxx; xc++)
	PutPixel(xc, yc, Color, Intens);
    }
  }
}
[ RETURN TO DIRECTORY ]