Advertisement
DEKTEN

SDF_016

Nov 30th, 2020 (edited)
680
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /** ************************************************ ***
  2. ***                                                  ***
  3. ***     Live Stream Of Me Working On This Code:      ***
  4. ***                                                  ***
  5. *** ************************************************ ***
  6.  
  7.                 twitch.com/kanjicoder    
  8.  
  9.     STREAM_VIDEO_NAME:
  10.     SDF_016: Voxel Engine SubVoxel(Pixel) Geometry
  11.  
  12. *** ************************************************ ***
  13. ***                                                  ***
  14. *** EASY___SOURCE:  tinyurl.com/SDF-016              ***
  15. *** DIRECT_SOURCE:  pastebin.com/N1ccDD73            ***
  16. ***                                                  ***
  17. *** EASY_____DEMO:  tinyurl.com/SDF-016-DEMO         ***
  18. *** DIRECT___DEMO:  shadertoy.com/view/wdGfRm        ***
  19. ***                                                  ***
  20. *** About: Voxel Engine Work.                        ***
  21. ***                                                  ***
  22. *** AGENDA:                                          ***
  23. ***        Lets figure out how to merge 3 bitmaps    ***
  24. ***        together to create booleaned 3D pixel     ***
  25. ***        geometry for different voxel types.       ***
  26. ***                                                  ***
  27. *** ************************************************ **/
  28. //:MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM://
  29. /** M: Macros Section **/
  30.  
  31.     #define V_4  vec4
  32.     #define V_3  vec3
  33.     #define V_2  vec2
  34.     #define F32 float
  35.     #define I32   int
  36.     #define U32  uint
  37.  
  38. /** M: Macros Section **/
  39. //:MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM://
  40. //:DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD://
  41. /** D: Data Section **/
  42.  
  43.     //:DEBUGGING:====================================://
  44.  
  45.         #define SDF_DEBUG_MODE_ON ( 1 )
  46.  
  47.         V_4 THE_COLOR_OF_EMPTY_SPACE=V_4(
  48.             0.0 , 0.0 , 0.0 , 1.0
  49.         /** RED   GRE   BLU   ALP **/
  50.         );
  51.  
  52.     //:====================================:DEBUGGING://
  53.     //:CONFIGURATION:================================://
  54.         //:FUN_STUFF:--------------------------------://
  55.  
  56.             #define ANIMATE_THE_CORES ( 1 )
  57.  
  58.         //:--------------------------------:FUN_STUFF://
  59.         //:PROJECTION_GEOMETRY_SETTINGS:-------------://
  60.  
  61.             /** The total number of projection       **/
  62.             /** bitmaps used to create subvoxel      **/
  63.             /** geometry. 0 is currently not used    **/
  64.             /** because that will be the "emptyspace"**/
  65.             /** tile, thus "SDF_PRO_MAX" can be      **/
  66.             /** seen as a "maximum inclusive index"  **/
  67.  
  68.             /** If: 0 < TILE_VALUE <= SDF_PRO_MAX    **/
  69.             /** THEN: Will render boolean geometry   **/
  70.             /** for tiles of that value.             **/
  71.  
  72.             #define SDF_PRO_MAX ( 3 )
  73.  
  74.             #define SDF_PRO_TYP_SUB ( 707 )
  75.             #define SDF_PRO_TYP_ADD ( 808 )
  76.             #define SDF_PRO_TYP_GEO ( 909 )/**LITERAL**/
  77.  
  78.         //:-------------:PROJECTION_GEOMETRY_SETTINGS://
  79.         //:CAMERA_SETTINGS:--------------------------://
  80.         /** **************************************** ***
  81.         PREFIX:
  82.  
  83.             OGP: OrthoGraphicProjection
  84.             P3D: Perspective_3D
  85.             T3O: TUBE360_OUT (TubeCam Looking OUTWARD)
  86.             T3I: TUBE360_INN (TubeCam Looking INWARD )
  87.  
  88.         POSTFIX: (SUFFIX ):
  89.             TOP: Top View
  90.             34D: 3/4 Tilted DOWN view.
  91.             AAZ: Around_Axis_Z (NOT:WAZ)
  92.  
  93.         NOTES:
  94.  
  95.             T3O    : commonly known as PANORAMIC 360  
  96.             TubeCam: Revolve Around Axis As Camera.
  97.                      Literally "Tube Camera"
  98.  
  99.         *** **************************************** **/
  100.  
  101.             #define OGP_TOP ( 1 ) /** Good For Debug **/
  102.             #define OGP_34D ( 2 ) /** PATENT_DRAWING **/
  103.             #define T3O_AAZ ( 3 ) /** Outward: Z-Axis**/
  104.             #define T3I_AAZ ( 4 ) /** Inward : Z-Axis**/
  105.             #define S3I_AAZ ( 5 ) /** SPHERE:INN:AAZ **/
  106.  
  107.             /** Selected Camera Type **/
  108.         //  #define CAMTYPE ( OGP_34D )
  109.         //  #define CAMTYPE ( OGP_TOP )
  110.         //  #define CAMTYPE ( T3I_AAZ )
  111.             #define CAMTYPE ( S3I_AAZ )
  112.  
  113.         //:--------------------------:CAMERA_SETTINGS://
  114.  
  115.         /** SLICE_RENDER_USING_CAMERA_PLANE **/
  116.         int CFG_SLICE_RENDER=( 0 );
  117.  
  118.     //:================================:CONFIGURATION://
  119.     //:RAYMARCHING_AND_VOXEL_CONSTANTS:==============://
  120.  
  121.         //:These defines are for ray marching when using
  122.         //:fragment coordinates as our coordinate space.
  123.         #define MAX_STE 1000   //:Max Step
  124.         #define MIN_DIS 0.02   //:Min Dist (SurfaceDist)
  125.         #define MAX_DIS (64.0*16.0 * 1.0) //:Max Dist
  126.  
  127.         //:Number of tiles on each axis:
  128.         #define TILEMAP_PRESET ( 847 )
  129.         #if( 847 == TILEMAP_PRESET ) /** 8 x 4 x 7 **/
  130.  
  131.             #define NTX  8  //: Number Of [tiles/voxels]
  132.             #define NTY  4  //: Number Of [tiles/voxels]
  133.             #define NTZ  7  //: Number Of [tiles/voxels]
  134.  
  135.         #endif
  136.         #if( 111 == TILEMAP_PRESET )
  137.  
  138.             #define NTX  1  //: Number Of [tiles/voxels]
  139.             #define NTY  1  //: Number Of [tiles/voxels]
  140.             #define NTZ  1  //: Number Of [tiles/voxels]
  141.  
  142.         #endif
  143.         #if( 222 == TILEMAP_PRESET )
  144.  
  145.             #define NTX  2  //: Number Of [tiles/voxels]
  146.             #define NTY  2  //: Number Of [tiles/voxels]
  147.             #define NTZ  2  //: Number Of [tiles/voxels]
  148.  
  149.         #endif
  150.         #if( 333 == TILEMAP_PRESET )
  151.  
  152.             #define NTX  3  //: Number Of [tiles/voxels]
  153.             #define NTY  3  //: Number Of [tiles/voxels]
  154.             #define NTZ  3  //: Number Of [tiles/voxels]
  155.  
  156.         #endif
  157.  
  158.         #define VOXEL_SIZE_PRESET ( 161616 )
  159.         #if( 161616 == VOXEL_SIZE_PRESET )
  160.  
  161.             //:Size_Of_A_Voxel_Tile_Measured_In_Pixels:
  162.             #define NPX 16 //: NPX : Num_Pixels_X
  163.             #define NPY 16 //: NPY : Num_Pixels_Y
  164.             #define NPZ 16 //: NPZ : Num_Pixels_Z
  165.  
  166.         #endif
  167.         #if( 555 == VOXEL_SIZE_PRESET )
  168.  
  169.             //:Size_Of_A_Voxel_Tile_Measured_In_Pixels:
  170.             #define NPX  5 //: NPX : Num_Pixels_X
  171.             #define NPY  5 //: NPY : Num_Pixels_Y
  172.             #define NPZ  5 //: NPZ : Num_Pixels_Z
  173.  
  174.         #endif
  175.         #if( 567 == VOXEL_SIZE_PRESET )
  176.  
  177.             //:Size_Of_A_Voxel_Tile_Measured_In_Pixels:
  178.             #define NPX  5 //: NPX : Num_Pixels_X
  179.             #define NPY  6 //: NPY : Num_Pixels_Y
  180.             #define NPZ  7 //: NPZ : Num_Pixels_Z
  181.  
  182.         #endif
  183.         #if( 579 == VOXEL_SIZE_PRESET )
  184.  
  185.             //:Size_Of_A_Voxel_Tile_Measured_In_Pixels:
  186.             #define NPX  5 //: NPX : Num_Pixels_X
  187.             #define NPY  7 //: NPY : Num_Pixels_Y
  188.             #define NPZ  9 //: NPZ : Num_Pixels_Z
  189.  
  190.         #endif
  191.         #if( 51015 == VOXEL_SIZE_PRESET )
  192.  
  193.             //:Size_Of_A_Voxel_Tile_Measured_In_Pixels:
  194.             #define NPX   5 //: NPX : Num_Pixels_X
  195.             #define NPY  10 //: NPY : Num_Pixels_Y
  196.             #define NPZ  15 //: NPZ : Num_Pixels_Z
  197.  
  198.         #endif
  199.  
  200.         //:Total__number_of__Pixels__in_entire_voxel_map
  201.         #define TPX  ( NTX * NPX ) //: Total_Pixels_X
  202.         #define TPY  ( NTY * NPY ) //: Total_Pixels_Y
  203.         #define TPZ  ( NTZ * NPZ ) //: Total_Pixels_Z
  204.  
  205.     //: - ://
  206.         #define _  U32( 0 )                                        
  207.         #define X  U32( 1 )  
  208.         #define R  U32( 0xFF0000ff ) //: PRIMARY
  209.         #define r  U32( 0x880000ff ) //: PRIMARY
  210.         #define G  U32( 0x00FF00ff ) //: PRIMARY
  211.         #define g  U32( 0x008800ff ) //: PRIMARY
  212.         #define B  U32( 0x0000FFff ) //: PRIMARY
  213.         #define b  U32( 0x000088ff ) //: PRIMARY
  214.     //: - ://              
  215.         #define C  U32( 0x00FFFFff ) //: SECONDARY
  216.         #define c  U32( 0x008888ff ) //: SECONDARY
  217.         #define M  U32( 0xFF00FFff ) //: SECONDARY
  218.         #define m  U32( 0x880088ff ) //: SECONDARY
  219.         #define Y  U32( 0xFFFF00ff ) //: SECONDARY
  220.         #define y  U32( 0x888800ff ) //: SECONDARY
  221.     //: - ://      
  222.         #define L  U32( 0x88FF00ff ) //: TERTIARY
  223.         #define l  U32( 0x448800ff ) //: TERTIARY
  224.         #define O  U32( 0xFF8800ff ) //: TERTIARY
  225.         #define o  U32( 0x884400ff ) //: TERTIARY
  226.     //: - ://    
  227.         #define K  U32( 0x212121ff ) //: BLACK | GRAY
  228.         #define k  U32( 0x323232ff ) //: BLACK | GRAY
  229.     //: - ://
  230.  
  231.         #if( 1 == NTX && 1 == NTY && 1 == NTZ )
  232.  
  233.             U32  
  234.             VAT[ NTX * NTY * NTZ ]= U32[ 1 * 1 * 1 ](  
  235.  
  236.                 C /** <<<< JUST ONE TILE(VOXEL) **/
  237.  
  238.             );
  239.  
  240.         #endif
  241.         #if( 2 == NTX && 2 == NTY && 2 == NTZ )
  242.  
  243.             U32  
  244.             VAT[ NTX * NTY * NTZ ]= U32[ 2 * 2 * 2 ](  
  245.  
  246.                 C,M,
  247.                 Y,_,
  248.  
  249.                 c,m,
  250.                 y,_ //:<---NO_COMMA_LAST
  251.  
  252.             );
  253.  
  254.         #endif
  255.         #if( 333 == TILEMAP_PRESET )
  256.         #if( 3 == NTX && 3 == NTY && 3 == NTZ )
  257.  
  258.             U32  
  259.             VAT[ NTX * NTY * NTZ ]= U32[ 3 * 3 * 3 ](  
  260.  
  261.                 /** Something about the bounding   **/
  262.                 /** calculations is definitely off **/
  263.  
  264.                 R,R,R,  //: <<< PROBLEM HERE
  265.                 R,_,R,  
  266.                 R,R,R,  //: <<< LOOKS GOOD
  267.                          
  268.                 G,_,G,  
  269.                 _,_,_,  
  270.                 G,_,G,  
  271.                          
  272.                 B,B,B,  
  273.                 B,_,B,  
  274.                 B,B,B    
  275.  
  276.             );
  277.  
  278.         #endif
  279.         #endif
  280.         #if( 847 == TILEMAP_PRESET )
  281.         #if( 8 == NTX && 4 == NTY && 7 == NTZ )
  282.  
  283.             U32  
  284.             VAT[ NTX * NTY * NTZ ]= U32[ 8 * 4 * 7 ](  
  285.  
  286.             /** TODO: Eventually use an integer      **/
  287.             /**       texture for this tilemap data. **/
  288.                
  289.             /** #STRATA_OF_2D_TILEMAPS#        * * * **/
  290.             /** #BACK_SLASH_COMMENT_FUCKERY#   * * * **/
  291.            
  292.             //: 1 2 3 4 5 6 7 8  
  293.                 C,_,C,_,C,_,C,_, //: 1 ---+
  294.                 _,C,_,C,_,C,_,C, //: 2    |__ Z == 0
  295.                 C,_,C,_,C,_,C,_, //: 3    |
  296.                 _,C,_,C,_,C,_,C, //: 4 ---+    
  297.             //: 1 2 3 4 5 6 7 8        
  298.                 _,M,_,M,_,M,_,M, //: 1 ---+
  299.                 M,_,M,_,M,_,M,_, //: 2    |__ Z == 1
  300.                 _,M,_,M,_,M,_,M, //: 3    |
  301.                 M,_,M,_,M,_,M,_, //: 4 ---+          
  302.             //: 1 2 3 4 5 6 7 8        
  303.                 Y,_,Y,_,Y,_,Y,_, //: 1 ---+
  304.                 _,Y,_,Y,_,Y,_,Y, //: 2    |__ Z == 2
  305.                 Y,_,Y,_,Y,_,Y,_, //: 3    |
  306.                 _,Y,_,Y,_,Y,_,Y, //: 4 ---+    
  307.             //: 1 2 3 4 5 6 7 8      
  308.                 O,_,O,_,O,_,O,_, //: 1 ---+
  309.                 _,O,_,O,_,O,_,O, //: 2    |__ Z == 3
  310.                 O,_,O,_,O,_,O,_, //: 3    |
  311.                 _,O,_,O,_,O,_,O, //: 4 ---+    
  312.             //: 1 2 3 4 5 6 7 8
  313.                 _,L,_,L,_,L,_,L, //: 1 ---+
  314.                 L,_,L,_,L,_,L,_, //: 2    |__ Z == 4
  315.                 _,L,_,L,_,L,_,L, //: 3    |
  316.                 L,_,L,_,L,_,L,_, //: 4 ---+    
  317.             //: 1 2 3 4 5 6 7 8
  318.                 R,_,R,_,R,_,R,_, //: 1 ---+
  319.                 _,R,_,R,_,R,_,R, //: 2    |__ Z == 5
  320.                 R,_,R,_,R,_,R,_, //: 3    |
  321.                 _,R,_,R,_,R,_,R, //: 4 ---+    
  322.             //: 1 2 3 4 5 6 7 8
  323.                 _,G,_,G,_,G,_,G,
  324.                 G,_,G,_,G,_,G,_,
  325.                 _,G,_,G,_,G,_,G,
  326.                 G,_,G,_,G,_,G,_ //:<<< NO_COMMA_ON_LAST
  327.  
  328.             );  
  329.  
  330.  
  331.         #endif /** [ 8 x 4 x 7 ] **/
  332.         #endif /**  847          **/
  333.                                              
  334.     //: - ://      
  335.         #undef  _              
  336.         #undef  X  
  337.         #undef  R  
  338.         #undef  r  
  339.         #undef  G  
  340.         #undef  g  
  341.         #undef  B  
  342.         #undef  b  
  343.     //: -undef      
  344.         #undef  C  
  345.         #undef  c  
  346.         #undef  M  
  347.         #undef  m  
  348.         #undef  Y  
  349.         #undef  y  
  350.     //: -undef      
  351.         #undef  L  
  352.         #undef  l  
  353.         #undef  O  
  354.         #undef  o  
  355.     //: -undef      
  356.         #undef  K  
  357.         #undef  k  
  358.     //: - ://
  359.  
  360.     //:==============:RAYMARCHING_AND_VOXEL_CONSTANTS://
  361.     //:VOXEL_PROJECTION_GEOMETRY:====================://
  362.     #define _ U32( 0 )
  363.     #define X U32( 1 )  
  364.  
  365.         /** #SDF_PRO_MAX# , is calculated by     * * **/
  366.         /** counting the number of SDF_PRO_###   * * **/
  367.         /** tilemaps in this section of code.    * * **/
  368.  
  369.         #define SDF_PRO_001_TYP ( SDF_PRO_TYP_SUB )
  370.         U32     SDF_PRO_001[ 8 * 8 ]= U32[ 8 * 8 ](
  371.         /** **************************************** ***
  372.  
  373.             When applied addatively as projection
  374.             into empty space, creates a cubic shell.
  375.  
  376.             When bits are INVERTED and applied
  377.             as a subtractive volume on a filled
  378.             voxel, creates a 3D tesseract shape.
  379.  
  380.         *** **************************************** **/
  381.         //: 1|2|3|4|5|6|7|8
  382.             X,X,X,X,X,X,X,X,//: 1 ://
  383.             X,_,_,_,_,_,_,X,//: 2 ://
  384.             X,_,_,_,_,_,_,X,//: 3 ://
  385.             X,_,_,_,_,_,_,X,//: 4 ://
  386.             X,_,_,_,_,_,_,X,//: 5 ://
  387.             X,_,_,_,_,_,_,X,//: 6 ://
  388.             X,_,_,_,_,_,_,X,//: 7 ://
  389.             X,X,X,X,X,X,X,X //: 8 : <--NO_COMMA_LAST
  390.         );
  391.  
  392.         #define SDF_PRO_002_TYP ( SDF_PRO_TYP_ADD )
  393.         U32     SDF_PRO_002[ 8 * 8 ]= U32[ 8 * 8 ](
  394.         /** **************************************** ***
  395.             ADDATIVE ======> Small Cube In Voxel Cell.
  396.             SUBTRACTIVE ===> Very Thick Shelled Shape.
  397.  
  398.         *** **************************************** **/
  399.  
  400.         //: 1|2|3|4|5|6|7|8
  401.             _,_,_,_,_,_,_,_,//: 1 ://
  402.             _,_,_,_,_,_,_,_,//: 2 ://
  403.             _,_,_,_,_,_,_,_,//: 3 ://
  404.             _,_,_,X,X,_,_,_,//: 4 ://
  405.             _,_,_,X,X,_,_,_,//: 5 ://
  406.             _,_,_,_,_,_,_,_,//: 6 ://
  407.             _,_,_,_,_,_,_,_,//: 7 ://
  408.             _,_,_,_,_,_,_,_ //: 8 : <--NO_COMMA_LAST
  409.         );
  410.  
  411.         #define SDF_PRO_003_TYP ( SDF_PRO_TYP_GEO )
  412.         U32     SDF_PRO_003[ 3*3*3 ]= U32[ 3*3*3 ](
  413.         /** **************************************** ***
  414.             ADDATIVE ======> Small Cube In Voxel Cell.
  415.             SUBTRACTIVE ===> Very Thick Shelled Shape.
  416.  
  417.         *** **************************************** **/
  418.  
  419.         //: 1|2|3|
  420.             _,_,_, //: --+
  421.             _,X,_, //:   +--0
  422.             _,_,_, //: --+
  423.        
  424.             _,X,_, //: --+
  425.             X,X,X, //:   +--1
  426.             _,X,_, //: --+
  427.      
  428.             _,_,_, //: --+
  429.             _,X,_, //:   +--2
  430.             _,_,_  //: --+
  431.         );
  432.  
  433.  
  434.     #undef  _  
  435.     #undef  X  
  436.     //:====================:VOXEL_PROJECTION_GEOMETRY://
  437.     //:STRUCTS:======================================://
  438.  
  439.         //:RWC_AND_RWN:------------------------------://
  440.  
  441.             struct  RWC_AND_RWN{
  442.                 V_3 rwC        ;
  443.                 V_3         rwN;
  444.             };
  445.        
  446.         //:------------------------------:RWC_AND_RWN://
  447.         //:VOX_000:----------------------------------://
  448.  
  449.             /** VOC: VOxel_Current(information) **/
  450.             struct VOC{  
  451.                 U32 has    ;  //  voxel:exists?    : 1 :  
  452.                 U32 val    ;  //  voxel:tile_value : 2 :  
  453.                               //                   :---:  
  454.                 I32 til_d3d;  //  voxel:1d_index   : 3 :  
  455.                 I32 t_x    ;  //  voxel:tile_x     : 4 :  
  456.                 I32 t_y    ;  //  voxel:tile_y     : 5 :  
  457.                 I32 t_z    ;  //  voxel:tile_z     : 6 :  
  458.                               //
  459.                 I32 pix_d3d;  //  voxel:pixel_d    : 7 :
  460.                 I32     p_x;  //  voxel:pixel_x    : 8 :
  461.                 I32     p_y;  //  voxel:pixel_y    : 9 :
  462.                 I32     p_z;  //  voxel:pixel_z    :10 :
  463.             };                                
  464.  
  465.             /** VOD: VOxel_Distance(information) **/
  466.             struct VOD{  
  467.                 F32     dis_nex; //:Distance_To_Next
  468.                 F32     dis_sur; //:Distance_To_Surface
  469.                                  //:Within_Current_Voxel
  470.             };
  471.  
  472.             struct VOE{
  473.                 F32  msg_err;
  474.             };
  475.  
  476.             struct VOX_000{ /** var: vox_000 **/
  477.                        
  478.                 VOC     voc; //:Voxel_Current_Info
  479.                 VOD     vod; //:Voxel_Distance_Info
  480.                 VOE     voe; //:Voxel_Error____Info
  481.            
  482.             };
  483.  
  484.         //:----------------------------------:VOX_000://
  485.         //:PIX_000:----------------------------------://
  486.        
  487.             struct PIX_000{ //:SEE[ #VOX_MAR_ABOUT# ]
  488.  
  489.                 uint exit;
  490.  
  491.             };
  492.  
  493.         //:----------------------------------:PIX_000://
  494.         //:O_K_C4D:----------------------------------://
  495.  
  496.             struct O_K_C4D{
  497.  
  498.                 I32 o_k;
  499.                 V_4 c4d;
  500.  
  501.             };
  502.  
  503.         //:----------------------------------:O_K_C4D://
  504.         //:VON:--------------------------------------://
  505.  
  506.             struct VON{
  507.  
  508.                 //: von_d3d===[til_d3d,pix_d3d,etc]
  509.                 I32 von_d3d;  
  510.  
  511.             };
  512.  
  513.         //:--------------------------------------:VON://
  514.         //:REFACTOR_ME_001:--------------------------://
  515.         //:REFAC01:----------------------------------://
  516.  
  517.             struct REFAC01{
  518.  
  519.                 /** Rather than have VOX_000 &       **/
  520.                 /** PIX_000 structs, everything      **/
  521.                 /** can just use                     **/
  522.                 /** sta_add (stack_address)          **/
  523.                 /** sta_con (stack_context)          **/
  524.                 /**                                  **/
  525.                 /** But for now, just get rendering  **/
  526.                 /** first before be abstract code.   **/
  527.  
  528.                 RWC_AND_RWN  rwC_AND_rwN;
  529.                 O_K_C4D          o_k_c4d;
  530.                
  531.                 /** TODO: Replace VOX_000 & PIX_000  **/
  532.                 /**       with generic[ sta_add ]and **/
  533.                 /**       [ sta_con ]variables.      **/
  534.                 VOX_000  vox_000;
  535.                 PIX_000  pix_000;
  536.  
  537.                 /** xyz's TotalDistanceFrom(TDF) rwC **/
  538.                 F32      xyz_TDF_rwC;
  539.  
  540.                 V_3      xyz; /** xyz == Copy of rwC **/
  541.  
  542.                 /** Because we offboarded inner loop **/
  543.                 /** code to a "looptick" functions,  **/
  544.                 /** we require a "should_break"      **/
  545.                 /** flag to maintain the original    **/
  546.                 /** ability of early exiting         **/
  547.                 /** our shader raymarch loop.        **/
  548.                 U32      should_break;
  549.             };
  550.  
  551.         //:----------------------------------:REFAC01://
  552.         //:--------------------------:REFACTOR_ME_001://
  553.     //:======================================:STRUCTS://
  554.  
  555. /** D: Data Section **/
  556. //:DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD://
  557. //:IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII://
  558. /** I: Inifnite Degree Functions. Always At Top.     **/
  559.  
  560.     //:NO_HALT_USE_ERROR_PIXEL:======================://
  561.     //:PIX_ERR:======================================://
  562.  
  563.         #define ERR_001  1  /** msg_err #1 (0x101010)**/
  564.                             /** msg_err #1 (0x010101)**/
  565.  
  566.         #define ERR_002  2  /** msg_err #2 (0x202020)**/
  567.                             /** msg_err #2 (0x020202)**/
  568.  
  569.         #define ERR_003  3  /** msg_err #3 (0x303030)**/
  570.                             /** msg_err #3 (0x030303)**/
  571.  
  572.         V_4     PIX_ERR(
  573.             int msg_err /** EX: MSG_ERR_001 **/
  574.         ,   V_4 pix_err /** Previous Pixel Error **/
  575.         ,   int   o_k
  576.         )
  577.         {
  578.             /** Muddy Pastel Yellow For When You     **/
  579.             /** forget to set the pix_err_out value. **/
  580.             V_4 pix_err_out=V_4(0.5,0.5,0.2,1);
  581.  
  582.             float flux=( mod(iTime,1.0) );
  583.  
  584.             //:COLOR_PICKER_DEBUG_HEX:---------------://
  585.        
  586.             /** Make it easy to find source of error **/
  587.             /** in code by using color picker on     **/
  588.             /** shader output and then doing a       **/
  589.             /** CTRL+F with that hex code to find    **/
  590.             /** the offending source code.           **/
  591.  
  592.                 F32 _ =F32( 0.0    );
  593.                 F32 MAX =F32( 255.0  ); // MaxIntensity
  594.                 F32  A  =F32( 1.0    ); // Alpha_Max
  595.  
  596.                 //:ERROR_CODE_STROBE_COLORS:---------://
  597.  
  598.                 F32 _01_ =( F32(0x01) / MAX );
  599.                 F32 _10_ =( F32(0x10) / MAX );
  600.                 //
  601.                 F32 _02_ =( F32(0x02) / MAX );
  602.                 F32 _20_ =( F32(0x20) / MAX );
  603.                 //
  604.                 F32 _03_ =( F32(0x03) / MAX );
  605.                 F32 _30_ =( F32(0x30) / MAX );
  606.                 //
  607.                 F32 _04_ =( F32(0x04) / MAX );
  608.                 F32 _40_ =( F32(0x40) / MAX );
  609.                 //
  610.                 F32 _05_ =( F32(0x05) / MAX );
  611.                 F32 _50_ =( F32(0x50) / MAX );
  612.                 //
  613.                 F32 _06_ =( F32(0x06) / MAX );
  614.                 F32 _60_ =( F32(0x60) / MAX );
  615.                 //
  616.                 F32 _07_ =( F32(0x07) / MAX );
  617.                 F32 _70_ =( F32(0x70) / MAX );
  618.                 //
  619.                 F32 _08_ =( F32(0x08) / MAX );
  620.                 F32 _80_ =( F32(0x80) / MAX );
  621.                 //
  622.                 F32 _09_ =( F32(0x09) / MAX );
  623.                 F32 _90_ =( F32(0x90) / MAX );
  624.  
  625.                 V_4 _0x010101_ = V_4(_01_,_01_,_01_, A);
  626.                 V_4 _0x101010_ = V_4(_10_,_10_,_10_, A);
  627.  
  628.                 V_4 _0x020202_ = V_4(_02_,_02_,_02_, A);
  629.                 V_4 _0x202020_ = V_4(_20_,_20_,_20_, A);
  630.  
  631.                 V_4 _0x030303_ = V_4(_03_,_03_,_03_, A);
  632.                 V_4 _0x303030_ = V_4(_30_,_30_,_30_, A);
  633.  
  634.                 V_4 _0x040404_ = V_4(_04_,_04_,_04_, A);
  635.                 V_4 _0x404040_ = V_4(_40_,_40_,_40_, A);
  636.  
  637.                 V_4 _0x050505_ = V_4(_05_,_05_,_05_, A);
  638.                 V_4 _0x505050_ = V_4(_50_,_50_,_50_, A);
  639.  
  640.                 V_4 _0x060606_ = V_4(_06_,_06_,_06_, A);
  641.                 V_4 _0x606060_ = V_4(_60_,_60_,_60_, A);
  642.  
  643.                 V_4 _0x070707_ = V_4(_07_,_07_,_07_, A);
  644.                 V_4 _0x707070_ = V_4(_70_,_70_,_70_, A);
  645.  
  646.                 V_4 _0x080808_ = V_4(_08_,_08_,_08_, A);
  647.                 V_4 _0x808080_ = V_4(_80_,_80_,_80_, A);
  648.  
  649.                 V_4 _0x090909_ = V_4(_09_,_09_,_09_, A);
  650.                 V_4 _0x909090_ = V_4(_90_,_90_,_90_, A);
  651.  
  652.                 //:---------:ERROR_CODE_STROBE_COLORS://
  653.                 //:ERROR_ZERO_COLORS:----------------://
  654.                 #define F float
  655.                 #define V vec4
  656.                 /** If you forget to set error code, **/
  657.                 /** you will see flashing red and    **/
  658.                 /** blue. ( _0xFF0666_ & _0x6660FF_ )**/
  659.                  
  660.                 F   _FF_=( F32(0xFF) / MAX );
  661.                 //  _06_=( F32(0x06) / MAX );
  662.                 //  _60_=( F32(0x60) / MAX );
  663.                 F   _66_=( F32(0x66) / MAX );
  664.                 V   _0xFF0666_ =V_4(_FF_,_06_,_66_,A);
  665.                 V   _0x6660FF_ =V_4(_66_,_60_,_FF_,A);
  666.  
  667.                 #undef F
  668.                 #undef V
  669.                 //:----------------:ERROR_ZERO_COLORS://
  670.                 //:BAD_OK_ERROR_COLOR:---------------://
  671.                 #define F float
  672.                 #define V vec4
  673.                 /** You will see this if you init    **/
  674.                 /** o_k to a value other than 1 in   **/
  675.                 /** your source code.                **/
  676.                 /** Strobes between orange and lime. **/
  677.                 /** ( _0xFF7700_ & _0x77FF00_ )      **/
  678.                  
  679.                 //  _FF_=( F32(0xFF) / MAX );
  680.                 F   _77_=( F32(0x77) / MAX );
  681.                 F   _00_=( F32(0x00) / MAX );
  682.                 V   _0xFF7700_ =V_4(_FF_,_77_,_00_,A);
  683.                 V   _0x77FF00_ =V_4(_77_,_FF_,_00_,A);
  684.  
  685.                 #undef F
  686.                 #undef V
  687.                 //:---------------:BAD_OK_ERROR_COLOR://
  688.  
  689.             //:---------------:COLOR_PICKER_DEBUG_HEX://
  690.  
  691.             if( o_k <= 0 ){
  692.                 pix_err_out = pix_err;
  693.             }else
  694.             if( 1 == o_k ){
  695.  
  696.                 /** table of error "messages" #0 **/
  697.                 V_4 tab_err_000[10]=V_4[10](        
  698.                                                
  699.                     // 0: Invalid Error Code    
  700.                     _0xFF0666_  // RED_FLASH
  701.                          
  702.                     // Odd Frame Error Colors:
  703.                 ,   _0x010101_  //  ERR_001 : ODD_FRAME
  704.                 ,   _0x020202_  //  ERR_002 : ODD_FRAME
  705.                 ,   _0x030303_  //  ERR_003 : ODD_FRAME
  706.                 ,   _0x040404_  //  ERR_004 : ODD_FRAME
  707.                 ,   _0x050505_  //  ERR_005 : ODD_FRAME
  708.                 ,   _0x060606_  //  ERR_006 : ODD_FRAME
  709.                 ,   _0x070707_  //  ERR_007 : ODD_FRAME
  710.                 ,   _0x080808_  //  ERR_008 : ODD_FRAME
  711.                 ,   _0x090909_  //  ERR_009 : ODD_FRAME
  712.                 );;        
  713.                 /** table of error "messages" #1 **/
  714.                 V_4 tab_err_001[10]=V_4[10](        
  715.                                                
  716.                     // 0: Invalid Error Code    
  717.                     _0x6660FF_ // BLUE_FLASH    
  718.                          
  719.                     // Even Frame Error Colors:
  720.                 ,   _0x101010_  //  ERR_001 : EVE_FRAME
  721.                 ,   _0x202020_  //  ERR_002 : EVE_FRAME
  722.                 ,   _0x303030_  //  ERR_003 : EVE_FRAME
  723.                 ,   _0x404040_  //  ERR_004 : EVE_FRAME
  724.                 ,   _0x505050_  //  ERR_005 : EVE_FRAME
  725.                 ,   _0x606060_  //  ERR_006 : EVE_FRAME
  726.                 ,   _0x707070_  //  ERR_007 : EVE_FRAME
  727.                 ,   _0x808080_  //  ERR_008 : EVE_FRAME
  728.                 ,   _0x909090_  //  ERR_009 : EVE_FRAME
  729.                 );;                      
  730.  
  731.                 if( mod(iTime*16.0,2.0) < 1.0 ){
  732.                     pix_err_out =( tab_err_000
  733.                                  [ msg_err ] );;
  734.                 }else{
  735.                     pix_err_out =( tab_err_001
  736.                                  [ msg_err ] );;
  737.                 };;
  738.  
  739.             }else{
  740.                 /** Orange strobe for an o_k value   **/
  741.                 /** that is NOT expected. (o_k >= 2) **/
  742.  
  743.                 if( mod(iTime*2.0,2.0) < 1.0 ){
  744.                     pix_err_out = _0xFF7700_; // ORANGE
  745.                 }else{
  746.                     pix_err_out = _0x77FF00_; // LIME
  747.                 };;
  748.  
  749.             };;
  750.                
  751.             return( pix_err_out );
  752.         }
  753.  
  754.     //:======================================:PIX_ERR://
  755.     //:======================:NO_HALT_USE_ERROR_PIXEL://
  756.     //:MAX_OF_3:=====================================://
  757.  
  758.         F32
  759.         max_003( F32 a , F32 b , F32 c )
  760.         {
  761.             return( max( max(a,b) , c ) );
  762.         }
  763.  
  764.     //:=====================================:MAX_OF_3://
  765.  
  766. /** I: Inifnite Degree Functions. Always At Top.     **/
  767. //:IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII://
  768. //:33333333333333333333333333333333333333333333333333://
  769.  
  770.     //:SAMPLE_PROJECTION_GEOMETRY:===================://
  771.  
  772.         /** SampleProjectionGeometry **/
  773.         U32 til_d3d_AND_pix_d3d_CTO_u32_bit(
  774.         I32 til_d3d,I32 pix_d3d  
  775.         ){
  776.  
  777.             /** Bit should be 0 or 1 when returned.  **/
  778.             U32 u32_bit=U32( 404 /**TRAP_VALUE**/ );
  779.  
  780.             //:SHORTCUT[ D3D_CTO_XYZ ]- - - - - - - -://
  781.             #define T trunc
  782.             #define I int
  783.             #define F float
  784.  
  785.             /// I D3D =( pix_d3d /**[GIVEN/INPUT]**/  );
  786.             /// I T_Z = I( T( F(D3D) / F  ( NTX*NTY )));
  787.             /// I D2D =         D3D -(T_Z*( NTX*NTY ) );
  788.             /// I T_Y = I( T( F(D2D) / F  ( NTX     )));
  789.             /// I T_X =         D2D -(T_Y*( NTX     ) );
  790.                  
  791.             #undef T
  792.             #undef I
  793.             #undef F
  794.             //:- - - - - - - -SHORTCUT[ D3D_CTO_XYZ ]://
  795.  
  796.             U32 til_val = VAT[ til_d3d ];
  797.  
  798.             if( til_val > U32( SDF_PRO_MAX ) ){
  799.  
  800.                 /** no cross sectional data to create**/
  801.                 /** interior voxel topology. So just **/
  802.                 /** return 1 (filled) for every pixel**/
  803.                 /** of the current voxel.            **/
  804.  
  805.                 u32_bit =U32( 1 );
  806.             }else
  807.             if( U32(1) == til_val /** SDF_PRO_001 **/ ){
  808.  
  809.                 u32_bit=U32( 9001 /**[TODO]:ACTUAL_LOGIC**/ ); //# <<<<<<<<<<<<<<<<<<<<<<<<< TODO #//
  810.  
  811.             }else
  812.             if( U32(2) == til_val /** SDF_PRO_002 **/ ){
  813.  
  814.                 u32_bit=U32( 9002 /**[TODO]:ACTUAL_LOGIC**/ ); //# <<<<<<<<<<<<<<<<<<<<<<<<< TODO #//
  815.  
  816.             }else
  817.             if( U32(3) == til_val /** SDF_PRO_003 **/ ){
  818.  
  819.                 u32_bit=U32( 9003 /** TODO:LOGIC **/ ); //:<<<<<<<<<<TODO
  820.  
  821.             }else{
  822.                 u32_bit =U32(666 /** ERROR_CODE **/ );
  823.             };;
  824.  
  825.             return( u32_bit );
  826.  
  827.         }
  828.              
  829.     //:===================:SAMPLE_PROJECTION_GEOMETRY://
  830.  
  831.  
  832. //:33333333333333333333333333333333333333333333333333://
  833. //:22222222222222222222222222222222222222222222222222://
  834.  
  835.     //:INTERPOLATION_3D:=============================://
  836.     //:sfd_i3d:======================================://
  837.  
  838.         V_3 sdf_i3d(
  839.         /**/V_3 _1_
  840.         ,   V_3 _2_
  841.         ,   F32 f_p
  842.         ){
  843.             return( _1_ + ( ( _2_ - _1_ )*f_p ) );
  844.         }
  845.  
  846.     //:=============================:INTERPOLATION_3D://
  847.     //:======================================:sfd_i3d://
  848.     //:FIRST_VOXEL_QUERY_NEEDED:=====================://
  849.     //:@WHATVOX@
  850.     // ############################# //
  851.     #define T_X ( vox_000.voc.t_x     )
  852.     #define T_Y ( vox_000.voc.t_y     )
  853.     #define T_Z ( vox_000.voc.t_z     )
  854.     // ############################# //
  855.     #define P_X ( vox_000.voc.p_x     )
  856.     #define P_Y ( vox_000.voc.p_y     )
  857.     #define P_Z ( vox_000.voc.p_z     )
  858.     #define P_I ( vox_000.voc.pix_d3d )
  859.     // ############################# //
  860.  
  861.         /** rwN used to find distance to NEXT voxel. **/
  862.             VOX_000
  863.         GET_vox_000_USE_xyz_rwN(
  864.                         V_3 xyz
  865.                     ,   V_3     rwN
  866.         )
  867.         {
  868.             VOX_000 vox_000;
  869.  
  870.             /** f: floor(xyz) values: **/
  871.             F32 f_x = floor( xyz.x );
  872.             F32 f_y = floor( xyz.y );
  873.             F32 f_z = floor( xyz.z );
  874.  
  875.             //:CURRENT_VOXEL_CELL:-------------------://
  876.  
  877.             vox_000.voc.val = U32( 0 );
  878.             T_X = ( int(floor( xyz.x / float( NPX ))));
  879.             T_Y = ( int(floor( xyz.y / float( NPY ))));
  880.             T_Z = ( int(floor( xyz.z / float( NPZ ))));
  881.  
  882.             //:-------------------:CURRENT_VOXEL_CELL://
  883.             //:GET_VOXEL_CELL_VALUE:-----------------://
  884.  
  885.             /** Voxel Volume Is Hard Coded To have   **/
  886.             /** voxel__tile[0,0,0] stuck at world    **/
  887.             /** world_coord[0,0,0]                   **/
  888.             if( T_X >= 0 && T_X < NTX
  889.             &&  T_Y >= 0 && T_Y < NTY
  890.             &&  T_Z >= 0 && T_Z < NTZ
  891.             ){
  892.  
  893.                 //: Index2D -and- Index3D
  894.                 int D2D = T_X + ( NTX    *    T_Y );
  895.                 int D3D = D2D + ( NTX * NTY * T_Z );
  896.  
  897.                 vox_000.voc.til_d3d=(      D3D   );
  898.                 vox_000.voc.val    =( VAT[ D3D ] );
  899.  
  900.                 /** NOTE: Voxel value 0 will NOT get **/
  901.                 /**       special treatment. It could**/
  902.                 /**       contain geometry if we     **/
  903.                 /**       really wanted it to.       **/
  904.                 vox_000.voc.has= U32(  1  );
  905.                
  906.             }else{
  907.                 /** Using a "has" flag so we         **/
  908.                 /** can keep more logic UNSIGNED.    **/
  909.                 /** (No need for negative value to ) **/
  910.                 /** (be used for invalid dex or val) **/
  911.                 vox_000.voc.til_d3d= int(  0  );
  912.                 vox_000.voc.val    = U32(  0  );
  913.                 vox_000.voc.has    = U32(  0  );
  914.             };;
  915.             //:-----------------:GET_VOXEL_CELL_VALUE://
  916.             //:DIST_TO_NEXT_VOXEL:-------------------://    
  917.             /** ************************************ ***
  918.                                 x_bound
  919.                                 |||
  920.                                 |||
  921.                                 |||
  922.             ====+-----+---[i]----+====== y_bound ====
  923.                 |     |   /      ||
  924.                 |     |  /       ||
  925.                 |     | /        ||
  926.                 |     |/         ||
  927.                 +- - -P----------+|
  928.                 |     .          ||
  929.                 |     .          ||
  930.                 +-----+----------+|
  931.                                 |||
  932.                                 |||
  933.                                 |||
  934.                                 |||
  935.             *** ************************************ **/
  936.             #define P xyz /** Point  **/
  937.             #define N rwN /** Normal **/
  938.  
  939.                 //:SIGNS_OF_RAY_VECTOR:--------------://
  940.                 /** We need to know if the ray is    **/
  941.                 /** moving forwards to HIGHER tile   **/
  942.                 /** values or BACKWARDS to LOWER     **/
  943.                 /** tile values.                     **/
  944.  
  945.                 /**  SEE[ #CONSISTENT_VOXEL_COORDS# **/
  946.                 F32  b_x  /** x_bound       **/     ;  
  947.                 F32  b_y  /** y_bound       **/     ;  
  948.                 F32  b_z  /** z_bound       **/     ;  
  949.                           /**               **/     ;
  950.                 F32  x_0  /** x_bound : MIN **/     ;  
  951.                 F32  y_0  /** y_bound : MIN **/     ;  
  952.                 F32  z_0  /** z_bound : MIN **/     ;  
  953.                           /**               **/     ;
  954.                 F32  x_1  /** x_bound : MAX **/     ;  
  955.                 F32  y_1  /** y_bound : MAX **/     ;  
  956.                 F32  z_1  /** z_bound : MAX **/     ;  
  957.                                                     ;
  958.                 x_1 =F32( ( T_X +  1 ) * NPX )      ;
  959.                 y_1 =F32( ( T_Y +  1 ) * NPY )      ;
  960.                 z_1 =F32( ( T_Z +  1 ) * NPZ )      ;
  961.                                                     ;
  962.                 /** #MINUS_EPSILON# **/
  963.                 //:.....................10........20
  964.                 //:...........0.12345678901234567890
  965.                 #define EPS_X ( 0.0001 ) /**#ITBIDKW#**/
  966.                 #define EPS_Y ( 0.0001 ) /**#ITBIDKW#**/
  967.                 #define EPS_Z ( 0.0001 ) /**#ITBIDKW#**/
  968.                 x_0 =F32( ( T_X -  0 ) * NPX ) -EPS_X ;
  969.                 y_0 =F32( ( T_Y -  0 ) * NPY ) -EPS_Y ;
  970.                 z_0 =F32( ( T_Z -  0 ) * NPZ ) -EPS_Z ;
  971.                 #undef  EPS_X
  972.                 #undef  EPS_Y
  973.                 #undef  EPS_Z
  974.                 /** #MINUS_EPSILON# **/
  975.                                                     ;
  976.                 b_x = N.x >= 0.0 ? x_1 : x_0        ;
  977.                 b_y = N.y >= 0.0 ? y_1 : y_0        ;
  978.                 b_z = N.z >= 0.0 ? z_1 : z_0        ;
  979.  
  980.                 //:--------------:SIGNS_OF_RAY_VECTOR://
  981.                 /** ******************************** ***
  982.                 SEE[ #NEXT_VOXEL_BOUNDING_VOLUME# ]    
  983.                 The intersection point to next voxel    
  984.                 (By using plane intersections) should  
  985.                 not be further than ONE PIXEL away      
  986.                 from the current voxel we are inside.  
  987.            
  988.                 +----------------+----------------+
  989.                 | +- - -  - - -+ | +- - -  - - -+ |
  990.                 | |            | | |            | |
  991.                 |                |                |
  992.                 | |            | | |            | |
  993.                 |                |                |
  994.                 | |            | | |            | |
  995.                 | +- - -  - - -+ | +- - -  - - -+ |
  996.                 +----------------+----------------+
  997.                 | +- - -  - - -+ | +- - -  - - -+ |
  998.                 | |            | | |            | |
  999.                 |                |                |
  1000.                 | |     CV     | | |            | |
  1001.                 |   (CurVoxel)   |                |
  1002.                 | |            | | |            | |
  1003.                 | +- - -  - - -+ | +- - -  - - -+ |
  1004.                 +----------------+----------------+
  1005.  
  1006.                 *** ******************************** **/
  1007.                 /** ******************************** ***
  1008.                 ___ == DONT CARE ABOUT
  1009.                 P   + (N   * S   )==[ b_x, ___ , ___ ]
  1010.                 P.x + (N.x * S.x )==  b_x
  1011.                       (N.x * S.x )==  b_x - P.x
  1012.                              S.x  == (b_x - P.x) / N.x
  1013.                 *** ******************************** **/
  1014.                 //:FIRST_PIXEL_OF_NEXT_VOXEL:--------://
  1015.                 #define N_X ( 0.0 != N.x )
  1016.                 #define N_Y ( 0.0 != N.y )
  1017.                 #define N_Z ( 0.0 != N.z )
  1018.  
  1019.                 //:Scalar for point normal form.
  1020.              //:F32 MAX_F32=intBitsToFloat(0x7f7fFFFF);
  1021.              //:F32 MAX_F32=F32( 2147483647 );
  1022.                 F32 MAX_F32=F32( 1000 * 1000 );
  1023.                 V_3 S = V_3(MAX_F32,MAX_F32,MAX_F32);
  1024.                 //:V_3 S = V_3( 0,0,0 );
  1025.  
  1026.                 /**  [f_x,f_y,f_z] or [ P.x,P.y,P.z ]**/
  1027.                 if( N_X ){ S.x = ( b_x - P.x ) / N.x; }; //:<<<<<<<<<<< THIS EQUATION MINUS BY floored or by P ?
  1028.                 if( N_Y ){ S.y = ( b_y - P.y ) / N.y; };
  1029.                 if( N_Z ){ S.z = ( b_z - P.z ) / N.z; };
  1030.    
  1031.                 /** #TRAP_VALUE_MUST_BE_NEG_666# **/
  1032.                 #define _666_ ( 0.0 - 666.0  )
  1033.                 F32 shortest_scalar_distance=( _666_ );
  1034.                 V_3 first_pixel_of_next_voxel;
  1035.                 #undef  _666_
  1036.  
  1037.                 if( N_X && S.x <= S.y && S.x <= S.z ){
  1038.                     shortest_scalar_distance=(  S.x );
  1039.                 }else
  1040.                 if( N_Y && S.y <= S.x && S.y <= S.z ){
  1041.                     shortest_scalar_distance=(  S.y );
  1042.                 }else
  1043.                 if( N_Z && S.z <= S.x && S.z <= S.y ){
  1044.                     shortest_scalar_distance=(  S.z );
  1045.                 };;
  1046.  
  1047.                 /** Not using this anywhere, BUT KEEP**/
  1048.                 /** for now. Now is not the time     **/
  1049.                 /** to optimize.                     **/
  1050.                 first_pixel_of_next_voxel=(
  1051.                 //: P + ( N * [ S.x | S.y | S.z ] )
  1052.                     P + ( N * shortest_scalar_distance )
  1053.                 );;
  1054.  
  1055.                 vox_000.vod.dis_nex=(
  1056.                         shortest_scalar_distance );;
  1057.  
  1058.                 //:vox_000.vod.dis_nex=( 8.0 );
  1059.  
  1060.                 #undef  N_X  
  1061.                 #undef  N_Y  
  1062.                 #undef  N_Z  
  1063.                 //:--------:FIRST_PIXEL_OF_NEXT_VOXEL://
  1064.  
  1065.            
  1066.             #undef  P /** Point  **/
  1067.             #undef  N /** Normal **/
  1068.             //:-------------------:DIST_TO_NEXT_VOXEL://
  1069.             //:GET_VOXEL_PIXEL:----------------------://
  1070.             if( vox_000.voc.has >= U32(1) ){ //:-----://
  1071.  
  1072.                 /** If you are inside a voxel, than  **/
  1073.                 /** you by definition MUST be at a   **/
  1074.                 /** certain pixel within that voxel. **/
  1075.  
  1076.                 P_X = I32( f_x ) - (T_X * NPX);
  1077.                 P_Y = I32( f_y ) - (T_Y * NPY);
  1078.                 P_Z = I32( f_z ) - (T_Z * NPZ);
  1079.  
  1080.  
  1081.                 /** ******************************** ***
  1082.  
  1083.                 This is why we should FLOOR xyz
  1084.                 values when figuring out what
  1085.                 Tile(voxel) or Pixel(VoxelSubCell)
  1086.                 we are inside of.
  1087.  
  1088.                 |<- 0 ->|<- 1 ->| <-- DISCREET_MODEL
  1089.                 +---+---+---+---+
  1090.                 |   .   |   .   |
  1091.                 + - + - + - + - +
  1092.                 |   .   |   .   |
  1093.                 +---+---+---+---+
  1094.                 ^       ^
  1095.                 |       |
  1096.                 0       1 <---------- FRACTIONAL_MODEL
  1097.  
  1098.                 *** ******************************** **/
  1099.                
  1100.                 //: Index2D -and- Index3D
  1101.                 int D2D = P_X + ( NPX    *    P_Y );
  1102.                 int D3D = D2D + ( NPX * NPY * P_Z );
  1103.  
  1104.                 P_I = ( D3D /** inDEX_3D **/ );
  1105.  
  1106.             };; //:------------------:GET_VOXEL_PIXEL://
  1107.          
  1108.             return( vox_000 );
  1109.  
  1110.         } // <<<<<<<<<<<<<{ GET_vox_000_USE_xyz_rwN } //
  1111.  
  1112.     // ---------------------------------------------- //
  1113.     #undef  T_X   // ( vox_000.voc.t_x ) // --------- //
  1114.     #undef  T_Y   // ( vox_000.voc.t_y ) // --------- //
  1115.     #undef  T_Z   // ( vox_000.voc.t_z ) // --------- //
  1116.     // ---------------------------------------------- //
  1117.     #undef  P_X   // ( vox_000.voc.p_x     ) // ----- //
  1118.     #undef  P_Y   // ( vox_000.voc.p_y     ) // ----- //
  1119.     #undef  P_Z   // ( vox_000.voc.p_z     ) // ----- //
  1120.     #undef  P_I   // ( vox_000.voc.pix_d3d ) // ----- //
  1121.     //:=====================:FIRST_VOXEL_QUERY_NEEDED://
  1122.     //:MARCH_INTO_VOXEL:=============================://
  1123.     //:sdf_MarchIntoVoxel:===========================://
  1124.     /** COULD_MAKE_USE_OF[ #STACK_ADDRESS_WORKINGS# ]**/
  1125.  
  1126.             PIX_000
  1127.         GET_pix_000_USE_xyz_rwN_til_d3d_pix_d3d(
  1128.         /**/V_3         xyz
  1129.         ,   V_3             rwN
  1130.         ,   I32                 til_d3d
  1131.         ,   I32                         pix_d3d
  1132.         )
  1133.         {
  1134.  
  1135.             PIX_000 pix_000;
  1136.             pix_000.exit=U32( 1 );
  1137.  
  1138.             U32 til_val; /** AKA: vox_000.voc.val    **/
  1139.         //: U32 pix_d3d: /** AKA: vox_000.voc.pix_d3d**/
  1140.  
  1141.             //:RE_LOOKUP_CURRENT_TILE_VALUE:---------://
  1142.  
  1143.                 /**************************************/
  1144.                 /** Auto tiling at the voxel level   **/
  1145.                 /** would Go here and replace this   **/
  1146.                 /** simple lookup.                   **/
  1147.                 /**************************************/
  1148.  
  1149.                     til_val = VAT[ til_d3d ];
  1150.  
  1151.                 /**************************************/
  1152.  
  1153.  
  1154.  
  1155.        
  1156.             //:---------:RE_LOOKUP_CURRENT_TILE_VALUE://
  1157.             //:INTERIOR_VOXEL_MARCHING_LOOP:---------://
  1158.             //:PIXEL_MARCHING:-----------------------://
  1159.  
  1160.                 U32 some_condition_i_dont_know_yet = U32( 0 );  //:<<<<<<<<<<<<<<<<<<<< TODO: What should this condition be?
  1161.                 if( some_condition_i_dont_know_yet >= U32(1) ){
  1162.  
  1163.                     U32 u32_bit =U32( 123 /**TRAP_VALUE**/);
  1164.                 //: U32 til_val =   ( vox_000.voc.val     );
  1165.                 //: I32 pix_d3d =   ( vox_000.voc.pix_d3d );
  1166.  
  1167.                     //:NOT:til_val_AND_pix_d3d_CTO_u32_bit
  1168.                     //:YES:til_d3d_AND_pix_d3d_CTO_u32_bit
  1169.                     //:#CASH_IN_INDEXES_AT_LAST_MOMENT#  
  1170.  
  1171.                     /** SampleProjectionGeometry **/
  1172.                     u32_bit=(
  1173.                     til_d3d_AND_pix_d3d_CTO_u32_bit(
  1174.                     til_d3d  ,  pix_d3d             ));;
  1175.  
  1176.                 };;
  1177.  
  1178.             //:-----------------------:PIXEL_MARCHING://
  1179.             //:---------:INTERIOR_VOXEL_MARCHING_LOOP://
  1180.  
  1181.             return( pix_000 );
  1182.         }
  1183.  
  1184.     //:===========================:sdf_MarchIntoVoxel://
  1185.     //:=============================:MARCH_INTO_VOXEL://
  1186.     //:MAP_UINT32_TO_COLOR_4D:=======================://
  1187.     #define  F    float
  1188.     #define  U    uint
  1189.     #define _FF_  uint( 0xFF )
  1190.  
  1191.         V_4 u32_CTO_c4d(
  1192.             U32 u32
  1193.         ){
  1194.             V_4
  1195.             c4d = V_4( /** c4d:Color_4_Dimensional **/
  1196.                 F( ( u32 >> U(24) ) & _FF_ ) / 255.0
  1197.             ,   F( ( u32 >> U(16) ) & _FF_ ) / 255.0
  1198.             ,   F( ( u32 >> U( 8) ) & _FF_ ) / 255.0
  1199.             ,   F( ( u32 >> U( 0) ) & _FF_ ) / 255.0
  1200.             );;
  1201.             return( c4d );
  1202.         }
  1203.  
  1204.     //:- - - - - - - - - - - -- - - - - - - - - - - -://
  1205.  
  1206.         V_4 Flash_rgb_rgb_CTO_c4d(
  1207.             U32   h_1      /**  NO_ALPHA_CHANNEL !!  **/
  1208.         ,   U32       h_2  /**  NO_ALPHA_CHANNEL !!  **/
  1209.         )
  1210.         {
  1211.             V_4 c4d; /** RETURN_THIS **/
  1212.             U32 hex_no_alpha;
  1213.  
  1214.             if( mod(iTime*16.0,2.0) < 1.0 ){
  1215.                 hex_no_alpha = ( h_1 );
  1216.             }else{
  1217.                 hex_no_alpha = ( h_2 );
  1218.             };;
  1219.    
  1220.             /** Append 100% alpha before calling. **/
  1221.             c4d = u32_CTO_c4d(
  1222.                 ( hex_no_alpha << U(8) ) | _FF_
  1223.             );;
  1224.  
  1225.             return( c4d  /** RETURN_THIS **/ );
  1226.         }
  1227.  
  1228.     #undef  F  
  1229.     #undef  U  
  1230.     #undef _FF_
  1231.     //:=======================:MAP_UINT32_TO_COLOR_4D://
  1232.     //:INTEGER_MODULO:===============================://
  1233.  
  1234.     #ifndef I32
  1235.     #define I32 int
  1236.     #endif
  1237.  
  1238.     #ifndef F32
  1239.     #define F32 float
  1240.     #endif
  1241.  
  1242.         /** PRIVATE: Called only by I32_MOD **/
  1243.         I32 i32_mod_neg( I32 neg_a , I32 pos_d ){
  1244.  
  1245.             /** ************************************ ***
  1246.             Function Calculates:
  1247.            
  1248.             FIXED: (d-1)-[ mod(abs(a)+1 , d) ]
  1249.  
  1250.             GOAL: Negatives keep exact same tiling
  1251.                   pattern as the positives.
  1252.  
  1253.             IN : -6 -5 -4 -3 -2 -1  0 +1 +2 +3 +4 +5 +6
  1254.             OUT:  2  3  0  1  2  3  0  1  2  3  0  1  2
  1255.  
  1256.             0123 -> 0123 -> 0123 -> 0123 -> 0123 -> ect
  1257.  
  1258.            
  1259.  
  1260.             *** ************************************ **/
  1261.  
  1262.             I32 pos_a = ( 0 - neg_a ) + 1;
  1263.            
  1264.             F32 A = F32( pos_a );
  1265.             F32 D = F32( pos_d );
  1266.            
  1267.             //: GLSL_MODULUS_WITH_INTEGERS_FORMULA
  1268.             //: WARD:Wholepart,All,Remainder,Divisor
  1269.             int W = int(  trunc( A / (          D  )) );
  1270.             int R = int(         A - ( F32(W) * D  )  );
  1271.            
  1272.             return( (pos_d-1) - R );
  1273.         }
  1274.  
  1275.         I32
  1276.         I32_MOD(
  1277.         /**/I32 a /** ALL     : CAN BE NEGATIVE **/
  1278.         ,   I32 d /** DIVISOR : ALWAYS POSITIVE **/
  1279.         ){
  1280.  
  1281.             /** ************************************ ***
  1282.  
  1283.             Allow for I32_MOD to be used for wrapping
  1284.             even when the input to wrap[ a ] goes
  1285.             negative. d should always be positive.
  1286.  
  1287.             EX: mod( x , 2 ) , where x == -1
  1288.             | -1 | 0 [ 1 ] 2 |
  1289.             |  1 | 0 [ 1 ] 0 | 1 | 0 |
  1290.             d + 1 == 2 + (-1) == 1
  1291.             *** ************************************ **/
  1292.  
  1293.             int R;
  1294.  
  1295.             if( a < 0 ){
  1296.  
  1297.                 //:This is CLOSE but then new problem
  1298.                 //:of lots of green checkers is showing
  1299.                 //:up. No clue...
  1300.                 R = i32_mod_neg( a , d );
  1301.  
  1302.             }else{
  1303.  
  1304.                 F32 A = F32( a );
  1305.                 F32 D = F32( d );
  1306.                             //:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<FIX_THE_OVERFLOW_BELOW
  1307.                 //: GLSL_MODULUS_WITH_INTEGERS_FORMULA
  1308.                 //: WARD:Wholepart,All,Remainder,Divisor
  1309.                 int W = int(  trunc( A / (          D  )) );
  1310.                     R = int(         A - ( F32(W) * D  )  );
  1311.  
  1312.             };;
  1313.  
  1314.             return( R );
  1315.         }
  1316.     //:===============================:INTEGER_MODULO://
  1317.     //:MAX_OF_3_NAMED_BY_USE_CASE:===================://
  1318.     #define F float
  1319.     #define M max
  1320.  
  1321.         F32
  1322.         GET_npm_USE_npx_npy_npz(
  1323.             I32     npx         /** I32 so we don't  **/
  1324.         ,   I32         npy     /** need to CAST when**/
  1325.         ,   I32             npz /** calling this.    **/
  1326.         ){                      /** ACTUALLY U32 vals**/
  1327.  
  1328.             //: npm: Number_of_Pixels_Max(x,y,z)
  1329.             F32 npm = M( M( F(NPX),F(NPY) ),F(NPZ) );
  1330.             return( npm );
  1331.         }
  1332.  
  1333.     #undef  F
  1334.     #undef  M
  1335.     //:===================:MAX_OF_3_NAMED_BY_USE_CASE://
  1336.     //:VOXEL_TO_DEBUG_COLOR:=========================://
  1337.     /** @VOXBUGCOLOR@ **/
  1338.     #define P_X ((( vox_000.voc.p_x )))
  1339.     #define P_Y ((( vox_000.voc.p_y )))
  1340.     #define P_Z ((( vox_000.voc.p_z )))
  1341.     #define ALP ( 1.0 )
  1342.  
  1343.         V_4 vox_000_CTO_c4d(
  1344.  
  1345.             VOX_000 vox_000
  1346.         )
  1347.         {
  1348.             V_4 c4d; /** [output/return/result] **/
  1349.  
  1350.             /** base color **/
  1351.             V_4 b_c=( u32_CTO_c4d( vox_000.voc.val ));
  1352.  
  1353.             #define F float
  1354.             F d_x = min( F(P_X) , F( NPX - P_X - 1 ));
  1355.             F d_y = min( F(P_Y) , F( NPY - P_Y - 1 ));
  1356.             F d_z = min( F(P_Z) , F( NPZ - P_Z - 1 ));
  1357.             #undef  F
  1358.  
  1359.             F32 m2d ; /** m2d: Minimum 2D **/
  1360.            
  1361.             if( d_x <= d_y && d_x <= d_z ){
  1362.             /** d_x == X_PLANE == [ y , z ] **/
  1363.  
  1364.                 m2d = min( d_y , d_z );
  1365.                 //: c4d =V_4( 1,0,0,  ALP );
  1366.             }else
  1367.             if( d_y <= d_x && d_y <= d_z ){
  1368.             /** d_y == Y_PLANE == [ x , z ] **/
  1369.  
  1370.                 m2d = min( d_x , d_z );
  1371.                 //: c4d =V_4( 0,1,0,  ALP );
  1372.  
  1373.             }else
  1374.             if( d_z <= d_x && d_z <= d_y ){
  1375.             /** d_z == Z_PLANE == [ x , y ] **/
  1376.  
  1377.                 m2d = min( d_x , d_y );
  1378.                 //: c4d =V_4( 0,0,1,  ALP );
  1379.  
  1380.             }else{
  1381.                 /** This should never execute **/
  1382.             };;
  1383.  
  1384.             #define F float
  1385.             F32 n_p = max_003( F(NPX),F(NPY),F(NPZ) );
  1386.             F32 per =( m2d*2.0 ) / n_p ;
  1387.             #undef  F
  1388.  
  1389.             if( per > 0.0 ){
  1390.  
  1391.                 #if( ANIMATE_THE_CORES >= 1 ) //:####://
  1392.  
  1393.                     per = mod( per - iTime , 1.0 );
  1394.    
  1395.                 #endif //:###########################://
  1396.  
  1397.                 c4d =V_4(
  1398.                     b_c.x * per
  1399.                 ,   b_c.y * per
  1400.                 ,   b_c.z * per
  1401.                 ,   b_c.w * 1.0
  1402.                 );;
  1403.  
  1404.             }else{
  1405.             #define X d_x
  1406.             #define Y d_y
  1407.             #define Z d_z
  1408.  
  1409.                 /** #VOXEL_EDGE_COLOR#          **/
  1410.                 /** #NO_ELSE_FOR_EDGE_COLORING# **/
  1411.  
  1412.                 F32 R=( 0.0 );
  1413.                 F32 G=( 0.0 );
  1414.                 F32 B=( 0.0 );
  1415.                
  1416.                 if( X <= Y && X <= Z ){  /** X_PLANE **/
  1417.  
  1418.                     R =( 1.0 );
  1419.  
  1420.                 };; /** NO ELSE! **/
  1421.                 if( Y <= X && Y <= Z ){  /** Y_PLANE **/
  1422.  
  1423.                     G =( 1.0 );
  1424.  
  1425.                 };; /** NO ELSE! **/
  1426.                 if( Z <= X && Z <= Y ){  /** Z_PLANE **/
  1427.  
  1428.                     B =( 1.0 );
  1429.  
  1430.                 };; /** NO ELSE! **/
  1431.  
  1432.                 c4d =V_4( R,G,B, ALP );
  1433.  
  1434.             #undef  X  
  1435.             #undef  Y  
  1436.             #undef  Z  
  1437.             };;
  1438.  
  1439.             return( c4d );
  1440.         }
  1441.  
  1442.     #undef  P_X  
  1443.     #undef  P_Y  
  1444.     #undef  P_Z  
  1445.     #undef  ALP  
  1446.     //:=========================:VOXEL_TO_DEBUG_COLOR://
  1447.  
  1448. //:22222222222222222222222222222222222222222222222222://
  1449. //:11111111111111111111111111111111111111111111111111://
  1450.  
  1451.     //:FRAGCOORD_TO_FRAGPERCENT:=====================://
  1452.     //:f_c_CTO_f_p:==================================://
  1453.  
  1454.         V_2 f_c_CTO_f_p( V_2 f_c ){
  1455.         V_2         f_p;
  1456.             f_p = f_c / ( iResolution.xy - 1.0 );
  1457.             return(  f_p );
  1458.         }
  1459.  
  1460.     //:==================================:f_c_CTO_f_p://
  1461.     //:=====================:FRAGCOORD_TO_FRAGPERCENT://
  1462.     //:FRAGPER_TO_CAMERA_RAY:========================://
  1463.     //:f_p_CTO_rwC_AND_rwN_CAMTYPE_OGP_TOP:==========://
  1464.  
  1465.                 RWC_AND_RWN
  1466.         f_p_CTO_rwC_AND_rwN_CAMTYPE_OGP_TOP(
  1467.             V_2 f_p /** 2 dimensional percentage **/
  1468.         )
  1469.         {
  1470.             F32 bug = ( F32(NPZ) * 4.0 ); //:DEBUG_ONLY
  1471.             F32 spd     =( 0.5 /**SPEED FACTOR **/ );
  1472.             F32 pos_cos =( cos(iTime*spd)+1.0 ) / 2.0;
  1473.             F32 neg_cos =( cos(iTime*spd)-1.0 ) / 2.0;
  1474.             bug=bug*pos_cos;
  1475.             //:bug = ( (-16.1) * bug );
  1476.             //:bug = ( -1036.8 );
  1477.             //:bug=( -32.2   );
  1478.  
  1479.             /** ************************************ ***
  1480.             TODO: Fix bug...
  1481.                 bug=( -   0.2 ); <<<<< OK
  1482.                 bug=( -  16.2 ); <<<<< OK
  1483.                 bug=( -  32.2 ); <<<<< ERR
  1484.                 bug=( -  48.2 ); <<<<< OK
  1485.                 bug=( -  64.2 ); <<<<< ERR
  1486.                 bug=( -  80.2 ); <<<<< OK
  1487.                 bug=( -  96.2 ); <<<<< ERR
  1488.                 bug=( - 112.2 ); <<<<< OK
  1489.                 bug=( - 128.2 ); <<<<< ERR
  1490.                 bug=( -1036.8 );
  1491.  
  1492.             *** ************************************ **/
  1493.          
  1494.             V_3 rwC; //:ray_word__COORDINATE
  1495.             V_3 rwN; //:ray_world_NORMAL____
  1496.  
  1497.             //:#FIND_POINT_ON_SCREEN_PLANE#
  1498.             F32 H = F32( 0 - 9 );; //:Cam Height Pos
  1499.             F32 X = iResolution.x - 1.0;
  1500.             F32 Y = iResolution.y - 1.0;
  1501.             /** ************************************ ***
  1502.                             A_B
  1503.                         A----|------B
  1504.                         |    |      |
  1505.                         |   rwC     |
  1506.                         |    |      |
  1507.                         C----|------D
  1508.                             C_D
  1509.                                
  1510.             *** ************************************ **/
  1511.  
  1512.             F32  _ =F32( 0.0 /**ALWAYS_ZERO **/ );
  1513.             F32 XOS=F32( 0 );
  1514.             F32 YOS=F32( 0 );
  1515.             F32 ZOS=F32( 0 );
  1516.  
  1517.             V_3 _A_ = V_3( _+XOS,_+YOS,  bug+H+ZOS );  
  1518.             V_3 _B_ = V_3( X+XOS,_+YOS,  bug+H+ZOS );  
  1519.                                      
  1520.             V_3 _C_ = V_3( _+XOS,Y+YOS,  bug+H+ZOS );  
  1521.             V_3 _D_ = V_3( X+XOS,Y+YOS,  bug+H+ZOS );  
  1522.                                      
  1523.  
  1524.             V_3 A_B = sdf_i3d( _A_ , _B_ , f_p.x );
  1525.             V_3 C_D = sdf_i3d( _C_ , _D_ , f_p.x );
  1526.                 rwC = sdf_i3d( A_B , C_D , f_p.y );
  1527.  
  1528.                 //:#POSITIVE_Z_DIVES_INTO_SCREEN#://
  1529.                 rwN = normalize( V_3( 0 , 0 , 1 ) );
  1530.  
  1531.                     RWC_AND_RWN
  1532.                     rwC_AND_rwN;
  1533.                     rwC_AND_rwN.rwC = rwC;
  1534.                     rwC_AND_rwN.rwN = rwN;
  1535.             return( rwC_AND_rwN );
  1536.         }
  1537.  
  1538.     //:==========:f_p_CTO_rwC_AND_rwN_CAMTYPE_OGP_TOP://
  1539.     //:f_p_CTO_rwC_AND_rwN_CAMTYPE_OGP_34D:==========://
  1540.     #define _0_  (0.0)
  1541.     #define  _   (0.0)
  1542.  
  1543.                 RWC_AND_RWN
  1544.         f_p_CTO_rwC_AND_rwN_CAMTYPE_OGP_34D(
  1545.             V_2 f_p /** 2 dimensional percentage **/
  1546.         )
  1547.         {
  1548.             RWC_AND_RWN  /** OUTPUT_OBJECT **/
  1549.             rwC_AND_rwN; /** OUTPUT_OBJECT **/
  1550.  
  1551.             V_3 rwC; //:ray_word__COORDINATE
  1552.             V_3 rwN; //:ray_world_NORMAL____
  1553.  
  1554.             //:#FIND_POINT_ON_SCREEN_PLANE#
  1555.             /** ************************************ ***
  1556.             Could possibly use these as slice planes.
  1557.             But for now using these to navigate our
  1558.             voxel map bounds.
  1559.  
  1560.             [ A ]Is_Directly_Above[ E ]On_Z_Axis
  1561.             [ B ]Is_Directly_Above[ F ]On_Z_Axis
  1562.             [ C ]Is_Directly_Above[ G ]On_Z_Axis
  1563.             [ D ]Is_Directly_Above[ H ]On_Z_Axis
  1564.            
  1565.                         (In World/Frag Coords)
  1566.                             [0,0,0]
  1567.                                 \
  1568.                 A_B              \
  1569.             A----|------B  A -->  +=======+  <-- B
  1570.             |    |      |        /.       .\
  1571.             | rwC_001   |       / .       . \
  1572.             |    |      |      /  .       .  \
  1573.             C----|------D  C->+===============+<-D
  1574.                 C_D           [   ._....._.   ]
  1575.                               [  /         \  ]
  1576.                               [ .           . ]
  1577.                               [/             \]
  1578.                               +===============+<-H
  1579.  
  1580.                               +===============+  
  1581.                               [\             /]
  1582.                               [ .           . ]
  1583.                               [  \_......._/  ]
  1584.                 E_F           [   .       .   ]
  1585.             E----|------F  G->+===============+<-H
  1586.             |    |      |      \  .       .  /
  1587.             | rwC_002   |       \ .       . /
  1588.             |    |      |        \.       ./
  1589.             G----|------H  E -->  +=======+  <-- F
  1590.                 G_H          
  1591.                            
  1592.             *** ************************************ **/
  1593.  
  1594.             //:Dimensions Of Voxel Volume:
  1595.             //:As maximum indexes.
  1596.             F32 M_X =( F32(TPX) - 1.0 );
  1597.             F32 M_Y =( F32(TPY) - 1.0 );
  1598.             F32 M_Z =( F32(TPZ) - 1.0 );
  1599.  
  1600.             //:TOP LAYER OF PIXELS OF VOXEL VOLUME:
  1601.             //:(INCLUSIVE MATH. We are inside the)
  1602.             //:(first layer of pixels of the first)
  1603.             //:(layer of voxels)
  1604.             V_3 _A_ = V_3( _-_ , _-_ , _-_ );
  1605.             V_3 _B_ = V_3( M_X , _-_ , _-_ );      
  1606.             V_3 _C_ = V_3( _-_ , M_Y , _-_ );
  1607.             V_3 _D_ = V_3( M_X , M_Y , _-_ );
  1608.  
  1609.             //:BOTTOM LAYER OF PIXELS OF VOXEL VOLUME
  1610.             //:(Incluseive Math. We are inside the )
  1611.             //:(last layer of pixels of the last   )
  1612.             //:(layer of voxels.                   )
  1613.             V_3 _E_ = V_3( _-_ , _-_ , M_Z );
  1614.             V_3 _F_ = V_3( M_X , _-_ , M_Z );      
  1615.             V_3 _G_ = V_3( _-_ , M_Y , M_Z );
  1616.             V_3 _H_ = V_3( M_X , M_Y , M_Z );
  1617.  
  1618.             /** ************************************ ***
  1619.             Take our plane and pretend it is
  1620.             the top of a cube that we want to
  1621.             get plane in an isometric position to.
  1622.             Where the new plane tangents corner _D_
  1623.            
  1624.            
  1625.                    A------_B_            vec_D_B
  1626.                   /|       \\                  \
  1627.                  / |       |\\                  \
  1628.                 /  |       | \\      vec_D_C <---D
  1629.               _C_============_D_                 ^
  1630.                |   |_ _ _ _|  ||                 |
  1631.                |  /E       F\ ||            vec_H_D
  1632.                | /           \||
  1633.                |/             ||     Corner_Vector:
  1634.                G-------------_H_  
  1635.             *** *** * * * * * * **** * * * * * * *** **/
  1636.  
  1637.             /** Edge Vectors **/
  1638.  
  1639.             V_3 vec_C_D = normalize( _D_ - _C_ );
  1640.             V_3 vec_D_C = normalize( _C_ - _D_ );
  1641.             V_3 vec_D_B = normalize( _B_ - _D_ );
  1642.             V_3 vec_H_D = normalize( _D_ - _H_ );
  1643.             V_3 vec_D_H = normalize( _H_ - _D_ );
  1644.  
  1645.             /** *** * * * * * * **** * * * * * * *** ***
  1646.             Use Corner_Vector to calculate a 3/4        
  1647.             perspective plane that tangents _D_.
  1648.             *** ************************************ **/
  1649.             /** ************************************ ***
  1650.    
  1651.             X axis vector is pretty easy because the
  1652.             camera X axis does not move in the Z
  1653.             direction.
  1654.                     ^         /
  1655.                     |       /    ^
  1656.             A-------B     /      |    a_x Is Average
  1657.             |       |   /        |  
  1658.             |       | /     vec_D_B
  1659.             C-------D-->    vec_C_D ----->
  1660.                   /
  1661.                 /
  1662.               /<-- goal is THIS line for X-axis.(a_x)
  1663.             /
  1664.             *** *** * * * * * * **** * * * * * * *** **/
  1665.             #define _X_ vec_C_D
  1666.             #define _Y_ vec_D_B
  1667.             V_3 a_x =normalize(
  1668.  
  1669.                 /** 45 degree line on XY plane **/
  1670.                 ( _X_ + _Y_ ) / 2.0  
  1671.  
  1672.             );;
  1673.             #undef  _X_
  1674.             #undef  _Y_
  1675.             /** *** * * * * * * **** * * * * * * *** ***
  1676.            
  1677.             Y axis vector is a bit tricky because it
  1678.             moves on all axis(es). XYZ.
  1679.  
  1680.             +--B  If we average vec_D_C & vec_D_B
  1681.             |\ |  To get a 45 degree on the XY plane,
  1682.             | \|  we can then tilt that vector up
  1683.             C--D  by 45 degrees by averaging it
  1684.                |  with vec_H_D
  1685.                |
  1686.                H
  1687.  
  1688.             *** ************************************ **/
  1689.  
  1690.             //: a_y: Axis_Y
  1691.             #define _X_ vec_D_C
  1692.             #define _Y_ vec_D_B
  1693.             #define _Z_ vec_H_D
  1694.             V_3 a_y =normalize(
  1695.  
  1696.                 (
  1697.                     normalize( (_X_ + _Y_)/2.0 )
  1698.                     +        (     _Z_         )
  1699.                 ) /2.0
  1700.             );;
  1701.             #undef  _X_
  1702.             #undef  _Y_
  1703.             #undef  _Z_
  1704.  
  1705.            
  1706.             /** Looking into the voxel volume from   **/
  1707.             /** a 3/4 isometric direction.           **/
  1708.             V_3 a_z = normalize(
  1709.                 ( vec_D_C + vec_D_B + vec_D_H ) / 3.0
  1710.             );;
  1711.  
  1712.             /** ************************************ ***
  1713.  
  1714.             We can now use point-normal form to
  1715.             build our camera polygon. We will start
  1716.             from point _D_ and walk HALFWAY the
  1717.             WIDTH in both directions on our altered
  1718.             x-axis vector( a_x ) and HALFWAY the
  1719.             HEIGHT in both directions on our altered
  1720.             y-axis vector( a_y ).
  1721.  
  1722.             HEIGHT: The height of our camera plane.
  1723.              WIDTH: The width  of our camera plane.
  1724.  
  1725.                       P_X                   +---+
  1726.                 +------+------+             |   |
  1727.                 |      |      |         +---+---+
  1728.             N_Y +---- _D_ ----+ P_Y     |_D_|
  1729.                 |      |      |     +---+---+
  1730.                 +------+------+     |   |#DIA_CAMCENTER#
  1731.                       N_X           +---+
  1732.  
  1733.                 #CAMCENTER#:
  1734.                 In order for the camera to be 100%
  1735.                 centered, it may be necessary to
  1736.                 squash or stretch the camera by 1
  1737.                 pixel IF the camera is NOT an odd
  1738.                 number of pixels on that axis.
  1739.                 SEE_DIAGRAM[ #DIA_CAMCENTER# ]
  1740.  
  1741.                     +0 +1 +2 +2.5       +0 +1 +2 +3  
  1742.                     [D]   [+]           ||     [+]    
  1743.                 [ ][ ][ ][ ][ ]   [ ][ ][ ][ ][ ][ ]  
  1744.                 |<---- 5 ---->|   |<------ 6 ----->|  
  1745.  
  1746.             *** ************************************ **/
  1747.  
  1748.             #define ZOOMED_IN_CAMERA_2020_11_26 ( 1 )
  1749.             float H_W ; //:H_W:Halfway_Width
  1750.             float H_H ; //:H_H:Halfway_Height
  1751.             if( ZOOMED_IN_CAMERA_2020_11_26 >= 1 ){
  1752.  
  1753.                 F32 npm = GET_npm_USE_npx_npy_npz(
  1754.                                       NPX,NPY,NPZ);;
  1755.  
  1756.                 /** Display Size Of  A Single Voxel  **/
  1757.                 /** In Terms Of PIXELS/FRAGS         **/
  1758.                 F32 zoo_mul =( 128.0 );
  1759.                 F32 zoo_div =( zoo_mul / npm );
  1760.    
  1761.                 /** Camera surface smaller than      **/
  1762.                 /** client viewport means zoomed in  **/
  1763.                 //: H_W = ( F32(TPX) / 2.0 );
  1764.                 //: H_H = ( F32(TPY) / 2.0 );
  1765.  
  1766.                 H_W = ( iResolution.x / 2.0 );
  1767.                 H_H = ( iResolution.y / 2.0 );
  1768.  
  1769.                 H_W = ( H_W / zoo_div );
  1770.                 H_H = ( H_H / zoo_div );
  1771.  
  1772.             }else
  1773.             if( ZOOMED_IN_CAMERA_2020_11_26 <= 0 ){
  1774.  
  1775.                 /** Camera surface exactly same size **/
  1776.                 /** as client viewport means no zoom.**/
  1777.                 H_W = ( iResolution.x / 2.0 );
  1778.                 H_H = ( iResolution.y / 2.0 );
  1779.  
  1780.             };;
  1781.             #undef  ZOOMED_IN_CAMERA_2020_11_26
  1782.  
  1783.             /** To be pixel-perfect, floor and ceil  **/
  1784.             /** need to be used. This is an OCD      **/
  1785.             /** optimization that can probably       **/
  1786.             /** be removed without noticable         **/
  1787.             /** difference in the result.            **/
  1788.             //- P_X = floor( _D_ + ( a_x * H_W ) );  -//
  1789.             //- N_X =  ceil( _D_ - ( a_x * H_W ) );  -//
  1790.             //- P_Y = floor( _D_ + ( a_y * H_H ) );  -//
  1791.             //- N_Y =  ceil( _D_ - ( a_y * H_H ) );  -//
  1792.             //+ We can't do it this way, because the +//
  1793.             //+ plane is not aligned with our native +//
  1794.             //+ XYZ axis.                            +//
  1795.             //+ What I mean is we can't get the top  +//
  1796.             //+ left corner by saying:               +//
  1797.             //+ vec3( N_Y.x , P_X.y , _D_.z )        +//
  1798.             /** ************************************ ***
  1799.             RASTER_GRAPHICS_STYLE_TOP_LEFT_ORIGIN
  1800.                \
  1801.                 +----------- +X ------------>
  1802.                 |    
  1803.                 |     _I_              _J_
  1804.                 |       \      P_X      /  
  1805.                 |        +------+------+        ^
  1806.                 |        |      |      |        |
  1807.                +Y    N_Y +---- _D_ ----+ P_Y [ -y ]
  1808.                 |        |      |      |        |
  1809.                 |        +------+------+        |
  1810.                 |       /      N_X      \       |
  1811.                 V     _K_               _L_     |
  1812.                                                 |
  1813.                     <---------[ -x ]------------+
  1814.  
  1815.             *** *** * * * * * * **** * * * * * * *** **/
  1816.    
  1817.             V_3 _I_ = _D_  - ( a_x * H_W )
  1818.                            - ( a_y * H_H ) ;;
  1819.  
  1820.             V_3 _J_ = _D_  + ( a_x * H_W )
  1821.                            - ( a_y * H_H ) ;;
  1822.  
  1823.             V_3 _K_ = _D_  - ( a_x * H_W )
  1824.                            + ( a_y * H_H ) ;;
  1825.  
  1826.             V_3 _L_ = _D_  + ( a_x * H_W )
  1827.                            + ( a_y * H_H ) ;;
  1828.                    
  1829.             /** ************************************ **/
  1830.             #define USE_ANIMATED_DOLLY_FOR_DEBUG  ( 1 )
  1831.             if(     USE_ANIMATED_DOLLY_FOR_DEBUG >= 1 ){
  1832.  
  1833.                 F32 max_dolly =max(
  1834.                             F32(TPX)
  1835.                 ,
  1836.                         max(
  1837.                             F32(TPY)
  1838.                             ,
  1839.                             F32(TPZ)
  1840.                         )
  1841.                 );;
  1842.  
  1843.                 F32 spd=( iTime*0.10 ); /**spd==SPEED**/
  1844.                 F32 pos_cos=( (cos( spd )/2.0)+0.5 );
  1845.                 F32 neg_cos=( (cos( spd )/2.0)-0.5 );
  1846.  
  1847.                 F32 dolly_amount =(
  1848.                     pos_cos * max_dolly
  1849.                 );;
  1850.                
  1851.                 _I_ += ( a_z * dolly_amount );
  1852.                 _J_ += ( a_z * dolly_amount );
  1853.                 _K_ += ( a_z * dolly_amount );
  1854.                 _L_ += ( a_z * dolly_amount );
  1855.  
  1856.             };;
  1857.             #undef  USE_ANIMATED_DOLLY_FOR_DEBUG
  1858.            
  1859.             V_3 I_J = sdf_i3d( _I_ , _J_ , f_p.x );
  1860.             V_3 K_L = sdf_i3d( _K_ , _L_ , f_p.x );
  1861.                 rwC = sdf_i3d( I_J , K_L , f_p.y );
  1862.  
  1863.                 //:#POSITIVE_Z_DIVES_INTO_SCREEN#://
  1864.                 rwN = normalize( a_z );
  1865.  
  1866.                     rwC_AND_rwN.rwC = rwC;
  1867.                     rwC_AND_rwN.rwN = rwN;
  1868.             return( rwC_AND_rwN );
  1869.         }
  1870.     #undef  _0_
  1871.     #undef   _
  1872.     //:==========:f_p_CTO_rwC_AND_rwN_CAMTYPE_OGP_34D://
  1873.     //:f_p_CTO_rwC_AND_rwN_CAMTYPE_T3O_AAZ:==========://
  1874.  
  1875.                 RWC_AND_RWN
  1876.         f_p_CTO_rwC_AND_rwN_CAMTYPE_T3O_AAZ(
  1877.             V_2 f_p /** 2 dimensional percentage **/
  1878.         )
  1879.         {
  1880.             RWC_AND_RWN
  1881.             rwC_and_rwN;
  1882.  
  1883.             //:TODO: Logic.
  1884.  
  1885.             return( rwC_and_rwN );
  1886.  
  1887.         }
  1888.  
  1889.     //:==========:f_p_CTO_rwC_AND_rwN_CAMTYPE_T3O_AAZ://
  1890.     //:f_p_CTO_rwC_AND_rwN_CAMTYPE_T3I_AAZ:==========://
  1891.     /** TAGS[ t3i_aaz : t3i:aaz ] **/
  1892.     #define RWC rwC_and_rwN.rwC
  1893.     #define RWN rwC_and_rwN.rwN
  1894.  
  1895.                 RWC_AND_RWN
  1896.         f_p_CTO_rwC_AND_rwN_CAMTYPE_T3I_AAZ(
  1897.             V_2 f_p /** 2 dimensional percentage **/
  1898.         )
  1899.         {
  1900.             RWC_AND_RWN
  1901.             rwC_and_rwN;
  1902.  
  1903.             F32 pos_cos=(cos(iTime)+1.0) / 2.0 ;
  1904.  
  1905.             #define F float
  1906.             #define M max
  1907.             F32 N_T = M( M( F(NTX),F(NTY) ),F(NTZ) );
  1908.             F32 N_P = M( M( F(NPX),F(NPY) ),F(NPZ) );
  1909.             F32 rad =( N_T * N_P ) * 2.0 * pos_cos;
  1910.             #undef  F
  1911.             #undef  M
  1912.  
  1913.             //:           123456789
  1914.             F32 PI2 = ( 3.141592653 * 2.0 );
  1915.             F32 hig = (  400.0 ); //:Cylinder Height.
  1916.  
  1917.             F32 pop = f_p.x     ; //: Percent_On_Path
  1918.             V_2 c_n             ; //: Circle_Normal
  1919.             F32 ang = pop * PI2 ; //: Angle
  1920.             RWC.x = c_n.x = (0.0+rad) +cos(ang)*rad;
  1921.             RWC.y = c_n.y = (0.0+rad) +sin(ang)*rad;
  1922.             RWC.z = hig * f_p.y ;
  1923.        
  1924.             RWN.x = 0.0 - c_n.x;
  1925.             RWN.y = 0.0 - c_n.y;
  1926.             RWN.z = 0.0; //:Perpendicular To Z axis.
  1927.    
  1928.             return( rwC_and_rwN );
  1929.         }
  1930.  
  1931.     #undef  RWC
  1932.     #undef  RWN
  1933.     //:==========:f_p_CTO_rwC_AND_rwN_CAMTYPE_T3I_AAZ://
  1934.     //:f_p_CTO_rwC_AND_rwN_CAMTYPE_S3I_AAZ:==========://
  1935.     /** TAGS[ s3i_aaz : s3i:aaz ] **/
  1936.     #define RWC rwC_and_rwN.rwC
  1937.     #define RWN rwC_and_rwN.rwN
  1938.  
  1939.                 RWC_AND_RWN
  1940.         f_p_CTO_rwC_AND_rwN_CAMTYPE_S3I_AAZ(
  1941.             V_2 f_p /** 2 dimensional percentage **/
  1942.         )
  1943.         {
  1944.             RWC_AND_RWN
  1945.             rwC_and_rwN;
  1946.  
  1947.             /** Make camera sphere grow and shrink   **/
  1948.             F32 pos_cos=(cos(iTime/8.0)+1.0) / 2.0 ;
  1949.  
  1950.             #define F float
  1951.             #define M max
  1952.             F32 N_T = M( M( F(NTX),F(NTY) ),F(NTZ) );
  1953.             F32 N_P = M( M( F(NPX),F(NPY) ),F(NPZ) );
  1954.             F32 rad =( N_T * N_P ) * pos_cos*1.0;
  1955.             #undef  F
  1956.             #undef  M
  1957.  
  1958.             //:           123456789
  1959.             F32 PI2 = ( 3.141592653 * 2.0 );
  1960.             F32 hig = ( rad*2.0); //:Cylinder Height.
  1961.  
  1962.             F32 pop = f_p.x     ; //: Percent_On_Path
  1963.             V_2 c_n             ; //: Circle_Normal
  1964.             F32 ang = pop * PI2 ; //: Angle
  1965.  
  1966.             /** TODO: Taper the cylinder at top and  **/
  1967.             /**       bottom at correct rate to      **/
  1968.             /**       create a spherical enclosure.  **/
  1969.             RWC.z = ( hig * f_p.y ) + rad;
  1970.        
  1971.             /** ........ .1234567890 **/
  1972.             #define PI  3.1415926535
  1973.                 F32 per_hig =(
  1974.                     /** Center is 0% , tips are 100% **/
  1975.                     ( abs( 0.5 - f_p.y ) ) * 2.0
  1976.                 );;
  1977.      
  1978.                 F32 sphere_taper=(
  1979.                     cos( per_hig * PI/2.0 ) );;
  1980.  
  1981.                 #define R taper_rad
  1982.                 F32 taper_rad = rad * sphere_taper;
  1983.                 RWC.x = c_n.x = (0.0+R) +cos(ang)*R;
  1984.                 RWC.y = c_n.y = (0.0+R) +sin(ang)*R;
  1985.                 #undef  R
  1986.  
  1987.             #undef PI
  1988.            
  1989.             /** Make normal always look towards **/
  1990.             /** the center of our sphere.       **/
  1991.             RWN.x = 0.0 - RWC.x ;
  1992.             RWN.y = 0.0 - RWC.y ;
  1993.             RWN.z = 0.0 - RWC.z ;
  1994.    
  1995.             return( rwC_and_rwN );
  1996.         }
  1997.  
  1998.     #undef  RWC
  1999.     #undef  RWN
  2000.     //:==========:f_p_CTO_rwC_AND_rwN_CAMTYPE_S3I_AAZ://
  2001.     //:f_p_CTO_rwC_AND_rwN:==========================://
  2002.     #define ogp_top f_p_CTO_rwC_AND_rwN_CAMTYPE_OGP_TOP
  2003.     #define ogp_34d f_p_CTO_rwC_AND_rwN_CAMTYPE_OGP_34D
  2004.     #define t3o_aaz f_p_CTO_rwC_AND_rwN_CAMTYPE_T3O_AAZ
  2005.     #define t3i_aaz f_p_CTO_rwC_AND_rwN_CAMTYPE_T3I_AAZ
  2006.     #define s3i_aaz f_p_CTO_rwC_AND_rwN_CAMTYPE_S3I_AAZ
  2007.  
  2008.                 RWC_AND_RWN
  2009.         f_p_CTO_rwC_AND_rwN(
  2010.             V_2 f_p /** 2 dimensional percentage **/
  2011.         )
  2012.         {
  2013.             RWC_AND_RWN
  2014.             rwC_and_rwN;
  2015.  
  2016.             switch( CAMTYPE ){
  2017.  
  2018.                 case          OGP_TOP :
  2019.                 rwC_and_rwN = ogp_top( f_p ); break;
  2020.  
  2021.                 case          OGP_34D :
  2022.                 rwC_and_rwN = ogp_34d( f_p ); break;
  2023.  
  2024.                 case          T3O_AAZ :
  2025.                 rwC_and_rwN = t3o_aaz( f_p ); break;
  2026.  
  2027.                 case          T3I_AAZ :
  2028.                 rwC_and_rwN = t3i_aaz( f_p ); break;
  2029.  
  2030.                 case          S3I_AAZ :
  2031.                 rwC_and_rwN = s3i_aaz( f_p ); break;
  2032.            
  2033.                 default : /** OGP_TOP **/
  2034.                 rwC_and_rwN = ogp_top( f_p ); break;
  2035.  
  2036.             };;  
  2037.  
  2038.             return( rwC_and_rwN );
  2039.         }
  2040.  
  2041.     #undef  ogp_top  
  2042.     #undef  ogp_34d  
  2043.     #undef  t3o_aaz  
  2044.     #undef  t3i_aaz  
  2045.     #undef  s3i_aaz  
  2046.     //:==========================:f_p_CTO_rwC_AND_rwN://
  2047.     //:========================:FRAGPER_TO_CAMERA_RAY://
  2048.     //:RENDER_SCENE:=================================://
  2049.     //:sdf_RenderScene.BUG_001:======================://
  2050.  
  2051.         O_K_C4D
  2052.         BUG_001(
  2053.         /**/    I32   o_k  /**  Is everything "ok"?  **/
  2054.         ,       V_4   c4d  /**  Color_4_Dimensional  **/
  2055.         ,       F32   d_n  /**  vox_000.vod.dis_nex  **/
  2056.         )
  2057.         {
  2058.             O_K_C4D
  2059.             o_k_c4d;
  2060.  
  2061.             #if( SDF_DEBUG_MODE_ON <= 0 ) //:########://
  2062.  
  2063.                 /** DO NOTHING **/
  2064.  
  2065.             #else //:################################://
  2066.  
  2067.                 /** if( d_n <= 0.0 we have trouble ) **/
  2068.  
  2069.                 F32 MF3=intBitsToFloat(0x7f7fFFFF);
  2070.                 if( 0.0 - 666.0 == d_n ){
  2071.  
  2072.                     /** Exit On Error            **/
  2073.                     /** #DIST_NEXT_NEVER_ZERO#   **/
  2074.                     c4d=PIX_ERR(ERR_003,c4d,o_k--);
  2075.  
  2076.                 }else
  2077.                 if( d_n <= 0.0 ){
  2078.  
  2079.                     c4d=Flash_rgb_rgb_CTO_c4d(
  2080.                         U32( 0x2F3F4F )
  2081.                     ,   U32( 0x5F6F7F )
  2082.                     );;
  2083.  
  2084.                     o_k--;
  2085.  
  2086.                 }else
  2087.                 if( d_n == MF3 /** MaxFloat32 **/ ){
  2088.  
  2089.                     c4d=Flash_rgb_rgb_CTO_c4d(
  2090.                         U32( 0xBAD001 ) //:LIME
  2091.                     ,   U32( 0x100BAD ) //:BLUE
  2092.                     );;
  2093.  
  2094.                     o_k--;
  2095.  
  2096.                 }else
  2097.                 if( isinf( d_n ) ){
  2098.  
  2099.                     c4d=Flash_rgb_rgb_CTO_c4d(
  2100.                         U32( 0xBAD002 ) //:LIME
  2101.                     ,   U32( 0x200BAD ) //:BLUE
  2102.                     );;
  2103.  
  2104.                     o_k--;
  2105.                 };;
  2106.    
  2107.             #endif //:###############################://
  2108.  
  2109.                     o_k_c4d.o_k =( o_k );
  2110.                     o_k_c4d.c4d =( c4d );
  2111.             return( o_k_c4d );
  2112.         }
  2113.  
  2114.     //:======================:sdf_RenderScene.BUG_001://
  2115.     //:sdf_RenderScene:==============================://
  2116.  
  2117.         /** RMT: Ray_Marching_Tick **/
  2118.         REFAC01
  2119.         sdf_RenderScene_RMT_001(
  2120.             REFAC01
  2121.             refac01
  2122.         )
  2123.         {
  2124.             //:RAY_MARCH_LOOP:-----------------------://
  2125.  
  2126.             //:March by distance to next voxel:
  2127.                        
  2128.             //:Point_Normal_Form_To_Get:xyz
  2129.             //:#DISTANCE_IS_NOT_CUMULATIVE#
  2130.             #define R01 refac01 //:##################://
  2131.             #define D_N refac01.vox_000.vod.dis_nex ////
  2132.  
  2133.                 R01.xyz +=(
  2134.                     R01.rwC_AND_rwN.rwN     //:NORMAL://
  2135.                     *                       //:      ://
  2136.                     R01.vox_000.vod.dis_nex //:SCALAR://
  2137.                 );;             //:(  D_N  )://
  2138.  
  2139.             #undef  D_N //:##########################://
  2140.             #undef  R01 //:##########################://
  2141.             #define R01 refac01 //:##################://
  2142.             #define D_N refac01.vox_000.vod.dis_nex ////
  2143.  
  2144.                 /** This section must come BEFORE    **/
  2145.                 /** call to: GET_vox_000_USE_xyz_rwN **/
  2146.              
  2147.                 /** Update Current Origin (xyz)'s    **/
  2148.                 /** dist from original origin (rwC)  **/
  2149.  
  2150.                     R01.xyz_TDF_rwC +=(
  2151.  
  2152.                         refac01.vox_000.vod.dis_nex
  2153.                    
  2154.                     );;
  2155.  
  2156.                 /** EXIT, if shot off into space. ** **/
  2157.  
  2158.                     if( R01.xyz_TDF_rwC > MAX_DIS ){
  2159.                        
  2160.                         //:#BREAK#://
  2161.                         R01.should_break=U32( 1 );
  2162.                         return( refac01 /** R01 **/ );
  2163.  
  2164.                     };;
  2165.  
  2166.             #undef  D_N //:##########################://
  2167.             #undef  R01 //:##########################://
  2168.             #define R01 refac01 //:##################://
  2169.             #define D_N refac01.vox_000.vod.dis_nex ////
  2170.  
  2171.                 //:@WHATVOX@://
  2172.                 R01.vox_000 =
  2173.                 GET_vox_000_USE_xyz_rwN(
  2174.                             R01.xyz
  2175.                 ,   R01.rwC_AND_rwN.rwN
  2176.                 );;
  2177.                
  2178.                 /** DEBUG DISTANCE TO NEXT **/
  2179.                 R01.o_k_c4d = BUG_001(
  2180.                               R01.o_k_c4d.o_k
  2181.                             , R01.o_k_c4d.c4d
  2182.                             ,             D_N  );;    
  2183.  
  2184.                 if( I32(1) != R01.o_k_c4d.o_k ){
  2185.  
  2186.                     /** Was "break" before extracted **/
  2187.                     R01.should_break=U32( 1 );
  2188.                     return( refac01 /** R01 **/ );
  2189.  
  2190.                 };;
  2191.            
  2192.             #undef  D_N //:##########################://
  2193.             #undef  R01 //:##########################://
  2194.            
  2195.         //:If voxel is not empty, ray march
  2196.         //:inside of the voxel.
  2197.         #define _0_ U32( 0 ) //:#####################://
  2198.         #define R01 refac01  //:#####################://
  2199.         #define HAS refac01.vox_000.voc.has //:######://
  2200.         #define VAL refac01.vox_000.voc.val //:######://
  2201.            
  2202.             if( I32(1) != R01.o_k_c4d.o_k ){
  2203.            
  2204.                 /** Do nothing if in an **/
  2205.                 /** Erroneious state.   **/
  2206.            
  2207.             }else
  2208.             if( HAS > _0_ && _0_ == VAL ){
  2209.            
  2210.                 //:EMPTY_TILE_INSIDE_MAP_BOUNDS:
  2211.                 R01.o_k_c4d.c4d = u32_CTO_c4d(U32(
  2212.                           0x003300FF ));;
  2213.            
  2214.             }else
  2215.             if( _0_ == HAS ){
  2216.             //:OUT_OF_MAP_BOUNDS:--------------------://
  2217.             #define XYZ     refac01.xyz
  2218.             #define RWC     refac01.rwC_AND_rwN.rwC
  2219.            
  2220.                 //:OUT_OF_MAP_BOUNDS:
  2221.                 //  R01.o_k_c4d.c4d=u32_CTO_c4d(U32(
  2222.                 //              0x330011FF ));
  2223.                
  2224.                 R01.xyz_TDF_rwC=(length(XYZ - RWC));
  2225.                 F32 per=(R01.xyz_TDF_rwC / MAX_DIS);
  2226.                 F32 inv=( 1.0 - per );
  2227.                
  2228.                
  2229.                 /** #INTO_THE_BLACK_VOID# **/
  2230.                 R01.o_k_c4d.c4d=V_4(
  2231.                     V_3(1)*(inv) , 1.0 );;
  2232.            
  2233.             #undef  XYZ
  2234.             #undef  RWC
  2235.             //:--------------------:OUT_OF_MAP_BOUNDS://
  2236.             }else
  2237.             if( HAS > _0_ && VAL > _0_  ){
  2238.             #define XYZ     refac01.xyz
  2239.             #define RWN     refac01.rwC_AND_rwN.rwN
  2240.             #define TIL_D3D refac01.vox_000.voc.til_d3d
  2241.             #define PIX_D3D refac01.vox_000.voc.pix_d3d
  2242.  
  2243.                 R01.pix_000 = (
  2244.                 GET_pix_000_USE_xyz_rwN_til_d3d_pix_d3d(
  2245.                                 XYZ,RWN,TIL_D3D,PIX_D3D
  2246.                 ));;
  2247.                    
  2248.                 /*[FIX]: ALWAYS RETURNS EXIT */
  2249.                 if( R01.pix_000.exit >= U32(1) ){
  2250.                
  2251.                     //: c4d=( u32_CTO_c4d(
  2252.                     //: vox_000.voc.val ) );;
  2253.                
  2254.                     R01.o_k_c4d.c4d =( vox_000_CTO_c4d(
  2255.                     /**/           R01.vox_000      ));;
  2256.                
  2257.                     /** Was "break" before extracted **/
  2258.                     R01.should_break=U32( 1 );
  2259.                     return( refac01 /** R01 **/ );
  2260.                 };;
  2261.  
  2262.             #undef  XYZ      
  2263.             #undef  RWN      
  2264.             #undef  TIL_D3D  
  2265.             #undef  PIX_D3D  
  2266.             }else{
  2267.            
  2268.                 //:SHOULD_NEVER_EXECUTE:
  2269.                 R01.o_k_c4d.c4d=Flash_rgb_rgb_CTO_c4d(
  2270.                         U32( 0x404001 ) //:TURTLE_GREEN
  2271.                     ,   U32( 0x100404 ) //:BLACK____ISH
  2272.                 );;
  2273.            
  2274.             };;
  2275.            
  2276.         #undef  _0_  //:#############################://
  2277.         #undef  R01  //:#############################://
  2278.         #undef  HAS  //:#############################://
  2279.         #undef  VAL  //:#############################://
  2280.            
  2281.             /** Don't move the ray anywhere  **/
  2282.             /** We are going to slice into   **/
  2283.             /** whatever voxels the camera   **/
  2284.             /** plane passes through.        **/
  2285.             if( CFG_SLICE_RENDER >= 1 ){
  2286.             #define R01 refac01
  2287.  
  2288.                 /** Was "break" before extracted **/
  2289.                 R01.should_break=U32( 1 );
  2290.                 return( refac01 /** R01 **/ );  
  2291.  
  2292.             #undef R01
  2293.             };;
  2294.             //:-----------------------:RAY_MARCH_LOOP://
  2295.  
  2296.             return( refac01 );
  2297.         }
  2298.  
  2299.         V_4 sdf_RenderScene( RWC_AND_RWN rwC_AND_rwN )
  2300.         {
  2301.             //:PAYLOAD_OBJECT_FOR_RENDER_LOOP:-------://
  2302.  
  2303.                 REFAC01 refac01; /** REFACTOR_ME_001 **/
  2304.  
  2305.             //:-------:PAYLOAD_OBJECT_FOR_RENDER_LOOP://
  2306.             //:VARIABLE_SETUP:-----------------------://
  2307.             #define R01 refac01
  2308.  
  2309.                 //:MISC_MEMBERS:---------------------://
  2310.  
  2311.                     /** Pass it down. **/
  2312.  
  2313.                         R01.rwC_AND_rwN = rwC_AND_rwN;
  2314.  
  2315.                     /** xyz's TotalDistanceFrom rwC  **/
  2316.  
  2317.                         R01.xyz_TDF_rwC = ( 0.0 );
  2318.  
  2319.                     /** xyz is a copy of rwC so that **/
  2320.                     /** we can alter the origin of   **/
  2321.                     /** the ray march each iteration.**/
  2322.  
  2323.                         R01.xyz = rwC_AND_rwN.rwC ;
  2324.  
  2325.                     /** Needed addition now that     **/
  2326.                     /** loop body is extracted into  **/
  2327.                     /** another function.            **/
  2328.  
  2329.                         R01.should_break= U32( 0 )   ;
  2330.  
  2331.                 //:---------------------:MISC_MEMBERS://
  2332.                 //:vox_000:--------------------------://
  2333.                 #define VOC refac01.vox_000.voc
  2334.                 #define VOD refac01.vox_000.vod
  2335.  
  2336.                     VOD.dis_nex =(    0.0 );
  2337.                    
  2338.                     VOC.has     = uint( 0 ); //:1://
  2339.                     VOC.val     = uint( 0 ); //:2://
  2340.                     VOC.til_d3d =  int( 0 ); //:3://
  2341.                     VOC.t_x     =  int( 0 ); //:4://
  2342.                     VOC.t_y     =  int( 0 ); //:5://
  2343.                     VOC.t_z     =  int( 0 ); //:6://
  2344.  
  2345.                 #undef  VOC
  2346.                 #undef  VOD
  2347.                 //:--------------------------:vox_000://
  2348.                 //:pix_000:--------------------------://
  2349.                 #define PIX refac01.pix_000
  2350.  
  2351.                     PIX.exit=U32( 0 );
  2352.  
  2353.                 #undef  PIX
  2354.                 //:--------------------------:pix_000://
  2355.                 //:o_k_c4d:--------------------------://
  2356.                 #define C4D refac01.o_k_c4d.c4d
  2357.                 #define O_K refac01.o_k_c4d.o_k
  2358.  
  2359.                     /** c4d corret initial value.....**/
  2360.                     /** cd4 =THE_COLOR_OF_EMPTY_SPACE**/
  2361.  
  2362.                     O_K =I32( 1 );
  2363.                     C4D =u32_CTO_c4d( U32(0x123456FF) );
  2364.                                 /**DARK_SKY_BLUE**/
  2365.  
  2366.                 #undef  C4D  
  2367.                 #undef  O_K  
  2368.                 //:--------------------------:o_k_c4d://
  2369.  
  2370.             #undef  R01
  2371.             //:-----------------------:VARIABLE_SETUP://
  2372.             //:RAY_MARCH_LOOP:-----------------------://
  2373.             /** #ABOUT_RAY_MARCH_LOOP# **/
  2374.             #define R01 refac01
  2375.  
  2376.                 //:(RayMarch)March to VOXEL:
  2377.                 for( int i = 0; i < MAX_STE ; i++ ){
  2378.                
  2379.                     /** #LOOPTICK_FUNCTION# **/
  2380.                     R01=( sdf_RenderScene_RMT_001(
  2381.                     R01 ));;
  2382.                
  2383.                     if( R01.should_break >= U32(1)){
  2384.                
  2385.                         break;
  2386.                
  2387.                     };;
  2388.                 };;
  2389.  
  2390.             #undef R01
  2391.             //:-----------------------:RAY_MARCH_LOOP://
  2392.          
  2393.  
  2394.             if( CFG_SLICE_RENDER >= 1 ){
  2395.             #define T_X refac01.vox_000.voc.t_x
  2396.             #define T_Y refac01.vox_000.voc.t_y
  2397.             #define T_Z refac01.vox_000.voc.t_z
  2398.             #define HAS refac01.vox_000.voc.has
  2399.  
  2400.                 //:Layer value, 1 or 0
  2401.                 int lay = I32_MOD( T_Z, 2 );
  2402.                
  2403.                 //:#MODULO_CHECKER_PATTERN#://
  2404.                 int chk =(  
  2405.                     I32_MOD( //:<<<<<<<<<<<<<<:SET_003
  2406.                         I32_MOD( T_Y, 2 )   //:SET_YYY
  2407.                     +   I32_MOD( T_X, 2 )   //:SET_XXX
  2408.                     ,                 2
  2409.                     )
  2410.                 );;
  2411.            
  2412.                 if(   0 != 0
  2413.                 || ( lay < 0 )
  2414.                 || ( lay > 1 )
  2415.                 || ( chk < 0 || chk > 1 )
  2416.                 || ( HAS > uint(1)      )
  2417.                 ){
  2418.                 #define C4D refac01.o_k_c4d.c4d //:##://
  2419.                 #define O_K refac01.o_k_c4d.o_k //:##://
  2420.  
  2421.                     //: _0x010101_ & _0x101010_
  2422.                     C4D=PIX_ERR(ERR_001,C4D,O_K--);
  2423.  
  2424.                 #undef  C4D  //:#####################://
  2425.                 #undef  O_K  //:#####################://
  2426.                 };;
  2427.  
  2428.                
  2429.                 F32 M =( 255.0); //:Max RGB value.
  2430.                 F32 X =( 1.0  ); //:FOR_DEBUGGING_COLORS
  2431.              //:F32 ...........;    Replace with "_"
  2432.              //:F32 ...........;    when done debugging.
  2433.                 F32 a =( 1.0  ); //:ALPHA
  2434.                 F32 _ =( 0.0  );
  2435.                 F32 g =( F32(0x33)/M ); //:DARK-GREY
  2436.                 F32 G =( F32(0x38)/M );
  2437.                 F32 w =( F32(0xE5)/M ); //:WHITE-GREY
  2438.                 F32 W =( F32(0xF2)/M );
  2439.  
  2440.                 V_4 _0x333333_ =V_4(g,g,g,a);
  2441.                 V_4 _0x383838_ =V_4(G,G,G,a);
  2442.                 V_4 _0xE5E5E5_ =V_4(w,w,w,a);
  2443.                 V_4 _0xF2F2F2_ =V_4(W,W,W,a);
  2444.                 V_4 _0x003300_ =V_4(_,g,_,a);
  2445.                 V_4 _0x003800_ =V_4(_,G,_,a);
  2446.                 V_4 _0x00E500_ =V_4(_,w,_,a);
  2447.                 V_4 _0x00F200_ =V_4(_,W,_,a);
  2448.  
  2449.                 V_4 tab_000[8]=V_4[8](
  2450.                     //:OUT OF BOUNDS:       //:HAS?
  2451.                     _0x333333_ , _0x383838_ //:LAY0
  2452.                    ,_0xE5E5E5_ , _0xF2F2F2_ //:LAY1
  2453.                 //: |   CHK0   |     CHK1   |::::::::://
  2454.                                    
  2455.                     //:IN BOUNDS:           //:HAS?
  2456.                    ,_0x003300_ , _0x003800_ //:LAY0
  2457.                    ,_0x00E500_ , _0x00F200_ //:LAY1
  2458.                 //: |   CHK0   |     CHK1   |::::::::://
  2459.                 );;
  2460.                
  2461.                 I32 pik = (
  2462.                    (4 * ( HAS >= uint(1) ? 1 : 0 ))
  2463.                 +  (2 * lay ) //: LAY0 -or- LAY1
  2464.                 +  (1 * chk ) //: CHK0 -or- CHK1
  2465.                 );;
  2466.  
  2467.                 #define C4D refac01.o_k_c4d.c4d //:##://
  2468.                 #define O_K refac01.o_k_c4d.o_k //:##://
  2469.  
  2470.                     if( pik < 0 || pik >= 8 ){
  2471.                         C4D=PIX_ERR(ERR_002,C4D,O_K--);
  2472.                     };;
  2473.                    
  2474.                     //:TODO: Why is not rendering as
  2475.                     //:      checker?
  2476.                     if( 1 == O_K ){
  2477.                         C4D = tab_000[ pik ];
  2478.                     };;
  2479.  
  2480.                 #undef  C4D  //:#####################://
  2481.                 #undef  O_K  //:#####################://
  2482.  
  2483.             #undef  T_X //:##########################://
  2484.             #undef  T_Y //:##########################://
  2485.             #undef  T_Z //:##########################://
  2486.             #undef  HAS //:##########################://
  2487.             }else{ /** CFG_SLICE_RENDER ? **/
  2488.  
  2489.                 //:DEBUG_ONLY:  c4d=V_4(1,1,1,1);
  2490.  
  2491.             };;
  2492.  
  2493.             return( refac01.o_k_c4d.c4d );
  2494.         }
  2495.  
  2496.     //:==============================:sdf_RenderScene://
  2497.     //:=================================:RENDER_SCENE://
  2498.  
  2499. //:11111111111111111111111111111111111111111111111111://
  2500. //:00000000000000000000000000000000000000000000000000://
  2501.  
  2502.     void mainImage(
  2503.         out vec4 fragColor
  2504.     ,   in  V_2 fragCoord
  2505.     )
  2506.     {
  2507.            
  2508.         #define R_Y iResolution.y
  2509.             V_2 f_c = V_2(
  2510.             //:( FLIP? )       ( Discrete XY       ) ://
  2511.                (  0.0  )   +   ( fragCoord.x - 0.5 )
  2512.             ,  (R_Y-1.0)   -   ( fragCoord.y - 0.5 )
  2513.             );;
  2514.         #undef R_Y  
  2515.         V_2 f_p = f_c_CTO_f_p( f_c );
  2516.  
  2517.  
  2518.         //:CAMERA_RAY_FOR_CURRENT_PIXEL:-------------://
  2519.  
  2520.             /** The coordinate and direction of the  **/
  2521.             /** camera ray [rwC,rwN] are closely     **/
  2522.             /** related, so return them using the    **/
  2523.             /** same function. This will save        **/
  2524.             /** processing power when we decide      **/
  2525.             /** to create a camera lense that        **/
  2526.             /** is a 360 degree cylinder around      **/
  2527.             /** an object. (for fun)                 **/
  2528.  
  2529.             RWC_AND_RWN
  2530.             rwC_AND_rwN;
  2531.  
  2532.             rwC_AND_rwN = f_p_CTO_rwC_AND_rwN( f_p );
  2533.  
  2534.         //:-------------:CAMERA_RAY_FOR_CURRENT_PIXEL://
  2535.  
  2536.         fragColor = sdf_RenderScene( rwC_AND_rwN );
  2537.  
  2538.     }
  2539. //:00000000000000000000000000000000000000000000000000://
  2540. //:DOCUMENTATION:====================================://
  2541. /** ************************************************ ***
  2542.     ABBREVIATIONS:
  2543.  
  2544.         f : fragment
  2545.         p : percent (Never Position, use C for coord)
  2546.         c : coordinate
  2547.         r : ray
  2548.         n : normal, for directions.
  2549.         d : distance. NEVER DIRECTION.( use: n:normal )
  2550.        
  2551.     IDENTIFIERS:
  2552.  
  2553.         CTO: Convert_TO
  2554.         rwC: RayWorldCoord
  2555.         rwN: RayWorldNormal
  2556.         f_p: FragPercent
  2557.         f_c: FragCoord (With Discrete Pixel Coords)
  2558.                     (instead of pixel centers  )
  2559.         dad: Distance_And_inDEX
  2560.             Index is 1D index of XYZ voxel tile
  2561.             coordinate.
  2562.         vat: Voxel_Array__of__Tiles
  2563.         c4d: Color_4_Dimensional(RGBA)
  2564.  
  2565.     FUNCTIONS:
  2566.  
  2567.         f_c_CTO_f_p : FragmentCoord -CTO- FragPercent
  2568.         f_c_CTO_per : USE[ f_c_CTO_f_p ]
  2569.         sdf_i3d     : Interpolate_Two_3D_Points
  2570.  
  2571.     CTRL_F_INDEX: (CTRL+F:INDEX, Search Phrases)
  2572.                   (CTR + F)<-- Spaces Between Letters
  2573.  
  2574.         Which Voxel Am I On? .... SEE[  @WHATVOX@      ]
  2575.         What Voxel Am I On? ..... SEE[  @WHATVOX@      ]
  2576.         Find Current Voxel ...... SEE[  @WHATVOX@      ]
  2577.         pix_3d3 ................. TYPOFIX[ pix_d3d     ]
  2578.         til_3d3 ................. TYPOFIX[ til_d3d     ]
  2579.         cd4 ..................... TYPOFIX[   c4d       ]
  2580.         m3d ..................... TYPOFIX[   m2d       ]
  2581.         Voxel To Color Debug .... SEE[ @VOXBUGCOLOR@   ]
  2582.         gradient,Gradient........ SEE[ @VOXBUGCOLOR@   ]
  2583.         which voxel are we in ... SEE[ @WHATVOX@       ]
  2584.         SDF_PRJ_MAX.............. TYPOFIX[ SDF_PRO_MAX ]
  2585.         generic ........ 001[ #STACK_ADDRESS_WORKINGS# ]
  2586.         generic ........ 002[ GET_pix_000... could_use ]
  2587.         hex-to-color-c4d ........ SEE[ u32_CTO_c4d     ]
  2588.  
  2589.     EXTRACTED_BLOCK_COMMENTS:
  2590.  
  2591.         #ABOUT_RAY_MARCH_LOOP###########################
  2592.  
  2593.             Ray marching loop should be able to look    
  2594.             at the current voxel coordinate returned    
  2595.             and decide to STOP marching if it wants.    
  2596.             By stopping immediately without marching    
  2597.             at all we can make the camera phosphore    
  2598.             surface a slice plane that renders          
  2599.             cross sectional views of tilemap data.      
  2600.    
  2601.         ##########################ABOUT_RAY_MARCH_LOOP##
  2602.         #POSITIVE_Z_DIVES_INTO_SCREEN###################
  2603.  
  2604.             Positive Z is further back into screen.
  2605.             This way to help normalize voxel grid math.
  2606.        
  2607.         ###################POSITIVE_Z_DIVES_INTO_SCREEN#
  2608.         #FIND_POINT_ON_SCREEN_PLANE#####################
  2609.  
  2610.             ORIGINAL_COMMENT:
  2611.  
  2612.                 Polygon in 3d space to serve as the
  2613.                 phosphor surface the CRT monitor
  2614.                 electrons will be projected onto.
  2615.                 Could probably use a mat4 for this.
  2616.  
  2617.             MORE_INFORMATION_IN_RETROSPECT:
  2618.  
  2619.                 "Screen Plane" is also known as
  2620.                 "CRT Phospore" or "PHO" for short.
  2621.                 This is a plane put into 3D space that
  2622.                 represents the pixels of the client
  2623.                 viewport (physical monitor).
  2624.  
  2625.                 The "IMAGE" plane from this diagram:
  2626.                 https://tinyurl.com/IMAGE-PLANE
  2627.  
  2628.         #####################FIND_POINT_ON_SCREEN_PLANE#
  2629.         #MODULO_CHECKER_PATTERN#########################
  2630.  
  2631.             // Checker pattern value, 1 or 0.         //
  2632.             // Combine Sets so that they create       //
  2633.             // a checkerboard of odd/even values,     //
  2634.             // and then convert even to 0 and         //
  2635.             // odd to 1.                              //
  2636.             //                                        //
  2637.             // SET_YYY:[ 0 1 0 1 0 1 0 ]              //
  2638.             // SET_XXX:[ 0 1 0 1 0 1 0 ]              //
  2639.             //                                        //
  2640.             // SET_XXX:     [ 0 1 0 1 0 1 0 ]         //
  2641.             //                | | | | | | |           //
  2642.             // SET_YYY:[ 0 ]- 0 1 0 1 0 1 0           //
  2643.             //         [ 1 ]- 1 2 1 2 1 2 1           //
  2644.             //         [ 0 ]- 0 1 0 1 0 1 0           //
  2645.             //         [ 1 ]- 1 2 1 2 1 2 1           //
  2646.             //         [ 0 ]- 0 1 0 1 0 1 0           //
  2647.             //         [ 1 ]- 1 2 1 2 1 2 1           //
  2648.             //         [ 0 ]- 0 1 0 1 0 1 0           //
  2649.             int chk =(  
  2650.                 I32_MOD( // <<<<<<<<<<<<<< SET_003
  2651.                     I32_MOD( T_Y, 2 )   // SET_YYY
  2652.                 +   I32_MOD( T_X, 2 )   // SET_XXX
  2653.                 ,                 2
  2654.                 )
  2655.             );;
  2656.  
  2657.         #########################MODULO_CHECKER_PATTERN#
  2658.         #CONSISTENT_VOXEL_COORDS########################
  2659.  
  2660.             The tilemap math for calculating what
  2661.             [voxel/tile] we are inside of is
  2662.             geometrically consistent, even when
  2663.             given NEGATIVE numbers.
  2664.  
  2665.             Meaning: The FIRST PIXELS of any
  2666.                      [tile/voxel] are in the same
  2667.                      relative position.
  2668.  
  2669.             +-+-----+-+-----+-+-----+-+-----+
  2670.             | | -1  | |  0  | |  +1 | |  +2 |
  2671.             | |     | |     | |     | |     |
  2672.             | +-----| +-----| +-----| +-----+
  2673.             +-------+-------+-------+-------+
  2674.  
  2675.             +-+
  2676.             | |   <--- The first edge of pixels for
  2677.             | |        [voxel/tile] seen on the X/Y
  2678.             | +-----|  axis.
  2679.             +-------+
  2680.         ########################CONSISTENT_VOXEL_COORDS#
  2681.         #NEXT_VOXEL_BOUNDING_VOLUME#####################
  2682.  
  2683.             Assuming vectors are moving in a positive
  2684.             direction, the intersection point to
  2685.             next voxel MUST be within the bounds of
  2686.             the CURRENT VOXEL + One Pixel All Around.
  2687.  
  2688.             Because we know the DIRECTION of the
  2689.             ray vector, we don't need a bounding volume
  2690.             and can just check that the respective
  2691.             X,Y,Z bounding planes have
  2692.             not been exceeded.
  2693.  
  2694.             +--------------------+--------------------+
  2695.             |                    |                    |
  2696.             |   +- - -  - - -+   |   +- - -  - - -+   |
  2697.             |   |            |   |   |            |   |
  2698.             |                    |                    |
  2699.             |   |            |   |   |            |   |
  2700.             |                    |                    |
  2701.             |   |            |   |   |            |   |
  2702.             |   +- - -  - - -+   |   +- - -  - - -+   |
  2703.          111111111111111111111111111                  |
  2704.          1  +--------------------+-1------------------+
  2705.          1  |                    | 1                  |
  2706.          1  |   +- - -  - - -+   | 1 +- - -  - - -+   |
  2707.          1  |   |            |   | 1 |            |   |
  2708.          1  |                    | 1                  |
  2709.          1  |   |     CV     |   | 1 |            |   |
  2710.          1  |     (CurVoxel)     | 1                  |
  2711.          1  |   |            |   | 1 |            |   |
  2712.          1  |   +- - -  - - -+   | 1 +- - -  - - -+   |
  2713.          1  |                    | 1                  |
  2714.          1  +--------------------+-1------------------+
  2715.          111111111111111111111111111
  2716.  
  2717.         #####################NEXT_VOXEL_BOUNDING_VOLUME#
  2718.         #VOX_MAR_ABOUT##################################
  2719.  
  2720.             VOX_MAR: ( VOXel_MARch )
  2721.  
  2722.                     Holds information about ray
  2723.                     marching WITHIN a single voxel.
  2724.  
  2725.             REFACTORED[ VOX_MAR ]TO[ PIX_000 ]
  2726.             Because we need to do the analogous
  2727.             of what we did when marching into
  2728.             voxel space using VOX_000, just this
  2729.             time marching into pixel space and
  2730.             filling PIX_000 struct.
  2731.  
  2732.         ##################################VOX_MAR_ABOUT#
  2733.         #DISTANCE_IS_NOT_CUMULATIVE#####################
  2734.  
  2735.             WRONG: xyz =  rwC + ( rwN * D_N );
  2736.             RIGHT: xyz =  xyz + ( rwN * D_N );
  2737.  
  2738.             The distance is NOT cumulative. Our ray
  2739.             marching is not anchored to the original
  2740.             ray world coordinate ( rwC ).
  2741.  
  2742.             Reason:
  2743.                 Collision with the first pixel of
  2744.                 the next voxel is PIXEL PERFECT and
  2745.                 if[  D_N  ]were a cumulative distance
  2746.                 over multiple iterations we would
  2747.                 probably see weird artifacts as slight
  2748.                 rounding errors compound.
  2749.  
  2750.                 Thus do NOT anchor to[  rwC  ]but
  2751.                 rather make a new origin location at
  2752.                 [  xyz  ]each loop iteration.
  2753.    
  2754.                 Think: Folds in orgami.
  2755.    
  2756.         #####################DISTANCE_IS_NOT_CUMULATIVE#
  2757.         #DIST_NEXT_NEVER_ZERO###########################
  2758.  
  2759.             Even if you are 1 pixel away from the next
  2760.             voxel, the distance to the next voxel should
  2761.             NEVER be zero. It should always be a
  2762.             POSITIVE NON-ZERO value.
  2763.    
  2764.             If this is NOT the case, your point-normal
  2765.             form ray marching will fail.
  2766.  
  2767.         ###########################DIST_NEXT_NEVER_ZERO#
  2768.         #TRAP_VALUE_MUST_BE_NEG_666#####################
  2769.  
  2770.             Using ( 0.0 - 666.0 ) as a trap value
  2771.             in our code that determines the distance
  2772.             to the next voxel. If you detect (-666.0)
  2773.             in your ray march loop, it means that
  2774.             the distance to the next voxel was never
  2775.             set. Distance to next voxel should ALWAYS
  2776.             be NON-ZERO and POSITIVE.
  2777.  
  2778.         #####################TRAP_VALUE_MUST_BE_NEG_666#
  2779.         #PIXEL_PROBABILITY_CLOUD########################
  2780.  
  2781.             [TODO](MAYBE)
  2782.  
  2783.             We should probably have 1 pixel equal to
  2784.             3 native frag coords. That way if you
  2785.             are in the CENTER of the pixel, you know
  2786.             you don't need to alias. But if you are
  2787.             on one of the boarder edges, you know
  2788.             you need to use some aliasing.
  2789.  
  2790.                [ONE FRAG COORD]
  2791.                      _|_
  2792.                     /   \
  2793.                     +   +     X: CENTER, no aliasing
  2794.                     |   |        required.
  2795.                     V   V
  2796.             +---+---+---+ <--+
  2797.             |   |   |   |     \
  2798.             +---+---+---+      \
  2799.             |   | X |   |       +--[ ONE PIXEL ]
  2800.             +---+---+---+      /
  2801.             |   |   |   |     /
  2802.             +---+---+---+ <--+
  2803.  
  2804.         ########################PIXEL_PROBABILITY_CLOUD#
  2805.         #VOXEL_EDGE_COLOR###############################
  2806.                
  2807.             When percent(per) is zero the edges are    
  2808.             BLACK and blend with background. That is      
  2809.             not very useful for debugging, so lets
  2810.             give the  edges a useful color coding to    
  2811.             identify which planes of the voxel are  
  2812.             intersecting at that edge.    
  2813.  
  2814.  
  2815.             +--.--+--.--+
  2816.             1\     \     \     [X]: X_Plane: RED
  2817.             1 \  --[Z]--  \    [Y]: Y_PLANE: GREEN
  2818.             1  \     \     \   [Z]: Z_PLANE: BLUE
  2819.             1   +--.--+--.--+
  2820.             1[X]2           3   1: Edge 1, YELLOW (R+G)
  2821.             +   2           3   2: Edge 2, YELLOW (R+G)
  2822.              \  2    [Y]    3   3: Edge 3, YELLOW (R+G)
  2823.               \ 2           3
  2824.                \2           3
  2825.                 +--.--+--.--+
  2826.  
  2827.             +--.--+--.--+       4: Edge 4, MAGENTA (R+B)
  2828.             |4     \     \      5: Edge 5, CYAN    (G+B)
  2829.             | 4  --[Z]--  \     6: Edge 6, YELLOW  (R+G)
  2830.             |  4     \     \
  2831.             |   +55555555555+
  2832.             |[X]6           |  (Edge #'s Are Arbitrary)
  2833.             +   6           |  (and do NOT reflect    )
  2834.              \  6    [Y]    |  (values in our code.   )
  2835.               \ 6           |
  2836.                \6           |  (Aritrary as in for    )
  2837.                 +--.--+--.--+  (illustrative purposes.)
  2838.  
  2839.         ###############################VOXEL_EDGE_COLOR#
  2840.         #NO_ELSE_FOR_EDGE_COLORING######################
  2841.  
  2842.             Statement for calculating edge colors
  2843.             should NOT have "else" or "if else"
  2844.             because 2 planes intersect at edges
  2845.             and 3 planes intersect at vertex.
  2846.  
  2847.             THUS: EDGES : 2ndary(secondary) colors.(CMY)
  2848.                   VERTEX: WHITE (R+G+B)
  2849.  
  2850.         ######################NO_ELSE_FOR_EDGE_COLORING#
  2851.         #STRATA_OF_2D_TILEMAPS##########################
  2852.  
  2853.             We abstract the 3D tilemap (voxelmap) data
  2854.             as a series of 2-dimensional tile maps
  2855.             that are stacked on top of each other.
  2856.  
  2857.             Because positive Z moves DOWN INTO THE
  2858.             MONITOR, larger Z-layers go further
  2859.             back into the screen.
  2860.  
  2861.  
  2862.             U32  
  2863.             VAT[ NTX * NTY * NTZ ]= U32[ 8 * 4 * 7 ](  
  2864.  
  2865.             //: Z == 0 === First 2D TileMap
  2866.  
  2867.             //: 1 2 3 4 5 6 7 8        --- -------------
  2868.                 _,_,_,_,_,_,_,_, //: 1  |        ^
  2869.                 _,_,_,_,_,_,_,_, //: 2  | Z == 0 |
  2870.                 _,_,_,_,_,_,_,_, //: 3  |        |
  2871.                 _,_,_,_,_,_,_,_, //: 4  |        |
  2872.             //:                        ---       |
  2873.             //: 1 2 3 4 5 6 7 8        ---       |
  2874.                 _,_,_,_,_,_,_,_, //: 1  | TILEMAP_STRATA
  2875.                 _,_,_,_,_,_,_,_, //: 2  |        |
  2876.                 _,_,_,_,_,_,_,_, //: 3  | Z == 1 |
  2877.                 _,_,_,_,_,_,_,_, //: 4  |        |
  2878.             //:                        ---       |
  2879.             //: 1 2 3 4 5 6 7 8        ---       |
  2880.                 _,_,_,_,_,R,_,_, //: 1  |        |
  2881.                 _,_,_,_,Y,_,_,_, //: 2  | Z == 2 |
  2882.                 _,_,_,M,_,_,_,_, //: 3  |        |
  2883.                 _,_,C,_,_,_,_,_, //: 4  |        V
  2884.             //:                        --- -------------
  2885.  
  2886.             );
  2887.  
  2888.             //: Z == 2 === First 2D TileMap
  2889.  
  2890.         ##########################STRATA_OF_2D_TILEMAPS#
  2891.         #BACK_SLASH_COMMENT_FUCKERY#####################
  2892.  
  2893.             The use of "\" in a comment line seems
  2894.             to be erroneously interpreted as a newline.
  2895.  
  2896.             Example: Below wil NOT compile, even
  2897.                      though it is syntactically correct.
  2898.  
  2899.             U32  
  2900.             VAT[ NTX * NTY * NTZ ]= U32[ 8 * 4 * 1 ](  
  2901.  
  2902.             //: 1 2 3 4 5 6 7 8        
  2903.                 _,_,_,_,_,_,_,_, //: 1 \
  2904.                 _,_,_,_,_,_,_,_, //: 2  \__ Z == 0
  2905.                 _,_,_,_,_,_,_,_, //: 3  /
  2906.                 _,_,_,_,_,_,_,_, //: 4 /  
  2907.  
  2908.             );
  2909.  
  2910.         #####################BACK_SLASH_COMMENT_FUCKERY#
  2911.         #MINUS_EPSILON##################################
  2912.  
  2913.                       NEG           POS
  2914.                        |             |
  2915.                        V             V
  2916.                        |             |
  2917.                    +---+             +---+
  2918.                    |_n_|             |_p_|
  2919.            +-----------++-----------++-----------+
  2920.            |   |   |   ||   |   |   ||   |   |   |
  2921.            |---+---+---||---+---+---||---+---+---|
  2922.            |   |-1 |   ||   | 0 |   ||   |+1 |   |
  2923.            |---+---+---||---+---+---||---+---+---|
  2924.            |   |   |   ||   |   |   ||   |   |   |
  2925.            +-----------++-----------++-----------+
  2926.                    |_n_|             |_p_|
  2927.                    +---+             +---+
  2928.                        |             |
  2929.                        ^             ^
  2930.                        |             |
  2931.                       NEG           POS
  2932.  
  2933.             We wanted to do the math so tha the bounds
  2934.             of the voxel were measured in our plank
  2935.             unit of 1-pixel. But that doesn't work.
  2936.  
  2937.             BAD__BOUNDS: _n_ & _p_
  2938.             GOOD_BOUNDS: NEG & POS
  2939.  
  2940.             The POSITIVE bounds work by co-incidence
  2941.             when thinking of pixels as discrete
  2942.             units without thickness because....
  2943.    
  2944.               0.0 <-- POS == _p_
  2945.                 |
  2946.                 +---|||---+
  2947.                 |         |
  2948.                 |    0    |  
  2949.                 |  (_p_)  |
  2950.                 +---|||---+
  2951.                           |
  2952.                         1.0
  2953.  
  2954.             However, with the NEGATIVE bounds,
  2955.             the discrete math does not co-incidentially
  2956.             line up like this.
  2957.  
  2958.                 0.0
  2959.                 |
  2960.                 +---|||---+
  2961.                 |         |
  2962.                 |    0    |  
  2963.                 |  (_n_)  |
  2964.                 +---|||---+
  2965.                           |
  2966.                         1.0 <-- NEG != _n_
  2967.  
  2968.             So, while we would like to keep all of
  2969.             our reasoning to conceptual pixels that
  2970.             have no thickness and do this:
  2971.             ( B == boudary where NEXT voxel is )
  2972.  
  2973.             +---+---+---+---+---+  <---+
  2974.             | B | B | B | B | B |      |
  2975.             +---+===========+---+      |
  2976.             | B |   |   |   | B |      |
  2977.             +---|- -+- -+- -|---+      |
  2978.             | B |   | 0 |   | B |      +---[WRONG]
  2979.             +---|- -+- -+- -|---+      |
  2980.             | B |   |   |   | B |      |
  2981.             +---+===========+---+      |
  2982.             | B | B | B | B | B |      |
  2983.             +---+---+---+---+---+  <---+
  2984.  
  2985.             It is actually more like this:
  2986.  
  2987.                 +--BUT__HERE--+
  2988.                 |             |
  2989.                 |+--NOTHERE--+|
  2990.                 ||           ||
  2991.                 VV           VV
  2992.             +---||---+---+---||---+
  2993.             | B || B | B | B || B |
  2994.             ----++-----------++---- <-- BUT_HERE
  2995.             ----++-----------++---- <-- NOT_HERE
  2996.             | B ||   |   |   || B |
  2997.             +---||---+---+---||---+
  2998.             | B ||   | 0 |   || B |
  2999.             +---||---+---+---||---+
  3000.             | B ||   |   |   || B |
  3001.             ----++-----------++---- <-- NOT_HERE
  3002.             ----++-----------++---- <-- BUT_HERE
  3003.             | B || B | B | B || B |
  3004.             +---||---+---+---||---+
  3005.  
  3006.  
  3007.             In other news, a perfect 45 degree angle
  3008.             from the center of one voxel is NOT
  3009.             an edge case. Because the math for that
  3010.             only computes the distance to the next
  3011.             voxel, not the VALUES(PLURAL) of the
  3012.             next voxel. ( VALUES == VOX_000 instance )
  3013.  
  3014.                             +===========+
  3015.                             | B | B | B |
  3016.                             |---+---+---|
  3017.                             | B |V_2| B |
  3018.             +---+---+---+---|---/---+---|
  3019.             | B | B | B | B | / | B | B |
  3020.             +---+===========/===========+
  3021.             | B |         / | B |
  3022.             +---|       /   |---+
  3023.             | B |    V_1    | B |
  3024.             +---|           |---+
  3025.             | B |           | B |
  3026.             +---+===========+---+
  3027.             | B | B | B | B | B |
  3028.             +---+---+---+---+---+
  3029.             #DIAGONAL_IS_NOT_AN_EDGE_CASE#
  3030.             ( V_1 to V_2 works fine)
  3031.             ( V_1 == voxel #1      )
  3032.             ( V_2 == voxel #2      )
  3033.  
  3034.         ##################################MINUS_EPSILON#
  3035.         #ITBIDKW########################################
  3036.  
  3037.             ITBIDKW: It works, but I don't know why.
  3038.  
  3039.             1. EPS_X,EPS_Y,EPS_Z, exactly 0.0001
  3040.                No smaller, no larger. No fucking clue
  3041.                why this magic number works.
  3042.  
  3043.         ########################################ITBIDKW#
  3044.         #CASH_IN_INDEXES_AT_LAST_MOMENT#################
  3045.  
  3046.             NOT:til_val_AND_pix_d3d_CTO_u32_bit
  3047.             YES:til_d3d_AND_pix_d3d_CTO_u32_bit
  3048.            
  3049.             Why? Because we cannot afford to
  3050.             discard LOCATION information at any
  3051.             level of nesting if we want the most
  3052.             sophisticated levels of nested auto-tiling.
  3053.             (NestedAutoTiling~=~FractalAutoTiling)
  3054.  
  3055.             For example: If we want a PIXEL within
  3056.                          a voxel to intelligently
  3057.                          auto-tile OUTSIDE of it's
  3058.                          voxel with a pixel of an
  3059.                          adjacent voxel, we need
  3060.                          BOTH[ pix_d3d ]AND[ til_d3d ]
  3061.  
  3062.             |<-- CURRENT ---->|<-- NEXT_VOXEL-->|
  3063.             |<-- 3x3 voxel -->|<-- 3x3 voxel -->|
  3064.             +-----+-----+-----+-----+-----+-----+
  3065.             |                 |                 |
  3066.             |                 |                 |
  3067.             +     +-----+-----+-----+-----+     +
  3068.             |     | AYE | BEE | CEE | DEE |     |
  3069.             |     | --- | --- | --- | --- |     |
  3070.             +     +-----+-----+-----+-----+     +
  3071.             |                 |                 |
  3072.             |                 |                 |
  3073.             +-----+-----+-----+-----+-----+-----+
  3074.  
  3075.             AYE & BEE can auto tile with each other
  3076.             by just knowing what[ til_val/vox_val ]
  3077.             they are inside of.
  3078.  
  3079.             CEE & DEE can auto tile with each other
  3080.             by just knowing what[ til_val/vox_val ]
  3081.             they are inside of.
  3082.  
  3083.             Voxel Value May Determine:
  3084.  
  3085.             1. Pixel Material Type
  3086.             2. Pixel Auto Tile Set
  3087.             3. Pixel Pallet Key
  3088.             4. Pixel Topology Within Voxel
  3089.             5. ETC.
  3090.             (Some #'s may be synonymous)
  3091.  
  3092.             BEE & CEE CANNOT AUTO TILE WITH EACH
  3093.             OTHER WITH ONLY[ til_val ]AND[ pix_d3d ]!!!
  3094.  
  3095.             REASON:
  3096.                 Tile value (til_val/vox_val)
  3097.                 can determine the material properties
  3098.                 of the pixels contained within it.
  3099.  
  3100.                 If we only have [til_val]AND[pix_d3d]
  3101.                 we can figure out CEE's location
  3102.                 by using BEE's location, but we cannot
  3103.                 figure out CEE's MATERIAL_TYPE.
  3104.  
  3105.                 Without knowing CEE's MATERIAL_TYPE
  3106.                 we cannot know if [ BEE ]AND[ CEE ]
  3107.                 should fuse with each other due to
  3108.                 using identical AUTO_TILE_SETS.
  3109.                        
  3110.         #################CASH_IN_INDEXES_AT_LAST_MOMENT#
  3111.         #STACK_ADDRESS_WORKINGS#########################
  3112.         /////// stack_pointer === stack_context ////////
  3113.  
  3114.             von: VOlume_N (N == Nesting_Level)
  3115.                 ( Choose name based on origins of )
  3116.                 ( the word "voxel" from wikipedia )
  3117.  
  3118.             KEY: (For Illustrative Purpose)
  3119.  
  3120.                 sta_add[ 0 ] ===> GALAXY    (von_000)
  3121.                 sta_add[ 1 ] ===> PLANET    (von_001)
  3122.                 sta_add[ 2 ] ===> CONTINENT (von_002)
  3123.                 sta_add[ 3 ] ===> STATE     (von_003)
  3124.                 sta_add[ 4 ] ===> CITY      (von_004)
  3125.  
  3126.                 I32 sta_add[ 5 ]=I32[ 5 ](
  3127.    
  3128.                     ENUM_VALUE_milky_way
  3129.                 ,   ENUM_VALUE_earth
  3130.                 ,   ENUM_VALUE_north_america
  3131.                 ,   ENUM_VALUE_michigan
  3132.                 ,   ENUM_VALUE_ann_arbor
  3133.    
  3134.                 )
  3135.  
  3136.                 VON
  3137.                 GET_von_USE_xyz_rwN_sta_add_sta_con(
  3138.                     V_3     xyz
  3139.                 ,   V_3         rwN
  3140.                 ,   V_3             sta_add[5]
  3141.                 ,   V_3                     sta_con
  3142.                 ){
  3143.  
  3144.                     HERE:
  3145.                     Traverse nested data structure
  3146.                     using[ sta_add  ]AND[ sta_con ]
  3147.                     and return generic[ VON ] struct
  3148.                     that could represent.
  3149.  
  3150.                         1. Voxel (von_000)
  3151.                         2. Pixel (von_001)
  3152.                         3. Something nested deeper.
  3153.                         4. Something nested even deeper.
  3154.                         5. And deeper, etc. (von_###)
  3155.  
  3156.                     return( von );
  3157.                 };;
  3158.  
  3159.                 struct VON{
  3160.  
  3161.                 //:     von_d3d===[til_d3d,pix_d3d,etc]
  3162.                     I32 von_d3d;  
  3163.  
  3164.                 };
  3165.  
  3166.  
  3167.         #########################STACK_ADDRESS_WORKINGS#
  3168.         #LOOPTICK_FUNCTION##############################
  3169.  
  3170.             A "loop tick" function is a function that
  3171.             serves as the body of a loop.
  3172.  
  3173.             I usually use loop tick functions to
  3174.             abstract loop bodies with callbacks.
  3175.    
  3176.             But, in the case of THIS GLSL SHADER,
  3177.             looptick functions are for reducing
  3178.             visual clutter and making the code easier
  3179.             to follow.
  3180.  
  3181.             The main benifit of a looptick function is
  3182.             being able to RESET OUR INDENTATION.
  3183.  
  3184.             Which, might not be wise since we are
  3185.             adding more load (function call with
  3186.             many arguments) , however, readability
  3187.             comes first, optimizations come very last.
  3188.  
  3189.         ##############################LOOPTICK_FUNCTION#
  3190.         #INTO_THE_BLACK_VOID############################
  3191.  
  3192.             The further the ray goes into  
  3193.             the void of space, the darker  
  3194.             the pixel. Just to give us    
  3195.             some useful feedback.      
  3196.        
  3197.         ############################INTO_THE_BLACK_VOID#
  3198.         #BREAK##########################################
  3199.  
  3200.             If you see #BREAK# it is probably near
  3201.             a "return" statement that was once
  3202.             a "break" before the loop body code was
  3203.             extracted into it's own function.
  3204.  
  3205.         ##########################################BREAK#
  3206.  
  3207.  
  3208.  
  3209. *** ************************************************ **/
  3210. //:====================================:DOCUMENTATION://
  3211. //:UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU://
  3212. /** U : Undefine Macros Section **/
  3213.  
  3214.     #undef  V_4  
  3215.     #undef  V_3  
  3216.     #undef  V_2  
  3217.     #undef  F32  
  3218.     #undef  I32  
  3219.     #undef  U32  
  3220.  
  3221. /** U : Undefine Macros Section **/
  3222. //:UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU://
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement