Mysoft

Untitled

May 27th, 2026 (edited)
200
0
Never
5
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
QBasic 9.84 KB | Source Code | 0 0
  1. DEFINT I
  2. DEFSTR S
  3. DEFDBL D
  4. DEFSNG F
  5.  
  6. DECLARE SUB GenPat (iColor)
  7.  
  8. REM $DYNAMIC
  9.  
  10. DIM SHARED iB8(63): FOR iA = 0 TO 63: READ iB8(iA): NEXT iA
  11. DATA 00,48,12,60,03,51,15,63,32,16,44,28,35,19,47,31
  12. DATA 08,56,04,52,11,59,07,55,40,24,36,20,43,27,39,23
  13. DATA 02,50,14,62,01,49,13,61,34,18,46,30,33,17,45,29
  14. DATA 10,58,06,54,09,57,05,53,42,26,38,22,41,25,37,21
  15.  
  16. DIM SHARED fCV(7, 2)
  17. FOR iA = 0 TO 7: FOR iB = 0 TO 2: READ fCV(iA, iB): NEXT iB, iA
  18. DATA -1,-1,-1 , 1,-1,-1 , 1,1,-1 , -1,1,-1
  19. DATA -1,-1, 1 , 1,-1, 1 , 1,1, 1 , -1,1, 1
  20.  
  21. DIM SHARED iWO(5, 3)
  22. FOR iA = 0 TO 5: FOR iB = 0 TO 3: READ iWO(iA, iB): NEXT iB, iA
  23. DATA 0,1,2,3 , 7,6,5,4 , 3,2,6,7 , 0,4,5,1 , 2,1,5,6 , 0,3,7,4
  24.  
  25. DIM SHARED iBC(5, 2)
  26. FOR iA = 0 TO 5: FOR iB = 0 TO 2: READ iBC(iA, iB): NEXT iB, iA
  27. DATA 255,0,0 , 0,255,0 , 0,0,255 , 255,255,0 , 255,0,255 , 0,255,255
  28.  
  29. DIM SHARED sgPAT(63, 11)
  30.  
  31. DIM lPal(31), lBuf(9599 + 1)
  32. lPal(1) = &H3F1515: lPal(2) = &H153F15
  33. lPal(3) = &H3F3F15: lPal(4) = &H15153F
  34. lPal(5) = &H3F153F: lPal(6) = &H153F3F
  35. lPal(7) = &H3F3F3F
  36.  
  37. iAspect = 1: iZoom = 64: iFill = 2: sKey = ""
  38.  
  39. DO
  40.   'SHELL "cycles auto" 'for dosbox only
  41.   SCREEN 0: WIDTH 80, 25: COLOR 7, 0: CLS
  42.   LOCATE 3, 1
  43.   PRINT " 1 - 320x200x4    (vsync)"
  44.   PRINT " 2 - 640x200x2    (vsync)"
  45.   PRINT " 3 - 320x200x16   (double buffer)"
  46.   PRINT " 4 - 640x200x16   (double buffer)"
  47.   PRINT " 5 - 640x350x16   (double buffer)"
  48.   PRINT " 6 - 640x480x2    (vsync)"
  49.   PRINT " 7 - 640x480x16   (pal hack)"
  50.   PRINT
  51.   PRINT " 0 - quit"
  52.   iMode = 0: iDblBuf = 0: fExt0 = 1: fExt = 1: iPal = 0: iPat = 0
  53.   sAspect(0) = "OFF": sAspect(1) = "1:1"
  54.   sAspect(2) = "4:3": sAspect(3) = "16:9"
  55.   DO
  56.     LOCATE 2, 1: PRINT " x - Aspect ratio (currently " + sAspect(iAspect) + ") "
  57.     IF sKey = "" THEN sKey = INPUT$(1)
  58.     SELECT CASE sKey
  59.     CASE "0", CHR$(27): END
  60.     CASE "x", "X": iAspect = (iAspect + 1) AND 3
  61.     CASE "1": iWid = 320: iHei = 400: iMode = 1
  62.     CASE "2": iWid = 640: iHei = 400: iMode = 2
  63.     CASE "3": iWid = 320: iHei = 400: iMode = 7: iDblBuf = 1
  64.     CASE "4": iWid = 640: iHei = 400: iMode = 8: iDblBuf = 1
  65.     CASE "5": iWid = 640: iHei = 350: iMode = 9: iDblBuf = 1
  66.     CASE "6": iWid = 640: iHei = 480: iMode = 11
  67.     CASE "7": iWid = 640: iHei = 480: iMode = 12: fExt0 = 1 / 1.25: fExt = 3 / 1.25
  68.     END SELECT
  69.     sKey = ""
  70.   LOOP UNTIL iMode
  71.  
  72.   'SHELL "cycles max" 'for dosbox only
  73.   SCREEN iMode
  74.  
  75.   IF iMode = 12 THEN
  76.     OUT &H3D4, &HC: OUT &H3D5, &H25:  OUT &H3D4, &HD: OUT &H3D5, &H44
  77.     iColors = 16: iBgC = 7: iPal = 8: GenPat 15
  78.   ELSE
  79.     PSET (0, 0), 255: iColors = POINT(0, 0) + 1
  80.     iBgC = iColors - 1: GenPat iColors
  81.   END IF
  82.  
  83.   SELECT CASE iAspect
  84.   CASE 0: fAspect = 1
  85.   CASE 1: fAspect = 480 / iHei
  86.   CASE 2: fAspect = 4 / 3
  87.   CASE 3: fAspect = 16 / 9
  88.   END SELECT
  89.  
  90.   fAngX = 0: fAngY = 0: iPage = 0
  91.   REDIM frx(7), fry(7), frz(7), fpx(7), fpy(7)
  92.  
  93.   IF iColors >= 16 THEN PALETTE 8, 0
  94.   IF iDblBuf THEN SCREEN , , iPage, iPage XOR 1
  95.   iR = 0: iOldZoom = 0
  96.  
  97.   DO
  98.     IF iOldZoom <> iZoom THEN
  99.       iOldZoom = iZoom: fZoom = iZoom / 16
  100.       IF iMode = 12 THEN fZoom = fZoom / (2 / 1.25): IF fZoom < 2 THEN fZoom = 2
  101.       WINDOW SCREEN (-fZoom * fAspect * fExt0, -fZoom * fExt0)-(fZoom * fAspect * fExt, fZoom * fExt)
  102.       'PRINT PMAP(0, 2): END
  103.       fMinX = 0: fMaxX = 0: fMinY = 0: fMaxY = 0
  104.     END IF
  105.    
  106.     fAngX = TIMER * .5: fAngY = fAngX * .77
  107.  
  108.     ' Rotate Vertices
  109.     FOR i = 0 TO 7
  110.       fX = fCV(i, 0): fY = fCV(i, 1): fz = fCV(i, 2)
  111.       ftx = fX * COS(fAngY) + fz * SIN(fAngY)
  112.       ftz = -fX * SIN(fAngY) + fz * COS(fAngY)
  113.       frx(i) = ftx: frz(i) = fY * SIN(fAngX) + ftz * COS(fAngX)
  114.       fry(i) = fY * COS(fAngX) - ftz * SIN(fAngX)
  115.       fFac = 32 / (32 + frz(i))
  116.       fpx(i) = frx(i) * fFac: fpy(i) = fry(i) * fFac
  117.     NEXT i
  118.  
  119.     ' Z-Sort faces
  120.     REDIM iOrd(5): FOR i = 0 TO 5: iOrd(i) = i: NEXT i
  121.     FOR ii = 0 TO 4
  122.       FOR ij = ii + 1 TO 5
  123.         fA = (frz(iWO(iOrd(ii), 0))) + (frz(iWO(iOrd(ii), 1))) + (frz(iWO(iOrd(ii), 2))) + (frz(iWO(iOrd(ii), 3)))
  124.         fB = (frz(iWO(iOrd(ij), 0))) + (frz(iWO(iOrd(ij), 1))) + (frz(iWO(iOrd(ij), 2))) + (frz(iWO(iOrd(ij), 3)))
  125.         IF fA < fB THEN SWAP iOrd(ii), iOrd(ij)
  126.       NEXT ij
  127.     NEXT ii
  128.    
  129.     ' render
  130.     FOR i = 0 TO 5
  131.       idx = iOrd(i): i0 = iWO(idx, 0): i1 = iWO(idx, 1): i2 = iWO(idx, 2)
  132.    
  133.       'normal calculation
  134.       fux = frx(i1) - frx(i0): fuy = fry(i1) - fry(i0): fuz = frz(i1) - frz(i0)
  135.       fvx = frx(i2) - frx(i0): fvy = fry(i2) - fry(i0): fvz = frz(i2) - frz(i0)
  136.       ffnx = fuy * fvz - fuz * fvy: ffny = fuz * fvx - fux * fvz: ffnz = fux * fvy - fuy * fvx
  137.      
  138.       IF ffnz > 0 THEN
  139.         IF iR = 0 THEN
  140.           WAIT &H3DA, 8
  141.           IF iMode = 12 THEN FOR ii = iPal + 1 TO iPal + 7: PALETTE ii, 0: NEXT
  142.         END IF
  143.         IF iR <> 3 THEN
  144.           iR = 3
  145.           IF iMode <> 12 THEN
  146.             IF fMinX = 0 OR iDblBuf <> 0 THEN
  147.               LINE (-64, -64)-(64, 64), iPal, BF
  148.             ELSE
  149.               LINE (fMinX, fMinY)-(fMaxX, fMaxY), 0, BF
  150.             END IF
  151.             fMinX = 0: fMinY = 0: fMaxX = 0: fMaxY = 0
  152.           END IF
  153.         END IF
  154.  
  155.         iIT = INT((ffnz / SQR(ffnx * ffnx + ffny * ffny + ffnz * ffnz)) * 64 + .5)
  156.         IF iIT > 63 THEN iIT = 63
  157.  
  158.         fx1 = fpx(iWO(idx, 0)): fy1 = fpy(iWO(idx, 0))
  159.         fx2 = fpx(iWO(idx, 1)): fy2 = fpy(iWO(idx, 1))
  160.         fx3 = fpx(iWO(idx, 2)): fy3 = fpy(iWO(idx, 2))
  161.         fx4 = fpx(iWO(idx, 3)): fy4 = fpy(iWO(idx, 3))
  162.  
  163.         IF iMode <> 12 AND iDblBuf = 0 THEN
  164.           IF fx1 < fMinX THEN fMinX = fx1
  165.           IF fx2 < fMinX THEN fMinX = fx2
  166.           IF fx3 < fMinX THEN fMinX = fx3
  167.           IF fx4 < fMinX THEN fMinX = fx4
  168.           IF fx1 > fMaxX THEN fMaxX = fx1
  169.           IF fx2 > fMaxX THEN fMaxX = fx2
  170.           IF fx3 > fMaxX THEN fMaxX = fx3
  171.           IF fx4 > fMaxX THEN fMaxX = fx4
  172.           IF fy1 < fMinY THEN fMinY = fy1
  173.           IF fy2 < fMinY THEN fMinY = fy2
  174.           IF fy3 < fMinY THEN fMinY = fy3
  175.           IF fy4 < fMinY THEN fMinY = fy4
  176.           IF fy1 > fMaxY THEN fMaxY = fy1
  177.           IF fy2 > fMaxY THEN fMaxY = fy2
  178.           IF fy3 > fMaxY THEN fMaxY = fy3
  179.           IF fy4 > fMaxY THEN fMaxY = fy4
  180.         END IF
  181.  
  182.         IF iColors = 4 THEN iC = ((idx \ 2) MOD 3) + 1 ELSE iC = idx + 1
  183.         IF iFill THEN
  184.           LINE (fx1, fy1)-(fx2, fy2), iBgC + iPal: LINE -(fx3, fy3), iBgC + iPal
  185.           LINE -(fx4, fy4), iBgC + iPal: LINE -(fx1, fy1), iBgC + iPal
  186.         ELSE
  187.           LINE (fx1, fy1)-(fx2, fy2), iC + iPal: LINE -(fx3, fy3), iC + iPal
  188.           LINE -(fx4, fy4), iC + iPal: LINE -(fx1, fy1), iC + iPal
  189.         END IF
  190.        
  191.         fX = (fx1 + fx2 + fx3 + fx4) / 4: fY = (fy1 + fy2 + fy3 + fy4) / 4
  192.         IF iFill <> 0 AND iIT > 3 THEN
  193.           IF iFill = 2 THEN PAINT (fX, fY), sgPAT(iIT, idx + iPat), iBgC + iPal
  194.           IF iFill = 1 THEN PAINT (fX, fY), iC + iPal, iBgC + iPal
  195.           'IF POINT(-2, -2) THEN i = 10: iR = 1: PRINT fAngX; iIT: END
  196.         END IF
  197.  
  198.         IF iFill = 2 THEN
  199.           'IF iIT < 24 THEN iC = iPal 'ELSE iC = iC AND 7
  200.           LINE (fx1, fy1)-(fx2, fy2), iC + iPal: LINE -(fx3, fy3), iC + iPal
  201.           LINE -(fx4, fy4), iC + iPal: LINE -(fx1, fy1), iC + iPal
  202.         END IF
  203.       END IF
  204.     NEXT i
  205.  
  206.     IF iMode = 12 THEN
  207.       GET (PMAP(0, 2), PMAP(0, 3))-(PMAP(319, 2), PMAP(239, 3)), lBuf
  208.       LINE (PMAP(0, 2), PMAP(0, 3))-(PMAP(319, 2), PMAP(255, 3)), iPal, BF
  209.       WAIT &H3DA, 8: FOR i = 1 TO 7: PALETTE iPal + i, lPal(i): NEXT
  210.       PUT (PMAP(319, 2), PMAP(239, 3)), lBuf, PSET
  211.       iPal = iPal XOR 8: iPat = iPat XOR 6
  212.     END IF
  213.  
  214.     IF iDblBuf THEN iPage = iPage XOR 1: SCREEN , , iPage, iPage XOR 1
  215.     iR = 0: sKey = INKEY$
  216.     SELECT CASE sKey
  217.     CASE "0" TO "9", CHR$(27), CHR$(13), CHR$(32): iMode = 0
  218.     CASE "+", "=": IF iZoom > 32 THEN iZoom = iZoom - 1
  219.     CASE "-", "_": IF iZoom < 128 THEN iZoom = iZoom + 1
  220.     CASE "f", "F", CHR$(9): iFill = (iFill + 1) MOD 3
  221.     END SELECT
  222.  
  223.   LOOP WHILE iMode
  224.  
  225. LOOP
  226.  
  227. REM $STATIC
  228. DEFSNG D
  229. SUB GenPat (iMaxColors)
  230.   SELECT CASE iMaxColors
  231.   CASE 15, 16
  232.     FOR i = 0 TO 63
  233.       FOR iC = 0 TO 11: sgPAT(i, iC) = STRING$(32, 0): NEXT iC
  234.       iA = 0: iO = 1
  235.       FOR iY = 0 TO 7
  236.         iB = 0: iN = 1
  237.         FOR iX = 0 TO 7
  238.           IF iB8(iA) <= i THEN iB = iB + iN
  239.           iA = iA + 1: iN = iN + iN
  240.         NEXT iX
  241.         FOR iC = 1 TO 6
  242.           sC = ""
  243.           IF (iC AND 1) THEN sC = sC + CHR$(iB) ELSE sC = sC + CHR$(0)
  244.           IF (iC AND 2) THEN sC = sC + CHR$(iB) ELSE sC = sC + CHR$(0)
  245.           IF (iC AND 4) THEN sC = sC + CHR$(iB) ELSE sC = sC + CHR$(0)
  246.           MID$(sgPAT(i, iC - 1), iO, 4) = sC + CHR$(255)
  247.           IF iMaxColors = 15 THEN
  248.             MID$(sgPAT(i, iC + 5), iO, 4) = sC + CHR$(0)
  249.           END IF
  250.         NEXT iC
  251.         iO = iO + 4
  252.       NEXT iY
  253.     NEXT i
  254.   CASE 2
  255.     FOR i = 0 TO 63
  256.       FOR iC = 0 TO 5: sgPAT(i, iC) = STRING$(8, 0): NEXT iC
  257.       iA = 0: iO = 1
  258.       FOR iY = 0 TO 7
  259.         iB = 0: iN = 1
  260.         FOR iX = 0 TO 7
  261.           IF iB8(iA) <= i THEN iB = iB + iN
  262.           iA = iA + 1: iN = iN + iN
  263.         NEXT iX
  264.         FOR iC = 1 TO 6
  265.           MID$(sgPAT(i, iC - 1), iO, 1) = CHR$(iB)
  266.         NEXT iC
  267.         iO = iO + 1
  268.       NEXT iY
  269.     NEXT i
  270.   CASE 4
  271.     FOR i = 0 TO 63
  272.       FOR iC = 0 TO 5: sgPAT(i, iC) = STRING$(16, 0): NEXT iC
  273.       iA = 0: iO = 1
  274.       FOR iY = 0 TO 15
  275.         iB = 0
  276.         IF iB8(iA + 0) <= i THEN iB = iB + 1
  277.         IF iB8(iA + 1) <= i THEN iB = iB + 4
  278.         IF iB8(iA + 2) <= i THEN iB = iB + 16
  279.         IF iB8(iA + 3) <= i THEN iB = iB + 64
  280.         iA = iA + 4
  281.         FOR iC = 0 TO 5
  282.           MID$(sgPAT(i, iC), iO, 4) = CHR$(iB * (((iC \ 2) MOD 3) + 1))
  283.         NEXT iC
  284.         iO = iO + 1: iA = iA + 4
  285.         IF iA > 63 THEN iA = iA - 60
  286.       NEXT iY
  287.     NEXT i
  288.   CASE ELSE
  289.     PRINT ("Error"): END
  290.   END SELECT
  291.  
  292. END SUB
  293.  
  294.  
Advertisement
Comments
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • Ipdornbi
    22 days
    Comment was deleted
Add Comment
Please, Sign In to add comment