diff options
| author | s-ol <s-ol@users.noreply.github.com> | 2020-03-02 14:40:00 +0000 |
|---|---|---|
| committer | s-ol <s-ol@users.noreply.github.com> | 2020-03-02 16:48:09 +0000 |
| commit | 4ebb6f4408600f3c0f2a745b7ed0ba951bf521b3 (patch) | |
| tree | cdf0953fdee07a6c83c510470a7b8ab8d832d25d /lib/random.moon | |
| parent | update lib.math and lib.logic to new op interface (diff) | |
| download | alive-4ebb6f4408600f3c0f2a745b7ed0ba951bf521b3.tar.gz alive-4ebb6f4408600f3c0f2a745b7ed0ba951bf521b3.zip | |
lift remaining libs to new op interface
Diffstat (limited to 'lib/random.moon')
| -rw-r--r-- | lib/random.moon | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/lib/random.moon b/lib/random.moon new file mode 100644 index 0000000..9e5e62b --- /dev/null +++ b/lib/random.moon @@ -0,0 +1,77 @@ +import Op, Value, ValueInput, EventInput, match from require 'core' + +apply_range = (range, val) -> + if range\type! == 'str' + switch range\unwrap! + when 'uni' then val + when 'bip' then val * 2 - 1 + when 'rad' then val * 2 * math.pi + when 'deg' then val * 360 + else + error "unknown range #{@range}" + elseif range.type == 'num' + val * range\unwrap! + else + error "range has to be a string or number" + +range_doc = " +range can be one of: +- 'uni' [ 0 - 1[ (default) +- 'bip' [-1 - 1[ +- 'rad' [ 0 - tau[ +- 'deg' [ 0 - 360[ +- (num) [ 0 - num[" + +class num extends Op + @doc: "(random/num [trigger] [range]) - create a random number + +generates a random value in range on create and trigger. +#{range_doc}" + new: => + super 'num' + @gen! + + gen: => @val = math.random! + + setup: (inputs) => + { trig, range } = match 'bang? any?', inputs + super + trig: trig and EventInput trig + range: ValueInput range or Value.str 'uni' + + tick: => + @gen! if @inputs.trig and @inputs.trig\dirty! + @out\set apply_range @inputs.range, @val + +vec_ = (n) -> + class vec extends Op + @doc: "(random/vec#{n} [trigger] [range]) - create a random number + +generates a random vec#{n} on create and trigger. +each component is in range. +#{range_doc}" + new: => + super "vec#{n}" + @gen! + + gen: => @val = for i=1,n do math.random! + + setup: (inputs) => + { trig, range } = match 'bang? any?', inputs + super + trig: trig and EventInput trig + range: ValueInput range or Value.str 'uni' + + tick: => + @gen! if @inputs.trig and @inputs.trig\dirty! + @out\set [apply_range @inputs.range, v for v in *@val] + + vec.__name = "vec#{n}" + vec + +{ + :num + vec2: vec_ 2 + vec3: vec_ 3 + vec4: vec_ 4 +} |
