drawProgram = {
return regl({
frag: `
precision mediump float;
uniform vec4 color;
varying vec3 vertex_normal;
varying vec3 vertex_texdir;
uniform vec3 light_dir;
uniform bool modulate;
uniform float blend_alpha;
uniform samplerCube cube;
void main () {
vec3 normal = normalize(vertex_normal);
vec3 normal_inv = normalize (vertex_texdir);
vec4 texColor = textureCube(cube,normal_inv);
vec4 lightColor = vec4(clamp(color.xyz*dot(normal,light_dir),0.0,1.0),1.0);
if (modulate) gl_FragColor = texColor*lightColor;
else gl_FragColor = texColor*blend_alpha+lightColor*(1.0-blend_alpha);
}`,
vert: `
attribute vec3 position;
attribute vec3 normal;
varying vec3 vertex_normal;
varying vec3 vertex_texdir;
uniform mat4 modelview;
uniform mat4 invmodelview;
uniform mat4 projection;
void main () {
vec4 worldpos = modelview*vec4(position, 1.0);
gl_Position = projection*worldpos;
${conf.envmap ? `
vec4 eye = invmodelview * vec4(0, 0, 0, 1);
vertex_texdir = reflect(normalize(position.xyz - eye.xyz/eye.w),normal);
` : `
vertex_texdir = normal;
`}
vertex_normal = (modelview*vec4(normal,0.0)).xyz;
}`,
attributes: {
position: obj.vertices,
normal: obj.normals
},
uniforms: {
color: [1, 1, 1, 1],
light_dir : vec3.normalize([], vec3.set ([],1,1,2)),
modelview : regl.prop('modelview'),
invmodelview : regl.prop ('invmodelview'),
projection : regl.prop ('projection'),
cube : cube,
modulate : regl.prop('modulate'),
blend_alpha : regl.prop ('blend_alpha')
},
depth: {
enable: true,
func: '<',
mask: true,
},
elements: obj.faces
})
}