home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 108 / gp2demo.iso / editor / acorn / TEXTURE / TEXTURE.ZIP / Docs / Technical < prev    next >
Encoding:
Text File  |  1996-11-18  |  24.4 KB  |  512 lines

  1.  
  2.                          Technical details
  3.                          =================
  4.  
  5. Topics : 01 Animations and animation viewers
  6.          02 Exporting textures as JPEGs
  7.          03 Creating 16 and 24 bpp files
  8.          04 Menu tree conventions
  9.          05 Animation Types - details
  10.          06 Animation Types - file format
  11.          07 The Mutator
  12.          08 Breeding
  13.          09 Three-dimensional sculpting
  14.          10 Dithering
  15.          11 Resizing
  16.          12 Batch processing
  17.          13 Using !ChangeFSI
  18.          14 Virtual sprites and layering
  19.          15 Getting the most from the Freeware version.
  20.          16 Bump mapping
  21.  
  22.  
  23. 01 Animations and animation viewers
  24. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  25. Texture Garden contains extensive options for generating texture animations.
  26. Animations may have variable number of frames, and they may be controlled
  27. by using animation types.
  28.  
  29. Animations are always replayed cyclicly, but their direction may be reversed by
  30. the user.
  31.  
  32. Animations may be stored as directories of sprites, or as a single multiple
  33. image sprite file.
  34.  
  35. When saving animations as directories, Texture Garden does not offer support
  36. for going beyond the 76 file limit imposed by the filecore.  When playing back
  37. such animations, caching of images may be deselected, allowing replay from
  38. disc of animations which would otherwise not fit into memory.
  39.  
  40. When saving animations as multiple image sprite files, !ChangeFSI post-
  41. processing is not available, and when replaying these animations, there must
  42. be enough memory available to load the whole sequence.
  43.  
  44. Animations are generated mainly by altering the phase of the pseudo-random
  45. noise which is used in conjunction with filters when performing the program's
  46. fast-fourier-transforms.  Different frequencies are affected differently and
  47. the "Animation Type" specifies the way in which different frequencies are
  48. affected.
  49.  
  50. Two textures which look exactly the same may animate in different ways even
  51. if the same animation type is chosen; how they animate depends on their
  52. internal constitution, and not on their physical appearance.
  53.  
  54. The "Texture programmer" may design his own type of animation by using the
  55. "AnimationFrameNumber" variable which changes from &0 to &FFFF during the
  56. animation's course.
  57.  
  58. Texture Garden's batch processing options may be used for generating sequences
  59. of textures for animation purposes.  This can also be done from the command
  60. line if absolutely required.
  61.  
  62. Lastly, a word about alternatives to the animation viewing facilities provided.
  63.  
  64. Among the available Freeware on the platform are "!Picture" (written by mz
  65. Sophie Wilson and available from Acorn's FTP site) and "!Player" (Version
  66. 1.00 by Emmet Spier in 1990).  "!Picture" does not cache sprites, but is
  67. simple and neat.
  68.  
  69. "!Player" works well.  It is slightly faster than my own player due to its
  70. use of optimised plotting routines, it can scale plotted sprites and it has
  71. several other nifty widgets.  It needs to be fed a single multiple image 
  72. sprite file, and it takes its palette from the first sprite in the file.  This
  73. means you will probably need to edit the first sprite of an animation in
  74. !Paint to give it a palette.
  75.  
  76. "!Picture" too uses the default mode palette if none is specified by the
  77. sprite files.  One way of getting around this is to use the !ChangeFSI
  78. post-processing provided by Texture Garden which automatically adds the
  79. current desktop palette to the file.  Simpler, perhaps is to edit
  80. "!Picture"'s !RunImage program as follows:
  81.  
  82. 3250 spx%=-1:FOR Q%=0TO255:IFpixtrans%?Q%<>Q% spx%=pixtrans%
  83.  
  84. needs to be changed to:
  85.  
  86. 3250 spx%=-1:FOR Q%=0TO255:REM IFpixtrans%?Q%<>Q% spx%=pixtrans%
  87.  
  88. or similar (spx% should wind up as -1).
  89.  
  90.  
  91. 02 Exporting textures as JPEGs
  92. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  93. The fact that the program has a back-end interface to !ChangeFSI enables
  94. textures to be exported as JPEGs.  This is useful for use with World Wide Web
  95. pages.  JPEGs are usually to be preferred to GIFs for backgrounds as they
  96. have excellent colour depth and can be compressed very well.  Browsers
  97. lacking JPEG support are now rare.  Some synergy between the Fourier
  98. Transforms used by Textures Garden and the Discrete Cosine Transform used by
  99. JPEG may be partly responsible for this.  Compression is especially important
  100. for backgrounds as they are usually drawn first and consequentlt need to be
  101. downloaded before any navigation of the page can occur.  This is not true of
  102. other images as long as the "width" and "height" attributes are specified in
  103. the <img> tags.
  104.  
  105. There is explicit support for exporting JPEGs in the program.  Usually the user
  106. can just set the !ChangeFSI option and then select which JPEG options are
  107. required.  These options are overridden by any JPEG output commands specified
  108. in the options string.  For further documentation on the "JPEG" and "JPEGMONO"
  109. options, information is available inside !ChangeFSI.
  110.  
  111. Unfortunately, although the Computer Concepts "Colour Card Gold" graphics
  112. hardware is fully supported by Texture Garden, !ChangeFSI (v.1.15) does not
  113. recognise the CC-style 16bpp sprites and consequently fails to convert them
  114. to JPEGs correctly.  It seems to be confused about the aspect-ratio and the
  115. colour-depth.  The aspect-ratio problem can be overcome using some of
  116. !ChangeFSI's resizing options, but colour-depth problem seems insoluble and
  117. the resulting washed out images are of little use.  Fortunately, a solution is
  118. at hand.  Texture Garden has options for forcing output to be in 16 or 24 bit
  119. colour.  When using these options, the output format follows Acorn's format,
  120. and consequently, !ChangeFSI can deal with the sprites.
  121.  
  122. When outputting images as JPEGs, it is important to make sure that you generate
  123. them at a high colour depth in the first place.  Using the force 24bpp option is
  124. recommended.  This is because JPEGs are 24 bit images, and using less than 24
  125. bits in the source image actually generates larger files because the colour
  126. quantization introduced bu using low colour depths is interpreted as being
  127. sharp edges, which JPEG does not compress well.
  128.  
  129.  
  130. 03 Creating 16 and 24 bpp files
  131. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  132. Texture Garden allows the export of 16 or 24 bit colour sprites from any display
  133. mode.  Old machines will have difficulty displaying these sprites, but they are
  134. recognised by !ChangeFSI.  Versions of RISC OS prior to version 3.5 are too
  135. primitive to display these "deep" sprites.  Fortunately, a patch for the
  136. operating system is available to allow them to be viewed as dithered images on
  137. older hardware.  This is called "Deeper" and is written by Sanjay Pattni.
  138. This patch is a module, and it was distributed recently on September's Acorn
  139. User cover disc.
  140.  
  141. The versions of the DragASprite module currently in existence do not seem to
  142. operate correctly on these pseudo-deep images.  If this does not look as though
  143. it will be rectified, reverting to dash boxes may be implemented.
  144.  
  145. Note that palette images are always created in the current mode, and are always
  146. displayed with Floyd-Steinberg dithering.  This may mean, that in modes with
  147. low colour depths they may look different from the textures they refer to.
  148.  
  149. This is because the textures are using simple dithering (usually for speed),
  150. and so the true colours of the palette are not being represented accurately.
  151.  
  152. Textures are not recreated in the current mode on a mode change.  A minor tip
  153. if you want a particular texture redrawn in its current position for some
  154. reason is that if you start to drag a texture, and press SHIFT as you drop it
  155. back onto its original position, then it gets redrawn in the current mode.
  156. If you also press ALT, then the texture is completely deleted.  This last may
  157. be of use to those working in conditions of restricted memory.
  158.  
  159.  
  160. 04 Menu tree conventions
  161. ~~~~~~~~~~~~~~~~~~~~~~~~
  162. When navigating through the palettes directory or the directory of animation
  163. types using the menu structures provided, some conventions are used for the
  164. sprites that are displayed on the left-hand side of the menus.
  165.  
  166. Normally the sprite naming conventions are as follows:
  167.  
  168.          File(S)    File(L)   Directory(S) Directory(L) App(S)  App(L) 
  169. Plain   :small_abc  file_abc  *name        #name        sm!xyz  !xyz 
  170. Selected:small_abc▓ file_abc▓ *name▓       #name        sm!xyz▓ !xyz▓ 
  171. NoName  :small_xxx  file_xxx  small_dir    directory    sm_app  application 
  172. NoNameS :small_xxx▓ file_xxx▓ small_diro   directoryo   sm_appo applicationo
  173.  
  174. Small sprites are used when they are available; otherwise the large sprite is
  175. scaled.  If the selected version of the sprite is not available then the base
  176. sprite is inverted.  Conventions taken from !FilerPtch are also used.  In
  177. particular, "hidden" files are not displayed, to support the local directory
  178. display options of that program.
  179.  
  180. When selecting items from the menus, pressing SHIFT or ALT will alter the
  181. effect produced.  Generally SHIFT-clicking will load the file into a text
  182. editor, and ALT-clicking will open a Filer window onto the directory
  183. containing the selected item.  In the case of directories, clicking usually
  184. opens the parent of the directory clicked on.  SHIFT-clicking instead will
  185. open the selected directory itself.
  186.  
  187.  
  188. 05 Animation Types - details
  189. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  190. Animation Types are stored in the "Animatons" directory within Texture Garden.
  191. These control the way Texture Garden generates its animations.
  192.  
  193. Animations are generated mainly by altering the phase of the pseudo-random
  194. noise which is used in conjunction with filters when performing
  195. fast-fourier-transforms.  Different frequencies are affected differently and
  196. the "Animation Type" specifies the way in which different frequencies are
  197. affected.  Animation Types consist of a series of 1024 signed 4-bit values
  198. which are used as multipliers of the "animation phase" of different
  199. frequencies.  The animation phase is considered as coung from &0 - &FFFF, ie
  200. through one complete cycle in any animation.  If the phase multipliers are
  201. large then the animation will be violent and rapid.  If the multipliers are
  202. zero for all low frequencies then the animation will appear as a series of
  203. small ripples distorting a largely static display.  If the multipliers are
  204. zero for all high frequencies then the animation may look like big waves
  205. distorting an intricately patterned tapestry.  Many different types of
  206. animation are possible using this method.
  207.  
  208.  
  209. 06 Animation Types - file format
  210. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  211. Animation Types are stored as 512 byte files in the "Animatons" directory
  212. within Texture Garden.  Source for several example files is contained in the
  213. "Library.Source.Animations" directory.
  214.  
  215. The files are made up of 1024 signed 4-bit values.  Low frequency multipliers
  216. are stored first within each byte the lower frequency is in the lower bits
  217. (little endian).
  218.  
  219.  
  220. 07 The Mutator
  221. ~~~~~~~~~~~~~~
  222. When texture Garden mutates a texture into another one, its operation is
  223. quite simple.  It goes through the file and alters some of the numbers in the
  224. texture generation file.  The numbers are chosen according to the "mutation
  225. options" of the last command or function of the program.  These mutation
  226. options are specified by the programmer of the function.  Their possible
  227. values are listed in the "Extensions" file.
  228.  
  229.  
  230. 08 Breeding
  231. ~~~~~~~~~~~
  232. When two textures are mated with one another the program examines the code of
  233. the two textures for the "CreateTwoDimensionalTransform" and
  234. "CreateOneDimensionalTransform" commands.  Breeding mainly affects this type
  235. of command.  If one of the textures lacks both of these commands, then the
  236. two textures will be unable to breed.  For a texture to be fertile, it
  237. follows that it should always contain some such command.
  238.  
  239. For each occurrence of one of these commands in the "Mother" texture (paying
  240. heed to the "Mutate Colours" and "Mutate Textures" options) a random
  241. parameter of the command is chosen and deleted.  If this parameter is a
  242. function, then all its arguments are also deleted.  A chunk of code is taken
  243. at random from a "Create...Transform" in the "father" code.  This is then
  244. spliced along with any relevant parameters into the mother code at the chosen
  245. point.
  246.  
  247. The above mechanism allows textures to be of both sexes.  Note that almost
  248. the entire code comes from the "mother" texture, with the father donating a
  249. tiny quantity of code.  At the end of the breeding, the offspring is always
  250. given a new seed (for the pseudo-random number generator).
  251.  
  252.  
  253. 09 Three dimensional sculpting
  254. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  255. Support is provided for the production of three dimensional textures.  These
  256. are of use when textures need to be moulded to the surfaces of solid objects. 
  257. The most frequent application of this is when a texture is required that can
  258. be moulded around the surface of a sphere.
  259.  
  260. The two commands "DefineSolidBlock(Block_Description)" and
  261. "Sculpture(Path_of_X,Path_of_Y,Path_of_Z)" are used to perform this type of
  262. action.
  263.  
  264. The "DefineSolidBlock" command defines a solid block of texture in three
  265. dimensions.  "Block_Description" is a function of X,Y, and Z which usually
  266. refers to various buffers using the "Point"-type commands.
  267.  
  268. The "Sculpture(Path_of_X,Path_of_Y,Path_of_Z)" command sculpts a solid shape
  269. from the solid block of texture described in the last "DefineSolidBlock"
  270. command encountered.  The parameters, "Path_of_X", "Path_of_Y", "Path_of_Z",
  271. define a mapping between X and Y and the three dimensional space.  They are
  272. functions of X and Y.  The resulting shape is stored in the main two
  273. dimensional buffer.  It is usually best to enclose these commands inside the
  274. "StopMutating" and "StartMutating" pair.
  275.  
  276. One version of the command that defines a sphere is:
  277.  
  278. Sculpture(
  279. ScaledSignedMultiply(SignedCos(X),Absolute(SignedCos(LogicalShiftRight(Y,&1)))),
  280. SignedCos(LogicalShiftRight(Y,&1)),
  281. ScaledSignedMultiply(SignedSin(X),Absolute(SignedCos(LogicalShiftRight(Y,&1)))))
  282.  
  283. This is written on three lines to reveal its structure.  It is still quite a
  284. mouthful.  The advantage of specifying the shape explicitly is one of
  285. flexibility.  Smaller and larger spheres are possible, as are different
  286. shapes.
  287.  
  288.  
  289. 10 Dithering
  290. ~~~~~~~~~~~~
  291. There are now a number of dithering options available within Texture Garden.
  292. !ChangeFSI's superlative dithering methods may be used in addition to the
  293. native routines if needed, but in practice this is rarely required.
  294.  
  295. Texture Garden can use either simple random dithering, or a Floyd-Steinberg
  296. dithering technique.
  297.  
  298. With simple dithering using the "Dithering(Value)" command, if you use a lot of
  299. dithering to make an image look correct in a sixteen colour mode, then it will
  300. not look much better when changing to a sixteen million colour mode.  A command
  301. is provided to help with this called "ScaledDithering(Value)".  This scales the
  302. degree of dithering to the colour-depth of the current screen mode.
  303.  
  304. Floyd-Steinberg dithering may only be used in conjunction with the 24 bit
  305. virtual sprite commands.  It makes texture generation more time consuming.
  306.  
  307. Dithering may also be applied to palettes, where it can be applied separately
  308. to the colours components within whatever colour model is being used.
  309.  
  310.  
  311. 11 Resizing
  312. ~~~~~~~~~~~
  313. As described in the !Help file, dragging with SELECT on the bottom and
  314. right-hand edges of a texture initiates dynamic resizing.
  315.  
  316. There is something fundamentally square (literally) about the way in which 
  317. Texture Garden produces its extures.  The reason for this is the technical one
  318. that it is often faster to calculate FFTs at a size which is a power of two and
  319. then resize the result, than to do a FFT at the desired size.  If you want
  320. textures that are not square then there are several options available:
  321.  
  322. If the resized image needs to be displayed for selection in the Texture Garden,
  323. then using the built in resizing commands is strongly recommended.  This is
  324. most easily performed by using the "Resize" command an conjunction with the
  325. "ResizeSprite" command which are provided specifically for the purpose of
  326. resizing textures.  This is the recommended method of resizing textures, and it
  327. is the one used by the front-end provided for this purpose.
  328.  
  329. If a resize by XFactor and YFactor is required where
  330. (0 < XFactor < &10000, 0 < YFactor < &10000) then a...
  331. "Resize(XFactor, YFactor)" may be issued immediately before any "MakeSprite"
  332. commands are encountered, and a... 
  333. "ResizeSprite(XFactor, YFactor)" needs to occur just before the texture program
  334. terminates.
  335.  
  336. For the very technically minded the "ResizeSprite" command merely calls the
  337. "TruncateSpriteVertically(Y1,Y2)" and "TruncateSpriteHorizontally(X1,X2)"
  338. commands with their first parameter as zero.  These commands operate on the
  339. sprite generated by the program, chopping off its edges.  Note that although
  340. X1, X2, Y1 and Y2 range from 0 to &FFFF, X = 0, Y = 0 is at the bottom
  341. left-hand corner of the sprite and not, as usual, in the middle of the texture.
  342.  
  343. Equally technical: when the "Resize" command is issued three commands are built
  344. and issued.  They are roughly as follows
  345. "TwoDimensionalShift(&8000,&8000,Overwrite)"
  346. "TwoDimensionalProcess(0,0,XFactor,YFactor,TwoDimensionalPoint(
  347.    Multiply(&40000 DIV XFactor,LogicalShiftRight(X,&6)),
  348.    Multiply(&40000 DIV YFactor,LogicalShiftRight(Y,&6))),
  349.    Overwrite)".
  350. "TwoDimensionalShift(&8000,&8000,Overwrite)"
  351. This is close to what is actually used to resize the texture.
  352. When corresponding  "TruncateSpriteHorizontally(&0,XFactor)" and 
  353. "TruncateSpriteVertically(&0,YFactor)" are issued, the resulting image should
  354. tessellate, be the right shape and size and breed properly.  It will also
  355. be faster than if the resizing was done using !ChangeFSI, and will have had
  356. anti-aliasing techniques applied to it before translation to the current
  357. colour depth (better).
  358.  
  359. There are alternative methods available for resizing textures.  It is possible
  360. to resize manually by loading the generated sprite into a bitmap package and
  361. then trim it or resize it to the required size.  Trimming will clearly
  362. prevent seamless tessellation.  Resizing will preserve this, but may introduce
  363. some distortion.  One of the better ways to resize a resulting image is to
  364. use the scaling options of the !ChangeFSI post-processing available.  Using
  365. something like: "**#r 13:16 11:16 -nomode" would produce the desired effect.
  366.  
  367.  
  368. 12 Batch processing
  369. ~~~~~~~~~~~~~~~~~~~
  370. Batch processing is supported by Texture Garden.  If a textfile is dragged to
  371. the icon bar with the appropriate syntax, then it is used as a list of
  372. textures to be processed.  The syntax required for each line is as follows:
  373.  
  374. <infile> <outfile> <size>
  375.  
  376. where infile is the path of a texture generation file (note that this should
  377. always be a full path name), outfile is where the resulting sprite should be
  378. written to, and size is the desired size of the texture to be output.  This
  379. should always be a power of two.  Comments are allowed in batch files and they
  380. are taken to be any line starting with a "|".
  381.  
  382. Texture Garden also has the option to process batchfiles upon receiving a 
  383. request to do so from the command line.  It will only run in the desktop (i.e.
  384. not inside a task window), but it may be called from Obey files.  The syntax is:
  385.  
  386. "Run !TexturGdn -file <batchfile>".
  387.  
  388. The reason batchfiles have been supported is to allow maximum flexibility for
  389. those wishing to animate their textures.  It is in principle possible for users
  390. to machine generate a whole series of textures and then process them in bulk.
  391. Users who want to animate their textures in time with music (for example) may
  392. take a series of parameters from a MIDI source, a tracker file, or directly
  393. from the frequency spectrum of music sample and then use these as parameters
  394. when generating an appropriate texture.  If you are engaged in this type of
  395. activity, the author would be very pleased to hear from you.
  396.  
  397.  
  398. 13 Using !ChangeFSI
  399. ~~~~~~~~~~~~~~~~~~~         
  400. Post-processing of saved sprites and animations may be controlled by ticking
  401. the "Use !ChangeFSI" option.  
  402.  
  403. Two system variables are defined when using !ChangeFSI post processing of saved
  404. sprites: "<TextureGdn$File>" which contains the path of the existing sprite
  405. file and "<TextureGdn$Leaf>" which contains the leaf name from the same file. 
  406.  
  407. The !ChangeFSI-associated string provided contains the command line options
  408. required by this program.  Two special characters are used: "*" and "#". 
  409. Using "*" inserts "<TextureGdn$File> " (note the trailing space) into the
  410. command line string at that point and "#" inserts a string corresponding to the
  411. current mode.
  412.  
  413. The default setting for the string is "**#r -nomode".  This means that the
  414. existing sprite is overwritten and that processing is performed in the current
  415. screen mode.
  416.  
  417. If !ChangeFSI does not have enough memory to do its job then it can fail with
  418. unhelpful messages.  If this happens, the sprite will be left as it was when
  419. it was output from Texture Garden.  Please note that the system variable
  420. <TextureGdnChangeFSI$Mem> may be changed in Texture Garden's !Run file.
  421.  
  422. For further documentation on the options available, information is available
  423. from inside !ChangeFSI.
  424.  
  425.  
  426. 14 Virtual sprites and layering
  427. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  428. Virtual Sprites are 24-bit colour sprites in an internal format.
  429. They are created with the "MakeVirtualSprite(Type_R,Type_G,Type_B)" command
  430. and may be converted to RISC OS sprites using the "MakeSpriteFromVirtualSprite"
  431. command.
  432.  
  433. This method is useful when creating images by using multiple layers of texture.
  434.  
  435. Layers may be combined by specifing combination types for the red, green and
  436. blue components of the image using the "Type_R", "Type_G" and "Type_B"
  437. parameters.
  438.  
  439. It has some drawbacks when compared with the "traditional" method of using
  440. the "MakeSprite" and AddToSprite" commands.
  441.  
  442. The command is always slightly slower than the original method, and in 2, 4,
  443. 16, and 256 colour modes, it is much slower, as currently ColourTrans SWIs
  444. are used to perform the conversion.  Custom routines do the work in modes with
  445. 32K and 16M colours, so these are much faster.
  446.  
  447. Creating a virtual sprite also takes a chunk of memory which would otherwise
  448. not need to be allocated.
  449.  
  450. However, the range of textures capable of being generated has been massively
  451. increased by the addition of these commands.
  452.  
  453. More information concerning virtual sprites may be found in the "Language" file.
  454.  
  455. Sample textures illustrating these new methods are not currently provided with
  456. Texture Garden, but are available separately.
  457.  
  458.  
  459. 15 Getting the most from the Freeware version
  460. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  461. Texture garden has two main limitations: textures edited by hand cannot be
  462. loaded by the program, and the maximum resolution depends on the colour depth.
  463. Both these restrictions are completely removed in the registered version.
  464.  
  465. The difficulties caused by the colour depth limitation may be minimised by
  466. using custom desktop palettes in 16 and 256 colour modes.  This can be done
  467. because Texture Garden reads its palette from the current screen mode and
  468. does not assume that you are using the default palette.
  469.  
  470. In a 16 colour mode 256x256 is the maximum size of texture that can be
  471. generated with the freeware version.  This is big enough for most purposes.
  472. If you then choose a custom palette to match a particular texture, the quality
  473. of the produced image can be much improved.
  474.  
  475. There are a couple of points to mention here:
  476.  
  477. Firstly, the texture will not be saved with a palette unless !ChangeFSI
  478. post-processing is used, so you will have to add one manually in !Paint.
  479.  
  480. Secondly, there are probably free programs which will take a 16M colour sprite
  481. and generate the "best fit" 16 or 256 colour palette.  Though unfortunately I
  482. have no details concerning these, such a program would be of use to anyone
  483. contemplating the proceedure described here.
  484.  
  485. 16 Bump mapping
  486. ~~~~~~~~~~~~~~~
  487. Most of the information relating to bumpmapping is with the relevant commands
  488. in the language file.
  489.  
  490. A number of corners have been cut in the ray-tracing routines to provide rapid
  491. texture generation.  Here is a description of some current limitations:
  492.  
  493. The program's implementation of Phong shading is still quit a lot like Gourad
  494. shading, though the difference is quite noticable.
  495.  
  496. No true shadowing routines exist, so no part of a texture can cast a shadow on
  497. another part.
  498.  
  499. Currently there are no ambient reflections from incoming rays, no mirror
  500. effects or translucency.
  501.  
  502. An approximation to the normals at each point is generated which introduces
  503. some minor non-linear distortion as the height of the light source changes.
  504.  
  505. Because many bump maps will have tall narrow peaks, shining a light from the
  506. side will produce significantly more illumination than shining one from above.
  507. This is a common cause of oversaturating colours.
  508.  
  509. All light sources are currently at infinity.  If closer light sources are ever
  510. implemented they will (by their nature) stop textures using them from
  511. tesselating.
  512.