Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2013
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 'Pure QB Realtime Raytracer Demo
  2. 'Translated to/optimized for QB by Antoni Gual agual@eic.ictnet.es
  3. 'The original was written in C by Texel, a Spanish demo coder.
  4. 'It will not work in the IDE due to integer overflow errors.
  5. 'Compile with QB 4.0 or QB4.5 + ffix. It does 12.5 fps in my P4 1,4.
  6. 'The C version (DOS protected mode, DJGPP) does 50 fps :(
  7.  
  8. DECLARE SUB ffix
  9. 'ffix
  10. CONST objnum = 4
  11.  
  12. DIM n AS INTEGER, K AS INTEGER, OBJMIN AS INTEGER, OBJMIN2 AS INTEGER
  13. DIM OBJ(objnum)  AS INTEGER, l AS INTEGER, posi AS INTEGER, POS2 AS INTEGER
  14. DIM s AS INTEGER, t(8200) AS INTEGER, XX AS INTEGER, YY AS INTEGER, XQ AS INTEGER
  15. DIM YQ AS INTEGER, mmmm AS INTEGER, xx1 AS INTEGER, yy1 AS INTEGER
  16. DIM t2(8200) AS INTEGER, ipos AS INTEGER
  17.  
  18. DIM A(objnum) AS SINGLE, B(objnum) AS SINGLE, C(objnum) AS SINGLE
  19. DIM R(objnum) AS SINGLE
  20.  
  21.     SCREEN 13
  22.     DEF SEG = &HA000
  23.     'Cambiar la paleta a tonos de azul
  24.     OUT &H3C8, 0'
  25.     FOR n = 0 TO 127
  26.         OUT &H3C9, 0
  27.         OUT &H3C9, INT(n / 4)
  28.         OUT &H3C9, INT(n / 2)
  29.     NEXT
  30.     FOR n = 0 TO 127
  31.         OUT &H3C9, INT(n / 2)
  32.         OUT &H3C9, INT(31 + n / 4)
  33.         OUT &H3C9, 63
  34.     NEXT
  35.     D = 230
  36.     l = 0
  37.    
  38.     'four objects
  39.     OBJ(0) = 0: A(0) = -50 + l: B(0) = 0: C(0) = -100: R(0) = -55 * 55
  40.     OBJ(1) = 0: A(1) = 50 - l: B(1) = -25: C(1) = -120: R(1) = -55 * 55
  41.     OBJ(2) = 0: A(2) = 0: B(2) = 500: C(2) = -220: R(2) = -500! * 500
  42.     OBJ(3) = 1: A(3) = 60: B(3) = -35: C(3) = -30
  43.  
  44.     tt! = TIMER
  45.     FOR l = 0 TO 199
  46.        
  47.         A(0) = -50 + l
  48.         A(1) = 50 - l
  49.         posi = 400
  50.         mmmm = -1
  51.         'calculamos uno de cada 4 pixels a buffer t()
  52.         FOR Y = -40 TO 39 STEP 2
  53.             FOR X = -80 TO 79 STEP 2
  54.                 X0 = X
  55.                 Y0 = Y
  56.                 GOSUB raytrace
  57.                 t(posi) = COL
  58.                 posi = posi + 1
  59.             NEXT
  60.         NEXT
  61.         posi = 482
  62.         POS2 = 0
  63.         'calculamos pixels restantes, interpolando si podemos
  64.         FOR YQ = 6 TO 43
  65.             FOR XQ = 2 TO 77
  66.                  'interpolar
  67.                  IF t2(posi) = t2(posi + 1) AND t2(posi) = t2(posi + 80) AND t2(posi) = t2(posi + 81) THEN
  68.                     ipos = (YQ * 1280 + (XQ * 4))
  69.                     FOR YY = 0 TO 3
  70.                         FOR XX = 0 TO 3
  71.                            POKE ipos, (YY * (t(posi + 80) * (4 - XX) + t(posi + 81) * XX) + (t(posi) * (4 - XX) + t(posi + 1) * XX) * (4 - YY)) \ 16
  72.                            ipos = ipos + 1
  73.                         NEXT
  74.                         ipos = ipos + 316
  75.                     NEXT
  76.                  'no interpolar
  77.                  ELSE
  78.                     mmmm = 0
  79.                     FOR yy1 = 0 TO 3
  80.                         FOR xx1 = 0 TO 3
  81.                             IF xx1 OR yy1 THEN
  82.                                 X0 = (-160 + XQ * 4 + xx1) / 2
  83.                                 Y0 = (-100 + YQ * 4 + yy1) / 2
  84.                                 GOSUB raytrace
  85.                                 POKE (YQ * 4 + yy1) * 320 + XQ * 4 + xx1, COL
  86.                             ELSE
  87.                                 POKE YQ * 1280 + XQ * 4, t(posi)
  88.                             END IF
  89.                         NEXT
  90.                     NEXT
  91.                 END IF
  92.                 posi = posi + 1
  93.             NEXT
  94.             posi = posi + 4
  95.         NEXT
  96.     IF LEN(INKEY$) THEN EXIT FOR
  97.     NEXT
  98.     COLOR 255: PRINT l / (TIMER - tt!)
  99.     KK$ = INPUT$(1)
  100. END
  101.  
  102. raytrace:
  103.     Z0 = 0
  104.     MD = 1 / SQR(X0 * X0 + Y0 * Y0 + D * D)
  105.     X1 = X0 * MD
  106.     Y1 = Y0 * MD
  107.     Z1 = -(D + Z0) * MD
  108.     K = 0
  109.     COL = 0
  110.     OBJMIN = objnum
  111.     IF mmmm THEN t2(posi) = objnum
  112.     DO
  113.         TMIN = 327680
  114.         FOR n = 0 TO 2
  115.             IF OBJ(n) = 0 AND (OBJ(n) <> OBJMIN) THEN
  116.                  A0 = A(n) - X0
  117.                  B0 = B(n) - Y0
  118.                  C0 = C(n) - Z0
  119.                  TB = A0 * X1 + B0 * Y1 + C0 * Z1
  120.                  RZ = TB * TB - A0 * A0 - B0 * B0 - C0 * C0
  121.                  IF RZ >= R(n) THEN
  122.                       TN = TB - SQR(RZ - R(n))
  123.                       IF TN < TMIN AND TN > 0 THEN TMIN = TN: OBJMIN2 = n
  124.                  END IF
  125.             END IF
  126.         NEXT
  127.         OBJMIN = OBJMIN2
  128.         IF TMIN < 327680 AND (OBJ(OBJMIN) = 0) THEN
  129.              IF mmmm THEN t2(posi) = t2(posi) * K * objnum * 3 + OBJMIN
  130.              X0 = X0 + X1 * TMIN
  131.              Y0 = Y0 + Y1 * TMIN
  132.              Z0 = Z0 + Z1 * TMIN
  133.              NX = X0 - A(OBJMIN)
  134.              NY = Y0 - B(OBJMIN)
  135.              NZ = Z0 - C(OBJMIN)
  136.              CA = 2 * (NX * X1 + NY * Y1 + NZ * Z1) / (NX * NX + NY * NY + NZ * NZ + 1)
  137.              X1 = X1 - NX * CA
  138.              Y1 = Y1 - NY * CA
  139.              Z1 = Z1 - NZ * CA
  140.              A2 = A(3) - X0
  141.              B2 = B(3) - Y0
  142.              C2 = C(3) - Z0
  143.              MV = 1 / SQR(A2 * A2 + B2 * B2 + C2 * C2)
  144.              A2 = A2 * MV
  145.              B2 = B2 * MV
  146.              C2 = C2 * MV
  147.              s = 0
  148.              FOR n = 0 TO 2
  149.                 IF OBJ(n) = 0 AND NOT s THEN
  150.                    A0 = X0 - A(n)
  151.                    B0 = Y0 - B(n)
  152.                    C0 = Z0 - C(n)
  153.                    TB = A2 * A0 + B2 * B0 + C2 * C0
  154.                    RZ = TB * TB - A0 * A0 - B0 * B0 - C0 * C0
  155.                    IF RZ >= R(n) AND TB < 0 THEN s = -1: IF mmmm THEN t2(posi) = t2(posi) * 32
  156.                 END IF
  157.              NEXT
  158.              IF NOT s THEN
  159.                 IF mmmm THEN t2(posi) = t2(posi) + 1
  160.                 col2 = X1 * A2 + Y1 * B2 + Z1 * C2
  161.                 IF col2 < 0 THEN col2 = 0
  162.                 cc = col2 * col2
  163.                 col2 = cc * cc
  164.                 MV = SQR(NX * NX + NY * NY + NZ * NZ)
  165.                 'IF COL2 < 0 THEN COL2 = 0
  166.                 col2 = col2 + (NX * A2 + NY * B2 + NZ * C2) / MV
  167.                 IF col2 < 0 THEN col2 = 0
  168.                 COL = COL + col2 / ((K + 1) * (K + 1) * 2)
  169.                 IF COL > 1 THEN COL = 1
  170.              END IF
  171.         K = K + 1
  172.         END IF
  173.     LOOP WHILE TMIN < 327680 AND K <= 2
  174.     IF K = 0 THEN COL = 50 ELSE COL = COL * 255
  175. RETURN
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement