mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-26 22:31:05 +00:00
ff27da4a05
It turns out bsp faces are still back-face culled despite the null point being on the front of every possible plane... or really, because it's on the front of every possible plane: sometimes the back face is the front face, and this breaks the face selection code (a separate traversal function will be needed for non-culling rendering). Despite that, other than having to deal with different pipelines, getting the model renderers working went better than expected.
68 lines
1.9 KiB
GLSL
68 lines
1.9 KiB
GLSL
#version 450
|
|
#extension GL_GOOGLE_include_directive : enable
|
|
#extension GL_EXT_multiview : enable
|
|
|
|
layout (constant_id = 0) const bool IQMDepthOnly = false;
|
|
layout (constant_id = 1) const bool IQMShadow = false;
|
|
|
|
layout (set = 0, binding = 0) uniform
|
|
#include "matrices.h"
|
|
;
|
|
|
|
layout (set = 1, binding = 0) buffer ShadowView {
|
|
mat4x4 shadowView[];
|
|
};
|
|
|
|
layout (set = 3, binding = 0) buffer Bones {
|
|
// NOTE these are transposed, so v * m
|
|
mat3x4 bones[];
|
|
};
|
|
|
|
layout (push_constant) uniform PushConstants {
|
|
mat4 Model;
|
|
float blend;
|
|
uint MatrixBase;
|
|
};
|
|
|
|
layout (location = 0) in vec3 vposition;
|
|
layout (location = 1) in uvec4 vbones;
|
|
layout (location = 2) in vec4 vweights;
|
|
layout (location = 3) in vec2 vtexcoord;
|
|
layout (location = 4) in vec3 vnormal;
|
|
layout (location = 5) in vec4 vtangent;
|
|
layout (location = 6) in vec4 vcolor;
|
|
|
|
layout (location = 0) out vec2 texcoord;
|
|
layout (location = 1) out vec4 position;
|
|
layout (location = 2) out vec3 normal;
|
|
layout (location = 3) out vec3 tangent;
|
|
layout (location = 4) out vec3 bitangent;
|
|
layout (location = 5) out vec4 color;
|
|
|
|
void
|
|
main (void)
|
|
{
|
|
mat3x4 m = bones[vbones.x] * vweights.x;
|
|
m += bones[vbones.y] * vweights.y;
|
|
m += bones[vbones.z] * vweights.z;
|
|
m += bones[vbones.w] * vweights.w;
|
|
vec4 pos = Model * vec4 (vec4(vposition, 1) * m, 1);
|
|
if (IQMShadow) {
|
|
gl_Position = shadowView[MatrixBase + gl_ViewIndex] * pos;
|
|
} else {
|
|
gl_Position = Projection3d * (View[gl_ViewIndex] * pos);
|
|
}
|
|
|
|
if (!IQMDepthOnly) {
|
|
position = pos;
|
|
mat3 adjTrans = mat3 (cross(m[1].xyz, m[2].xyz),
|
|
cross(m[2].xyz, m[0].xyz),
|
|
cross(m[0].xyz, m[1].xyz));
|
|
normal = normalize (mat3 (Model) * vnormal * adjTrans);
|
|
tangent = mat3 (Model) * vtangent.xyz * adjTrans;
|
|
tangent = normalize (tangent - dot (tangent, normal) * normal);
|
|
bitangent = cross (normal, tangent) * vtangent.w;
|
|
texcoord = vtexcoord;
|
|
color = vcolor;
|
|
}
|
|
}
|