Advertisement
DEKTEN

SDF_005

Nov 12th, 2020 (edited)
612
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /** ******************************************************** ***
  2.  
  3.  
  4.  
  5.     SOURCE_____CODE : tinyurl.com/SDF-005
  6.  
  7.  
  8.  
  9.     FILE_______NAME : SDF_005._
  10.     PASTEBIN__TITLE : SDF_005  
  11.     PASTEBIN____URL : https://pastebin.com/NW1vAsaA
  12.     TWITCH______URL : www.twitch.com/kanjicoder
  13.     TWITTER_____URL : twitter.com/MakeGamesHappen
  14.     DESMOS____GRAPH : NO GRAPHS TODAY
  15.  
  16. *** ******************************************************** **/
  17.  
  18. #define MAX_STE ( 100   )
  19. #define MIN_DIS ( 0.02  )
  20. #define MAX_DIS ( 100.0 )
  21.  
  22.     #define I32 int                    
  23.     #define _ 0                                          
  24.     #define X 1                                          
  25.     I32 til_arr[ 25 * 7 ]=I32[ 25 * 7 ](                
  26.     _,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,  
  27.     X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,  
  28.     X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,  
  29.     X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,  
  30.     X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,  
  31.     X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,  
  32.     X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X  
  33.     );                                              
  34.     #undef  _                                            
  35.     #undef  X                                            
  36.     #undef  I32    
  37.  
  38. float sdf_Sphere( vec3 org_geo , vec3 pop ){
  39.  
  40.     vec4  obj = vec4( org_geo    ,0.5 ); //: w == radius
  41.     float dis = length( obj.xyz - pop.xyz ) - obj.w;
  42.     return( dis );
  43.  
  44. }
  45.  
  46. float sdf_Scene( vec3 org, vec3 ray, vec3 pop ){
  47.  
  48.     vec3 org_geo = vec3( 4.0,0,0 );
  49.  
  50.     //:return( sdf_Sphere( org_geo , pop ) );  
  51.  
  52.     //:Only works for orthographic camera. Niave Calc.\
  53.     //:Must convert [ u_v ] back to frag coords.
  54.     float    p_x  = ( org.x * iResolution.y );
  55.     float    p_y  = ( org.y * iResolution.y );
  56.  
  57.            
  58.     //: tpW : tile_wid_in_pixels                        
  59.     //: tpH : tile_hig_in_pixels                        
  60.     int ntX    = 25; //:Number_Of_Tiles:X-axis          
  61.     int ntY    =  7; //:Number_Of_tiles:Y-axis          
  62.     int tpW    = int( iResolution.x / float( ntX )  );          
  63.     int tpH    = int( iResolution.y / float( ntY )  );          
  64.     int tile_x = int( p_x / float( tpW )  );          
  65.     int tile_y = int( p_y / float( tpH )  );          
  66.    
  67.  
  68.     if( tile_x < 0 || tile_x >= 25 ||
  69.         tile_y < 0 || tile_y >=  7
  70.     ){  //:Out Of Bounds
  71.         return( MAX_DIS + 100.00 );
  72.     }else{
  73.  
  74.          
  75.  
  76.         int dex_til = tile_x + ( ntX * tile_y);
  77.         int tile_value = til_arr[ dex_til ];                
  78.         if( tile_value > int(0) ){                          
  79.                      
  80.             float    f_tpW = 1.0;
  81.             float    f_tpH = 1.0;
  82.             float f_tile_x = float(tile_x);
  83.             float f_tile_y = float(tile_y);
  84.            
  85.             org_geo.x = float( ( f_tile_x * f_tpW ) + (f_tpW/2.0) );
  86.             org_geo.y = float( ( f_tile_y * f_tpH ) + (f_tpH/2.0) );
  87.             org_geo.z = float(                  0                 );
  88.        
  89.             return( sdf_Sphere( org_geo , pop ) );  
  90.  
  91.         }else{      
  92.             //: NO GEOMETRY IN CELL                                
  93.             //return( MAX_DIS + 100.00 );
  94.           //  return( sdf_Sphere( org_geo , pop ) );  
  95.         };;    
  96.  
  97.     };;
  98.  
  99.  
  100.    
  101.  
  102. }
  103.  
  104. vec3 sdf_EstNorm( vec3 org, vec3 ray, vec3 pop ){
  105.  
  106.     #define  S sdf_Scene
  107.     #define  E 0.0001
  108.     #define  X pop.x
  109.     #define  Y pop.y
  110.     #define  Z pop.z
  111.     #define  O org
  112.     #define  R ray
  113.     return( normalize(vec3(
  114.  
  115.         S(O,R,vec3(X+E,Y  ,Z  ))  -  S(O,R,vec3(X-E,Y  ,Z  ))
  116.     ,   S(O,R,vec3(X  ,Y+E,Z  ))  -  S(O,R,vec3(X  ,Y-E,Z  ))
  117.     ,   S(O,R,vec3(X  ,Y  ,Z+E))  -  S(O,R,vec3(X  ,Y  ,Z-E))
  118.  
  119.     )));;;
  120.     #undef   S
  121.     #undef   E
  122.     #undef   X
  123.     #undef   Y
  124.     #undef   Z
  125.     #undef   O
  126.     #undef   R
  127. }
  128.  
  129. vec4 sdf_Render( vec3 org , vec3 ray ){
  130.  
  131.     /** 1: Ray March           **/
  132.     /** 2: Calculate Lighting  **/
  133.  
  134.     vec3   pop; //:point_on_path
  135.     float  d_o; //:distance_from_origin
  136.     float  d_s; //:distance_from_surface
  137.  
  138.     d_o = 0.0;
  139.  
  140.     for( int i = 0; i <= MAX_STE ; i++ ){
  141.  
  142.         pop = org + ( ray * d_o );
  143.         d_s = sdf_Scene( org,ray,  pop );
  144.  
  145.         if( d_s <= MIN_DIS || d_o >= MAX_DIS ){
  146.             break;
  147.         };;
  148.        
  149.         d_o += ( d_s ); //:March forward by[ d_s ].
  150.     };;
  151.  
  152.     float hit = max(0.0,min(1.0,( 1.0 - d_s )));
  153.  
  154.     vec3   l_p = vec3(cos(iTime*1.0)*100.0,0,20.0); //:light_pos
  155.     vec3   l_n = normalize( l_p - pop );
  156.     vec3   s_n = sdf_EstNorm( org,ray,pop );
  157.     float  g_i = 0.1; //:global_illumination
  158.     float  l_i = dot( l_n , s_n ); //:light_intensity.
  159.     vec3   l_t = vec3( 0 ); //:light_tuple
  160.  
  161.     l_t.x =( l_i + g_i );
  162.     l_t.y =( l_i + 0.0 );
  163.     l_t.z =( l_i + 0.0 );
  164.  
  165.  
  166.     return( vec4( vec3( hit * l_t.xyz ) , hit ));
  167.  
  168. }
  169.  
  170. void mainImage( out vec4 fragColor, in vec2 fragCoord )
  171. {
  172.  
  173.     vec2   u_v = (fragCoord-0.5*iResolution.xy)/iResolution.yy;
  174.    
  175.  
  176.     //:    ray: Orthographic Camera Ray
  177.     vec3   ray = normalize( vec3( u_v.x , u_v.y , 0 - 1 ) );
  178.     vec3   org =            vec3( u_v.x , u_v.y , 0 + 9 );
  179.  
  180.     vec4   col = sdf_Render( org , ray );
  181.  
  182.  
  183.     fragColor = col;
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement