Added: Angle snapping now works in any direction

This commit is contained in:
Deyan Dobromirov 2018-04-15 13:23:08 +03:00
parent 0ced532077
commit 1d4efe2c4d
4 changed files with 38 additions and 33 deletions

View File

@ -35,7 +35,7 @@ local asmlib = trackasmlib
------ CONFIGURE ASMLIB ------
asmlib.InitBase("track","assembly")
asmlib.SetOpVar("TOOL_VERSION","5.438")
asmlib.SetOpVar("TOOL_VERSION","5.439")
asmlib.SetIndexes("V",1,2,3)
asmlib.SetIndexes("A",1,2,3)
asmlib.SetIndexes("S",4,5,6,7)
@ -260,7 +260,7 @@ if(CLIENT) then
asmlib.ConCommandPly(oPly, "anchor" , anchor)
asmlib.ConCommandPly(oPly, "igntype" , "0")
asmlib.ConCommandPly(oPly, "spnflat" , "0")
asmlib.ConCommandPly(oPly, "ydegsnp" , "45")
asmlib.ConCommandPly(oPly, "angsnap" , "45")
asmlib.ConCommandPly(oPly, "pointid" , "1")
asmlib.ConCommandPly(oPly, "pnextid" , "2")
asmlib.ConCommandPly(oPly, "spawncn" , "0")
@ -2897,8 +2897,8 @@ if(CLIENT) then -- con >> control, def >> deafault, hd >> header, lb >> label
asmlib.SetLocalify("en","tool."..gsToolNameL..".activrad_con" , "Active radius:")
asmlib.SetLocalify("en","tool."..gsToolNameL..".count" , "Maximum number of pieces to create while stacking")
asmlib.SetLocalify("en","tool."..gsToolNameL..".count_con" , "Pieces count:")
asmlib.SetLocalify("en","tool."..gsToolNameL..".ydegsnp" , "Snap the first piece spawned at this much degrees")
asmlib.SetLocalify("en","tool."..gsToolNameL..".ydegsnp_con" , "Yaw snap amount:")
asmlib.SetLocalify("en","tool."..gsToolNameL..".angsnap" , "Snap the first piece spawned at this much degrees")
asmlib.SetLocalify("en","tool."..gsToolNameL..".angsnap_con" , "Angular alignment:")
asmlib.SetLocalify("en","tool."..gsToolNameL..".resetvars" , "Click to reset the additional values")
asmlib.SetLocalify("en","tool."..gsToolNameL..".resetvars_con" , "V Reset variables V")
asmlib.SetLocalify("en","tool."..gsToolNameL..".nextpic" , "Additional origin angular pitch offset")
@ -2992,8 +2992,8 @@ if(CLIENT) then -- con >> control, def >> deafault, hd >> header, lb >> label
asmlib.SetLocalify("bg","tool."..gsToolNameL..".activrad_con" , "Активен радиус:")
asmlib.SetLocalify("bg","tool."..gsToolNameL..".count" , "Максимален брой парчета които може да се създадат при натрупване")
asmlib.SetLocalify("bg","tool."..gsToolNameL..".count_con" , "Брой парчета:")
asmlib.SetLocalify("bg","tool."..gsToolNameL..".ydegsnp" , "Залепете първото създадено парче на толкова градуса")
asmlib.SetLocalify("bg","tool."..gsToolNameL..".ydegsnp_con" , "Залепване по азимут:")
asmlib.SetLocalify("bg","tool."..gsToolNameL..".angsnap" , "Залепете първото създадено парче на толкова градуса")
asmlib.SetLocalify("bg","tool."..gsToolNameL..".angsnap_con" , "Ъглово подравняване:")
asmlib.SetLocalify("bg","tool."..gsToolNameL..".resetvars" , "Цъкнете за да нулирате допълнителните стойности")
asmlib.SetLocalify("bg","tool."..gsToolNameL..".resetvars_con" , "V Нулиране на променливите V")
asmlib.SetLocalify("bg","tool."..gsToolNameL..".nextpic" , "Допълнително отместване на началото по тангаж")
@ -3087,8 +3087,8 @@ if(CLIENT) then -- con >> control, def >> deafault, hd >> header, lb >> label
asmlib.SetLocalify("fr","tool."..gsToolNameL..".activrad_con" , "Rayon actif:")
asmlib.SetLocalify("fr","tool."..gsToolNameL..".count" , "Nombre maximum de pièces à créer pendant l'empilement")
asmlib.SetLocalify("fr","tool."..gsToolNameL..".count_con" , "Nombre de pièces:")
asmlib.SetLocalify("fr","tool."..gsToolNameL..".ydegsnp" , "Aligner la première pièce créée sur ce degré")
asmlib.SetLocalify("fr","tool."..gsToolNameL..".ydegsnp_con" , "Alignement du lacet:")
asmlib.SetLocalify("fr","tool."..gsToolNameL..".angsnap" , "Aligner la première pièce créée sur ce degré")
asmlib.SetLocalify("fr","tool."..gsToolNameL..".angsnap_con" , "Alignement angulaire:")
asmlib.SetLocalify("fr","tool."..gsToolNameL..".resetvars" , "Cliquez pour réinitialiser les valeurs supplémentaires")
asmlib.SetLocalify("fr","tool."..gsToolNameL..".resetvars_con" , "V Réinitialiser les variables V")
asmlib.SetLocalify("fr","tool."..gsToolNameL..".nextpic" , "Décalage angulaire supplémentaire sur la position initial du tangage")
@ -3182,8 +3182,8 @@ if(CLIENT) then -- con >> control, def >> deafault, hd >> header, lb >> label
asmlib.SetLocalify("ru","tool."..gsToolNameL..".activrad_con" , "Активный радиус:")
asmlib.SetLocalify("ru","tool."..gsToolNameL..".count" , "Максимальное количество куски для нагромождения")
asmlib.SetLocalify("ru","tool."..gsToolNameL..".count_con" , "Количество кусков:")
asmlib.SetLocalify("ru","tool."..gsToolNameL..".ydegsnp" , "Приклейте первый кусок созданный тем положением градусов")
asmlib.SetLocalify("ru","tool."..gsToolNameL..".ydegsnp_con" , "Приклеивание азимутом:")
asmlib.SetLocalify("ru","tool."..gsToolNameL..".angsnap" , "Приклейте первый кусок созданный тем положением градусов")
asmlib.SetLocalify("ru","tool."..gsToolNameL..".angsnap_con" , "Угловое выравнивание:")
asmlib.SetLocalify("ru","tool."..gsToolNameL..".resetvars" , "Нажмите чтобы сбросить дополнительные значения")
asmlib.SetLocalify("ru","tool."..gsToolNameL..".resetvars_con" , "V Сбросить переменные V")
asmlib.SetLocalify("ru","tool."..gsToolNameL..".nextpic" , "Дополнительный сдвиг начала тангажом")

View File

@ -3044,6 +3044,13 @@ function ProcessDSV(sDelim)
end
----------------------------- SNAPPING ------------------------------
local function GetSurfaceAngle(oPly, vNorm)
local vF = oPly:GetAimVector()
local vR = vF:Cross(vNorm); vF:Set(vNorm:Cross(vR))
return vF:AngleEx(vNorm)
end
--[[
* This function calculates the cross product normal angle of
* a player by a given trace. If the trace is missing it takes player trace
@ -3054,20 +3061,17 @@ end
* nYSnp > Yaw snap amount
]]--
function GetNormalAngle(oPly, stTrace, bSnap, nYSnp)
local aAng = Angle()
if(not IsPlayer(oPly)) then return aAng end
local nYSn = (tonumber(nYSnp) or 0)
local aAng, nYSn = Angle(), (tonumber(nYSnp) or 0); if(not IsPlayer(oPly)) then
return StatusLog(aAng,"GetNormalAngle: No player <"..tostring(oPly)..">", aAng) end
if(bSnap) then -- Snap to the surface
local stTr = stTrace
if(not (stTr and stTr.Hit)) then
local stTr = stTrace; if(not (stTr and stTr.Hit)) then
stTr = GetTracePly(oPly)
if(not (stTr and stTr.Hit)) then return aAng end
end
local vUp, vRg = stTr.HitNormal, oPly:GetRight()
aAng:Set(vUp:Cross(vRg):AngleEx(vUp))
end; aAng:Set(GetSurfaceAngle(oPly, stTr.HitNormal))
else aAng[caY] = oPly:GetAimVector():Angle()[caY] end
if(nYSn and (nYSn > 0) and (nYSn <= GetOpVar("MAX_ROTATION"))) then
aAng:SnapTo("yaw", nYSn) -- Snap player yaw, pitch and roll are not needed
-- Snap player yaw, pitch and roll are not needed
aAng:SnapTo("pitch", nYSn):SnapTo("yaw", nYSn):SnapTo("roll", nYSn)
end; return aAng
end

View File

@ -90,7 +90,7 @@ TOOL.ClientConVar = {
[ "anchor" ] = gsNoAnchor,
[ "igntype" ] = "0",
[ "spnflat" ] = "0",
[ "ydegsnp" ] = "45",
[ "angsnap" ] = "45",
[ "pointid" ] = "1",
[ "pnextid" ] = "2",
[ "nextpic" ] = "0",
@ -245,8 +245,8 @@ function TOOL:GetActiveRadius()
return mathClamp(self:GetClientNumber("activrad") or 0,0,asmlib.GetAsmVar("maxactrad", "FLT"))
end
function TOOL:GetYawSnap()
return mathClamp(self:GetClientNumber("ydegsnp"),0,gnMaxOffRot)
function TOOL:GetAngSnap()
return mathClamp(self:GetClientNumber("angsnap"),0,gnMaxOffRot)
end
function TOOL:GetForceLimit()
@ -459,7 +459,7 @@ function TOOL:GetStatus(stTrace,anyMessage,hdEnt)
sDu = sDu..sSpace.." HD.Mass: <"..tostring(self:GetMass())..">"..sDelim
sDu = sDu..sSpace.." HD.StackCNT: <"..tostring(self:GetCount())..">"..sDelim
sDu = sDu..sSpace.." HD.Freeze: <"..tostring(self:GetFreeze())..">"..sDelim
sDu = sDu..sSpace.." HD.YawSnap: <"..tostring(self:GetYawSnap())..">"..sDelim
sDu = sDu..sSpace.." HD.YawSnap: <"..tostring(self:GetAngSnap())..">"..sDelim
sDu = sDu..sSpace.." HD.Gravity: <"..tostring(self:GetGravity())..">"..sDelim
sDu = sDu..sSpace.." HD.Adviser: <"..tostring(self:GetAdviser())..">"..sDelim
sDu = sDu..sSpace.." HD.ForceLimit: <"..tostring(self:GetForceLimit())..">"..sDelim
@ -491,6 +491,7 @@ function TOOL:GetStatus(stTrace,anyMessage,hdEnt)
sDu = sDu..sSpace.." HD.MaxStackCnt: <"..tostring(asmlib.GetAsmVar("maxstcnt" ,"INT"))..">"..sDelim
sDu = sDu..sSpace.." HD.BoundErrMod: <"..tostring(asmlib.GetAsmVar("bnderrmod","STR"))..">"..sDelim
sDu = sDu..sSpace.." HD.MaxFrequent: <"..tostring(asmlib.GetAsmVar("maxfruse" ,"INT"))..">"..sDelim
sDu = sDu..sSpace.." HD.MaxTrMargin: <"..tostring(asmlib.GetAsmVar("maxtrmarg","FLT"))..">"..sDelim
sDu = sDu..sSpace.." HD.Anchor: {"..tostring(anEnt or gsNoAV).."}<"..tostring(aninfo)..">"..sDelim
sDu = sDu..sSpace.." HD.PointID: ["..tostring(pointid).."] >> ["..tostring(pnextid).."]"..sDelim
sDu = sDu..sSpace.." HD.AngOffsets: ["..tostring(nextx)..","..tostring(nexty)..","..tostring(nextz).."]"..sDelim
@ -527,7 +528,7 @@ function TOOL:LeftClick(stTrace)
local count = self:GetCount()
local ply = self:GetOwner()
local freeze = self:GetFreeze()
local ydegsnp = self:GetYawSnap()
local angsnap = self:GetAngSnap()
local gravity = self:GetGravity()
local elevpnt = self:GetElevation()
local nocollide = self:GetNoCollide()
@ -552,7 +553,7 @@ function TOOL:LeftClick(stTrace)
local nextpic, nextyaw, nextrol = self:GetAngOffsets()
if(stTrace.HitWorld) then -- Switch the tool mode ( Spawn )
local vPos = Vector(); vPos:Set(stTrace.HitPos)
local aAng = asmlib.GetNormalAngle(ply,stTrace,surfsnap,ydegsnp)
local aAng = asmlib.GetNormalAngle(ply,stTrace,surfsnap,angsnap)
if(spawncn) then -- Spawn on mass centre
aAng:RotateAroundAxis(aAng:Up() ,-nextyaw)
aAng:RotateAroundAxis(aAng:Right() , nextpic)
@ -786,9 +787,9 @@ function TOOL:UpdateGhost(ePiece, oPly)
local nextx, nexty, nextz = self:GetPosOffsets()
local nextpic, nextyaw, nextrol = self:GetAngOffsets()
if(stTrace.HitWorld) then
local ydegsnp = self:GetYawSnap()
local angsnap = self:GetAngSnap()
local surfsnap = self:GetSurfaceSnap()
local aAng = asmlib.GetNormalAngle(oPly,stTrace,surfsnap,ydegsnp)
local aAng = asmlib.GetNormalAngle(oPly,stTrace,surfsnap,angsnap)
if(self:GetSpawnCenter()) then
aAng:RotateAroundAxis(aAng:Up() ,-nextyaw)
aAng:RotateAroundAxis(aAng:Right() , nextpic)
@ -1049,11 +1050,11 @@ function TOOL:DrawHUD()
if(not self:GetDeveloperMode()) then return end
self:DrawTextSpawn(hudMonitor, "k","SURF",{"Trebuchet18"})
elseif(stTrace.HitWorld) then local nRad = nrad
local ydegsnp = self:GetYawSnap()
local angsnap = self:GetAngSnap()
local elevpnt = self:GetElevation()
local surfsnap = self:GetSurfaceSnap()
local workmode = self:GetWorkingMode()
local aAng = asmlib.GetNormalAngle(oPly,stTrace,surfsnap,ydegsnp)
local aAng = asmlib.GetNormalAngle(oPly,stTrace,surfsnap,angsnap)
if(self:GetSpawnCenter()) then -- Relative to MC
aAng:RotateAroundAxis(aAng:Up() ,-nextyaw)
aAng:RotateAroundAxis(aAng:Right() , nextpic)
@ -1333,8 +1334,8 @@ function TOOL.BuildCPanel(CPanel)
pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".activrad"))
pItem = CPanel:NumSlider(languageGetPhrase ("tool."..gsToolNameL..".count_con"), gsToolPrefL.."count" , 1, asmlib.GetAsmVar("maxstcnt" , "INT"), 0)
pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".count"))
pItem = CPanel:NumSlider(languageGetPhrase ("tool."..gsToolNameL..".ydegsnp_con"), gsToolPrefL.."ydegsnp", 0, gnMaxOffRot, 7)
pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".ydegsnp"))
pItem = CPanel:NumSlider(languageGetPhrase ("tool."..gsToolNameL..".angsnap_con"), gsToolPrefL.."angsnap", 0, gnMaxOffRot, 7)
pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".angsnap"))
pItem = CPanel:Button (languageGetPhrase ("tool."..gsToolNameL..".resetvars_con"), gsToolPrefL.."resetvars")
pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".resetvars"))
pItem = CPanel:NumSlider(languageGetPhrase ("tool."..gsToolNameL..".nextpic_con"), gsToolPrefL.."nextpic" , -gnMaxOffRot, gnMaxOffRot, 7)

