summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chickadee/graphics/seagull.scm38
1 files changed, 37 insertions, 1 deletions
diff --git a/chickadee/graphics/seagull.scm b/chickadee/graphics/seagull.scm
index af15f97..e72a796 100644
--- a/chickadee/graphics/seagull.scm
+++ b/chickadee/graphics/seagull.scm
@@ -45,6 +45,7 @@
;; - Overloaded functions with multiple arities
;; - Helper function modules
;; - Shader composition
+;; - Interpreter
;;
;;; Code:
(define-module (chickadee graphics seagull)
@@ -125,7 +126,8 @@
(memq x '(int->float float->int)))
(define (math-function? x)
- (memq x '(abs sqrt pow min max mod floor ceil sin cos tan clamp mix length)))
+ (memq x '(abs sqrt pow min max mod floor ceil sin cos tan
+ clamp mix step smoothstep length)))
(define (vertex-primitive-call? x)
#f)
@@ -2209,6 +2211,22 @@
(predicate:substitute c tc))
...))))))
+(define-syntax-rule (a+b+c->d (ta tb tc td) ...)
+ (let ((a (fresh-variable-type))
+ (b (fresh-variable-type))
+ (c (fresh-variable-type))
+ (d (fresh-variable-type)))
+ (list (type-scheme
+ (list a b c d)
+ (qualified-type
+ (function-type (list a b c) (list d))
+ (predicate:or
+ (predicate:and (predicate:= a ta)
+ (predicate:= b tb)
+ (predicate:= c tc)
+ (predicate:substitute d td))
+ ...))))))
+
(define (top-level-type-env stage)
(define type:+/-
(let ((a (fresh-variable-type)))
@@ -2372,6 +2390,22 @@
(predicate:= a type:int)
(predicate:= a type:float)
(predicate:= a type:vec4)))))))
+ (define type:step
+ (a+b->c (type:float type:float type:float)
+ (type:vec2 type:vec2 type:vec2)
+ (type:vec3 type:vec3 type:vec3)
+ (type:vec4 type:vec4 type:vec4)
+ (type:float type:vec2 type:vec2)
+ (type:float type:vec3 type:vec3)
+ (type:float type:vec4 type:vec4)))
+ (define type:smoothstep
+ (a+b+c->d (type:float type:float type:float type:float)
+ (type:vec2 type:vec2 type:vec2 type:vec2)
+ (type:vec3 type:vec3 type:vec3 type:vec3)
+ (type:vec4 type:vec4 type:vec4 type:vec4)
+ (type:float type:float type:vec2 type:vec2)
+ (type:float type:float type:vec3 type:vec3)
+ (type:float type:float type:vec4 type:vec4)))
(define type:texture
(list (function-type (list type:sampler-2d type:vec2)
(list type:vec4))))
@@ -2399,6 +2433,8 @@
(pow . ,type:pow)
(min . ,type:min/max)
(max . ,type:min/max)
+ (step . ,type:step)
+ (smoothstep . ,type:smoothstep)
(sin . ,type:trig)
(cos . ,type:trig)
(tan . ,type:trig)