2020-12-20 14:24:48 +01:00
|
|
|
/******************************************************************************************************
|
|
|
|
* Derived from Canvas (https://github.com/grondag/canvas) material_main shader, Apache 2.0 license. *
|
|
|
|
* Modified to add PBR varyings and support for texture-based bump map generation. *
|
|
|
|
* The modifications are licensed under the GNU Lesser General Public License version 3. *
|
|
|
|
******************************************************************************************************/
|
|
|
|
|
2020-11-26 20:11:38 +01:00
|
|
|
#include canvas:shaders/internal/header.glsl
|
|
|
|
#include canvas:shaders/internal/varying.glsl
|
|
|
|
#include canvas:shaders/internal/vertex.glsl
|
|
|
|
#include canvas:shaders/internal/flags.glsl
|
|
|
|
#include canvas:shaders/internal/diffuse.glsl
|
|
|
|
#include canvas:shaders/internal/program.glsl
|
2020-12-20 14:24:48 +01:00
|
|
|
#include frex:shaders/api/context.glsl
|
|
|
|
#include frex:shaders/api/vertex.glsl
|
|
|
|
#include frex:shaders/api/sampler.glsl
|
|
|
|
#include respackopts:config_supplier
|
|
|
|
#include lumi:shaders/api/context_bump.glsl
|
|
|
|
#include lumi:shaders/internal/varying.glsl
|
|
|
|
#include lumi:shaders/internal/main_vert.glsl
|
2020-11-26 20:11:38 +01:00
|
|
|
|
|
|
|
#include canvas:apitarget
|
|
|
|
|
|
|
|
/******************************************************
|
|
|
|
canvas:shaders/internal/material_main.vert
|
|
|
|
******************************************************/
|
|
|
|
|
|
|
|
void _cv_startVertex(inout frx_VertexData data, in int cv_programId) {
|
|
|
|
#include canvas:startvertex
|
|
|
|
}
|
|
|
|
|
|
|
|
void _cv_endVertex(inout frx_VertexData data, in int cv_programId) {
|
|
|
|
#include canvas:endvertex
|
|
|
|
}
|
|
|
|
|
|
|
|
void main() {
|
|
|
|
frx_VertexData data = frx_VertexData(
|
|
|
|
gl_Vertex,
|
|
|
|
in_uv,
|
|
|
|
in_color,
|
|
|
|
(in_normal_flags.xyz - 127.0) / 127.0,
|
|
|
|
in_lightmap.rg * 0.00390625 + 0.03125
|
|
|
|
);
|
|
|
|
|
|
|
|
// Adding +0.5 prevents striping or other strangeness in flag-dependent rendering
|
|
|
|
// due to FP error on some cards/drivers. Also made varying attribute invariant (rolls eyes at OpenGL)
|
|
|
|
_cvv_flags = uint(in_normal_flags.w + 0.5);
|
|
|
|
|
2020-12-20 14:24:48 +01:00
|
|
|
// pbrv_roughness = 1.0;
|
|
|
|
// pbrv_metallic = 0.0;
|
2020-11-26 20:11:38 +01:00
|
|
|
|
|
|
|
_cv_setupProgram();
|
|
|
|
|
2020-12-20 14:24:48 +01:00
|
|
|
#ifdef LUMI_BUMP
|
|
|
|
startBump();
|
|
|
|
#endif
|
|
|
|
|
2020-11-26 20:11:38 +01:00
|
|
|
int cv_programId = _cv_vertexProgramId();
|
|
|
|
_cv_startVertex(data, cv_programId);
|
|
|
|
|
2020-12-20 14:24:48 +01:00
|
|
|
#ifdef LUMI_BUMP
|
|
|
|
setupBump(data);
|
|
|
|
#endif
|
|
|
|
|
2020-11-26 20:11:38 +01:00
|
|
|
if (_cvu_atlas[_CV_SPRITE_INFO_TEXTURE_SIZE] != 0.0) {
|
|
|
|
float spriteIndex = in_material.x;
|
|
|
|
// for sprite atlas textures, convert from normalized (0-1) to interpolated coordinates
|
|
|
|
vec4 spriteBounds = texture2DLod(frxs_spriteInfo, vec2(0, spriteIndex / _cvu_atlas[_CV_SPRITE_INFO_TEXTURE_SIZE]), 0);
|
|
|
|
|
|
|
|
float atlasHeight = _cvu_atlas[_CV_ATLAS_HEIGHT];
|
|
|
|
float atlasWidth = _cvu_atlas[_CV_ATLAS_WIDTH];
|
|
|
|
|
|
|
|
// snap sprite bounds to integer coordinates to correct for floating point error
|
|
|
|
spriteBounds *= vec4(atlasWidth, atlasHeight, atlasWidth, atlasHeight);
|
|
|
|
spriteBounds += vec4(0.5, 0.5, 0.5, 0.5);
|
|
|
|
spriteBounds -= fract(spriteBounds);
|
|
|
|
spriteBounds /= vec4(atlasWidth, atlasHeight, atlasWidth, atlasHeight);
|
|
|
|
|
|
|
|
data.spriteUV = spriteBounds.xy + data.spriteUV * spriteBounds.zw;
|
2020-12-20 14:24:48 +01:00
|
|
|
|
|
|
|
#ifdef LUMI_BUMP
|
|
|
|
endBump(spriteBounds);
|
|
|
|
#endif
|
2020-11-26 20:11:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
data.spriteUV = _cv_textureCoord(data.spriteUV, 0);
|
|
|
|
|
|
|
|
vec4 viewCoord = gl_ModelViewMatrix * data.vertex;
|
|
|
|
gl_ClipVertex = viewCoord;
|
|
|
|
gl_FogFragCoord = length(viewCoord.xyz);
|
|
|
|
|
2020-12-20 14:24:48 +01:00
|
|
|
setVaryings(viewCoord);
|
|
|
|
|
2020-11-26 20:11:38 +01:00
|
|
|
//data.normal *= gl_NormalMatrix;
|
|
|
|
data.vertex = gl_ModelViewProjectionMatrix * data.vertex;
|
|
|
|
|
|
|
|
gl_Position = data.vertex;
|
|
|
|
|
|
|
|
_cv_endVertex(data, cv_programId);
|
|
|
|
|
|
|
|
_cvv_texcoord = data.spriteUV;
|
|
|
|
_cvv_color = data.color;
|
|
|
|
_cvv_normal = data.normal;
|
|
|
|
|
|
|
|
#if DIFFUSE_SHADING_MODE != DIFFUSE_MODE_NONE
|
|
|
|
_cvv_diffuse = _cv_diffuse(_cvv_normal);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if AO_SHADING_MODE != AO_MODE_NONE
|
|
|
|
_cvv_ao = in_lightmap.b / 255.0;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
_cvv_lightcoord = data.light;
|
|
|
|
}
|