home *** CD-ROM | disk | FTP | other *** search
/ High Voltage Shareware / high1.zip / high1 / DIR36 / DRGDRP.ZIP / 3DBOX.PRG < prev    next >
Text File  |  1993-11-05  |  14KB  |  490 lines

  1. ***************************************************************************
  2. *
  3. * Procedure file: 3DBOX.PRG
  4. *         System: 3DBox
  5. *        Version: 1.4
  6. *         Author: Bill Anderson
  7. *      Copyright: None (Public Domain)
  8. *
  9. ***************************************************************************
  10. *
  11. * 3DBOX - 3D Box Generator.
  12. *
  13. * Description:
  14. * This program is used to draw a 3-D box.
  15. *
  16. *                  * * *  PARAMETER MEMORY VARIABLES  * * *
  17. *
  18. *            m.boxrow   = holds the beginning row of the box.
  19. *            m.boxcol   = holds the beginning column of the box.
  20. *            m.boxhgt   = holds the height of the drawn box.
  21. *            m.boxwdth  = holds the width of the drawn box.
  22. *            m.boxpenw  = holds the pen width of the bevel.
  23. *            m.sunr     = holds the red color intensity of
  24. *                         the sun color.
  25. *            m.sung     = holds the green color intensity of
  26. *                         the sun color.
  27. *            m.sunb     = holds the blue color intensity of
  28. *                         the sun color.
  29. *            m.shader   = holds the red color intensity of
  30. *                         the shade color.
  31. *            m.shadeg   = holds the green color intensity of
  32. *                         the shade color.
  33. *            m.shadeb   = holds the blue color intensity of
  34. *                         the shade color.
  35. *            m.facer    = holds the red color intensity of
  36. *                         the face color.
  37. *            m.faceg    = holds the green color intensity of
  38. *                         the face color.
  39. *            m.faceb    = holds the blue color intensity of
  40. *                         the face color.
  41. *            m.outliner = holds the red color intensity of
  42. *                         the outline color.
  43. *            m.outlineg = holds the green color intensity of
  44. *                         the outline color.
  45. *            m.outlineb = holds the blue color intensity of
  46. *                         the outline color.
  47. *            m.pattern  = holds the pattern of the face of the
  48. *                         3-D box.
  49. *            m.pentype  = holds the pen type used for 
  50. *                         the outline box.
  51. *
  52. *                  * * *  DECLARED MEMORY VARIABLES  * * *
  53. *
  54. *            m.curpenw  = holds the passed pen width.
  55. *            m.tempr    = holds the red sun color intensity.
  56. *                         Used for in-laid effects.
  57. *            m.tempg    = holds the green sun color intensity.
  58. *                         Used for in-laid effects.
  59. *            m.tempb    = holds the blue sun color intensity.
  60. *                         Used for in-laid effects.
  61. *            m.out_on   = used as a logical variable in order to 
  62. *                         determine whether the outline box 
  63. *                         should be drawn.
  64. *            m.setdec   = holds the previous SET DECIMAL setting
  65. *            m.curfont  = holds the font type used to calculate
  66. *                         the pixel lengths.
  67. *            m.cursize  = holds the font size used to calculate
  68. *                         the pixel lengths.
  69. *            m.curstyle = holds the font style used to calculate
  70. *                         the pixel lengths.
  71. *            m.hclength = holds the horizontal pixel to 
  72. *                         character ratio.
  73. *            m.vclength = holds the vertical pixel to 
  74. *                         character ratio.
  75. *            m.currow   = holds the passed row.
  76. *            m.curcol   = holds the passed column.
  77. *            m.looppen  = holds the interim pen value for the boxes
  78. *                         and triangles.
  79. *            m.prevpen  = holds the previous pen value when
  80. *                         going through the drawing loop.
  81. *            m.counter  = a counter.
  82. *            mcounter   = another counter.
  83. *                         
  84. ************************************************************************
  85. * Example:
  86. *
  87. * DO 3DBOX.PRG WITH 6, 10, 10, 5, 4, 255, 255, 255, ;
  88. * 128, 128, 128, 192, 192, 192, 0, 0, 0, 1, -1
  89. *
  90. ************************************************************************
  91. *
  92.  
  93. PARAMETERS boxrow, boxcol, boxhgt, boxwdth, boxpenw, sunr, sung, sunb,;
  94. shader, shadeg, shadeb, facer, faceg, faceb, outliner, outlineg, outlineb,;
  95. pattern, pentype
  96.  
  97. PRIVATE curpenw, tempr, tempg, tempb, out_on, setdec, curfont, cursize,;
  98. curstyle, hclength, vclength, currow, curcol, looppen, prevpen, counter,;
  99. mcounter, row, col
  100.  
  101. ** Windows/Mac platform test
  102. IF TYPE([_WINDOWS])# [L] OR (NOT _WINDOWS AND NOT _MAC)
  103.  
  104.   RETURN .f.
  105.  
  106. ENDIF TYPE([_WINDOWS])# [L] OR (NOT _WINDOWS AND NOT _MAC)
  107. ** End windows platform test
  108.  
  109. ** Negative row test
  110. IF m.boxrow < 0
  111.  
  112.   WAIT WINDOW [Negative row provided for this box.] NOWAIT
  113.   RETURN .f.
  114.  
  115. ENDIF m.boxrow < 0
  116. ** End negative row test
  117.  
  118. ** Negative column test
  119. IF m.boxcol < 0
  120.  
  121.   WAIT WINDOW [Negative column provided for this box.] NOWAIT
  122.   RETURN .f.
  123.  
  124. ENDIF m.boxcol < 0
  125. ** End negative column test
  126.  
  127. ** Bad height test
  128. IF m.boxhgt <= 0
  129.  
  130.   WAIT WINDOW [Invalid height provided for this box.] NOWAIT
  131.   RETURN .f.
  132.  
  133. ENDIF m.boxhgt <= 0
  134. ** End bad height test
  135.  
  136. ** Bad width test
  137. IF m.boxwdth <= 0
  138.  
  139.   WAIT WINDOW [Invalid width provided for this box.] NOWAIT
  140.   RETURN .f.
  141.  
  142. ENDIF m.boxwdth <= 0
  143. ** End bad width test
  144.  
  145. ** Empty button face pattern test
  146. IF TYPE([m.pattern]) # [N] OR EMPTY(m.pattern)
  147.  
  148.   m.pattern = 1
  149.  
  150. ENDIF TYPE([m.pattern]) # [N] OR EMPTY(m.pattern)
  151. ** End empty button face pattern test
  152.  
  153. ** Empty outline pen type test
  154. IF TYPE([m.pentype]) # [N] OR EMPTY(m.pentype)
  155.  
  156.   m.pentype = -1
  157.  
  158. ENDIF EMPTY([m.pentype])
  159. ** End empty outline pen type test
  160.  
  161. ** Width too long test
  162. IF m.boxcol + m.boxwdth >= WCOLS()
  163.  
  164.   WAIT WINDOW [Box width too long for window.] NOWAIT
  165.   RETURN .f.
  166.  
  167. ENDIF m.boxcol + m.boxwdth >= WCOLS()
  168. ** End width too long test
  169.  
  170. ** Height too big test
  171. IF m.boxrow + m.boxhgt >= WROWS()
  172.  
  173.   WAIT WINDOW [Box height too big for window.] NOWAIT
  174.   RETURN .f.
  175.  
  176. ENDIF m.boxrow + m.boxhgt >= WROWS()
  177. ** End height too big test
  178.  
  179. m.curpenw = m.boxpenw
  180.  
  181. ** Pen width type test
  182. IF TYPE([m.curpenw]) # [N]
  183.  
  184.   m.curpenw = 0
  185.  
  186. ENDIF TYPE([m.curpenw]) # [N]
  187. ** End pen width type test
  188.  
  189. ** Pen width value test
  190. IF BETWEEN(m.curpenw, -2, 2)
  191.  
  192.   m.curpenw = ROUND(m.curpenw, 0)
  193.  
  194. ENDIF BETWEEN(m.curpenw, -2, 2)
  195. ** End pen width value test
  196.  
  197. ** Memory variable type test
  198. IF TYPE([m.sunr]) # [N]
  199.  
  200.   m.sunr = 255
  201.  
  202. ENDIF TYPE([m.sunr]) # [N]
  203. ** End memory variable type test
  204.  
  205. ** Memory variable type test
  206. IF TYPE([m.sung]) # [N]
  207.  
  208.   m.sung = 255
  209.  
  210. ENDIF TYPE([m.sung]) # [N]
  211. ** End memory variable type test
  212.  
  213. ** Memory variable type test
  214. IF TYPE([m.sunb]) # [N]
  215.  
  216.   m.sunb = 255
  217.  
  218. ENDIF TYPE([m.sunb]) # [N]
  219. ** End memory variable type test
  220.  
  221. ** Memory variable type test
  222. IF TYPE([m.shader]) # [N]
  223.  
  224.   m.shader = 128
  225.  
  226. ENDIF TYPE([m.shader]) # [N]
  227. ** End memory variable type test
  228.  
  229. ** Memory variable type test
  230. IF TYPE([m.shadeg]) # [N]
  231.  
  232.   m.shadeg = 128
  233.  
  234. ENDIF TYPE([m.shadeg]) # [N]
  235. ** End memory variable type test
  236.  
  237. ** Memory variable type test
  238. IF TYPE([m.shadeb]) # [N]
  239.  
  240.   m.shadeb = 128
  241.  
  242. ENDIF TYPE([m.shadeb]) # [N]
  243. ** End memory variable type test
  244.  
  245. ** In-laid box test
  246. IF m.curpenw < 0
  247.  
  248.   m.tempr = m.sunr
  249.   m.tempg = m.sung
  250.   m.tempb = m.sunb
  251.   m.sunr = m.shader
  252.   m.sung = m.shadeg
  253.   m.sunb = m.shadeb
  254.   m.shader = m.tempr
  255.   m.shadeg = m.tempg
  256.   m.shadeb = m.tempb
  257.   m.curpenw = -m.curpenw
  258.   
  259. ENDIF m.curpenw < 0
  260. ** End in-laid box test
  261.  
  262. ** Memory variable type test
  263. IF TYPE([m.facer]) # [N]
  264.  
  265.   m.facer = 192
  266.  
  267. ENDIF TYPE([m.facer]) # [N]
  268. ** End memory variable type test
  269.  
  270. ** Memory variable type test
  271. IF TYPE([m.faceg]) # [N]
  272.  
  273.   m.faceg = 192
  274.  
  275. ENDIF TYPE([m.faceg]) # [N]
  276. ** End memory variable type test
  277.  
  278. ** Memory variable type test
  279. IF TYPE([m.faceb]) # [N]
  280.  
  281.   m.faceb = 192
  282.  
  283. ENDIF TYPE([m.faceb]) # [N]
  284. ** End memory variable type test
  285.  
  286. ** Outline color parameter passing test
  287. IF TYPE([m.outliner]) # [N] AND ;
  288. TYPE([m.outlineg]) # [N] AND TYPE([m.outlineb]) # [N]
  289.  
  290.   m.out_on = .f.
  291.   STORE 192 TO m.outliner, m.outlineg, m.outlineb
  292.   
  293. ELSE 
  294.  
  295.   m.out_on = .t.  
  296.  
  297.   ** Memory variable type test
  298.   IF TYPE([m.outliner]) # [N]
  299.  
  300.     m.outliner = 192
  301.  
  302.   ENDIF TYPE([m.outliner]) # [N]
  303.   ** End memory variable type test
  304.  
  305.   ** Memory variable type test
  306.   IF TYPE([m.outlineg]) # [N]
  307.  
  308.     m.outlineg = 192
  309.  
  310.   ENDIF TYPE([m.outlineg]) # [N]
  311.   ** End memory variable type test
  312.  
  313.   ** Memory variable type test
  314.   IF TYPE([m.outlineb]) # [N]
  315.  
  316.     m.outlineb = 192
  317.  
  318.   ENDIF TYPE([m.outlineb]) # [N]
  319.   ** End memory variable type test
  320.  
  321. ENDIF TYPE([m.outliner]) # [N] AND ;
  322. TYPE([m.outlineg]) # [N] AND TYPE([m.outlineb]) # [N]
  323. ** End outline color parameter passing test
  324.  
  325. m.setdec = SET([DECIMALS])
  326. SET DECIMALS TO 15
  327. m.woutput = WOUTPUT()
  328. m.curfont = WFONT(1, m.woutput)       && holds the current font
  329. m.cursize = WFONT(2, m.woutput)       && holds the current size
  330. m.curstyle = WFONT(3, m.woutput)      && holds the current style
  331. m.hclength = FONTMETRIC(6, m.curfont, m.cursize, m.curstyle)
  332. m.vclength = FONTMETRIC(1, m.curfont, m.cursize, m.curstyle) + ;
  333. FONTMETRIC(5, m.curfont, m.cursize, m.curstyle)
  334.  
  335. ** Pen thickness test
  336. IF m.hclength * m.boxwdth <= m.curpenw * 2
  337.  
  338.   WAIT WINDOW [Pen width along horizontal axis too thick.] NOWAIT
  339.   SET DECIMALS TO &m.setdec
  340.   RETURN .f.
  341.  
  342. ENDIF m.hclength * m.boxwdth <= m.curpenw * 2
  343. ** End pen thickness test
  344.  
  345. ** Pen thickness test
  346. IF m.vclength * m.boxhgt <= m.curpenw * 2
  347.  
  348.   WAIT WINDOW [Pen width along vertical axis too thick.] NOWAIT
  349.   SET DECIMALS TO &m.setdec
  350.   RETURN .f.
  351.  
  352. ENDIF m.hclength * m.boxwdth <= m.curpenw * 2
  353. ** End pen thickness test
  354.  
  355. m.currow = m.boxrow
  356. m.curcol = m.boxcol
  357. m.looppen = m.curpenw
  358.  
  359. ** Box drawing loop
  360. FOR m.counter = 1 TO CEILING(m.curpenw / 6)
  361.  
  362.    m.looppen = IIF(m.looppen < 7, m.looppen, 6)
  363.    
  364.    ** First time through test
  365.    IF m.counter = 1
  366.    
  367.      m.prevpen = m.looppen
  368.      
  369.    ENDIF m.counter = 1
  370.    ** End first time through test
  371.    
  372.    DO BOXDRAW
  373.  
  374.    ** Row adjustment test
  375.    IF m.counter < CEILING(m.curpenw / 6)
  376.    
  377.      m.boxrow = m.boxrow + (m.looppen / m.vclength)
  378.      m.boxcol = m.boxcol + (m.looppen / m.hclength)
  379.      m.prevpen = m.looppen
  380.      m.looppen = m.curpenw - (6 * m.counter)
  381.      
  382.    ENDIF m.counter < CEILING(m.curpenw / 6)
  383.    ** End row adjustment test
  384.  
  385. ENDFOR m.counter = 1 TO CEILING(m.curpenw / 6)
  386. ** End box drawing loop
  387.  
  388. ** Button face
  389. @ m.currow + (m.curpenw / m.vclength), ;
  390. m.curcol + (m.curpenw / m.hclength) TO ;
  391. (m.currow + m.boxhgt) - (m.curpenw / m.vclength), ;
  392. (m.curcol + m.boxwdth) - (m.curpenw / m.hclength) ;  
  393. PATTERN m.pattern COLOR ;
  394. RGB(m.facer, m.faceg, m.faceb, m.facer, m.faceg, m.faceb)
  395.  
  396. ** Outline box drawing test
  397. IF m.out_on
  398.  
  399.   @ m.currow, m.curcol TO m.currow + m.boxhgt, m.curcol + m.boxwdth ;
  400.   PATTERN 0 PEN 0, m.pentype STYLE [1] ;
  401.   COLOR RGB(m.outliner, m.outlineg, m.outlineb, ;
  402.   m.outliner, m.outlineg, m.outlineb)
  403.  
  404. ENDIF m.out_on
  405. ** End outline box drawing test
  406.  
  407. SET DECIMALS TO &m.setdec
  408.  
  409. RETURN 
  410.  
  411. *****************
  412. PROCEDURE BOXDRAW
  413. *****************
  414.  
  415. ** Top line
  416. @ m.boxrow, m.boxcol TO m.boxrow, m.boxcol + ;
  417. (m.boxwdth - (((((2 * m.counter) - 1) * ;
  418. m.prevpen) - (m.prevpen - m.looppen)) / m.hclength)) ;
  419. PATTERN 0 PEN m.looppen STYLE [0] ;
  420. COLOR RGB(m.sunr, m.sung, m.sunb, m.sunr, m.sung, m.sunb)
  421.  
  422. ** Upper right triangles
  423. DO TRIANGLES WITH m.boxrow, m.boxcol + ;
  424. (m.boxwdth - (((((2 * m.counter) - 1) * ;
  425. m.prevpen) - (m.prevpen - m.looppen)) / m.hclength))
  426.  
  427. ** Left line
  428. @ m.boxrow + (m.looppen / m.vclength), m.boxcol TO ;
  429. m.boxrow + (m.boxhgt - (((((2 * m.counter) - 1) * ;
  430. m.prevpen) - (m.prevpen - m.looppen)) / m.vclength)), m.boxcol ;
  431. PATTERN 0 PEN m.looppen STYLE [0] ;
  432. COLOR RGB(m.sunr, m.sung, m.sunb, m.sunr, m.sung, m.sunb) 
  433.  
  434. ** Right line
  435. @ m.boxrow + (m.looppen / m.vclength), ;
  436. m.boxcol + (m.boxwdth - (((((2 * m.counter) - 1) * ;
  437. m.prevpen) - (m.prevpen - m.looppen)) / m.hclength)) TO ;
  438. m.boxrow + m.boxhgt - ;
  439. ((((m.counter - 1) * 2) * m.prevpen) / m.vclength), ;
  440. m.boxcol + (m.boxwdth - (((((2 * m.counter) - 1) * ;
  441. m.prevpen) - (m.prevpen - m.looppen)) / m.hclength)) ;
  442. PATTERN 0 PEN m.looppen STYLE [0] ;
  443. COLOR RGB(m.shader, m.shadeg, m.shadeb, m.shader, m.shadeg, m.shadeb)
  444.  
  445. ** Lower left triangles
  446. DO TRIANGLES WITH m.boxrow + ;
  447. (m.boxhgt - (((((2 * m.counter) - 1) * ;
  448. m.prevpen) - (m.prevpen - m.looppen)) / m.vclength)), m.boxcol
  449.  
  450. ** Bottom line
  451. @ m.boxrow + (m.boxhgt - (((((2 * m.counter) - 1) * ;
  452. m.prevpen) - (m.prevpen - m.looppen)) / m.vclength)), ;
  453. m.boxcol + (m.looppen / m.hclength) TO ;
  454. m.boxrow + (m.boxhgt - (((((2 * m.counter) - 1) * ;
  455. m.prevpen) - (m.prevpen - m.looppen)) / m.vclength)), ;
  456. m.boxcol + (m.boxwdth - (((((2 * m.counter) - 1) * ;
  457. m.prevpen) - (m.prevpen - m.looppen)) / m.hclength)) ;
  458. PATTERN 0 PEN m.looppen STYLE [0] ;
  459. COLOR RGB(m.shader, m.shadeg, m.shadeb, m.shader, m.shadeg, m.shadeb)
  460.  
  461. RETURN
  462.  
  463. *******************
  464. PROCEDURE TRIANGLES
  465. *******************
  466.  
  467. PARAMETERS m.row, m.col
  468.  
  469. ** Line drawing loop
  470. FOR mcounter = 1 TO m.looppen
  471.  
  472.   @ m.row + ((mcounter - 1) / m.vclength), m.col TO ;
  473.   m.row + ((mcounter - 1) / m.vclength), ;
  474.   m.col + ((m.looppen - mcounter) / m.hclength) ;
  475.   PATTERN 0 PEN 1 STYLE [0] ;
  476.   COLOR RGB(m.sunr, m.sung, m.sunb)
  477.   @ m.row + ((mcounter - 1) / m.vclength), ;
  478.   m.col + ((m.looppen - mcounter) / m.hclength) TO ;
  479.   m.row + ((mcounter - 1) / m.vclength), ;
  480.   m.col + (m.looppen / m.hclength) ;
  481.   PATTERN 0 PEN 1 STYLE [0] ;
  482.   COLOR RGB(m.shader, m.shadeg, m.shadeb)
  483.   
  484. ENDFOR mcounter = 1 TO m.looppen
  485. ** End line drawing loop
  486.  
  487. RETURN
  488.  
  489. * EOF: 3DBOX.PRG