Advertisement
DEKTEN

SDF_006

Nov 13th, 2020 (edited)
625
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /** ******************************************************** ***
  2.     GET THE SOURCE CODE:
  3.  
  4.        HERE :  
  5.  
  6.             https://tinyurl.com/SDF-006
  7.  
  8.     OR HERE :
  9.  
  10.             https://pastebin.com/fnBpxdic
  11.  
  12.  
  13.     REFERENCE_MATERIAL:
  14.         URL_001: http://web.engr.oregonstate.edu/
  15.                  ~mjb/cs519/Handouts/Shaders.2pp.pdf
  16.  
  17. *** ******************************************************** **/
  18. //: -------------------------------------------------------- ://
  19. //: SDF_006: A 3D tilemap using grid collision to            ://
  20. //:          efficiently render the geometry.                ://
  21. //:          Will be using orthographic camera to simplify   ://
  22. //:          the grid collision math.                        ://
  23. //: -------------------------------------------------------- ://
  24.  
  25. #define MAX_STE 1000
  26. #define MIN_DIS 0.02
  27. #define MAX_DIS 1000.0
  28.  
  29. #define NTX 25
  30. #define NTY  7
  31.  
  32. //: - - - - - - - - - - - - - ---- - - - - - - - - - - - - - ://      
  33.  
  34. #define _ 0                                          
  35. #define X 1                                          
  36. int til_arr[ NTX * NTY ]=int[ 25 * 7 ](                
  37. _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,  
  38. _,X,X,_,_,X,X,X,_,X,X,X,_,X,X,X,_,X,X,X,_,_,X,X,_,  
  39. _,X,_,X,_,X,_,_,_,X,_,_,_,_,_,_,_,_,_,_,_,X,_,_,_,  
  40. _,X,_,X,_,X,X,_,_,X,X,X,_,X,X,X,_,X,X,X,_,X,X,_,_,  
  41. _,X,_,X,_,X,_,_,_,X,_,_,_,X,_,X,_,X,_,X,_,X,_,X,_,  
  42. _,X,X,_,_,X,X,X,_,X,_,_,_,X,X,X,_,X,X,X,_,_,X,_,_,  
  43. _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_    
  44. );                                                
  45. #undef  _                                            
  46. #undef  X  
  47.  
  48. //: - - - - - - - - - - - - - ---- - - - - - - - - - - - - - ://                                          
  49.    
  50. float sdf_GetDist( int dex , vec3 pop )
  51. {
  52.     float dgs = 0.0; //:Distance(from)Geometry_Surface
  53.  
  54.     //:TODO: Choose different SDF to render based on
  55.     //:      the value of dex.
  56.  
  57.     float til_wid =   ( iResolution.x /  float( NTX ) );
  58.     float til_hig =   ( iResolution.y /  float( NTY ) );
  59.     float til_dep =   min( til_wid , til_hig );
  60.  
  61.     float c_x = til_wid / 2.0;
  62.     float c_y = til_hig / 2.0;
  63.     float c_z = til_dep / 2.0;
  64.  
  65.     //: Safe radius gauranteed not to exceed the
  66.     //: bounding volume.
  67.     //:   rad = min( c_x , c_y , c_z );
  68.     float rad = min( c_z , min(c_x,c_y) );
  69.  
  70.     int til_val = til_arr[ dex ];
  71.     if( 0 == til_val || 0 != til_val ){
  72.  
  73.         vec4 obj_001 = vec4( c_x , c_y , c_z , rad );
  74.         dgs = length( pop - obj_001.xyz ) - obj_001.w ;
  75.  
  76.     };;
  77.  
  78.     return( dgs );
  79.  
  80. }
  81.  
  82. vec4 sdf_RenderCell( int dex , vec3 L_C , vec3 ray )
  83. {
  84.  
  85.     float til_wid =   ( iResolution.x /  float( NTX ) );
  86.     float til_hig =   ( iResolution.y /  float( NTY ) );
  87.     float til_dep =   min( til_wid , til_hig );
  88.  
  89.     /** Geometry Center Within[ grid/tile ]Cell
  90.     vec3 geo_cen = vec3(
  91.         til_wid/2.0
  92.     ,   til_hig/2.0
  93.     ,   til_dep/2.0
  94.     );;
  95.  
  96.     //:RAY_MARCH_RIGHT_FUCKING_HERE:-------------------------://
  97.  
  98.         /** ************************************************ **/
  99.         /** NOTE: L_C scans over the top of the cell.        **/
  100.         /**       L_C must NOT be fixed at center of the     **/
  101.         /**       the cell for each fragment of the tile     **/
  102.         /**       being rendered.                            **/
  103.         /** ************************************************ **/
  104.  
  105.         float d_C = 0.0 ; //:Distance From Camera
  106.         vec3  pop = L_C;
  107.         float dgs ;;;;;; //:Distance From Geometry Surface
  108.  
  109.         for( int i = 0 ; i <= MAX_STE ; i++ ){
  110.  
  111.             pop = L_C + ( ray * d_C );
  112.             dgs = sdf_GetDist( dex , pop );
  113.            
  114.             if( dgs <= MIN_DIS || d_C >= MAX_DIS ){ break; };
  115.  
  116.             d_C += dgs ;
  117.         };;
  118.  
  119.     //:-------------------------:RAY_MARCH_RIGHT_FUCKING_HERE://
  120.     //:CALCULATE_LIGHT_VALUE:--------------------------------://
  121.  
  122.         //:position_light_in_GLOBAL_space:-------------------://
  123.         #define R_X iResolution.x
  124.         #define R_Y iResolution.y
  125.  
  126.         vec3 glo_l_p =vec3( //:GLObal_Light_Position
  127.             ( R_X / 2.0) +( cos( iTime / 1.0 ) * (R_X/2.0) )
  128.         ,   ( R_Y / 2.0) +(         0.0               )
  129.         ,   til_dep      * 4.0
  130.         );;
  131.  
  132.         vec3 loc_s_n; //:LOCal__Surface_Normal
  133.      //:vec3 glo_s_n; //:GLObal_Surface_Normal. NO_SUCH_THING://
  134.  
  135.         #undef  R_X
  136.         #undef  R_Y
  137.         //:-------------------:position_light_in_GLOBAL_space://
  138.         //:estimate_CELL_LOCAL_surface_normal:---------------://
  139.         #define S sdf_GetDist
  140.         #define E 0.0001
  141.         #define X pop.x
  142.         #define Y pop.y
  143.         #define Z pop.z
  144.         #define D dex
  145.  
  146.             //:loc_s_n: Local  coordinate space surface normal
  147.             //:glo_s_n: Global coordinate space surface normal
  148.             loc_s_n = normalize(vec3(
  149.                 S(D,vec3(X+E,Y  ,Z  )) - S(D,vec3(X-E,Y  ,Z  ))        
  150.             ,   S(D,vec3(X  ,Y+E,Z  )) - S(D,vec3(X  ,Y-E,Z  ))          
  151.             ,   S(D,vec3(X  ,Y  ,Z+E)) - S(D,vec3(X  ,Y  ,Z-E))  
  152.             ));
  153.  
  154.         #undef  S
  155.         #undef  E
  156.         #undef  X
  157.         #undef  Y
  158.         #undef  Z
  159.         #undef  D
  160.         //:---------------:estimate_CELL_LOCAL_surface_normal://
  161.         //:translate_to_get_GLOBAL_surface_normal:-----------://
  162.  
  163.             //:Warning:
  164.             //:Integer Division Is Still Integer Division
  165.             //:SEE[ URL_001 ]
  166.             #define F float
  167.             int   t_y  =int( trunc( F(dex) /   F(NTX)    ));
  168.             int   t_x  =(         (   dex -( t_y*NTX )   ));
  169.             #undef  F
  170.  
  171.         //: WRONG! Surface normal does NOT need to be
  172.         //: translated. The angles on the surface do not change
  173.         //: when you move the object.
  174.         //:    glo_s_n.x = loc_s_n.x + ( float(t_x) * til_wid );
  175.         //:    glo_s_n.y = loc_s_n.y + ( float(t_y) * til_hig );
  176.         //:    glo_s_n.z = loc_s_n.z + (  0.0 ); /** NOTRAN:Z **/
  177.         //:
  178.         //:    //:Maybe rounding errors?
  179.         //:    glo_s_n = normalize( glo_s_n );
  180.  
  181.         //:-----------:translate_to_get_GLOBAL_surface_normal://
  182.         //:CALC_LIGHT_INTENSITY:-----------------------------://
  183.  
  184.             vec3 glo_pop =vec3(
  185.                      pop.x + ( float(t_x) * til_wid )
  186.             ,        pop.y + ( float(t_y) * til_hig )
  187.             ,        pop.z + (    0.0   ) /** NOTRAN:Z **/
  188.             );;
  189.  
  190.             //:   l_v: Light_Vector
  191.             //:   l_i: Light_Intensity
  192.             vec3  l_v = normalize( glo_l_p - glo_pop );  
  193.             float l_i = dot( loc_s_n , l_v );
  194.  
  195.         //:-----------------------------:CALC_LIGHT_INTENSITY://
  196.  
  197.     //:--------------------------------:CALCULATE_LIGHT_VALUE://
  198.  
  199.     float hit =( 1.0 -  max(0.0, min(1.0, dgs ) ) );
  200.  
  201.     vec4 col = vec4(
  202.         0.0
  203.     ,   0.0
  204.     ,   hit * l_i
  205.     ,   1.0
  206.     );;
  207.  
  208.     return( col );
  209. }
  210. vec4 sdf_Render( vec3 cam, vec3 ray )
  211. {
  212.  
  213.     vec4 col; /** Output Color Of This Function **/
  214.  
  215.     float til_wid =   ( iResolution.x /  float( NTX ) );
  216.     float til_hig =   ( iResolution.y /  float( NTY ) );
  217.  
  218.     int       t_x =int( cam.x / til_wid );
  219.     int       t_y =int( cam.y / til_hig );
  220.  
  221.     int  dex = t_x + ( NTX * t_y );
  222.    
  223.     if( til_arr[ dex ] >= 1 ){
  224.  
  225.         vec3 L_C =vec3(
  226.             cam.x - ( float(t_x) * til_wid )
  227.         ,   cam.y - ( float(t_y) * til_hig )
  228.         ,   cam.z + (      0.0       )
  229.         );;
  230.  
  231.         col = sdf_RenderCell(
  232.             /** Use[ dex ] and NOT the tile value here. **/
  233.             /** This will allow us to do auto-tiling    **/
  234.             /** in the future.                          **/
  235.             dex //:<<<<< dex , NOT TILE VALUE !
  236.         ,   L_C //: [L]ocal to cell [C]amera Position.
  237.         ,   ray
  238.         );;
  239.  
  240.     }else{
  241.  
  242.         col = vec4( 0 , 0 , 0 , 1.0 );
  243.  
  244.     };;
  245.    
  246.     return( col );
  247.  
  248. }
  249.  
  250. void mainImage( out vec4 fragColor, in vec2 fragCoord )
  251. {
  252.  
  253.     vec2 f_c = vec2(
  254.                 (    0.0     )+ fragCoord.x
  255.                ,iResolution.y - fragCoord.y );;
  256.  
  257.    
  258.     vec3 cam = vec3( f_c.x , f_c.y , iResolution.y );
  259.     vec3 ray = normalize(vec3( 0 , 0 , 0 - 1 ));
  260.     vec4 col ;
  261.  
  262.     col = sdf_Render( cam , ray );
  263.    
  264.    
  265. //  col = vec4(
  266. //          f_c.x / iResolution.x
  267. //         ,f_c.y / iResolution.y
  268. //         ,0.0
  269. //         ,1.0 //:ALPHA
  270. //  );;
  271.  
  272.     // Output to screen
  273.     fragColor = col;
  274. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement