CapsAdmin

Untitled

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