delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1999/03/17/23:01:04

From: Matthew Heyman <kay DOT heyman AT airmail DOT net>
Newsgroups: comp.os.msdos.djgpp
Subject: 3d engine help
Date: Wed, 17 Mar 1999 21:10:58 +0000
Organization: Airnews.net! at Internet America
Lines: 81
Message-ID: <3A89A2976D50E917.6E59E2959D5860B1.4DCF6A1A868E60C5@library-proxy.airnews.net>
X-Orig-Message-ID: <36F01A62 DOT 6BD7 AT airmail DOT net>
Abuse-Reports-To: abuse at airmail.net to report improper postings
NNTP-Proxy-Relay: library2.iadfw.net
NNTP-Posting-Time: Wed Mar 17 21:11:26 1999
NNTP-Posting-Host: !`Ya:1k-V\PfF;I (Encoded at Airnews!)
Mime-Version: 1.0
X-Mailer: Mozilla 3.01C-KIT (Win95; U)
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

Hello.  I was looking at the Allegro example library and was wondering
if anybody could walk me through what happens in this piece of code from
example 25.  I know its a tall order, but any help would be appreciated. 


Matthew Heyman


void draw_square(BITMAP *bmp, MATRIX_f *camera, int x, int z)
{
   V3D_f _v[4];
   V3D_f _vout[8];
   V3D_f _vtmp[8];
   V3D_f *v[4] = { &_v[0], &_v[1], &_v[2], &_v[3] };
   V3D_f *vout[8] = { &_vout[0], &_vout[1], &_vout[2], &_vout[3],
&_vout[4],&_vout[5], &_vout[6], &_vout[7] };
   V3D_f *vtmp[8] = { &_vtmp[0], &_vtmp[1], &_vtmp[2], &_vtmp[3],
&_vtmp[4],&_vtmp[5], &_vtmp[6], &_vtmp[7] };
   int out[8];
   int flags[4];
   int c, vc;

   /* set up four vertices with the world-space position of the tile */
   v[0]->x = x - GRID_SIZE/2;
   v[0]->y = 0;
   v[0]->z = z - GRID_SIZE/2;

   v[1]->x = x - GRID_SIZE/2 + 1;
   v[1]->y = 0;
   v[1]->z = z - GRID_SIZE/2;

   v[2]->x = x - GRID_SIZE/2 + 1;
   v[2]->y = 0;
   v[2]->z = z - GRID_SIZE/2 + 1;

   v[3]->x = x - GRID_SIZE/2;
   v[3]->y = 0;
   v[3]->z = z - GRID_SIZE/2 + 1;

   /* apply the camera matrix, translating world space -> view space */
   for (c=0; c<4; c++) {
      apply_matrix_f(camera, v[c]->x, v[c]->y, v[c]->z, &v[c]->x,
&v[c]->y, &v[c]->z);

      flags[c] = 0;

      /* set flags if this vertex is off the edge of the screen */
      if (v[c]->x < -v[c]->z)
	 flags[c] |= 1;
      else if (v[c]->x > v[c]->z)
	 flags[c] |= 2;

      if (v[c]->y < -v[c]->z)
	 flags[c] |= 4;
      else if (v[c]->y > v[c]->z)
	 flags[c] |= 8;

      if (v[c]->z < 0.1)
	 flags[c] |= 16;
   }

   /* quit if all vertices are off the same edge of the screen */
   if (flags[0] & flags[1] & flags[2] & flags[3])
      return;

   if (flags[0] | flags[1] | flags[2] | flags[3]) {
      /* clip if any vertices are off the edge of the screen */
      vc = clip3d_f(POLYTYPE_FLAT, 0.1, 0.1, 4, v, vout, vtmp, out);

      if (vc <= 0)
	 return;
   }
   else {
      /* no need to bother clipping this one */
      vout[0] = v[0];
      vout[1] = v[1];
      vout[2] = v[2];
      vout[3] = v[3];

      vc = 4;
   }

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019