Advertisement
Guest User

3D rendering engine

a guest
Feb 21st, 2016
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 'petit computer 3d rendering engine
  2. 'june 1, 2014
  3. 'version 0.01
  4. 'list of constants
  5. 'xmax: maximum value for x on screen
  6. 'ymax: maximum value for y on screen
  7. 'xmid: middle x value of screen
  8. 'ymid: middle y value of screen
  9. 'vertcount: amount of vertices
  10. 'facecount: amount of faces
  11. 'scale: how big to display model
  12. '
  13. 'list of variables used
  14. '
  15. '*arrays*
  16. 'trip [3,3] vertice coordinates for face
  17. 'trip [3,3] derived from trip, contains screen coordinates for current face
  18. 'vertarray [vertcount,3] contains list ofcoordinates for vertices
  19. 'facearray [facecount,3] contains list of vertices for faces
  20. 'zbuffer [255,191] z pixel value
  21. 'temp [3] used in the sort methods
  22. '
  23. '*variables*
  24. 'nextline: used in wireframe face method, signifies next vertext to connect to
  25. 'currface: used to call wireframe face drawing method
  26. 'startx: used in rasterization algorithm
  27. 'endx: used in rasterization algorithm
  28. 'i: used in for loops, take care to not nest methods that use these inside each other
  29. 'k: used in for loops, take care to not nest methods that use these inside each other
  30.  
  31. 'calls initialization methods
  32. GOSUB @RESET
  33.  
  34. 'calls various methods to render and rotate object
  35. @MAINLOOP
  36.  FOR CURRFACE = 0 TO FACECOUNT-1 STEP 1
  37.   GOSUB @FACE
  38.   'PRINT CURRFACE
  39.  NEXT
  40. GOTO @MAINLOOP
  41.  
  42. 'initialization method
  43. 'takes void
  44. 'returns constants
  45. @RESET
  46.  CLS
  47.  GCLS
  48.  'declare constants
  49.  XMAX = 255
  50.  YMAX = 191
  51.  XMID = XMAX/2
  52.  YMID = YMAX/2+50
  53.  POINTCOLOR = 255
  54.  SCALE = -30
  55.  
  56.  DEGZ = 10
  57.  DEGY = 10
  58.  DEGX = 10
  59.  
  60.  'declare arrays
  61.  DIM ZBUFFER(256,192)
  62.  DIM TRIP(3,3)
  63.  DIM TEMP(3)
  64.  DIM LINE(4,3)
  65.  DIM LIGHT(3)
  66.  DIM VEC(3,2)
  67.  DIM NORMAL(3)
  68.  DIM LIGHTV(3)
  69.  DIM MAG(2)
  70.  
  71.  LIGHT(0) = 3
  72.  LIGHT(1) = 0
  73.  LIGHT(2) = 0
  74.  
  75.  'fix colors
  76.  FOR I = 0 TO 255
  77.   C$ = HEX$(I,2)
  78.   COLSET "GRP", I, C$ + C$ + C$
  79.  NEXT
  80.  
  81.  GOSUB @CLEARZ
  82.  
  83. RETURN
  84.  
  85. 'zbuffer clearing method
  86. 'takes zbuffer [255,191]
  87. 'returns zbuffer [255,191]
  88. @CLEARZ
  89.  FOR I=0 TO 191 STEP 1
  90.   FOR K=0 TO 255 STEP 1
  91.    ZBUFFER(K,I) = -524287
  92.   NEXT
  93.  NEXT
  94. RETURN
  95.  
  96. 'face drawing method
  97. 'takes currface
  98. 'returns void
  99. @FACE
  100.  FOR I = 0 TO 2 STEP 1
  101.   FOR K = 0 TO 2 STEP 1
  102.    TRIP(I,K) = VERTARRAY(FACEARRAY(CURRFACE,I),K)
  103.   NEXT
  104.  NEXT
  105.   GOSUB @CALCULATECOLOR
  106.   GOSUB @ROTATIONS
  107.   TRIP(0,0) = TRIP(0,0) * SCALE +XMID
  108.   TRIP(0,1) = TRIP(0,1) * SCALE +YMID
  109.   TRIP(0,2) = TRIP(0,2)
  110.   TRIP(1,0) = TRIP(1,0) * SCALE +XMID
  111.   TRIP(1,1) = TRIP(1,1) * SCALE +YMID
  112.   TRIP(1,2) = TRIP(1,2)
  113.   TRIP(2,0) = TRIP(2,0) * SCALE +XMID
  114.   TRIP(2,1) = TRIP(2,1) * SCALE +YMID
  115.   TRIP(2,2) = TRIP(2,2)
  116.   GOSUB @DRAWTRIANGLE
  117. '  GOSUB @DRAWLINE
  118. RETURN
  119.  
  120. 'rotations method
  121. 'takes trip [3,3], degx, degy, degz
  122. 'returns trip
  123. @ROTATIONS
  124.  FOR I=0 TO 2
  125.   X = TRIP(I,0)*COS(RAD(DEGZ))-TRIP(I,1)*SIN(RAD(DEGZ))
  126.   Y = TRIP(I,0)*SIN(RAD(DEGZ))+TRIP(I,1)*COS(RAD(DEGZ))
  127.   TRIP(I,0) = X
  128.   TRIP(I,1) = Y
  129.  NEXT
  130.  FOR I=0 TO 2
  131.   Y = TRIP(I,1)*COS(RAD(DEGX))-TRIP(I,2)*SIN(RAD(DEGX))
  132.   Z = TRIP(I,1)*SIN(RAD(DEGX))+TRIP(I,2)*COS(RAD(DEGX))
  133.   TRIP(I,1) = Y
  134.   TRIP(I,2) = Z
  135.  NEXT
  136.  FOR I=0 TO 2
  137.   Z = TRIP(I,2)*COS(RAD(DEGY))-TRIP(I,0)*SIN(RAD(DEGY))
  138.   X = TRIP(I,2)*SIN(RAD(DEGY))+TRIP(I,0)*COS(RAD(DEGY))
  139.   TRIP(I,2) = Z
  140.   TRIP(I,0) = X
  141.  NEXT
  142.  
  143. RETURN
  144.  
  145. 'calculate color method
  146. 'takes trip [3,3]
  147. 'returns pointcolor
  148. @CALCULATECOLOR
  149.  VEC(0,0) = TRIP(1,0) - TRIP(0,0)
  150.  VEC(1,0) = TRIP(1,1) - TRIP(0,1)
  151.  VEC(2,0) = TRIP(1,2) - TRIP(0,2)
  152.  VEC(0,1) = TRIP(2,0) - TRIP(0,0)
  153.  VEC(1,1) = TRIP(2,1) - TRIP(0,1)
  154.  VEC(2,1) = TRIP(2,2) - TRIP(0,2)
  155.  
  156.  MAG(0) = SQR(POW(VEC(0,0),2) + POW(VEC(1,0),2) + POW(VEC(2,0),2))
  157.  MAG(1) = SQR(POW(VEC(0,1),2) + POW(VEC(1,1),2) + POW(VEC(2,1),2))
  158.  
  159.  IF !MAG(0) THEN MAG(0)=1
  160.  IF !MAG(1) THEN MAG(1)=1
  161.  
  162.  FOR G=0 TO 1
  163.   FOR H=0 TO 2
  164.    VEC(H,G) = VEC(H,G) / MAG(G)
  165.   NEXT
  166.  NEXT
  167.  
  168.  NORMAL(0) = VEC(1,0) * VEC(2,1) - VEC(2,0) * VEC(1,1)
  169.  NORMAL(1) = VEC(2,0) * VEC(0,1) - VEC(0,0) * VEC(2,1)
  170.  NORMAL(2) = VEC(0,0) * VEC(1,1) - VEC(1,0) * VEC(0,1)
  171.  
  172.  LIGHTV(0) = LIGHT(0) - (TRIP(0,0) + TRIP(1,0) + TRIP(2,0)) / 3
  173.  LIGHTV(1) = LIGHT(1) - (TRIP(0,1) + TRIP(1,1) + TRIP(2,1)) / 3
  174.  LIGHTV(2) = LIGHT(2) - (TRIP(0,2) + TRIP(1,2) + TRIP(2,2)) / 3
  175.  PROD = LIGHTV(0)*NORMAL(0) + LIGHTV(1)*NORMAL(1) + LIGHTV(2)*NORMAL(2)
  176.  MAGA = SQR(POW(NORMAL(0),2) + POW(NORMAL(1),2) + POW(NORMAL(2),2))
  177.  MAGB = SQR(POW(LIGHTV(0),2) + POW(LIGHTV(1),2) + POW(LIGHTV(2),2))
  178.  IF !MAGA THEN MAGA=1
  179.  IF !MAGB THEN MAGB=1
  180.  POINTCOLOR = POW((PROD / MAGA / MAGB + 1) / 2,2) * 255
  181.  IF POINTCOLOR < 0 THEN POINTCOLOR = 0
  182.  IF POINTCOLOR > 255 THEN POINTCOLOR = 0
  183.  
  184. RETURN
  185.  
  186. 'draw triangle method
  187. 'takes trip [3,3]
  188. 'returns void
  189. @DRAWTRIANGLE
  190.  IF TRIP(0,1) > TRIP(1,1) THEN GOSUB @SORT1
  191.  IF TRIP(1,1) > TRIP(2,1) THEN GOSUB @SORT2
  192.  IF TRIP(0,1) > TRIP(1,1) THEN GOSUB @SORT1
  193.  IF TRIP(1,1)-TRIP(0,1)>0 THEN GOSUB @ISLOPE1CALC ELSE ISLOPE1 = 0
  194.  IF TRIP(2,1)-TRIP(0,1)>0 THEN GOSUB @ISLOPE2CALC ELSE ISLOPE2 = 0
  195.  IF ISLOPE1 > ISLOPE2 THEN GOSUB @PREPROC1 ELSE GOSUB @PREPROC2
  196. RETURN
  197.  
  198. 'inverse slope 1 calculation method
  199. 'takes trip [3,3]
  200. 'returns islope1
  201. @ISLOPE1CALC
  202.  ISLOPE1=(TRIP(1,0)-TRIP(0,0))/(TRIP(1,1)-TRIP(0,1))
  203. RETURN
  204.  
  205. 'inverse slope 2 calculation method
  206. 'takes trip [3,3]
  207. 'returns islope2
  208. @ISLOPE2CALC
  209.  ISLOPE2=(TRIP(2,0)-TRIP(0,0))/(TRIP(2,1)-TRIP(0,1))
  210. RETURN
  211.  
  212. 'sort method 1
  213. 'takes trip [3,3]
  214. 'returns trip [3,3]
  215. @SORT1
  216.  TEMP(0) = TRIP(1,0) : TEMP(1) = TRIP(1,1) : TEMP(2) = TRIP(1,2)
  217.  TRIP(1,0)= TRIP(0,0) : TRIP(1,1) = TRIP(0,1) : TRIP(1,2) = TRIP(0,2)
  218.  TRIP(0,0) = TEMP(0) : TRIP(0,1) = TEMP(1) : TRIP(0,2) = TEMP(2)
  219. RETURN
  220.  
  221. 'sort method 2
  222. 'takes trip [3,3]
  223. 'returns trip [3,3]
  224. @SORT2
  225.  TEMP(0) = TRIP(1,0) : TEMP(1) = TRIP(1,1) : TEMP(2) = TRIP(1,2)
  226.  TRIP(1,0)= TRIP(2,0) : TRIP(1,1) = TRIP(2,1) : TRIP(1,2) = TRIP(2,2)
  227.  TRIP(2,0) = TEMP(0) : TRIP(2,1) = TEMP(1) : TRIP(2,2) = TEMP(2)
  228. RETURN
  229.  
  230.  
  231. 'pre-process method #1
  232. 'takes trip [3,3]
  233. 'returns void
  234. @PREPROC1
  235.  FOR Y = TRIP(0,1) TO TRIP(2,1) STEP 1
  236.   IF Y < TRIP(1,1) THEN GOSUB @PROC1 ELSE GOSUB @PROC2
  237.   GOSUB @PROCESSLINE
  238.  NEXT
  239. RETURN
  240. @PROC1
  241. LINE(0,0) = TRIP(0,0) : LINE(0,1) = TRIP(0,1) : LINE(0,2) = TRIP(0,2)
  242. LINE(1,0) = TRIP(2,0) : LINE(1,1) = TRIP(2,1) : LINE(1,2) = TRIP(2,2)
  243. LINE(2,0) = TRIP(0,0) : LINE(2,1) = TRIP(0,1) : LINE(2,2) = TRIP(0,2)
  244. LINE(3,0) = TRIP(1,0) : LINE(3,1) = TRIP(1,1) : LINE(3,2) = TRIP(1,2)
  245. RETURN
  246. @PROC2
  247. LINE(0,0) = TRIP(0,0) : LINE(0,1) = TRIP(0,1) : LINE(0,2) = TRIP(0,2)
  248. LINE(1,0) = TRIP(2,0) : LINE(1,1) = TRIP(2,1) : LINE(1,2) = TRIP(2,2)
  249. LINE(2,0) = TRIP(1,0) : LINE(2,1) = TRIP(1,1) : LINE(2,2) = TRIP(1,2)
  250. LINE(3,0) = TRIP(2,0) : LINE(3,1) = TRIP(2,1) : LINE(3,2) = TRIP(2,2)
  251. RETURN
  252.  
  253. 'pre-process method #2
  254. 'takes trip [3,3]
  255. 'returns void
  256. @PREPROC2
  257.  FOR Y = TRIP(0,1) TO TRIP(2,1) STEP 1
  258.   IF Y < TRIP(1,1) THEN GOSUB @PROC3 ELSE GOSUB @PROC4
  259.   GOSUB @PROCESSLINE
  260.  NEXT
  261. RETURN
  262. @PROC3
  263. LINE(0,0) = TRIP(0,0) : LINE(0,1) = TRIP(0,1) : LINE(0,2) = TRIP(0,2)
  264. LINE(1,0) = TRIP(1,0) : LINE(1,1) = TRIP(1,1) : LINE(1,2) = TRIP(1,2)
  265. LINE(2,0) = TRIP(0,0) : LINE(2,1) = TRIP(0,1) : LINE(2,2) = TRIP(0,2)
  266. LINE(3,0) = TRIP(2,0) : LINE(3,1) = TRIP(2,1) : LINE(3,2) = TRIP(2,2)
  267. RETURN
  268. @PROC4
  269. LINE(0,0) = TRIP(1,0) : LINE(0,1) = TRIP(1,1) : LINE(0,2) = TRIP(1,2)
  270. LINE(1,0) = TRIP(2,0) : LINE(1,1) = TRIP(2,1) : LINE(1,2) = TRIP(2,2)
  271. LINE(2,0) = TRIP(0,0) : LINE(2,1) = TRIP(0,1) : LINE(2,2) = TRIP(0,2)
  272. LINE(3,0) = TRIP(2,0) : LINE(3,1) = TRIP(2,1) : LINE(3,2) = TRIP(2,2)
  273. RETURN
  274.  
  275. 'process line method
  276. 'takes line [4,3]
  277. 'returns void
  278. @PROCESSLINE
  279.  IF LINE(0,1) != LINE(1,1) THEN GRADIENT1 = (Y-LINE(0,1))/(LINE(1,1)-LINE(0,1)) ELSE GRADIENT1 = 1
  280.  IF LINE(2,1) != LINE(3,1) THEN GRADIENT2 = (Y-LINE(2,1))/(LINE(3,1)-LINE(2,1)) ELSE GRADIENT2 = 1
  281.  
  282.  IF GRADIENT1 > 1 THEN GRADIENT1 = 1
  283.  IF GRADIENT2 > 1 THEN GRADIENT2 = 1
  284.  IF GRADIENT1 < 0 THEN GRADIENT1 = 0
  285.  IF GRADIENT2 < 0 THEN GRADIENT0 = 0
  286.  
  287.  STARTX = FLOOR(LINE(0,0) + (LINE(1,0) - LINE(0,0)) * GRADIENT1)
  288.  ENDX = FLOOR(LINE(2,0) + (LINE(3,0) - LINE(2,0)) * GRADIENT2)
  289.  
  290.  STARTZ = LINE(0,2) + (LINE(1,2) - LINE(0,2)) * GRADIENT1
  291.  ENDZ = LINE(2,2) + (LINE(3,2) - LINE(2,2)) * GRADIENT2
  292.  
  293.  FOR X = STARTX TO ENDX STEP 1
  294.    IF STARTX != ENDX THEN GRADIENT = (X - STARTX) / (ENDX - STARTX) ELSE GRADIENT = 1
  295.   Z = STARTZ + (ENDZ - STARTZ) * GRADIENT
  296.   GOSUB @DRAWPOINT
  297.  NEXT
  298. RETURN
  299.  
  300.  
  301. 'draw point method
  302. 'takes x, y, color
  303. 'returns void
  304. @DRAWPOINT
  305.  IF (0 > X OR X > XMAX OR Y > YMAX OR 0 > Y) THEN RETURN
  306.  IF Z < ZBUFFER(X,Y) THEN RETURN ELSE ZBUFFER(X,Y) = Z
  307.  GPSET X, Y, POINTCOLOR
  308. RETURN
  309.  
  310. 'drawline method
  311. 'takes trip array
  312. @DRAWLINE
  313. GLINE TRIP(0,0), TRIP(0,1), TRIP(1,0), TRIP(1,1),POINTCOLOR
  314. GLINE TRIP(1,0), TRIP(1,1), TRIP(2,0), TRIP(2,1),POINTCOLOR
  315. GLINE TRIP(2,0), TRIP(2,1), TRIP(0,0), TRIP(0,1),POINTCOLOR
  316. RETURN
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement