Garry's Mod Wiki

Revision Difference

Panel:GetHTMLMaterial#524956

<function name="GetHTMLMaterial" parent="Panel" type="classfunc"> <description>Returns the panel's HTML material. Only works with <page>Awesomium</page>, <page>HTML</page> and <page>DHTML</page> panels that have been fully loaded.</description> <realm>Client</realm> <rets> <ret name="" type="IMaterial">The HTML material used by the panel. Typically starts with "__vgui_texture_" followed by an incremental number.</ret> </rets> </function> <example> <description>Defines a new entity which can display a web page on a TV screen.</description> <code> AddCSLuaFile() ENT.Type = "anim" ENT.Base = "base_entity" ENT.PrintName = "Web Screen" ENT.Author = "Microflash" ENT.Spawnable = true if ( CLIENT ) then ENT.Mat = nil ENT.Panel = nil end function ENT:Initialize() if ( SERVER ) then self:SetModel("models/props_phx/rt_screen.mdl") self:SetMoveType(MOVETYPE_VPHYSICS) self:SetSolid(SOLID_VPHYSICS) self:PhysicsInit(SOLID_VPHYSICS) self:Freeze() else -- Reset material and panel and load DHTML panel self.Mat = nil self.Panel = nil self:OpenPage() end end function ENT:Freeze() local phys = self:GetPhysicsObject() if (IsValid(phys)) then phys:EnableMotion(false) end end -- Load the DHTML reference panel function ENT:OpenPage() -- Iff for some reason a panel is already loaded, delete it if(self.Panel) then self.Panel:Remove() self.Panel = nil end -- Create a web page panel and fill the entire screen self.Panel = vgui.Create("DHTML") self.Panel:Dock(FILL) -- Wiki page URL local url = &lt;nowiki&gt;"/Category:Material"&lt;/nowiki&gt;⤶ local url = "https://wiki.facepunch.com/gmod/Material"⤶ -- Load the wiki page self.Panel:OpenURL(url) -- Hide the panel self.Panel:SetAlpha(0) self.Panel:SetMouseInputEnabled(false) -- Disable HTML messages function self.Panel:ConsoleMessage(msg) end end function ENT:Draw() -- Iff the material has already been grabbed from the panel if(self.Mat) then -- Apply it to the screen/model if(render.MaterialOverrideByIndex) then render.MaterialOverrideByIndex(1, self.Mat) else render.ModelMaterialOverride(self.Mat) end -- Otherwise, check that the panel is valid and the HTML material is finished loading elseif(self.Panel && self.Panel:GetHTMLMaterial()) then -- Get the html material local html_mat = self.Panel:GetHTMLMaterial() -- Used to make the material fit the model screen -- May need to be changed iff using a different model -- For the multiplication number it goes in segments of 512 -- Based off the players screen resolution local scale_x, scale_y = ScrW()/2048, ScrH()/1024 -- Create a new material with the proper scaling and shader local matdata = { ["$basetexture"]=html_mat:GetName(), ["$basetexturetransform"]="center 0 0 scale "..scale_x.." "..scale_y.." rotate 0 translate 0 0", ["$model"]=1 } -- Unique ID used for material name local uid = string.Replace(html_mat:GetName(), "__vgui_texture_", "") -- Create the model material self.Mat = CreateMaterial("WebMaterial_"..uid, "VertexLitGeneric", matdata) end -- Render the model self:DrawModel() -- Reset the material override or else everything will have a HTML material! render.ModelMaterialOverride(nil) end function ENT:OnRemove() -- Make sure the panel is removed too if(self.Panel) then self.Panel:Remove() end end </code> <output><image src="Panel_GetHTMLMaterial_example1.gif"/></output> </example>