|
|
@@ -1,6 +1,7 @@
|
|
|
// File generated by G3NSHADERS. Do not edit.
|
|
|
// To regenerate this file install 'g3nshaders' and execute:
|
|
|
// 'go generate' in this folder.
|
|
|
+
|
|
|
package shaders
|
|
|
|
|
|
const include_attributes_source = `//
|
|
|
@@ -14,6 +15,94 @@ layout(location = 4) in float VertexDistance;
|
|
|
layout(location = 5) in vec4 VertexTexoffsets;
|
|
|
|
|
|
|
|
|
+`
|
|
|
+
|
|
|
+const include_lights_source = `//
|
|
|
+// Lights uniforms
|
|
|
+//
|
|
|
+
|
|
|
+// Ambient lights uniforms
|
|
|
+#if AMB_LIGHTS>0
|
|
|
+ uniform vec3 AmbientLightColor[AMB_LIGHTS];
|
|
|
+#endif
|
|
|
+
|
|
|
+// Directional lights uniform array. Each directional light uses 2 elements
|
|
|
+#if DIR_LIGHTS>0
|
|
|
+ uniform vec3 DirLight[2*DIR_LIGHTS];
|
|
|
+ // Macros to access elements inside the DirectionalLight uniform array
|
|
|
+ #define DirLightColor(a) DirLight[2*a]
|
|
|
+ #define DirLightPosition(a) DirLight[2*a+1]
|
|
|
+#endif
|
|
|
+
|
|
|
+// Point lights uniform array. Each point light uses 3 elements
|
|
|
+#if POINT_LIGHTS>0
|
|
|
+ uniform vec3 PointLight[3*POINT_LIGHTS];
|
|
|
+ // Macros to access elements inside the PointLight uniform array
|
|
|
+ #define PointLightColor(a) PointLight[3*a]
|
|
|
+ #define PointLightPosition(a) PointLight[3*a+1]
|
|
|
+ #define PointLightLinearDecay(a) PointLight[3*a+2].x
|
|
|
+ #define PointLightQuadraticDecay(a) PointLight[3*a+2].y
|
|
|
+#endif
|
|
|
+
|
|
|
+#if SPOT_LIGHTS>0
|
|
|
+ // Spot lights uniforms. Each spot light uses 5 elements
|
|
|
+ uniform vec3 SpotLight[5*SPOT_LIGHTS];
|
|
|
+
|
|
|
+ // Macros to access elements inside the PointLight uniform array
|
|
|
+ #define SpotLightColor(a) SpotLight[5*a]
|
|
|
+ #define SpotLightPosition(a) SpotLight[5*a+1]
|
|
|
+ #define SpotLightDirection(a) SpotLight[5*a+2]
|
|
|
+ #define SpotLightAngularDecay(a) SpotLight[5*a+3].x
|
|
|
+ #define SpotLightCutoffAngle(a) SpotLight[5*a+3].y
|
|
|
+ #define SpotLightLinearDecay(a) SpotLight[5*a+3].z
|
|
|
+ #define SpotLightQuadraticDecay(a) SpotLight[5*a+4].x
|
|
|
+#endif
|
|
|
+
|
|
|
+`
|
|
|
+
|
|
|
+const include_material_source = `//
|
|
|
+// Material properties uniform
|
|
|
+//
|
|
|
+
|
|
|
+// Material parameters uniform array
|
|
|
+uniform vec3 Material[6];
|
|
|
+// Macros to access elements inside the Material array
|
|
|
+#define MatAmbientColor Material[0]
|
|
|
+#define MatDiffuseColor Material[1]
|
|
|
+#define MatSpecularColor Material[2]
|
|
|
+#define MatEmissiveColor Material[3]
|
|
|
+#define MatShininess Material[4].x
|
|
|
+#define MatOpacity Material[4].y
|
|
|
+#define MatPointSize Material[4].z
|
|
|
+#define MatPointRotationZ Material[5].x
|
|
|
+
|
|
|
+#if MAT_TEXTURES > 0
|
|
|
+ // Texture unit sampler array
|
|
|
+ uniform sampler2D MatTexture[MAT_TEXTURES];
|
|
|
+ // Texture parameters (3*vec2 per texture)
|
|
|
+ uniform vec2 MatTexinfo[3*MAT_TEXTURES];
|
|
|
+ // Macros to access elements inside the MatTexinfo array
|
|
|
+ #define MatTexOffset(a) MatTexinfo[(3*a)]
|
|
|
+ #define MatTexRepeat(a) MatTexinfo[(3*a)+1]
|
|
|
+ #define MatTexFlipY(a) bool(MatTexinfo[(3*a)+2].x)
|
|
|
+ #define MatTexVisible(a) bool(MatTexinfo[(3*a)+2].y)
|
|
|
+#endif
|
|
|
+
|
|
|
+// GLSL 3.30 does not allow indexing texture sampler with non constant values.
|
|
|
+// This macro is used to mix the texture with the specified index with the material color.
|
|
|
+// It should be called for each texture index. It uses two externally defined variables:
|
|
|
+// vec4 texColor
|
|
|
+// vec4 texMixed
|
|
|
+#define MIX_TEXTURE(i) \
|
|
|
+ if (MatTexVisible(i)) { \
|
|
|
+ texColor = texture(MatTexture[i], FragTexcoord * MatTexRepeat(i) + MatTexOffset(i)); \
|
|
|
+ if (i == 0) { \
|
|
|
+ texMixed = texColor; \
|
|
|
+ } else { \
|
|
|
+ texMixed = mix(texMixed, texColor, texColor.a); \
|
|
|
+ } \
|
|
|
+ }
|
|
|
+
|
|
|
`
|
|
|
|
|
|
const include_phong_model_source = `/***
|
|
|
@@ -134,191 +223,144 @@ void phongModel(vec4 position, vec3 normal, vec3 camDir, vec3 matAmbient, vec3 m
|
|
|
|
|
|
`
|
|
|
|
|
|
-const include_lights_source = `//
|
|
|
-// Lights uniforms
|
|
|
-//
|
|
|
-
|
|
|
-// Ambient lights uniforms
|
|
|
-#if AMB_LIGHTS>0
|
|
|
- uniform vec3 AmbientLightColor[AMB_LIGHTS];
|
|
|
-#endif
|
|
|
-
|
|
|
-// Directional lights uniform array. Each directional light uses 2 elements
|
|
|
-#if DIR_LIGHTS>0
|
|
|
- uniform vec3 DirLight[2*DIR_LIGHTS];
|
|
|
- // Macros to access elements inside the DirectionalLight uniform array
|
|
|
- #define DirLightColor(a) DirLight[2*a]
|
|
|
- #define DirLightPosition(a) DirLight[2*a+1]
|
|
|
-#endif
|
|
|
-
|
|
|
-// Point lights uniform array. Each point light uses 3 elements
|
|
|
-#if POINT_LIGHTS>0
|
|
|
- uniform vec3 PointLight[3*POINT_LIGHTS];
|
|
|
- // Macros to access elements inside the PointLight uniform array
|
|
|
- #define PointLightColor(a) PointLight[3*a]
|
|
|
- #define PointLightPosition(a) PointLight[3*a+1]
|
|
|
- #define PointLightLinearDecay(a) PointLight[3*a+2].x
|
|
|
- #define PointLightQuadraticDecay(a) PointLight[3*a+2].y
|
|
|
-#endif
|
|
|
-
|
|
|
-#if SPOT_LIGHTS>0
|
|
|
- // Spot lights uniforms. Each spot light uses 5 elements
|
|
|
- uniform vec3 SpotLight[5*SPOT_LIGHTS];
|
|
|
-
|
|
|
- // Macros to access elements inside the PointLight uniform array
|
|
|
- #define SpotLightColor(a) SpotLight[5*a]
|
|
|
- #define SpotLightPosition(a) SpotLight[5*a+1]
|
|
|
- #define SpotLightDirection(a) SpotLight[5*a+2]
|
|
|
- #define SpotLightAngularDecay(a) SpotLight[5*a+3].x
|
|
|
- #define SpotLightCutoffAngle(a) SpotLight[5*a+3].y
|
|
|
- #define SpotLightLinearDecay(a) SpotLight[5*a+3].z
|
|
|
- #define SpotLightQuadraticDecay(a) SpotLight[5*a+4].x
|
|
|
-#endif
|
|
|
-
|
|
|
-`
|
|
|
-
|
|
|
-const include_material_source = `//
|
|
|
-// Material properties uniform
|
|
|
-//
|
|
|
-
|
|
|
-// Material parameters uniform array
|
|
|
-uniform vec3 Material[6];
|
|
|
-// Macros to access elements inside the Material array
|
|
|
-#define MatAmbientColor Material[0]
|
|
|
-#define MatDiffuseColor Material[1]
|
|
|
-#define MatSpecularColor Material[2]
|
|
|
-#define MatEmissiveColor Material[3]
|
|
|
-#define MatShininess Material[4].x
|
|
|
-#define MatOpacity Material[4].y
|
|
|
-#define MatPointSize Material[4].z
|
|
|
-#define MatPointRotationZ Material[5].x
|
|
|
-
|
|
|
-#if MAT_TEXTURES > 0
|
|
|
- // Texture unit sampler array
|
|
|
- uniform sampler2D MatTexture[MAT_TEXTURES];
|
|
|
- // Texture parameters (3*vec2 per texture)
|
|
|
- uniform vec2 MatTexinfo[3*MAT_TEXTURES];
|
|
|
- // Macros to access elements inside the MatTexinfo array
|
|
|
- #define MatTexOffset(a) MatTexinfo[(3*a)]
|
|
|
- #define MatTexRepeat(a) MatTexinfo[(3*a)+1]
|
|
|
- #define MatTexFlipY(a) bool(MatTexinfo[(3*a)+2].x)
|
|
|
- #define MatTexVisible(a) bool(MatTexinfo[(3*a)+2].y)
|
|
|
-#endif
|
|
|
-
|
|
|
-// GLSL 3.30 does not allow indexing texture sampler with non constant values.
|
|
|
-// This macro is used to mix the texture with the specified index with the material color.
|
|
|
-// It should be called for each texture index. It uses two externally defined variables:
|
|
|
-// vec4 texColor
|
|
|
-// vec4 texMixed
|
|
|
-#define MIX_TEXTURE(i) \
|
|
|
- if (MatTexVisible(i)) { \
|
|
|
- texColor = texture(MatTexture[i], FragTexcoord * MatTexRepeat(i) + MatTexOffset(i)); \
|
|
|
- if (i == 0) { \
|
|
|
- texMixed = texColor; \
|
|
|
- } else { \
|
|
|
- texMixed = mix(texMixed, texColor, texColor.a); \
|
|
|
- } \
|
|
|
- }
|
|
|
-
|
|
|
-`
|
|
|
-
|
|
|
-const sprite_fragment_source = `//
|
|
|
-// Fragment shader for sprite
|
|
|
+const basic_fragment_source = `//
|
|
|
+// Fragment Shader template
|
|
|
//
|
|
|
|
|
|
-#include <material>
|
|
|
-
|
|
|
-// Inputs from vertex shader
|
|
|
in vec3 Color;
|
|
|
-in vec2 FragTexcoord;
|
|
|
-
|
|
|
-// Output
|
|
|
out vec4 FragColor;
|
|
|
|
|
|
void main() {
|
|
|
|
|
|
- // Combine all texture colors and opacity
|
|
|
- vec4 texCombined = vec4(1);
|
|
|
-#if MAT_TEXTURES>0
|
|
|
- for (int i = 0; i < {{.MatTexturesMax}}; i++) {
|
|
|
- vec4 texcolor = texture(MatTexture[i], FragTexcoord * MatTexRepeat(i) + MatTexOffset(i));
|
|
|
- if (i == 0) {
|
|
|
- texCombined = texcolor;
|
|
|
- } else {
|
|
|
- texCombined = mix(texCombined, texcolor, texcolor.a);
|
|
|
- }
|
|
|
- }
|
|
|
-#endif
|
|
|
-
|
|
|
- // Combine material color with texture
|
|
|
- FragColor = min(vec4(Color, MatOpacity) * texCombined, vec4(1));
|
|
|
+ FragColor = vec4(Color, 1.0);
|
|
|
}
|
|
|
|
|
|
`
|
|
|
|
|
|
-const sprite_vertex_source = `//
|
|
|
-// Vertex shader for sprites
|
|
|
+const basic_vertex_source = `//
|
|
|
+// Vertex shader basic
|
|
|
//
|
|
|
-
|
|
|
#include <attributes>
|
|
|
|
|
|
-// Input uniforms
|
|
|
+// Model uniforms
|
|
|
uniform mat4 MVP;
|
|
|
|
|
|
-#include <material>
|
|
|
-
|
|
|
-// Outputs for fragment shader
|
|
|
+// Final output color for fragment shader
|
|
|
out vec3 Color;
|
|
|
-out vec2 FragTexcoord;
|
|
|
|
|
|
void main() {
|
|
|
|
|
|
- // Applies transformation to vertex position
|
|
|
+ Color = VertexColor;
|
|
|
gl_Position = MVP * vec4(VertexPosition, 1.0);
|
|
|
-
|
|
|
- // Outputs color
|
|
|
- Color = MatDiffuseColor;
|
|
|
-
|
|
|
- // Flips texture coordinate Y if requested.
|
|
|
- vec2 texcoord = VertexTexcoord;
|
|
|
-#if MAT_TEXTURES>0
|
|
|
- if (MatTexFlipY[0]) {
|
|
|
- texcoord.y = 1 - texcoord.y;
|
|
|
- }
|
|
|
-#endif
|
|
|
- FragTexcoord = texcoord;
|
|
|
}
|
|
|
|
|
|
-`
|
|
|
|
|
|
-const point_vertex_source = `#include <attributes>
|
|
|
+`
|
|
|
|
|
|
-// Model uniforms
|
|
|
-uniform mat4 MVP;
|
|
|
+const panel_fragment_source = `//
|
|
|
+// Fragment Shader template
|
|
|
+//
|
|
|
|
|
|
-// Material uniforms
|
|
|
-#include <material>
|
|
|
+// Texture uniforms
|
|
|
+uniform sampler2D MatTexture;
|
|
|
+uniform vec2 MatTexinfo[3];
|
|
|
|
|
|
-// Outputs for fragment shader
|
|
|
-out vec3 Color;
|
|
|
-flat out mat2 Rotation;
|
|
|
+// Macros to access elements inside the MatTexinfo array
|
|
|
+#define MatTexOffset MatTexinfo[0]
|
|
|
+#define MatTexRepeat MatTexinfo[1]
|
|
|
+#define MatTexFlipY bool(MatTexinfo[2].x) // not used
|
|
|
+#define MatTexVisible bool(MatTexinfo[2].y) // not used
|
|
|
|
|
|
-void main() {
|
|
|
+// Inputs from vertex shader
|
|
|
+in vec2 FragTexcoord;
|
|
|
|
|
|
- // Rotation matrix for fragment shader
|
|
|
- float rotSin = sin(MatPointRotationZ);
|
|
|
- float rotCos = cos(MatPointRotationZ);
|
|
|
- Rotation = mat2(rotCos, rotSin, - rotSin, rotCos);
|
|
|
+// Input uniform
|
|
|
+uniform vec4 Panel[8];
|
|
|
+#define Bounds Panel[0] // panel bounds in texture coordinates
|
|
|
+#define Border Panel[1] // panel border in texture coordinates
|
|
|
+#define Padding Panel[2] // panel padding in texture coordinates
|
|
|
+#define Content Panel[3] // panel content area in texture coordinates
|
|
|
+#define BorderColor Panel[4] // panel border color
|
|
|
+#define PaddingColor Panel[5] // panel padding color
|
|
|
+#define ContentColor Panel[6] // panel content color
|
|
|
+#define TextureValid bool(Panel[7].x) // texture valid flag
|
|
|
|
|
|
- // Sets the vertex position
|
|
|
- vec4 pos = MVP * vec4(VertexPosition, 1.0);
|
|
|
- gl_Position = pos;
|
|
|
+// Output
|
|
|
+out vec4 FragColor;
|
|
|
|
|
|
- // Sets the size of the rasterized point decreasing with distance
|
|
|
- gl_PointSize = (1.0 - pos.z / pos.w) * MatPointSize;
|
|
|
|
|
|
- // Outputs color
|
|
|
- Color = MatEmissiveColor;
|
|
|
+/***
|
|
|
+* Checks if current fragment texture coordinate is inside the
|
|
|
+* supplied rectangle in texture coordinates:
|
|
|
+* rect[0] - position x [0,1]
|
|
|
+* rect[1] - position y [0,1]
|
|
|
+* rect[2] - width [0,1]
|
|
|
+* rect[3] - height [0,1]
|
|
|
+*/
|
|
|
+bool checkRect(vec4 rect) {
|
|
|
+
|
|
|
+ if (FragTexcoord.x < rect[0]) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (FragTexcoord.x > rect[0] + rect[2]) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (FragTexcoord.y < rect[1]) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (FragTexcoord.y > rect[1] + rect[3]) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void main() {
|
|
|
+
|
|
|
+ // Discard fragment outside of received bounds
|
|
|
+ // Bounds[0] - xmin
|
|
|
+ // Bounds[1] - ymin
|
|
|
+ // Bounds[2] - xmax
|
|
|
+ // Bounds[3] - ymax
|
|
|
+ if (FragTexcoord.x <= Bounds[0] || FragTexcoord.x >= Bounds[2]) {
|
|
|
+ discard;
|
|
|
+ }
|
|
|
+ if (FragTexcoord.y <= Bounds[1] || FragTexcoord.y >= Bounds[3]) {
|
|
|
+ discard;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Check if fragment is inside content area
|
|
|
+ if (checkRect(Content)) {
|
|
|
+ // If no texture, the color will be the material color.
|
|
|
+ vec4 color = ContentColor;
|
|
|
+ if (TextureValid) {
|
|
|
+ // Adjust texture coordinates to fit texture inside the content area
|
|
|
+ vec2 offset = vec2(-Content[0], -Content[1]);
|
|
|
+ vec2 factor = vec2(1/Content[2], 1/Content[3]);
|
|
|
+ vec2 texcoord = (FragTexcoord + offset) * factor;
|
|
|
+ vec4 texColor = texture(MatTexture, texcoord * MatTexRepeat + MatTexOffset);
|
|
|
+ // Mix content color with texture color ???
|
|
|
+ //color = mix(color, texColor, texColor.a);
|
|
|
+ color = texColor;
|
|
|
+ }
|
|
|
+ FragColor = color;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Checks if fragment is inside paddings area
|
|
|
+ if (checkRect(Padding)) {
|
|
|
+ FragColor = PaddingColor;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Checks if fragment is inside borders area
|
|
|
+ if (checkRect(Border)) {
|
|
|
+ FragColor = BorderColor;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Fragment is in margins area (always transparent)
|
|
|
+ FragColor = vec4(1,1,1,0);
|
|
|
}
|
|
|
|
|
|
`
|
|
|
@@ -349,21 +391,22 @@ void main() {
|
|
|
|
|
|
`
|
|
|
|
|
|
-const standard_fragment_source = `//
|
|
|
+const phong_fragment_source = `//
|
|
|
// Fragment Shader template
|
|
|
//
|
|
|
-#include <material>
|
|
|
|
|
|
-// Inputs from Vertex shader
|
|
|
-in vec3 ColorFrontAmbdiff;
|
|
|
-in vec3 ColorFrontSpec;
|
|
|
-in vec3 ColorBackAmbdiff;
|
|
|
-in vec3 ColorBackSpec;
|
|
|
+// Inputs from vertex shader
|
|
|
+in vec4 Position; // Vertex position in camera coordinates.
|
|
|
+in vec3 Normal; // Vertex normal in camera coordinates.
|
|
|
+in vec3 CamDir; // Direction from vertex to camera
|
|
|
in vec2 FragTexcoord;
|
|
|
|
|
|
-// Output
|
|
|
-out vec4 FragColor;
|
|
|
+#include <lights>
|
|
|
+#include <material>
|
|
|
+#include <phong_model>
|
|
|
|
|
|
+// Final fragment color
|
|
|
+out vec4 FragColor;
|
|
|
|
|
|
void main() {
|
|
|
|
|
|
@@ -381,22 +424,28 @@ void main() {
|
|
|
MIX_TEXTURE(2)
|
|
|
#endif
|
|
|
|
|
|
- vec4 colorAmbDiff;
|
|
|
- vec4 colorSpec;
|
|
|
- if (gl_FrontFacing) {
|
|
|
- colorAmbDiff = vec4(ColorFrontAmbdiff, MatOpacity);
|
|
|
- colorSpec = vec4(ColorFrontSpec, 0);
|
|
|
- } else {
|
|
|
- colorAmbDiff = vec4(ColorBackAmbdiff, MatOpacity);
|
|
|
- colorSpec = vec4(ColorBackSpec, 0);
|
|
|
+ // Combine material with texture colors
|
|
|
+ vec4 matDiffuse = vec4(MatDiffuseColor, MatOpacity) * texMixed;
|
|
|
+ vec4 matAmbient = vec4(MatAmbientColor, MatOpacity) * texMixed;
|
|
|
+
|
|
|
+ // Inverts the fragment normal if not FrontFacing
|
|
|
+ vec3 fragNormal = Normal;
|
|
|
+ if (!gl_FrontFacing) {
|
|
|
+ fragNormal = -fragNormal;
|
|
|
}
|
|
|
- FragColor = min(colorAmbDiff * texMixed + colorSpec, vec4(1));
|
|
|
+
|
|
|
+ // Calculates the Ambient+Diffuse and Specular colors for this fragment using the Phong model.
|
|
|
+ vec3 Ambdiff, Spec;
|
|
|
+ phongModel(Position, fragNormal, CamDir, vec3(matAmbient), vec3(matDiffuse), Ambdiff, Spec);
|
|
|
+
|
|
|
+ // Final fragment color
|
|
|
+ FragColor = min(vec4(Ambdiff + Spec, matDiffuse.a), vec4(1.0));
|
|
|
}
|
|
|
|
|
|
`
|
|
|
|
|
|
-const standard_vertex_source = `//
|
|
|
-// Vertex shader standard
|
|
|
+const phong_vertex_source = `//
|
|
|
+// Vertex Shader
|
|
|
//
|
|
|
#include <attributes>
|
|
|
|
|
|
@@ -405,38 +454,29 @@ uniform mat4 ModelViewMatrix;
|
|
|
uniform mat3 NormalMatrix;
|
|
|
uniform mat4 MVP;
|
|
|
|
|
|
-#include <lights>
|
|
|
#include <material>
|
|
|
-#include <phong_model>
|
|
|
|
|
|
-
|
|
|
-// Outputs for the fragment shader.
|
|
|
-out vec3 ColorFrontAmbdiff;
|
|
|
-out vec3 ColorFrontSpec;
|
|
|
-out vec3 ColorBackAmbdiff;
|
|
|
-out vec3 ColorBackSpec;
|
|
|
+// Output variables for Fragment shader
|
|
|
+out vec4 Position;
|
|
|
+out vec3 Normal;
|
|
|
+out vec3 CamDir;
|
|
|
out vec2 FragTexcoord;
|
|
|
|
|
|
void main() {
|
|
|
|
|
|
- // Transform this vertex normal to camera coordinates.
|
|
|
- vec3 normal = normalize(NormalMatrix * VertexNormal);
|
|
|
+ // Transform this vertex position to camera coordinates.
|
|
|
+ Position = ModelViewMatrix * vec4(VertexPosition, 1.0);
|
|
|
|
|
|
- // Calculate this vertex position in camera coordinates
|
|
|
- vec4 position = ModelViewMatrix * vec4(VertexPosition, 1.0);
|
|
|
+ // Transform this vertex normal to camera coordinates.
|
|
|
+ Normal = normalize(NormalMatrix * VertexNormal);
|
|
|
|
|
|
// Calculate the direction vector from the vertex to the camera
|
|
|
// The camera is at 0,0,0
|
|
|
- vec3 camDir = normalize(-position.xyz);
|
|
|
-
|
|
|
- // Calculates the vertex Ambient+Diffuse and Specular colors using the Phong model
|
|
|
- // for the front and back
|
|
|
- phongModel(position, normal, camDir, MatAmbientColor, MatDiffuseColor, ColorFrontAmbdiff, ColorFrontSpec);
|
|
|
- phongModel(position, -normal, camDir, MatAmbientColor, MatDiffuseColor, ColorBackAmbdiff, ColorBackSpec);
|
|
|
+ CamDir = normalize(-Position.xyz);
|
|
|
|
|
|
- vec2 texcoord = VertexTexcoord;
|
|
|
-#if MAT_TEXTURES > 0
|
|
|
// Flips texture coordinate Y if requested.
|
|
|
+ vec2 texcoord = VertexTexcoord;
|
|
|
+#if MAT_TEXTURES>0
|
|
|
if (MatTexFlipY(0)) {
|
|
|
texcoord.y = 1 - texcoord.y;
|
|
|
}
|
|
|
@@ -492,189 +532,123 @@ void main() {
|
|
|
|
|
|
`
|
|
|
|
|
|
-const basic_fragment_source = `//
|
|
|
-// Fragment Shader template
|
|
|
-//
|
|
|
-
|
|
|
-in vec3 Color;
|
|
|
-out vec4 FragColor;
|
|
|
-
|
|
|
-void main() {
|
|
|
-
|
|
|
- FragColor = vec4(Color, 1.0);
|
|
|
-}
|
|
|
-
|
|
|
-`
|
|
|
-
|
|
|
-const phong_vertex_source = `//
|
|
|
-// Vertex Shader
|
|
|
-//
|
|
|
-#include <attributes>
|
|
|
+const point_vertex_source = `#include <attributes>
|
|
|
|
|
|
// Model uniforms
|
|
|
-uniform mat4 ModelViewMatrix;
|
|
|
-uniform mat3 NormalMatrix;
|
|
|
uniform mat4 MVP;
|
|
|
|
|
|
+// Material uniforms
|
|
|
#include <material>
|
|
|
|
|
|
-// Output variables for Fragment shader
|
|
|
-out vec4 Position;
|
|
|
-out vec3 Normal;
|
|
|
-out vec3 CamDir;
|
|
|
-out vec2 FragTexcoord;
|
|
|
+// Outputs for fragment shader
|
|
|
+out vec3 Color;
|
|
|
+flat out mat2 Rotation;
|
|
|
|
|
|
void main() {
|
|
|
|
|
|
- // Transform this vertex position to camera coordinates.
|
|
|
- Position = ModelViewMatrix * vec4(VertexPosition, 1.0);
|
|
|
-
|
|
|
- // Transform this vertex normal to camera coordinates.
|
|
|
- Normal = normalize(NormalMatrix * VertexNormal);
|
|
|
+ // Rotation matrix for fragment shader
|
|
|
+ float rotSin = sin(MatPointRotationZ);
|
|
|
+ float rotCos = cos(MatPointRotationZ);
|
|
|
+ Rotation = mat2(rotCos, rotSin, - rotSin, rotCos);
|
|
|
|
|
|
- // Calculate the direction vector from the vertex to the camera
|
|
|
- // The camera is at 0,0,0
|
|
|
- CamDir = normalize(-Position.xyz);
|
|
|
+ // Sets the vertex position
|
|
|
+ vec4 pos = MVP * vec4(VertexPosition, 1.0);
|
|
|
+ gl_Position = pos;
|
|
|
|
|
|
- // Flips texture coordinate Y if requested.
|
|
|
- vec2 texcoord = VertexTexcoord;
|
|
|
-#if MAT_TEXTURES>0
|
|
|
- if (MatTexFlipY(0)) {
|
|
|
- texcoord.y = 1 - texcoord.y;
|
|
|
- }
|
|
|
-#endif
|
|
|
- FragTexcoord = texcoord;
|
|
|
+ // Sets the size of the rasterized point decreasing with distance
|
|
|
+ gl_PointSize = (1.0 - pos.z / pos.w) * MatPointSize;
|
|
|
|
|
|
- gl_Position = MVP * vec4(VertexPosition, 1.0);
|
|
|
+ // Outputs color
|
|
|
+ Color = MatEmissiveColor;
|
|
|
}
|
|
|
|
|
|
`
|
|
|
|
|
|
-const panel_fragment_source = `//
|
|
|
-// Fragment Shader template
|
|
|
+const sprite_fragment_source = `//
|
|
|
+// Fragment shader for sprite
|
|
|
//
|
|
|
|
|
|
-// Texture uniforms
|
|
|
-uniform sampler2D MatTexture;
|
|
|
-uniform vec2 MatTexinfo[3];
|
|
|
-
|
|
|
-// Macros to access elements inside the MatTexinfo array
|
|
|
-#define MatTexOffset MatTexinfo[0]
|
|
|
-#define MatTexRepeat MatTexinfo[1]
|
|
|
-#define MatTexFlipY bool(MatTexinfo[2].x) // not used
|
|
|
-#define MatTexVisible bool(MatTexinfo[2].y) // not used
|
|
|
+#include <material>
|
|
|
|
|
|
// Inputs from vertex shader
|
|
|
+in vec3 Color;
|
|
|
in vec2 FragTexcoord;
|
|
|
|
|
|
-// Input uniform
|
|
|
-uniform vec4 Panel[8];
|
|
|
-#define Bounds Panel[0] // panel bounds in texture coordinates
|
|
|
-#define Border Panel[1] // panel border in texture coordinates
|
|
|
-#define Padding Panel[2] // panel padding in texture coordinates
|
|
|
-#define Content Panel[3] // panel content area in texture coordinates
|
|
|
-#define BorderColor Panel[4] // panel border color
|
|
|
-#define PaddingColor Panel[5] // panel padding color
|
|
|
-#define ContentColor Panel[6] // panel content color
|
|
|
-#define TextureValid bool(Panel[7].x) // texture valid flag
|
|
|
-
|
|
|
// Output
|
|
|
out vec4 FragColor;
|
|
|
|
|
|
+void main() {
|
|
|
|
|
|
-/***
|
|
|
-* Checks if current fragment texture coordinate is inside the
|
|
|
-* supplied rectangle in texture coordinates:
|
|
|
-* rect[0] - position x [0,1]
|
|
|
-* rect[1] - position y [0,1]
|
|
|
-* rect[2] - width [0,1]
|
|
|
-* rect[3] - height [0,1]
|
|
|
-*/
|
|
|
-bool checkRect(vec4 rect) {
|
|
|
-
|
|
|
- if (FragTexcoord.x < rect[0]) {
|
|
|
- return false;
|
|
|
- }
|
|
|
- if (FragTexcoord.x > rect[0] + rect[2]) {
|
|
|
- return false;
|
|
|
- }
|
|
|
- if (FragTexcoord.y < rect[1]) {
|
|
|
- return false;
|
|
|
- }
|
|
|
- if (FragTexcoord.y > rect[1] + rect[3]) {
|
|
|
- return false;
|
|
|
+ // Combine all texture colors and opacity
|
|
|
+ vec4 texCombined = vec4(1);
|
|
|
+#if MAT_TEXTURES>0
|
|
|
+ for (int i = 0; i < {{.MatTexturesMax}}; i++) {
|
|
|
+ vec4 texcolor = texture(MatTexture[i], FragTexcoord * MatTexRepeat(i) + MatTexOffset(i));
|
|
|
+ if (i == 0) {
|
|
|
+ texCombined = texcolor;
|
|
|
+ } else {
|
|
|
+ texCombined = mix(texCombined, texcolor, texcolor.a);
|
|
|
+ }
|
|
|
}
|
|
|
- return true;
|
|
|
+#endif
|
|
|
+
|
|
|
+ // Combine material color with texture
|
|
|
+ FragColor = min(vec4(Color, MatOpacity) * texCombined, vec4(1));
|
|
|
}
|
|
|
|
|
|
+`
|
|
|
|
|
|
-void main() {
|
|
|
+const sprite_vertex_source = `//
|
|
|
+// Vertex shader for sprites
|
|
|
+//
|
|
|
|
|
|
- // Discard fragment outside of received bounds
|
|
|
- // Bounds[0] - xmin
|
|
|
- // Bounds[1] - ymin
|
|
|
- // Bounds[2] - xmax
|
|
|
- // Bounds[3] - ymax
|
|
|
- if (FragTexcoord.x <= Bounds[0] || FragTexcoord.x >= Bounds[2]) {
|
|
|
- discard;
|
|
|
- }
|
|
|
- if (FragTexcoord.y <= Bounds[1] || FragTexcoord.y >= Bounds[3]) {
|
|
|
- discard;
|
|
|
- }
|
|
|
+#include <attributes>
|
|
|
|
|
|
- // Check if fragment is inside content area
|
|
|
- if (checkRect(Content)) {
|
|
|
- // If no texture, the color will be the material color.
|
|
|
- vec4 color = ContentColor;
|
|
|
- if (TextureValid) {
|
|
|
- // Adjust texture coordinates to fit texture inside the content area
|
|
|
- vec2 offset = vec2(-Content[0], -Content[1]);
|
|
|
- vec2 factor = vec2(1/Content[2], 1/Content[3]);
|
|
|
- vec2 texcoord = (FragTexcoord + offset) * factor;
|
|
|
- vec4 texColor = texture(MatTexture, texcoord * MatTexRepeat + MatTexOffset);
|
|
|
- // Mix content color with texture color ???
|
|
|
- //color = mix(color, texColor, texColor.a);
|
|
|
- color = texColor;
|
|
|
- }
|
|
|
- FragColor = color;
|
|
|
- return;
|
|
|
- }
|
|
|
+// Input uniforms
|
|
|
+uniform mat4 MVP;
|
|
|
|
|
|
- // Checks if fragment is inside paddings area
|
|
|
- if (checkRect(Padding)) {
|
|
|
- FragColor = PaddingColor;
|
|
|
- return;
|
|
|
- }
|
|
|
+#include <material>
|
|
|
|
|
|
- // Checks if fragment is inside borders area
|
|
|
- if (checkRect(Border)) {
|
|
|
- FragColor = BorderColor;
|
|
|
- return;
|
|
|
- }
|
|
|
+// Outputs for fragment shader
|
|
|
+out vec3 Color;
|
|
|
+out vec2 FragTexcoord;
|
|
|
|
|
|
- // Fragment is in margins area (always transparent)
|
|
|
- FragColor = vec4(1,1,1,0);
|
|
|
+void main() {
|
|
|
+
|
|
|
+ // Applies transformation to vertex position
|
|
|
+ gl_Position = MVP * vec4(VertexPosition, 1.0);
|
|
|
+
|
|
|
+ // Outputs color
|
|
|
+ Color = MatDiffuseColor;
|
|
|
+
|
|
|
+ // Flips texture coordinate Y if requested.
|
|
|
+ vec2 texcoord = VertexTexcoord;
|
|
|
+#if MAT_TEXTURES>0
|
|
|
+ if (MatTexFlipY[0]) {
|
|
|
+ texcoord.y = 1 - texcoord.y;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ FragTexcoord = texcoord;
|
|
|
}
|
|
|
|
|
|
`
|
|
|
|
|
|
-const phong_fragment_source = `//
|
|
|
+const standard_fragment_source = `//
|
|
|
// Fragment Shader template
|
|
|
//
|
|
|
+#include <material>
|
|
|
|
|
|
-// Inputs from vertex shader
|
|
|
-in vec4 Position; // Vertex position in camera coordinates.
|
|
|
-in vec3 Normal; // Vertex normal in camera coordinates.
|
|
|
-in vec3 CamDir; // Direction from vertex to camera
|
|
|
+// Inputs from Vertex shader
|
|
|
+in vec3 ColorFrontAmbdiff;
|
|
|
+in vec3 ColorFrontSpec;
|
|
|
+in vec3 ColorBackAmbdiff;
|
|
|
+in vec3 ColorBackSpec;
|
|
|
in vec2 FragTexcoord;
|
|
|
|
|
|
-#include <lights>
|
|
|
-#include <material>
|
|
|
-#include <phong_model>
|
|
|
-
|
|
|
-// Final fragment color
|
|
|
+// Output
|
|
|
out vec4 FragColor;
|
|
|
|
|
|
+
|
|
|
void main() {
|
|
|
|
|
|
// Mix material color with textures colors
|
|
|
@@ -691,70 +665,97 @@ void main() {
|
|
|
MIX_TEXTURE(2)
|
|
|
#endif
|
|
|
|
|
|
- // Combine material with texture colors
|
|
|
- vec4 matDiffuse = vec4(MatDiffuseColor, MatOpacity) * texMixed;
|
|
|
- vec4 matAmbient = vec4(MatAmbientColor, MatOpacity) * texMixed;
|
|
|
-
|
|
|
- // Inverts the fragment normal if not FrontFacing
|
|
|
- vec3 fragNormal = Normal;
|
|
|
- if (!gl_FrontFacing) {
|
|
|
- fragNormal = -fragNormal;
|
|
|
+ vec4 colorAmbDiff;
|
|
|
+ vec4 colorSpec;
|
|
|
+ if (gl_FrontFacing) {
|
|
|
+ colorAmbDiff = vec4(ColorFrontAmbdiff, MatOpacity);
|
|
|
+ colorSpec = vec4(ColorFrontSpec, 0);
|
|
|
+ } else {
|
|
|
+ colorAmbDiff = vec4(ColorBackAmbdiff, MatOpacity);
|
|
|
+ colorSpec = vec4(ColorBackSpec, 0);
|
|
|
}
|
|
|
-
|
|
|
- // Calculates the Ambient+Diffuse and Specular colors for this fragment using the Phong model.
|
|
|
- vec3 Ambdiff, Spec;
|
|
|
- phongModel(Position, fragNormal, CamDir, vec3(matAmbient), vec3(matDiffuse), Ambdiff, Spec);
|
|
|
-
|
|
|
- // Final fragment color
|
|
|
- FragColor = min(vec4(Ambdiff + Spec, matDiffuse.a), vec4(1.0));
|
|
|
+ FragColor = min(colorAmbDiff * texMixed + colorSpec, vec4(1));
|
|
|
}
|
|
|
|
|
|
`
|
|
|
|
|
|
-const basic_vertex_source = `//
|
|
|
-// Vertex shader basic
|
|
|
+const standard_vertex_source = `//
|
|
|
+// Vertex shader standard
|
|
|
//
|
|
|
#include <attributes>
|
|
|
|
|
|
// Model uniforms
|
|
|
+uniform mat4 ModelViewMatrix;
|
|
|
+uniform mat3 NormalMatrix;
|
|
|
uniform mat4 MVP;
|
|
|
|
|
|
-// Final output color for fragment shader
|
|
|
-out vec3 Color;
|
|
|
+#include <lights>
|
|
|
+#include <material>
|
|
|
+#include <phong_model>
|
|
|
+
|
|
|
+
|
|
|
+// Outputs for the fragment shader.
|
|
|
+out vec3 ColorFrontAmbdiff;
|
|
|
+out vec3 ColorFrontSpec;
|
|
|
+out vec3 ColorBackAmbdiff;
|
|
|
+out vec3 ColorBackSpec;
|
|
|
+out vec2 FragTexcoord;
|
|
|
|
|
|
void main() {
|
|
|
|
|
|
- Color = VertexColor;
|
|
|
+ // Transform this vertex normal to camera coordinates.
|
|
|
+ vec3 normal = normalize(NormalMatrix * VertexNormal);
|
|
|
+
|
|
|
+ // Calculate this vertex position in camera coordinates
|
|
|
+ vec4 position = ModelViewMatrix * vec4(VertexPosition, 1.0);
|
|
|
+
|
|
|
+ // Calculate the direction vector from the vertex to the camera
|
|
|
+ // The camera is at 0,0,0
|
|
|
+ vec3 camDir = normalize(-position.xyz);
|
|
|
+
|
|
|
+ // Calculates the vertex Ambient+Diffuse and Specular colors using the Phong model
|
|
|
+ // for the front and back
|
|
|
+ phongModel(position, normal, camDir, MatAmbientColor, MatDiffuseColor, ColorFrontAmbdiff, ColorFrontSpec);
|
|
|
+ phongModel(position, -normal, camDir, MatAmbientColor, MatDiffuseColor, ColorBackAmbdiff, ColorBackSpec);
|
|
|
+
|
|
|
+ vec2 texcoord = VertexTexcoord;
|
|
|
+#if MAT_TEXTURES > 0
|
|
|
+ // Flips texture coordinate Y if requested.
|
|
|
+ if (MatTexFlipY(0)) {
|
|
|
+ texcoord.y = 1 - texcoord.y;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ FragTexcoord = texcoord;
|
|
|
+
|
|
|
gl_Position = MVP * vec4(VertexPosition, 1.0);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
`
|
|
|
|
|
|
// Maps include name with its source code
|
|
|
var includeMap = map[string]string{
|
|
|
|
|
|
"attributes": include_attributes_source,
|
|
|
- "phong_model": include_phong_model_source,
|
|
|
"lights": include_lights_source,
|
|
|
"material": include_material_source,
|
|
|
+ "phong_model": include_phong_model_source,
|
|
|
}
|
|
|
|
|
|
// Maps shader name with its source code
|
|
|
var shaderMap = map[string]string{
|
|
|
|
|
|
+ "basic_fragment": basic_fragment_source,
|
|
|
+ "basic_vertex": basic_vertex_source,
|
|
|
+ "panel_fragment": panel_fragment_source,
|
|
|
+ "panel_vertex": panel_vertex_source,
|
|
|
+ "phong_fragment": phong_fragment_source,
|
|
|
+ "phong_vertex": phong_vertex_source,
|
|
|
+ "point_fragment": point_fragment_source,
|
|
|
+ "point_vertex": point_vertex_source,
|
|
|
"sprite_fragment": sprite_fragment_source,
|
|
|
"sprite_vertex": sprite_vertex_source,
|
|
|
- "point_vertex": point_vertex_source,
|
|
|
- "panel_vertex": panel_vertex_source,
|
|
|
"standard_fragment": standard_fragment_source,
|
|
|
"standard_vertex": standard_vertex_source,
|
|
|
- "point_fragment": point_fragment_source,
|
|
|
- "basic_fragment": basic_fragment_source,
|
|
|
- "phong_vertex": phong_vertex_source,
|
|
|
- "panel_fragment": panel_fragment_source,
|
|
|
- "phong_fragment": phong_fragment_source,
|
|
|
- "basic_vertex": basic_vertex_source,
|
|
|
}
|
|
|
|
|
|
// Maps program name with Proginfo struct with shaders names
|