Skip to content

Commit 2a91825

Browse files
committed
HQ Geometry by Shoker
1 parent b47a3e9 commit 2a91825

File tree

4 files changed

+810
-69
lines changed

4 files changed

+810
-69
lines changed

res/gamedata/shaders/r1/skin.h

Lines changed: 267 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,267 @@
1+
#ifndef SKIN_H
2+
#define SKIN_H
3+
4+
#include "common.h"
5+
6+
struct v_model_skinned_0
7+
{
8+
float4 P : POSITION; // (float,float,float,1) - quantized // short4
9+
float3 N : NORMAL; // normal // DWORD
10+
float3 T : TANGENT; // tangent // DWORD
11+
float3 B : BINORMAL; // binormal // DWORD
12+
float2 tc : TEXCOORD0; // (u,v) // short2
13+
};
14+
struct v_model_skinned_1 // 24 bytes
15+
{
16+
float4 P : POSITION; // (float,float,float,1) - quantized // short4
17+
int4 N : NORMAL; // (nx,ny,nz,index) // DWORD
18+
float3 T : TANGENT; // tangent // DWORD
19+
float3 B : BINORMAL; // binormal // DWORD
20+
float2 tc : TEXCOORD0; // (u,v) // short2
21+
};
22+
struct v_model_skinned_2 // 28 bytes
23+
{
24+
float4 P : POSITION; // (float,float,float,1) - quantized // short4
25+
float4 N : NORMAL; // (nx,ny,nz,weight) // DWORD
26+
float3 T : TANGENT; // tangent // DWORD
27+
float3 B : BINORMAL; // binormal // DWORD
28+
int4 tc : TEXCOORD0; // (u,v, w=m-index0, z=m-index1) // short4
29+
};
30+
31+
struct v_model_skinned_3 // 28 bytes
32+
{
33+
float4 P : POSITION; // (float,float,float,1) - quantized // short4
34+
float4 N : NORMAL; // (nx,ny,nz,weight0) // DWORD
35+
float4 T : TANGENT; // (tx,ty,tz,weight1) // DWORD
36+
float4 B : BINORMAL; // (bx,by,bz,m-index2) // DWORD
37+
int4 tc : TEXCOORD0; // (u,v, w=m-index0, z=m-index1) // short4
38+
};
39+
40+
struct v_model_skinned_4 // 28 bytes
41+
{
42+
float4 P : POSITION; // (float,float,float,1) - quantized // short4
43+
float4 N : NORMAL; // (nx,ny,nz,weight0) // DWORD
44+
float4 T : TANGENT; // (tx,ty,tz,weight1) // DWORD
45+
float4 B : BINORMAL; // (bx,by,bz,weight2) // DWORD
46+
int2 tc : TEXCOORD0; // (u,v) // short2
47+
float4 ind: TEXCOORD1; // (x=m-index0, y=m-index1, z=m-index2, w=m-index3) // DWORD
48+
};
49+
50+
//////////////////////////////////////////////////////////////////////////////////////////
51+
52+
float4 u_position (float4 v) { return float4(v.xyz, 1.f); } // -12..+12
53+
54+
//////////////////////////////////////////////////////////////////////////////////////////
55+
//uniform float4 sbones_array [256-22] : register(vs,c22);
56+
// Igor: some shaders in r1 need more free constant registers
57+
uniform float4 sbones_array [255-22-3] : register(vs,c22);
58+
float3 skinning_dir (float3 dir, float3 m0, float3 m1, float3 m2)
59+
{
60+
float3 U = unpack_normal(dir);
61+
return float3
62+
(
63+
dot (m0, U),
64+
dot (m1, U),
65+
dot (m2, U)
66+
);
67+
}
68+
float4 skinning_pos (float4 pos, float4 m0, float4 m1, float4 m2)
69+
{
70+
float4 P = u_position (pos);
71+
return float4
72+
(
73+
dot (m0, P),
74+
dot (m1, P),
75+
dot (m2, P),
76+
1
77+
);
78+
}
79+
80+
v_model skinning_0 (v_model_skinned_0 v)
81+
{
82+
// skinning
83+
v_model o;
84+
o.pos = u_position(v.P);
85+
o.norm = unpack_normal(v.N);
86+
o.T = unpack_normal(v.T);
87+
o.B = unpack_normal(v.B);
88+
o.tc = v.tc;
89+
#ifdef SKIN_COLOR
90+
o.rgb_tint = float3 (0,0,2);
91+
#endif
92+
return o;
93+
}
94+
v_model skinning_1 (v_model_skinned_1 v)
95+
{
96+
// matrices
97+
int mid = v.N.w * (int)255;
98+
float4 m0 = sbones_array[mid+0];
99+
float4 m1 = sbones_array[mid+1];
100+
float4 m2 = sbones_array[mid+2];
101+
102+
// skinning
103+
v_model o;
104+
o.pos = skinning_pos(v.P, m0,m1,m2 );
105+
o.norm = skinning_dir(v.N, m0,m1,m2 );
106+
o.T = skinning_dir(v.T, m0,m1,m2 );
107+
o.B = skinning_dir(v.B, m0,m1,m2 );
108+
o.tc = v.tc;
109+
#ifdef SKIN_COLOR
110+
o.rgb_tint = float3 (0,2,0);
111+
#endif
112+
return o;
113+
}
114+
v_model skinning_2 (v_model_skinned_2 v)
115+
{
116+
// matrices
117+
int id_0 = v.tc.z;
118+
float4 m0_0 = sbones_array[id_0+0];
119+
float4 m1_0 = sbones_array[id_0+1];
120+
float4 m2_0 = sbones_array[id_0+2];
121+
int id_1 = v.tc.w;
122+
float4 m0_1 = sbones_array[id_1+0];
123+
float4 m1_1 = sbones_array[id_1+1];
124+
float4 m2_1 = sbones_array[id_1+2];
125+
126+
// lerp
127+
float w = v.N.w;
128+
float4 m0 = lerp(m0_0,m0_1,w);
129+
float4 m1 = lerp(m1_0,m1_1,w);
130+
float4 m2 = lerp(m2_0,m2_1,w);
131+
132+
// skinning
133+
v_model o;
134+
o.pos = skinning_pos(v.P, m0,m1,m2 );
135+
o.norm = skinning_dir(v.N, m0,m1,m2 );
136+
o.T = skinning_dir(v.T, m0,m1,m2 );
137+
o.B = skinning_dir(v.B, m0,m1,m2 );
138+
o.tc = v.tc;
139+
#ifdef SKIN_COLOR
140+
o.rgb_tint = float3 (2,0,0) ;
141+
if (id_0==id_1) o.rgb_tint = float3(1,2,0);
142+
#endif
143+
return o;
144+
}
145+
146+
v_model skinning_2lq (v_model_skinned_2 v)
147+
{
148+
// matrices
149+
int id_0 = v.tc.z;
150+
float4 m0 = sbones_array[id_0+0];
151+
float4 m1 = sbones_array[id_0+1];
152+
float4 m2 = sbones_array[id_0+2];
153+
154+
// skinning
155+
v_model o ;
156+
o.pos = skinning_pos (v.P, m0,m1,m2 );
157+
o.norm = skinning_dir (v.N, m0,m1,m2 );
158+
o.T = skinning_dir (v.T, m0,m1,m2 );
159+
o.B = skinning_dir (v.B, m0,m1,m2 );
160+
o.tc = v.tc;
161+
#ifdef SKIN_COLOR
162+
o.rgb_tint = float3 (0,2,0) ;
163+
#endif
164+
return o;
165+
}
166+
167+
v_model skinning_3 (v_model_skinned_3 v)
168+
{
169+
// matrices
170+
int id_0 = v.tc.z;
171+
float4 m0_0 = sbones_array[id_0+0];
172+
float4 m1_0 = sbones_array[id_0+1];
173+
float4 m2_0 = sbones_array[id_0+2];
174+
int id_1 = v.tc.w;
175+
float4 m0_1 = sbones_array[id_1+0];
176+
float4 m1_1 = sbones_array[id_1+1];
177+
float4 m2_1 = sbones_array[id_1+2];
178+
int id_2 = v.B.w*255+0.3;
179+
float4 m0_2 = sbones_array[id_2+0];
180+
float4 m1_2 = sbones_array[id_2+1];
181+
float4 m2_2 = sbones_array[id_2+2];
182+
183+
// lerp
184+
float w0 = v.N.w;
185+
float w1 = v.T.w;
186+
float w2 = 1-w0-w1;
187+
float4 m0 = m0_0*w0;
188+
float4 m1 = m1_0*w0;
189+
float4 m2 = m2_0*w0;
190+
191+
m0 += m0_1*w1;
192+
m1 += m1_1*w1;
193+
m2 += m2_1*w1;
194+
195+
m0 += m0_2*w2;
196+
m1 += m1_2*w2;
197+
m2 += m2_2*w2;
198+
199+
// skinning
200+
v_model o;
201+
o.pos = skinning_pos(v.P, m0,m1,m2 );
202+
o.norm = skinning_dir(v.N, m0,m1,m2 );
203+
o.T = skinning_dir(v.T, m0,m1,m2 );
204+
o.B = skinning_dir(v.B, m0,m1,m2 );
205+
o.tc = v.tc;
206+
#ifdef SKIN_COLOR
207+
o.rgb_tint = float3 (2,0,0) ;
208+
if (id_0==id_1) o.rgb_tint = float3(1,2,0);
209+
#endif
210+
return o;
211+
}
212+
213+
v_model skinning_3lq (v_model_skinned_3 v)
214+
{
215+
return skinning_3(v);
216+
}
217+
218+
v_model skinning_4 (v_model_skinned_4 v)
219+
{
220+
// matrices
221+
float id[4];
222+
float4 m[4][3]; // [bone index][matrix row or column???]
223+
for (int i=0; i<4; ++i)
224+
{
225+
id[i] = v.ind[i]*255+0.3;
226+
for (int j=0; j<3; ++j)
227+
m[i][j] = sbones_array[id[i]+j];
228+
}
229+
230+
// lerp
231+
float w[4];
232+
w[0] = v.N.w;
233+
w[1] = v.T.w;
234+
w[2] = v.B.w;
235+
w[3] = 1-w[0]-w[1]-w[2];
236+
237+
float4 m0 = m[0][0]*w[0];
238+
float4 m1 = m[0][1]*w[0];
239+
float4 m2 = m[0][2]*w[0];
240+
241+
for (int i=1; i<4; ++i)
242+
{
243+
m0 += m[i][0]*w[i];
244+
m1 += m[i][1]*w[i];
245+
m2 += m[i][2]*w[i];
246+
}
247+
248+
// skinning
249+
v_model o;
250+
o.pos = skinning_pos(v.P, m0,m1,m2 );
251+
o.norm = skinning_dir(v.N, m0,m1,m2 );
252+
o.T = skinning_dir(v.T, m0,m1,m2 );
253+
o.B = skinning_dir(v.B, m0,m1,m2 );
254+
o.tc = v.tc;
255+
#ifdef SKIN_COLOR
256+
o.rgb_tint = float3 (2,0,0) ;
257+
if (id_0==id_1) o.rgb_tint = float3(1,2,0);
258+
#endif
259+
return o;
260+
}
261+
262+
v_model skinning_4lq (v_model_skinned_4 v)
263+
{
264+
return skinning_4(v);
265+
}
266+
267+
#endif

0 commit comments

Comments
 (0)