summaryrefslogtreecommitdiff
path: root/graphics/asymptote/webgl/vertex.glsl
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/asymptote/webgl/vertex.glsl')
-rw-r--r--graphics/asymptote/webgl/vertex.glsl84
1 files changed, 84 insertions, 0 deletions
diff --git a/graphics/asymptote/webgl/vertex.glsl b/graphics/asymptote/webgl/vertex.glsl
new file mode 100644
index 0000000000..250c0b7b4a
--- /dev/null
+++ b/graphics/asymptote/webgl/vertex.glsl
@@ -0,0 +1,84 @@
+attribute vec3 position;
+#ifdef WIDTH
+attribute float width;
+#endif
+#ifdef NORMAL
+attribute vec3 normal;
+#endif
+attribute float materialIndex;
+#ifdef COLOR
+attribute vec4 color;
+#endif
+
+uniform mat3 normMat;
+uniform mat4 viewMat;
+uniform mat4 projViewMat;
+
+#ifdef NORMAL
+#ifndef ORTHOGRAPHIC
+varying vec3 ViewPosition;
+#endif
+varying vec3 Normal;
+#endif
+varying vec4 diffuse;
+varying vec3 specular;
+varying float roughness,metallic,fresnel0;
+varying vec4 emissive;
+
+struct Material {
+ vec4 diffuse,emissive,specular;
+ vec4 parameters;
+};
+
+uniform Material Materials[Nmaterials];
+
+void main(void)
+{
+ vec4 v=vec4(position,1.0);
+ gl_Position=projViewMat*v;
+#ifdef NORMAL
+#ifndef ORTHOGRAPHIC
+ ViewPosition=(viewMat*v).xyz;
+#endif
+ Normal=normal*normMat;
+
+ Material m;
+#ifdef TRANSPARENT
+ m=Materials[int(abs(materialIndex))-1];
+ if(materialIndex >= 0.0) {
+ diffuse=m.diffuse;
+ emissive=m.emissive;
+ } else {
+ diffuse=color;
+#if nlights > 0
+ emissive=vec4(0.0);
+#else
+ emissive=color;
+#endif
+ }
+#else
+ m=Materials[int(materialIndex)];
+#ifdef COLOR
+ diffuse=color;
+#if nlights > 0
+ emissive=vec4(0.0);
+#else
+ emissive=color;
+#endif
+#else
+ diffuse=m.diffuse;
+ emissive=m.emissive;
+#endif
+#endif
+ specular=m.specular.rgb;
+ vec4 parameters=m.parameters;
+ roughness=1.0-parameters[0];
+ metallic=parameters[1];
+ fresnel0=parameters[2];
+#else
+ emissive=Materials[int(materialIndex)].emissive;
+#endif
+#ifdef WIDTH
+ gl_PointSize=width;
+#endif
+}