View File

@ -66,7 +66,7 @@ about their track packs or in some other way. It is possible that missed someone
* Snapping/spawning with [custom user offsets](https://www.youtube.com/watch?v=e1IK2zJ_Djk)
* Snapping/spawning with zero pitch. Good for track leveling
* Snapping/spawning at the mass-center or the active point ( if checked )
* Snapping the first piece yaw to user defined angle
* Snapping the first piece angle to user defined value
* Snapping already spawned pieces by [using only the physgun](https://www.youtube.com/watch?v=BxMlZMMGHrs)
* Fast changing the active track ends ( Alt + mouse scroll ). Good switching turns direction
* Custom user defined active radius based snapping
@ -156,7 +156,7 @@ Will stack as many pieces as shown by the slider `Pieces count`.
5. Piece mass slider is used to set the mass of the next track piece to be spawned.
6. Active radius is used to set the minimum distance needed to select an active point when pointing at a piece.
7. Pieces count shows the maximum number of pieces to be stacked.
8. The `Yaw snap amount` slider is used to snap the first piece ( Requested by [Magnum](http://steamcommunity.com/profiles/76561198004847743) )
8. The `Angular alignment` slider is used to snap the first piece ( Requested by [Magnum](http://steamcommunity.com/profiles/76561198004847743) )
to a user-defined angle ( Usually 45 ) so that the track building process becomes easier. The
whole track build will be snapped also because you are building it relative to the first piece.
9. The force limit slider ( Requested by The Arbitor 90 ) defines the maximum force to be applied