|
@@ -0,0 +1,41 @@
|
|
|
+function lovr.load()
|
|
|
+ grass = lovr.graphics.newTexture('grass.png')
|
|
|
+ rock = lovr.graphics.newTexture('rock.png')
|
|
|
+ dirt = lovr.graphics.newTexture('dirt.png')
|
|
|
+
|
|
|
+ triplanar = lovr.graphics.newShader('unlit', [[
|
|
|
+ uniform texture2D textureX;
|
|
|
+ uniform texture2D textureY;
|
|
|
+ uniform texture2D textureZ;
|
|
|
+ uniform float textureScale;
|
|
|
+
|
|
|
+ vec4 lovrmain() {
|
|
|
+ vec2 xscale = vec2(-sign(Normal.x), -1.);
|
|
|
+ vec2 yscale = vec2( sign(Normal.y), +1.);
|
|
|
+ vec2 zscale = vec2( sign(Normal.z), -1.);
|
|
|
+
|
|
|
+ vec3 colorX = getPixel(textureX, PositionWorld.zy * textureScale * xscale).rgb;
|
|
|
+ vec3 colorY = getPixel(textureY, PositionWorld.xz * textureScale * yscale).rgb;
|
|
|
+ vec3 colorZ = getPixel(textureZ, PositionWorld.xy * textureScale * zscale).rgb;
|
|
|
+
|
|
|
+ vec3 normal = abs(normalize(Normal));
|
|
|
+ vec3 weight = normal / (normal.x + normal.y + normal.z);
|
|
|
+ vec3 color = colorX * weight.x + colorY * weight.y + colorZ * weight.z;
|
|
|
+
|
|
|
+ return Color * vec4(color, 1.);
|
|
|
+ }
|
|
|
+ ]])
|
|
|
+end
|
|
|
+
|
|
|
+function lovr.draw(pass)
|
|
|
+ pass:setShader(triplanar)
|
|
|
+ pass:send('textureScale', 1.0)
|
|
|
+ pass:send('textureX', rock)
|
|
|
+ pass:send('textureY', grass)
|
|
|
+ pass:send('textureZ', dirt)
|
|
|
+
|
|
|
+ local width = 4 + 2 * math.cos(lovr.timer.getTime())
|
|
|
+ local height = 3 + 2 * math.sin(lovr.timer.getTime())
|
|
|
+
|
|
|
+ pass:box(0, -2, -10, width, height, 3)
|
|
|
+end
|