Added more screens. (#2551)

* Add files via upload

* Add files via upload

* Lots more monitors

* Add files via upload

* Add character lcd

* Update init.lua

* More console/lcd special characters

* New font, and hi res screens.

Github dif broke
changed files:
textscreen cl_init
consolescreen cl_init
digitalscreen cl_init
oscilloscope entity
egp cl_init
wiremonitors.lua
gpulib

increased RT size to 1024
added a font from https://mdileo.tripod.com/utilities.html

This may break some things.

* LCD models by fasteroid ! !

* More lcd models

16x4
40x4

* Use matrices instead of looping through an array

* One more because i felt like it

20x4 added

* Update cl_init.lua

* Update cl_init.lua

* Interactive props

* Update cl_init.lua

* Make digital screen better

* Fix tabs

Changed tabs into double spaces.

* FIx tabs (again)

* Refactor

* Fix potential issue

* Make only certain values floor

* Made cursor drawing independent of rest of drawing

* Some fixes

---------

Co-authored-by: thegrb93 <grbrown93@sbcglobal.net>
This commit is contained in:
relt-1 2023-05-30 16:51:15 +02:00 committed by GitHub
parent 7d69fbaf24
commit f7a9706627
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
47 changed files with 2115 additions and 456 deletions

View File

@ -84,6 +84,8 @@ if SERVER then
if CreateConVar("wire_force_workshop", 1, {FCVAR_ARCHIVE}, "Should Wire force all clients to download the Workshop edition of Wire, for models? (requires restart to disable)"):GetBool() then if CreateConVar("wire_force_workshop", 1, {FCVAR_ARCHIVE}, "Should Wire force all clients to download the Workshop edition of Wire, for models? (requires restart to disable)"):GetBool() then
resource.AddWorkshop("160250458") resource.AddWorkshop("160250458")
end end
resource.AddFile("resource/fonts/alphalcd.ttf")
end end
-- shared includes -- shared includes
@ -129,6 +131,7 @@ if CLIENT then
include("wire/client/rendertarget_fix.lua") include("wire/client/rendertarget_fix.lua")
include("wire/client/hlzasm/hc_compiler.lua") include("wire/client/hlzasm/hc_compiler.lua")
include("wire/client/customspawnmenu.lua") include("wire/client/customspawnmenu.lua")
end end

View File

@ -0,0 +1,548 @@
include("shared.lua")
function ENT:Initialize()
local mem = {}
self.Memory = mem
for i = 0, 1023 do
mem[i] = 0
end
-- Screen control:
-- [1003] - Background red
-- [1004] - Background green
-- [1005] - Background blue
-- [1006] - Text red
-- [1007] - Text green
-- [1008] - Text blue
-- [1009] - Width
-- [1010] - Height
-- Character control:
-- [1011] - Write char at cursor (Writing puts character and shifts)
--
-- Caching control:
-- [1012] - Force cache refresh
-- [1013] - Cached blocks size (up to 28, 0 if disabled)
--
--
-- Shifting control:
-- [1014] - Shift cursor 1:backwards 0:forwards
-- [1015] - Shift screen with cursor
--
-- Character output control:
-- [1016] - Contrast
--
-- Control registers:
-- [1017] - Hardware Clear Row (Writing clears row)
-- [1018] - Hardware Clear Screen
--
-- Cursor control:
-- [1019] - Cursor Blink Rate (0.50)
-- [1020] - Cursor Size (0.25)
-- [1021] - Cursor Address
-- [1022] - Cursor Enabled
--
-- [1023] - Clk
mem[1003] = 148
mem[1004] = 178
mem[1005] = 15
mem[1006] = 45
mem[1007] = 91
mem[1008] = 45
mem[1012] = 0
mem[1013] = 0
mem[1014] = 0
mem[1015] = 0
mem[1016] = 1
mem[1017] = 0
mem[1018] = 0
mem[1019] = 0.5
mem[1020] = 0.25
mem[1021] = 0
mem[1022] = 1
mem[1023] = 1
self.IntTimer = 0
self.Flash = false
self.GPU = WireGPU(self)
mem[1009] = 16
mem[1010] = 2
-- Setup caching
GPULib.ClientCacheCallback(self,function(Address,Value)
self:WriteCell(Address,Value)
end)
WireLib.netRegister(self)
end
function ENT:OnRemove()
self.GPU:Finalize()
end
function ENT:ReadCell(Address,value)
return self.Memory[math.floor(Address)]
end
function ENT:ShiftScreenRight()
local mem = self.Memory
for y=0,mem[1010]-1 do
for x=mem[1009]-1,1,-1 do
mem[x+y*mem[1009]] = mem[x+y*mem[1009]-1]
end
mem[y*mem[1009]] = 0
end
end
function ENT:ShiftScreenLeft()
local mem = self.Memory
for y=0,mem[1010]-1 do
for x=0,mem[1009]-2 do
mem[x+y*mem[1009]] = mem[x+y*mem[1009]+1]
end
mem[y*mem[1009]+mem[1009]-1] = 0
end
end
function ENT:WriteCell(Address,value)
Address = math.floor(Address)
if Address < 0 or Address >= 1024 then return false end
if value ~= value then return false end
local mem = self.Memory
if Address == 1009 then -- Screen width
value = math.floor(value)
if (value*mem[1010] > 1003 or value*18 > 1024) then return false end
elseif Address == 1010 then -- Screen height
value = math.floor(value)
if (value*mem[1009] > 1003 or value*24 > 1024) then return false end
elseif Address == 1011 then -- Write char at cursor
value = math.floor(value)
if mem[1015] >= 1 then
if mem[1014] >= 1 then
self:ShiftScreenRight()
else
self:ShiftScreenLeft()
end
mem[mem[1021]%(mem[1010]*mem[1009])] = value
else
mem[mem[1021]%(mem[1010]*mem[1009])] = value
if mem[1014] >= 1 then
mem[1021] = (mem[1021] - 1)%(mem[1010]*mem[1009])
else
mem[1021] = (mem[1021] + 1)%(mem[1010]*mem[1009])
end
end
elseif Address == 1017 then
value = math.floor(value)
if value<0 or value >= mem[1010] then return false end
for i = 0, mem[1009]-1 do
mem[value*mem[1009]+i] = 0
end
elseif Address == 1018 then
for i = 0, mem[1009]*mem[1010]-1 do
mem[i] = 0
end
elseif Address == 1021 then
value = math.floor(value)%(mem[1010]*mem[1009])
end
mem[Address] = value
return true
end
local specialCharacters = {
[128] = {
{ x = 0, y = 1 },
{ x = 1, y = 1 },
{ x = 1, y = 0 },
},
[129] = {
{ x = 0, y = 1 },
{ x = 0, y = 0 },
{ x = 1, y = 1 },
},
[130] = {
{ x = 0, y = 1 },
{ x = 1, y = 0 },
{ x = 0, y = 0 },
},
[131] = {
{ x = 0, y = 0 },
{ x = 1, y = 0 },
{ x = 1, y = 1 },
},
[132] = {
{ x = 0, y = 0 },
{ x = 0.5, y = 0 },
{ x = 0.5, y = 0.5 },
{ x = 0, y = 0.5 },
},
[133] = {
{ x = 0.5, y = 0 },
{ x = 1, y = 0 },
{ x = 1, y = 0.5 },
{ x = 0.5, y = 0.5 },
},
[134] = {
{ x = 0, y = 0 },
{ x = 1, y = 0 },
{ x = 1, y = 0.5 },
{ x = 0, y = 0.5 },
},
[135] = {
{ x = 0, y = 0.5 },
{ x = 0.5, y = 0.5 },
{ x = 0.5, y = 1 },
{ x = 0, y = 1 },
},
[136] = {
{ x = 0, y = 0 },
{ x = 0.5, y = 0 },
{ x = 0.5, y = 1 },
{ x = 0, y = 1 },
},
[137] = {
{ x = 0.5, y = 0.5 },
{ x = 0.5, y = 0 },
{ x = 1, y = 0 },
{ x = 1, y = 0.5 },
{ x = 0.5, y = 0.5 },
{ x = 0.5, y = 1 },
{ x = 0, y = 1 },
{ x = 0, y = 0.5 },
},
[138] = {
{ x = 0, y = 0 },
{ x = 1, y = 0 },
{ x = 1, y = 0.5 },
{ x = 0.5, y = 0.5 },
{ x = 0.5, y = 1 },
{ x = 0, y = 1 },
},
[139] = {
{ x = 0.5, y = 0.5 },
{ x = 1, y = 0.5 },
{ x = 1, y = 1 },
{ x = 0.5, y = 1 },
},
[140] = {
{ x = 0.5, y = 0.5 },
{ x = 1, y = 0.5 },
{ x = 1, y = 1 },
{ x = 0.5, y = 1 },
{ x = 0.5, y = 0.5 },
{ x = 0, y = 0.5 },
{ x = 0, y = 0 },
{ x = 0.5, y = 0 },
},
[141] = {
{ x = 0.5, y = 0 },
{ x = 1, y = 0 },
{ x = 1, y = 1 },
{ x = 0.5, y = 1 },
},
[142] = {
{ x = 1, y = 0 },
{ x = 1, y = 1 },
{ x = 0.5, y = 1 },
{ x = 0.5, y = 0.5 },
{ x = 0, y = 0.5},
{ x = 0, y = 0 },
},
[143] = {
{ x = 0, y = 0.5 },
{ x = 1, y = 0.5 },
{ x = 1, y = 1 },
{ x = 0, y = 1 },
},
[144] = {
{ x = 0, y = 1 },
{ x = 0, y = 0 },
{ x = 0.5, y = 0 },
{ x = 0.5, y = 0.5 },
{ x = 1, y = 0.5 },
{ x = 1, y = 1 },
},
[145] = {
{ x = 1, y = 1 },
{ x = 0, y = 1 },
{ x = 0, y = 0.5 },
{ x = 0.5, y = 0.5 },
{ x = 0.5, y = 0 },
{ x = 1, y = 0 },
},
[146] = {
{ x = 0, y = 0 },
{ x = 1, y = 0 },
{ x = 1, y = 1 },
{ x = 0, y = 1 },
},
[147] = {
{ x = 0.33, y = 0.66 },
{ x = 0.33, y = 0 },
{ x = 0.66, y = 0 },
{ x = 0.66, y = 0.33 },
{ x = 1, y = 0.33 },
{ x = 1, y = 0.66 },
},
[148] = {
{ x = 0.33, y = 0},
{ x = 0.66, y = 0},
{ x = 0.66, y = 1},
{ x = 0.33, y = 1},
},
[149] = {
{ x = 0.66, y = 0.66 },
{ x = 0, y = 0.66 },
{ x = 0, y = 0.33 },
{ x = 0.33, y = 0.33 },
{ x = 0.33, y = 0 },
{ x = 0.66, y = 0 },
},
[150] = {
{ x = 0, y = 0.33},
{ x = 1, y = 0.33},
{ x = 1, y = 0.66},
{ x = 0, y = 0.66},
},
[151] = {
{ x = 0.66, y = 0.33 },
{ x = 1, y = 0.33 },
{ x = 1, y = 0.66 },
{ x = 0, y = 0.66 },
{ x = 0, y = 0.33 },
{ x = 0.33, y = 0.33 },
{ x = 0.33, y = 0 },
{ x = 0.66, y = 0 },
},
[152] = {
{ x = 0.66, y = 0.33 },
{ x = 1, y = 0.33 },
{ x = 1, y = 0.66 },
{ x = 0.66, y = 0.66 },
{ x = 0.66, y = 1 },
{ x = 0.33, y = 1 },
{ x = 0.33, y = 0 },
{ x = 0.66, y = 0 },
},
[153] = {
{ x = 0.66, y = 0.66 },
{ x = 1, y = 0.66 },
{ x = 1, y = 0.33 },
{ x = 0, y = 0.33 },
{ x = 0, y = 0.66 },
{ x = 0.33, y = 0.66 },
{ x = 0.33, y = 1 },
{ x = 0.66, y = 1 },
},
[154] = {
{ x = 0.33, y = 0.33 },
{ x = 0, y = 0.33 },
{ x = 0, y = 0.66 },
{ x = 0.33, y = 0.66 },
{ x = 0.33, y = 1 },
{ x = 0.66, y = 1 },
{ x = 0.66, y = 0 },
{ x = 0.33, y = 0 },
},
[155] = {
{ x = 0.66, y = 0.33 },
{ x = 1, y = 0.33 },
{ x = 1, y = 0.66 },
{ x = 0.66, y = 0.66 },
{ x = 0.66, y = 1 },
{ x = 0.33, y = 1 },
{ x = 0.33, y = 0.66 },
{ x = 0, y = 0.66 },
{ x = 0, y = 0.33 },
{ x = 0.33, y = 0.33 },
{ x = 0.33, y = 0 },
{ x = 0.66, y = 0 },
},
[156] = {
{ x = 0.33, y = 0 },
{ x = 0.66, y = 0 },
{ x = 0.66, y = 0.33 },
{ x = 0.33, y = 0.33 },
},
[157] = {
{ x = 0.66, y = 0.33 },
{ x = 1, y = 0.33 },
{ x = 1, y = 0.66 },
{ x = 0.66, y = 0.66 },
},
[158] = {
{ x = 0.33, y = 0.66 },
{ x = 0.66, y = 0.66 },
{ x = 0.66, y = 1 },
{ x = 0.33, y = 1 },
},
[159] = {
{ x = 0, y = 0.33 },
{ x = 0.33, y = 0.33 },
{ x = 0.33, y = 0.66 },
{ x = 0, y = 0.66 },
},
[160] = {
{ x = 0.33, y = 0.33 },
{ x = 0.66, y = 0.33 },
{ x = 0.66, y = 0.66 },
{ x = 0.33, y = 0.66 },
}
}
function ENT:DrawSpecialCharacter(c,x,y,w,h,r,g,b)
surface.SetDrawColor(r,g,b,255)
surface.SetTexture(0)
local vertices = specialCharacters[c]
if vertices then
local tf = Matrix() tf:SetScale(Vector(w, h, 1)) tf:SetTranslation(Vector(x, y, 0))
cam.PushModelMatrix(tf, true)
surface.DrawPoly(vertices)
cam.PopModelMatrix()
end
end
function ENT:Draw()
self:DrawModel()
local szx = 18
local szy = 24
local mem = self.Memory
if mem[1023] >= 1 then
mem[1023] = 0
self.GPU:RenderToGPU(function()
-- Draw terminal here
-- W/H = 16
local bc = math.min(1,math.max(0,mem[1016]-1.8))
local br = (1-bc)*mem[1003]+bc*mem[1006]
local bg = (1-bc)*mem[1004]+bc*mem[1007]
local bb = (1-bc)*mem[1005]+bc*mem[1008]
local sqc = math.min(1,math.max(0,mem[1016]-0.9))
local sqr = (1-sqc)*mem[1003]+sqc*mem[1006]
local sqg = (1-sqc)*mem[1004]+sqc*mem[1007]
local sqb = (1-sqc)*mem[1005]+sqc*mem[1008]
local fc = math.min(1,math.max(sqc,mem[1016]))
local fr = (1-fc)*mem[1003]+fc*mem[1006]
local fg = (1-fc)*mem[1004]+fc*mem[1007]
local fb = (1-fc)*mem[1005]+fc*mem[1008]
surface.SetDrawColor(br,bg,bb,255)
surface.DrawRect(0,0,1024,1024)
for ty = 0, mem[1010]-1 do
for tx = 0, mem[1009]-1 do
local a = tx + ty*mem[1009]
--if (self.Flash == true) then
-- fb,bb = bb,fb
-- fg,bg = bg,fg
-- fr,br = br,fr
--end
local c1 = mem[a]
if c1 >= 2097152 then c1 = 0 end
if c1 < 0 then c1 = 0 end
surface.SetDrawColor(sqr,sqg,sqb,255)
surface.DrawRect((tx)*szx+1,(ty)*szy+1,szx-2,szy-2)
surface.SetDrawColor(sqr,sqg,sqb,127)
surface.DrawRect((tx)*szx+2,(ty)*szy+2,szx-2,szy-2)
if (c1 ~= 0) then
-- Note: the source engine does not handle unicode characters above 65535 properly.
local utf8 = ""
if c1 <= 127 then
utf8 = string.char (c1)
elseif c1 < 2048 then
utf8 = string.format("%c%c", 192 + math.floor (c1 / 64), 128 + (c1 % 64))
elseif c1 < 65536 then
utf8 = string.format("%c%c%c", 224 + math.floor (c1 / 4096), 128 + (math.floor (c1 / 64) % 64), 128 + (c1 % 64))
elseif c1 < 2097152 then
utf8 = string.format("%c%c%c%c", 240 + math.floor (c1 / 262144), 128 + (math.floor (c1 / 4096) % 64), 128 + (math.floor (c1 / 64) % 64), 128 + (c1 % 64))
end
if specialCharacters[c1] then
self:DrawSpecialCharacter(
c1, (tx)*szx+1, (ty)*szy+1, szx-1, szy-1,
fr,fg,fb
)
else
draw.DrawText(
utf8,
"LCDFontBlur",
tx * szx + 2, ty * szy,
Color(fr,fg,fb,255),0
)
draw.DrawText(
utf8,
"LCDFont",
tx * szx + 1, ty * szy -1 ,
Color(fr,fg,fb,255),0
)
end
end
end
end
end)
end
self.GPU:Render(0,0,1024,1024,nil,-(1024-mem[1009]*szx)/1024,-(1024-mem[1010]*szy)/1024)
if mem[1022] >= 1 then
self.IntTimer = self.IntTimer + FrameTime()
if self.IntTimer >= mem[1019] then
if self.IntTimer >= mem[1019]*2 then
self.IntTimer = (self.IntTimer - mem[1019]*2) % math.max(mem[1019]*2,0.01)
else
self.GPU:RenderToWorld(mem[1009]*szx, mem[1010]*szy, function()
local a = math.floor(mem[1021])
local tx = a - math.floor(a / mem[1009])*mem[1009]
local ty = math.floor(a / mem[1009])
local sqc = math.min(1,math.max(0,mem[1016]-0.9))
local fc = math.min(1,math.max(sqc,mem[1016]))
local fr = (1-fc)*mem[1003]+fc*mem[1006]
local fg = (1-fc)*mem[1004]+fc*mem[1007]
local fb = (1-fc)*mem[1005]+fc*mem[1008]
surface.SetDrawColor(
fr,
fg,
fb,
255
)
surface.DrawRect(
(tx)*szx+1,
(ty)*szy+szy*(1-mem[1020]),
szx-2,
szy*mem[1020]
)
end, nil, true)
end
end
end
Wire_Render(self)
end
function ENT:IsTranslucent()
return true
end

View File

@ -0,0 +1,180 @@
AddCSLuaFile("cl_init.lua")
AddCSLuaFile("shared.lua")
include('shared.lua')
ENT.WireDebugName = "CharacterLcdScreen"
function ENT:Initialize()
self:PhysicsInit(SOLID_VPHYSICS)
self:SetMoveType(MOVETYPE_VPHYSICS)
self:SetSolid(SOLID_VPHYSICS)
self.Inputs = WireLib.CreateInputs(self, { "CharAddress", "Char (ASCII/Unicode)", "Contrast", "Clk", "Reset" })
self.Outputs = WireLib.CreateOutputs(self, { "Memory" })
self.Memory = {}
for i = 0, 1023 do
self.Memory[i] = 0
end
self.CharAddress = 0
self.Char = 0
self.CharParam = 0
self.Memory[1009] = 16
self.Memory[1010] = 2
self.Memory[1012] = 0
self.Memory[1013] = 0
self.Memory[1014] = 0
self.Memory[1015] = 0
self.Memory[1016] = 1
self.Memory[1017] = 0
self.Memory[1018] = 0
self.Memory[1019] = 0.5
self.Memory[1020] = 0.25
self.Memory[1021] = 0
self.Memory[1022] = 1
self.ScreenWidth = 16
self.ScreenHeight = 2
self.Cache = GPUCacheManager(self,true)
end
function ENT:Setup(ScreenWidth, ScreenHeight, bgred,bggreen,bgblue,fgred,fggreen,fgblue)
self:WriteCell(1010, tonumber(ScreenHeight) or 2)
self:WriteCell(1009, tonumber(ScreenWidth) or 16)
self:WriteCell(1008, tonumber(fgblue) or 45)
self:WriteCell(1007, tonumber(fggreen) or 91)
self:WriteCell(1006, tonumber(fgred) or 45)
self:WriteCell(1005, tonumber(bgblue) or 15)
self:WriteCell(1004, tonumber(bggreen) or 178)
self:WriteCell(1003, tonumber(bgred) or 148)
end
function ENT:SendPixel()
if (self.Memory[1023] ~= 0) and (self.CharAddress >= 0) and (self.CharAddress < self.ScreenWidth*self.ScreenHeight) then
local pixelno = math.floor(self.CharAddress)
self:WriteCell(pixelno, self.Char)
end
end
function ENT:ReadCell(Address)
Address = math.floor(Address)
if Address < 0 then return nil end
if Address >= 1024 then return nil end
return self.Memory[Address]
end
function ENT:WriteCell(Address, value)
Address = math.floor(Address)
if Address < 0 then return false end
if Address >= 1024 then return false end
if Address < 1003 then -- text/attribute data
if self.Memory[Address] == value then return true end
else
if Address == 1009 and value*self.ScreenHeight < 1003 and value*18 <= 1024 then
self.ScreenWidth = value
end
if Address == 1010 and value*self.ScreenWidth < 1003 and value*24 <= 1024 then
self.ScreenHeight = value
end
-- self.Memory[Address] = value
self:ClientWriteCell(Address, value)
-- self.Cache:WriteNow(Address, value)
-- return true
end
self.Memory[Address] = value
self.Cache:Write(Address,value)
return true
end
function ENT:Think()
self.Cache:Flush()
self:NextThink(CurTime()+0.1)
return true
end
function ENT:Retransmit(ply)
self.Cache:Flush()
for address,value in pairs(self.Memory) do
self.Cache:Write(address,value)
end
self.Cache:Flush(ply)
end
function ENT:TriggerInput(iname, value)
if iname == "CharAddress" then
self.CharAddress = value
self:WriteCell(1021, value)
elseif iname == "Char" then
self.Char = value
self:WriteCell(1011,value)
elseif iname == "Contrast" then
self.Contrast = value
self:WriteCell(1016, self.Contrast)
elseif iname == "Clk" then
self:WriteCell(1023, value)
self:SendPixel()
elseif iname == "Reset" then
self:WriteCell(1018,0)
end
end
function ENT:ShiftScreenRight()
for y=0,self.ScreenHeight-1 do
for x=self.ScreenWidth-1,1 do
self.Memory[x+y*self.ScreenWidth] = self.Memory[x+y*self.ScreenWidth-1]
end
self.Memory[y*self.ScreenWidth] = 0
end
end
function ENT:ShiftScreenLeft()
for y=0,self.ScreenHeight-1 do
for x=0,self.ScreenWidth-2 do
self.Memory[x+y*self.ScreenWidth] = self.Memory[x+y*self.ScreenWidth+1]
end
self.Memory[y*self.ScreenWidth+self.ScreenWidth-1] = 0
end
end
function ENT:ClientWriteCell(Address, value)
if Address == 1009 and (value*self.Memory[1010] > 1003 or value*18 > 1024) then return false end
if Address == 1010 and (value*self.Memory[1009] > 1003 or value*24 > 1024) then return false end
if Address == 1011 then
if self.Memory[1015] >= 1 then
if self.Memory[1014] >= 1 then
self:ShiftScreenRight()
else
self:ShiftScreenLeft()
end
self.Memory[self.Memory[1021]] = value
else
self.Memory[self.Memory[1021]] = value
if self.Memory[1014] >= 1 then
self.Memory[1021] = math.max(0,self.Memory[1021] - 1)
else
self.Memory[1021] = math.min(1023,self.Memory[1021] + 1)
end
end
end
if Address == 1017 then
for i = 0, self.ScreenWidth-1 do
self.Memory[value*self.ScreenWidth+i] = 0
end
self.NeedRefresh = true
end
if Address == 1018 then
for i = 0, self.ScreenWidth*self.ScreenHeight-1 do
self.Memory[i] = 0
end
self.NeedRefresh = true
end
end
duplicator.RegisterEntityClass("gmod_wire_characterlcd", WireLib.MakeWireEnt, "Data", "ScreenWidth", "ScreenHeight")

View File

@ -0,0 +1,12 @@
ENT.Type = "anim"
ENT.Base = "base_wire_entity"
ENT.PrintName = "Wire Character LCD"
ENT.Author = ""
ENT.Contact = ""
ENT.Purpose = ""
ENT.Instructions = ""
ENT.Spawnable = false
ENT.RenderGroup = RENDERGROUP_BOTH

File diff suppressed because it is too large Load Diff

View File

@ -248,17 +248,12 @@ function ENT:RedrawPixel(a)
cr, cg, cb = (transformcolor[colormode] or transformcolor[0])(c) cr, cg, cb = (transformcolor[colormode] or transformcolor[0])(c)
end end
local xstep = (512/self.ScreenWidth)
local ystep = (512/self.ScreenHeight)
surface.SetDrawColor(cr,cg,cb,255) surface.SetDrawColor(cr,cg,cb,255)
local tx, ty = floor(x*xstep), floor(y*ystep) surface.DrawRect( x, y, 1, 1 )
surface.DrawRect( tx, ty, floor((x+1)*xstep-tx), floor((y+1)*ystep-ty) )
end end
function ENT:RedrawRow(y) function ENT:RedrawRow(y)
local xstep = (512/self.ScreenWidth)
local ystep = (512/self.ScreenHeight)
if y >= self.ScreenHeight then return end if y >= self.ScreenHeight then return end
local a = y*self.ScreenWidth local a = y*self.ScreenWidth
@ -277,8 +272,7 @@ function ENT:RedrawRow(y)
end end
surface.SetDrawColor(cr,cg,cb,255) surface.SetDrawColor(cr,cg,cb,255)
local tx, ty = floor(x*xstep), floor(y*ystep) surface.DrawRect( x, y, 1, 1 )
surface.DrawRect( tx, ty, floor((x+1)*xstep-tx), floor((y+1)*ystep-ty) )
end end
end end
@ -294,7 +288,7 @@ function ENT:Draw()
if self.ClearQueued then if self.ClearQueued then
surface.SetDrawColor(0,0,0,255) surface.SetDrawColor(0,0,0,255)
surface.DrawRect(0,0, 512,512) surface.DrawRect(0,0, 1024,1024)
self.ClearQueued = false self.ClearQueued = false
return return
end end
@ -320,7 +314,7 @@ function ENT:Draw()
end) end)
end end
self.GPU:Render() self.GPU:Render(0,0,1024,1024,nil,-(1024-self.ScreenWidth)/1024,-(1024-self.ScreenHeight)/1024)
Wire_Render(self) Wire_Render(self)
end end

View File

@ -83,7 +83,7 @@ function ENT:Draw()
self:_EGP_Update() self:_EGP_Update()
end end
self.GPU:Render() self.GPU:Render(0,0,1024,1024,nil,-0.5,-0.5)
end end
function ENT:OnRemove() function ENT:OnRemove()

View File

@ -292,8 +292,8 @@ function ENT:RenderMisc(pos, ang, resolution, aspect, monitor)
if (dist < 256) then if (dist < 256) then
local pos = WorldToLocal( trace.HitPos, Angle(), pos, ang ) local pos = WorldToLocal( trace.HitPos, Angle(), pos, ang )
local x = 0.5+pos.x/(monitor.RS*(512/monitor.RatioX)) local x = 0.5+pos.x/(monitor.RS*(1024/monitor.RatioX))
local y = 0.5-pos.y/(monitor.RS*512) local y = 0.5-pos.y/(monitor.RS*1024)
local cursorOffset = 0 local cursorOffset = 0
if self.VM:ReadCell(65532) == 1 then -- Check for vertex mode to counter the faulty offset if self.VM:ReadCell(65532) == 1 then -- Check for vertex mode to counter the faulty offset
@ -308,7 +308,7 @@ function ENT:RenderMisc(pos, ang, resolution, aspect, monitor)
surface.SetTexture(surface.GetTextureID("gui/arrow")) surface.SetTexture(surface.GetTextureID("gui/arrow"))
x = math.Clamp(x,0 + cursorOffset, 1 + cursorOffset) x = math.Clamp(x,0 + cursorOffset, 1 + cursorOffset)
y = math.Clamp(y,0 + cursorOffset, 1 + cursorOffset) y = math.Clamp(y,0 + cursorOffset, 1 + cursorOffset)
surface.DrawTexturedRectRotated(-256*aspect+x*512*aspect+10,-256+y*512+12,32,32,45) surface.DrawTexturedRectRotated(-512*aspect+x*1024*aspect+10,-512+y*1024+12,32,32,45)
end end
end end
end end
@ -376,10 +376,10 @@ function ENT:Draw()
if self.VM.Memory[65532] == 0 then if self.VM.Memory[65532] == 0 then
self.GPU:Render( self.GPU:Render(
self.VM:ReadCell(65522), self.VM:ReadCell(65523)-self.VM:ReadCell(65518)/512, -- rotation, scale self.VM:ReadCell(65522), self.VM:ReadCell(65523)-self.VM:ReadCell(65518)/512, -- rotation, scale
512*math.Clamp(self.VM:ReadCell(65525),0,1), 512*math.Clamp(self.VM:ReadCell(65524),0,1), -- width, height 1024*math.Clamp(self.VM:ReadCell(65525),0,1), 1024*math.Clamp(self.VM:ReadCell(65524),0,1), -- width, height
function(pos, ang, resolution, aspect, monitor) -- postrenderfunction function(pos, ang, resolution, aspect, monitor) -- postrenderfunction
self:RenderMisc(pos, ang, resolution, aspect, monitor) self:RenderMisc(pos, ang, resolution, aspect, monitor)
end end,-0.5,-0.5
) )
else else
-- Custom render to world -- Custom render to world
@ -389,20 +389,20 @@ function ENT:Draw()
pos = pos - ang:Right()*(monitor.y2-monitor.y1)/2 pos = pos - ang:Right()*(monitor.y2-monitor.y1)/2
pos = pos - ang:Forward()*(monitor.x2-monitor.x1)/2 pos = pos - ang:Forward()*(monitor.x2-monitor.x1)/2
local width,height = 512*math.Clamp(self.VM.Memory[65525],0,1), local width,height = 1024*math.Clamp(self.VM.Memory[65525],0,1),
512*math.Clamp(self.VM.Memory[65524],0,1) 1024*math.Clamp(self.VM.Memory[65524],0,1)
local h = width and width*monitor.RatioX or height or 512 local h = width and width*monitor.RatioX or height or 1024
local w = width or h/monitor.RatioX local w = width or h/monitor.RatioX
local x = -w/2 local x = -w/2
local y = -h/2 local y = -h/2
local res = monitor.RS*512/h local res = monitor.RS*1024/h
self.VertexCamSettings = { pos, ang, res } self.VertexCamSettings = { pos, ang, res }
cam.Start3D2D(pos, ang, res) cam.Start3D2D(pos, ang, res)
self.In3D2D = true self.In3D2D = true
local ok, err = xpcall(function() local ok, err = xpcall(function()
self:RenderVertex(512,512*monitor.RatioX) self:RenderVertex(1024,1024*monitor.RatioX)
self:RenderMisc(pos, ang, res, 1/monitor.RatioX, monitor) self:RenderMisc(pos, ang, res, 1/monitor.RatioX, monitor)
end, debug.traceback) end, debug.traceback)
if not ok then WireLib.ErrorNoHalt(err) end if not ok then WireLib.ErrorNoHalt(err) end

View File

@ -0,0 +1,476 @@
AddCSLuaFile()
DEFINE_BASECLASS( "base_wire_entity" )
ENT.PrintName = "Interactive Prop (Wire)"
ENT.WireDebugName = "Interactive Prop"
local InteractiveModels
local function copyPropUI(prop, newName)
local new = table.Copy( InteractiveModels[prop] )
new.title = newName
return new
end
InteractiveModels = {
["models/props_lab/reciever01a.mdl"] = {
width=220,
height=100,
title="Reciever01a",
widgets={
{type="DCheckBox", x=20, y=50,name="Switch1"},
{type="DCheckBox", x=40, y=50,name="Switch2"},
{type="DNumberScratch", x=60, y=40,name="Knob1" },
{type="DNumberScratch", x=80, y=40,name="Knob2" },
{type="DNumberScratch", x=100, y=40,name="Knob3" },
{type="DNumberScratch", x=120, y=40,name="Knob4" },
{type="DNumberScratch", x=140, y=40,name="Knob5" },
{type="DNumberScratch", x=160, y=40,name="Knob6" },
{type="DNumberScratch", x=180, y=40,name="Knob7" },
{type="DNumberScratch", x=60, y=60,name="Knob8" },
{type="DNumberScratch", x=80, y=60,name="Knob9" },
{type="DNumberScratch", x=100, y=60,name="Knob10" },
{type="DNumberScratch", x=120, y=60,name="Knob11" },
{type="DNumberScratch", x=140, y=60,name="Knob12" },
{type="DNumberScratch", x=160, y=60,name="Knob13" },
{type="DNumberScratch", x=180, y=60,name="Knob14" }
}
},
["models/props_lab/reciever01b.mdl"] = {
width=190,
height=100,
title="Reciever01b",
widgets={
{type="DButton", x=28, y=40,name="Button1"},
{type="DButton", x=58, y=40,name="Button2"},
{type="DButton", x=88, y=40,name="Button3"},
{type="DButton", x=118, y=40,name="Button4"},
{type="DNumberScratch", x=30, y=70,name="Knob1" },
{type="DNumberScratch", x=60, y=70,name="Knob2" },
{type="DNumberScratch", x=90, y=70,name="Knob3" },
{type="DNumberScratch", x=120, y=70,name="Knob4" },
{type="DNumberScratch", x=150, y=43,name="Knob5" },
{type="DNumberScratch", x=150, y=67,name="Knob6" },
}
},
["models/props_lab/keypad.mdl"] = {
width=100,
height=120,
title="Keypad",
widgets={
{type="DButton", x=10, y=30, text="1", name="1"},
{type="DButton", x=40, y=30, text="2", name="2"},
{type="DButton", x=70, y=30, text="3", name="3"},
{type="DButton", x=10, y=60, text="4", name="4"},
{type="DButton", x=40, y=60, text="5", name="5"},
{type="DButton", x=70, y=60, text="6", name="6"},
{type="DButton", x=10, y=90, text="7", name="7"},
{type="DButton", x=40, y=90, text="8", name="8"},
{type="DButton", x=70, y=90, text="9", name="9"},
}
},
["models/beer/wiremod/numpad.mdl"] = {
width=130,
height=180,
title="Numpad",
widgets={
{type="DButton", x=10, y=150, text="0", name="0", width = 50},
{type="DButton", x=10, y=120, text="1", name="1"},
{type="DButton", x=40, y=120, text="2", name="2"},
{type="DButton", x=70, y=120, text="3", name="3"},
{type="DButton", x=10, y=90, text="4", name="4"},
{type="DButton", x=40, y=90, text="5", name="5"},
{type="DButton", x=70, y=90, text="6", name="6"},
{type="DButton", x=10, y=60, text="7", name="7"},
{type="DButton", x=40, y=60, text="8", name="8"},
{type="DButton", x=70, y=60, text="9", name="9"},
{type="DButton", x=100, y=120, text="E", name="Enter", height = 50},
{type="DButton", x=100, y=60, text="+", name="+", height = 50},
{type="DButton", x=100, y=30, text="-", name="-"},
{type="DButton", x=70, y=30, text="*", name="*"},
{type="DButton", x=40, y=30, text="/", name="/"},
{type="DButton", x=70, y=150, text=".", name="."},
{type="DButton", x=10, y=30, text="N", name="Numlock"},
}
},
["models/props_interiors/bathtub01a.mdl"] = {
width=100,
height=60,
title="BathTub01a",
widgets={
{type="DNumberScratch", x=10, y=32, name="Hot", color=Color(237, 59, 59)},
{type="DNumberScratch", x=74, y=32, name="Cold", color=Color(59, 79, 235)},
}
},
["models/props_lab/citizenradio.mdl"] = {
width=160,
height=90,
title="citizenradio",
widgets={
{type="DNumberScratch", x=10,y=30, name="Knob1"},
{type="DNumberScratch", x=80,y=30, name="Knob2"},
{type="DNumberScratch", x=120,y=30, name="Knob3"},
{type="DNumberScratch", x=10,y=60, name="Knob4"},
{type="DNumberScratch", x=40,y=60, name="Knob5"},
{type="DNumberScratch", x=65,y=60, name="Knob6"},
{type="DNumberScratch", x=90,y=60, name="Knob7"},
{type="DNumberScratch", x=130,y=60, name="Knob8"},
}
},
["models/props_lab/reciever01c.mdl"] = {
width = 112,
height = 80,
title="reciever01c",
widgets={
{type="DNumberScratch", x = 10, y = 30, name="Knob1", color=Color(128,64,64)},
{type="DNumberScratch", x = 35, y = 30, name="Knob2", color=Color(128,64,64)},
{type="DNumberScratch", x = 10, y = 55, name="Knob3"},
{type="DNumberScratch", x = 35, y = 55, name="Knob4"},
{type="DNumberScratch", x = 60, y = 55, name="Knob5"},
{type="DNumberScratch", x = 85, y = 55, name="Knob6"},
}
},
["models/props_interiors/vendingmachinesoda01a.mdl"] = {
width = 60,
height = 200,
title = "vendingmachinesoda01a",
widgets = {
{type="DButton", x = 10, y = 30, name="1", width = 40, text = "1"},
{type="DButton", x = 10, y = 50, name="2", width = 40, text = "2"},
{type="DButton", x = 10, y = 70, name="3", width = 40, text = "3"},
{type="DButton", x = 10, y = 90, name="4", width = 40, text = "4"},
{type="DButton", x = 10, y = 110, name="5", width = 40, text = "5"},
{type="DButton", x = 10, y = 130, name="6", width = 40, text = "6"},
{type="DButton", x = 10, y = 150, name="7", width = 40, text = "7"},
{type="DButton", x = 10, y = 170, name="8", width = 40, text = "8"},
}
},
["models/props_c17/furniturewashingmachine001a.mdl"] = {
width = 36,
height = 66,
title="washingmachine001a",
widgets = {
{type="DNumberScratch", x=10,y=30,name="Knob"}
}
},
["models/props_trainstation/payphone001a.mdl"] = {
width = 100,
height = 150,
title="payphone001a",
widgets={
{type="DButton", x=10, y=30, text="1", name="1"},
{type="DButton", x=40, y=30, text="2", name="2"},
{type="DButton", x=70, y=30, text="3", name="3"},
{type="DButton", x=10, y=60, text="4", name="4"},
{type="DButton", x=40, y=60, text="5", name="5"},
{type="DButton", x=70, y=60, text="6", name="6"},
{type="DButton", x=10, y=90, text="7", name="7"},
{type="DButton", x=40, y=90, text="8", name="8"},
{type="DButton", x=70, y=90, text="9", name="9"},
{type="DButton", x=10, y=120, text="*", name="*"},
{type="DButton", x=40, y=120, text="0", name="0"},
{type="DButton", x=70, y=120, text="##", name="#"},
}
},
["models/props_lab/plotter.mdl"] = {
width = 190,
height = 90,
title = "plotter",
widgets={
{type="DButton", x=10, y=30, name="Button1"},
{type="DButton", x=35, y=30, name="Button2"},
{type="DButton", x=60, y=30, name="Button3"},
{type="DButton", x=85, y=30, name="Button4"},
{type="DButton", x=110, y=30, name="Button5"},
{type="DButton", x=10, y=60, name="Button6"},
{type="DButton", x=35, y=60, name="Button7"},
{type="DButton", x=60, y=60, name="Button8"},
{type="DButton", x=85, y=60, name="Button9"},
{type="DButton", x=110, y=60, name="Button10"},
{type="DButton", x=135, y=60, name="Button11"},
{type="DButton", x=160, y=60, name="Button12"},
}
}
}
InteractiveModels["models/props_c17/furnituresink001a.mdl"] = copyPropUI( "models/props_interiors/bathtub01a.mdl", "Furniture Sink" )
InteractiveModels["models/props_interiors/sinkkitchen01a.mdl"] = copyPropUI( "models/props_interiors/bathtub01a.mdl", "Kitchen Sink" )
InteractiveModels["models/props_wasteland/prison_sink001a.mdl"] = copyPropUI( "models/props_interiors/bathtub01a.mdl", "Prison Sink" )
local WidgetBuilders = {
DCheckBox = function(self, data, body, index)
local checkbox = vgui.Create("DCheckBox", body)
checkbox:SetPos(data.x, data.y)
checkbox:SetValue(self.InteractiveData[index])
checkbox.OnChange = function(box,value)
surface.PlaySound("buttons/lightswitch2.wav")
self.InteractiveData[index] = value and 1 or 0
self:SendData()
end
end,
DNumberScratch = function(self, data, body, index)
local numberscratch = vgui.Create("DNumberScratch", body)
numberscratch.color = data.color or Color( 128, 128, 128 )
numberscratch:SetMin(-1)
numberscratch:SetMax(1)
numberscratch:SetDecimals(4)
numberscratch:SetPos(data.x, data.y)
numberscratch:SetValue(self.InteractiveData[index])
numberscratch.OnValueChanged = function(scratch,value)
self.InteractiveData[index] = value
self:SendData()
end
numberscratch:SetImageVisible( false )
numberscratch:SetSize( 17, 17 )
numberscratch.Paint = function( self, w, h )
draw.RoundedBox( 8.5, 0, 0, w, h, numberscratch.color )
local value = self:GetFloatValue()
surface.SetDrawColor(255, 255, 255)
surface.DrawLine(
w/2,
h/2,
math.sin(value * math.pi*0.75)*w/2+w/2,
-math.cos(value * math.pi*0.75)*h/2+h/2
)
end
end,
DButton = function(self, data, body, index)
local button = vgui.Create("DButton", body)
button:SetPos(data.x, data.y)
button:SetText(data.text or "")
button:SetSize(data.width or 20, data.height or 20)
self:AddButton(index,button)
end
}
function ENT:GetPanel()
local data = InteractiveModels[ self:GetModel() ]
local body = vgui.Create("DFrame")
body:SetTitle(data.title)
body:SetSize(data.width, data.height)
body:SetVisible(true)
body.Paint = function( self, w, h ) -- 'function Frame:Paint( w, h )' works too
-- surface.SetDrawColor(255,255,255)
-- surface.DrawOutlinedRect(0, 0, w, h)
-- surface.SetDrawColor(0,0,0)
-- surface.DrawOutlinedRect(1, 1, w-2, h-2)
draw.RoundedBox( 4, 0, 0, w, h, Color( 255, 255, 255 ) )
draw.RoundedBox( 4, 1, 1, w-2, h-2, Color( 64, 64, 64 ) )
end
body:SetDraggable(false)
body:Center()
body:ShowCloseButton(true)
body:MakePopup()
for id, widget in ipairs( data.widgets ) do
WidgetBuilders[widget.type](self, widget, body, id)
end
return body
end
function ENT:AddButton(id,button)
self.Buttons[id] = button
end
function ENT:SendData()
net.Start("wire_interactiveprop_action")
local data = InteractiveModels[self:GetModel()].widgets
net.WriteEntity(self)
for i=1, #data do
net.WriteFloat(self.InteractiveData[i])
end
net.SendToServer()
end
if CLIENT then
local panel
----------------------------------------------------
-- Show the prompt
----------------------------------------------------
function ENT:Initialize()
self.InteractiveData = {}
self.LastButtons = {}
self.Buttons = {}
for i=1, #InteractiveModels[ self:GetModel() ].widgets do
self.InteractiveData[i] = 0
end
end
function ENT:Think()
if IsValid( panel ) and #self.Buttons ~= 0 then
local needToUpdate = false
for k,v in pairs(self.Buttons) do
self.LastButtons[k] = self.InteractiveData[k]
self.InteractiveData[k] = v:IsDown() and 1 or 0
if self.InteractiveData[k] ~= self.LastButtons[k] then
needToUpdate = true
end
end
if needToUpdate then
self:SendData()
end
end
end
net.Receive("wire_interactiveprop_show",function()
local self = net.ReadEntity()
if not IsValid(self) then return end
panel = self:GetPanel()
panel.OnClose = function(panel)
net.Start("wire_interactiveprop_close")
self.Buttons = {}
self.LastButtons = {}
net.WriteEntity(self)
net.SendToServer()
end
end)
net.Receive( "wire_interactiveprop_kick", function()
self.Buttons = {}
self.LastButtons = {}
if IsValid( panel ) then
panel:Remove()
end
end)
return
end
function ENT:InitData()
local model = self:GetModel()
local outputs = {}
for i=1, #InteractiveModels[model].widgets do
outputs[i] = InteractiveModels[model].widgets[i].name
end
self.Outputs=WireLib.CreateOutputs(self,outputs)
end
----------------------------------------------------
-- UpdateOverlay
----------------------------------------------------
function ENT:UpdateOverlay()
txt = ""
if IsValid(self.User) then
txt = "In use by: " .. self.User:Nick()
end
self:SetOverlayText(txt)
end
----------------------------------------------------
-- Initialize
----------------------------------------------------
function ENT:Initialize()
self:PhysicsInit(SOLID_VPHYSICS)
self:SetUseType(SIMPLE_USE)
self.InteractiveData = {}
self:InitData()
self.BlockInput=false
self.NextPrompt = 0
self:UpdateOverlay()
end
function ENT:OnRemove()
self:Unprompt( true )
end
function ENT:ReceiveData()
local data = InteractiveModels[self:GetModel()].widgets
for i = 1, #data do
WireLib.TriggerOutput(self, data[i].name, net.ReadFloat())
end
end
----------------------------------------------------
-- Receiving data from client
----------------------------------------------------
util.AddNetworkString("wire_interactiveprop_action")
net.Receive("wire_interactiveprop_action",function(len,ply)
self = net.ReadEntity()
if not IsValid( self ) or not IsValid( ply ) or ply ~= self.User then return end
self:ReceiveData()
self:UpdateOverlay()
end)
----------------------------------------------------
-- Prompt
-- Sends prompt to user etc
----------------------------------------------------
util.AddNetworkString("wire_interactiveprop_show")
function ENT:Prompt( ply )
if ply then
if CurTime() < self.NextPrompt then return end -- anti spam
self.NextPrompt = CurTime() + 0.1
if IsValid( self.User ) then
WireLib.AddNotify(ply,"That interactive prop is in use by another player!",NOTIFY_ERROR,5,6)
return
end
self.User = ply
net.Start( "wire_interactiveprop_show" )
net.WriteEntity( self )
net.Send( ply )
self:UpdateOverlay()
else
self:Prompt( self:GetPlayer() ) -- prompt for owner
end
end
util.AddNetworkString("wire_interactiveprop_close")
net.Receive("wire_interactiveprop_close",function(len,ply)
local self = net.ReadEntity()
self:Unprompt()
end)
util.AddNetworkString("wire_interactiveprop_kick")
function ENT:Unprompt( )
self.User = nil
self:UpdateOverlay()
end
----------------------------------------------------
-- Use
----------------------------------------------------
function ENT:Use(ply)
if not IsValid( ply ) then return end
self:Prompt( ply )
end
duplicator.RegisterEntityClass("gmod_wire_interactiveprop",WireLib.MakeWireEnt,"Data")

View File

@ -50,19 +50,19 @@ if CLIENT then
self.GPU:RenderToGPU(function() self.GPU:RenderToGPU(function()
surface.SetDrawColor(10,20,5,255) surface.SetDrawColor(10,20,5,255)
surface.DrawRect(0,0,512,512) surface.DrawRect(0,0,1024,1024)
local nodes = self:GetNodeList() local nodes = self:GetNodeList()
for i=1,length do for i=1,length do
local i_next = i+1 local i_next = i+1
if not nodes[i_next] then continue end if not nodes[i_next] then continue end
local nx1 = nodes[i].X*256+256 local nx1 = nodes[i].X*512+512
local ny1 = -nodes[i].Y*256+256 local ny1 = -nodes[i].Y*512+512
local nx2 = nodes[i_next].X*256+256 local nx2 = nodes[i_next].X*512+512
local ny2 = -nodes[i_next].Y*256+256 local ny2 = -nodes[i_next].Y*512+512
if ((nx1-nx2)*(nx1-nx2) + (ny1-ny2)*(ny1-ny2) < 256*256) then if ((nx1-nx2)*(nx1-nx2) + (ny1-ny2)*(ny1-ny2) < 512*512) then
local a = math.max(1, 3.75-(3*i)/length)^1.33 local a = math.max(1, 3.75-(3*i)/length)^1.33
local a2 = math.max(1, a/2) local a2 = math.max(1, a/2)
@ -79,14 +79,14 @@ if CLIENT then
end end
surface.SetDrawColor(30, 120, 10, 255) surface.SetDrawColor(30, 120, 10, 255)
surface.DrawLine(0, 128, 512, 128) surface.DrawLine(0, 256, 1024, 256)
surface.DrawLine(0, 384, 512, 384) surface.DrawLine(0, 768, 1024, 768)
surface.DrawLine(128, 0, 128, 512) surface.DrawLine(256, 0, 256, 1024)
surface.DrawLine(384, 0, 384, 512) surface.DrawLine(768, 0, 768, 1024)
surface.SetDrawColor(180, 200, 10, 255) surface.SetDrawColor(180, 200, 10, 255)
surface.DrawLine(0, 256, 512, 256) surface.DrawLine(0, 512, 1024, 512)
surface.DrawLine(256, 0, 256, 512) surface.DrawLine(512, 0, 512, 1024)
end) end)
self.GPU:Render() self.GPU:Render()

