Last active
August 10, 2017 22:45
-
-
Save xriss/90f8c1d2e9cb0b9d307fe68aebb4b9c3 to your computer and use it in GitHub Desktop.
Fun64 : testing the background copper using shadertoy code.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
local wstr=require("wetgenes.string") | |
local wgrd=require("wetgenes.grd") | |
local tardis=require("wetgenes.tardis") -- matrix/vector math | |
local bitdown=require("wetgenes.gamecake.fun.bitdown") | |
local bitdown_font_4x8=require("wetgenes.gamecake.fun.bitdown_font_4x8") | |
-- | |
-- This is fun64 code, you can copy paste it into https://xriss.github.io/fun64/pad/ to run it. | |
-- | |
hardware,main=system.configurator({ | |
mode="fun64", -- select the standard 320x240 screen using the swanky32 palette. | |
update=function() update() end, -- called repeatedly to update+draw | |
}) | |
-- define all graphics in this global, we will convert and upload to tiles at setup | |
-- although you can change tiles during a game, we try and only upload graphics | |
-- during initial setup so we have a nice looking sprite sheet to be edited by artists | |
graphics={ | |
{0x0100,"",[[ | |
. . . . . . . . | |
. . . . . . . . | |
. . . . . . . . | |
. . . . . . . . | |
. . . . . . . . | |
. . . . . . . . | |
. . . . . . . . | |
. . . . . . . . | |
]]}, | |
{0x0101,"",[[ | |
1 1 1 1 1 1 1 1 | |
1 1 1 1 1 1 1 1 | |
1 1 1 1 1 1 1 1 | |
1 1 1 1 1 1 1 1 | |
1 1 1 1 1 1 1 1 | |
1 1 1 1 1 1 1 1 | |
1 1 1 1 1 1 1 1 | |
1 1 1 1 1 1 1 1 | |
]]}, | |
{0x0102,"",[[ | |
2 2 2 2 2 2 2 2 | |
2 2 2 2 2 2 2 2 | |
2 2 2 2 2 2 2 2 | |
2 2 2 2 2 2 2 2 | |
2 2 2 2 2 2 2 2 | |
2 2 2 2 2 2 2 2 | |
2 2 2 2 2 2 2 2 | |
2 2 2 2 2 2 2 2 | |
]]}, | |
{0x0103,"",[[ | |
7 7 7 7 7 7 7 7 | |
7 0 0 0 0 0 0 7 | |
7 0 0 0 0 0 0 7 | |
7 0 0 0 0 0 0 7 | |
7 0 0 0 0 0 0 7 | |
7 0 0 0 0 0 0 7 | |
7 0 0 0 0 0 0 7 | |
7 7 7 7 7 7 7 7 | |
]]}, | |
{0x0200,"sprite_test",[[ | |
. . . . . . . 7 7 . . . . . . 7 7 . . . . . . . | |
. . . . . . . 7 7 . . . . . . 7 7 . . . . . . . | |
. . . . . . . 7 7 . . . . . . 7 7 . . . . . . . | |
. . . . . . . 7 7 . . . . . . 7 7 . . . . . . . | |
. . . . . . . 7 7 . . . . . . 7 7 . . . . . . . | |
. . . . . . . 7 7 . . . . . . 7 7 . . . . . . . | |
. . . . . . . 7 7 . . . . . . 7 7 . . . . . . . | |
7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | |
7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | |
. . . . . . . 7 7 . . . . . . 7 7 . . . . . . . | |
. . . . . . . 7 7 . . . . . . 7 7 . . . . . . . | |
. . . . . . . 7 7 . . . . . . 7 7 . . . . . . . | |
. . . . . . . 7 7 . . . . . . 7 7 . . . . . . . | |
. . . . . . . 7 7 . . . . . . 7 7 . . . . . . . | |
. . . . . . . 7 7 . . . . . . 7 7 . . . . . . . | |
7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | |
7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | |
. . . . . . . 7 7 . . . . . . 7 7 . . . . . . . | |
. . . . . . . 7 7 . . . . . . 7 7 . . . . . . . | |
. . . . . . . 7 7 . . . . . . 7 7 . . . . . . . | |
. . . . . . . 7 7 . . . . . . 7 7 . . . . . . . | |
. . . . . . . 7 7 . . . . . . 7 7 . . . . . . . | |
. . . . . . . 7 7 . . . . . . 7 7 . . . . . . . | |
. . . . . . . 7 7 . . . . . . 7 7 . . . . . . . | |
]]}, | |
} | |
local maps={} | |
local tilemap={ | |
[0]={0,0,0,0}, | |
[". "]={ 0, 1, 31, 0}, | |
["1 "]={ 1, 1, 31, 0}, | |
["2 "]={ 2, 1, 31, 0}, | |
["3 "]={ 3, 1, 31, 0}, | |
["4 "]={ 4, 1, 31, 0}, | |
["5 "]={ 5, 1, 31, 0}, | |
["6 "]={ 6, 1, 31, 0}, | |
["7 "]={ 7, 1, 31, 0}, | |
["8 "]={ 8, 1, 31, 0}, | |
["9 "]={ 9, 1, 31, 0}, | |
["A "]={ 10, 1, 31, 0}, | |
["B "]={ 11, 1, 31, 0}, | |
["C "]={ 12, 1, 31, 0}, | |
["D "]={ 13, 1, 31, 0}, | |
["E "]={ 14, 1, 31, 0}, | |
["F "]={ 15, 1, 31, 0}, | |
} | |
maps[0]=[[ | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . . 1 . . . . . 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. . . . 1 1 . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
. 1 . . 1 1 . . . . 1 1 1 . . . . . 1 . . . . . . . . . . . . . . . . . . . . . | |
. 1 . . 1 1 . . . 1 1 2 1 1 . . . . 1 1 . . . . . . . . . . . . . . . . . . . . | |
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 | |
]] | |
-- we will call this once in the update function | |
setup=function() | |
-- system.components.screen.bloom=0 | |
-- system.components.screen.filter=nil | |
-- system.components.screen.shadow=nil | |
system.components.copper.shader_name="fun_copper_back_wave" | |
-- copy font data tiles into top line | |
system.components.tiles.bitmap_grd:pixels(0,0,128*4,8, bitdown_font_4x8.grd_mask:pixels(0,0,128*4,8,"") ) | |
-- upload graphics | |
system.components.tiles.upload_tiles( graphics ) | |
-- screen | |
bitdown.pix_grd( maps[0], tilemap, system.components.map.tilemap_grd )--,0,0,48,32) | |
print("Setup complete!") | |
end | |
-- updates are run at 60fps | |
update=function() | |
if setup then setup() setup=nil end | |
local names=system.components.tiles.names | |
-- test text | |
local tx=[[ | |
Fun is the enjoyment of pleasure, particularly in leisure activities. Fun is an experience - short-term, often unexpected, informal, not cerebral and generally purposeless. It is an enjoyable distraction, diverting the mind and body from any serious task or contributing an extra dimension to it. Although particularly associated with recreation and play, fun may be encountered during work, social functions, and even seemingly mundane activities of daily living. It may often have little to no logical basis, and opinions on whether or not an activity is fun may differ. A distinction between enjoyment and fun is difficult but possible to articulate, fun being a more spontaneous, playful, or active event. There are psychological and physiological implications to the experience of fun.]] | |
local tl=wstr.smart_wrap(tx,system.components.text.text_hx) | |
for i=0,system.components.text.tilemap_hy-1 do | |
local t=tl[i+1] | |
if not t then break end | |
system.components.text.text_print(t,0,i) | |
end | |
system.components.text.px=(system.components.text.px+1)%system.components.screen.hx -- scroll text position | |
-- system.components.sprites.list_reset() | |
system.components.sprites.list_add({t=names.sprite_test.idx,h=24,px=100,py=100,rz=360*system.components.text.px/system.components.screen.hx}) | |
end | |
-- Include GLSL code inside a comment | |
-- The GLSL handler will pickup the #shader directive and use all the code following it until the next #shader directive. | |
--[=[ | |
#shader "fun_copper_back_wave" | |
#ifdef VERTEX_SHADER | |
uniform mat4 modelview; | |
uniform mat4 projection; | |
uniform vec4 color; | |
attribute vec3 a_vertex; | |
attribute vec2 a_texcoord; | |
varying vec2 v_texcoord; | |
varying vec4 v_color; | |
void main() | |
{ | |
gl_Position = projection * vec4(a_vertex, 1.0); | |
v_texcoord=a_texcoord; | |
v_color=color; | |
} | |
#endif | |
#ifdef FRAGMENT_SHADER | |
#if defined(GL_FRAGMENT_PRECISION_HIGH) | |
precision highp float; /* really need better numbers if possible */ | |
#endif | |
varying vec2 v_texcoord; | |
varying vec4 v_color; | |
uniform vec3 iResolution; // viewport resolution (in pixels) | |
uniform float iGlobalTime; // shader playback time (in seconds) | |
uniform float iTimeDelta; // render time (in seconds) | |
uniform int iFrame; // shader playback frame | |
uniform float iChannelTime[4]; // channel playback time (in seconds) | |
uniform vec3 iChannelResolution[4]; // channel resolution (in pixels) | |
uniform vec4 iMouse; // mouse pixel coords. xy: current (if MLB down), zw: click | |
uniform sampler2D iChannel0; // input channel. XX = 2D/Cube | |
uniform vec4 iDate; // (year, month, day, time in seconds) | |
uniform float iSampleRate; // sound sample rate (i.e., 44100) | |
void mainImage( out vec4 fragColor, in vec2 fragCoord ); | |
void main(void) | |
{ | |
vec2 uv=v_texcoord; | |
uv.y=iResolution.y-uv.y; | |
mainImage(gl_FragColor,uv); | |
} | |
// Really nice water shader from -> https://www.shadertoy.com/view/Ms2SD1 | |
/* | |
* "Seascape" by Alexander Alekseev aka TDM - 2014 | |
* License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. | |
* Contact: tdmaav@gmail.com | |
*/ | |
const int NUM_STEPS = 8; | |
const float PI = 3.141592; | |
const float EPSILON = 1e-3; | |
#define EPSILON_NRM (0.1 / iResolution.x) | |
// sea | |
const int ITER_GEOMETRY = 3; | |
const int ITER_FRAGMENT = 5; | |
const float SEA_HEIGHT = 0.6; | |
const float SEA_CHOPPY = 4.0; | |
const float SEA_SPEED = 0.8; | |
const float SEA_FREQ = 0.16; | |
const vec3 SEA_BASE = vec3(0.1,0.19,0.22); | |
const vec3 SEA_WATER_COLOR = vec3(0.8,0.9,0.6); | |
#define SEA_TIME (1.0 + iGlobalTime * SEA_SPEED) | |
const mat2 octave_m = mat2(1.6,1.2,-1.2,1.6); | |
// math | |
mat3 fromEuler(vec3 ang) { | |
vec2 a1 = vec2(sin(ang.x),cos(ang.x)); | |
vec2 a2 = vec2(sin(ang.y),cos(ang.y)); | |
vec2 a3 = vec2(sin(ang.z),cos(ang.z)); | |
mat3 m; | |
m[0] = vec3(a1.y*a3.y+a1.x*a2.x*a3.x,a1.y*a2.x*a3.x+a3.y*a1.x,-a2.y*a3.x); | |
m[1] = vec3(-a2.y*a1.x,a1.y*a2.y,a2.x); | |
m[2] = vec3(a3.y*a1.x*a2.x+a1.y*a3.x,a1.x*a3.x-a1.y*a3.y*a2.x,a2.y*a3.y); | |
return m; | |
} | |
float hash( vec2 p ) { | |
float h = dot(p,vec2(127.1,311.7)); | |
return fract(sin(h)*43758.5453123); | |
} | |
float noise( in vec2 p ) { | |
vec2 i = floor( p ); | |
vec2 f = fract( p ); | |
vec2 u = f*f*(3.0-2.0*f); | |
return -1.0+2.0*mix( mix( hash( i + vec2(0.0,0.0) ), | |
hash( i + vec2(1.0,0.0) ), u.x), | |
mix( hash( i + vec2(0.0,1.0) ), | |
hash( i + vec2(1.0,1.0) ), u.x), u.y); | |
} | |
// lighting | |
float diffuse(vec3 n,vec3 l,float p) { | |
return pow(dot(n,l) * 0.4 + 0.6,p); | |
} | |
float specular(vec3 n,vec3 l,vec3 e,float s) { | |
float nrm = (s + 8.0) / (PI * 8.0); | |
return pow(max(dot(reflect(e,n),l),0.0),s) * nrm; | |
} | |
// sky | |
vec3 getSkyColor(vec3 e) { | |
e.y = max(e.y,0.0); | |
return vec3(pow(1.0-e.y,2.0), 1.0-e.y, 0.6+(1.0-e.y)*0.4)*0.125; | |
} | |
// sea | |
float sea_octave(vec2 uv, float choppy) { | |
uv += noise(uv); | |
vec2 wv = 1.0-abs(sin(uv)); | |
vec2 swv = abs(cos(uv)); | |
wv = mix(wv,swv,wv); | |
return pow(1.0-pow(wv.x * wv.y,0.65),choppy); | |
} | |
float map(vec3 p) { | |
float freq = SEA_FREQ; | |
float amp = SEA_HEIGHT; | |
float choppy = SEA_CHOPPY; | |
vec2 uv = p.xz; uv.x *= 0.75; | |
float d, h = 0.0; | |
for(int i = 0; i < ITER_GEOMETRY; i++) { | |
d = sea_octave((uv+SEA_TIME)*freq,choppy); | |
d += sea_octave((uv-SEA_TIME)*freq,choppy); | |
h += d * amp; | |
uv *= octave_m; freq *= 1.9; amp *= 0.22; | |
choppy = mix(choppy,1.0,0.2); | |
} | |
return p.y - h; | |
} | |
float map_detailed(vec3 p) { | |
float freq = SEA_FREQ; | |
float amp = SEA_HEIGHT; | |
float choppy = SEA_CHOPPY; | |
vec2 uv = p.xz; uv.x *= 0.75; | |
float d, h = 0.0; | |
for(int i = 0; i < ITER_FRAGMENT; i++) { | |
d = sea_octave((uv+SEA_TIME)*freq,choppy); | |
d += sea_octave((uv-SEA_TIME)*freq,choppy); | |
h += d * amp; | |
uv *= octave_m; freq *= 1.9; amp *= 0.22; | |
choppy = mix(choppy,1.0,0.2); | |
} | |
return p.y - h; | |
} | |
vec3 getSeaColor(vec3 p, vec3 n, vec3 l, vec3 eye, vec3 dist) { | |
float fresnel = clamp(1.0 - dot(n,-eye), 0.0, 1.0); | |
fresnel = pow(fresnel,3.0) * 0.65; | |
vec3 reflected = getSkyColor(reflect(eye,n)); | |
vec3 refracted = SEA_BASE + diffuse(n,l,80.0) * SEA_WATER_COLOR * 0.12; | |
vec3 color = mix(refracted,reflected,fresnel); | |
float atten = max(1.0 - dot(dist,dist) * 0.001, 0.0); | |
color += SEA_WATER_COLOR * (p.y - SEA_HEIGHT) * 0.18 * atten; | |
color += vec3(specular(n,l,eye,60.0)); | |
return color; | |
} | |
// tracing | |
vec3 getNormal(vec3 p, float eps) { | |
vec3 n; | |
n.y = map_detailed(p); | |
n.x = map_detailed(vec3(p.x+eps,p.y,p.z)) - n.y; | |
n.z = map_detailed(vec3(p.x,p.y,p.z+eps)) - n.y; | |
n.y = eps; | |
return normalize(n); | |
} | |
float heightMapTracing(vec3 ori, vec3 dir, out vec3 p) { | |
float tm = 0.0; | |
float tx = 1000.0; | |
float hx = map(ori + dir * tx); | |
if(hx > 0.0) return tx; | |
float hm = map(ori + dir * tm); | |
float tmid = 0.0; | |
for(int i = 0; i < NUM_STEPS; i++) { | |
tmid = mix(tm,tx, hm/(hm-hx)); | |
p = ori + dir * tmid; | |
float hmid = map(p); | |
if(hmid < 0.0) { | |
tx = tmid; | |
hx = hmid; | |
} else { | |
tm = tmid; | |
hm = hmid; | |
} | |
} | |
return tmid; | |
} | |
// main | |
void mainImage( out vec4 fragColor, in vec2 fragCoord ) { | |
vec2 uv = fragCoord.xy / iResolution.xy; | |
uv = uv * 2.0 - 1.0; | |
uv.x *= iResolution.x / iResolution.y; | |
float time = iGlobalTime * 0.3 + iMouse.x*0.01; | |
// ray | |
vec3 ang = vec3(sin(time*3.0)*0.1,sin(time)*0.2+0.3,time); | |
vec3 ori = vec3(0.0,3.5,time*5.0); | |
vec3 dir = normalize(vec3(uv.xy,-2.0)); dir.z += length(uv) * 0.15; | |
dir = normalize(dir) * fromEuler(ang); | |
// tracing | |
vec3 p; | |
heightMapTracing(ori,dir,p); | |
vec3 dist = p - ori; | |
vec3 n = getNormal(p, dot(dist,dist) * EPSILON_NRM); | |
vec3 light = normalize(vec3(0.0,1.0,0.8)); | |
// color | |
vec3 color = mix( | |
getSkyColor(dir), | |
getSeaColor(p,n,light,dir,dist), | |
pow(smoothstep(0.0,-0.05,dir.y),0.3)); | |
// post | |
fragColor = vec4(pow(color,vec3(0.75)), 1.0); | |
} | |
#endif | |
#shader | |
This test will be ignored | |
//]=] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment