CapsAdmin

Untitled

Jul 23rd, 2013
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 16.96 KB | None | 0 0
  1. screens = screens or {}
  2. screens.active_screens = screens.active_screens or {}
  3. screens.lock_player = false
  4. screens.mouse_delta = Vector(0, 0, 0)
  5. screens.focused_screen = screens.focused_screen or NULL
  6.  
  7. do -- meta
  8.     local SCREEN = {}
  9.     SCREEN.__index = SCREEN
  10.    
  11.     function SCREEN:Remove()
  12.         self:KillFocus()
  13.        
  14.         for _, ent in pairs(self.entities) do
  15.             SafeRemoveEntity(ent)
  16.         end
  17.        
  18.         function self:IsValid()
  19.             return false
  20.         end
  21.        
  22.         screens.active_screens[self.screen_id] = nil
  23.        
  24.         setmetatable(self, getmetatable(NULL))
  25.     end
  26.        
  27.     function SCREEN:IsValid()
  28.         return true
  29.     end
  30.    
  31.     AccessorFunc(SCREEN, "terrain_mat", "TerrainMaterial")
  32.     AccessorFunc(SCREEN, "rt_tex", "RTTexture")
  33.     AccessorFunc(SCREEN, "fps", "FPS", FORCE_NUMBER)
  34.     AccessorFunc(SCREEN, "width", "Width")
  35.     AccessorFunc(SCREEN, "height", "Height")
  36.     AccessorFunc(SCREEN, "water_level", "WaterLevel")
  37.    
  38.     AccessorFunc(SCREEN, "cam_pos", "CameraPos")
  39.     AccessorFunc(SCREEN, "cam_ang", "CameraAngles")
  40.     AccessorFunc(SCREEN, "cam_fov", "CameraFOV")
  41.    
  42.     function SCREEN:IsPaused()
  43.         return self.paused
  44.     end
  45.    
  46.     function SCREEN:Pause()
  47.         self.paused = true
  48.     end
  49.    
  50.     function SCREEN:Resume()
  51.         self.paused = false
  52.     end
  53.    
  54.     do -- input
  55.         function SCREEN:RequestFocus()
  56.             screens.EnableKeyMonitor(true)
  57.             screens.focused_screen = self
  58.         end
  59.        
  60.         function SCREEN:KillFocus()
  61.             if screens.focused_screen == self then
  62.                 screens.EnableKeyMonitor(false)
  63.                 screens.focused_screen = NULL
  64.             end
  65.         end
  66.        
  67.         function SCREEN:IsFocused()
  68.             return screens.focused_screen == self
  69.         end
  70.        
  71.         function SCREEN:GetMouseDelta()
  72.             return screens.mouse_delta
  73.         end
  74.        
  75.         function SCREEN:OnInput(key, press)
  76.             if key == IN_USE and press then
  77.                 self:KillFocus()
  78.             end
  79.         end
  80.     end
  81.    
  82.     do -- entities
  83.         function SCREEN:CreateEntity(mdl)
  84.             local ent = ClientsideModel(mdl)
  85.             ent:SetNoDraw(true)
  86.            
  87.             table.insert(self.entities, ent)
  88.            
  89.             return ent
  90.         end
  91.        
  92.         function SCREEN:DrawEntities()
  93.             render.SuppressEngineLighting(true)
  94.            
  95.             render.SetBlend(1)
  96.             render.SetColorModulation(1,1,1)
  97.             render.SetAmbientLight(0,0,0)
  98.             render.ResetModelLighting(0.2,0.2,0.2)
  99.            
  100.             render.SetModelLighting(3, 1,1,1) -- global_light.r / 255, global_light.g / 255, global_light.b / 255)
  101.  
  102.             for _, ent in pairs(self.entities) do
  103.                 ent:DrawModel()
  104.             end
  105.            
  106.             render.SuppressEngineLighting(false)
  107.         end    
  108.     end
  109.    
  110.     if pac then
  111.         function SCREEN:GetTextureFromURL(url, size, callback)
  112.             pac.urltex.GetMaterialFromURL(url, function(mat, tex)  
  113.                 callback(mat, tex)
  114.             end, false, nil, size, false)
  115.         end
  116.     end
  117.  
  118.     do -- terrain
  119.         local W, H = ScrW(), ScrH()
  120.        
  121.         local function start_height(tex)
  122.             local mat = CreateMaterial("screens_heightmap_" .. os.clock(), "UnlitGeneric", {["$basetexture"] = "dev/hemisphere_height.vtf"})
  123.            
  124.             if tex then
  125.                 mat:SetTexture("$basetexture", tex)
  126.             end
  127.            
  128.             cam.Start2D()  
  129.  
  130.             surface.SetMaterial(mat)
  131.             surface.SetDrawColor(255, 255, 255, 255)
  132.            
  133.             -- this kinda sucks but using a heightmap resolution higher than screen resolution will cause undesired results..
  134.             surface.DrawTexturedRect(0, 0, W, H)
  135.                
  136.             render.CapturePixels()
  137.         end
  138.  
  139.         local function get_height(x, y)
  140.             local r,g,b = render.ReadPixel(math.ceil(x*W), math.ceil(y*H)) 
  141.            
  142.             return ((r+g+b) / 3) / 255
  143.         end
  144.  
  145.         local function end_height()
  146.             cam.End2D()
  147.         end
  148.    
  149.         function SCREEN:CreateTerrainFromHeightmap(tex, size, res, height)         
  150.             local mesh = Mesh()
  151.            
  152.             start_height(tex)
  153.            
  154.             size = size or 32768
  155.             res = res or 64
  156.             height = height or 8192
  157.            
  158.             local data = {}
  159.             local _size = size / res
  160.            
  161.             for y = 0, res do
  162.                 for x = 0, res do          
  163.                     local z1 = get_height(x/res, (y+1)/res) * height -- bottom left
  164.                     local z2 = get_height(x/res, y/res) * height -- top left
  165.                     local z3 = get_height((x+1)/res, y/res) * height -- top right
  166.                     local z4 = get_height((x+1)/res, (y+1)/res) * height -- bottom right
  167.                    
  168.                     table.insert(data, {pos = Vector(x * _size + _size, y * _size, z3)})
  169.                     table.insert(data, {pos = Vector(x * _size, y * _size, z2)})
  170.                     table.insert(data, {pos = Vector(x * _size, y * _size + _size, z1)})
  171.                    
  172.                     table.insert(data, {pos = Vector(x * _size, y * _size + _size, z1)})
  173.                     table.insert(data, {pos = Vector(x * _size + _size, y * _size + _size, z4)})
  174.                     table.insert(data, {pos = Vector(x * _size + _size, y * _size, z3)})       
  175.                 end
  176.             end
  177.            
  178.             end_height()
  179.            
  180.             local height_cache = {}
  181.            
  182.             for _, vertex in pairs(data) do
  183.                 -- vertex.normal = VectorRand()            
  184.                 vertex.u = (vertex.pos.x / size)
  185.                 vertex.v = (vertex.pos.y / size)
  186.             end
  187.            
  188.             start_height(tex)
  189.             for x = 0, W do
  190.                 for y = 0, H do                                    
  191.                     local r,g,b = render.ReadPixel(x, y)   
  192.                     local z = ((r+g+b) / 3) / 255
  193.                
  194.                     height_cache[x] = height_cache[x] or {}
  195.                     height_cache[x][y] = height_cache[x][y] or z * height
  196.                 end
  197.             end
  198.             end_height()
  199.            
  200.             self.height_cache = height_cache
  201.            
  202.             mesh:BuildFromTriangles(data)
  203.            
  204.             SafeRemoveEntity(self.terrain_ent)
  205.             local ent = self:CreateEntity("error.mdl")
  206.            
  207.             self.terrain_mat = Material("models/wireframe")
  208.             self.terrain_size = size
  209.            
  210.             ent.RenderOverride = function(ent)
  211.                 render.MaterialOverride(self.terrain_mat)
  212.                
  213.                 ent:SetModelScale(0, 0)
  214.                 ent:DrawModel()
  215.                
  216.                 local mat = Matrix()   
  217.                
  218.                 mat:SetAngles(ent:GetAngles())
  219.                 mat:SetTranslation(ent:GetPos())       
  220.                
  221.                 cam.PushModelMatrix(mat)
  222.                     mesh:Draw()
  223.                 cam.PopModelMatrix()
  224.                
  225.                 render.MaterialOverride()
  226.             end
  227.         end
  228.        
  229.         function SCREEN:GetTerrainHeight(pos)      
  230.             if self.height_cache then
  231.                 local x = math.floor((pos.x / self.terrain_size) * W)
  232.                 local y = math.floor((pos.y / self.terrain_size) * H)
  233.  
  234.                 return self.height_cache[x] and self.height_cache[x][y] or 0
  235.             end
  236.            
  237.             return 0
  238.         end
  239.     end
  240.    
  241.     function SCREEN:SetFog(start, _end, max_density, r,g,b)
  242.         if start and _end and max_density and r and g and b then
  243.             self.fog_params =
  244.             {
  245.                 start = start,
  246.                 _end = _end,
  247.                 max_density = max_density,
  248.                 color = {r,g,b},
  249.             }
  250.         else
  251.             self.fog_params = nil
  252.         end
  253.     end
  254.    
  255.     function SCREEN:CreateWorldScreen()
  256.         SafeRemoveEntity(self.world_screen)
  257.        
  258.         local ent = ClientsideModel("models/hunter/plates/plate1x1.mdl")
  259.        
  260.         local mat = Matrix()
  261.         mat:Scale(Vector(self.height / self.width, 1, 1))
  262.         ent:EnableMatrix("RenderMultiply", mat)
  263.        
  264.         ent.RenderOverride = function(s)
  265.            
  266.             if not self:IsValid() then
  267.                 timer.Simple(0, function()
  268.                     s:Remove()
  269.                 end)
  270.             end
  271.            
  272.             render.SetBlend(1)
  273.             render.SetColorModulation(1, 1, 1)
  274.            
  275.             render.PushFilterMag(TEXFILTER.POINT)
  276.             render.PushFilterMin(TEXFILTER.POINT)
  277.            
  278.                 render.MaterialOverride(self.screen_mat)
  279.                     s:DrawModel()
  280.                 render.MaterialOverride()
  281.                
  282.             render.PopFilterMag()
  283.             render.PopFilterMin()
  284.         end
  285.        
  286.         self.world_screen = ent
  287.        
  288.         return ent
  289.     end
  290.    
  291.     -- events
  292.  
  293.     function SCREEN:UpdateFreeroamCamera()
  294.         local speed = 100
  295.        
  296.         local delta = screens.mouse_delta * 0.1
  297.         local cam_pos = self.cam_pos
  298.         local cam_ang = self.cam_ang
  299.        
  300.         cam_ang.p = cam_ang.p + delta.y
  301.         cam_ang.y = cam_ang.y - delta.x
  302.         cam_ang.p = math.clamp(cam_ang.p, -90, 90)
  303.        
  304.         if input.IsKeyDown(KEY_LSHIFT) then
  305.             speed = speed * 4
  306.         elseif input.IsKeyDown(KEY_LCONTROL) then
  307.             speed = speed / 4
  308.         end
  309.  
  310.         if input.IsKeyDown(KEY_SPACE) then
  311.             cam_pos = cam_pos - Vector(0, 0, -speed)
  312.         end
  313.  
  314.         local offset = cam_ang:Forward() * speed
  315.  
  316.         if input.IsKeyDown(KEY_W) then
  317.             cam_pos = cam_pos + offset
  318.         elseif input.IsKeyDown(KEY_S) then
  319.             cam_pos = cam_pos - offset
  320.         end
  321.  
  322.         offset = cam_ang:Right() * speed
  323.         offset.z = -offset.z
  324.  
  325.         if input.IsKeyDown(KEY_D) then
  326.             cam_pos = cam_pos + offset
  327.         elseif input.IsKeyDown(KEY_A) then
  328.             cam_pos = cam_pos - offset
  329.         end  
  330.        
  331.         self.cam_pos = cam_pos
  332.         self.cam_ang = cam_ang
  333.     end
  334.    
  335.     function SCREEN:UpdateWalkCamera()
  336.         self.cam_vel = self.cam_vel or Vector(0,0,0)
  337.         local speed = 10
  338.        
  339.         local delta = screens.mouse_delta * 0.1
  340.         local cam_pos = self.cam_pos
  341.         local cam_ang = self.cam_ang
  342.        
  343.         cam_ang.p = cam_ang.p + delta.y
  344.         cam_ang.y = cam_ang.y - delta.x
  345.         cam_ang.p = math.clamp(cam_ang.p, -90, 90)
  346.        
  347.         if input.IsKeyDown(KEY_LSHIFT) then
  348.             speed = speed * 4
  349.         elseif input.IsKeyDown(KEY_LCONTROL) then
  350.             speed = speed / 4
  351.         end
  352.  
  353.         if input.IsKeyDown(KEY_SPACE) then
  354.             if not self.jumped then
  355.                 self.cam_vel.z = self.cam_vel.z + 500
  356.                 self.jumped = true
  357.             end
  358.         else
  359.             self.jumped = false
  360.         end
  361.  
  362.         local offset = cam_ang:Forward() * speed
  363.  
  364.         if input.IsKeyDown(KEY_W) then
  365.             cam_pos = cam_pos + offset
  366.         elseif input.IsKeyDown(KEY_S) then
  367.             cam_pos = cam_pos - offset
  368.         end
  369.  
  370.         offset = cam_ang:Right() * speed
  371.         offset.z = -offset.z
  372.  
  373.         if input.IsKeyDown(KEY_D) then
  374.             cam_pos = cam_pos + offset
  375.         elseif input.IsKeyDown(KEY_A) then
  376.             cam_pos = cam_pos - offset
  377.         end  
  378.        
  379.         cam_pos.z = math.max(cam_pos.z - 100, self:GetTerrainHeight(cam_pos) + 72)     
  380.    
  381.         self.cam_vel = (self.cam_vel + (cam_pos - self.cam_pos)) * 0.35
  382.        
  383.         self.cam_pos = cam_pos + self.cam_vel
  384.         self.cam_ang = cam_ang
  385.     end
  386.    
  387.     function SCREEN:UpdateCamera()
  388.         if not self:IsFocused() then return end
  389.        
  390.         self:UpdateFreeroamCamera()
  391.     end
  392.    
  393.     function SCREEN:Think()
  394.         self:UpdateCamera()
  395.     end
  396.    
  397.     local skybox_ent = ClientsideModel("models/XQM/Rails/gumball_1.mdl")
  398.     skybox_ent:SetMaterial("models/debug/debugwhite")
  399.    
  400.     function SCREEN:DrawSkyBox()   
  401.         render.SetColorModulation(0.4,0.7,1)
  402.         render.SetBlend(1)
  403.         render.SuppressEngineLighting(true)
  404.             skybox_ent:SetPos(self.cam_pos)
  405.             skybox_ent:SetModelScale(-1, 0)
  406.             skybox_ent:DrawModel()
  407.         render.SuppressEngineLighting(false)
  408.         render.ClearDepth()
  409.     end
  410.    
  411.     do -- water
  412.         local water_mat = CreateMaterial("screens_water_"..RealTime(), "Refract",
  413.         {
  414.             ["$model"] = 1,
  415.             ["$nocull"] = 1,
  416.             ["$translucent"] = 1,
  417.             ["$bluramount"] = 50,
  418.             ["$refractamount"] = 0.1,
  419.             ["$refracttint"] = "0.5 0.5 1",
  420.             ["$dudvmap"] = "water/dx80_tfwater001_dudv",
  421.             ["$normalmap"] = "water/tfwater001_normal",
  422.  
  423.             Proxies =
  424.             {
  425.                 AnimatedTexture =
  426.                 {
  427.                     animatedtexturevar = "$normalmap",
  428.                     animatedtextureframenumvar = "$bumpframe",
  429.                     animatedtextureframerate = 30,
  430.                 },
  431.             },
  432.         })
  433.        
  434.         local water_mesh = Mesh()
  435.         local data = {}
  436.         local size = 32768 / 8
  437.        
  438.         for y = 0, 128 do
  439.             for x = 0, 128 do          
  440.                 table.insert(data, {pos = Vector(x * size + size, y * size)})
  441.                 table.insert(data, {pos = Vector(x * size, y * size)})
  442.                 table.insert(data, {pos = Vector(x * size, y * size + size)})
  443.                
  444.                 table.insert(data, {pos = Vector(x * size, y * size + size)})
  445.                 table.insert(data, {pos = Vector(x * size + size, y * size + size)})
  446.                 table.insert(data, {pos = Vector(x * size + size, y * size)})      
  447.             end
  448.         end
  449.        
  450.         local up = Vector(0,0,1)
  451.         for k,v in pairs(data) do
  452.             v.normal = up
  453.             v.v = v.pos.x / size
  454.             v.u = v.pos.y / size
  455.         end
  456.        
  457.         water_mesh:BuildFromTriangles(data)
  458.                
  459.         function SCREEN:DrawWater()
  460.             render.UpdateRefractTexture()
  461.  
  462.             render.SetBlend(1)
  463.             render.SuppressEngineLighting(true)
  464.            
  465.             local mat = Matrix()
  466.            
  467.             mat:Translate(Vector(self.cam_pos.x - 32768*8, self.cam_pos.y - 32768*8,self.water_level))
  468.            
  469.             cam.PushModelMatrix(mat)
  470.  
  471.             render.SetMaterial(water_mat)
  472.             water_mesh:Draw()
  473.            
  474.             cam.PopModelMatrix()
  475.             render.SuppressEngineLighting(false)
  476.         end
  477.        
  478.     end
  479.    
  480.     function SCREEN:Draw3D()
  481.         self:DrawEntities()
  482.     end
  483.    
  484.     function SCREEN:Draw2D()
  485.    
  486.     end
  487.        
  488.     function SCREEN:DrawPostProcess()
  489.         if self.cam_pos.z < self.water_level then
  490.             surface.SetDrawColor(20,50,100,100)
  491.             surface.DrawRect(0,0,self.width,self.height)
  492.         end
  493.     end
  494.    
  495.     function SCREEN:Update()
  496.         self:Think()
  497.        
  498.         local old_rt, old_w, old_h = render.GetRenderTarget(), ScrW(), ScrH()
  499.         render.SetRenderTarget(self.rt_tex)
  500.         render.SetViewPort(0, 0, self.width, self.height)
  501.         render.Clear(0,0,0,0, true)
  502.        
  503.         local params = {}
  504.        
  505.         params.origin = self.cam_pos
  506.         params.angles = self.cam_ang
  507.         params.fob = self.cam_fov
  508.         params.x = 0
  509.         params.y = 0
  510.         params.w = self.width
  511.         params.h = self.height
  512.         params.zfar = 32000*4
  513.         params.aspect = self.width/self.height
  514.        
  515.         cam.Start(params)
  516.             self:DrawSkyBox()
  517.        
  518.             local params = self.fog_params
  519.             if params then
  520.                 render.FogMode(1)
  521.                 render.FogStart(params.start)
  522.                 render.FogEnd(params._end)
  523.                 render.FogMaxDensity(params.max_density)
  524.                 render.FogColor(unpack(params.color))
  525.             end
  526.            
  527.             self:Draw3D()
  528.            
  529.             self:DrawWater()
  530.         cam.End()
  531.        
  532.         cam.Start2D()
  533.             self:Draw2D()
  534.             self:DrawPostProcess()
  535.         cam.End2D()
  536.        
  537.         render.SetRenderTarget(old_rt)
  538.         render.SetViewPort(0, 0, old_w, old_h)
  539.     end
  540.    
  541.     screens.ScreenMeta = SCREEN
  542. end
  543.  
  544. function screens.GetAll()
  545.     return screens.active_screens
  546. end
  547.  
  548. function screens.Remove(id)
  549.     local self = screens.active_screens[id] or NULL
  550.     if self:IsValid() then
  551.         self:Remove()
  552.     end
  553. end
  554.  
  555. function screens.Create(id, w, h, fps)
  556.     w = w or 320
  557.     h = h or 240
  558.     fps = fps or 10
  559.    
  560.     screens.Remove(id)
  561.    
  562.     local self = setmetatable({}, screens.ScreenMeta)
  563.        
  564.     self.screen_id = id
  565.    
  566.     self.width = w
  567.     self.height = h
  568.     self.fps = fps
  569.    
  570.     self.cam_pos = Vector(0, 0, 0)
  571.     self.cam_ang = Angle(0, 0, 0)
  572.     self.cam_fov = 90
  573.    
  574.     self.rt_tex = GetRenderTarget(id, w, h, true)
  575.     self.screen_mat = CreateMaterial(id, "UnlitGeneric")
  576.     self.screen_mat:SetTexture("$basetexture", self.rt_tex)
  577.    
  578.     self.water_level = 1000
  579.     self.world_screen = NULL
  580.    
  581.     self.entities = {}
  582.    
  583.     screens.active_screens[id] = self
  584.    
  585.     return self
  586. end
  587.  
  588. function screens.EnableKeyMonitor(b)
  589.     if b then
  590.         screens.lock_player = LocalPlayer():EyeAngles()
  591.     else
  592.         screens.lock_player = false
  593.     end
  594. end
  595.  
  596. do -- hooks
  597.     hook.Add("Think", "screens_update", function()
  598.         local time = RealTime()
  599.    
  600.         for _, screen in pairs(screens.active_screens) do
  601.             if not screen.paused and (not screen.last_update or screen.last_update < time) then
  602.                 screen:Update()
  603.                 screen.last_update = time + (1/screen.fps)
  604.             end
  605.         end
  606.     end)
  607.    
  608.     hook.Add("CreateMove", "screens_camera", function(ucmd)
  609.         if screens.lock_player then
  610.             ucmd:SetForwardMove(0)
  611.             ucmd:SetSideMove(0)
  612.             ucmd:SetViewAngles(screens.lock_player)
  613.            
  614.             screens.mouse_delta.x = ucmd:GetMouseX()
  615.             screens.mouse_delta.y = ucmd:GetMouseY()
  616.         end
  617.     end)
  618.    
  619.     local SIGH = {}
  620.    
  621.     hook.Add("KeyPress", "screens", function(ply, key)
  622.    
  623.         if key == IN_USE then
  624.             for _, screen in pairs(screens.active_screens) do
  625.                 if screen.world_screen:IsValid() and screen.world_screen:GetPos():Distance(ply:EyePos()) < 100 then
  626.                     if not screens.last_focus or screens.last_focus  < RealTime()  then
  627.                         screen:RequestFocus()
  628.                         screens.last_focus = RealTime() + 0.5
  629.                     end
  630.                 end
  631.             end
  632.         end
  633.    
  634.         local screen = screens.focused_screen
  635.         if screen:IsValid() then
  636.             if not SIGH[key] then
  637.                 screen:OnInput(key, true)
  638.                 SIGH[key] = true
  639.             end
  640.         end
  641.     end)
  642.    
  643.     hook.Add("KeyRelease", "screens", function(ply, key)
  644.         local screen = screens.focused_screen
  645.         if screen:IsValid() then
  646.             if SIGH[key] then
  647.                 screen:OnInput(key, false)
  648.                 SIGH[key] = false
  649.             end
  650.         end
  651.     end)
  652. end
  653.  
  654. do -- test
  655.     local size = 32768 * 4
  656.  
  657.     local screen = screens.Create("forest")
  658.  
  659.     screen:SetCameraPos(Vector(37032, 33568, 2500))
  660.     screen:SetCameraAngles(Angle(0,45,0))
  661.    
  662.     local ent = screen:CreateWorldScreen()
  663.     ent:SetPos(Vector(10724.440429688, -1749.2056884766, 64.03125))
  664.     ent:SetAngles(Angle(90,0,0))
  665.    
  666.     screen:SetFog(0, size, 0.5, 80, 170, 255)
  667.     screen:SetWaterLevel(1500)
  668.    
  669.     local trees = {
  670.         "models/props_foliage/tree_pine01.mdl",
  671.         "models/props_foliage/tree_pine01_8cluster.mdl",
  672.         "models/props_foliage/tree_pine01_4cluster.mdl",
  673.         "models/props_foliage/tree_pine_huge.mdl",
  674.         "models/props_foliage/tree_pine_small.mdl",
  675.     }
  676.    
  677.     screen:GetTextureFromURL("https://dl.dropbox.com/u/244444/ShareX/2013-07/2013-07-12_16-32-18.jpg", 2048, function(mat, tex)
  678.         screen:CreateTerrainFromHeightmap(tex, size)
  679.        
  680.         --[[for i = 1, 1000 do
  681.             local pos = Vector(math.random(), math.random(), 0) * size
  682.             pos.z = screen:GetTerrainHeight(pos)
  683.            
  684.             if pos.z > screen:GetWaterLevel() + 500 and pos.z < 3000 then          
  685.                 local ent = screen:CreateEntity(table.Random(trees))
  686.                 ent:SetModelScale(math.Rand(0.5, 2), 0)
  687.                 ent:SetPos(pos)
  688.             end
  689.         end]]
  690.     end)
  691.    
  692.     screen:GetTextureFromURL("https://dl.dropbox.com/u/244444/ShareX/2013-07/2013-07-12_16-32-18.jpg", 2048, function(mat)
  693.         screen:SetTerrainMaterial(mat)
  694.     end)
  695.    
  696.    
  697.     function screen:Draw2D()
  698.         local t = RealTime()
  699.         local w, h = screen:GetWidth(), screen:GetHeight()
  700.                
  701.         surface.SetFont("DermaDefault")
  702.        
  703.         surface.SetTextColor(255, 255, 255, 255)
  704.        
  705.         local pos = self:GetCameraPos()
  706.  
  707.         surface.SetTextPos(5, 5)
  708.         surface.DrawText(tostring(pos))
  709.        
  710.         local height = self:GetTerrainHeight(pos)
  711.         surface.SetTextPos(5, 20)
  712.         surface.DrawText(height)
  713.     end
  714.    
  715.     LOL_SCREEN = screen
  716. end
Advertisement
Add Comment
Please, Sign In to add comment