Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 'petit computer 3d rendering engine
- 'june 1, 2014
- 'version 0.01
- 'list of constants
- 'xmax: maximum value for x on screen
- 'ymax: maximum value for y on screen
- 'xmid: middle x value of screen
- 'ymid: middle y value of screen
- 'vertcount: amount of vertices
- 'facecount: amount of faces
- 'scale: how big to display model
- '
- 'list of variables used
- '
- '*arrays*
- 'trip [3,3] vertice coordinates for face
- 'trip [3,3] derived from trip, contains screen coordinates for current face
- 'vertarray [vertcount,3] contains list ofcoordinates for vertices
- 'facearray [facecount,3] contains list of vertices for faces
- 'zbuffer [255,191] z pixel value
- 'temp [3] used in the sort methods
- '
- '*variables*
- 'nextline: used in wireframe face method, signifies next vertext to connect to
- 'currface: used to call wireframe face drawing method
- 'startx: used in rasterization algorithm
- 'endx: used in rasterization algorithm
- 'i: used in for loops, take care to not nest methods that use these inside each other
- 'k: used in for loops, take care to not nest methods that use these inside each other
- 'calls initialization methods
- GOSUB @RESET
- 'calls various methods to render and rotate object
- @MAINLOOP
- FOR CURRFACE = 0 TO FACECOUNT-1 STEP 1
- GOSUB @FACE
- 'PRINT CURRFACE
- NEXT
- GOTO @MAINLOOP
- 'initialization method
- 'takes void
- 'returns constants
- @RESET
- CLS
- GCLS
- 'declare constants
- XMAX = 255
- YMAX = 191
- XMID = XMAX/2
- YMID = YMAX/2+50
- POINTCOLOR = 255
- SCALE = -30
- DEGZ = 10
- DEGY = 10
- DEGX = 10
- 'declare arrays
- DIM ZBUFFER(256,192)
- DIM TRIP(3,3)
- DIM TEMP(3)
- DIM LINE(4,3)
- DIM LIGHT(3)
- DIM VEC(3,2)
- DIM NORMAL(3)
- DIM LIGHTV(3)
- DIM MAG(2)
- LIGHT(0) = 3
- LIGHT(1) = 0
- LIGHT(2) = 0
- 'fix colors
- FOR I = 0 TO 255
- C$ = HEX$(I,2)
- COLSET "GRP", I, C$ + C$ + C$
- NEXT
- GOSUB @CLEARZ
- RETURN
- 'zbuffer clearing method
- 'takes zbuffer [255,191]
- 'returns zbuffer [255,191]
- @CLEARZ
- FOR I=0 TO 191 STEP 1
- FOR K=0 TO 255 STEP 1
- ZBUFFER(K,I) = -524287
- NEXT
- NEXT
- RETURN
- 'face drawing method
- 'takes currface
- 'returns void
- @FACE
- FOR I = 0 TO 2 STEP 1
- FOR K = 0 TO 2 STEP 1
- TRIP(I,K) = VERTARRAY(FACEARRAY(CURRFACE,I),K)
- NEXT
- NEXT
- GOSUB @CALCULATECOLOR
- GOSUB @ROTATIONS
- TRIP(0,0) = TRIP(0,0) * SCALE +XMID
- TRIP(0,1) = TRIP(0,1) * SCALE +YMID
- TRIP(0,2) = TRIP(0,2)
- TRIP(1,0) = TRIP(1,0) * SCALE +XMID
- TRIP(1,1) = TRIP(1,1) * SCALE +YMID
- TRIP(1,2) = TRIP(1,2)
- TRIP(2,0) = TRIP(2,0) * SCALE +XMID
- TRIP(2,1) = TRIP(2,1) * SCALE +YMID
- TRIP(2,2) = TRIP(2,2)
- GOSUB @DRAWTRIANGLE
- ' GOSUB @DRAWLINE
- RETURN
- 'rotations method
- 'takes trip [3,3], degx, degy, degz
- 'returns trip
- @ROTATIONS
- FOR I=0 TO 2
- X = TRIP(I,0)*COS(RAD(DEGZ))-TRIP(I,1)*SIN(RAD(DEGZ))
- Y = TRIP(I,0)*SIN(RAD(DEGZ))+TRIP(I,1)*COS(RAD(DEGZ))
- TRIP(I,0) = X
- TRIP(I,1) = Y
- NEXT
- FOR I=0 TO 2
- Y = TRIP(I,1)*COS(RAD(DEGX))-TRIP(I,2)*SIN(RAD(DEGX))
- Z = TRIP(I,1)*SIN(RAD(DEGX))+TRIP(I,2)*COS(RAD(DEGX))
- TRIP(I,1) = Y
- TRIP(I,2) = Z
- NEXT
- FOR I=0 TO 2
- Z = TRIP(I,2)*COS(RAD(DEGY))-TRIP(I,0)*SIN(RAD(DEGY))
- X = TRIP(I,2)*SIN(RAD(DEGY))+TRIP(I,0)*COS(RAD(DEGY))
- TRIP(I,2) = Z
- TRIP(I,0) = X
- NEXT
- RETURN
- 'calculate color method
- 'takes trip [3,3]
- 'returns pointcolor
- @CALCULATECOLOR
- VEC(0,0) = TRIP(1,0) - TRIP(0,0)
- VEC(1,0) = TRIP(1,1) - TRIP(0,1)
- VEC(2,0) = TRIP(1,2) - TRIP(0,2)
- VEC(0,1) = TRIP(2,0) - TRIP(0,0)
- VEC(1,1) = TRIP(2,1) - TRIP(0,1)
- VEC(2,1) = TRIP(2,2) - TRIP(0,2)
- MAG(0) = SQR(POW(VEC(0,0),2) + POW(VEC(1,0),2) + POW(VEC(2,0),2))
- MAG(1) = SQR(POW(VEC(0,1),2) + POW(VEC(1,1),2) + POW(VEC(2,1),2))
- IF !MAG(0) THEN MAG(0)=1
- IF !MAG(1) THEN MAG(1)=1
- FOR G=0 TO 1
- FOR H=0 TO 2
- VEC(H,G) = VEC(H,G) / MAG(G)
- NEXT
- NEXT
- NORMAL(0) = VEC(1,0) * VEC(2,1) - VEC(2,0) * VEC(1,1)
- NORMAL(1) = VEC(2,0) * VEC(0,1) - VEC(0,0) * VEC(2,1)
- NORMAL(2) = VEC(0,0) * VEC(1,1) - VEC(1,0) * VEC(0,1)
- LIGHTV(0) = LIGHT(0) - (TRIP(0,0) + TRIP(1,0) + TRIP(2,0)) / 3
- LIGHTV(1) = LIGHT(1) - (TRIP(0,1) + TRIP(1,1) + TRIP(2,1)) / 3
- LIGHTV(2) = LIGHT(2) - (TRIP(0,2) + TRIP(1,2) + TRIP(2,2)) / 3
- PROD = LIGHTV(0)*NORMAL(0) + LIGHTV(1)*NORMAL(1) + LIGHTV(2)*NORMAL(2)
- MAGA = SQR(POW(NORMAL(0),2) + POW(NORMAL(1),2) + POW(NORMAL(2),2))
- MAGB = SQR(POW(LIGHTV(0),2) + POW(LIGHTV(1),2) + POW(LIGHTV(2),2))
- IF !MAGA THEN MAGA=1
- IF !MAGB THEN MAGB=1
- POINTCOLOR = POW((PROD / MAGA / MAGB + 1) / 2,2) * 255
- IF POINTCOLOR < 0 THEN POINTCOLOR = 0
- IF POINTCOLOR > 255 THEN POINTCOLOR = 0
- RETURN
- 'draw triangle method
- 'takes trip [3,3]
- 'returns void
- @DRAWTRIANGLE
- IF TRIP(0,1) > TRIP(1,1) THEN GOSUB @SORT1
- IF TRIP(1,1) > TRIP(2,1) THEN GOSUB @SORT2
- IF TRIP(0,1) > TRIP(1,1) THEN GOSUB @SORT1
- IF TRIP(1,1)-TRIP(0,1)>0 THEN GOSUB @ISLOPE1CALC ELSE ISLOPE1 = 0
- IF TRIP(2,1)-TRIP(0,1)>0 THEN GOSUB @ISLOPE2CALC ELSE ISLOPE2 = 0
- IF ISLOPE1 > ISLOPE2 THEN GOSUB @PREPROC1 ELSE GOSUB @PREPROC2
- RETURN
- 'inverse slope 1 calculation method
- 'takes trip [3,3]
- 'returns islope1
- @ISLOPE1CALC
- ISLOPE1=(TRIP(1,0)-TRIP(0,0))/(TRIP(1,1)-TRIP(0,1))
- RETURN
- 'inverse slope 2 calculation method
- 'takes trip [3,3]
- 'returns islope2
- @ISLOPE2CALC
- ISLOPE2=(TRIP(2,0)-TRIP(0,0))/(TRIP(2,1)-TRIP(0,1))
- RETURN
- 'sort method 1
- 'takes trip [3,3]
- 'returns trip [3,3]
- @SORT1
- TEMP(0) = TRIP(1,0) : TEMP(1) = TRIP(1,1) : TEMP(2) = TRIP(1,2)
- TRIP(1,0)= TRIP(0,0) : TRIP(1,1) = TRIP(0,1) : TRIP(1,2) = TRIP(0,2)
- TRIP(0,0) = TEMP(0) : TRIP(0,1) = TEMP(1) : TRIP(0,2) = TEMP(2)
- RETURN
- 'sort method 2
- 'takes trip [3,3]
- 'returns trip [3,3]
- @SORT2
- TEMP(0) = TRIP(1,0) : TEMP(1) = TRIP(1,1) : TEMP(2) = TRIP(1,2)
- TRIP(1,0)= TRIP(2,0) : TRIP(1,1) = TRIP(2,1) : TRIP(1,2) = TRIP(2,2)
- TRIP(2,0) = TEMP(0) : TRIP(2,1) = TEMP(1) : TRIP(2,2) = TEMP(2)
- RETURN
- 'pre-process method #1
- 'takes trip [3,3]
- 'returns void
- @PREPROC1
- FOR Y = TRIP(0,1) TO TRIP(2,1) STEP 1
- IF Y < TRIP(1,1) THEN GOSUB @PROC1 ELSE GOSUB @PROC2
- GOSUB @PROCESSLINE
- NEXT
- RETURN
- @PROC1
- LINE(0,0) = TRIP(0,0) : LINE(0,1) = TRIP(0,1) : LINE(0,2) = TRIP(0,2)
- LINE(1,0) = TRIP(2,0) : LINE(1,1) = TRIP(2,1) : LINE(1,2) = TRIP(2,2)
- LINE(2,0) = TRIP(0,0) : LINE(2,1) = TRIP(0,1) : LINE(2,2) = TRIP(0,2)
- LINE(3,0) = TRIP(1,0) : LINE(3,1) = TRIP(1,1) : LINE(3,2) = TRIP(1,2)
- RETURN
- @PROC2
- LINE(0,0) = TRIP(0,0) : LINE(0,1) = TRIP(0,1) : LINE(0,2) = TRIP(0,2)
- LINE(1,0) = TRIP(2,0) : LINE(1,1) = TRIP(2,1) : LINE(1,2) = TRIP(2,2)
- LINE(2,0) = TRIP(1,0) : LINE(2,1) = TRIP(1,1) : LINE(2,2) = TRIP(1,2)
- LINE(3,0) = TRIP(2,0) : LINE(3,1) = TRIP(2,1) : LINE(3,2) = TRIP(2,2)
- RETURN
- 'pre-process method #2
- 'takes trip [3,3]
- 'returns void
- @PREPROC2
- FOR Y = TRIP(0,1) TO TRIP(2,1) STEP 1
- IF Y < TRIP(1,1) THEN GOSUB @PROC3 ELSE GOSUB @PROC4
- GOSUB @PROCESSLINE
- NEXT
- RETURN
- @PROC3
- LINE(0,0) = TRIP(0,0) : LINE(0,1) = TRIP(0,1) : LINE(0,2) = TRIP(0,2)
- LINE(1,0) = TRIP(1,0) : LINE(1,1) = TRIP(1,1) : LINE(1,2) = TRIP(1,2)
- LINE(2,0) = TRIP(0,0) : LINE(2,1) = TRIP(0,1) : LINE(2,2) = TRIP(0,2)
- LINE(3,0) = TRIP(2,0) : LINE(3,1) = TRIP(2,1) : LINE(3,2) = TRIP(2,2)
- RETURN
- @PROC4
- LINE(0,0) = TRIP(1,0) : LINE(0,1) = TRIP(1,1) : LINE(0,2) = TRIP(1,2)
- LINE(1,0) = TRIP(2,0) : LINE(1,1) = TRIP(2,1) : LINE(1,2) = TRIP(2,2)
- LINE(2,0) = TRIP(0,0) : LINE(2,1) = TRIP(0,1) : LINE(2,2) = TRIP(0,2)
- LINE(3,0) = TRIP(2,0) : LINE(3,1) = TRIP(2,1) : LINE(3,2) = TRIP(2,2)
- RETURN
- 'process line method
- 'takes line [4,3]
- 'returns void
- @PROCESSLINE
- IF LINE(0,1) != LINE(1,1) THEN GRADIENT1 = (Y-LINE(0,1))/(LINE(1,1)-LINE(0,1)) ELSE GRADIENT1 = 1
- IF LINE(2,1) != LINE(3,1) THEN GRADIENT2 = (Y-LINE(2,1))/(LINE(3,1)-LINE(2,1)) ELSE GRADIENT2 = 1
- IF GRADIENT1 > 1 THEN GRADIENT1 = 1
- IF GRADIENT2 > 1 THEN GRADIENT2 = 1
- IF GRADIENT1 < 0 THEN GRADIENT1 = 0
- IF GRADIENT2 < 0 THEN GRADIENT0 = 0
- STARTX = FLOOR(LINE(0,0) + (LINE(1,0) - LINE(0,0)) * GRADIENT1)
- ENDX = FLOOR(LINE(2,0) + (LINE(3,0) - LINE(2,0)) * GRADIENT2)
- STARTZ = LINE(0,2) + (LINE(1,2) - LINE(0,2)) * GRADIENT1
- ENDZ = LINE(2,2) + (LINE(3,2) - LINE(2,2)) * GRADIENT2
- FOR X = STARTX TO ENDX STEP 1
- IF STARTX != ENDX THEN GRADIENT = (X - STARTX) / (ENDX - STARTX) ELSE GRADIENT = 1
- Z = STARTZ + (ENDZ - STARTZ) * GRADIENT
- GOSUB @DRAWPOINT
- NEXT
- RETURN
- 'draw point method
- 'takes x, y, color
- 'returns void
- @DRAWPOINT
- IF (0 > X OR X > XMAX OR Y > YMAX OR 0 > Y) THEN RETURN
- IF Z < ZBUFFER(X,Y) THEN RETURN ELSE ZBUFFER(X,Y) = Z
- GPSET X, Y, POINTCOLOR
- RETURN
- 'drawline method
- 'takes trip array
- @DRAWLINE
- GLINE TRIP(0,0), TRIP(0,1), TRIP(1,0), TRIP(1,1),POINTCOLOR
- GLINE TRIP(1,0), TRIP(1,1), TRIP(2,0), TRIP(2,1),POINTCOLOR
- GLINE TRIP(2,0), TRIP(2,1), TRIP(0,0), TRIP(0,1),POINTCOLOR
- RETURN
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement