137 lines
3.6 KiB
Lua
137 lines
3.6 KiB
Lua
--[[
|
|
This file is part of Ice Lua Components.
|
|
|
|
Ice Lua Components is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU Lesser General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
Ice Lua Components is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public License
|
|
along with Ice Lua Components. If not, see <http://www.gnu.org/licenses/>.
|
|
]]
|
|
|
|
function new_border(x, y, z, nx, ny, nz, r, g, b)
|
|
local this = {} this.this = this
|
|
|
|
-- load parameters
|
|
this.x, this.y, this.z = x, y, z
|
|
this.nx, this.ny, this.nz = nx, ny, nz
|
|
this.r, this.g, this.b = r, g, b
|
|
|
|
-- set starting values
|
|
this.ang, this.amp = 0, 0
|
|
this.u, this.v = 0, 0
|
|
this.t_next = nil
|
|
|
|
-- generate model
|
|
if client then
|
|
if common.version.num >= 8421376+1 then
|
|
local i, j
|
|
local l = {}
|
|
|
|
local function point(i, j, u)
|
|
local v = (j/16+1)/2
|
|
return {
|
|
(this.ny*i + this.nz*j)*8,
|
|
(this.nz*i + this.nx*j)*8,
|
|
(this.nx*i + this.ny*j)*8,
|
|
r/255.0, g/255.0, b/255.0, (math.max(i*i, j*j)/256)*0.5+0.3,
|
|
u, v,
|
|
}
|
|
end
|
|
for i=-16,15,8 do
|
|
for j=-16,15,8 do
|
|
local p00 = point(i+0, j+0, 0)
|
|
local p01 = point(i+0, j+8, 0)
|
|
local p10 = point(i+8, j+0, 1)
|
|
local p11 = point(i+8, j+8, 1)
|
|
|
|
l[1+#l] = p00
|
|
l[1+#l] = p10
|
|
l[1+#l] = p01
|
|
l[1+#l] = p01
|
|
l[1+#l] = p10
|
|
l[1+#l] = p11
|
|
|
|
l[1+#l] = p11
|
|
l[1+#l] = p10
|
|
l[1+#l] = p01
|
|
l[1+#l] = p01
|
|
l[1+#l] = p10
|
|
l[1+#l] = p00
|
|
end
|
|
end
|
|
|
|
this.va_border = common.va_make(l, nil, "3v,4c,2t")
|
|
else
|
|
this.mdl_border = common.model_new(1)
|
|
this.mdl_border, this.mdl_border_bone = common.model_bone_new(this.mdl_border, 1024)
|
|
|
|
local i, j
|
|
local l = {}
|
|
for i=-16,15 do
|
|
for j=-16,15 do
|
|
l[#l+1] = {
|
|
x = (this.ny*i + this.nz*j)*8,
|
|
y = (this.nz*i + this.nx*j)*8,
|
|
z = (this.nx*i + this.ny*j)*8,
|
|
r = this.r, g = this.g, b = this.b,
|
|
radius = 1,
|
|
}
|
|
end
|
|
end
|
|
common.model_bone_set(this.mdl_border, this.mdl_border_bone, "border", l)
|
|
end
|
|
end
|
|
|
|
function this.tick(sec_current, sec_delta)
|
|
if not (this.t_next and this.t_next > sec_current) then
|
|
this.t_next = sec_current + 0.2 + math.random()*0.6
|
|
this.amp = math.random()*50.0+10.0
|
|
this.ang = math.random()*math.pi*2
|
|
end
|
|
|
|
this.u = this.u + this.amp*math.cos(this.ang)*sec_delta
|
|
this.v = this.v + this.amp*math.sin(this.ang)*sec_delta
|
|
this.u = this.u % 8.0
|
|
this.v = this.v % 8.0
|
|
end
|
|
|
|
function this.render()
|
|
local gran = 8
|
|
local cx, cy, cz
|
|
cx, cy, cz = client.camera_get_pos()
|
|
cx = math.floor(cx/gran)*gran
|
|
cy = math.floor(cy/gran)*gran
|
|
cz = math.floor(cz/gran)*gran
|
|
|
|
local x, y, z
|
|
if this.va_border then
|
|
this.u = 0
|
|
this.v = 0
|
|
end
|
|
x = this.x*this.nx + cx*(1-this.nx) + this.ny*this.u + this.nz*this.v
|
|
y = this.y*this.ny + cy*(1-this.ny) + this.nz*this.u + this.nx*this.v
|
|
z = this.z*this.nz + cz*(1-this.nz) + this.nx*this.u + this.ny*this.v
|
|
|
|
if this.va_border then
|
|
if client.gfx_depth_mask then client.gfx_depth_mask(false) end
|
|
client.va_render_global(this.va_border,
|
|
x, y, z, 0, 0, 0, 1,
|
|
nil, "ah")
|
|
if client.gfx_depth_mask then client.gfx_depth_mask(true) end
|
|
else
|
|
client.model_render_bone_global(this.mdl_border, this.mdl_border_bone,
|
|
x, y, z, 0, 0, 0, 256)
|
|
end
|
|
end
|
|
|
|
return this
|
|
end
|
|
|