diff --git a/lua/tardis/interiors/exteriors/legacy_exterior.lua b/lua/tardis/interiors/exteriors/legacy_exterior.lua index 9a8a5ac5f..1758ededa 100644 --- a/lua/tardis/interiors/exteriors/legacy_exterior.lua +++ b/lua/tardis/interiors/exteriors/legacy_exterior.lua @@ -6,6 +6,7 @@ local E = { Parts = { door = { + model = "models/drmatt/tardis/exterior/door.mdl", posoffset=Vector(-28,0,-54.6) } }, diff --git a/lua/tardis/screens/cl_screen_chameleon.lua b/lua/tardis/screens/cl_screen_chameleon.lua index 41efbf3a9..b2407731c 100644 --- a/lua/tardis/screens/cl_screen_chameleon.lua +++ b/lua/tardis/screens/cl_screen_chameleon.lua @@ -74,6 +74,10 @@ TARDIS:AddScreen("Chameleon", {id="chameleon", text="Screens.Chameleon", menu=fa panel:SetPos(2 * listW + 3 * gap, gap) panel:SetBackgroundColor(bgcolor) + local preview3D = vgui.Create("DAdjustableModelPanel", panel) + preview3D:SetSize(imS, imS) + preview3D:SetPos(gap3, gap2) + local preview = vgui.Create("DImage", panel) preview:SetSize(imS, imS) preview:SetPos(gap3, gap2) @@ -140,15 +144,80 @@ TARDIS:AddScreen("Chameleon", {id="chameleon", text="Screens.Chameleon", menu=fa local function select_exterior(id) change_id = id local icon = TARDIS:GetExteriorIcon(id) + local ext_data = TARDIS:CreateExteriorMetadata(id) - preview:SetVisible(icon ~= nil) - if icon then - preview:SetImage(icon) + if screen.is3D2D then -- 3D Preview doesnt work on 3D screens, so icon is used instead as a fallback + preview:SetVisible(icon ~= nil) + if icon then + preview:SetImage(icon) + end + else + preview3D:SetVisible(ext_data ~= nil) + if ext_data then + + local basemodel = ext_data.Model + local doormodel = ext_data.Parts.door.model or ext_data.Parts.door.Model -- case sensitive, some extensions have it capitalised, this can be done better but im not sure how + local doorpos = (ext_data.Portal.pos + ext_data.Parts.door.posoffset) + local textures + if ext_data.TextureSets then + textures = ext_data.TextureSets.normal + end + + preview3D:SetModel(basemodel) + + modelent = preview3D:GetEntity() + + local mn, mx = modelent:GetModelBounds() + local size = 0 + size = math.max( size, math.abs(mn.x) + math.abs(mx.x) ) + size = math.max( size, math.abs(mn.y) + math.abs(mx.y) ) + size = math.max( size, math.abs(mn.z) + math.abs(mx.z) ) + + preview3D:SetFOV( 30 ) -- these are set here so the camera resets when switching to a new exterior + preview3D:SetLookAng( Angle(5,193,0) ) + preview3D:SetCamPos( Vector( size*2.2, size/2, size/1.5 ) ) + + + if textures then -- Apply texturesets if they exist + local prefix = textures.prefix or "" + for i,v in ipairs(textures) do + if v[1] == "self" then + modelent:SetSubMaterial(v[2],prefix .. v[3]) + end + end + end + + if doormodel then + function preview3D:PostDrawModel( ent ) + door = ClientsideModel(doormodel) + door:SetPos(doorpos) + if textures then + local prefix = textures.prefix or "" + for i,v in ipairs(textures) do + if v[1] == "door" then + door:SetSubMaterial(v[2],prefix .. v[3]) + end + end + end + door:DrawModel() + door:Remove() + end + end + + function preview3D:LayoutEntity( ent ) + -- overrides the model constantly spinning + end + end end + end local function unselect_exterior() change_id = nil - preview:SetVisible(false) + if screen.is3D2D then + preview:SetVisible(false) + else + preview3D:SetVisible(false) + end end function list_categories:OnRowSelected(rowIndex, row)