Hi everyone. im trying to code a 3D scope for some of my weapons. I want to make it kind of like a zoomed-in render target, but i honestly dont have half a clue how im going to code it.
Anyone have any suggestions or tips?
Use a render target, convert to material, create poly in the shape of the circle.
Similar to how gangwars has it’s 3D radar, you can look at how they do it.
I have the render target material and everything, but i dont know how to make a poly or make it a circle. Can you give me an example of code?
[lua]
local Radar = {}
Radar.Targets = {}
// Create map object
local RadarMaps = {}
// Make maps
// Flatgrass
local tmap = {}
tmap.name = “gm_flatgrass”
tmap.texture = surface.GetTextureID(“radar/gw_downtown”);
tmap.minx = -13600
tmap.maxx = 7800
tmap.miny = 17331
tmap.maxy = -4600
RadarMaps[tmap.name] = tmap
// Downtown
local tmap = {}
tmap.name = “gw_downtown_v3”
tmap.texture = surface.GetTextureID(“radar/rpw_downtown_v3”);
tmap.minx = -3600
tmap.maxx = 5900
tmap.miny = 5400
tmap.maxy = -4200
RadarMaps[tmap.name] = tmap
// Cityway
local tmap = {}
tmap.name = “rp_cityway_v1”
tmap.texture = surface.GetTextureID(“radar/rp_cityway_v1”);
tmap.minx = -14700
tmap.maxx = 4200
tmap.miny = 17900
tmap.maxy = -950
RadarMaps[tmap.name] = tmap
// Crime city
local tmap = {}
tmap.name = “gw_crimecity_rc”
tmap.texture = surface.GetTextureID(“radar/gw_crimecity_rc”);
tmap.minx = -11049
tmap.maxx = 13673
tmap.miny = 12542
tmap.maxy = -11895
RadarMaps[tmap.name] = tmap
// left (x, y, z)
// -10975.9580 2833.7151 546.2639]
// right
// 4852.1069 158.8308 -88.1052
// bottom
// -5074.4663 -8886.6885 176.7886
// top
// -5.4860 6800.8823 227.4823
// GangWars Downtown
local tmap = {}
tmap.name = “gw_downtown_beta_v5”
tmap.texture = surface.GetTextureID(“radar/gw_downtown”);
tmap.minx = -10975 + 4600
tmap.maxx = 4852 + 4600
tmap.miny = 6800
tmap.maxy = -8886
RadarMaps[tmap.name] = tmap
// pick radar map
function SetRadarMap()
local map = string.lower(game.GetMap( ))
if RadarMaps[map] then
Radar.map = RadarMaps[map]
Msg("Set radar map for "..map.."
")
else
Msg("ERROR! Could not find an appropriate radar map
")
end
end
hook.Add(“InitPostEntity”, “SetRadarMap”, SetRadarMap)
// props
/*
RadarTarget = {}
RadarTarget.func = function()
local List = {}
List = ents.FindByClass(“prop_physics”)
for k,v in pairs(List) do
v.icon = surface.GetTextureID( “gui/silkicons/anchor” )
end
return List
end
table.insert(Radar.Targets, RadarTarget)
*/
// NPC target
RadarTarget = {}
RadarTarget.func = function(targ)
local List = {}
List = ents.FindByClass(“npc_*”)
for k,v in pairs(List) do
v.icon = surface.GetTextureID( “gui/silkicons/user” )
if v.RadarName then v.text = v:RadarName() end
end
return List
end
table.insert(Radar.Targets, RadarTarget)
// Building target
RadarTarget = {}
RadarTarget.func = function(targ)
local List = {}
List = ents.FindByClass(“building”)
for k,v in pairs(List) do
v.icon = surface.GetTextureID( “radar/gw_house” )
//if ValidEntity(v) then v.text = v:GetNWString(“name”) end
end
return List
end
table.insert(Radar.Targets, RadarTarget)
// Territory target
RadarTarget = {}
RadarTarget.func = function(targ)
local List = {}
List = ents.FindByClass(“gang_territory”)
for k,v in pairs(List) do
v.icon = surface.GetTextureID( “gui/silkicons/shield” )
end
return List
end
table.insert(Radar.Targets, RadarTarget)
// Mission pickup target
RadarTarget = {}
RadarTarget.func = function(targ)
local List = {}
List = GangWars.CLPickups
for k,v in pairs(List) do
v.icon = surface.GetTextureID( “gui/silkicons/star” )
end
return List
end
table.insert(Radar.Targets, RadarTarget)
// Contraband Target
RadarTarget = {}
RadarTarget.func = function(targ)
local List = ScannerContraband
if List then
for k,v in pairs(List) do
v.icon = surface.GetTextureID( “gui/silkicons/bomb” )
end
end
return List
end
table.insert(Radar.Targets, RadarTarget)
// Player targets
RadarTarget = {}
RadarTarget.func = function(targ)
local LP = LocalPlayer()
local List2 = {}
local List = ents.FindByClass(“player”)
for k,v in pairs(List) do
if ValidEntity(v) and v:IsPlayer() and not v:GetNWBool(“cloaked”) then
// Police see wanted players
if (LP:Team() == TEAM_POLICE or LP:Team() == TEAM_CHIEF) and v:GetNWBool("wanted") then
v.icon = surface.GetTextureID( "gui/silkicons/exclamation" )
v.text = v:Nick()
table.insert(List2, v)
end
// Hitman sees his target
if (LP:Team() == TEAM_HITMAN) and LP:GetNWInt("hit_target") == v:UniqueID() then
v.icon = surface.GetTextureID( "gui/silkicons/exclamation" )
v.text = "TARGET"
table.insert(List2, v)
end
// Targets see hitman
if LP:GetNWInt("hitman_id") == v:UniqueID() then
v.icon = surface.GetTextureID( "gui/silkicons/exclamation" )
v.text = "HITMAN"
table.insert(List2, v)
end
// People see gang members
if LP:GetNWString("gang_name") == v:GetNWString("gang_name") and v != LP then
v.icon = surface.GetTextureID( "gui/silkicons/emoticon_smile" )
v.text = v:Nick()
table.insert(List2, v)
end
end
end
return List2
end
table.insert(Radar.Targets, RadarTarget)
// load materials
Radar.background = surface.GetTextureID(“gangwars/hud2/radar_base”);
Radar.deagle = surface.GetTextureID(“gangwars/hud2/hit”);
Radar.lights = {}
Radar.lights[1] = surface.GetTextureID(“gangwars/hud2/want_off”);
Radar.lights[2] = surface.GetTextureID(“gangwars/hud2/want_redon”);
Radar.lights[3] = surface.GetTextureID(“gangwars/hud2/want_blueon”);
Radar.lights[4] = surface.GetTextureID(“gangwars/hud2/want_allon”);
Radar.light = 1
Radar.hazard = {}
Radar.hazard[1] = surface.GetTextureID(“gangwars/hud2/hazard_1”);
Radar.hazard[2] = surface.GetTextureID(“gangwars/hud2/hazard_2”);
Radar.hazard[3] = surface.GetTextureID(“gangwars/hud2/hazard_3”);
Radar.hazard[4] = surface.GetTextureID(“gangwars/hud2/hazard_4”);
Radar.hazard[5] = surface.GetTextureID(“gangwars/hud2/hazard_5”);
Radar.hazard[6] = surface.GetTextureID(“gangwars/hud2/hazard_6”);
Radar.hazard[7] = surface.GetTextureID(“gangwars/hud2/hazard_off”);
Radar.haz_anim = 7
Radar.lastSeekTime = CurTime();
// size of radar on screen
Radar.radarRadius = 100;
// position of radar on screen
Radar.radarPos = {
x = 99;
y = 99;
}
// zoom for radar
Radar.zoom = 0.1
// circle polygon data
Radar.circle= {}
Radar.res = 32
for i=1,Radar.res do
Radar.circle* = {}
Radar.circle*.x = Radar.radarPos.x + math.cos(math.rad( (i360)/Radar.res ))Radar.radarRadius0.99
Radar.circle.y = Radar.radarPos.y + math.sin(math.rad( (i360)/Radar.res ))Radar.radarRadius0.99
Radar.circle.u = (math.cos(math.rad( (i360)/Radar.res )) + 1)0.5
Radar.circle.v = -(math.sin(math.rad( (i360)/Radar.res )) + 1)*0.5
end
local function normalizeMapPos(pos)
// limit pos to inside map
pos.x = math.Clamp(pos.x, Radar.map.minx, Radar.map.maxx)
pos.y = math.Clamp(pos.y, Radar.map.maxy, Radar.map.miny)
// normalize pos
pos.x = (pos.x - Radar.map.minx) / (Radar.map.maxx - Radar.map.minx)
pos.y = (pos.y - Radar.map.miny) / (Radar.map.maxy - Radar.map.miny)
return pos
end
local function calcCircle()
local orient = LocalPlayer():EyeAngles().y + 270
local pos = normalizeMapPos( LocalPlayer():GetPos() )
for i=1,Radar.res do
Radar.circle*.u = ( (math.cos(math.rad( -orient + (i*360)/Radar.res )) ) * Radar.zoom ) + (pos.x)
Radar.circle*.v = ( (math.sin(math.rad( -orient + (i*360)/Radar.res )) ) * Radar.zoom ) + (pos.y)
end
end
// Radar think
local lightsTimer = CurTime()
local hazardTimer = CurTime()
local function RadarThink()
if ( CurTime() > Radar.lastSeekTime + 2 ) then
Radar.lastSeekTime = CurTime();
for k, v in pairs(Radar.Targets) do
v.List = v.func()
end
end
// animate hazard
if LocalPlayer():GetNWBool("hazard") then
if hazardTimer < CurTime() then
Radar.haz_anim = Radar.haz_anim + 1
if Radar.haz_anim > 7 then Radar.haz_anim = 1 end
hazardTimer = CurTime() + 0.1
end
else
Radar.haz_anim = 7
end
if LocalPlayer():GetNWBool("wanted") then
if lightsTimer < CurTime() then
Radar.light = Radar.light + 1
if Radar.light > 4 then Radar.light = 1 end
lightsTimer = CurTime() + 0.1
end
else
Radar.light = 1
end
end
hook.Add( “Think”, “RadarThink”, RadarThink )
// Renders a radar blip
function Radar:AddBlip(obj, target)
if not obj or not ValidEntity(obj) then return end
// find angle to blip
local diff = obj:GetPos() - LocalPlayer():GetPos();
diff.z = 0;
/*
local targAng = diff:Angle();
targAng.y = LocalPlayer():EyeAngles().y + 270
diff = targAng:Forward() * Radar.radarRadius * rat;
diff.y = diff.y * -1;
diff.x = diff.x + Radar.radarPos.x;
diff.y = diff.y + Radar.radarPos.y;
*/
// get normalized player & blip pos, multiply to get actual pixels
local ppos = normalizeMapPos( LocalPlayer():GetPos() ) * (Radar.radarRadius / Radar.zoom)
local bpos = normalizeMapPos( obj:GetPos() ) * (Radar.radarRadius / Radar.zoom)
// find difference
local diff = bpos - ppos
diff.z = 0
// see if difference is > radius
if diff:Length2D() < Radar.radarRadius-4 then
// rotate
diff:Rotate(Angle(0,LocalPlayer():EyeAngles().y+270, 0))
// render
local QuadTable = {}
QuadTable.texture = obj.icon
QuadTable.color = Color( 255, 255, 255, 255 )
QuadTable.x = (Radar.radarPos.x - 8) + diff.x
QuadTable.y = (Radar.radarPos.y - 8) + diff.y
QuadTable.w = 16
QuadTable.h = 16
draw.TexturedQuad( QuadTable )
// render label
local name = obj.text
// radarname function can override target text
if obj.RadarName then name = obj:RadarName() end
if name then
table.insert( Radar.textcache, {text=name, pos = diff} )
//draw.SimpleText(name, "ScoreboardText", (Radar.radarPos.x) + diff.x + 16, (Radar.radarPos.y) + diff.y, Color(255,255,255,255), TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER)
end
end
end
local RLP = LocalPlayer()
local function DrawRadar()
// calculate texture coordinates on the radar
calcCircle()
// render polygon
surface.SetTexture(Radar.map.texture)
surface.SetDrawColor(255, 255, 255, 255)
surface.DrawPoly(Radar.circle)
// reset text cache
Radar.textcache = {}
// render blips
for k, targ in pairs( Radar.Targets ) do
if targ.List then
for x,v in pairs( targ.List ) do
Radar:AddBlip( v, targ )
end
end
end
// render radar hud graphic
local QuadTable = {}
QuadTable.texture = Radar.background
QuadTable.color = Color( 255, 255, 255, 255 )
QuadTable.x = 0
QuadTable.y = 0
QuadTable.w = 256
QuadTable.h = 256
draw.TexturedQuad( QuadTable )
// render wanted lights
local QuadTable = {}
QuadTable.texture = Radar.lights[Radar.light]
QuadTable.color = Color( 255, 255, 255, 255 )
QuadTable.x = 0
QuadTable.y = 0
QuadTable.w = 256
QuadTable.h = 256
draw.TexturedQuad( QuadTable )
// render hazard sign
local QuadTable = {}
QuadTable.texture = Radar.hazard[Radar.haz_anim]
QuadTable.color = Color( 255, 255, 255, 255 )
QuadTable.x = 0
QuadTable.y = 0
QuadTable.w = 256
QuadTable.h = 256
draw.TexturedQuad( QuadTable )
// render hitman graphic
if LocalPlayer():GetNWInt("hitman_id") != 0 then
local QuadTable = {}
QuadTable.texture = Radar.deagle
QuadTable.color = Color( 255, 255, 255, 255 )
QuadTable.x = 68
QuadTable.y = 197
QuadTable.w = 128
QuadTable.h = 16
draw.TexturedQuad( QuadTable )
end
// render labels
for k,v in pairs(Radar.textcache) do
draw.SimpleText(v.text, "ScoreboardText", (Radar.radarPos.x) + v.pos.x + 16, (Radar.radarPos.y) + v.pos.y, Color(255,255,255,255), TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER)
end
end
hook.Add( “HUDPaint”, “GangWarsRadar”, DrawRadar )
[/lua]
All credits go to Mercior when you’re done.
surface.SetTexture(Radar.map.texture)
surface.SetDrawColor(255, 255, 255, 255)
surface.DrawPoly(Radar.circle)
Surface is for huds and such. How can i make this a 3D entity to go where the scope model is on my gun?
[editline]21st September 2012[/editline]
oh. Okay, This is what i have so far:
[lua]
if CLIENT then
function SWEP:DrawHUD()
local Radar = {}
Radar.circle= {}
Radar.res = 32
Radar.radarRadius = 1000;
Radar.radarPos = {
x = 99;
y = 99;
}
for i=1,Radar.res do
Radar.circle* = {}
Radar.circle*.x = Radar.radarPos.x + math.cos(math.rad( (i360)/Radar.res ))Radar.radarRadius0.99
Radar.circle.y = Radar.radarPos.y + math.sin(math.rad( (i360)/Radar.res ))Radar.radarRadius0.99
Radar.circle.u = (math.cos(math.rad( (i360)/Radar.res )) + 1)0.5
Radar.circle.v = -(math.sin(math.rad( (i360)/Radar.res )) + 1)*0.5
end
cam.Start3D()
local pos, ang = self:GetViewModelPosition()
surface.SetTexture(“negrs”)
surface.SetDrawColor(255, 255, 255, 255)
surface.DrawPoly(Radar.circle)
cam.End3D()
end
end
[/lua]
draws a huge screwed up looking thing wherever you are, and doesn’t parent to your viewmodel at all.
Edit: GetViewModelPosition apparently doesn’t work, Changed the scale to 100, now it draws a circle in the middle of the map. On a print test, GetViewModelPosition returns “nil nil”, While the function is defined in my base as a ironsights function. Still returns nothing.
[editline]21st September 2012[/editline]
[lua]
SWEP:ViewModelDrawn()
old = render.GetRenderTarget( )
ply = LocalPlayer()
–ang2 = ang - aim
–ang:RotateAroundAxis(ang:Up(), -ang2.y)
CamData = {}
CamData.angles = ang
CamData.origin = ply:GetShootPos()
CamData.x = 0
CamData.y = 0
CamData.w = 512
CamData.h = 512
CamData.fov = 4
CamData.drawviewmodel = false
CamData.drawhud = false
--render.SetRenderTarget( self.AcogRT )
render.SetViewPort( 0, 0, 512, 512 )
cam.Start2D()
render.RenderView(CamData)
//surface.SetDrawColor(255, 255, 255, 255) -- for GMod 13
//surface.SetTexture(ScopeTexture)
//surface.DrawTexturedRect(-256, -256, 1024, 1024)
cam.End2D()
render.SetViewPort( 0, 0, ScrW( ), ScrH( ) )
render.SetRenderTarget( old )
end
[/lua]
Taken from LEETNOOB’s Customizeable Weaponry.
Crashes the game as soon as i spawn the weapon.
-snip-