home *** CD-ROM | disk | FTP | other *** search
/ World of Graphics / WOGRAPH.BIN / 764.TGA2POV.DOC < prev    next >
Text File  |  1992-11-04  |  17KB  |  404 lines

  1.  
  2.  
  3.                                ===============
  4.                                  TGA2POV 2.0
  5.                                ===============
  6.  
  7.                     Converts B&W 8-bit Targa files (Type 3)
  8.                                to PoV 1.0 objects
  9.  
  10.                           Copyright 1992 Scott Steeves
  11.  
  12.  
  13.                              In the spirit of PoV,
  14.                        this program is given as freeware.
  15.  
  16.  
  17.  
  18.     TGA2POV is a utility for PoV 1.0.  It will convert B&W uncompressed Targa
  19. images to PoV 1.0 objects.  Being that I'm not a programmer (if I where, would
  20. I be hacking in QuickBasic??), this is a simple program.  It doesn't output
  21. the most optimized code, and it isn't the most optimized program.  But it does
  22. work.  It's too simple not to.
  23.     This was originally created to get some fonts into a couple of animations.
  24. I just jumped into my favorite paint program, and typed the words using a
  25. large font.  I then ran the Targa image through TGA2POV, and I had a PoV
  26. object that I could rotate in the animation.  This is what is was designed
  27. for, but it'll convert anything from a Type 3 Targa to a PoV object.
  28.  
  29.  
  30.     Syntax:
  31.  
  32.     TGA2POV input output [/S] [/Bn] [/1]
  33.  
  34.     Where:
  35.  
  36.     INPUT is the Targa file, INPUT.TGA.  The extension .TGA is automatically
  37. put on, so don't put it on the command line.
  38.  
  39.     OUTPUT is the PoV #include file, OUTPUT.INC.  Ditto about the extension.
  40.  
  41.     /S turns on smoothing.  More on this later.
  42.  
  43.     /Bn indicates the bounding level.  n must be a number from 0-9.  More on
  44. this later.
  45.  
  46.     /1 will scale the object to a height (Y) of 1 unit.  The width (X) will be
  47. scaled proportionately.  The thickness (Z) will not be adjusted, and will be
  48. equal to 1 unit.  If you convert a large image and enable the scaling, you will
  49. want to scale the depth, too.
  50.  
  51.  
  52.  
  53.     TGA2POV will create an .INC file declaring a composite with the same name
  54. (less extension) as the Targa image.  The object will be 1 unit thick (in the Z
  55. direction) and however high and wide the object was in the Targa image.  The
  56. Targa image size has nothing to do with the output.  If the image itself is
  57. 1000x1000, and you have only a 2x2 block of black pixels in the image, then the
  58. output will be a 2x2x1 box.
  59.     It also declares a texture called Texture1.  When the .INC file is written,
  60. Texture1 is simply "color red 1" so you'll have to edit the .INC file to get
  61. the desired texture.
  62.  
  63. ===========================================================================
  64.  
  65.     All TGA2POV does is read in the Targa file, line by line.  Whenever it
  66. comes to a black pixel, it outputs a box{ (1x1x1) at the X,Y coordinates
  67. of that pixel.  That's it!
  68.  
  69.     Well, it needed a little optimization from that method, so it checks to
  70. see how many continuous black pixels there are in a row, and outputs a
  71. box of those dimensions.  So that if a line has 10 black pixels in a row, then
  72. TGA2POV outputs a box{ 10 units long (along the X axis) and 1 unit high (along
  73. the Y axis) and one unit thick (along the Z axis).  Hardly optimal, but it
  74. works.
  75.     TGA2POV will compute some bounding boxes, which greatly speed the render
  76. over version 1.  See the section on bounding boxes for more info.
  77.  
  78.  
  79.     If your Targa file has a block of blacks pixels like this:
  80.  
  81.     XXXXXX
  82.     XXXX
  83.     XXXX
  84.  
  85.     TGA2POV will output the following three boxes, one 6 units long, and two
  86. that are 4 units long.  (All of these boxes will be 1 unit high and 1 unit
  87. thick.)  It also creates a bounding box around the boxes, and another bounding
  88. box around the entire object.  (More on the bounding later.)
  89.  
  90.     An example output for this "image" would be:
  91.  
  92.  
  93. #declare Texture1 = texture { color red 1 }
  94.  
  95. #declare EXAMPLE = composite {
  96.     object {
  97.         union {
  98.             box { < 5  6 -.5>< 9  7 .5>}
  99.             box { < 5  7 -.5>< 9  8 .5>}
  100.             box { < 5  8 -.5>< 11  9 .5>}
  101.         }
  102.     bounded_by{ box{< 4.99  5.99 -.51>< 11.01  9.01 .51>} }
  103.     texture { Texture1 }
  104.     }
  105. bounded_by{ box{< 4.98  5.98 -.52>< 11.02  9.02 .52>} }
  106. scale < 0.333333 0.333333 1 >
  107. translate <-8 -7.5 0>
  108. }
  109.  
  110.     Scaling
  111.     =======
  112.  
  113.     By default, TGA2POV makes no efforts to scale the object.  Thus, if your
  114. Targa file has an object that's 100 pixels tall by 50 pixels wide, then the PoV
  115. object will be 100 units tall and 50 units wide.  This way, all objects will be
  116. proportionate to each other from one file to the next.  Since this was designed
  117. to bring some alphanumeric characters into PoV, I decided that it was best not
  118. to scale.  Then, every character done in 36-point Times Roman would be
  119. correctly proportionate to the next.
  120.     However, using the /1 switch will scale the object to a height (Y) of 1
  121. unit.  The width (X) will be scaled equally, thus keeping the same proportions.
  122. The thickness (Z) will not be touched, thus the object will always be 1 unit
  123. thick.
  124.  
  125.     The objects are made entirely with boxes (and some intersecting planes if
  126. you use smoothing), so you can scale it however you wish.
  127.  
  128.  
  129.     Bounding
  130.     ========
  131.  
  132.     TGA2POV will create bounding boxes around portions of the output
  133. composite. The /Bn option controls how often a bounding box will be output.
  134.  
  135.     TGA2POV will read in a certain number of lines of the Targa image,
  136. output the necessary boxes, and then output a bounding box to surround this
  137. block of boxes.  It will then read another block of lines, output, etcetera,
  138. until the entire image has been converted.
  139.  
  140.     If you specify /B1, a bounding box will be output for every 4 lines.
  141.     If you specify /B2, a bounding box will be output for every 7 lines.
  142.     If you specify /B3, a bounding box will be output for every 10 lines.
  143.     If you specify /B4, a bounding box will be output for every 13 lines.
  144.     If you specify /B5, a bounding box will be output for every 16 lines.
  145.     If you specify /B6, a bounding box will be output for every 20 lines.
  146.     If you specify /B7, a bounding box will be output for every 25 lines.
  147.     If you specify /B8, a bounding box will be output for every 35 lines.
  148.     If you specify /B9, a bounding box will be output for every 50 lines.
  149.     If you specify /B0, a bounding box will be output for every 10,000 lines.
  150. This effectively turns bounding off, unless you're insane enough to convert a
  151. 200 Megabyte Targa.
  152.  
  153.     The bounding option defaults to /B3, which is every 10 lines.
  154.  
  155.  
  156.     Using this method to compute bounding boxes generates bell curves when
  157. considering render times.  Take an imaginary file, and convert it at /B4.
  158. Rendering the PoV object may take 5 minutes to render.  /B5 takes 4 minutes,
  159. /B6 takes 3 minutes, /B7 takes 4 minutes, and /B8 takes 5 minutes.
  160.     Obviously, /B6 is the best to use with this particular file.  It's easy to
  161. see when you have these results in front of you, but it takes too long to test
  162. each setting.  It would be best if the program could automatically compute
  163. bounding boxes at the optimum setting.  I could not see any easy way to compute
  164. an optimal setting, another than judging by file size.  While just judging by
  165. file size seems like a good idea, a highly complex image may take much longer
  166. than a very simple image of the same file size.  The complex image (a fancy,
  167. cursive font, for example) will require more boxes than the simple (a sans-
  168. serif font) image.  More primitives, more time.
  169.  
  170.  
  171.     See the file BOUNDING.DAT for more information.  This file contains a ton
  172. of information resulting from sixty renders, each at 640x480.  It also contains
  173. few hints from what I have seen.  The file EXAMPLES.ZIP contains a few GIFs
  174. which might help a bit, too.
  175.  
  176.     Please note:
  177.     If you have any suggestions about this method, please let me know.  It
  178. seemed best to me after running the tests.  But I'm not the most experienced
  179. ray-tracer out there, and in light of this, I admit that I might be totally
  180. wrong.  If I am wrong, then please be nice when you tell me.  Thanks.  :-)
  181.  
  182.  
  183.  
  184.     Smoothing
  185.     =========
  186.  
  187.     Note:
  188.     *****  Smoothing has not been changed from version 1.  It may not even be
  189. worthwhile until I can come up with a better method to get a smaller, smoother
  190. object.  From some tests that I have done, I don't think that smoothing is
  191. worth it at this point.
  192.     Create your image as large as is necessary to have a smooth render.  It
  193. might not always be necessary to create a huge image to get a smooth object,
  194. depending on where you place the object.  If you scale the object to a smaller
  195. size, or if you place it farther away from the camera, you won't notice the
  196. blockiness.  See the files BOUNDING.DAT and EXAMPLES.ZIP for more info.
  197.     Unless somebody loves this feature, I may just dump it from the next
  198. version.
  199.  
  200.     To continue....
  201.  
  202.  
  203.     If you use the "Smoothing" option, TGA2POV will fill in the "stairsteps"
  204. with 1-unit boxes cut at a 45-degree angle.  For example, say your Targa image
  205. had an object like this:
  206.     {Zoomed x2 for greater detail.  :-) }
  207.  
  208.     XXXXXXXXX
  209.     XXXXXXXXX
  210.     XXXXXXX
  211.     XXXXXXX
  212.     XXXX
  213.     XXXX
  214.  
  215.     Those stairsteps can look terrible sometimes, especially if the camera is
  216. very close, or if you scale the object much larger.  TGA2POV's smoothing
  217. option can "smooth" the edges by putting in some 1-unit boxes which have been
  218. cut at a 45-degree angle.  The above object would then look like this:
  219.  
  220.     XXXXXXXXX
  221.     XXXXXXXXX
  222.     XXXXXXX /
  223.     XXXXXXX/
  224.     XXXX  /
  225.     XXXX /
  226.  
  227.     The outside edges are smoothed off, and the object no longer has that
  228. "blocky" look.
  229.  
  230.  
  231.     Some notes on smoothing:
  232.  
  233.     1)  It adds a lot more primitives to the PoV objects, and thus more
  234.         rendering time.  Sometimes it will double the number of primitives,
  235.         and thus it greatly increases the renderingtime.
  236.  
  237.     2)  It doesn't always help.  If you convert a large Targa object (Like a
  238.         72-pt "W") then you'll barely see the effects.  Since there are so
  239.         many pixels in the original image, there will be a lot of boxes in the
  240.         PoV object.  You'll have to scale it down to fit it on the screen, and
  241.         the effects of the smoothing will barely be noticable.
  242.  
  243.     3)  If the stairsteps are more than a single pixel, the corner pieces are
  244.         less noticable, since they're only 1x1x1.  So if you had an object
  245.         like this:  (Actual size)
  246.  
  247.         XXXX
  248.         XXXX
  249.         XXXXXXX
  250.         XXXXXXX
  251.         XXXXXXX
  252.  
  253.         You'll only get one corner piece, like this:
  254.  
  255.         XXXX
  256.         XXXX\
  257.         XXXXXXX
  258.         XXXXXXX
  259.         XXXXXXX
  260.  
  261.         It doesn't make that much of a difference.  It seems like an option
  262.         best saved for those small images, like 12-point characters.
  263.  
  264.     4)  It's not a very intelligent option.  That is, it checks no further
  265.         than 1 pixel up or down, and one pixel left or right.  So if you have
  266.         an object like this:  (2x actual size)
  267.  
  268.         XXXXXX
  269.         XXXXXX
  270.         XXXX
  271.         XXXX
  272.         XXXXXX
  273.         XXXXXX
  274.  
  275.         Then you end up with two corners pieces, translated to the same
  276.         coordinates.  You'll end up with a little "V", like this:
  277.  
  278.         XXXXXX
  279.         XXXXXX
  280.         XXXX /
  281.         XXXX \
  282.         XXXXXX
  283.         XXXXXX
  284.  
  285.     All in all, smoothing looks like an option best suited to small objects.
  286.  
  287.  
  288.  
  289.     "Shadow Lines"
  290.     ==============
  291.  
  292.     Sometimes, when the face of an object is exactly perpendicular to
  293. the camera,  I have seen shadow lines drawn where two objects meet,
  294. such as the junction of a box and a corner piece.  From what I have
  295. seen, this is rare.  However, it does happen.
  296.     If you see some dark lines in the middle of an object,and you know they
  297. shouldn't be there, then you're probably seeing what I'm talking about.  If
  298. this is the case, simply rotate the object on the X axis by a small amount.
  299. I've had the "shadow lines" disappear by putting "rotate<.5 0 0>" in the PoV
  300. scene file. If you can notice a ½-degree rotation, then you have better eyes
  301. than I.
  302.  
  303.  
  304.  
  305.     Plans for the future
  306.     ====================
  307.  
  308.     The cut boxes that the smoothing option adds can be done differently.  (I'm
  309. too lazy to do this yet.)  Take the following chuck of code:
  310.  
  311. intersection{box{<-0 -0 -.5><1 1 .5>}plane{<0 1 0>0 rotate<0 0 45>}
  312.     translate< 5  5 0>}
  313. box { < 6  5 -.5>< 26  6 .5>}
  314. intersection{box{<-0 -0 -.5><1 1 .5>}plane{<0 1 0>0 rotate<0 0 45>}          
  315.     rotate <0 0 -90> translate< 26  6 0>}
  316.  
  317.     That's a corner piece, then a box 20 units long, then another corner
  318. piece. There's no reason why this can't be written with one object.  Just
  319. make the box 22 units long, and intersect the two ends with those planes.
  320. Something like:
  321.  
  322. intersection {
  323.     box { <5 5 -.5><27 6 .5> }
  324.     plane { <0 1 0> 0 rotate <0 0 45> translate <5 5 0> }
  325.     plane { <0 1 0> 0 rotate <0 0 135> translate <26 6 0> }
  326. }
  327.  
  328.     I don't know if that's the correct syntax (I'm tired and inexperienced),
  329. but something like that.  At least, we've now got 1 primitive (although it's
  330. a little more complicated) rather than 3.
  331.  
  332.  
  333.     I'd also like to do the smoothing a little better.  If the object has a
  334. stairstep that goes over 5 then up 1, the present smoothing does very little.
  335. You end up with a stairstep that goes over 4 places, and angles up 1.
  336.     I'd like to improve it so that a plane cuts this at the correct 5-to-1
  337. angle so that the above stairstep disappears entirely.  Shouldn't be too
  338. hard.  However, if it goes over 1, then up 5, it gets messy.  I'd probably
  339. have to read the entire file into memory, and then test multiples lines up
  340. and down.  I don't if I'm motivated and/or experienced enough to do this with
  341. QuickBasic.
  342.  
  343.     I'd also like to check into computing larger boxes.  Test the entire image
  344. for any 10x10 blocks of black pixels, and output a 10x10x1 box for each.  Then
  345. test for 9x9 blocks, and so on.
  346.     This might work against those complex images, though.  And it would
  347. probably mean one of two things:  Either the program would have to be able to
  348. fit the entire image into memory; or the program would have to use temp files.
  349. Considering that I'm working in QuickBasic, the first might be impossible
  350. once the image gets large, and the second is slower than hell.  Even with this
  351. version, converting a 1.4M Targa took my 386/25 just over 11 minutes.  The idea
  352. of also having to read and write some temp files makes me want to play Tetris.
  353.  
  354.  
  355.     Targa Images
  356.     ============
  357.  
  358.     TGA2POV reads in Type 3, B&W, uncompressed Targa images.  If your paint
  359. package puts out a different kind of image then you'll have to convert it.
  360. Sorry, but I can't program a GIF decoder, so....
  361.  
  362.     Whip out your copy of Alchemy (great program) and convert the image using
  363. the following parameters:
  364.     -a10 -c2 -8
  365.     This will convert your image to a Targa, uncompressed without a footer, 2
  366. color, 8-bit file.
  367.  
  368.     Or, start up Windows, and get into Paint Shop Pro (another great program).
  369. Make sure that the image is only two colors.  Use the "Count Colors" under
  370. "Image" to double check.  If the image has more than two colors, convert it to
  371. two, then convert it to 256 colors.  Check the status bar to make sure that
  372. it's an 8-bit (256 color) image.  Convert it to 256 colors if necessary.  Then
  373. save the image as an uncompressed Targa.
  374.  
  375.     As long as your program will output an uncompressed, 8-bit Targa, you
  376. shouldn't have a problem.
  377.  
  378.  
  379.     Fini
  380.     ====
  381.  
  382.     If you have any comments, I'd appreciate them.  At this point, the
  383. program does what I want, and I can modify the code when I get to it.
  384. However, if enough people mention that they'd like this improved, then I'll
  385. probably get back to it.  However, I want to trace, and I haven't done a
  386. thing since I finally started this a few days ago.
  387.  
  388.  
  389.     Legal Bullwhippy
  390.     ================
  391.  
  392.     Use at your own risk.  Regardless of what happens, I'm not responsible.
  393. I don't care if you run this program and your computer implodes or starts
  394. singing Barry Manilow songs.  You use it, you're responsible for your
  395. actions.  I make no claims as the functionality of this program, and I have
  396. no idea as to just how much damage this could do if you attempted to convert
  397. a 22 megabyte Targa.  This program isn't complex enough to do any real
  398. damage, but your hard drive could get thrashed if it runs into an infinite
  399. loop.  However, inifinity is limited to 64-bit precision, so it shouldn't get
  400. too far.  Good luck.
  401.  
  402.     Scott Steeves
  403.     11-04-92
  404.