Created
August 22, 2018 18:03
-
-
Save i80and/a3c30d039dc9bcdbff95bf5ab7bcc494 to your computer and use it in GitHub Desktop.
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
(module | |
(func $vec_getx (param $a i64) (result f32) | |
(i64.and (get_local $a) (i64.const 0xffffffff)) | |
i32.wrap/i64 | |
f32.reinterpret/i32 | |
) | |
(func $vec_gety (param $a i64) (result f32) | |
(i64.shr_u (get_local $a) (i64.const 32)) | |
i32.wrap/i64 | |
f32.reinterpret/i32 | |
) | |
(func $vec_new (param $x f32) (param $y f32) (result i64) | |
(i64.extend_u/i32 (i32.reinterpret/f32 (get_local $x))) | |
(i64.shl (i64.extend_u/i32 (i32.reinterpret/f32 (get_local $y))) (i64.const 32)) | |
i64.or | |
) | |
(func $vec_dot (param $a i64) (param $b i64) (result f32) | |
get_local $a | |
call $vec_getx | |
get_local $b | |
call $vec_getx | |
f32.mul | |
get_local $a | |
call $vec_gety | |
get_local $b | |
call $vec_gety | |
f32.mul | |
f32.add | |
) | |
(func $vec_len (param $a i64) (result f32) | |
(local $x f32) | |
(tee_local $x (call $vec_getx (get_local $a))) | |
get_local $x | |
f32.mul | |
(tee_local $x (call $vec_gety (get_local $a))) | |
get_local $x | |
f32.mul | |
f32.add | |
f32.sqrt | |
) | |
(func $vec_normalize (param $a i64) (result i64) | |
(local $len f32) | |
(call $vec_getx (get_local $a)) | |
(tee_local $len (call $vec_len (get_local $a))) | |
f32.div | |
(f32.div (call $vec_gety (get_local $a)) (get_local $len)) | |
call $vec_new | |
) | |
(func $vec_add (param $a i64) (param $b i64) (result i64) | |
(call $vec_new | |
(f32.add | |
(call $vec_getx (get_local $a)) | |
(call $vec_getx (get_local $b))) | |
(f32.add | |
(call $vec_gety (get_local $a)) | |
(call $vec_gety (get_local $b)))) | |
) | |
(func $ease (param $x f32) (result f32) | |
f32.const 6 | |
get_local $x | |
get_local $x | |
get_local $x | |
get_local $x | |
get_local $x | |
f32.mul | |
f32.mul | |
f32.mul | |
f32.mul | |
f32.mul | |
f32.const 15 | |
get_local $x | |
get_local $x | |
get_local $x | |
get_local $x | |
f32.mul | |
f32.mul | |
f32.mul | |
f32.mul | |
f32.sub | |
f32.const 10 | |
get_local $x | |
get_local $x | |
get_local $x | |
f32.mul | |
f32.mul | |
f32.mul | |
f32.add | |
) | |
(func $xorshift (param $x i32) (result i32) | |
(set_local $x (i32.xor (get_local $x) (i32.shl (get_local $x) (i32.const 6)))) | |
(set_local $x (i32.xor (get_local $x) (i32.shr_u (get_local $x) (i32.const 13)))) | |
(i32.xor (get_local $x) (i32.shl (get_local $x) (i32.const 5))) | |
) | |
(func $get_gradient (param $x f32) (param $y f32) (result i64) | |
i64.const 0 | |
) | |
(func $noise (param $x f32) (param $y f32) (result f32) | |
(local $x0 f32) | |
(local $x1 f32) | |
(local $y0 f32) | |
(local $y1 f32) | |
(local $s f32) | |
(local $t f32) | |
(local $u f32) | |
(local $v f32) | |
(local $weight_x f32) | |
(local $weight_y f32) | |
(local $a f32) | |
(local $b f32) | |
(set_local $x0 (f32.floor (get_local $x))) | |
(set_local $x1 (f32.ceil (get_local $x))) | |
(set_local $y0 (f32.floor (get_local $y))) | |
(set_local $y1 (f32.ceil (get_local $y))) | |
(set_local $s | |
(call $vec_dot | |
(call $get_gradient (get_local $x0) (get_local $y0)) | |
(call $vec_new | |
(f32.sub (get_local $x) (get_local $x0)) | |
(f32.sub (get_local $y) (get_local $y0))))) | |
(set_local $t | |
(call $vec_dot | |
(call $get_gradient (get_local $x1) (get_local $y0)) | |
(call $vec_new | |
(f32.sub (get_local $x) (get_local $x1)) | |
(f32.sub (get_local $y) (get_local $y0))))) | |
(set_local $u | |
(call $vec_dot | |
(call $get_gradient (get_local $x0) (get_local $y1)) | |
(call $vec_new | |
(f32.sub (get_local $x) (get_local $x0)) | |
(f32.sub (get_local $y) (get_local $y1))))) | |
(set_local $v | |
(call $vec_dot | |
(call $get_gradient (get_local $x1) (get_local $y1)) | |
(call $vec_new | |
(f32.sub (get_local $x) (get_local $x1)) | |
(f32.sub (get_local $y) (get_local $y1))))) | |
(set_local $weight_x (call $ease (f32.sub (get_local $x) (get_local $x0)))) | |
(set_local $a | |
(f32.add | |
(get_local $s) | |
(f32.mul | |
(get_local $weight_x) | |
(f32.sub | |
(get_local $t) | |
(get_local $s))))) | |
(set_local $b | |
(f32.add | |
(get_local $u) | |
(f32.mul | |
(get_local $weight_x) | |
(f32.sub | |
(get_local $v) | |
(get_local $u))))) | |
(set_local $weight_y (call $ease (f32.sub (get_local $y) (get_local $y0)))) | |
(f32.add | |
(get_local $a) | |
(f32.mul | |
(get_local $weight_y) | |
(f32.sub | |
(get_local $b) | |
(get_local $a)))) | |
) | |
(func $fbm (param $x f32) (param $y f32) (result f32) | |
(local $val f32) | |
(local $amplitude f32) | |
(local $k f32) | |
(set_local $amplitude (f32.const 1)) | |
(set_local $k (f32.const 2)) | |
;; Iteration 1 | |
(set_local $val | |
(f32.add | |
(get_local $val) | |
(f32.mul | |
(get_local $amplitude) | |
(call $noise | |
(f32.div (get_local $x) (f32.div (f32.const 512) (get_local $k))) | |
(f32.div (get_local $y) (f32.div (f32.const 512) (get_local $k))))))) | |
(set_local $amplitude (f32.div (get_local $amplitude) (f32.const 2))) | |
(set_local $k (f32.mul (get_local $amplitude) (f32.const 2))) | |
;; Iteration 2 | |
(set_local $val | |
(f32.add | |
(get_local $val) | |
(f32.mul | |
(get_local $amplitude) | |
(call $noise | |
(f32.div (get_local $x) (f32.div (f32.const 512) (get_local $k))) | |
(f32.div (get_local $y) (f32.div (f32.const 512) (get_local $k))))))) | |
(set_local $k (f32.mul (get_local $amplitude) (f32.const 2))) | |
;; Iteration 3 | |
(set_local $val | |
(f32.add | |
(get_local $val) | |
(f32.mul | |
(get_local $amplitude) | |
(call $noise | |
(f32.div (get_local $x) (f32.div (f32.const 512) (get_local $k))) | |
(f32.div (get_local $y) (f32.div (f32.const 512) (get_local $k))))))) | |
(set_local $k (f32.mul (get_local $amplitude) (f32.const 2))) | |
;; Iteration 4 | |
(set_local $val | |
(f32.add | |
(get_local $val) | |
(f32.mul | |
(get_local $amplitude) | |
(call $noise | |
(f32.div (get_local $x) (f32.div (f32.const 512) (get_local $k))) | |
(f32.div (get_local $y) (f32.div (f32.const 512) (get_local $k))))))) | |
(set_local $amplitude (f32.div (get_local $amplitude) (f32.const 2))) | |
(set_local $k (f32.mul (get_local $amplitude) (f32.const 2))) | |
;; Iteration 5 | |
(set_local $val | |
(f32.add | |
(get_local $val) | |
(f32.mul | |
(get_local $amplitude) | |
(call $noise | |
(f32.div (get_local $x) (f32.div (f32.const 512) (get_local $k))) | |
(f32.div (get_local $y) (f32.div (f32.const 512) (get_local $k))))))) | |
(set_local $amplitude (f32.div (get_local $amplitude) (f32.const 2))) | |
(set_local $k (f32.mul (get_local $amplitude) (f32.const 2))) | |
;; Iteration 6 | |
(set_local $val | |
(f32.add | |
(get_local $val) | |
(f32.mul | |
(get_local $amplitude) | |
(call $noise | |
(f32.div (get_local $x) (f32.div (f32.const 512) (get_local $k))) | |
(f32.div (get_local $y) (f32.div (f32.const 512) (get_local $k))))))) | |
(set_local $amplitude (f32.div (get_local $amplitude) (f32.const 2))) | |
(set_local $k (f32.mul (get_local $amplitude) (f32.const 2))) | |
;; Iteration 7 | |
(set_local $val | |
(f32.add | |
(get_local $val) | |
(f32.mul | |
(get_local $amplitude) | |
(call $noise | |
(f32.div (get_local $x) (f32.div (f32.const 512) (get_local $k))) | |
(f32.div (get_local $y) (f32.div (f32.const 512) (get_local $k))))))) | |
(set_local $amplitude (f32.div (get_local $amplitude) (f32.const 2))) | |
(set_local $k (f32.mul (get_local $amplitude) (f32.const 2))) | |
;; Iteration 8 | |
(set_local $val | |
(f32.add | |
(get_local $val) | |
(f32.mul | |
(get_local $amplitude) | |
(call $noise | |
(f32.div (get_local $x) (f32.div (f32.const 512) (get_local $k))) | |
(f32.div (get_local $y) (f32.div (f32.const 512) (get_local $k))))))) | |
(set_local $amplitude (f32.div (get_local $amplitude) (f32.const 2))) | |
(set_local $k (f32.mul (get_local $amplitude) (f32.const 2))) | |
(get_local $val) | |
) | |
;; Implements http://www.iquilezles.org/www/articles/warp/warp.htm | |
(func $warp (param $x f32) (param $y f32) (param $warp_factor f32) (result f32) | |
;; p = Vec2(5.2, 1.3) | |
(call $fbm | |
(f32.add | |
(f32.const 5.2) | |
(f32.mul | |
(call $fbm (get_local $x) (get_local $y)) | |
(get_local $warp_factor))) | |
(f32.add | |
(f32.const 1.3) | |
(f32.mul | |
(call $fbm | |
(f32.add (f32.const 5.2) (get_local $x)) | |
(f32.add (f32.const 1.3) (get_local $y))) | |
(get_local $warp_factor)))) | |
) | |
(func $init) | |
(start $init) | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment