Advertisement
DEKTEN

SDF_008

Nov 24th, 2020 (edited)
610
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /** ******************************************** ***
  2.  
  3.     EASY_SOURCE_CODE_LINK:    tinyurl.com/SDF-008
  4.     DIRECT_LINK_TO_SOURCE:  pastebin.com/8nrpsrfY
  5.  
  6.     About: Voxel Rendering For Patent Drawings.
  7.            SDF_008 will only get to figuring out
  8.            how to render voxel bounds, but not
  9.            any voxel details.
  10.  
  11. *** ******************************************** **/
  12.  
  13. #define V_4  vec4
  14. #define V_3  vec3
  15. #define V_2  vec2
  16. #define F32 float
  17. #define I32   int
  18.  
  19. //:DEBUGGING:====================================://
  20.  
  21.     /** Nothing here yet **/
  22.  
  23. //:====================================:DEBUGGING://
  24. //:CONFIGURATION:================================://
  25.  
  26.     /** SLICE_RENDER_USING_CAMERA_PLANE **/
  27.     int CFG_SLICE_RENDER=( 1 );
  28.  
  29. //:================================:CONFIGURATION://
  30. //:RAYMARCHING_AND_VOXEL_CONSTANTS:==============://
  31.  
  32.     //:These defines are for ray marching when using
  33.     //:fragment coordinates as our coordinate space.
  34.     #define MAX_STE 1000   //:Max Step
  35.     #define MIN_DIS 0.02   //:Min Dist (SurfaceDist)
  36.     #define MAX_DIS 1000.0 //:Max Dist
  37.  
  38.     //:Number of tiles on each axis:
  39.     #define NTX  8  //:Num_Tiles (   in_voxel_map )
  40.     #define NTY  4  //:Num_Tiles (   in_voxel_map )
  41.     #define NTZ  3  //:Num_Tiles (   in_voxel_map )
  42.  
  43.     #define NPX  16 //:Num_Pixels_X( in_a_tile    )
  44.     #define NPY  16 //:Num_Pixels_Y( in_a_tile    )
  45.     #define NPZ  16 //:Num_Pixels_Z( in_a_tile    )
  46.  
  47.     //:Total__number_of__Pixels__in_entire_voxel_map
  48.     #define TPX  ( NTX * NPX ) //: Total_Pixels_X
  49.     #define TPY  ( NTY * NPY ) //: Total_Pixels_Y
  50.     #define TPZ  ( NTZ * NPZ ) //: Total_Pixels_Z
  51.  
  52.     #define _ 0                                          
  53.     #define X 1                                          
  54.     int VAT[ NTX * NTY * NTZ ]=int[ 8 * 4 * 3 ](  
  55.  
  56.     /** TODO: Eventually use an integer texture  **/
  57.     /**       for this tilemap data.             **/
  58.        
  59.     //:Highest Z Cross Section Is First Tile Map
  60.     //: 1 2 3 4 5 6 7 8        --- -----------------
  61.         X,X,X,X,X,X,X,X, //: 1  |             ^
  62.         X,_,_,_,_,_,_,X, //: 2  | Z == 0      |
  63.         X,_,_,_,_,_,_,X, //: 3  |             |
  64.         X,X,X,X,X,X,X,X, //: 4  |             |
  65.     //:                        ---            |
  66.     //: 1 2 3 4 5 6 7 8        ---   Cross Sections
  67.         X,_,_,_,_,_,_,X, //: 1  |    Can be thought
  68.         _,_,_,_,_,_,_,_, //: 2  |    of as differ-
  69.         _,_,_,_,_,_,_,_, //: 3  |    -ent 2D
  70.         X,_,_,_,_,_,_,X, //: 4  |    tilemaps.
  71.     //:                        ---            |
  72.     //: 1 2 3 4 5 6 7 8        ---            |
  73.         X,_,_,_,_,_,_,X, //: 1  |             |
  74.         X,_,_,_,_,_,_,X, //: 2  | Z == 2      |
  75.         X,_,_,_,_,_,_,X, //: 3  |             |
  76.         X,_,_,_,_,_,_,X  //: 4  |             V
  77.     //:                        --- -----------------
  78.     );                                                
  79.     #undef  _                                            
  80.     #undef  X  
  81.  
  82. //:==============:RAYMARCHING_AND_VOXEL_CONSTANTS://
  83. //:STRUCTS:======================================://
  84.  
  85.     //:RWC_AND_RWN:------------------------------://
  86.  
  87.         struct RWC_AND_RWN{
  88.             V_3 rwC;
  89.             V_3 rwN;
  90.         };
  91.    
  92.     //:------------------------------:RWC_AND_RWN://
  93.     //:DIS_AND_VOX:------------------------------://
  94.  
  95.         /** Current Voxel Information **/
  96.         struct VOX_CUR{
  97.            uint has;  //: voxel:exists?
  98.             int val;  //: voxel:tile_value
  99.             int dex;  //: voxel:1d_index
  100.             int t_x;  //: voxel:tile_x
  101.             int t_y;  //: voxel:tile_y
  102.             int t_z;  //: voxel:tile_z
  103.         };
  104.  
  105.         /** Distance Information **/
  106.         struct VOX_DIS{
  107.             F32 nex; //:Distance_To_Next
  108.         //  F32 d_S; //:Distance_To_Surface
  109.         //           //:Within_Current_Voxel
  110.         };
  111.  
  112.         struct DIS_AND_VOX{
  113.        
  114.             VOX_CUR  vox_cur;
  115.             VOX_DIS  vox_dis;
  116.        
  117.         };
  118.  
  119.     //:------------------------------:DIS_AND_VOX://
  120.  
  121. //:======================================:STRUCTS://
  122. //:NO_HALT_USE_ERROR_PIXEL:======================://
  123. #define _32_ ( 32.0 / 255.0 )
  124. #define _64_ ( 64.0 / 255.0 )
  125. #define _7F_ (128.0 / 255.0 )
  126. #define _FF_ (255.0 / 255.0 )
  127.  
  128.     #define MSG_ERR_001  1
  129.  
  130.     V_4 GET_pix_err(
  131.         int msg_err /** EX: MSG_ERR_001 **/
  132.     )
  133.     {
  134.  
  135.         /** table of error "messages" **/
  136.         V_4 tab[10]=V_4[10](
  137.    
  138.             //:0: Invalid Error Code
  139.             V_4( iTime,cos(iTime),sin(iTime) ,1.0)
  140.            
  141.            ,V_4( _32_,_32_,_32_,_FF_ )
  142.            ,V_4( _32_,_32_,_32_,_FF_ )
  143.            ,V_4( _32_,_32_,_32_,_FF_ )
  144.  
  145.            ,V_4( _64_,_64_,_64_,_FF_ )
  146.            ,V_4( _64_,_64_,_64_,_FF_ )
  147.            ,V_4( _64_,_64_,_64_,_FF_ )
  148.  
  149.            ,V_4( _7F_,_7F_,_7F_,_FF_ )
  150.            ,V_4( _7F_,_7F_,_7F_,_FF_ )
  151.            ,V_4( _7F_,_7F_,_7F_,_FF_ )
  152.         );;
  153.  
  154.         //:Make error pixels strobe
  155.         V_4 pix_err =( tab[ msg_err ] );
  156.         if( mod(iTime,6.0) == 0.0 ){
  157.             pix_err = V_4( 0 );
  158.         };;
  159.            
  160.         return( pix_err );
  161.        
  162.     }
  163.  
  164. #undef  _32_  
  165. #undef  _64_  
  166. #undef  _7F_  
  167. #undef  _FF_  
  168. //:======================:NO_HALT_USE_ERROR_PIXEL://
  169.  
  170.  
  171. V_2 f_c_CTO_f_p( V_2 f_c ){
  172. V_2         f_p;
  173.     f_p = f_c / ( iResolution.xy - 1.0 );
  174.     return(  f_p );
  175. }
  176.  
  177. V_3 sdf_i3d(
  178. /**/V_3 _1_
  179. ,   V_3 _2_
  180. ,   F32 f_p
  181. ){
  182.     return( _1_ + ( ( _2_ - _1_ )*f_p ) );
  183. }
  184.  
  185.         RWC_AND_RWN
  186. f_p_CTO_rwC_AND_rwN(
  187.     V_2 f_p /** 2 dimensional percentage **/
  188. )
  189. {
  190.  
  191.     V_3 rwC;
  192.     V_3 rwN;
  193.  
  194.     //: Polygon in 3d space to serve as the
  195.     //: phosphor surface the CRT monitor electrons
  196.     //: will be projected onto.
  197.     //: Could probably use a mat4 for this.
  198.     float H = float( 0 - 9 );; //:Cam Height Pos
  199.     float X = iResolution.x - 1.0;
  200.     float Y = iResolution.y - 1.0;
  201.                               //:     A_B
  202.     V_3 _A_ = V_3( 0,0, H );  //: A----|--------B
  203.     V_3 _B_ = V_3( X,0, H );  //: |    |        |
  204.                               //: |   rwC       |
  205.     V_3 _C_ = V_3( 0,Y, H );  //: |    |        |
  206.     V_3 _D_ = V_3( X,Y, H );  //: C----|--------D
  207.                               //:     C_D
  208.  
  209.     V_3 A_B = sdf_i3d( _A_ , _B_ , f_p.x );
  210.     V_3 C_D = sdf_i3d( _C_ , _D_ , f_p.x );
  211.         rwC = sdf_i3d( A_B , C_D , f_p.y );
  212.  
  213.         //:Positive Z is further back into screen.
  214.         //:This way to help normalize voxel grid
  215.         //:math.
  216.         rwN = normalize( V_3( 0 , 0 , 1 ) );
  217.  
  218.             RWC_AND_RWN
  219.             rwC_AND_rwN;
  220.             rwC_AND_rwN.rwC = rwC;
  221.             rwC_AND_rwN.rwN = rwN;
  222.     return( rwC_AND_rwN );
  223. }
  224.  
  225.  
  226. //:FIRST_VOXEL_QUERY_NEEDED:=====================://
  227.  
  228.     #define T_X dis_and_vox.vox_cur.t_x
  229.     #define T_Y dis_and_vox.vox_cur.t_y
  230.     #define T_Z dis_and_vox.vox_cur.t_z
  231.  
  232.     /** rwN used to find distance to NEXT voxel. **/
  233.         DIS_AND_VOX
  234.     GET_dis_and_vox_USE_xyz_rwN(
  235.                     V_3 xyz
  236.                 ,   V_3     rwN
  237.     )
  238.     {
  239.  
  240.         DIS_AND_VOX dis_and_vox;
  241.  
  242.         //:CURRENT_VOXEL_CELL:-------------------://
  243.  
  244.         dis_and_vox.vox_cur.val = int( 0 - 1 );
  245.         T_X = ( int(floor( xyz.x / float( NPX ))));
  246.         T_Y = ( int(floor( xyz.y / float( NPY ))));
  247.         T_Z = ( int(floor( xyz.z / float( NPZ ))));
  248.  
  249.         //:-------------------:CURRENT_VOXEL_CELL://
  250.         //:GET_VOXEL_CELL_VALUE:-----------------://
  251.  
  252.         /** Voxel Volume Is Hard Coded To have   **/
  253.         /** voxel__tile[0,0,0] stuck at world    **/
  254.         /** world_coord[0,0,0]                   **/
  255.         if( T_X >= 0 && T_X < NTX
  256.         &&  T_Y >= 0 && T_Y < NTY
  257.         &&  T_Z >= 0 && T_Z < NTZ
  258.         ){
  259.  
  260.             //: Index2D -and- Index3D
  261.             int D2D = T_X + ( NTX    *    T_Y );
  262.             int D3D = D2D + ( NTX * NTY * T_Z );
  263.  
  264.             dis_and_vox.vox_cur.dex=(      D3D   );
  265.             dis_and_vox.vox_cur.val=( VAT[ D3D ] );
  266.  
  267.             /** NOTE: Voxel value 0 will NOT get **/
  268.             /**       special treatment. It could**/
  269.             /**       contain geometry if we     **/
  270.             /**       really wanted it to.       **/
  271.             dis_and_vox.vox_cur.has=uint(  1  );
  272.            
  273.         }else{
  274.             /** Using a "has" flag so we         **/
  275.             /** can keep more logic UNSIGNED.    **/
  276.             /** (No need for negative value to ) **/
  277.             /** (be used for invalid dex or val) **/
  278.             dis_and_vox.vox_cur.dex= int(  0  );
  279.             dis_and_vox.vox_cur.val= int(  0  );
  280.             dis_and_vox.vox_cur.has=uint(  0  );
  281.         };;
  282.         //:-----------------:GET_VOXEL_CELL_VALUE://
  283.  
  284.  
  285.         //:TODO: Figure out distance to the NEXT voxel.
  286.  
  287.      
  288.         return( dis_and_vox );
  289.     }
  290.     #undef  T_X
  291.     #undef  T_Y
  292.     #undef  T_Z
  293. //:=====================:FIRST_VOXEL_QUERY_NEEDED://
  294. //:INTEGER_MODULO:===============================://
  295.  
  296. #ifndef I32
  297. #define I32 int
  298. #endif
  299.  
  300.     I32
  301.     i32_mod(
  302.     /**/I32 a /** ALL     **/
  303.     ,   I32 d /** DIVISOR **/
  304.     ){
  305.        
  306.         #ifndef F32
  307.         #define F32 float
  308.         #endif
  309.  
  310.         F32 A = F32( a );
  311.         F32 D = F32( d );
  312.  
  313.         //: WARD:Wholepart,All,Remainder,Divisor
  314.         int W = int(  trunc( A / (          D  )) );
  315.         int R = int(         A - ( F32(W) * D  )  );
  316.  
  317.         return( R );
  318.     }
  319. //:===============================:INTEGER_MODULO://
  320. //:RENDER_SCENE:=================================://
  321. #define T_X dis_and_vox.vox_cur.t_x
  322. #define T_Y dis_and_vox.vox_cur.t_y
  323. #define T_Z dis_and_vox.vox_cur.t_z
  324. #define HAS dis_and_vox.vox_cur.has
  325.  
  326.     V_4 sdf_RenderScene( RWC_AND_RWN rwC_AND_rwN )
  327.     {
  328.         V_4 c4d = V_4(0,1,0.5,1);
  329.  
  330.         V_3 rwN = rwC_AND_rwN.rwN;
  331.         V_3 rwC = rwC_AND_rwN.rwC;
  332.  
  333.         V_3 xyz = rwC;
  334.      
  335.         DIS_AND_VOX
  336.         dis_and_vox;
  337.  
  338.         //:nex: Distance To NEXT voxel.
  339.         //:d_S: Distance To Surface Geometry inside
  340.         //:     the current voxel. In world coords.
  341.         dis_and_vox.vox_dis.nex =( 0.0 );  
  342.     //: dis_and_vox.vox_dis.d_S =( 0.0 );  
  343.  
  344.         //:Voxels will be thought of as 3D tiles:
  345.         dis_and_vox.vox_cur.has = uint( 0 );
  346.         dis_and_vox.vox_cur.dex =  int( 0 );
  347.         dis_and_vox.vox_cur.t_x =  int( 0 );
  348.         dis_and_vox.vox_cur.t_y =  int( 0 );
  349.         dis_and_vox.vox_cur.t_z =  int( 0 );
  350.  
  351.         //:RAY_MARCH_LOOP:-----------------------://
  352.         /** #ABOUT_RAY_MARCH_LOOP# **/
  353.  
  354.             //:March to VOXEL:
  355.             for( int i = 0; i < MAX_STE ; i++ ){
  356.  
  357.                 //:March by distance to next voxel:
  358.                
  359.                 //:Point_Normal_Form_To_Get:xyz
  360.                 xyz =
  361.                     rwC
  362.                 + ( rwN * dis_and_vox.vox_dis.nex )
  363.                 ;;
  364.            
  365.                     dis_and_vox =
  366.                 GET_dis_and_vox_USE_xyz_rwN(
  367.                                     xyz,rwN );;
  368.  
  369.                 //:If voxel is not empty, ray march
  370.                 //:inside of the voxel.
  371.                 if( dis_and_vox.vox_cur.val > 0 ){
  372.                 for( int v = 0; v < MAX_STE ; v++ ){
  373.  
  374.  
  375.                 };;};;
  376.  
  377.                 /** Don't move the ray anywhere  **/
  378.                 /** We are going to slice into   **/
  379.                 /** whatever voxels the camera   **/
  380.                 /** plane passes through.        **/
  381.                 if( CFG_SLICE_RENDER >= 1 ){
  382.                     break;
  383.                 };;
  384.  
  385.                
  386.  
  387.             };;
  388.  
  389.            
  390.  
  391.         //:-----------------------:RAY_MARCH_LOOP://
  392.  
  393.  
  394.         if( CFG_SLICE_RENDER >= 1 ){
  395.         /** EVEN LAYERS: Checker: RED +YELLOW **/
  396.         /**  ODD LAYERS: Checker: BLUE+CYAN   **/
  397.  
  398.             //:Layer value, 1 or 0
  399.             int lay = i32_mod( T_Z, 2 );
  400.            
  401.             //:Checker pattern value, 1 or 0.
  402.             int chk =(  
  403.                 i32_mod(
  404.                     i32_mod( T_X, 2 )
  405.                 ,   i32_mod( T_Y, 2 )
  406.                 )
  407.             );;
  408.        
  409.             if( lay < 0 || lay > 1
  410.             // ||  chk < 0 || chk > 1
  411.             // ||  HAS > uint(1)
  412.             ){
  413.                 c4d=V_4(1,0,0,1);
  414.             }else{
  415.                 c4d=V_4(0,0,1,1);
  416.             };;
  417.  
  418.             F32 a =( 1.0 ); //:ALPHA
  419.             F32 _ =( 0.0 );
  420.             F32 I =( 1.0 ); //:RGB INTENSITY
  421.             F32 i =( 0.5 );
  422.             F32 g =( 0.1 ); //:DARK-GREY
  423.             F32 G =( 0.4 );
  424.             F32 w =( 0.8 ); //:WHITE-GREY
  425.             F32 W =( 0.9 );
  426.             V_4 tab[8]=V_4[8](
  427.                 //:OUT OF BOUNDS:           //:HAS?
  428.                 V_4(g,_,g,a) , V_4(G,_,G,a) //:LAY
  429.                ,V_4(w,_,w,a) , V_4(W,_,W,a) //:CHK
  430.                
  431.                 //:IN BOUNDS:               //:HAS?
  432.                ,V_4(I,_,_,a) , V_4(I,I,_,a) //:LAY
  433.                ,V_4(_,_,I,a) , V_4(_,I,I,a) //:CHK
  434.             );;
  435.  
  436.            
  437.             I32 pik = (
  438.                (4 * ( HAS >= uint(1) ? 1 : 0 ))
  439.             +  (2 * lay )
  440.             +  (1 * chk )
  441.             );;
  442.            
  443.  
  444.             //:c4d = tab[ pik ];
  445.  
  446.             //:c4d=V_4(0,1,1,1);
  447.         }else{
  448.             //:DEBUG ONLY.
  449.             c4d=V_4(1,1,1,1);
  450.         };;
  451.  
  452.  
  453.        
  454.         return( c4d );
  455.     }
  456.  
  457. #undef  T_X
  458. #undef  T_Y
  459. #undef  T_Z
  460. #undef  HAS
  461. //:=================================:RENDER_SCENE://
  462.  
  463. void mainImage(
  464.     out vec4 fragColor
  465. ,   in  V_2 fragCoord
  466. )
  467. {
  468.        
  469.     #define R_Y iResolution.y
  470.         V_2 f_c = V_2(
  471.         //:( FLIP? )       ( Discrete XY       ) ://
  472.            (  0.0  )   +   ( fragCoord.x - 0.5 )
  473.         ,  (R_Y-1.0)   -   ( fragCoord.y - 0.5 )
  474.         );;
  475.     #undef R_Y  
  476.     V_2 f_p = f_c_CTO_f_p( f_c );
  477.  
  478.  
  479.     //:CAMERA_RAY_FOR_CURRENT_PIXEL:-------------://
  480.  
  481.         /** The coordinate and direction of the  **/
  482.         /** camera ray [rwC,rwN] are closely     **/
  483.         /** related, so return them using the    **/
  484.         /** same function. This will save        **/
  485.         /** processing power when we decide      **/
  486.         /** to create a camera lense that        **/
  487.         /** is a 360 degree cylinder around      **/
  488.         /** an object. (for fun)                 **/
  489.  
  490.         RWC_AND_RWN
  491.         rwC_AND_rwN;
  492.  
  493.         rwC_AND_rwN = f_p_CTO_rwC_AND_rwN( f_p );
  494.  
  495.     //:-------------:CAMERA_RAY_FOR_CURRENT_PIXEL://
  496.  
  497.     fragColor = sdf_RenderScene( rwC_AND_rwN );
  498.  
  499. }
  500.  
  501.  
  502. //:DOCUMENTATION:================================://
  503. /** ******************************************** ***
  504.     Abbreviations:
  505.     f : fragment
  506.     p : percent (Never Position, use C for coord)
  507.     c : coordinate
  508.     r : ray
  509.     n : normal, for directions.
  510.     d : distance. NEVER DIRECTION.( use: n:normal )
  511.    
  512.     Identifiers:
  513.     CTO: Convert_TO
  514.     rwC: RayWorldCoord
  515.     rwN: RayWorldNormal
  516.     f_p: FragPercent
  517.     f_c: FragCoord (With Discrete Pixel Coords)
  518.                 (instead of pixel centers  )
  519.     dad: Distance_And_inDEX
  520.         Index is 1D index of XYZ voxel tile
  521.         coordinate.
  522.     vat: Voxel_Array__of__Tiles
  523.     c4d: Color_4_Dimensional(RGBA)
  524.  
  525.  
  526.     FUNCTIONS:
  527.     f_c_CTO_f_p : FragmentCoord -CTO- FragPercent
  528.     f_c_CTO_per : USE[ f_c_CTO_f_p ]
  529.  
  530.     sdf_i3d     : Interpolate_Two_3D_Points
  531.  
  532.     EXTRACTED_BLOCK_COMMENTS:
  533.  
  534.         #ABOUT_RAY_MARCH_LOOP#######################
  535.  
  536.         Ray marching loop should be able to look    
  537.         at the current voxel coordinate returned    
  538.         and decide to STOP marching if it wants.    
  539.         By stopping immediately without marching    
  540.         at all we can make the camera phosphore    
  541.         surface a slice plane that renders          
  542.         cross sectional views of tilemap data.      
  543.    
  544.         ######################ABOUT_RAY_MARCH_LOOP##
  545.    
  546. *** ******************************************** **/
  547. //:================================:DOCUMENTATION://
  548.  
  549.  
  550. #undef  V_4
  551. #undef  V_3
  552. #undef  V_2
  553. #undef  F32
  554. #undef  I32
  555.  
  556.  
  557.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement