mirror of
https://git.stillkill.net/MinecraftLeak/MinecraftLegends.git
synced 2026-10-22 21:32:19 +01:00
116 lines
3.7 KiB
Plaintext
116 lines
3.7 KiB
Plaintext
// __multiversion__
|
|
// This signals the loading code to prepend either #version 100 or #version 300 es as apropriate.
|
|
|
|
// To use centroid sampling we need to have version 300 es shaders, which requires changing:
|
|
// attribute to in
|
|
// varying to out when in vertex shaders or in when in fragment shaders
|
|
// defining an out vec4 FragColor and replacing uses of gl_FragColor with FragColor
|
|
// texture2D to texture
|
|
|
|
precision highp float;
|
|
|
|
#include "shaders/vertexVersionCentroid.h"
|
|
|
|
#if __VERSION__ >= 300
|
|
#ifndef BYPASS_PIXEL_SHADER
|
|
_centroid out vec2 colorLookupUV;
|
|
_centroid out vec2 parallaxUV;
|
|
#endif
|
|
#else
|
|
#ifndef BYPASS_PIXEL_SHADER
|
|
varying vec2 colorLookupUV;
|
|
varying vec2 parallaxUV;
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef BYPASS_PIXEL_SHADER
|
|
varying lowp vec4 encodedPlane;
|
|
#ifdef FOG
|
|
varying vec4 fogColor;
|
|
#endif
|
|
#endif
|
|
|
|
#include "shaders/uniformWorldConstants.h"
|
|
#include "shaders/uniformPerFrameConstants.h"
|
|
#include "shaders/uniformShaderConstants.h"
|
|
#include "shaders/uniformRenderChunkConstants.h"
|
|
|
|
#ifndef BYPASS_PIXEL_SHADER
|
|
attribute POS4 POSITION;
|
|
attribute vec4 COLOR;
|
|
attribute vec2 TEXCOORD_0;
|
|
attribute vec2 TEXCOORD_1;
|
|
#endif
|
|
|
|
const float MAX_LAYER_DEPTH = 32.0;
|
|
|
|
void main() {
|
|
///// Vertex Transformation
|
|
POS4 worldPos = vec4((POSITION.xyz * CHUNK_ORIGIN_AND_SCALE.w) + CHUNK_ORIGIN_AND_SCALE.xyz, 1);
|
|
POS4 pos = PROJ * (WORLDVIEW * worldPos);
|
|
gl_Position = pos;
|
|
|
|
#ifndef BYPASS_PIXEL_SHADER
|
|
///// End Portal Data
|
|
colorLookupUV = TEXCOORD_0;
|
|
encodedPlane = COLOR; // Color value is used to encode the starfield plane
|
|
|
|
vec3 planeNormal = (encodedPlane.xyz - vec3(0.5,0.5,0.5)) * 2.0;
|
|
float planeDistance = encodedPlane.w * MAX_LAYER_DEPTH;
|
|
|
|
// Calculate view direction from the surface position and the eye position
|
|
POS3 viewRay = worldPos.xyz;
|
|
|
|
///// Ray-cast for parallax-offset UV
|
|
// Perform ray-plane intersection to find the position on the parallax plane
|
|
float t = (dot(viewRay - (planeDistance * planeNormal), planeNormal)) / dot(viewRay, planeNormal);
|
|
POS3 parallaxPositionInWorld = (t * viewRay) + VIEW_POS;
|
|
|
|
///// Ridiculous UV-remapping
|
|
// Create a mask with a 1 wherever the normal would have a non-zero value
|
|
// All normals are orthonormal on <x,y,z>, so there should be two 0's and a 1
|
|
vec3 normalMask = floor(abs(planeNormal) + vec3(0.5,0.5,0.5));
|
|
// Mask out the correct uv result
|
|
vec2 raycastUV = parallaxPositionInWorld.yz * normalMask[0] + parallaxPositionInWorld.xz * normalMask[1] + parallaxPositionInWorld.xy * normalMask[2];
|
|
|
|
// Scale the UVs to Minecraft pixel size
|
|
raycastUV = raycastUV / 16.0; // TODO: Use TEXTURE_DIMENSIONS
|
|
|
|
const float rotor = 3.1415926535897 * (5.0 / 7.0);
|
|
float rotS = sin(planeDistance * rotor);
|
|
float rotC = cos(planeDistance * rotor);
|
|
|
|
parallaxUV = mat2(vec2(rotC, rotS), vec2(-rotS, rotC)) * raycastUV;
|
|
|
|
parallaxUV += vec2(rotC, rotS) * planeDistance;
|
|
parallaxUV.y += TIME / 256.0;
|
|
|
|
const float modVal = 64.0;
|
|
parallaxUV = vec2(mod(parallaxUV.x, modVal), mod(parallaxUV.y, modVal));
|
|
|
|
///// Fog
|
|
#ifdef FOG
|
|
#ifdef FANCY
|
|
vec3 relPos = -worldPos.xyz;
|
|
float cameraDepth = length(relPos);
|
|
#ifdef NEAR_WATER
|
|
cameraDist = cameraDepth / FAR_CHUNKS_DISTANCE;
|
|
#endif
|
|
#else
|
|
float cameraDepth = pos.z;
|
|
#ifdef NEAR_WATER
|
|
vec3 relPos = -worldPos.xyz;
|
|
float camDist = length(relPos);
|
|
cameraDist = camDist / FAR_CHUNKS_DISTANCE;
|
|
#endif
|
|
#endif
|
|
float len = cameraDepth / RENDER_DISTANCE;
|
|
#ifdef ALLOW_FADE
|
|
len += CURRENT_COLOR.r;
|
|
#endif
|
|
fogColor.rgb = FOG_COLOR.rgb;
|
|
fogColor.a = clamp((len - FOG_CONTROL.x) / (FOG_CONTROL.y - FOG_CONTROL.x), 0.0, 1.0);
|
|
#endif
|
|
#endif
|
|
}
|