aboutsummaryrefslogtreecommitdiff
path: root/bin/main.lua
blob: 3ab9b9247b3c993ce050c47c4776d8c5a82995b7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
local shader = [[ 
extern Image diffuse;
extern vec2 mouse; 
extern number i ; 

vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 pixel_coords)
{
   vec3 light_vec = vec3(mouse,1);
   vec3 light_direction = light_vec - vec3(pixel_coords, 0);
   float distance = length(light_direction);
   light_direction = normalize(light_direction);

   vec3 normal = Texel(texture, texture_coords).xyz;
   normal.y = 1 - normal.y;
   normal = normalize(mix(vec3(-1), vec3(1), normal));

   //float attenuation = 1/(7e-5*pow(distance, 2));
   float attenuation = 5000/pow(distance, 2);
   //float attenuation = 1;

   float diffuse_term = clamp(attenuation * dot(normal, light_direction), 0.0, 1.0);

   vec3 dark_color = vec3(0.0, 0.0, 1);
   //vec3 light_color = vec3(0.6, 0.6, 0.0);
   vec3 light_color = vec3(0.8, 0.8, 0.0);
   vec3 ambient = mix(dark_color, light_color, diffuse_term) * 0.20;

   // the shaded cel has a light value of 0.5, the light cel has a light value of 1
   float cel_diffuse_term = smoothstep(0.49, 0.52, diffuse_term)/2 + 0.5;
   //float cel_diffuse_term = step(0.5, diffuse_term)/2 + 0.5;

   return vec4((cel_diffuse_term * Texel(diffuse, texture_coords).rgb) + ambient, Texel(texture, texture_coords).a);
   //return vec4(ambient+Texel(diffuse, texture_coords).rgb/100, Texel(texture, texture_coords).a);

}
]]

local shader2 = [[ 
extern Image diffuse;
vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 pixel_coords)
{
	return Texel(diffuse, texture_coords);
}	
]] 

local lighningShader = [[ 
extern vec2 iResolution; // 分辨率, pixels
extern number iTime;  // 秒数, seconds
// Lightning shader
// rand,noise,fmb functions from https://www.shadertoy.com/view/Xsl3zN
// jerome

float rand(vec2 n) {
    return fract(sin(dot(n, vec2(12.9898, 4.1414))) * 43758.5453);
}

float noise(vec2 n) {
    const vec2 d = vec2(0.0, 1.0);
    vec2 b = floor(n), f = smoothstep(vec2(0.0), vec2(1.0), fract(n));
    return mix(mix(rand(b), rand(b + d.yx), f.x), mix(rand(b + d.xy), rand(b + d.yy), f.x), f.y);
}

float fbm(vec2 n) {
    float total = 0.0, amplitude = 1.0;
    for (int i = 0; i < 7; i++) {
        total += noise(n) * amplitude;
        n += n;
        amplitude *= 0.5;
    }
    return total;
}

vec4 effect(vec4 outcolor, Image img, vec2 texture_coords, vec2 pixel_coords)
//void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec4 col = vec4(0,0,0,1);
    vec2 uv = pixel_coords.xy * 1.0 / iResolution.xy;
   
   
    // draw a line, left side is fixed
    vec2 t = uv * vec2(2.0,1.0) - iTime*3.0;
    vec2 t2 = (vec2(1,-1) + uv) * vec2(2.0,1.0) - iTime*3.0; // a second strand
   
    // draw the lines,
//  this make the left side fixed, can be useful
//  float ycenter = mix( 0.5, 0.25 + 0.25*fbm( t ), uv.x*4.0);
//    float ycenter2 = mix( 0.5, 0.25 + 0.25*fbm( t2 ), uv.x*4.0);
    float ycenter = fbm(t)*0.5;
    float ycenter2= fbm(t2)*0.5;

    // falloff
    float diff = abs(uv.y - ycenter);
    float c1 = 1.0 - mix(0.0,1.0,diff*20.0);
   
    float diff2 = abs(uv.y - ycenter2);
    float c2 = 1.0 - mix(0.0,1.0,diff2*20.0);
   
    float c = max(c1,c2);
    col = vec4(c*0.6,0.2*c2,c,1.0); // purple color
    //fragColor = col;
	return col; 
}
]]

local jg = jin.graphics
local effect =  jg.Shader(shader) 
local effect2 = jg.Shader(shader2)
local lightning = jg.Shader(lighningShader)
local diffuse = jg.Image("treestump_diffuse.png")
local img = jg.Image("treestump.png")
local img2 = jg.Image("lightning.png")
local ww, wh = jg.size() 
local scale = 2 
ww = ww / scale 
wh = wh / scale 
jin.core.onLoad = function() 
	jg.use(lightning)
	lightning:send("vec2", "iResolution", ww, wh)
	jg.unuse()
end 
jin.core.onEvent = function(e) 
	if e.type == "quit" then 
		jin.core.quit() 
	end 
end 
local mx, my 
local c = 0
local t = 0;
jin.core.onUpdate = function(dt) 
	t = t + dt
	mx, my = jin.mouse.position() 
	mx = mx / 2 
	my = my / 2
	my = wh - my
	c = c + 1
	if c == 50 then 
		print(1/dt)
		c = 0
	end 
end 
img:setAnchor(16, 16)
local cvs = jg.Canvas(320, 240)
local i = 0

jin.core.onDraw = function() 
--	if true then return end
	i = i + 0.001
	jg.bind(cvs)
		jg.draw(img, 10, 10)
		-- jg.use(lightning)
			-- lightning:send("number", "iTime", t)
			-- lightning:send("Image", "img", img2)
			-- jg.draw(img2, 20, 20)
		-- jg.unuse()
	jg.unbind()	
	jg.draw(cvs, 0, 0, 2, 2)
end