buldthensnip/pkg/gm/chen/mdl_chen_head.lua
Ben Russell (300178622) 465af15780 hat + ears for chenmod
2015-02-19 11:32:36 +13:00

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