home *** CD-ROM | disk | FTP | other *** search
/ Boot Disc 15 / boot-disc-1997-11.iso / 3Dfx / GrndBleu / README.TXT < prev    next >
Text File  |  1997-08-26  |  18KB  |  393 lines

  1. /******************
  2.     GRAND BLEU
  3. ******************/
  4.  
  5. Underwater demo with Dolphins, sharks, turtles, fish.
  6. This demos demonstrates the use of textures multiplications 
  7. (in one pass on 2TMUS boards, and 2 passes on 1TMU boards) to
  8. render water-reflections effects on the entire scene (terrain
  9. and objects).
  10.  
  11.  
  12. SYSTEM REQUIREMENTS
  13. -------------------
  14. A Pentium 90MHz & up with either a 1 TMU board (like the Rightous 3D
  15. from Orchyd or the Monster 3D from Diamond) or a 2 TMU board (Amethyst
  16. board).
  17. By default, Grand Bleu builds the 1TMU version, but you can edit the
  18. makefile and uncomment the line
  19. #TWO_TMUS=1
  20. and rebuild for 2TMUS.
  21.  
  22. Memory: if you have less than 32Mb than flipper might not have some
  23. difficulty loading the soundtrack. In that case, start flipper with
  24. the -nosound option.
  25.  
  26.  
  27. Running the demo
  28. ----------------
  29. run flipper.exe.
  30. There are some options available, see more details below.
  31.  
  32.  
  33. Controls
  34. --------
  35. You can press F1 at any time during the demo to get a help screen.
  36.  
  37. Press 8 to toggle between user controlled camera and automatic camera
  38. mode. The automatic camera mode follows the animals in the scene.
  39. Each time the SPACE BAR is pressed, the camera will switch to a new animal.
  40. For each animal, there is a set of predefined automatic camera positions:
  41. you can skip through these by pressing CTRL and SPACE at the same time.
  42.  
  43. When you are on User controlled mode, you should, by default, get attracted
  44. to the ground. Press G to stop the Gravity.
  45. To more around, you can either use the joystick or the keyboard.
  46. Use the Up and down keys to move forward/backward.
  47. Use the Right and Left (arrow) keys to rotate right and left.
  48. Use the SHIFT key with Up and Down to look up and down.
  49. Use the CTRL key with Up and Down to translate up and down.
  50. Use the CTRL key with Right and Left to translate right and left.
  51.  
  52. F8 will freeze all the animals. Press F8 again to unfreeze the animals.
  53.  
  54. CTRL+S will remove the lower right 3Dfx demo.
  55.  
  56. F switches through 3 different screen formats.
  57.  
  58. Press the ESCP key to quit the demo.
  59.  
  60.  
  61. Bugs
  62. ----
  63. Sometimes the camera goes a bit wild, and gets lost in space. Try to switch
  64. back and forth between the automatic camera mode and the user controlled mode
  65. (by pressing key 8) and by switching from one animal to the other (space bar).
  66. If nothing happens, then exit and restart.
  67.  
  68. The capability to turn off mipmapping and bilinear filtering have been disabled
  69. in that version of Grand Bleu.
  70.  
  71.  
  72.  
  73.  
  74. Some usefull environment variables for recompiling
  75. ---------------------------------------------------------
  76.  
  77. - TWO_TMUS=1:   if that variable is set to 1, the demo is compiled with the code
  78.                 that uses the 2 TMUS of an Amethyst board (recommended). If the 
  79.                 variable is not set, the demo is compiled for a one TMU system 
  80.                 (slower because the projected texture is done in 2 passes instead of one).
  81.  
  82.                 
  83. - ATBSOUND=1 :  use of ATA (The Arcade ToolBox Audio Library) for playing sound.
  84.                 ATA is based on DirectSound, so you need to have DirectX installed
  85.                 on your machine.
  86.  
  87. - FX_NO_DEMO_HELP=1: prevents the recompilation of the help and start screen files.
  88.             The first time you compile flipper, make sure this variable is not set to 1.
  89.             The obj files for the help and start screen have to be generated at least once.
  90.             The help and start screen files take about 5 minutes to compile on a 166.
  91.             Since the help is not meant to be changed too often, the FX_NO_DEMO_HELP offers
  92.             the possibility to avoid recompiling the help and start screen files
  93.             (the compilation reuses the current .obj file) each time a little modification
  94.             is made to the makefile or each time you want to make a full 
  95.             (except for the help) recompilation of flipper.
  96.  
  97. - MSVC41=1: set this variable to 1 to make sure that the msvc compiler does not choke during
  98.             the comilation of the help files. These are pretty big and requires the stack to
  99.             be increased quite a bit.
  100.  
  101.  
  102. - XHEAD:    set this variable to 1 to build for multi head. look at the makefile to make sure
  103.             that the variable is not overwritten by some default value. See XHEAD section 
  104.             below for details on how to operate.
  105.  
  106. - NONBLOCKING: set this variable to 1 to build the multi-head version with nonblocking socket
  107.                 calls. This was the original code, which was working fine with win95 machines
  108.                 but seemed to fail on one of the NT machines we had. (it appeared that each
  109.                 call to select() (for checking if there was something to read on the socket,
  110.                 using a small timeout) was very expensive on the NT machine. So, the code
  111.                 was modified to use blocking recvfrom() calls. This makes the whole lockstep
  112.                 mechanism a lot less flexible and almost unrecoverable in case of packet miss
  113.                 (either a loss or an out of order event), because the protocol is completly
  114.                 frozen in linear calls to send() and recvfrom. But again, the XHEAD demo
  115.                 is supposed to be running on a dedicated LAN, where misses should be
  116.                 almost inexistant especially given the size of our messages and
  117.                 the frequency at which there are sent (about 6 total messages on the
  118.                 network per frame. At 60Hz that's about 360 messages/sec.
  119.                 At that rate their should -almost- never be any misses happening.
  120.                 
  121.  
  122.            
  123. Notes: 
  124.  
  125. 1. The default makefile compiles for 1TMU with Sound.
  126.  
  127. 2. Flipper uses a modified version of one of the Arcade ToolBox libraries, namely atr.lib.
  128.    It is included in the project, and is linked with in place of the regular atr.lib.
  129.  
  130.  
  131.  
  132. Files
  133. -----
  134. t1.dat is the files that contains info about the terrain to generate.
  135. see the Terrain Generation paragraph below.
  136.  
  137.  
  138. MISC
  139. ----
  140. Note that the kind of projected texture used in that demo is of the planar kind. This means that
  141. we do not need to specify a projection origin. There is a bit of code commented out that can be
  142. used for doing a positional projected texture, in which case you need to specify a Projector location.
  143.  
  144.  
  145. There are a few places where coded is enclosed in a pair of:
  146. #if 0
  147. #endif
  148. which means that the code is never compiled and does not contribute to the demo.
  149. Usually, these piece of code were left overs from previous version, and they
  150. show how to do things differently. There were left FYI.
  151.                 
  152.  
  153. No more go.bat file
  154. -------------------
  155. Please, note that there is no need for a batch file anymore to start Grand Bleu.
  156.  
  157.  
  158. Output
  159. ------
  160. Since Flipper has become a Windows application, the problem of being able to do *SIMPLE*
  161. output araised. I mean, just being able to do a simple printf(), which is pretty usefull
  162. when debugging. Some might like the Windows' message box, but I just hate it.
  163. So, when Flipper is compiled as a WIN32 application, a Dos Console is allocated which
  164. allows us to do good old formatted output.
  165. Here is how to do output to this console:
  166.  
  167. whenever you feel like doing:
  168.  
  169. printf( "Debug level %d, height = %f \n", gDebugLevel, height );
  170.  
  171. do the following:
  172.  
  173. #include "grutil.h"
  174. char    *message[MAX_MESSAGE];
  175.  
  176. sprintf( message, "Debug level %d, height = %f \n", gDebugLevel, height );
  177. printC( message );
  178.  
  179.  
  180. It is a bit more combersome but it is better than nothing. 
  181. If the application is compiled as a DOS app (with which it is possible to do regular
  182. printf() ), the printC() stays compatible (it will just translate to a regular
  183. printf() ).
  184.  
  185.  
  186.  
  187. High and low resolution dolphins
  188. --------------------------------
  189. There are 2 models for the dolphin. A low count poly one (~500 triangles) and a high res one
  190. (~1500 triangles). Whenever a dolphin becomes the target of the automatic camera, the model
  191. is switched from low res to high res. When the camera jumps to another target, the previous
  192. target (if it was a dolphin) is switched back to a low res model, and the next target, (if
  193. it is a dolphin) is switched from low res to high res.
  194.  
  195.  
  196. UpdateRate optimization
  197. -----------------------
  198. This demo experiments with the concept of entity update rate optimization.
  199. The idea of "Do a full update of the entity only every over updateRate frames".
  200. The idea is to do a less computation by not doing a complete update
  201. at each frame. That's kind of related to the concept of level
  202. of detail of behaviour, except that in this case, it is FULL-UPDATE
  203. or NO-UPDATE at all, and that it is controlled by a updateRate rather
  204. than things like "distance from the viewer" or "is in the view frustrum".
  205. Well, it turns out that it makes almost no difference in the frame rate. :-(
  206. I was hoping that turning the gOptimizeUpdate on would show a big improvment
  207. in the frame rate but it does not. The good thing about that is it means that
  208. the bottleneck is not in the player&animals code but probably in the
  209. transformation/projection/lighting/scene management libraries.
  210. Please see the "Optimizations" section below.
  211.  
  212.  
  213. Terrain Generation
  214. ------------------
  215. Flipper's terrain is generated at runtime.
  216. It uses a ppm file is interprated as a height field.
  217. For each pixel in the ppm file:
  218.     the red component defines the height of the terrain
  219.     the green component defines which texture map is associated to it.
  220.     (the bleu component is ignore).
  221. The terrain is divided into sub-meshes of size STEP*STEP. (look for the variable
  222. "step" in terrain.c:buildTerrainFromPPM() ).
  223. Be carefull: if you want to use a new PPM file, the size of the image must be
  224. a multiple of STEP, plus 1. It is alos expected that the ppm image is square.
  225. In other words:
  226. if ppm.width = ppm.height = L
  227. then we have the relation :
  228. L = N * STEP + 1
  229. where N is an integer > 0
  230. More on STEP:
  231. STEP is indeed directly related to the textures used for the terrain.
  232. Also, the terrain creation process uses a configuration file, in this example, called t1.dat.
  233. The configuration file can have any name, just make sure you fill in the correct field
  234. of the terrain structure with the right filename before calling the function that constructs
  235. the terrain (buildTerrainFromPPM()).
  236. That configuration file must contain the following info:
  237. the ppm fileanme that will be use to generate the height map
  238. the number of textures used for the terrain
  239. the name (path included) of the textures (these are *.3df files) followed by 
  240. a green color code.
  241. The green color code will be used to uniquely identify which texture each point
  242. in the height field gets its color from.
  243. WARNING: there is a little art challenge here. The different textures has to be 
  244. assigned in square patterns into the green channel of the pppm image, the size
  245. of the square being also STEP*STEP. In other words, a texture is applied in
  246. adjacent patterns of STEP*STEP. Note: since the ppm's size is L = STEP*N + 1, this means
  247. that there will be a line and row of pixel left with no texture info. Just duplicate
  248. the last value.
  249.  
  250. ALSO: boundaries issues. Because the terrain is tiled, one has to make sure that
  251. the edges of the ppm file are continuous (in a 2 pixel wide area), otherwise tearing
  252. might appear where edge meshes are displayed.
  253.  
  254. Generation of the ppm file:
  255. The original height map was a tga file worked through Adobe Photoshop, which
  256. is pretty at letting one work on the different channels of an RGB image.
  257. Then, the tga file was imported in PaintShopPro where it was saved directly
  258. into a ppm (binary) format. 
  259.  
  260.  
  261. Optimizations
  262. -------------
  263. A lot could be done to optimize Flipper. 
  264. First, there is a lot of floor() in the code that is used to convert correctly
  265. a float into an integer. With a few shifts, it should be possible to achieve the
  266. desired results for a fraction of the cost of floor.
  267. I also use some cos() and sin(). These are expensive. I started to write the code
  268. for using cos and sin look up tables but I didn't have the time to finish it.
  269.  
  270. Since its first implementation, Grand Bleu went through a few modifications
  271. in order to improve performances. Originaly designed for a Pentium P6 (200 MHz)
  272. and a 2TMU system, performance became an issue when we decided to port it
  273. for a 166MHz and 1TMU board.
  274. Here are the optimizations that made that port possible:
  275.  
  276. - sorting the Terrain submeshes by material.
  277. The terrain is subdivided into submeshes, which are then tiled
  278. to fill in the field of view. Each submesh has its own material.
  279. It used to be that each time the terrain was drawn, for each
  280. submesh, a material was pushed, the submesh was drawn and the
  281. material was poped before going to the next submesh. So, if there
  282. was 50 submeshes in the filled of view, than there would be 50 material
  283. pushes. Kind of wastefull considering that the number of different
  284. materials used for the terrain is usually pretty small (in this version,
  285. there are only 4 different textures). It obviously seemed like more
  286. advantageous to sort all submeshes by material, and push one material
  287. and draw all the submeshes using that material before going to the 
  288. next material.
  289. That optimization is controled by the flag SORT_MESHES.
  290.  
  291. - sorting the fishes by material.
  292. Same principle as terrain submeshes sorting by material.
  293. It turned out that most fishes were using only one material. Since
  294. there can be anywhere between 5 to 20 fishes of the same kind, it was
  295. a real waste to push and pop exactly the same material 20 times.
  296. So now, after a little bit of hacking, each material is pushed only
  297. once and all the fishes using that material are drawn before going to
  298. the next fish. Warning: this is a real hack. It only works because
  299. each fish only uses one material (it is one triset and one material). 
  300. Also, it only works because at the time of the creation of the school,
  301. all the fishes of the same kind are create one after the other and
  302. added to the school. If there were randomly created, then the optimization
  303. code will fail.
  304. Warning: there is one fish that I had to remove from the school because
  305. it was using more than 1 material. If you ever get a black fish, it is 
  306. probably because it uses 2 materials, which makes the fish optimization fail.
  307.  
  308.  
  309. - decreasing the Terrain depth.
  310. this helps a lot. By decreasing the depth of the view, we have less computation
  311. to do and less to draw for the terrain.
  312.  
  313. - reducing the camera's field of view. Same principle. By reducing the field of view,
  314. we reduce the surface of the terrain that is visible and therefore reduce the number
  315. of submeshes to process (and to draw).
  316.  
  317.  
  318. - reducing the number of animals.
  319.  
  320.  
  321.  
  322.  
  323. XHEAD:
  324. -----
  325. Grand Bleu can run in multi-head (multi-screen) mode.
  326. For this, you need to:
  327. - make sure that it was build with the XHEAD flag (look at the makefile).
  328. - have 2 or 3 machines with a 3Dfx board (Rightous3D or Monster3D)
  329. - have networking cards on all machines
  330. - connect all machines on a network (on you regular LAN, or isolated with
  331.   their own mini hub).
  332.  
  333. Notes:
  334. 1.  The XHEAD mode uses the bcstudp.lib library (for broadcast upd). It should
  335.     be part of your regular Arcade Tool Box distribution. Just make sure it was compiled
  336.     before you build Grand Bleu. Just in case, the bcstudp.lib was included with Grand Bleu.
  337.     If you want to use this local copy of the bcstudp.lib library, make sure to 
  338.     modify the makefile and change the path for the library.
  339.  
  340. 2.  The XHEAD mode is based on a Master/Slaves configuration. The master screen (the center
  341.     screen) is the master of the simulation and the right and left screens are the slaves.
  342.     Each computer actually runs a full Grand Bleu simulation. But all computers are synchronized
  343.     via the network: the Master awaits for all slaves to tell him that there are down to render
  344.     the current frame before it allows them to go to the next frame. This ensures that all
  345.     simulations are frame lockstepped. But there was still the issue of animal behaviours.
  346.     There would have been too much data involved to consider having the Master send network
  347.     packets to all the slave for all the animals in the simulations at each frame.
  348.     By seeding the random generator with the same seed on all machines, and thanks to the
  349.     lockstep mechanism, we were able to get all the computers to run exactly the same simulation
  350.     with no risk of diverging.
  351.  
  352.     
  353.     
  354. Starting an XHEAD session
  355. Let MAXPLAYERS be the number of machine running the simulation. 
  356. Usually this should be 3: the master (center screen) and the slaves
  357. (right and left screens).
  358.  
  359.  
  360.  
  361. On the master machine, set the MAXPLAYERS environment variable to 3.
  362. set the MASTER environment variable to 1.
  363. and start flipper with the -xhead option:
  364. set MAXPLAYER=3
  365. set MASTER=1
  366. flipper -xhead
  367. OR you can run the batch file master.bat that does all of this for you.
  368.  
  369. On the right slave machine, do the following:
  370. set MAXPLAYER=3
  371. set RIGHT=1
  372. flipper -xhead
  373. OR you can run the batch file right.bat that does all of this for you.
  374.  
  375. On the left slave machine, do the following:
  376. set MAXPLAYER=3
  377. set LEFT=1
  378. flipper -xhead
  379. OR you can run the batch file left.bat that does all of this for you.
  380.  
  381.  
  382.  
  383.  
  384.  
  385.  
  386.  
  387.  
  388. --------------------------------------------------------------
  389.  
  390. So, if you have any question, send your comments or request to
  391. devsupport@3dfx.com
  392. Good luck.
  393.