View File

@ -142,8 +142,8 @@ if CLIENT then
if self.NeedRefresh then if self.NeedRefresh then
self.NeedRefresh = nil self.NeedRefresh = nil
self.GPU:RenderToGPU(function() self.GPU:RenderToGPU(function()
local w = 512 local w = 1024
local h = 512 local h = 1024
surface.SetDrawColor(self.bgcolor.r, self.bgcolor.g, self.bgcolor.b, 255) surface.SetDrawColor(self.bgcolor.r, self.bgcolor.g, self.bgcolor.b, 255)
surface.DrawRect(0, 0, w, h) surface.DrawRect(0, 0, w, h)
@ -197,7 +197,7 @@ if CLIENT then
local fontData = { local fontData = {
font = font, font = font,
size = 380 / chrPerLine, size = 760 / chrPerLine,
weight = 400, weight = 400,
antialias = true, antialias = true,
additive = false additive = false

View File

@ -49,17 +49,62 @@ list.Set( "WireScreenModels", "models/props/cs_office/computer_monitor.mdl", tru
list.Set( "WireScreenModels", "models/kobilica/wiremonitorbig.mdl", true ) list.Set( "WireScreenModels", "models/kobilica/wiremonitorbig.mdl", true )
list.Set( "WireScreenModels", "models/kobilica/wiremonitorsmall.mdl", true ) list.Set( "WireScreenModels", "models/kobilica/wiremonitorsmall.mdl", true )
list.Set( "WireScreenModels", "models/props/cs_assault/Billboard.mdl", true ) list.Set( "WireScreenModels", "models/props/cs_assault/Billboard.mdl", true )
list.Set( "WireScreenModels", "models/cheeze/pcb/pcb0.mdl", true )
list.Set( "WireScreenModels", "models/cheeze/pcb/pcb1.mdl", true )
list.Set( "WireScreenModels", "models/cheeze/pcb/pcb2.mdl", true )
list.Set( "WireScreenModels", "models/cheeze/pcb/pcb3.mdl", true )
list.Set( "WireScreenModels", "models/cheeze/pcb/pcb4.mdl", true ) list.Set( "WireScreenModels", "models/cheeze/pcb/pcb4.mdl", true )
list.Set( "WireScreenModels", "models/cheeze/pcb/pcb6.mdl", true ) list.Set( "WireScreenModels", "models/cheeze/pcb/pcb6.mdl", true )
list.Set( "WireScreenModels", "models/cheeze/pcb/pcb5.mdl", true ) list.Set( "WireScreenModels", "models/cheeze/pcb/pcb5.mdl", true )
list.Set( "WireScreenModels", "models/cheeze/pcb/pcb7.mdl", true ) list.Set( "WireScreenModels", "models/cheeze/pcb/pcb7.mdl", true )
list.Set( "WireScreenModels", "models/cheeze/pcb/pcb8.mdl", true ) list.Set( "WireScreenModels", "models/cheeze/pcb/pcb8.mdl", true )
list.Set( "WireScreenModels", "models/cheeze/pcb2/pcb8.mdl", true ) list.Set( "WireScreenModels", "models/cheeze/pcb2/pcb8.mdl", true )
list.Set( "WireScreenModels", "models/cheeze/pcb2/pcb1.mdl", true )
list.Set( "WireScreenModels", "models/cheeze/pcb2/pcb2.mdl", true )
list.Set( "WireScreenModels", "models/cheeze/pcb2/pcb3.mdl", true )
list.Set( "WireScreenModels", "models/cheeze/pcb2/pcb4.mdl", true )
list.Set( "WireScreenModels", "models/cheeze/pcb2/pcb5.mdl", true )
list.Set( "WireScreenModels", "models/cheeze/pcb2/pcb6.mdl", true )
list.Set( "WireScreenModels", "models/cheeze/pcb2/pcb7.mdl", true )
list.Set( "WireScreenModels", "models/props_lab/monitor01a.mdl", true ) list.Set( "WireScreenModels", "models/props_lab/monitor01a.mdl", true )
list.Set( "WireScreenModels", "models/props_lab/monitor02.mdl", true ) list.Set( "WireScreenModels", "models/props_lab/monitor02.mdl", true )
list.Set( "WireScreenModels", "models/props/cs_militia/reload_bullet_tray.mdl", true ) list.Set( "WireScreenModels", "models/props/cs_militia/reload_bullet_tray.mdl", true )
list.Set( "WireScreenModels", "models/props_lab/workspace002.mdl", true ) list.Set( "WireScreenModels", "models/props_lab/workspace002.mdl", true )
list.Set( "WireScreenModels", "models/props_lab/reciever01b.mdl", true ) list.Set( "WireScreenModels", "models/props_lab/reciever01b.mdl", true )
list.Set( "WireScreenModels","models/props_c17/consolebox05a.mdl", true )
list.Set( "WireScreenModels","models/props_lab/reciever01c.mdl", true )
list.Set( "WireScreenModels","models/props_lab/reciever01d.mdl", true )
list.Set( "WireScreenModels","models/props_c17/consolebox01a.mdl", true )
list.Set( "WireScreenModels","models/props_combine/combine_interface001.mdl", true )
list.Set( "WireScreenModels","models/props_c17/cashregister01a.mdl", true )
list.Set( "WireScreenModels","models/props_combine/combine_monitorbay.mdl", true )
list.Set( "WireScreenModels","models/props_lab/workspace001.mdl", true )
list.Set( "WireScreenModels","models/props_lab/citizenradio.mdl", true )
list.Set( "WireScreenModels","models/props_lab/securitybank.mdl", true )
list.Set( "WireScreenModels","models/beer/wiremod/gate_e2.mdl", true )
list.Set( "WireScreenModels","models/beer/wiremod/targetfinder.mdl", true )
list.Set( "WireScreenModels","models/bull/gates/microcontroller1.mdl", true )
list.Set( "WireScreenModels","models/bull/gates/microcontroller2.mdl", true )
list.Set( "WireScreenModels","models/jaanus/wiretool/wiretool_gate.mdl", true )
list.Set( "WireScreenModels","models/jaanus/wiretool/wiretool_controlchip.mdl",true )
list.Set( "WireScreenModels","models/props_lab/keypad.mdl", true )
list.Set( "WireScreenModels","models/weapons/w_c4_planted.mdl", true )
list.Set( "WireScreenModels","models/weapons/w_toolgun.mdl", true )
list.Set( "WireScreenModels","models/xqm/panel1x1.mdl", true )
list.Set( "WireScreenModels","models/xqm/panel1x2.mdl", true )
list.Set( "WireScreenModels","models/xqm/box5s.mdl", true )
list.Set( "WireScreenModels","models/props_lab/miniteleport.mdl", true )
list.Set( "WireScreenModels","models/props_lab/plotter.mdl", true )
list.Set( "WireScreenModels","models/props_combine/combine_interface002.mdl", true )
list.Set( "WireScreenModels","models/props_combine/combine_interface003.mdl", true )
list.Set( "WireScreenModels","models/props_combine/combine_intmonitor003.mdl", true )
list.Set( "WireScreenModels","models/props_combine/combine_intmonitor001.mdl", true )
list.Set( "WireScreenModels","models/props_lab/workspace003.mdl", true )
list.Set( "WireScreenModels","models/props_lab/workspace004.mdl", true )
list.Set( "WireScreenModels","models/props_lab/servers.mdl", true )
list.Set( "WireScreenModels","models/props_phx/rt_screen.mdl", true )
--list.Set( "WireScreenModels", "models/blacknecro/ledboard60.mdl", true ) --broken --list.Set( "WireScreenModels", "models/blacknecro/ledboard60.mdl", true ) --broken
list.Set( "WireScreenModels", "models/props_wasteland/controlroom_monitor001b.mdl", true ) list.Set( "WireScreenModels", "models/props_wasteland/controlroom_monitor001b.mdl", true )
--TF2 Billboards --TF2 Billboards
@ -67,12 +112,28 @@ list.Set( "WireScreenModels", "models/props_mining/billboard001.mdl", true )
list.Set( "WireScreenModels", "models/props_mining/billboard002.mdl", true ) list.Set( "WireScreenModels", "models/props_mining/billboard002.mdl", true )
--PHX3 --PHX3
list.Set( "WireScreenModels", "models/hunter/plates/plate025.mdl", true )
list.Set( "WireScreenModels", "models/hunter/plates/plate025x025.mdl", true )
list.Set( "WireScreenModels", "models/hunter/plates/plate025x05.mdl", true )
list.Set( "WireScreenModels", "models/hunter/plates/plate05x075.mdl", true )
list.Set( "WireScreenModels", "models/hunter/plates/plate05x1.mdl", true )
list.Set( "WireScreenModels", "models/hunter/plates/plate1x1.mdl", true ) list.Set( "WireScreenModels", "models/hunter/plates/plate1x1.mdl", true )
list.Set( "WireScreenModels", "models/hunter/plates/plate2x2.mdl", true ) list.Set( "WireScreenModels", "models/hunter/plates/plate2x2.mdl", true )
list.Set( "WireScreenModels", "models/hunter/plates/plate4x4.mdl", true ) list.Set( "WireScreenModels", "models/hunter/plates/plate4x4.mdl", true )
list.Set( "WireScreenModels", "models/hunter/plates/plate8x8.mdl", true ) list.Set( "WireScreenModels", "models/hunter/plates/plate8x8.mdl", true )
list.Set( "WireScreenModels", "models/hunter/plates/plate05x05.mdl", true ) list.Set( "WireScreenModels", "models/hunter/plates/plate05x05.mdl", true )
list.Set( "WireScreenModels", "models/hunter/blocks/cube1x1x1.mdl", true ) list.Set( "WireScreenModels", "models/hunter/blocks/cube1x1x1.mdl", true )
list.Set( "WireScreenModels","models/props_lab/reciever01b.mdl", true )
list.Set( "WireScreenModels","models/fasteroid/bull/lcd1.mdl", true )
list.Set( "WireScreenModels","models/fasteroid/bull/lcd2.mdl", true )
list.Set( "WireScreenModels","models/fasteroid/bull/lcd3.mdl", true )
list.Set( "WireScreenModels","models/fasteroid/bull/lcd4.mdl", true )
list.Set( "WireScreenModels","models/fasteroid/bull/lcd5.mdl", true )
--screens that are transparent --screens that are transparent
list.Set( "WireScreenModels", "models/props_phx/construct/windows/window1x1.mdl", true ) list.Set( "WireScreenModels", "models/props_phx/construct/windows/window1x1.mdl", true )
@ -405,6 +466,21 @@ list.Set( "Wire_Keyboard_Models", "models/jaanus/wiretool/wiretool_input.mdl", t
list.Set( "Wire_Keyboard_Models", "models/props/kb_mouse/keyboard.mdl", true ) list.Set( "Wire_Keyboard_Models", "models/props/kb_mouse/keyboard.mdl", true )
list.Set( "Wire_Keyboard_Models", "models/props_c17/computer01_keyboard.mdl", true ) list.Set( "Wire_Keyboard_Models", "models/props_c17/computer01_keyboard.mdl", true )
list.Set( "Wire_InteractiveProp_Models", "models/props_lab/reciever01a.mdl", true )
list.Set( "Wire_InteractiveProp_Models", "models/props_lab/reciever01b.mdl", true )
list.Set( "Wire_InteractiveProp_Models", "models/props_lab/keypad.mdl", true )
list.Set( "Wire_InteractiveProp_Models", "models/beer/wiremod/numpad.mdl", true )
list.Set( "Wire_InteractiveProp_Models", "models/props_interiors/bathtub01a.mdl", true )
list.Set( "Wire_InteractiveProp_Models", "models/props_c17/furnituresink001a.mdl", true )
list.Set( "Wire_InteractiveProp_Models", "models/props_interiors/sinkkitchen01a.mdl", true )
list.Set( "Wire_InteractiveProp_Models", "models/props_wasteland/prison_sink001a.mdl", true )
list.Set( "Wire_InteractiveProp_Models", "models/props_lab/citizenradio.mdl", true )
list.Set( "Wire_InteractiveProp_Models", "models/props_c17/furniturewashingmachine001a.mdl", true )
list.Set( "Wire_InteractiveProp_Models", "models/props_lab/plotter.mdl", true )
list.Set( "Wire_InteractiveProp_Models", "models/props_interiors/vendingmachinesoda01a.mdl", true )
list.Set( "Wire_InteractiveProp_Models", "models/props_lab/reciever01c.mdl", true )
list.Set( "Wire_InteractiveProp_Models", "models/props_trainstation/payphone001a.mdl", true )
--Hydraulic --Hydraulic
list.Set( "Wire_Hydraulic_Models", "models/beer/wiremod/hydraulic.mdl", true ) list.Set( "Wire_Hydraulic_Models", "models/beer/wiremod/hydraulic.mdl", true )
list.Set( "Wire_Hydraulic_Models", "models/jaanus/wiretool/wiretool_siren.mdl", true ) list.Set( "Wire_Hydraulic_Models", "models/jaanus/wiretool/wiretool_siren.mdl", true )

View File

@ -84,7 +84,6 @@ if CLIENT then
-- Returns a render target from the cache pool and marks it as used -- Returns a render target from the cache pool and marks it as used
local function GetRT() local function GetRT()
for i, RT in pairs( RenderTargetCache ) do for i, RT in pairs( RenderTargetCache ) do
if not RT[1] then -- not used if not RT[1] then -- not used
@ -101,7 +100,7 @@ if CLIENT then
for i, RT in pairs( RenderTargetCache ) do for i, RT in pairs( RenderTargetCache ) do
if not RT[1] and RT[2] == false then -- not used and doesn't exist, let's create the render target. if not RT[1] and RT[2] == false then -- not used and doesn't exist, let's create the render target.
local rendertarget = GetRenderTarget("WireGPU_RT_"..i, 512, 512) local rendertarget = GetRenderTarget("WireGPU_RT_"..i, 1024, 1024)
if rendertarget then if rendertarget then
RT[1] = true -- Mark as used RT[1] = true -- Mark as used
@ -141,12 +140,23 @@ if CLIENT then
local fontData = local fontData =
{ {
font="lucida console", font="lucida console",
size=20, size=40,
weight=800, weight=800,
antialias= true, antialias= true,
additive = false, additive = false,
} }
surface.CreateFont("WireGPU_ConsoleFont", fontData) surface.CreateFont("WireGPU_ConsoleFont", fontData)
surface.CreateFont("LCDFontBlur", {
font = "Alphanumeric LCD",
size = 26,
antialias = false,
blursize = 1
})
surface.CreateFont("LCDFont", {
font = "Alphanumeric LCD",
size = 26,
antialias = false
})
// //
// Create screen textures and materials // Create screen textures and materials
// //
@ -245,7 +255,7 @@ if CLIENT then
}, },
} }
-- helper function for GPU:Render -- helper function for GPU:Render
function GPU.DrawScreen(x, y, w, h, rotation, scale) function GPU.DrawScreen(x, y, w, h, rotation, scale, uvclipx, uvclipy)
-- generate vertex data -- generate vertex data
local vertices = { local vertices = {
--[[ --[[
@ -267,12 +277,12 @@ if CLIENT then
if tex.u == 0 then if tex.u == 0 then
vertex.u = tex.u-scale vertex.u = tex.u-scale
else else
vertex.u = tex.u+scale vertex.u = tex.u+scale+uvclipx
end end
if tex.v == 0 then if tex.v == 0 then
vertex.v = tex.v-scale vertex.v = tex.v-scale
else else
vertex.v = tex.v+scale vertex.v = tex.v+scale+uvclipy
end end
end end
@ -295,7 +305,7 @@ if CLIENT then
local OldRT = render.GetRenderTarget() local OldRT = render.GetRenderTarget()
render.SetRenderTarget(NewRT) render.SetRenderTarget(NewRT)
render.SetViewPort(0, 0, 512, 512) render.SetViewPort(0, 0, 1024, 1024)
cam.Start2D() cam.Start2D()
local ok, err = xpcall(renderfunction, debug.traceback) local ok, err = xpcall(renderfunction, debug.traceback)
if not ok then WireLib.ErrorNoHalt(err) end if not ok then WireLib.ErrorNoHalt(err) end
@ -317,19 +327,19 @@ if CLIENT then
pos = pos - ang:Forward()*(monitor.x2-monitor.x1)/2 pos = pos - ang:Forward()*(monitor.x2-monitor.x1)/2
end end
local h = width and width*monitor.RatioX or height or 512 local h = width and width*monitor.RatioX or height or 1024
local w = width or h/monitor.RatioX local w = width or h/monitor.RatioX
local x = -w/2 local x = -w/2
local y = -h/2 local y = -h/2
local res = monitor.RS*512/h local res = monitor.RS*1024/h
cam.Start3D2D(pos, ang, res) cam.Start3D2D(pos, ang, res)
local ok, err = xpcall(renderfunction, debug.traceback, x, y, w, h, monitor, pos, ang, res) local ok, err = xpcall(renderfunction, debug.traceback, x, y, w, h, monitor, pos, ang, res)
if not ok then WireLib.ErrorNoHalt(err) end if not ok then WireLib.ErrorNoHalt(err) end
cam.End3D2D() cam.End3D2D()
end end
function GPU:Render(rotation, scale, width, height, postrenderfunction) function GPU:Render(rotation, scale, width, height, postrenderfunction, uvclipx, uvclipy)
if not self.RT then return end if not self.RT then return end
local monitor, pos, ang = self:GetInfo() local monitor, pos, ang = self:GetInfo()
@ -341,8 +351,8 @@ if CLIENT then
cam.Start3D2D(pos, ang, res) cam.Start3D2D(pos, ang, res)
local ok, err = xpcall(function() local ok, err = xpcall(function()
local aspect = 1/monitor.RatioX local aspect = 1/monitor.RatioX
local w = (width or 512)*aspect local w = (width or 1024)*aspect
local h = (height or 512) local h = (height or 1024)
local x = -w/2 local x = -w/2
local y = -h/2 local y = -h/2
@ -354,7 +364,7 @@ if CLIENT then
if not translucent then if not translucent then
surface.SetDrawColor(0,0,0,255) surface.SetDrawColor(0,0,0,255)
surface.DrawRect(-256*aspect,-256,512*aspect,512) surface.DrawRect(-512*aspect,-512,1024*aspect,1024)
end end
surface.SetDrawColor(255,255,255,255) surface.SetDrawColor(255,255,255,255)
@ -363,7 +373,7 @@ if CLIENT then
render.PushFilterMag(self.texture_filtering or TEXFILTER.POINT) render.PushFilterMag(self.texture_filtering or TEXFILTER.POINT)
render.PushFilterMin(self.texture_filtering or TEXFILTER.POINT) render.PushFilterMin(self.texture_filtering or TEXFILTER.POINT)
self.DrawScreen(x, y, w, h, rotation or 0, scale or 0) self.DrawScreen(x, y, w, h, rotation or 0, scale or 0, uvclipx or 0, uvclipy or 0)
render.PopFilterMin() render.PopFilterMin()
render.PopFilterMag() render.PopFilterMag()
@ -423,7 +433,7 @@ if CLIENT then
local model = ent:GetModel() local model = ent:GetModel()
local monitor = WireGPU_Monitors[model] local monitor = WireGPU_Monitors[model]
local h = 512*monitor.RS local h = 1024*monitor.RS
local w = h/monitor.RatioX local w = h/monitor.RatioX
local x = -w/2 local x = -w/2
local y = -h/2 local y = -h/2

View File

@ -0,0 +1,67 @@
WireToolSetup.setCategory( "Visuals/Screens" )
WireToolSetup.open( "characterlcd", "Character LCD", "gmod_wire_characterlcd", nil, "Character LCDs" )
if CLIENT then
language.Add( "tool.wire_characterlcd.name", "Character LCD Tool (Wire)" )
language.Add( "tool.wire_characterlcd.desc", "Spawns a Character LCD, which can be used to display text" )
language.Add( "tool.wire_characterlcd.bgcolor", "Background color:" )
language.Add( "tool.wire_characterlcd.fgcolor", "Text color:" )
TOOL.Information = { { name = "left", text = "Create/Update " .. TOOL.Name } }
end
WireToolSetup.BaseLang()
WireToolSetup.SetupMax( 20 )
if SERVER then
function TOOL:GetConVars()
return self:GetClientInfo("width"), self:GetClientInfo("height"),
math.Clamp(self:GetClientNumber("bgred"), 0, 255),
math.Clamp(self:GetClientNumber("bggreen"), 0, 255),
math.Clamp(self:GetClientNumber("bgblue"), 0, 255),
math.Clamp(self:GetClientNumber("fgred"), 0, 255),
math.Clamp(self:GetClientNumber("fggreen"), 0, 255),
math.Clamp(self:GetClientNumber("fgblue"), 0, 255)
end
end
TOOL.ClientConVar = {
model = "models/props_lab/monitor01b.mdl",
width = 16,
height = 2,
createflat = 0,
bgred = 148,
bggreen = 178,
bgblue = 15,
fgred = 45,
fggreen = 91,
fgblue = 45,
}
function TOOL.BuildCPanel(panel)
WireToolHelpers.MakePresetControl(panel, "wire_characterlcd")
WireDermaExts.ModelSelect(panel, "wire_characterlcd_model", list.Get( "WireScreenModels" ), 5)
panel:AddControl("Color", {
Label = "#tool.wire_characterlcd.bgcolor",
Red = "wire_characterlcd_bgred",
Green = "wire_characterlcd_bggreen",
Blue = "wire_characterlcd_bgblue",
ShowAlpha = "0",
ShowHSV = "1",
ShowRGB = "1",
Multiplier = "255"
})
panel:AddControl("Color", {
Label = "#tool.wire_characterlcd.fgcolor",
Red = "wire_characterlcd_fgred",
Green = "wire_characterlcd_fggreen",
Blue = "wire_characterlcd_fgblue",
ShowAlpha = "0",
ShowHSV = "1",
ShowRGB = "1",
Multiplier = "255"
})
panel:NumSlider("Width", "wire_characterlcd_width", 1, 56, 0)
panel:NumSlider("Height", "wire_characterlcd_height", 1, 16, 0)
panel:CheckBox("#Create Flat to Surface", "wire_characterlcd_createflat")
end

View File

@ -0,0 +1,29 @@
-- Author: mitterdoo (with help from Divran)
WireToolSetup.setCategory("Input, Output")
WireToolSetup.open("interactiveprop","Interactive Prop","gmod_wire_interactiveprop",nil,"Interactive Props")
if CLIENT then
language.Add( "Tool.wire_interactiveprop.name", "Wire Interactive Prop" )
language.Add( "Tool.wire_interactiveprop.desc", "Opens a UI panel which controls outputs for use with wire system." )
end
TOOL.ClientConVar = {
model = "models/props_lab/receiver01a.mdl"
}
if SERVER then
function TOOL:GetDataTables()
return {}
end
end
WireToolSetup.BaseLang()
WireToolSetup.SetupMax(20)
function TOOL.BuildCPanel(panel)
panel:AddControl("Header",{Description="Opens a UI panel which controls outputs for use with the wire system."})
ModelPlug_AddToCPanel(panel, "InteractiveProp", "wire_interactiveprop", true)
end

View File

@ -11,7 +11,7 @@ function WireGPU_AddMonitor(name,model,tof,tou,tor,trs,x1,x2,y1,y2,rot,transluce
local monitor = { local monitor = {
Name = name, Name = name,
offset = Vector(tof, -tor, tou), offset = Vector(tof, -tor, tou),
RS = trs or (y2 - y1) / 512, RS = (trs or (y2 - y1) / 512)/2,
RatioX = RatioX, RatioX = RatioX,
x1 = x1, x1 = x1,
@ -116,7 +116,7 @@ function WireGPU_FromBox_Helper(name, model, boxmin, boxmax, rot, translucent)
local monitor = { local monitor = {
Name = name, Name = name,
offset = offset, offset = offset,
RS = (y2-y1)/512, RS = (y2-y1)/1024,
RatioX = (y2-y1)/(x2-x1), RatioX = (y2-y1)/(x2-x1),
x1 = x1, x1 = x1,
@ -181,6 +181,47 @@ WireGPU_AddMonitor("Panel 0.5x0.5", "models/hunter/plates/plate05x05.mdl",
WireGPU_AddMonitor("Tray", "models/props/cs_militia/reload_bullet_tray.mdl", 0 , 0.8 , 0 , nil , 0 , 7.68 , 0 , 4.608 , true) WireGPU_AddMonitor("Tray", "models/props/cs_militia/reload_bullet_tray.mdl", 0 , 0.8 , 0 , nil , 0 , 7.68 , 0 , 4.608 , true)
WireGPU_FromBox_Helper("Wall-mounted TV", "models/props_wasteland/controlroom_monitor001b.mdl", Vector(-10.2,-12.6,-3), Vector(10.7,4.7,15.38), Angle(0, 90, 103.2)) WireGPU_FromBox_Helper("Wall-mounted TV", "models/props_wasteland/controlroom_monitor001b.mdl", Vector(-10.2,-12.6,-3), Vector(10.7,4.7,15.38), Angle(0, 90, 103.2))
WireGPU_FromBox_Helper("Oscilloscope", "models/props_lab/reciever01b.mdl", Vector(-5.93,-2,-3), Vector(-1.74,2.1,6.225), Angle(0, 90, 90)) WireGPU_FromBox_Helper("Oscilloscope", "models/props_lab/reciever01b.mdl", Vector(-5.93,-2,-3), Vector(-1.74,2.1,6.225), Angle(0, 90, 90))
WireGPU_FromBox_Helper("Oscilloscope 2", "models/props_c17/consolebox03a.mdl", Vector(4,2,-10), Vector(10.6,7.1,10), Angle(0, 90, 90))
WireGPU_FromBox_Helper("Oscilloscope 3", "models/props_c17/consolebox05a.mdl", Vector(-6,0,-10), Vector(0.9,5.1,11), Angle(0, 90, 87))
WireGPU_FromBox_Helper("Receiver", "models/props_lab/reciever01c.mdl", Vector(-5.2,-1.7,-3), Vector(-0.2,0.8,5.5), Angle(0, 90, 90))
WireGPU_FromBox_Helper("Receiver 2", "models/props_lab/reciever01d.mdl", Vector(-5.2,-1.7,-3), Vector(-0.2,0.8,5.5), Angle(0, 90, 90))
WireGPU_FromBox_Helper("Oscilloscope 4", "models/props_c17/consolebox01a.mdl", Vector(8.5,7.2,-10), Vector(15,9.4,16.4), Angle(0, 90, 90))
WireGPU_FromBox_Helper("Combine Console", "models/props_combine/combine_interface001.mdl", Vector(-9.9,25.6,-10), Vector(5.7,33.5,34.2), Angle(0, 90, 41.5))
WireGPU_FromBox_Helper("Cash Register", "models/props_c17/cashregister01a.mdl", Vector(-9.2,8.5,-10), Vector(4.4,11.6,-5.9), Angle(0, 180, 90))
WireGPU_FromBox_Helper("Combine Monitor", "models/props_combine/combine_monitorbay.mdl", Vector(-30.7,-26,-10), Vector(38,34.7,-4.31), Angle(0, 90, 90))
WireGPU_FromBox_Helper("Workspace 001", "models/props_lab/workspace001.mdl", Vector(4,37,0), Vector(21.2,52,11.1), Angle(0, 15, 83))
WireGPU_FromBox_Helper("Radio", "models/props_lab/citizenradio.mdl", Vector(-5.8,11.7,-3), Vector(11.3,15.3,8.2), Angle(0, 90, 90))
WireGPU_FromBox_Helper("Security Bank", "models/props_lab/securitybank.mdl", Vector(-4.6,66,-3), Vector(25,86.5,12), Angle(0, 90, 90))
WireGPU_FromBox_Helper("GPS", "models/beer/wiremod/gps.mdl", Vector(-2.9,-2.1,-3), Vector(2.9,2.9,1.18), Angle(0, 90, 0))
WireGPU_FromBox_Helper("E2", "models/beer/wiremod/gate_e2.mdl", Vector(-2.8,-2.8,-3), Vector(2.8,2.8,0.55), Angle(0, 90, 0))
WireGPU_FromBox_Helper("Target Finder", "models/beer/wiremod/targetfinder.mdl", Vector(-3.2,-2.3,-3), Vector(3.2,1.2,1.5), Angle(0, 90, 0))
WireGPU_FromBox_Helper("4-pin DIP", "models/bull/gates/microcontroller1.mdl", Vector(-2.3,-1.2,-3), Vector(2.3,1.2,0.96), Angle(0, 90, 0))
WireGPU_FromBox_Helper("8-pin DIP", "models/bull/gates/microcontroller2.mdl", Vector(-4.3,-1.2,-3), Vector(4.3,1.2,0.96), Angle(0, 90, 0))
WireGPU_FromBox_Helper("Gate", "models/jaanus/wiretool/wiretool_gate.mdl", Vector(-2.9,-2.9,-3), Vector(2.9,2.9,0.82), Angle(0, 90, 0))
WireGPU_FromBox_Helper("Controller", "models/jaanus/wiretool/wiretool_controlchip.mdl",Vector(-3.4,-1.5,-3), Vector(3.4,1.5,0.82), Angle(0, 90, 0))
WireGPU_FromBox_Helper("Keypad", "models/props_lab/keypad.mdl", Vector(-1.7,2,-3), Vector(1.7,4,0.68), Angle(0, 90, 90))
WireGPU_FromBox_Helper("C4", "models/weapons/w_c4_planted.mdl", Vector(1.5,1.35,-3), Vector(7.8,4.6,8.65), Angle(0, -90, 0))
WireGPU_FromBox_Helper("Toolgun", "models/weapons/w_toolgun.mdl", Vector(-1.4,4.7,-3), Vector(1.05,7.16,-0.14), Angle(0, -90, 45))
WireGPU_FromBox_Helper("Blue Panel 1x1", "models/xqm/panel1x1.mdl", Vector(-9.2,-9.2,-3), Vector(9.2,9.2,-0.3), Angle(0, -90, 0))
WireGPU_FromBox_Helper("Blue Panel 1x2", "models/xqm/panel1x2.mdl", Vector(-9.2,-31.2,-3), Vector(9.2,9.2,-0.3), Angle(0, -90, 0))
WireGPU_FromBox_Helper("Blue Box", "models/xqm/box5s.mdl", Vector(-9.2,-9.2,-3), Vector(9.2,9.2,9.3), Angle(0, -90, 90))
WireGPU_FromBox_Helper("Teleporter", "models/props_lab/miniteleport.mdl", Vector(20.8,-8.1,-3), Vector(30.2,-3.7,17.8), Angle(0, 90, 55))
WireGPU_FromBox_Helper("Printer", "models/props_lab/plotter.mdl", Vector(-10.2,-19.5,-3), Vector(-6.7,-18.3,39.6), Angle(0, 90, 0))
WireGPU_FromBox_Helper("Combine Console 2", "models/props_combine/combine_interface002.mdl", Vector(-14.15,27.5,-10), Vector(11.5,32.3,34.2), Angle(0, 90, 41.5))
WireGPU_FromBox_Helper("Combine Console 3", "models/props_combine/combine_interface003.mdl", Vector(-20.3,48.7,-10), Vector(19.9,50.9,13), Angle(0.5, 91, 70))
WireGPU_FromBox_Helper("Combine Monitor 2", "models/props_combine/combine_intmonitor003.mdl", Vector(-17,0,-10), Vector(15,48.5,22.8), Angle(0, 90, 90))
WireGPU_FromBox_Helper("Combine Monitor 3", "models/props_combine/combine_intmonitor001.mdl", Vector(-16,3,-10), Vector(10,48.5,-4.1), Angle(0, 90, 90))
WireGPU_FromBox_Helper("Workspace 003", "models/props_lab/workspace003.mdl", Vector(110,73.3,-3), Vector(149,96,-1), Angle(0, 90, 101))
WireGPU_FromBox_Helper("Workspace 004", "models/props_lab/workspace004.mdl", Vector(4.2,37,0), Vector(21.4,52,11.1), Angle(0, 15, 83))
WireGPU_FromBox_Helper("Servers", "models/props_lab/servers.mdl", Vector(-18.2,7.8,0), Vector(-4.7,19.1,12.1), Angle(0, 90, 82))
WireGPU_AddMonitor("Plasma TV (16:10) 2", "models/props_phx/rt_screen.mdl", 6.1 , 18.93, 0 , 0.065 , -28.5 , 28.5 , 2 , 36 )
WireGPU_FromBox_Helper("8x2 LCD", "models/fasteroid/bull/lcd1.mdl", Vector(-4.91,-1.02,-3), Vector(1.31,1.02,0.8), Angle(0, 90, 0))
WireGPU_FromBox_Helper("16x2 LCD", "models/fasteroid/bull/lcd2.mdl", Vector(-4.91,-1.02,-3), Vector(7.52,1.02,0.8), Angle(0, 90, 0))
WireGPU_FromBox_Helper("16x4 LCD", "models/fasteroid/bull/lcd3.mdl", Vector(-4.91,-3.11,-3), Vector(7.52,1.02,0.8), Angle(0, 90, 0))
WireGPU_FromBox_Helper("40x4 LCD", "models/fasteroid/bull/lcd4.mdl", Vector(-4.91,-3.11,-3), Vector(26.22,1.02,0.8), Angle(0, 90, 0))
WireGPU_FromBox_Helper("20x4 LCD", "models/fasteroid/bull/lcd5.mdl", Vector(-4.91,-3.11,-3), Vector(10.65,1.02,0.8), Angle(0, 90, 0))
-- Offset front, offset up, offset right, resolution/scale OF OU OR SCALE LOWX HIGHX LOWY HIGHY ROTATE90 -- Offset front, offset up, offset right, resolution/scale OF OU OR SCALE LOWX HIGHX LOWY HIGHY ROTATE90
--WireGPU_AddMonitor("LED Board (1:1)", "models/blacknecro/ledboard60.mdl", 6.1, 18.5 , 11 , 0.065 , -60 , 60 , -60 , 60 ) -- broken --WireGPU_AddMonitor("LED Board (1:1)", "models/blacknecro/ledboard60.mdl", 6.1, 18.5 , 11 , 0.065 , -60 , 60 , -60 , 60 ) -- broken
@ -226,3 +267,4 @@ local function fallback(self, model)
end end
setmetatable(WireGPU_Monitors, { __index = fallback }) setmetatable(WireGPU_Monitors, { __index = fallback })

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
resource/fonts/alphalcd.ttf Normal file

Binary file not shown.