Files
TheDeclineOfWarriors/docs/shaders/functionlibs.glsl
T
2026-04-12 16:40:54 +07:00

100 lines
3.3 KiB
GLSL

//Basic functions that should exist in glsl already, why arent they built in
float pow2(float a){return pow(2,a);}
vec2 pow2(vec2 a){return vec2(pow(2,a.x),pow(2,a.y));}
vec3 pow2(vec3 a){return vec3(pow(2,a.x),pow(2,a.y),pow(2,a.z));}
vec4 pow2(vec4 a){return vec4(pow(2,a.x),pow(2,a.y),pow(2,a.z),pow(2,a.w));}
float dot2(float a){return a*a;}
float dot2(vec2 a){return dot(a,a);}
float dot2(vec3 a){return dot(a,a);}
float dot2(vec4 a){return dot(a,a);}
float mix3(float a,float b,float c,float fac){return mix(mix(a,b,fac),mix(b,c,fac),fac);}
vec2 mix3(vec2 a,vec2 b,vec2 c,float fac){return mix(mix(a,b,fac),mix(b,c,fac),fac);}
vec3 mix3(vec3 a,vec3 b,vec3 c,float fac){return mix(mix(a,b,fac),mix(b,c,fac),fac);}
vec4 mix3(vec4 a,vec4 b,vec4 c,float fac){return mix(mix(a,b,fac),mix(b,c,fac),fac);}
float mix4(float a,float b,float c,float d,float fac){return mix(mix(mix(a,b,fac),mix(b,c,fac),fac),mix(mix(b,c,fac),mix(c,d,fac),fac),fac);}
vec2 mix4(vec2 a,vec2 b,vec2 c,vec2 d,float fac){return mix(mix(mix(a,b,fac),mix(b,c,fac),fac),mix(mix(b,c,fac),mix(c,d,fac),fac),fac);}
vec3 mix4(vec3 a,vec3 b,vec3 c,vec3 d,float fac){return mix(mix(mix(a,b,fac),mix(b,c,fac),fac),mix(mix(b,c,fac),mix(c,d,fac),fac),fac);}
vec4 mix4(vec4 a,vec4 b,vec4 c,vec4 d,float fac){return mix(mix(mix(a,b,fac),mix(b,c,fac),fac),mix(mix(b,c,fac),mix(c,d,fac),fac),fac);}
mat3 rotation3d(vec3 axis, float angle) {
axis = normalize(axis);
float s = sin(angle);
float c = cos(angle);
float oc = 1.0 - c;
return mat3(
oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s,
oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s,
oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c
);
}
//Super basic 2D rotation function.
vec2 rot(vec2 p,float a){vec2 A = p.xy*mat2(cos(a),sin(a),-sin(a),cos(a));return A;}
//Inversion function.
vec3 inv(vec3 p,vec3 ofset){
p+=ofset;
p=normalize(p)*(dot2(ofset)/length(p));
p=reflect(p,normalize(ofset));
return p+ofset;
}
//Inversion function with inverted inversion position.
vec3 inv2(vec3 p,vec3 dpos){
return length(dpos)>0.0001?inv(p,normalize(dpos)*(1/length(dpos))):p;
}
//quaternion stuff
vec4 qmul(vec4 a, vec4 b) {
return vec4(
a.w * b.xyz + b.w * a.xyz + cross(a.xyz, b.xyz),
a.w * b.w - dot(a.xyz, b.xyz)
);
}
vec4 qinv(vec4 a){
return normalize(a)*(1./length(a));
}
vec3 qrot(vec3 pos, vec3 axis, float angle) {
vec4 q = vec4(sin(angle / 2.0) * axis, cos(angle / 2.0));
vec4 partial = qmul(q, vec4(pos, 0));
// Skip calculating the real part, since it's always 0
return -partial.w * q.xyz + q.w * partial.xyz + cross(q.xyz, partial.xyz);
}
vec3 getm(mat3 matr){
return vec3(matr[0][0],matr[1][1],matr[2][2]);
}
/*
y=y-(J/2);
vec4 P=vec4(sin(x*PI/J)*(J/2),cos(z*PI/J)*y,-sin(z*PI/J)*y,cos(x*PI/J));
p=P.xyz/(1+P.w);
return (P.xyz/(1+P.w))+vec3(0,J/4,0);
mat3 NIL = mat3(
cos(a)*cosh(a),0,-sin(a)*cosh(a),
0,1,0,
sin(a)*cosh(a),0,cos(a)*cosh(a));
mat3 NIL2 = mat3(
cos(a)*cosh(a),-sin(a)*cosh(a),0,
sin(a)*cosh(a),cos(a)*cosh(a),0,
0,0,1);
mat3 SOLV=mat3(
exp(-y/J), 0, 0,
x/J, 1, -z/J,
0, 0, exp(y/J));
mat3 SOLV2=mat3(
exp(z/J), 0, 0,
0, exp(-z/J),0,
-x/J, y/J, 1);
*/