A 3D Scope - How Do?

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( (i
360)/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( (i
360)/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-