From bf03077e218b05996dd354c4a827ce5d02387de9 Mon Sep 17 00:00:00 2001 From: FuzzyLeo Date: Thu, 1 Jan 2026 15:36:33 +0000 Subject: [PATCH 1/8] preview exterior in 3D when in the popout --- lua/tardis/screens/cl_screen_chameleon.lua | 50 ++++++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/lua/tardis/screens/cl_screen_chameleon.lua b/lua/tardis/screens/cl_screen_chameleon.lua index 41efbf3a9..360f06c1a 100644 --- a/lua/tardis/screens/cl_screen_chameleon.lua +++ b/lua/tardis/screens/cl_screen_chameleon.lua @@ -74,6 +74,11 @@ TARDIS:AddScreen("Chameleon", {id="chameleon", text="Screens.Chameleon", menu=fa panel:SetPos(2 * listW + 3 * gap, gap) panel:SetBackgroundColor(bgcolor) + local preview3D = vgui.Create("DModelPanel", panel) + preview3D:SetSize(imS, imS) + preview3D:SetPos(gap3, gap2) + + local preview = vgui.Create("DImage", panel) preview:SetSize(imS, imS) preview:SetPos(gap3, gap2) @@ -140,11 +145,50 @@ 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 = ext:ChangeExteriorMetadata(id) + + if screen.is3D2D then + 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 + local doorpos = (ext_data.Portal.pos + ext_data.Parts.door.posoffset) + + PrintTable(ext_data) + + preview3D:SetModel(basemodel) + local mn, mx = preview3D.Entity:GetRenderBounds() + 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( 45 ) + preview3D:SetCamPos( Vector( size, size, size ) ) + preview3D:SetLookAt( (mn + mx) * 0.5 ) + + if doormodel then + function preview3D:PostDrawModel( ent ) + door = ClientsideModel(doormodel) + door:SetPos(doorpos) + door:DrawModel() + door:Remove() + end + end + + function preview3D:LayoutEntity( ent ) + -- do nothing + end - preview:SetVisible(icon ~= nil) - if icon then - preview:SetImage(icon) + end end + end local function unselect_exterior() change_id = nil From 48c98896cd48ba0968d1917ebc4a1e47c1d7c95f Mon Sep 17 00:00:00 2001 From: FuzzyLeo Date: Thu, 1 Jan 2026 16:02:09 +0000 Subject: [PATCH 2/8] fixed texturesets --- lua/tardis/screens/cl_screen_chameleon.lua | 30 +++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/lua/tardis/screens/cl_screen_chameleon.lua b/lua/tardis/screens/cl_screen_chameleon.lua index 360f06c1a..8fd344b36 100644 --- a/lua/tardis/screens/cl_screen_chameleon.lua +++ b/lua/tardis/screens/cl_screen_chameleon.lua @@ -159,11 +159,17 @@ TARDIS:AddScreen("Chameleon", {id="chameleon", text="Screens.Chameleon", menu=fa 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 local doorpos = (ext_data.Portal.pos + ext_data.Parts.door.posoffset) + local textures + if ext_data.TextureSets then + textures = ext_data.TextureSets.normal + end - PrintTable(ext_data) - + --PrintTable(ext_data) preview3D:SetModel(basemodel) - local mn, mx = preview3D.Entity:GetRenderBounds() + + modelent = preview3D.Entity + + local mn, mx = modelent:GetRenderBounds() 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) ) @@ -173,10 +179,28 @@ TARDIS:AddScreen("Chameleon", {id="chameleon", text="Screens.Chameleon", menu=fa preview3D:SetCamPos( Vector( size, size, size ) ) preview3D:SetLookAt( (mn + mx) * 0.5 ) + if textures then + 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]) + print(prefix .. v[3]) + end + end + end door:DrawModel() door:Remove() end From a1937e6ee98a0521a93c4d9e71fea28223bd1983 Mon Sep 17 00:00:00 2001 From: FuzzyLeo Date: Thu, 1 Jan 2026 16:02:30 +0000 Subject: [PATCH 3/8] removed debug print --- lua/tardis/screens/cl_screen_chameleon.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/lua/tardis/screens/cl_screen_chameleon.lua b/lua/tardis/screens/cl_screen_chameleon.lua index 8fd344b36..7fb4a2ee5 100644 --- a/lua/tardis/screens/cl_screen_chameleon.lua +++ b/lua/tardis/screens/cl_screen_chameleon.lua @@ -197,7 +197,6 @@ TARDIS:AddScreen("Chameleon", {id="chameleon", text="Screens.Chameleon", menu=fa for i,v in ipairs(textures) do if v[1] == "door" then door:SetSubMaterial(v[2],prefix .. v[3]) - print(prefix .. v[3]) end end end From ab16e5885201ae3139e6d00f41a5c8c05a50c308 Mon Sep 17 00:00:00 2001 From: FuzzyLeo Date: Thu, 1 Jan 2026 17:15:05 +0000 Subject: [PATCH 4/8] door model should be listed for compatibility with new chameleon circuit menu, realistically it should probably be listed here anyway --- lua/tardis/interiors/exteriors/legacy_exterior.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/tardis/interiors/exteriors/legacy_exterior.lua b/lua/tardis/interiors/exteriors/legacy_exterior.lua index 9a8a5ac5f..601b3028a 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) } }, From a657e2872eecf0f70c7c85e0068792cf2879a01c Mon Sep 17 00:00:00 2001 From: FuzzyLeo Date: Thu, 1 Jan 2026 17:15:28 +0000 Subject: [PATCH 5/8] improvements, made model preview adjustable --- lua/tardis/screens/cl_screen_chameleon.lua | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/lua/tardis/screens/cl_screen_chameleon.lua b/lua/tardis/screens/cl_screen_chameleon.lua index 7fb4a2ee5..c8838d708 100644 --- a/lua/tardis/screens/cl_screen_chameleon.lua +++ b/lua/tardis/screens/cl_screen_chameleon.lua @@ -74,11 +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("DModelPanel", panel) + 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) @@ -167,17 +166,19 @@ TARDIS:AddScreen("Chameleon", {id="chameleon", text="Screens.Chameleon", menu=fa --PrintTable(ext_data) preview3D:SetModel(basemodel) - modelent = preview3D.Entity + modelent = preview3D:GetEntity() - local mn, mx = modelent:GetRenderBounds() + 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( 45 ) - preview3D:SetCamPos( Vector( size, size, size ) ) - preview3D:SetLookAt( (mn + mx) * 0.5 ) + preview3D:SetFOV( 30 ) + preview3D:SetLookAng( Angle(5,193,0) ) + --preview3D:SetCamPos( Vector( size, size, size ) ) + preview3D:SetCamPos( Vector( size*2.2, size/2, size/1.5 ) ) + if textures then local prefix = textures.prefix or "" @@ -204,7 +205,7 @@ TARDIS:AddScreen("Chameleon", {id="chameleon", text="Screens.Chameleon", menu=fa door:Remove() end end - + preview3D:Refresh() function preview3D:LayoutEntity( ent ) -- do nothing end From 5b5bba42efc1af17717b4f71d1d65e0b0b26c26d Mon Sep 17 00:00:00 2001 From: FuzzyLeo Date: Thu, 1 Jan 2026 17:17:38 +0000 Subject: [PATCH 6/8] forgot a fuckin comma --- lua/tardis/interiors/exteriors/legacy_exterior.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/tardis/interiors/exteriors/legacy_exterior.lua b/lua/tardis/interiors/exteriors/legacy_exterior.lua index 601b3028a..1758ededa 100644 --- a/lua/tardis/interiors/exteriors/legacy_exterior.lua +++ b/lua/tardis/interiors/exteriors/legacy_exterior.lua @@ -6,7 +6,7 @@ local E = { Parts = { door = { - model = "models/drmatt/tardis/exterior/door.mdl" + model = "models/drmatt/tardis/exterior/door.mdl", posoffset=Vector(-28,0,-54.6) } }, From 0ac3600e3723c9d356461869655a3df61a8ab268 Mon Sep 17 00:00:00 2001 From: FuzzyLeo Date: Thu, 1 Jan 2026 17:25:43 +0000 Subject: [PATCH 7/8] tweaks --- lua/tardis/screens/cl_screen_chameleon.lua | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/lua/tardis/screens/cl_screen_chameleon.lua b/lua/tardis/screens/cl_screen_chameleon.lua index c8838d708..674a43fb6 100644 --- a/lua/tardis/screens/cl_screen_chameleon.lua +++ b/lua/tardis/screens/cl_screen_chameleon.lua @@ -146,7 +146,7 @@ TARDIS:AddScreen("Chameleon", {id="chameleon", text="Screens.Chameleon", menu=fa local icon = TARDIS:GetExteriorIcon(id) local ext_data = ext:ChangeExteriorMetadata(id) - if screen.is3D2D then + 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) @@ -156,7 +156,7 @@ TARDIS:AddScreen("Chameleon", {id="chameleon", text="Screens.Chameleon", menu=fa 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 + 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 @@ -174,13 +174,12 @@ TARDIS:AddScreen("Chameleon", {id="chameleon", text="Screens.Chameleon", menu=fa 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 ) + 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, size, size ) ) preview3D:SetCamPos( Vector( size*2.2, size/2, size/1.5 ) ) - if textures then + 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 @@ -205,11 +204,10 @@ TARDIS:AddScreen("Chameleon", {id="chameleon", text="Screens.Chameleon", menu=fa door:Remove() end end - preview3D:Refresh() + function preview3D:LayoutEntity( ent ) - -- do nothing + -- overrides the model constantly spinning end - end end From 8c81d10fdd4f4d4709a4a111d24abeaa06f8b2e1 Mon Sep 17 00:00:00 2001 From: FuzzyLeo Date: Thu, 1 Jan 2026 17:48:04 +0000 Subject: [PATCH 8/8] USED THE WRONG FUNCTION all good now --- lua/tardis/screens/cl_screen_chameleon.lua | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lua/tardis/screens/cl_screen_chameleon.lua b/lua/tardis/screens/cl_screen_chameleon.lua index 674a43fb6..b2407731c 100644 --- a/lua/tardis/screens/cl_screen_chameleon.lua +++ b/lua/tardis/screens/cl_screen_chameleon.lua @@ -144,7 +144,7 @@ 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 = ext:ChangeExteriorMetadata(id) + local ext_data = TARDIS:CreateExteriorMetadata(id) if screen.is3D2D then -- 3D Preview doesnt work on 3D screens, so icon is used instead as a fallback preview:SetVisible(icon ~= nil) @@ -163,7 +163,6 @@ TARDIS:AddScreen("Chameleon", {id="chameleon", text="Screens.Chameleon", menu=fa textures = ext_data.TextureSets.normal end - --PrintTable(ext_data) preview3D:SetModel(basemodel) modelent = preview3D:GetEntity() @@ -214,7 +213,11 @@ TARDIS:AddScreen("Chameleon", {id="chameleon", text="Screens.Chameleon", menu=fa 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)