--[[ | This file was obtained through the combined efforts | of Madbluntz & Plymouth Antiquarian Society. | | Credits: lifestorm, Gregory Wayne Rossel JR., | Maloy, DrPepper10 @ RIP, Atle! | | Visit for more: https://plymouth.thetwilightzone.ru/ --]] local PANEL = {} AccessorFunc( PANEL, "m_fAnimSpeed", "AnimSpeed" ) AccessorFunc( PANEL, "Entity", "Entity" ) AccessorFunc( PANEL, "vCamPos", "CamPos" ) AccessorFunc( PANEL, "fFOV", "FOV" ) AccessorFunc( PANEL, "vLookatPos", "LookAt" ) AccessorFunc( PANEL, "aLookAngle", "LookAng" ) AccessorFunc( PANEL, "colAmbientLight", "AmbientLight" ) AccessorFunc( PANEL, "colColor", "Color" ) AccessorFunc( PANEL, "bAnimated", "Animated" ) function PANEL:Init() self.Entity = nil self.LastPaint = 0 self.DirectionalLight = {} self.FarZ = 4096 self:SetCamPos( Vector( 50, 50, 50 ) ) self:SetLookAt( Vector( 0, 0, 40 ) ) self:SetFOV( 70 ) self:SetText( "" ) self:SetAnimSpeed( 0.5 ) self:SetAnimated( false ) self:SetAmbientLight( Color( 50, 50, 50 ) ) self:SetDirectionalLight( BOX_TOP, Color( 255, 255, 255 ) ) self:SetDirectionalLight( BOX_FRONT, Color( 255, 255, 255 ) ) self:SetColor( color_white ) end function PANEL:SetDirectionalLight( iDirection, color ) self.DirectionalLight[ iDirection ] = color end function PANEL:SetModel( strModelName ) -- Note - there's no real need to delete the old -- entity, it will get garbage collected, but this is nicer. if ( IsValid( self.Entity ) ) then self.Entity:Remove() self.Entity = nil end -- Note: Not in menu dll if ( !ClientsideModel ) then return end self.Entity = ClientsideModel( strModelName, RENDERGROUP_OTHER ) if ( !IsValid( self.Entity ) ) then return end self.Entity:SetNoDraw( true ) self.Entity:SetIK( false ) -- Try to find a nice sequence to play local iSeq = self.Entity:LookupSequence( "walk_all" ) if ( iSeq <= 0 ) then iSeq = self.Entity:LookupSequence( "WalkUnarmed_all" ) end if ( iSeq <= 0 ) then iSeq = self.Entity:LookupSequence( "walk_all_moderate" ) end if ( iSeq > 0 ) then self.Entity:ResetSequence( iSeq ) end end function PANEL:GetModel() if ( !IsValid( self.Entity ) ) then return end return self.Entity:GetModel() end function PANEL:DrawModel() local curparent = self local leftx, topy = self:LocalToScreen( 0, 0 ) local rightx, bottomy = self:LocalToScreen( self:GetWide(), self:GetTall() ) while ( curparent:GetParent() != nil ) do curparent = curparent:GetParent() local x1, y1 = curparent:LocalToScreen( 0, 0 ) local x2, y2 = curparent:LocalToScreen( curparent:GetWide(), curparent:GetTall() ) leftx = math.max( leftx, x1 ) topy = math.max( topy, y1 ) rightx = math.min( rightx, x2 ) bottomy = math.min( bottomy, y2 ) previous = curparent end render.ClearDepth( false ) render.SetScissorRect( leftx, topy, rightx, bottomy, true ) local ret = self:PreDrawModel( self.Entity ) if ( ret != false ) then self.Entity:DrawModel() self:PostDrawModel( self.Entity ) end render.SetScissorRect( 0, 0, 0, 0, false ) end function PANEL:PreDrawModel( ent ) return true end function PANEL:PostDrawModel( ent ) end function PANEL:Paint( w, h ) if ( !IsValid( self.Entity ) ) then return end local x, y = self:LocalToScreen( 0, 0 ) self:LayoutEntity( self.Entity ) local ang = self.aLookAngle if ( !ang ) then ang = ( self.vLookatPos - self.vCamPos ):Angle() end cam.Start3D( self.vCamPos, ang, self.fFOV, x, y, w, h, 5, self.FarZ ) render.SuppressEngineLighting( true ) render.SetLightingOrigin( self.Entity:GetPos() ) render.ResetModelLighting( self.colAmbientLight.r / 255, self.colAmbientLight.g / 255, self.colAmbientLight.b / 255 ) render.SetColorModulation( self.colColor.r / 255, self.colColor.g / 255, self.colColor.b / 255 ) render.SetBlend( ( self:GetAlpha() / 255 ) * ( self.colColor.a / 255 ) ) -- * surface.GetAlphaMultiplier() for i = 0, 6 do local col = self.DirectionalLight[ i ] if ( col ) then render.SetModelLighting( i, col.r / 255, col.g / 255, col.b / 255 ) end end self:DrawModel() render.SuppressEngineLighting( false ) cam.End3D() self.LastPaint = RealTime() end function PANEL:RunAnimation() self.Entity:FrameAdvance( --[[( RealTime() - self.LastPaint ) * self.m_fAnimSpeed]] ) end function PANEL:StartScene( name ) if ( IsValid( self.Scene ) ) then self.Scene:Remove() end self.Scene = ClientsideScene( name, self.Entity ) end function PANEL:LayoutEntity( Entity ) -- -- This function is to be overriden -- if ( self.bAnimated ) then self:RunAnimation() end Entity:SetAngles( Angle( 0, RealTime() * 10 % 360, 0 ) ) end function PANEL:OnRemove() if ( IsValid( self.Entity ) ) then self.Entity:Remove() end end function PANEL:GenerateExample( ClassName, PropertySheet, Width, Height ) local ctrl = vgui.Create( ClassName ) ctrl:SetSize( 300, 300 ) ctrl:SetModel( "models/props_junk/PlasticCrate01a.mdl" ) ctrl:GetEntity():SetSkin( 2 ) PropertySheet:AddSheet( ClassName, ctrl, nil, true, true ) end derma.DefineControl( "DModelPanel", "A panel containing a model", PANEL, "DButton" )