CapsAdmin

Untitled

Sep 9th, 2012
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.84 KB | None | 0 0
  1. local ENT = Entity(1027)
  2. local size = 1024
  3.  
  4. local max_size = 5
  5.  
  6. local count = 10000
  7. local sand = {}
  8.  
  9. for i=1, count do
  10.     local siz = math.Rand(1,max_size)
  11.     sand[i] =
  12.     {
  13.         pos = {x = size*0.5, y = size*0.5},
  14.         vel = {x = 0, y = 0},
  15.         siz = siz,
  16.         drag = (0.99 - (siz / (max_size * 80))),
  17.     }
  18. end
  19.  
  20. local drawpixel
  21.  
  22. do
  23.     local col = {r=0, g=0, b=0, a=0}
  24.     local cache = {}
  25.     local vel
  26.    
  27.     local SetDrawColor = surface.SetDrawColor
  28.     local DrawLine = surface.DrawLine
  29.     local floor = math.floor
  30.  
  31.     drawpixel = function(data)
  32.         vel = floor(data.vel.x + data.vel.y)
  33.        
  34.         -- cache the color
  35.         col = cache[vel] or HSVToColor(vel, vel, 1)
  36.         cache[vel] = col
  37.        
  38.         SetDrawColor(
  39.             col.r, col.g, col.b,
  40.             255
  41.         )
  42.  
  43.         DrawLine(
  44.             data.pos.x,
  45.             data.pos.y,
  46.  
  47.             data.pos.x + data.vel.x * -0.2,
  48.             data.pos.y + data.vel.y * -0.2
  49.         )
  50.     end
  51. end
  52.  
  53. local new
  54. local function localtoworld(vec, ang)
  55.     new = WorldToLocal(vec, Angle(0), Vector(0), ang)
  56.     new:Rotate(Angle(180,0,0))
  57.     return new.x, new.y
  58. end
  59.  
  60. local hash_map = {x={},y={}}
  61.  
  62. local function calc_self_collision(part)
  63.     local x = math.Round(part.pos.x, 2)
  64.     local y = math.Round(part.pos.y, 2)
  65.        
  66.     if hash_map.x[part.last_hash_x] then
  67.         hash_map.x[part.last_hash_x] = false
  68.         hash_map.y[part.last_hash_y] = false
  69.     elseif hash_map.x[x] and hash_map.y[y] then
  70.         part.vel.x = part.vel.x * -0.5
  71.         part.vel.y = part.vel.y * -0.5
  72.     end
  73.    
  74.     hash_map.x[x] = true
  75.     hash_map.y[y] = true
  76.    
  77.     part.last_hash_x = x
  78.     part.last_hash_y = y
  79. end
  80.  
  81. local WorldSound = WorldSound
  82. local clamp = math.Clamp
  83. local sqrt = math.sqrt
  84. local random = math.random
  85.  
  86. local function play_sound(part)
  87.     local len = clamp(sqrt(part.vel.x^2 + part.vel.y^2) + (random() * 0.1), 1, 100)
  88.     if len > 30 then
  89.         WorldSound("physics/flesh/flesh_bloody_impact_hard1.wav", ENT:GetPos(), len*0.5, 100 + math.random(1, 10) + (((-part.siz / max_size) + 1) * 200) )
  90.     end
  91. end
  92.  
  93. local function calc_collision(part)
  94.     if part.pos.x - part.siz < 0 then
  95.         play_sound(part)
  96.         part.pos.x = part.siz
  97.         part.vel.x = part.vel.x * -part.drag
  98.     end
  99.    
  100.     if part.pos.x + part.siz > size then
  101.         play_sound(part)
  102.         part.pos.x = size - part.siz
  103.         part.vel.x = part.vel.x * -part.drag
  104.     end
  105.    
  106.     if part.pos.y - part.siz < 0 then
  107.         play_sound(part)
  108.         part.pos.y = part.siz
  109.         part.vel.y = part.vel.y * -part.drag
  110.     end
  111.    
  112.     if part.pos.y + part.siz > size then
  113.         play_sound(part)
  114.         part.pos.y = size - part.siz
  115.         part.vel.y = part.vel.y * -part.drag
  116.     end
  117. end
  118.  
  119. local delta
  120. local ext_vel_x, ext_vel_y
  121. local rand = math.Rand
  122.  
  123. local function DrawScreen()
  124.     surface.SetDrawColor(50,50,50,255)
  125.     surface.DrawRect(0,0,size,size)
  126.  
  127.     -- external velocity
  128.     ext_vel_x, ext_vel_y = localtoworld(ENT:GetVelocity(), ENT:GetAngles())
  129.     ext_vel_x = ext_vel_x * 0.3
  130.     ext_vel_y = ext_vel_y * 0.3
  131.    
  132.     -- gravity
  133.     local grav = Vector(0,0,0)--ENT:WorldToLocalAngles(physenv.GetGravity():Angle()):Up() * 5
  134.     ext_vel_x = ext_vel_x + grav.y
  135.     ext_vel_y = ext_vel_y + grav.x
  136.        
  137.     delta = FrameTime() * 5
  138.    
  139.     for i, part in pairs(sand) do
  140.         -- random velocity for some variation
  141.         part.vel.x = part.vel.x + ext_vel_x + rand(-2,2)
  142.         part.vel.y = part.vel.y + ext_vel_y + rand(-2,2)
  143.        
  144.         -- velocity
  145.         part.pos.x = part.pos.x + (part.vel.x * delta)
  146.         part.pos.y = part.pos.y + (part.vel.y * delta)
  147.        
  148.         -- friction
  149.         part.vel.x = part.vel.x * part.drag
  150.         part.vel.y = part.vel.y * part.drag
  151.                        
  152.         -- collision
  153.         calc_collision(part)
  154.        
  155.         -- collision with other particles (buggy)
  156.         --calc_self_collision()
  157.  
  158.         drawpixel(part)
  159.     end
  160. end
  161.  
  162. function ENT:RenderOverride()
  163.     self:DrawModel()
  164.     cam.Start3D2D(self:GetPos() + self:GetRight() * -25 + self:GetForward() * -25 + self:GetUp() * 2, self:GetAngles(), 0.048)
  165.         DrawScreen()
  166.     cam.End3D2D()
  167. end
  168.  
  169. ENT:SetRenderMode(1)
Advertisement
Add Comment
Please, Sign In to add comment