home *** CD-ROM | disk | FTP | other *** search
/ ftp.gamers.org / ftp.gamers.org.zip / ftp.gamers.org / pub / games / uwp-uml / game-dev / docs / rgp-faq < prev    next >
Text File  |  1993-07-04  |  41KB  |  1,077 lines

  1. Revision 0.0.5  of REC.GAMES.FAQ
  2.  
  3. This document will be made available by mail request at a later
  4. date (mail server difficulties).  You may attempt to see if this
  5. mail server works by sending to:
  6.  
  7.     aser@toz.buffalo.ny.us
  8.  
  9. I cannot be sure it's working yet,  please leave feedback on what
  10. state it is in.
  11.  
  12. There are currently 3 FAQ's
  13.  
  14. RGP.FAQ - rec.games.programmer General FAQ
  15. RGP.IBM - rec.games.ibm relevant FAQ
  16. MAZE.FAQ - FAQ about MAZE's (more of a compilation of articles)
  17.  
  18. This was done so that someone who is looking for more general
  19. information will be able to find game programing information
  20. without being inundated by IBM, other computer-SPECIFIC
  21. information, or the topsy turvey world of maze generation.
  22.  
  23. The current Editor is Cyberman@toz.buffalo.ny.us
  24.  
  25. --------------------------------------------------------------------------------
  26. REC.GAMES.PROGRAMMER     General FAQ     Contents
  27. --------------------------------------------------------------------------------
  28. LEGAL
  29.  
  30. This document is FREE!  It is for your self enlightenment.  No
  31. warranty is provided nor implied with this information. The
  32. accuracy of the information contained herein is subject to
  33. conjecture.  Therefore the editor and contributers will take NO
  34. liability for improper use, misuse, or abuse of this information,
  35. and any damage to ANYTHING or ANYONE whether physical, financial,
  36. etc. in no way, shape, or form can be attributed to this
  37. document. Use this information at your OWN risk.
  38.  
  39. The above statement is to keep those who contributed and the
  40. editor free from personal injury for being nice.
  41.  
  42. Special thanks to:
  43. andrean@cs.utexas.edu (Andre A. Nurwono)
  44. roberts@brahms.amd.com (Dave Roberts)
  45. sean@stat.tamu.edu (Sean Barrett)
  46. Cyberman@toz.buffalo.ny.us (Cyberman)
  47. (and anyone else I forgot to mention for that matter)
  48.  
  49. If you wish to contribute CODE be sure it's something you DO NOT
  50. wish to COPYRIGHT!
  51.  
  52. All contributions and suggestions should be sent to me at:
  53. Cyberman@toz.buffalo.ny.us
  54. place in subject header
  55.  
  56. RGP.FAQ.*
  57. where * is any of the following
  58.     SUGGESTION      - to suggest Adding an area (I recommend that
  59.                         you send the information if you want it
  60.                         added)
  61.     ADD             - an addition (ie TBA's [see KEY for what TBA
  62.                         means])
  63.     EDIT            - for a correction somewhere (it is suggested
  64.                         contributers do there own editing)
  65.     FLAME           - complaints - I'll read these but be sure to
  66.                         be tasteful in you commentary.  You may or
  67.                         may NOT get a reply.
  68.  
  69. For now I'm going to use my personal mail account.  So please be
  70. careful.
  71.  
  72. Format:
  73. There are several categories and each category contains it's
  74. relevant questions as suggested.
  75.  
  76. Key:
  77. TBA - To Be Added
  78.  
  79. [Frequently Asked Questions about terminology]
  80. Q1.1    What are .MOD files?
  81. Q1.2    What is a pixel?
  82. Q1.3    What is a bitmap?
  83. Q1.4    What is flicker?
  84. Q1.5    What is snow?
  85. Q1.6    What is a frame buffer?
  86. Q1.7    What is a Sprite?
  87. Q1.8    What is vertical/horizontal retrace?
  88.  
  89. [Frequently Asked Questions about Animation]
  90. Q2.1    How do I make sprites on my xxx?
  91. Q2.2    What about collision detection?             TBA
  92. Q2.3    What about bitmap scaling?                  TBA
  93. Q2.4    What is perspective mapping?                TBA
  94. Q2.5    What about 3d objects and manipulation?
  95.  
  96. [Frequently Asked Questions about Map Generation]
  97. Q3.1    How do I generate a maze?
  98. Q3.2    How do I generate a landscape/terrain?      TBA
  99. Q3.3    How do I generate a hex map?                TBA
  100. Q3.4    What about random number generators?
  101.  
  102. [Frequently Asked Questions about Libraries and support software]
  103. Q4.1    What is there for the IBM compatible?
  104. Q4.2    "    "  "     "   "   Amiga?                TBA
  105. Q4.3    "    "  "     "   "   Atari?                TBA
  106. Q4.4    "    "  "     "   "   Macintosh?            TBA
  107. Q4.5    "    "  "     "   "   Sun/Sparc?
  108. Q4.6    "    "  "     "   "   X?                    TBA
  109.  
  110. [Frequently Asked Question about Where is ...]
  111. Q5.1    Where is Joshua Jensens famous Perspective Mapping Code?
  112. Q5.2    Where else should I read?
  113. Q5.3    Where can I find out about ray traceing?
  114.  
  115. Note 1: Fixing snow and flicker
  116. Note 2: 2 Part Tutorial on 3d graphics
  117.  
  118. --------------------------------------------------------------------------------
  119. REC.GAMES.PROGRAMMER     General FAQ     Terminology
  120. --------------------------------------------------------------------------------
  121.  
  122. Q1.1    What are .MOD files?
  123.     A .MOD file is a file generated for the Amiga.  A tracker is
  124.     used to play the MOD.  A mod consists of digitized sound and
  125.     sequencing information to play music.  Here is a BRIEF and
  126.     incomplete text file that is somewhat informative on the
  127.     subject.
  128.  
  129.     Note - Joshua Jensen has written a mod player that can be
  130.     linked into your code.  So has the author of mod play.
  131.  
  132.     SEE ALSO - Mod Format specification file.  (Modform.zoo)
  133.  
  134. Q1.2    What is a Pixel?
  135.  
  136.     Pixel is short for Picture Element.  It is a single dot
  137.     address on a grid used to display images on a monitor (Tv
  138.     included).
  139.  
  140. Q1.3    What is a bitmap?
  141.  
  142.     A bitmap aka bitimage is the representation of an image in
  143.     the form of a sequence of bits.  For example most graphic
  144.     modes on computers represent the pixels using a BITMAP.
  145.  
  146. Q1.4    What is flicker?
  147.     Flicker is a noticeable pulse or change in an image.  This
  148.     can be on a CRT (Cathode Ray Tube) or other type display
  149.     device.  The cause is that the refresh rate of the CRT is
  150.     lower than the persistance of vision of the person observing
  151.     it.
  152.  
  153.     Another form of flicker is due to rapid drawing of data on
  154.     the screen.  What happens is that the data is drawn out of
  155.     syncronization with the horizontal and vertical scan.  So
  156.     your image apears to fade in and out of visability.
  157.  
  158.     SEE ALSO fixing snow and Flicker
  159.  
  160. Q1.5    What is SNOW?
  161.  
  162.     Snow are small specals on the screen that appear like SNOW
  163.     falling on the screen (hence the name).
  164.  
  165.     Snow is caused by a number of things.  One of which is when
  166.     one is writting to the screen while the display card is
  167.     scanning that address of the screen, this causes a conflict
  168.     and can produce random specals.
  169.  
  170.     Another cause of snow is an improperly connected monitor.
  171.     This can damage the monitor.  Yet another source is noise
  172.     from an electro magnetic source, if indeed it's not from
  173.     anything you own the FCC might need to be notified.
  174.  
  175.     SEE ALSO fixing snow and Flicker
  176.  
  177. Q1.6    What is a frame buffer?
  178.  
  179.     Memory that contains image data that is translated to the image
  180.     on your screen.  A frame buffer does not have to be
  181.     "visible".  Also the methode of this tranformation is not
  182.     always the same, so no effort here will be made to explain
  183.     further.
  184.  
  185. Q1.7    What is a Sprite?
  186.  
  187.     A sprite is an image usually moveable about the screen.
  188.     Common information stored in a sprite are, width, height,
  189.     position, and image data.  A sprite ussually does not effect
  190.     the screen background, this is of course dependant on
  191.     implementation.
  192.  
  193. Q1.8    What is vertical/horizontal retrace?
  194.  
  195.     Most monitors are what is called a RASTER display.  This
  196.     means that an image is represented by setting the intensity
  197.     of a grid of dots on the display.  Each dot is called a
  198.     pixel.  In order to display the grid a CRT sweeps an electron
  199.     beam across the display surface sending pulses corresponding
  200.     to the intensity of the pixel.  However the stream of video
  201.     information is almost always represented left to right top to
  202.     bottom.  This mean that the beam must scan across the screen
  203.     and then move BACK to start a line.  This is called
  204.     Horizontal retrace.
  205.  
  206.     Vertical retrace is when the beam finishes painting the
  207.     screen from top to bottom again the beam must be moved to the
  208.     top of the screen.
  209.  
  210.     The horizontal sweep is controlled by an electric field the
  211.     vertical sweep is controlled usually magnetic field.
  212.  
  213. --------------------------------------------------------------------------------
  214. REC.GAMES.PROGRAMMER     General FAQ     Animation
  215. --------------------------------------------------------------------------------
  216.  
  217. [Frequently Asked Questions about Animation]
  218. Q2.1    How do I make sprites on my xxx?
  219.  
  220.     This, unfortunately, is a rather complex problem and its
  221.     implementation is often computer-specific, however some of it
  222.     can be addressed in the general FAQ.
  223.  
  224.     Sprites require one to copy pixels to the display in a
  225.     certain area of the screen.  There are various issues that
  226.     must be addressed about this.
  227.  
  228.     Getting and Putting an image: getting means you copy a
  229.     section of a screen (bitmap) to a buffer, putting means you
  230.     dump a buffer of data (bitmap) to a screen location.  These
  231.     are often used for less sophisticated sprite animation.
  232.  
  233.     The problem with this technique is put destroys the
  234.     background information.  So if you want a background at all,
  235.     there must be a way to "overlay" an image onto it without
  236.     causing a large area around the sprite to disappear. An old
  237.     way of "fixing" this is to copy the background of an image
  238.     before you destroy it, then put the background back after you
  239.     move it.
  240.  
  241.     Another methode of sprite creation requires custome hardware
  242.     (Amiga C64 Atari 8bits).
  243.  
  244. Q2.2    What about collision detection?                 TBA
  245. Q2.3    What about bitmap scaling?                      TBA
  246. Q2.4    What is perspective mapping?
  247.  
  248.     What is it?  Basically it takes an image and "pastes" it in
  249.     3d perspective onto a surface.  This is much faster than
  250.     rendering surfaces in real time.  Article 7716 of r.g.p
  251.     written by Joshua C. Jensen (sl8nl@cc.usu.edu) is an example
  252.     of this technique (implemented in Turbo Pascal).
  253.     Unfortunately this article # may not corespond to anything in
  254.     usenet! :)  However the date it was posted was 1 Aug 92
  255.     01:36:51 GMT.  SO you can grab the coresponding articles
  256.     there! :)
  257.  
  258. Q2.5    What about 3d objects and manipulation?
  259.  
  260.     Note 2 is a pair of tutorials on this subject.
  261.  
  262.     Another suggestion is to check comp.graphics FAQ and the
  263.     comp.graphics resources guide as well.
  264.  
  265. --------------------------------------------------------------------------------
  266. REC.GAMES.PROGRAMMER     General FAQ     Map Generation
  267. --------------------------------------------------------------------------------
  268.  
  269. Q3.1    How do I generate a maze?
  270.  
  271.     This is a VERY frequently asked question in rgp so we have
  272.     a unoffical maze FAQ.  It's is now posted WITH the RGP Faq.
  273.  
  274. Q3.2    How do I generate a landscape/terrain?
  275.     Another fun filled FAQ it has too many answers.  A suggestion
  276.     is to read sci.fractals.  Now if someone would conribute some
  277.     information on this I would be happy to construct the
  278.     "land.faq".
  279.  
  280. Q3.3    How do I generate/use a hex map?
  281.     Well this has discussed considerably on rgp.  We haven't a
  282.     FAQ for it until I get permission to use something I
  283.     captured.
  284.  
  285. Q3.4    What about random number generators?
  286.     These are mandatory for making a "new" universe each time a
  287.     program loads.  Usually the ones included in a C compiler 
  288.     library are sufficient for most needs.  However sometimes one
  289.     must go the extra mile and use there own random number
  290.     generator.  Currently we have no FAQ on random number
  291.     generators.  (sorry)
  292.  
  293. --------------------------------------------------------------------------------
  294. REC.GAMES.PROGRAMMER     General FAQ     Libraries and support software
  295. --------------------------------------------------------------------------------
  296.  
  297. Q4.1    What is there for the IBM and Compatibles?
  298.  
  299.     There is a lot.  I suggest scrounging around wuarchive
  300.     personally, but here is a terse UNOFFICIAL list!
  301.  
  302.     contributed by
  303. andrean@cs.utexas.edu (Andre A. Nurwono)
  304. ==========
  305.  --------
  306.  Graphics
  307.  --------
  308.  
  309. *.  Executable
  310.     File(s) : TWEAK06.ZIP
  311.     Who     : Robert Schmidt (robert@solan.unit.no)
  312.     When    : 1992
  313.     What    : A program to experiment w/ VGA registers, very useful
  314.           if you want to define new modes (like mode X & 360x400 modes)
  315.     Where   : simtel & mirrors
  316.  
  317. *.  Executable, (source code)
  318.     File    : SPRITE.ZIP
  319.     Who     : Billy Dalrymple
  320.     When    : 1989
  321.     What    : A sprite editor, produces sprites w/ mask in files.
  322.           info available for $10
  323.           source code available for $25
  324.     Where   : I forget
  325.  
  326. *.  Executable, Source Code
  327.     File(s) : VGA.ZIP
  328.     Who     : wardt@a.cs.okstate.edu
  329.     When    : 1992
  330.     What    : A sprite editor, includes full source (.ASM & .C)
  331.     Where   : I forget 
  332.  
  333. *.  Source Code, Library
  334.     File(s) : DDJ****.ZIP, XSHARP**.ZIP
  335.     Who     : M. Abrash
  336.     When    : Aug-Dec 1991, Jun-Aug 1992
  337.     What    : Mode X introduction. Sources to do animation,
  338.           polygon plotting, anti-aliasing, etc, on Mode X.
  339.     Where   : SIMTEL and mirrors, 
  340.           ftp.mv.com (Official DDJ site) in pub/ddj
  341.  
  342. *.  Source Code
  343.     File(s) : article 7198 of rec.games.programmer
  344.     Who     : Frederick J. Haab (otto@nevada.edu)
  345.     When    : 26 Jun 92 00:17:52 GMT
  346.     What    : Scrolling in mode 13h, C program
  347.     Where   : USENET archives
  348.  
  349. *.  Source Code
  350.     File(s) : article 7716 of rec.games.programmer
  351.     Who     : Joshua C. Jensen (sl8nl@cc.usu.edu)
  352.     When    : 30 Jul 92 00:02:36 GMT
  353.     What    : Bitmap manipulation (scaling + perspective), Turbo Pascal
  354.           source w/ inline assembly.
  355.     Where   : USENET archives
  356.  
  357. *.  Source Code
  358.     File(s) : VESAVGA.ZIP
  359.     Who     : Randy Buckland
  360.     When    : 6/18/92
  361.     What    : .ASM & .C source to provide fast routines for VESA VGA modes.
  362.     Where   : garbo
  363.  
  364. *.  Sprite Library, Code
  365.     File(s) : STK110.LZH
  366.     Who     : Jari Karjala
  367.     When    : 1991 (v 1.1)
  368.     What    : Sprite library & toolkit for Hi-Res EGA, BW
  369.           includes C source, demo & good docs.
  370.     Where   : simtel & mirrors
  371.  
  372. *.  Sprite Library, Source Code
  373.     File    : SPRITES.ZIP
  374.     Who     : Marius Kjeldahl
  375.     When    : 1991
  376.     What    : Sprite library for VGA mode $13
  377.           includes TPU, .PAS source.
  378.           (shareware, $69 ?)
  379.     Where   : garbo
  380.  
  381. *.  Sprite Library, Toolkit
  382.     File(s) : WGT_SPR2.ZIP, WGT_TC21.ZIP, WGT_TP2.ZIP
  383.     Who     :
  384.     When    : 1992
  385.     What    : Shareware Sprite toolkit for VGA mode $13
  386.               includes TPU (WGT_TP2.ZIP), example programs for usage
  387.           Nag-shareware program
  388.     Where   : wuarchive, if somebody hasn't erased it yet
  389.  
  390. *.  Library (Pascal)
  391.     Files   : EGOF10.ZIP, EGOF10P.ZIP, EGOF10M.ZIP,
  392.               EGOF10B.ZIP, EGOF106.ZIP
  393.     Who     : Logi Ragnarsson
  394.     When    : 1993
  395.     What    : 256-colour graphics library for Turbo/Borland Pascal 6.0
  396.               and 7.0, VESA SVGA, Mode-X (and more), VGA/MCGA 320x200,
  397.               example programs, manual, shareware ($20).
  398.     Where   : garbo
  399.  
  400. *.  Library Source
  401.     File(s) : Xlib04c.zip
  402.     Who     : Themie Gouthas (and company)
  403.     When    : 11 Mar 93
  404.     What    : mode X library for game, to many feature to mention
  405.     Where   : pub/MSDOS_UPLOADS@wuarchive.wustl.edu
  406.  
  407.  -------------
  408.  Sound & Music
  409.  -------------
  410.  
  411. *.  Documentation
  412.     File(s) : Article 6077 of rec.games.programmer
  413.     Who     : Jeffrey S. Lee (jlee@smylex.uucp)
  414.     When    : 25 Feb 92 15:02:02 GMT
  415.     What    : Programming the AdLib/Sound Blaster FM Music Chips
  416.     Where   : usenet archives, also at the SB project site
  417.           (tybalt.cco.caltech.edu), & SB mailserver
  418.           (listserv@porter.geo.brown.edu)
  419.  
  420. *.  Executable, Runtime Library
  421.     File(s) : MODTECH.ZIP
  422.     Who     : Mark J. Cox (M.J.H.Cox@bradford.ac.uk)
  423.     When    : 1991
  424.     What    : TSR Library to play .MOD files in the background
  425.           Supports PC Speaker, SB, DisneySS, LPT DACs, etc
  426.     Where   : ftp.brad.ac.uk in /misc/msdos/mp
  427.  
  428. *.  Library
  429.     File(s) : MODOBJ.ZIP
  430.     Who     : Mark J. Cox (M.J.H.Cox@bradford.ac.uk)
  431.     When    : 1992
  432.     What    : .OBJ file w/ routines to play .MOD files in the background
  433.           Supports PC Speaker, SB, DisneySS, LPT DACs, etc
  434.           Includes examples in TC & TP
  435.           (shareware, $30)
  436.     Where   : ftp.brad.ac.uk in /misc/msdos/mp
  437.  
  438. *.  Source code
  439.     File(s) : NH10SRC.ZIP
  440.     Who     :
  441.     When    :
  442.     What    : Eliminate noise on sound samples, incl. .C source
  443.     Where   : SB project site & mailserv site
  444.  
  445. *.  Source code, Executable
  446.     File(s) : SB_OSC.ZIP
  447.     Who     :
  448.     When    :
  449.     What    : SB input scope / oscillator. Incl. .ASM source
  450.     Where   : SB project site & mailserv site
  451.  
  452. *.  Source code, Executable
  453.     File(s) : SBDAC.ZIP
  454.     Who     : Jeff Bird (cejjb@marlin.jcu.edu.au)
  455.     When    : 12 Feb 92
  456.     What    : SB DAC programming using DMA. Incl. .ASM & .C source
  457.     Where   : I forget (probably on SB project sites too)
  458.  
  459. ==========
  460.  
  461. Q4.2    "    "  "     "   "   Amiga?                TBA
  462.  
  463. Q4.3    What is there for the Atari?
  464.  
  465. from warwick@cs.uq.oz.au
  466.  
  467.     AMS library - Atari Machine Specific library
  468.       - C++ classes for Sprites, Screen, Joysticks, Double buffering, etc.
  469.       - beta testing now
  470.       - contact: warwick@cs.uq.oz.au
  471.  
  472. Q4.4    "    "  "     "   "   Macintosh?
  473.  
  474. from jmunkki@vipunen.hut.fi
  475.  
  476. *. Source code
  477.     Files   : Arashi_Source.cpt.bin
  478.     Who     : ???
  479.     When    : ???
  480.     What    : source code for an arcade quality game, vector
  481.         graphics, multichannel sound, (no sprites)
  482.     Where   : pub/mac/think-c/code@ics.uci.edu
  483.  
  484. Q4.5    "    "  "     "   "   Sun/Sparcs?
  485.  
  486.     contributed by
  487. andrean@cs.utexas.edu (Andre A. Nurwono)
  488. ==========
  489.  --------
  490.  Graphics
  491.  --------
  492. *.  Library
  493.     What    : Standard PIXRECT library
  494.           Bitmap manipulation routines for frame buffer.
  495.  
  496.  -------------
  497.  Music & Audio
  498.  -------------
  499. *.  Source code
  500.     File(s) : tracker.tar.Z
  501.     Who     :
  502.     When    :
  503.     What    : .MOD file player through the audio device. Works on SPARCS
  504.           w/ audio devices.
  505.     Where   :
  506.  
  507. *.  Source code
  508.     File(s) : csound.tar.Z
  509.     What    : FFT & signal processor
  510.  
  511. *.  Source code
  512.     What    : MixView
  513. ==========
  514.  
  515. Q4.6    "    "  "     "   "   X                     TBA
  516.  
  517.     Additions are welcome.
  518.  
  519. --------------------------------------------------------------------------------
  520. REC.GAMES.PROGRAMMER     General FAQ     FAQ's about Where is ...
  521. --------------------------------------------------------------------------------
  522.  
  523. Q5.1    Where is Joshua Jensens famous Perspective Mapping Code?
  524.  
  525.     Beats me no one has found it yet (or at least hasn't told me
  526.     they have and where to get it!) in one of the many usenet
  527.     archive sites.  Places to look are gatekeeper.com and
  528.     wuarchive.wustl.edu.  Both of these ftp sites archive usenet
  529.     news.  I suspect all the rec.games.programmer articles are on
  530.     these sites and maybe (heavem forbid) the original FAQ even.
  531.  
  532. Q5.2    Where else should I read?
  533.  
  534.     Here are SUGGESTED places you get information for things like
  535.     perspective mapping programming the SB etc.
  536.     
  537.         comp.graphics
  538.         comp.graphics.animation
  539.         comp.sys.ibm.pc.soundcard
  540.  
  541.     I suggest before posting you read ALL newsgroups a minimum of
  542.     1 week.  Ussually you will see the FAQ or where to get it.
  543.  
  544.     places suggested NOT to look for information
  545.  
  546.         comp.graphics.research
  547.  
  548.         if you want to get famed for posting off topic do it
  549.         there.  That group is for research IE new frontiers.
  550.  
  551. Q5.3    Where can I find out about ray traceing?
  552.  
  553.     Ask about POV in comp.graphics should be good for about 30 to
  554.     40 replies in your mailbox.  There are several packages
  555.     available for free and comercially.  I suggest POV because
  556.     it's free and actually quite good.  Vivid, Rayshade are just
  557.     a few of the others.  POV seems to be the most popular (and
  558.     portable also), with the most handy utilities.
  559.  
  560. --------------------------------------------------------------------------------
  561. END OF FAQ
  562.  
  563. --------------------------------------------------------------------------------
  564. REC.GAMES.PROGRAMMER     General FAQ     NOTES
  565. --------------------------------------------------------------------------------
  566.  
  567. --------------------------------------------------------------------------------
  568. NOTE 1: contributed by
  569. --------------------------------------------------------------------------------
  570. sean@stat.tamu.edu (Sean Barrett)
  571.  
  572. There are two things that qualify as flicker.  Well, hell, to make it
  573. simpler, let's call it three.  At the end of this list I'll give a
  574. rough definition of the problem.
  575.  
  576. 1)    You move a shape by erasing it and plotting it in a new position,
  577. and there is a screen refresh during the time it is erased, resulting in
  578. the background showing through.
  579.  
  580. 2)    You're using CGA and you try to write anywhere on the screen
  581. during retrace, causing "noise" (due to DMA problems, I guess?).
  582.  
  583. 3)    You're moving a shape by some sort of "one-pass" technique in which
  584. the screen memory is never set to the background temporarily, so (1)
  585. can't happen, but the screen area the shape is in is refreshed during
  586. the draw, so half of it gets displayed at the old location, and half
  587. at the new.
  588.  
  589. I think a general rule would be that flicker occurs when a pixel on
  590. the screen is displayed with a color other than the "correct" or
  591. "intended" pixel value, as compared to an ideal "intended" case.  (Thus,
  592. if you're simulating something moving, you shouldn't see the
  593. background; if you're trying to simulate something moving and
  594. turning on and off simultaneously, then you should see it; it's
  595. all a question of intent.)
  596.  
  597. Back to the above problems.
  598.  
  599. Now, so far as I know, there are only two solutions to #2.  Only redraw
  600. during the vertical retrace (blank), or don't support CGA.  So I'm going
  601. to forget about this problem.
  602.  
  603. You can handle #1, as I suggested in #3, by simply making sure you never
  604. write to the screen a value you don't want displayed.  Below I'll put a
  605. list of ways I can think of to do this for bitmapped graphics--i.e.,
  606. how to avoid the erase-redraw cycle.
  607.  
  608. If you really want to handle #3, then things get funky, and more power
  609. to you.  I don't personally believe it's a problem.  If it's periodic,
  610. so this one shape when you move it horizontally in the middle of the
  611. screen is always split with the top half leading the bottom half by
  612. a pixel, it's a problem; but if it just happens randomly once in a while
  613. I doubt it's noticeable.  In general, though, the solutions require
  614. paying attention to where the screen refresh is in some way.  My main
  615. point, the reason I'm posting this whole thing, is that *solving problem
  616. #1 does not require messing with knowing what section of the screen
  617. is being refreshed.*  As far as I know, the methods to combatting #3
  618. are to redraw everything during vertical refresh (same as #2, but
  619. overkill) or drawing your shapes from top to bottom lagging about half
  620. the time of a screen refresh behind the refresh, or some such.
  621.  
  622. Solutions to #1 that don't require timing considerations, e.g., how
  623. never to write a wrong pixel to the screen.
  624.  
  625.   o    Don't use raw bitmaps, use sprite hardware.
  626.  
  627.   o    Use hardware page flipping: display one screen, draw a new
  628.     screen "off-screen" and when it's finished, direct the
  629.     display hardware to display the new one.  This can get messy
  630.     for fast animation because you have to keep track of where
  631.     sprites were the last two frames to erase and update them.
  632.  
  633.   o    Use software page flipping; display one screen, draw a new
  634.     screen "off-screen" and when it's finished, copy the new
  635.     screen into screen memory.
  636.  
  637.   o    Use techniques such as "store" sprites which overwrite the
  638.     background.  Generally an out-of-date technique now, though;
  639.     only works for mono-color backgrounds.  You simply write the
  640.     sprite onto the screen; the sprite has enough border around
  641.     it to overwrite its previous image.  This is gross, very
  642.     fast, and flicker-free except when shapes get on top of each
  643.     other, at which point you get massive flicker.
  644.  
  645.   o    Use scratch-pad calculations, a variant of software page flipping.
  646.     Copy the section of the screen off that you need to update,
  647.     update it offscreen, and put it back on the screen.  A lengthy
  648.     time ago I posted a discussion of how to do this effectively
  649.     for XOR-style graphics for 8-bit type machines--you can xor
  650.     a single image onto the screen that both erases and replots
  651.     in a new place the old sprite.  And you can calculate the
  652.     image to do it on the fly, without additional memory, if you
  653.     set up your shape tables, and it's faster than the normal
  654.     draw shape with XOR to erase, draw shape with XOR to plot cycle
  655.     because it only reads and writes screen memory once.
  656.  
  657. Performance enhancements for bit blitting:
  658.  
  659.   o    Unroll loops.
  660.  
  661.   o    Write a custom bit blit for each shape, dedicated to that shape.
  662.     Cuts your memory accessing down if the machine has an
  663.     "immediate" operand mode that's faster than an index-addressed
  664.     one.
  665.  
  666. Memory performance enhancements for techniques that require many copies
  667. of shapes or large routines (such as pre-shifted shape tables):
  668.  
  669.   o    If you're only using some of your shapes at any point in time
  670.     (e.g. if you can divide your display up into "scenes"; for a
  671.     certain period of time only these shapes are used), calculate
  672.     the "larger" derived tables on the fly when the scene starts
  673.     up.  For large games (this is rec.games.programmer, not
  674.     rec.graphics.programmer, right?) that have to access the disk
  675.     anyway to change scenes, this is no big time loss.  Also, if
  676.     you write the code right then while you're idling the processor
  677.     before starting work on the next display, you can do this stuff
  678.     then.
  679.  
  680. --------------------------------------------------------------------------------
  681. NOTE 2: contributed by
  682. --------------------------------------------------------------------------------
  683. sean@stat.tamu.edu (Sean Barrett)
  684.  
  685. 3D graphics: Using matrices and vectors        Part 1
  686.  
  687.  
  688. -  Allows you to independently rotate objects and move the camera
  689.    anywhere.
  690. -  Does not discuss clipping.
  691. -  Algorithm uses 9 multiplies, 2 divides, and 9 additions per point,
  692.    plus overhead per independently located object.
  693. -  Part 2 gives the derivation for these formulas.
  694.  
  695.  
  696. Assume a right-handed universe, with x horizontal, y
  697. depth, and z vertical, and a screen display unit with
  698. x horizontal to the right and y vertical downward.
  699.  
  700.  
  701. The following are the rotation matrices:
  702.  
  703.     Rx(t)            Ry(t)            Rz(t)
  704. __                  __  __                  __  __                  __
  705. | 1    0      0    0 |    | cos(t) 0 -sin(t) 0 |    |  cos(t) sin(t) 0 0 |
  706. | 0  cos(t) sin(t) 0 |    |    0   1    0    0 |    | -sin(t) cos(t) 0 0 |
  707. | 0 -sin(t) cos(t) 0 |    | sin(t) 0  cos(t) 0 |    |    0        0    1 0 |
  708. | 0    0      0    1 |  |    0   0    0    1 |  |    0      0    0 1 |
  709. --                  --  --                  --  --                  --
  710.    rotate about x       rotate about y       rotate about z
  711.  
  712.  
  713. The following is the translation matrix:
  714.  
  715.   T(a,b,c)
  716. __       __
  717. | 1 0 0 a |
  718. | 0 1 0 b |
  719. | 0 0 1 c |
  720. | 0 0 0 1 |
  721. --       --
  722.  
  723. Let each object be a collection of points or lines.  If lines, they
  724. are drawn as lines connecting two 3D points, which can each be
  725. individually transformed.  So this derivation just handles converting
  726. individual points in three-space into pixel coordinates.
  727.  
  728. ---- BEGIN FORMULAS ----
  729.  
  730. If d is the distance from the eye to the window, h is the width
  731. of the window, v is the height of the window (use the sizes
  732. of the actual display if you don't know what else, but this is
  733. actually referring to the virtual camera's window); num_x
  734. is the number of pixels on the display in the x direction, num_y
  735. the number of pixels in the y direction, and (center_x,center_y)
  736. the location of the center of the display; 
  737.  
  738. let scale_x = d/h*number_of_x_pixels, scale_y = d/v*number_of_y_pixels.
  739.  
  740. Then let S be defined as
  741. __                           __
  742. | scale_x center_x    0     0 |
  743. |   0        1        0     0 |
  744. |   0     center_y -scale_y 0 |
  745. |   0        0        0     1 |
  746. --                           --
  747.  
  748. Let the camera be located at (cx,cy,cz).  Let the vector E be pointing
  749. in the direction the camera is facing, the vector D be pointing to
  750. the right (along the camera's x axis), and the vector F be pointing
  751. up (along the camera's z axis); and let D, E, and F be of length 1.
  752. Then define the following matrices:
  753.  
  754.    matrix J        matrix C
  755. | Dx Dy Dz 0 |  | 1 0 0 -cx |
  756. | Ex Ey Ez 0 |  | 0 1 0 -cy |
  757. | Fx Fy Fz 0 |  | 0 0 1 -cz |
  758. | 0  0  0  1 |  | 0 0 0  1  |
  759.  
  760. and let N = S*J*C.
  761.  
  762.  
  763. Let each object i be at location cix, ciy, ciz, and let the matrix
  764. which holds the current rotation for that object be O(i).  To rotate
  765. the object around the q axis by n degrees, let new O(i) = Rq(n) * O(i).
  766. To rotate the object about *its* q axis, let new O(i) = O(i) * Rq(n)
  767. (I think.  I haven't looked at this closely, so it's probably wrong).
  768.  
  769. Let Otemp(i) be O(i) with the rightmost column of zeros replaced by
  770. cix, ciy, and ciz, or in other words, the product of Temp(i)*O(i) where
  771. Temp(i) is
  772. __         __
  773. | 1 0 0 cix |
  774. | 0 1 0 ciy |
  775. | 0 0 1 ciz |
  776. | 0 0 0  1  |
  777. --         --
  778.  
  779. Now, for each object i let M = N * Otemp(i).
  780.  
  781. Now, for each point P in i, let V = M * P, that is:
  782.  
  783.     Vx = M[0,0]*Px + M[0,1]*Py + M[0,2]*Pz + M[0,3];
  784.     Vy = M[1,0]*Px + M[1,1]*Py + M[1,2]*Pz + M[1,3];
  785.     Vz = M[2,0]*Px + M[2,1]*Py + M[2,2]*Pz + M[2,3];
  786.  
  787. Then the pixel to plot to is:
  788.  
  789.     If Vy>0
  790.         (Vx/Vy, Vz/Vy)
  791.  
  792. Done.
  793.  
  794. -- 2 --
  795.  
  796. 3D graphics: using matrices and vectors        Part 2
  797.  
  798. -  Allows you to independently rotate objects and move the camera
  799.    anywhere.
  800. -  Does not discuss clipping.
  801. -  Algorithm uses 16 multiplies, 2 divides, and 12 adds for each point,
  802.    plus overhead per independently located object.  Also shows how some
  803.    of the calculations are wasted, and reduces it to 9 multiplies and 9
  804.    additions.
  805.  
  806.  
  807. The folowomg is a derivation of some of the math for using 3D
  808. graphics with matrices and vectors.  I don't see any way of
  809. explaining how to use the matrix formulas without all the extra
  810. context, so you'll have to wade through it.  In general, you can
  811. simplify things by multiplying out the matrices and similar
  812. techniques.
  813.  
  814. You have a world described by three dimensional coordinates--it
  815. could be lines or points or polygons, whatever.  You have an
  816. imaginary camera in this world, and you want to draw exactly
  817. what this camera would see.
  818.  
  819. We represent the camera as a point where an "eye" is and a window
  820. through which it's looking--that is, a point for the eye, a vector
  821. from the eye to the center of the window, and another vector to tell
  822. us which way is the up direction on the window.  We can figure out
  823. the sideways direction of the window by taking a cross-product, but
  824. it may be better to represent it explicitly, as discussed far
  825. eventually below.
  826.  
  827. What we want to know is where on our screen we should plot a
  828. particular point.  The solution is to figure out where on the
  829. imaginary window the point would appear to be, and then to map
  830. the window onto our screen.
  831.  
  832. Suppose the eye is at the origin, facing along the X axis, and
  833. the point is in the XY plane so we can only look at two dimensions
  834. for illustration purposes.
  835.  
  836. Y axis
  837.  |                ___---
  838.  |          ___---
  839.  |    ___--- |           Point
  840.  | ---       |
  841. eye----------+------------------  X axis
  842.    ---___    |
  843.          ---_|_
  844.         window ---___
  845.                      ---___
  846.  
  847. Suppose the window ranges from (d,h/2) to (d,-h/2) and the point is at
  848. (a,b).  We want to know where the line from the point to the eye
  849. intersects the window line.  Well, the point is only visible if
  850. it's in front of the eye, so assume a>0.  Now, the two lines are
  851.  
  852.     y = (b/a)*x        (from Point to eye)
  853. and    x = d            (line window is on)
  854.  
  855. So the location of intersection is (d,(b/a)*d).  In other words,
  856. the point appears on our imaginary window with horizontal position
  857. d*b/a if |d*b/a| <= h/2.
  858.  
  859. Thus, the quick and dirty 3d graphics formula for assuming an eyepoint
  860. at the origin, X horizontal, positive to the right, Y vertical, positive
  861. up, and Z depth, positive going into the distance (this is a left-handed
  862. universe, whereas the rest of the derivations will be for a right handed
  863. universe), and screen coordinates sx horizontal, positive to the right
  864. sy vertical, positive down, is:
  865.  
  866.     if (Z>0) then
  867.         sx = x_scale * X / Z + x_center;
  868.         sy = - y_scale * Y / Z + y_center;
  869.     endif
  870.  
  871. where x_center, y_center is the pixel address of the center of the
  872. screen; x_scale is d/h*number_of_pixels_horizontally and y_scale is
  873. d/v*number_of_pixels_vertically; d is the distance between the eye
  874. and the window in the imaginary camera, h and v are the height and
  875. width respectively of the imaginary window.
  876.  
  877. Ok, back to the messy stuff.  Since our eyepoint won't necessarily
  878. be at the origin and facing in the right direction, we need to be
  879. able to handle arbitrary translations and rotations.  In general,
  880. to rotate (a,b) into (a',b') based on a given angle t, we do
  881.  
  882.     a' = cos(t)*a + sin(t)*b;
  883.     b' = cos(t)*b - sin(t)*a;
  884. (or switch the signs depending on which way you want to define as
  885. the positive direction of rotation).
  886.  
  887. Now, to cleanly handle multiple rotations, we want to use matrices
  888. to handle this.  This is the same as
  889.  
  890.     | cos(t) sin(t)|  |a| _ |a'|
  891.     |-sin(t) cos(t)|  |b| - |b'|
  892.  
  893. that is, a 2x2 matrix times a 2x1 matrix gives a 2x1 matrix.  Now
  894. to handle an arbitrary 3D rotation, we need to rotate on any axis:
  895.  
  896.    rotate about x       rotate about y       rotate about z
  897.  
  898. | 1    0      0    |    | cos(t) 0 -sin(t) |    |  cos(t) sin(t) 0 |
  899. | 0  cos(t) sin(t) |    |    0   1   0     |    | -sin(t) cos(t) 0 |
  900. | 0 -sin(t) cos(t) |    | sin(t) 0  cos(t) |    |    0        0    1 |
  901.  
  902. Now, to rotate about a particular point, we have to translate to that
  903. point.  Say we want to rotate about (d,e,f).  Then we subtract (d,e,f)
  904. from our point, rotate, and then add (d,e,f) again.  It would be nice
  905. if we could do that automatically with the matrices, and there is a way
  906. to, a cute trick.  We switch from 3x3 matrices to 4x4 matrices, and use
  907. 4-vectors.  For the rotation matrices, the new elements are all zero,
  908. except the bottom right one which is 1; for example:
  909.  
  910. |  cos(t) sin(t) 0 0 |
  911. | -sin(t) cos(t) 0 0 |
  912. |    0      0    1 0 |
  913. |    0      0    0 1 |
  914.  
  915. Also, all of our vectors have a fourth element, which is always 1.
  916. (In programming this, you can just continue to use three-vectors and
  917. program the 'multiply matrix by vector routine' to pretend there's
  918. one there.)  Now, to do a translation we want:
  919.  
  920.     x' = x + k1;
  921.     y' = y + k2;
  922.     z' = z + k3;
  923.  
  924. It turns out that this does the trick:
  925.  
  926. | 1 0 0 k1 |  | x |
  927. | 0 1 0 k2 |  | y |
  928. | 0 0 1 k3 |  | z |
  929. | 0 0 0 1  |  | 1 |
  930.  
  931.  
  932. Now, let's define some matrix terms so we can compress our notation.
  933. Let Rx(t), Ry(t), and Rz(t) be the 4x4 rotation matrices, and let
  934. T(k1,k2,k3) signify the appropriate matrix as above.  To rotate a point
  935. (a,b,c) theta around the y axis at point (d,e,f), we do the following
  936. in sequence: T(-d,-e,-f), Ry(theta), T(d,e,f).  Now, one nice thing
  937. about matrices is that we can get the effect of sequential application
  938. by multiplying matrices; that is, if U = (a,b,c,1) and V=(a',b',c',1),
  939. then do  T(-d,-e,-f)*U, and take that and do Ry(theta)*that, and take
  940. this and do T(d,e,f)*this, giving V, then this is:
  941.  
  942.     T(d,e,f) * ( Ry(theta) * ( T(-d,-e,-f) * U ) ) ) = V
  943.  
  944. Since matrix operations are associative, this is the same as
  945.  
  946.     T(d,e,f) * Ry(theta) * T(-d,-e,-f) * U = V
  947.  
  948. or, in other words, let M = T(d,e,f)*Ry(theta)*T(-d,-e,-f), then
  949. M is a matrix which performs the rotation we desire.
  950.  
  951. Ok, now to wrap it all up.  Suppose we have a bunch of objects in
  952. 3D we want to display, and the aforementioned camera.  The camera
  953. is at (cx,cy,cz), and we have a vector E pointing in the direction
  954. the camera is aiming, a vector D which shows which way the window
  955. is pointing to the right, and a vector F which points along the window
  956. upward.  These vectors form an orthonormal basis, so to rotate into
  957. the frame of reference for them we use the matrix
  958.  
  959. | Dx Dy Dz |
  960. | Ex Ey Ez |
  961. | Fx Fy Fz |
  962.  
  963. also, we want to use 4x4 matrices and first we want to translate
  964. to cx..cz, so we use
  965.  
  966.    matrix J        matrix C
  967. | Dx Dy Dz 0 |  | 0 0 0 -cx |
  968. | Ex Ey Ez 0 |  | 0 0 0 -cy |
  969. | Fx Fy Fz 0 |  | 0 0 0 -cz |
  970. | 0  0  0  1 |  | 0 0 0  1  |
  971.  
  972. So for an arbitrary point (a,b,c) in three space, the screen coordinates
  973. for it sx, sy are:  let U = (a,b,c,1); let V = J*C*U.  Then
  974.  
  975.     if (Vy>0) then
  976.         sx = scale_x * Vx/Vy + center_x;
  977.         sy = - scale_y * Vz/Vy + center_y;
  978.     endif
  979.  
  980. Generally, we want to store J and C separately.  It is pretty simple
  981. to move the camera, now; if the camera is always moving in the direction
  982. its facing, use the E vector and factor direction in by hand, and
  983. put this into C.  To rotate the camera, just multiply a rotation
  984. matrix on the left by J.
  985.  
  986. Now, to rotate objects properly, keep a separate rotation matrix
  987. for each object.  Then for each point in that object, rotate it and
  988. translate it.  It's simplest to store each object with the origin
  989. as the center of the object.  Then to calculate a point, you multiply
  990. by the rotation matrix and then by the translation to put the objects
  991. center where it should be in world space; because you're doing the
  992. translation second, it's easy to put it into one matrix:
  993.  
  994. translation    rotation
  995. | 1 0 0 l |   | a b c 0 |   | a b c l |
  996. | 0 1 0 m |   | d e f 0 | _ | d e f m |
  997. | 0 0 1 n | * | g h i 0 | - | g h i n |
  998. | 0 0 0 1 |   | 0 0 0 1 |   | 0 0 0 1 |
  999.  
  1000. Call this matrix O(q) where q is the object number.
  1001.  
  1002. Then, for each point in object q, the final multiply is
  1003. V = J * C * O(q) * U.
  1004.  
  1005. Finally, we can move some of the final calculation into a matrix.
  1006. We have:
  1007.     sx = scale_x * Vx/Vy + center_x;
  1008.     sy = -scale_y * Vz/Vy + center_y;
  1009.  
  1010. If we factor out Vy, we get
  1011.     sx = (scale_x * Vx + center_x * Vy)/Vy;
  1012.     sy = (-scale_y * Vz + center_y * Vy)/Vy;
  1013.  
  1014. Suppose from V we calculate V':
  1015.     (scale_x*Vx + center_x*Vy, Vy, -scale_y*Vz + center_y*Vz, 1)
  1016.  
  1017. Then
  1018.     sx = V'x / V'y;
  1019.     sy = V'z / V'y;
  1020.  
  1021. Well, to get V', we just multiply V by the matrix
  1022.  
  1023. | scale_x center_x    0     0 |
  1024. |   0        1        0     0 |
  1025. |   0     center_y -scale_y 0 |
  1026. |   0        0        0     1 |
  1027.  
  1028. Let us call this matrix S.  Remember, scale_x = d/h*number_of_x_pixels,
  1029. scale_y = d/v*number_of_y_pixels, d is distance from eye to window,
  1030. h is width of imaginary screen, v is height of imaginary screen.
  1031.  
  1032. So, now, the basic idea is this.  To minimize calculation, let 
  1033. N = S * J * C.  For each object q, let M = N * O(q).  For every point
  1034. U in q, let V = M * U.  If Vy>0, then that point is at (Vx/Vy,Vz/Vy)
  1035. on the screen.
  1036.  
  1037. In pseudo-code, that's
  1038.  
  1039. /* matrix_multiply (destination, left_multiplicand, right_multiplicand) */
  1040.  
  1041. for each time slice do
  1042.     if camera has moved then
  1043.         matrix_multiply ( N, J, C);
  1044.         matrix_multiply ( N, S, N);
  1045.     endif
  1046.  
  1047.     for q an object do
  1048.         matrix_multiply( M, N, O[q]);
  1049.         for p a point in object q do
  1050.             matrix_by_vector_multiply( V, M, U[q][p]);
  1051.             do something with  ( V[0]/V[1], V[2]/V[1] );
  1052.         endfor
  1053.     endfor
  1054. endfor
  1055.  
  1056. In truth, the matrix_by_vector_multiply wastes a bit of time, if you're
  1057. trying to tune the code, it'd be worth tuning it.  Normally, it does
  1058. this:
  1059.  
  1060. V0 = M00*U0 + M01*U1 + M02*U2 + M03*U3;
  1061. V1 = M10*U0 + M11*U1 + M12*U2 + M13*U3;
  1062. V2 = M20*U0 + M21*U1 + M22*U2 + M23*U3;
  1063. V3 = M30*U0 + M31*U1 + M32*U2 + M33*U3;
  1064.  
  1065. However, we know that the bottom row is never used, since V3 is always
  1066. 1; furthermore, we know that U3 is 1, so we can just do
  1067.  
  1068. V0 = M00*U0 + M01*U1 + M02*U2 + M03;
  1069. V1 = M10*U0 + M11*U1 + M12*U2 + M13;
  1070. V2 = M20*U0 + M21*U1 + M22*U2 + M23;
  1071.  
  1072. This uses nine multiplies and nine adds, plus the two divides required
  1073. to calculate the screen coordinate.  I believe this is the minimum
  1074. possible for arbitrary 3D graphics.  (You can turn the two divides into
  1075. one divide and two multiplies by calculating 1/Vy and multiplying by
  1076. that, which may be a win on some machines.)
  1077.