# Solid5 7/8

``` 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
'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

'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.)
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)
``` Echo Basic Postings

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