INC_CLIENT()

SWEP.ViewModelFOV = 65
SWEP.ViewModelFlip = false

SWEP.ShowViewModel = false
SWEP.ShowWorldModel = false
SWEP.VElements = {
	["base++++"] = { type = "Model", model = "models/gibs/glass_shard02.mdl", bone = "ValveBiped.Bip01_Spine4", rel = "base", pos = Vector(-30.751, -0.101, -5.35), angle = Angle(-169.978, 0, 90), size = Vector(1.149, 0.651, 0.5), color = Color(45, 145, 255, 255), surpresslightning = false, material = "models/shadertest/shader2", skin = 0, bodygroup = {} },
	["base+++++"] = { type = "Model", model = "models/gibs/glass_shard05.mdl", bone = "ValveBiped.Bip01_Spine4", rel = "base", pos = Vector(-22.646, -0.11, -5.762), angle = Angle(14.866, 0, 90), size = Vector(0.952, 0.847, 0.4), color = Color(45, 145, 255, 255), surpresslightning = false, material = "models/shadertest/shader2", skin = 0, bodygroup = {} },
	["base++++++"] = { type = "Model", model = "models/gibs/glass_shard06.mdl", bone = "ValveBiped.Bip01_Spine4", rel = "base", pos = Vector(-26.855, -0.12, -0.797), angle = Angle(132.593, 0, 90), size = Vector(0.813, 1.879, 0.449), color = Color(45, 145, 255, 255), surpresslightning = false, material = "models/shadertest/shader2", skin = 0, bodygroup = {} },
	["base++"] = { type = "Model", model = "models/props_wasteland/rockcliff01g.mdl", bone = "ValveBiped.Bip01_Spine4", rel = "base", pos = Vector(35.922, 0.632, 1.478), angle = Angle(1.037, 86.152, 93.763), size = Vector(0.03, 0.037, 0.021), color = Color(255, 255, 255, 255), surpresslightning = false, material = "models/props_foliage/driftwood_01a", skin = 0, bodygroup = {} },
	["base"] = { type = "Model", model = "models/props_foliage/driftwood_01a.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "", pos = Vector(4.473, 1.353, -12.9), angle = Angle(93.541, 15.888, -27.748), size = Vector(0.14, 0.059, 0.059), color = Color(236, 234, 233, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
	["base+++++++"] = { type = "Model", model = "models/props_pipes/concrete_pipe001a.mdl", bone = "ValveBiped.Bip01_Spine4", rel = "base", pos = Vector(-26.306, -0.119, 0.578), angle = Angle(62.902, 0, 0), size = Vector(0.014, 0.041, 0.059), color = Color(255, 255, 255, 255), surpresslightning = false, material = "models/props_pipes/guttermetal01a", skin = 0, bodygroup = {} },
	["base+"] = { type = "Model", model = "models/props_foliage/driftwood_01a.mdl", bone = "ValveBiped.Bip01_Spine4", rel = "base", pos = Vector(22.452, 0.104, -0.147), angle = Angle(0.186, -1.838, 2.183), size = Vector(0.07, 0.075, 0.071), color = Color(89, 69, 57, 255), surpresslightning = false, material = "models/props_c17/chairchrome01", skin = 0, bodygroup = {} },
	["base+++"] = { type = "Model", model = "models/props_wasteland/rockgranite04b.mdl", bone = "ValveBiped.Bip01_Spine4", rel = "base", pos = Vector(-27.06, -0.257, 0.49), angle = Angle(55.191, 1.259, 180), size = Vector(0.016, 0.014, 0.021), color = Color(255, 255, 255, 255), surpresslightning = false, material = "models/props_foliage/driftwood_01a", skin = 0, bodygroup = {} }
}
SWEP.DVElements = SWEP.VElements

SWEP.WElements = {
	["base+++++"] = { type = "Model", model = "models/gibs/glass_shard05.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "base", pos = Vector(-20.38, -0.099, -5.185), angle = Angle(14.866, 0, 90), size = Vector(0.856, 0.762, 0.36), color = Color(45, 145, 255, 255), surpresslightning = false, material = "models/shadertest/shader2", skin = 0, bodygroup = {} },
	["base+++"] = { type = "Model", model = "models/props_wasteland/rockgranite04b.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "base", pos = Vector(-24.354, -0.232, 0.441), angle = Angle(55.191, 1.259, 180), size = Vector(0.014, 0.013, 0.018), color = Color(255, 255, 255, 255), surpresslightning = false, material = "models/props_foliage/driftwood_01a", skin = 0, bodygroup = {} },
	["base++++++"] = { type = "Model", model = "models/gibs/glass_shard06.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "base", pos = Vector(-24.17, -0.109, -0.717), angle = Angle(132.593, 0, 90), size = Vector(0.731, 1.692, 0.405), color = Color(45, 145, 255, 255), surpresslightning = false, material = "models/shadertest/shader2", skin = 0, bodygroup = {} },
	["base"] = { type = "Model", model = "models/props_foliage/driftwood_01a.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "", pos = Vector(3.296, 1.764, -12.671), angle = Angle(85.412, 40.909, -21.896), size = Vector(0.126, 0.054, 0.054), color = Color(236, 234, 233, 255), surpresslightning = false, material = "", skin = 0, bodygroup = {} },
	["base++"] = { type = "Model", model = "models/props_wasteland/rockcliff01g.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "base", pos = Vector(32.328, 0.568, 1.33), angle = Angle(1.037, 86.152, 93.763), size = Vector(0.027, 0.032, 0.018), color = Color(255, 255, 255, 255), surpresslightning = false, material = "models/props_foliage/driftwood_01a", skin = 0, bodygroup = {} },
	["base+++++++"] = { type = "Model", model = "models/props_pipes/concrete_pipe001a.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "base", pos = Vector(-23.674, -0.106, 0.521), angle = Angle(62.902, 0, 0), size = Vector(0.012, 0.037, 0.054), color = Color(255, 255, 255, 255), surpresslightning = false, material = "models/props_pipes/guttermetal01a", skin = 0, bodygroup = {} },
	["base+"] = { type = "Model", model = "models/props_foliage/driftwood_01a.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "base", pos = Vector(20.207, 0.093, -0.132), angle = Angle(0.186, -1.838, 2.183), size = Vector(0.063, 0.067, 0.064), color = Color(89, 69, 57, 255), surpresslightning = false, material = "models/props_c17/chairchrome01", skin = 0, bodygroup = {} },
	["base++++"] = { type = "Model", model = "models/gibs/glass_shard02.mdl", bone = "ValveBiped.Bip01_R_Hand", rel = "base", pos = Vector(-27.675, -0.091, -4.816), angle = Angle(-169.978, 0, 90), size = Vector(1.034, 0.584, 0.449), color = Color(45, 145, 255, 255), surpresslightning = false, material = "models/shadertest/shader2", skin = 0, bodygroup = {} }
}
SWEP.DWElements = SWEP.WElements

local ghostlerp = 0
function SWEP:GetViewModelPosition(pos, ang)
	local owner = self:GetOwner()
	if self:IsSwinging() then
		local rot = self.SwingRotation
		local offset = self.SwingOffset
		local armdelay = owner:GetMeleeSpeedMul()
		local swingtime = (self:IsCharging() and self.SwingTimeSecondary or self.SwingTime) * (owner.MeleeSwingDelayMul or 1) * armdelay

		ang = Angle(ang.pitch, ang.yaw, ang.roll) -- Copy

		local swingend = self:GetSwingEnd()
		local delta = swingtime - math.Clamp(swingend - CurTime(), 0, swingtime)
		local power = CosineInterpolation(0, 1, delta / swingtime)

		if power >= 0.9 then
			power = (1 - power) ^ 0.4 * 2
		end

		pos = pos + offset.x * power * ang:Right() + offset.y * power * ang:Forward() + offset.z * power * ang:Up()

		ang:RotateAroundAxis(ang:Right(), rot.pitch * power)
		ang:RotateAroundAxis(ang:Up(), rot.yaw * power)
		ang:RotateAroundAxis(ang:Forward(), rot.roll * power)
	end

	if owner:GetBarricadeGhosting() then
		ghostlerp = math.min(1, ghostlerp + FrameTime() * 4)
	elseif ghostlerp > 0 then
		ghostlerp = math.max(0, ghostlerp - FrameTime() * 5)
	end

	if ghostlerp > 0 then
		pos = pos + 3.5 * ghostlerp * ang:Up()
		ang:RotateAroundAxis(ang:Right(), -30 * ghostlerp)
	end

	return pos, ang
end


function SWEP:PreDrawViewModel(vm)
	self.BaseClass.PreDrawViewModel(self, vm)

	for mdl, tab in pairs(self.VElements) do
		tab.material = self:IsCharging() and "models/shiny" or self.DVElements[mdl].material
		tab.color = self:IsCharging() and Color(255, 255, 255, 255) or self.DVElements[mdl].color
	end
end

function SWEP:DrawWorldModel()
	self.BaseClass.DrawWorldModel(self)

	for mdl, tab in pairs(self.WElements) do
		tab.material = self:IsCharging() and "models/shiny" or self.DWElements[mdl].material
		tab.color = self:IsCharging() and Color(255, 255, 255, 255) or self.DWElements[mdl].color
	end

	local owner = self:GetOwner()
	if owner:IsValid() and not owner.ShadowMan then

		local boneindex = owner:LookupBone("valvebiped.bip01_r_hand")
		if boneindex then
			local pos, ang = owner:GetBonePosition(boneindex)
			if pos then
				if self:IsCharging() then
					local rdelta = math.min(0.5, CurTime() - self:GetCharge())

					local force = rdelta * 140
					local resist = force * 0.5

					pos = pos + ang:Up() * -32

					local curvel = owner:GetVelocity() * 0.5
					local emitter = ParticleEmitter(pos)
					emitter:SetNearClip(24, 48)

					for i=1, math.min(16, math.ceil(FrameTime() * 200)) do
						local particle = emitter:Add("particle/snow", pos)
						particle:SetVelocity(curvel + VectorRand():GetNormalized() * force)
						particle:SetDieTime(0.5)
						particle:SetStartAlpha(rdelta * 125 + 15)
						particle:SetEndAlpha(0)
						particle:SetStartSize(1)
						particle:SetEndSize(rdelta * 10 + 4)
						particle:SetAirResistance(resist)
					end
					emitter:Finish() emitter = nil collectgarbage("step", 64)
				end
			end
		end
	end
end
