BBS: Inland Empire Archive Date: 03-21-93 (03:44) Number: 357 From: RICH GELDREICH Refer#: NONE To: ALL Recvd: NO Subj: Solid5 7/8 Conf: (2) Quik_Bas
'Page 7 of SOLID5.BAS begins here. 'check for polygons which cannot be visible IF YHigh < 0 OR YLow > 199 OR XLow > 319 OR XHigh < 0 THEN EXIT SUB 'initialize the edge list FOR a = YLow TO YHigh EdgeList(a).Low = 32767 EdgeList(a).High = -32768 NEXT 'Remember the lowest & highest X and Y coordinates drawn to the 'screen for later erasing 'Find the start and stop X coodinates for each scan line DrawLine (x1), (y1), (x2), (y2), EdgeList() DrawLine (x2), (y2), (x3), (y3), EdgeList() DrawLine (x3), (y3), (x1), (y1), EdgeList() EdgeFill EdgeList(), YLow, YHigh, C END SUB 'Rotates the points of the object and the object's normals. 'Avoids floating point math for speed. SUB RotatePoints 'lookup the sine and cosine of each angle... s1& = SineTable(R1): c1& = SineTable(R1 + 90) s2& = SineTable(R2): c2& = SineTable(R2 + 90) s3& = SineTable(R3): c3& = SineTable(R3 + 90) 'rotate the points of the object FOR a = 0 TO MaxPoints xo = Points(a).XObject yo = Points(a).YObject zo = Points(a).ZObject GOSUB Rotate3D Points(a).XView = 160 + (x2 * 400&) \ z3 Points(a).YView = 100 + (y3 * 300&) \ z3 'IF y3 > 300 THEN STOP Points(a).XWorld = x2 Points(a).YWorld = y3 Points(a).ZWorld = z3 NEXT 'rotate the normals of each polygon... FOR a = 0 TO MaxPolys xo = Polys(a).WorldXN yo = Polys(a).WorldYN zo = Polys(a).WorldZN GOSUB Rotate3D P1 = Polys(a).P1 'unorigin the point x2 = x2 - Points(P1).XWorld y3 = y3 - Points(P1).YWorld z3 = z3 - Points(P1).ZWorld 'check the bounds just in case of a round off error IF x2 < -128 THEN x2 = -128 ELSE IF x2 > 128 THEN x2 = 128 IF y3 < -128 THEN y3 = -128 ELSE IF y3 > 128 THEN y3 = 128 IF z3 < -128 THEN z3 = -128 ELSE IF z3 > 128 THEN z3 = 128 'store the normal back; it's now ready for the shading 'calculations (which are simplistic now) Polys(a).NormalX = x2 + 128 Polys(a).NormalY = y3 + 128 Polys(a).NormalZ = z3 + 128 NEXT EXIT SUB Rotate3D: x1 = (xo * c1& - zo * s1&) \ 1024 'yaw z1 = (xo * s1& + zo * c1&) \ 1024 z3 = (z1 * c3& - yo * s3&) \ 1024 + oz 'pitch y2 = (z1 * s3& + yo * c3&) \ 1024 x2 = (x1 * c2& + y2 * s2&) \ 1024 + ox 'roll y3 = (y2 * c2& - x1 * s2&) \ 1024 + oy RETURN END SUB 'Shades the polygons using Lambert shading. Notice the total lack of 'floating point math- only 1 divide is required for each polygon shaded. '(This divide can be eliminated, but the shading won't be as accurate.) SUB ShadePolygons FOR a = 0 TO MaxPolys IF Polys(a).Culled = False THEN 'lookup the polygon's normal for shading '(128*128)\15 = 1092 Intensity = (lx(Polys(a).NormalX) + ly(Polys(a).NormalY) + _ lz(Polys(a).NormalZ)) \ 1092 IF Intensity < 0 THEN Intensity = 0 Intensity = Intensity + 5 IF Intensity > 15 THEN Intensity = 15 'Continued on page 8 --- MsgToss 2.0b * Origin: Computer Co-Op - Voorhees, NJ | Ted Hare (1:266/29)
Books at Amazon:
Back to BASIC: The History, Corruption, and Future of the Language
Hackers: Heroes of the Computer Revolution (including Tiny BASIC)
Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution
The Advent of the Algorithm: The Idea that Rules the World
Moths in the Machine: The Power and Perils of Programming
Mastering Visual Basic .NET