142 lines
3.6 KiB
Lua
142 lines
3.6 KiB
Lua
|
|
mdl_chen_head_tex = mdl_chen_head_tex or common.img_load(DIR_CHENMOD.."/mdl_chen_head.png", "png")
|
|
|
|
do
|
|
local settings = ...
|
|
|
|
local this = {}
|
|
|
|
this.tex = mdl_chen_head_tex
|
|
|
|
do
|
|
local l = {}
|
|
|
|
-- Head
|
|
local function add_sphere(l, ucount, vcount, rscale, vscale, yoffs, xoffs, zoffs)
|
|
local function uvmap(u, v)
|
|
local amp = math.sin(v)
|
|
amp = amp*rscale
|
|
local rs = math.sin(u*2)
|
|
local rc = math.cos(u*2)
|
|
|
|
return rs*amp + xoffs, -(math.cos(v)-1)*vscale + yoffs, rc*amp + zoffs
|
|
end
|
|
|
|
local function vfilt(v)
|
|
return 1-math.acos((v*2-1)/2)
|
|
end
|
|
|
|
local iu, iv
|
|
local u0 = 0
|
|
local v0 = 0
|
|
local u1 = 1/ucount
|
|
local v1 = 1/vcount
|
|
local au0 = 0
|
|
local av0 = 0
|
|
local au1 = math.pi/ucount
|
|
local av1 = math.pi/vcount
|
|
for iu=0,ucount-1 do
|
|
for iv=0,vcount-1 do
|
|
local u = iu*math.pi/ucount
|
|
local v = iv*math.pi/vcount
|
|
local x00, y00, z00 = uvmap(u+au0, v+av0)
|
|
local x01, y01, z01 = uvmap(u+au0, v+av1)
|
|
local x10, y10, z10 = uvmap(u+au1, v+av0)
|
|
local x11, y11, z11 = uvmap(u+au1, v+av1)
|
|
|
|
u = (iu/ucount)%1
|
|
v = math.max(0.0, math.min(1.0, iv/vcount))
|
|
|
|
l[1+#l] = {x00, y00, z00, u+u0, vfilt(v+v0)}
|
|
l[1+#l] = {x01, y01, z01, u+u0, vfilt(v+v1)}
|
|
l[1+#l] = {x10, y10, z10, u+u1, vfilt(v+v0)}
|
|
l[1+#l] = {x10, y10, z10, u+u1, vfilt(v+v0)}
|
|
l[1+#l] = {x01, y01, z01, u+u0, vfilt(v+v1)}
|
|
l[1+#l] = {x11, y11, z11, u+u1, vfilt(v+v1)}
|
|
end
|
|
end
|
|
end
|
|
|
|
add_sphere(l, 16, 10, 0.55, 0.4, -0.4, 0, 0)
|
|
--add_sphere(l, 16, 10, 0.1, 0.15, 0.2, -0.22, -0.7)
|
|
|
|
this.va_base = common.va_make(l, nil, "3v,2t")
|
|
l = {}
|
|
|
|
-- Cat ears
|
|
local i
|
|
for i=-1,1,2 do
|
|
local r0,g0,b0 = 0x6b/255, 0x59/255, 0x36/255
|
|
local r1,g1,b1 = 0xf3/255, 0xb5/255, 0xbe/255
|
|
local x0,y0,z0 = i*0.5, -0.0,-0.1
|
|
local x1,y1,z1 = i*0.3, -0.5,-0.1
|
|
local x2,y2,z2 = i*0.3, -0.3, 0.2
|
|
local x3,y3,z3 = i*0.1, -0.3,-0.1
|
|
|
|
if i < 0 then
|
|
r0,g0,b0,r1,g1,b1 = r1,g1,b1,r0,g0,b0
|
|
end
|
|
|
|
l[1+#l] = {x0, y0, z0, r0, g0, b0}
|
|
l[1+#l] = {x1, y1, z1, r0, g0, b0}
|
|
l[1+#l] = {x2, y2, z2, r0, g0, b0}
|
|
l[1+#l] = {x2, y2, z2, r1, g1, b1}
|
|
l[1+#l] = {x1, y1, z1, r1, g1, b1}
|
|
l[1+#l] = {x0, y0, z0, r1, g1, b1}
|
|
l[1+#l] = {x3, y3, z3, r0, g0, b0}
|
|
l[1+#l] = {x2, y2, z2, r0, g0, b0}
|
|
l[1+#l] = {x1, y1, z1, r0, g0, b0}
|
|
l[1+#l] = {x1, y1, z1, r1, g1, b1}
|
|
l[1+#l] = {x2, y2, z2, r1, g1, b1}
|
|
l[1+#l] = {x3, y3, z3, r1, g1, b1}
|
|
end
|
|
|
|
-- Night cap
|
|
do
|
|
local function point(a, y, hamp)
|
|
local sa = math.sin(a*math.pi*2)
|
|
local ca = math.cos(a*math.pi*2)
|
|
|
|
return ca*hamp, y, sa*hamp
|
|
end
|
|
local xc,yc,zc = 0,-0.5,0
|
|
local r0,g0,b0 = 0x0b/255, 0xf4/255, 0x57/255
|
|
local r1,g1,b1 = 0xf0/255, 0xff/255, 0xf0/255
|
|
local i
|
|
for i=0,(10-1) do
|
|
local a0 = i/10
|
|
local a1 = (i+1)/10
|
|
local x0,y0,z0 = point(a0,-0.4,0.2)
|
|
local x1,y1,z1 = point(a1,-0.4,0.2)
|
|
local x2,y2,z2 = point((a0+a1)/2,-0.3,0.3)
|
|
--local x3,y3,z3 = point(a1,-0.3,0.3)
|
|
l[1+#l] = {x1, y1, z1, r0, g0, b0}
|
|
l[1+#l] = {x0, y0, z0, r0, g0, b0}
|
|
l[1+#l] = {xc, yc, zc, r0, g0, b0}
|
|
|
|
l[1+#l] = {x0, y0, z0, r1, g1, b1}
|
|
l[1+#l] = {x1, y1, z1, r1, g1, b1}
|
|
l[1+#l] = {x2, y2, z2, r1, g1, b1}
|
|
end
|
|
end
|
|
|
|
this.va_aux = common.va_make(l, nil, "3v,3c")
|
|
l = {}
|
|
|
|
end
|
|
|
|
function this.render_global(x, y, z, r1, r2, r3, s)
|
|
client.va_render_global(this.va_base, x, y, z, r1, r2, r3, s, this.tex)
|
|
client.va_render_global(this.va_aux, x, y, z, r1, r2, r3, s, nil)
|
|
end
|
|
|
|
function this.render_local(x, y, z, r1, r2, r3, s)
|
|
client.va_render_local(this.va_base, -x, y, z, r1, r2, r3, s, this.tex)
|
|
client.va_render_local(this.va_aux, x, y, z, r1, r2, r3, s, nil)
|
|
end
|
|
|
|
return this
|
|
|
|
end
|
|
|