Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- DEFSNG A-Z
- DIM i AS LONG, vecs AS LONG, faces AS LONG
- vecs = 8
- DATA -1,1,1
- DATA 1,1,1
- DATA -1,-1,1
- DATA 1,-1,1
- DATA -1,1,-1
- DATA 1,1,-1
- DATA 1,-1,-1
- DATA -1,-1,-1
- faces = 12
- DATA 0,2,1
- DATA 1,2,3
- DATA 1,3,6
- DATA 1,6,5
- DATA 0,1,4
- DATA 1,5,4
- DATA 2,7,3
- DATA 3,7,6
- DATA 0,7,2
- DATA 0,4,7
- DATA 4,5,6
- DATA 4,6,7
- '-------------------------------
- _TITLE "KAJAM8"
- TYPE vec_t
- x AS SINGLE 'in world space
- y AS SINGLE
- z AS SINGLE
- tx AS SINGLE 'in camera space
- ty AS SINGLE
- tz AS SINGLE
- px AS SINGLE 'in screen space
- py AS SINGLE
- END TYPE
- DIM v(vecs) AS vec_t
- TYPE face_t
- p1 AS INTEGER
- p2 AS INTEGER
- p3 AS INTEGER
- END TYPE
- DIM f(faces) AS face_t
- FOR i = 0 TO vecs - 1: READ v(i).x, v(i).y, v(i).z: NEXT
- FOR i = 0 TO faces - 1: READ f(i).p1, f(i).p2, f(i).p3: NEXT
- DIM zbuf(319, 199) AS SINGLE
- SCREEN 13
- COLOR 15, 25
- WHILE INKEY$ <> CHR$(27)
- CLS
- ERASE zbuf
- 'camera location
- cx = 0: cy = 0: cz = -7.5 + 3 * COS(t)
- 'project vertices
- FOR i = 0 TO vecs - 1
- x = v(i).x: y = v(i).y: z = v(i).z
- a = rotx: GOSUB rotateX
- a = roty: GOSUB rotateY
- a = rotz: GOSUB rotateZ
- GOSUB project
- NEXT
- 'draw faces
- FOR i = 0 TO faces - 1
- p1 = f(i).p1: p2 = f(i).p2: p3 = f(i).p3
- 'backface culling test
- IF (v(p2).px - v(p1).px) * (v(p3).py - v(p1).py) > (v(p3).px - v(p1).px) * (v(p2).py - v(p1).py) THEN
- GOSUB triangle
- END IF
- NEXT
- 'update
- rotx = rotx + 0.017
- roty = roty + 0.027
- rotz = rotz + 0.037
- t = t + .022
- _DISPLAY
- _LIMIT 60
- WEND
- SYSTEM
- '-------------------------------
- triangle:
- IF v(p1).py > v(p2).py THEN temp = p2: p2 = p1: p1 = temp
- IF v(p2).py > v(p3).py THEN temp = p2: p2 = p3: p3 = temp
- IF v(p1).py > v(p2).py THEN temp = p2: p2 = p1: p1 = temp
- iy21 = 1 / (v(p2).py - v(p1).py)
- iy31 = 1 / (v(p3).py - v(p1).py)
- iy32 = 1 / (v(p3).py - v(p2).py)
- x21 = (v(p2).px - v(p1).px) * iy21
- x31 = (v(p3).px - v(p1).px) * iy31
- x32 = (v(p3).px - v(p2).px) * iy32
- z21 = (v(p2).tz - v(p1).tz) * iy21
- z31 = (v(p3).tz - v(p1).tz) * iy31
- z32 = (v(p3).tz - v(p2).tz) * iy32
- sy = v(p1).py: IF sy < 0 THEN sy = 0 'enforce y bounds
- ey = v(p3).py: IF ey > 199 THEN ey = 199
- FOR y = sy TO ey
- dy = y - v(p1).py
- sx = v(p1).px + dy * x31
- sz = v(p1).tz + dy * z31
- IF y < v(p2).py THEN
- ex = v(p1).px + dy * x21
- ez = v(p1).tz + dy * z21
- ELSE
- dy = y - v(p2).py
- ex = v(p2).px + dy * x32
- ez = v(p2).tz + dy * z32
- END IF
- IF sx > ex THEN
- temp = sx: sx = ex: ex = temp: temp = sz: sz = ez: ez = temp
- END IF
- IF sx < 0 THEN sx = 0 'enforce x bounds
- IF ex > 319 THEN ex = 319
- dzdx = (ez - sz) / (ex - sx): z = sz - 100
- FOR x = sx TO ex 'draw scanline (tight loop, some optimisation)
- IF zbuf(x, y) > z THEN PSET (x, y), i: zbuf(x, y) = z
- z = z + dzdx
- NEXT
- NEXT
- RETURN
- bline:
- LINE (v(p0).px, v(p0).py)-(v(p1).px, v(p1).py), 15
- RETURN
- project:
- x = x - cx: y = y - cy: z = z - cz
- zinv = 1 / z
- v(i).tx = x: v(i).ty = y: v(i).tz = z
- v(i).px = 160 + 400 * x * zinv
- v(i).py = 100 - 400 * y * zinv
- RETURN
- rotateX:
- ca = COS(a): sa = SIN(a)
- y1 = y * ca - z * sa
- z1 = y * sa + z * ca
- y = y1: z = z1
- RETURN
- rotateY:
- ca = COS(a): sa = SIN(a)
- x1 = x * ca - z * sa
- z1 = x * sa + z * ca
- x = x1: z = z1
- RETURN
- rotateZ:
- ca = COS(a): sa = SIN(a)
- x1 = x * ca - y * sa
- y1 = x * sa + y * ca
- x = x1: y = y1
- RETURN
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement