TheGhastModding

main.c

Jan 9th, 2021
1,009
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. unsigned char globalsEndHere;
  2.  
  3. #include "nstdlib.h"
  4. #include "olduino.h"
  5.  
  6. #define SIMULATOR
  7.  
  8. float abs(float x);
  9. float sqrt(float x);
  10. void raySphereIntersection(float posX, float posY, float posZ, float origX, float origY, float origZ, float dirX, float dirY, float dirZ, float radius, float* t0, float* t1);
  11. //const char brightnessSymbols[] = {176, 177, 178, 219};
  12. const char brightnessSymbols[] = {'.', '=', 'x', '#'};
  13.  
  14. void main() {
  15.     int i,j;
  16.     char pRes;
  17.     float rayX,rayY,rayZ,length,t0,t1,origX,origY,origZ,posX,posY,posZ;
  18.     memcpy((void *)0xe000, (void *)0x6000, 0x1fff);
  19.     t0 = t1 = 1.0;
  20.     printf("Raytracing test 1802\r\n");
  21.    
  22.     printf("Pre-run test: Does abs function work?");
  23.     rayX = 5.0;
  24.     rayY = -7.0;
  25.     if(abs(rayX) == 5.0 && abs(rayY) == 7.0) printf("\tYes\r\n");
  26.     else {
  27.         printf("\tNo\r\n");
  28.         goto abort;
  29.     }
  30.    
  31.     printf("Pre-run test: Does square-root function work?");
  32.     rayX = 2.0;
  33.     rayX = sqrt(rayX);
  34.     if((int)(rayX * 1000.0) == 1414) printf("\tYes\r\n");
  35.     else {
  36.         printf("\tNo\r\n");
  37.         goto abort;
  38.     }
  39.    
  40.     printf("Pre-run test: Does ray-sphere-intersection function work?");
  41.     raySphereIntersection(0.02, 0.02, 3.0, 0.01, 0.01, 0.01, -0.231, 0.033, 0.972, 1.0, &t0, &t1);
  42.     if((long)(t0 * 1000.0) != 2200 || (long)(t1 * 1000.0) != 3607) {
  43.         printf("\tNo\r\n");
  44.         goto abort;
  45.     }
  46.     raySphereIntersection(0.02, 0.02, 3.0, 0.01, 0.01, 0.01, -0.231, -0.601, 0.765, 1.0, &t0, &t1);
  47.     if(t0 == 10000.0 && t1 == 10000.0) printf("\tYes\r\n");
  48.     else {
  49.         printf("\tNo\r\n");
  50.         goto abort;
  51.     }
  52.    
  53.     printf("\r\nBEGIN RENDER\r\n");
  54.     for(i = 0; i < 150; i++) putc('-');
  55.     putc('\r');
  56.     putc('\n');
  57.     for(i = 0; i < 64; i++) {
  58. #ifndef SIMULATOR
  59.         if(i % 2 == 0) asm("    seq\n");
  60.         else asm("  req\n");
  61. #endif
  62.         for(j = 0; j < 128; j++) {
  63.             pRes = ' ';
  64.             rayX = (float)i / 63.0 - 0.5;
  65.             rayX *= 2.0;
  66.             rayY = -(float)j / 127.0 - 0.5;
  67.             rayY *= 2.0;
  68.             rayZ = 1.0;
  69.            
  70.             origX = origY = origZ = 0.01;
  71.            
  72.             length = sqrt(rayX * rayX + rayY * rayY + rayZ * rayZ);
  73.             rayX /= length;
  74.             rayY /= length;
  75.             rayZ /= length;
  76.            
  77.             raySphereIntersection(0.02, 0.02, 2.0, origX, origY, origZ, rayX, rayY, rayZ, 1.0, &t0, &t1);
  78.             if(t0 < 9000) {
  79.                 posX = (origX + t0 * rayX) - 0.2;
  80.                 posY = (origY + t0 * rayY) - 0.2;
  81.                 posZ = (origZ + t0 * rayZ) - 3.0;
  82.                 length = sqrt(posX * posX + posY * posY + posZ * posZ);
  83.                 posX /= length;
  84.                 posY /= length;
  85.                 posZ /= length;
  86.                
  87.                 length = -posX * posX + (10000.0 - posY) * posY + (-3200.0 - posZ) * posZ;
  88.                 length /= 1500.0;
  89.                 if(length >= 1.0) length = 0.995;
  90.                 if(length < 0) length = 0;
  91.                 pRes = brightnessSymbols[(char)(length * 4.0)];
  92.             }
  93.            
  94.             putc(pRes);
  95.         }
  96.         putc('\r');
  97.         putc('\n');
  98.     }
  99.     for(i = 0; i < 150; i++) putc('-');
  100.     putc('\r');
  101.     putc('\n');
  102.    
  103.     loop_forever:
  104.     while(1){
  105. #ifndef SIMULATOR
  106.         asm("   seq\n");
  107.         for(i = 0; i < 16384; i++) {}
  108.         asm("   req\n");
  109.         for(i = 0; i < 16384; i++) {}
  110. #endif
  111.         asm("   nop\n");
  112.     }
  113.     abort:
  114.         printf("Abort!\r\n");
  115.         goto loop_forever;
  116. }
  117.  
  118. float abs(float x) {
  119.     return x < 0 ? 0.0 - x : x;
  120. }
  121.  
  122. float sqrt(float x) {
  123.     float x2,y = 0;
  124.     long i;
  125.    
  126.     if(x == 0.0) return 0.0;
  127.     x2 = x * 0.5f;
  128.     i = *(long *)&x;
  129.     i = 0x5f3759dfL - (i >> 1);
  130.     y = *(float *)&i;
  131.     y *= 1.5f - (x2 * y * y);
  132.     y *= 1.5f - (x2 * y * y);
  133.     return 1.0 / y;
  134. }
  135.  
  136. void raySphereIntersection(float posX, float posY, float posZ, float origX, float origY, float origZ, float dirX, float dirY, float dirZ, float radius, float* t0, float* t1) {
  137.     float Lx,Ly,Lz,tca,L_2,d,thc;
  138.    
  139.     if(dirX == 0) dirX = 1e-3;
  140.     if(dirY == 0) dirY = 1e-3;
  141.     if(dirZ == 0) dirZ = 1e-3;
  142.    
  143.     *t0 = 10000.0;
  144.     *t1 = 10000.0;
  145.    
  146.     Lx = posX - origX;
  147.     Ly = posY - origY;
  148.     Lz = posZ - origZ;
  149.    
  150.     tca = dirX * Lx;
  151.     tca += dirY * Ly;
  152.     tca += dirZ * Lz;
  153.     L_2 = Lx * Lx + Ly * Ly + Lz * Lz;
  154.     if(tca <= 0 && sqrt(L_2) >= radius) return;
  155.    
  156.     d = L_2 - tca * tca;
  157.     if(sqrt(d) >= radius) return;
  158.    
  159.     thc = radius * radius - d;
  160.     thc = sqrt(thc);
  161.    
  162.     *t0 = tca - thc;
  163.     *t1 = tca + thc;
  164. }
  165.  
  166. unsigned char globalsStartHere;
  167.  
  168. #include "nstdlib.c"
  169. #include "olduino.c"
  170.  
RAW Paste Data