188 lines
4.2 KiB
Lua
188 lines
4.2 KiB
Lua
local defaultColors = { Color(255,255,255), Color(255,255,255), Color(0,0,0), Color(255,255,255) }
|
|
|
|
local PANEL = {}
|
|
|
|
function PANEL:Init()
|
|
|
|
self:Dock(FILL)
|
|
self.vRawCamPos = Vector()
|
|
self.tgtLookAngle = Angle()
|
|
self.camPos = Vector(200, 400, 50)
|
|
|
|
end
|
|
|
|
function PANEL:SetVehicle(vehID, data)
|
|
|
|
data = data or {}
|
|
|
|
local cdData = carDealer.vehicles[vehID]
|
|
if not cdData then return end
|
|
|
|
self.vehID = vehID
|
|
|
|
local spData = list.Get('simfphys_vehicles')[cdData.simfphysID]
|
|
assert(spData ~= nil, 'Wrong simfphysID for ' .. vehID)
|
|
|
|
self:Cleanup()
|
|
local default = cdData.default
|
|
|
|
self:SetModel(spData.Model)
|
|
local ent = self.Entity
|
|
ent:SetPos(-ent:OBBCenter() + (cdData.previewOffset or Vector()))
|
|
ent:SetAngles(Angle(0, cdData.SpawnAngleOffset or spData.SpawnAngleOffset or 0, 0))
|
|
local cols = default and default.col or defaultColors
|
|
self.Entity:SetProxyColors({ cols[1], cols[2], CFG.reflectionTint, cols[4] })
|
|
self.Entity:SetSkin(default and default.skin or 0)
|
|
carDealer.attachWheels(ent, vehID, data.data)
|
|
self:SetCamPos(self.camPos)
|
|
self.vRawCamPos = self.camPos
|
|
self:SetLookAng((-self.camPos):Angle())
|
|
self.tgtLookAngle = self.aLookAngle
|
|
self:SetFOV((cdData.customFOV or 30) * (self.fovMultiplier or 1))
|
|
|
|
for k, v in pairs(default and default.bg or {}) do
|
|
ent:SetBodygroup(k, v)
|
|
end
|
|
|
|
local status = data.data
|
|
if status then
|
|
local ent = self.Entity
|
|
if status.col then
|
|
self.Entity:SetProxyColors({ status.col[1], status.col[2], CFG.reflectionTint, status.col[4] })
|
|
end
|
|
if status.skin then ent:SetSkin(status.skin) end
|
|
if status.bg then
|
|
for k, v in pairs(status.bg) do
|
|
ent:SetBodygroup(k, v)
|
|
end
|
|
end
|
|
|
|
if status.atts then
|
|
carDealer.attachAccessories(ent, status.atts)
|
|
end
|
|
end
|
|
local mats = status and status.mats or default and default.mats or {}
|
|
for k, v in pairs(mats) do
|
|
self.Entity:SetSubMaterial(k-1, v)
|
|
end
|
|
|
|
self.viewOffset = cdData.previewOffset or self.viewOffset or Vector()
|
|
if self.camOffset then
|
|
local off = self.camOffset
|
|
self.vCamPos = self.vRawCamPos +
|
|
self.aLookAngle:Right() * off.x +
|
|
self.aLookAngle:Forward() * off.y +
|
|
self.aLookAngle:Up() * off.z
|
|
end
|
|
|
|
end
|
|
|
|
function PANEL:FirstPersonControls()
|
|
|
|
if not self.canControl then return end
|
|
|
|
local x, y = self:CaptureMouse()
|
|
local scale = self:GetFOV() / 180
|
|
x = x * -0.5 * scale
|
|
y = y * 0.5 * scale
|
|
|
|
if self.MouseKey == MOUSE_LEFT then
|
|
self:SetCursor('blank')
|
|
self.tgtLookAngle = self.tgtLookAngle + Angle(y * 4, x * 4, 0)
|
|
self.tgtLookAngle.p = math.Clamp(self.tgtLookAngle.p, -25, 25)
|
|
end
|
|
|
|
end
|
|
|
|
function PANEL:Think()
|
|
|
|
self.BaseClass.Think(self)
|
|
|
|
if self.canControl and IsValid(self.Entity) and self.aLookAngle ~= self.tgtLookAngle then
|
|
self.aLookAngle = LerpAngle(FrameTime() * 8, self.aLookAngle, self.tgtLookAngle)
|
|
|
|
local pos = self.Entity:OBBCenter() - self.viewOffset
|
|
self.vRawCamPos = pos - self.aLookAngle:Forward() * (pos - self.vRawCamPos):Length()
|
|
|
|
if self.camOffset then
|
|
local off = self.camOffset
|
|
self.vCamPos = self.vRawCamPos +
|
|
self.aLookAngle:Right() * off.x +
|
|
self.aLookAngle:Forward() * off.y +
|
|
self.aLookAngle:Up() * off.z
|
|
else
|
|
self.vCamPos = self.vRawCamPos
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
function PANEL:OnMouseReleased(k)
|
|
|
|
self.BaseClass.OnMouseReleased(self, k)
|
|
self:SetCursor('hand')
|
|
|
|
end
|
|
|
|
function PANEL:OnMouseWheeled()
|
|
-- prevent baseclass function
|
|
end
|
|
|
|
function PANEL:LayoutEntity()
|
|
-- prevent baseclass function
|
|
end
|
|
|
|
function PANEL:PostDrawModel(ent)
|
|
|
|
if ent.wheels then
|
|
render.SetColorModulation(1, 1, 1)
|
|
for _, w in ipairs(ent.wheels) do
|
|
w:DrawModel()
|
|
end
|
|
end
|
|
|
|
if ent.atts then
|
|
for _, a in ipairs(ent.atts) do
|
|
local col = a:GetColor()
|
|
render.SetColorModulation(col.r / 255, col.g / 255, col.b / 255)
|
|
a:DrawModel()
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
function PANEL:FixPosition()
|
|
|
|
local pos = self.Entity:OBBCenter() - (self.viewOffset or vector_zero)
|
|
self.vCamPos = pos - self.aLookAngle:Forward() * (pos - self.vCamPos):Length()
|
|
|
|
end
|
|
|
|
function PANEL:Cleanup()
|
|
|
|
local ent = self.Entity
|
|
if IsValid(ent) then
|
|
if ent.wheels then
|
|
for _, w in ipairs(ent.wheels) do
|
|
w:Remove()
|
|
end
|
|
end
|
|
|
|
if ent.atts then
|
|
for _, a in ipairs(ent.atts) do
|
|
a:Remove()
|
|
end
|
|
end
|
|
|
|
ent:Remove()
|
|
end
|
|
|
|
end
|
|
|
|
function PANEL:OnRemove()
|
|
|
|
self:Cleanup()
|
|
|
|
end
|
|
|
|
vgui.Register('cd_vehModel', PANEL, 'DAdjustableModelPanel')
|