Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 20 additions & 92 deletions assets/Shaders/default.vert
Original file line number Diff line number Diff line change
Expand Up @@ -99,107 +99,35 @@ vec4 getLightResult()

vec3 transformVector(vec3 initialVector, int matrixIndex)
{
float X = (initialVector.x * modelMatricies[matrixIndex][0].x) + (initialVector.y * modelMatricies[matrixIndex][1].x) + (initialVector.z * modelMatricies[matrixIndex][2].x);
float Y = (initialVector.x * modelMatricies[matrixIndex][0].y) + (initialVector.y * modelMatricies[matrixIndex][1].y) + (initialVector.z * modelMatricies[matrixIndex][2].y);
float Z = (initialVector.x * modelMatricies[matrixIndex][0].z) + (initialVector.y * modelMatricies[matrixIndex][1].z) + (initialVector.z * modelMatricies[matrixIndex][2].z);
// ignoreW per DirectX

X += 1 * modelMatricies[matrixIndex][3].x;
Y += 1 * modelMatricies[matrixIndex][3].y;
Z += 1 * modelMatricies[matrixIndex][3].z;
return vec3(X, Y, Z);
// ignoreW per DirectX by casting vec4 result to vec3
return vec3(modelMatricies[matrixIndex] * vec4(initialVector, 1.0));
}

void main()
{
vec3 pos = vec3(iPosition);
oColor = iColor;

if(iMatrixChain.x != 0)
{
// unpack packed matrix indicies
int m0 = (iMatrixChain.x & (0xff << 24)) >> 24;
int m1 = (iMatrixChain.x >> 16) & 0xff;
int m2 = (iMatrixChain.x & 0xff00) >> 8;
int m3 = (iMatrixChain.x & 0xff);

if(m0 >=0 && m0 < 255)
{
pos = transformVector(pos, m0);
}

if(m1 >=0 && m1 < 255)
{
pos = transformVector(pos, m1);
}

if(m2 >=0 && m2 < 255)
{
pos = transformVector(pos, m2);
}

if(m3 >=0 && m3 < 255)
{
pos = transformVector(pos, m3);
}
}

if(iMatrixChain.y != 0)
{
// unpack packed matrix indicies
int m0 = (iMatrixChain.y & (0xff << 24)) >> 24;
int m1 = (iMatrixChain.y >> 16) & 0xff;
int m2 = (iMatrixChain.y & 0xff00) >> 8;
int m3 = (iMatrixChain.y & 0xff);

if(m0 >=0 && m0 < 255)
{
pos = transformVector(pos, m0);
}

if(m1 >=0 && m1 < 255)
{
pos = transformVector(pos, m1);
}

if(m2 >=0 && m2 < 255)
{
pos = transformVector(pos, m2);
}

if(m3 >=0 && m3 < 255)
{
pos = transformVector(pos, m3);
}
}

if(iMatrixChain.z != 0)
{
// unpack packed matrix indicies
int m0 = (iMatrixChain.z & (0xff << 24)) >> 24;
int m1 = (iMatrixChain.z >> 16) & 0xff;
int m2 = (iMatrixChain.z & 0xff00) >> 8;
int m3 = (iMatrixChain.z & 0xff);

if(m0 >=0 && m0 < 255)
{
pos = transformVector(pos, m0);
}

if(m1 >=0 && m1 < 255)
{
pos = transformVector(pos, m1);
}

if(m2 >=0 && m2 < 255)
// Unpack matrix indices from iMatrixChain (packed as 4 bytes per int component)
// and sequentially transform the vertex position.
for (int i = 0; i < 3; ++i)
{
int chain = iMatrixChain[i];
// Skip empty (0) and default static/unanimated (-1) matrix chain components
if (chain != 0 && chain != -1)
{
pos = transformVector(pos, m2);
// Extract individual matrix index bytes (0-254)
int m0 = (chain >> 24) & 0xff;
int m1 = (chain >> 16) & 0xff;
int m2 = (chain >> 8) & 0xff;
int m3 = chain & 0xff;

// Transform using active bone matrix
if (m0 >= 0 && m0 < 255) pos = transformVector(pos, m0);
if (m1 >= 0 && m1 < 255) pos = transformVector(pos, m1);
if (m2 >= 0 && m2 < 255) pos = transformVector(pos, m2);
if (m3 >= 0 && m3 < 255) pos = transformVector(pos, m3);
}

if(m3 >=0 && m3 < 255)
{
pos = transformVector(pos, m3);
}
}

pos.z = -pos.z;
Expand Down
5 changes: 3 additions & 2 deletions assets/Shaders/picking.frag
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
#version 150 core
#version 150 core
uniform int uObjectIndex;
out vec4 fragColor;

void main(void)
{
fragColor.r = float(uObjectIndex);
// Write object index to red channel and write 0/1 to other channels to avoid undefined behavior
fragColor = vec4(float(uObjectIndex), 0.0, 0.0, 1.0);
}
46 changes: 14 additions & 32 deletions assets/Shaders/rectangle.vert
Original file line number Diff line number Diff line change
Expand Up @@ -5,40 +5,22 @@ uniform vec2 uPoint;
uniform vec2 uSize;
uniform vec2 uCoordinates;
out vec2 textureCoord;
vec4 viewPos = vec4(0,0,0,0);

// Offset lookup table to map gl_VertexID to quad corners without branching
const vec2 offsets[6] = vec2[](
vec2(0.0, 0.0), // Top-left
vec2(1.0, 0.0), // Top-right
vec2(1.0, 1.0), // Bottom-right
vec2(0.0, 0.0), // Top-left (second triangle)
vec2(0.0, 1.0), // Bottom-left
vec2(1.0, 1.0) // Bottom-right
);

void main()
{
if(gl_VertexID == 0)
{
viewPos = uCurrentModelViewMatrix * vec4(vec3(uPoint.x, uPoint.y, 0), 1.0);
textureCoord = vec2(0,0);
}
else if (gl_VertexID == 1)
{
viewPos = uCurrentModelViewMatrix * vec4(vec3(uPoint.x + uSize.x, uPoint.y, 0), 1.0);
textureCoord = vec2(uCoordinates.x,0);
}
else if (gl_VertexID == 2)
{
viewPos = uCurrentModelViewMatrix * vec4(vec3(uPoint.x + uSize.x, uPoint.y + uSize.y, 0), 1.0);
textureCoord = uCoordinates;
}
else if (gl_VertexID == 3)
{
viewPos = uCurrentModelViewMatrix * vec4(vec3(uPoint.x, uPoint.y, 0), 1.0);
textureCoord = vec2(0,0);
}
else if (gl_VertexID == 4)
{
viewPos = uCurrentModelViewMatrix * vec4(vec3(uPoint.x, uPoint.y + uSize.y, 0), 1.0);
textureCoord = vec2(0, uCoordinates.y);
}
else if (gl_VertexID == 5)
{
viewPos = uCurrentModelViewMatrix * vec4(vec3(uPoint.x + uSize.x, uPoint.y + uSize.y, 0), 1.0);
textureCoord = uCoordinates;
}

// Calculate vertex position and texture coordinates based on current vertex ID offsets
vec2 offset = offsets[gl_VertexID];
vec4 viewPos = uCurrentModelViewMatrix * vec4(uPoint + offset * uSize, 0.0, 1.0);
textureCoord = offset * uCoordinates;
gl_Position = uCurrentProjectionMatrix * viewPos;
}
55 changes: 19 additions & 36 deletions assets/Shaders/shadow_depth.vert
Original file line number Diff line number Diff line change
Expand Up @@ -48,43 +48,26 @@ void main()
{
vec3 pos = iPosition;

if(iMatrixChain.x != 0)
{
int m0 = (iMatrixChain.x & (0xff << 24)) >> 24;
int m1 = (iMatrixChain.x >> 16) & 0xff;
int m2 = (iMatrixChain.x & 0xff00) >> 8;
int m3 = (iMatrixChain.x & 0xff);

if(m0 >=0 && m0 < 255) pos = transformVector(pos, m0);
if(m1 >=0 && m1 < 255) pos = transformVector(pos, m1);
if(m2 >=0 && m2 < 255) pos = transformVector(pos, m2);
if(m3 >=0 && m3 < 255) pos = transformVector(pos, m3);
}

if(iMatrixChain.y != 0)
{
int m0 = (iMatrixChain.y & (0xff << 24)) >> 24;
int m1 = (iMatrixChain.y >> 16) & 0xff;
int m2 = (iMatrixChain.y & 0xff00) >> 8;
int m3 = (iMatrixChain.y & 0xff);

if(m0 >=0 && m0 < 255) pos = transformVector(pos, m0);
if(m1 >=0 && m1 < 255) pos = transformVector(pos, m1);
if(m2 >=0 && m2 < 255) pos = transformVector(pos, m2);
if(m3 >=0 && m3 < 255) pos = transformVector(pos, m3);
}
// Unpack matrix indices from iMatrixChain (packed as 4 bytes per int component)
// and sequentially transform the vertex position.
for (int i = 0; i < 3; ++i)
{
int chain = iMatrixChain[i];
// Skip empty (0) and default static/unanimated (-1) matrix chain components
if (chain != 0 && chain != -1)
{
// Extract individual matrix index bytes (0-254)
int m0 = (chain >> 24) & 0xff;
int m1 = (chain >> 16) & 0xff;
int m2 = (chain >> 8) & 0xff;
int m3 = chain & 0xff;

if(iMatrixChain.z != 0)
{
int m0 = (iMatrixChain.z & (0xff << 24)) >> 24;
int m1 = (iMatrixChain.z >> 16) & 0xff;
int m2 = (iMatrixChain.z & 0xff00) >> 8;
int m3 = (iMatrixChain.z & 0xff);

if(m0 >=0 && m0 < 255) pos = transformVector(pos, m0);
if(m1 >=0 && m1 < 255) pos = transformVector(pos, m1);
if(m2 >=0 && m2 < 255) pos = transformVector(pos, m2);
if(m3 >=0 && m3 < 255) pos = transformVector(pos, m3);
// Transform using active bone matrix
if (m0 >= 0 && m0 < 255) pos = transformVector(pos, m0);
if (m1 >= 0 && m1 < 255) pos = transformVector(pos, m1);
if (m2 >= 0 && m2 < 255) pos = transformVector(pos, m2);
if (m3 >= 0 && m3 < 255) pos = transformVector(pos, m3);
}
}

// OpenBVE explicitly negates Z for world geometry.
Expand Down
42 changes: 14 additions & 28 deletions assets/Shaders/text.vert
Original file line number Diff line number Diff line change
Expand Up @@ -6,36 +6,22 @@ uniform vec2 uPoint;
uniform vec2 uSize;
uniform vec4 uAtlasLocation;
out vec2 textureCoord;
vec4 viewPos = vec4(0,0,0,0);

// Offset lookup table to map gl_VertexID to quad corners without branching
const vec2 offsets[6] = vec2[](
vec2(0.0, 0.0), // Top-left
vec2(1.0, 0.0), // Top-right
vec2(1.0, 1.0), // Bottom-right
vec2(0.0, 0.0), // Top-left (second triangle)
vec2(0.0, 1.0), // Bottom-left
vec2(1.0, 1.0) // Bottom-right
);

void main()
{
switch(gl_VertexID)
{
case 0:
viewPos = uCurrentModelViewMatrix * vec4(vec3(uPoint.x, uPoint.y, 0), 1.0);
textureCoord = vec2(uAtlasLocation.x, uAtlasLocation.y);
break;
case 1:
viewPos = uCurrentModelViewMatrix * vec4(vec3(uPoint.x + uSize.x, uPoint.y, 0), 1.0);
textureCoord = vec2(uAtlasLocation.x + uAtlasLocation.z, uAtlasLocation.y);
break;
case 2:
viewPos = uCurrentModelViewMatrix * vec4(vec3(uPoint.x + uSize.x, uPoint.y + uSize.y, 0), 1.0);
textureCoord = vec2(uAtlasLocation.x + uAtlasLocation.z, uAtlasLocation.y + uAtlasLocation.w);
break;
case 3:
viewPos = uCurrentModelViewMatrix * vec4(vec3(uPoint.x, uPoint.y, 0), 1.0);
textureCoord = vec2(uAtlasLocation.x, uAtlasLocation.y);
break;
case 4:
viewPos = uCurrentModelViewMatrix * vec4(vec3(uPoint.x, uPoint.y + uSize.y, 0), 1.0);
textureCoord = vec2(uAtlasLocation.x, uAtlasLocation.y + uAtlasLocation.w);
break;
case 5:
viewPos = uCurrentModelViewMatrix * vec4(vec3(uPoint.x + uSize.x, uPoint.y + uSize.y, 0), 1.0);
textureCoord = vec2(uAtlasLocation.x + uAtlasLocation.z, uAtlasLocation.y + uAtlasLocation.w);
break;
}
// Calculate vertex position and UVs from atlas location using lookup offsets
vec2 offset = offsets[gl_VertexID];
vec4 viewPos = uCurrentModelViewMatrix * vec4(uPoint + offset * uSize, 0.0, 1.0);
textureCoord = uAtlasLocation.xy + offset * uAtlasLocation.zw;
gl_Position = uCurrentProjectionMatrix * viewPos;
}