(module gl-utils-core (type->bytes type->gl make-shader make-program check-error gen-buffer delete-buffer gen-framebuffer delete-framebuffer gen-program-pipeline delete-program-pipeline gen-query delete-query gen-renderbuffer delete-renderbuffer gen-sampler delete-sampler gen-texture delete-texture gen-transform-feedback delete-transform-feedback gen-vertex-array delete-vertex-array with-texture set-texture-properties with-framebuffer create-framebuffer ->pointer size) (import chicken scheme foreign) (use srfi-4 matchable (prefix opengl-glew gl:) miscmacros srfi-1 lolevel) #> #include #include #ifdef __APPLE__ #include #else #include #endif static void showInfoLog(GLuint object){ GLint logLength; char *log; glGetShaderiv(object, GL_INFO_LOG_LENGTH, &logLength); log = malloc(logLength); glGetShaderInfoLog(object, logLength, NULL, log); fprintf(stderr, "%s\n", log); free(log); } <# (define (type->bytes type) (ecase type ((char: int8: byte: uchar: uint8: unsigned-byte:) 1) ((short: int16: ushort: uint16: unsigned-short:) 2) ((int: int32: integer: integer32: uint: uint32: unsigned-int: unsigned-int32: unsigned-integer: unsigned-integer32: float: float32:) 4) ((double: float64:) 8))) (define (type->gl type) (ecase type ((char: int8: byte:) gl:+byte+) ((uchar: uint8: unsigned-byte:) gl:+unsigned-byte+) ((short: int16:) gl:+short+) ((ushort: uint16: unsigned-short:) gl:+unsigned-short+) ((int: int32: integer: integer32:) gl:+int+) ((uint: uint32: unsigned-int: unsigned-int32: unsigned-integer: unsigned-integer32:) gl:+unsigned-int+) ((float: float32:) gl:+float+) ((double: float64:) gl:+double+))) (define make-shader (foreign-lambda* unsigned-int ((unsigned-int type) (c-string source)) #<pointer (ir-macro-transformer (lambda (e r c) (let* ((type (strip-syntax (cadr e))) (name (string->symbol (string-append (symbol->string type) "->pointer")))) `(define ,name (foreign-lambda* c-pointer ((,type v)) "C_return(v);")))))) (XXX->pointer blob) (XXX->pointer u8vector) (XXX->pointer s8vector) (XXX->pointer u16vector) (XXX->pointer s16vector) (XXX->pointer u32vector) (XXX->pointer s32vector) (XXX->pointer f32vector) (XXX->pointer f64vector) (define (->pointer v) (cond ((blob? v) (blob->pointer v)) ((u8vector? v) (u8vector->pointer v)) ((s8vector? v) (s8vector->pointer v)) ((u16vector? v) (u16vector->pointer v)) ((s16vector? v) (s16vector->pointer v)) ((u32vector? v) (u32vector->pointer v)) ((s32vector? v) (s32vector->pointer v)) ((f32vector? v) (f32vector->pointer v)) ((f64vector? v) (f64vector->pointer v)) (else (error '->pointer "Not a blob or vector" v)))) (define (size v) (cond ((blob? v) (blob-size v)) ((u8vector? v) (u8vector-length v)) ((s8vector? v) (s8vector-length v)) ((u16vector? v) (* (u16vector-length v) 2)) ((s16vector? v) (* (s16vector-length v) 2)) ((u32vector? v) (* (u32vector-length v) 4)) ((s32vector? v) (* (s32vector-length v) 4)) ((f32vector? v) (* (f32vector-length v) 4)) ((f64vector? v) (* (f64vector-length v) 8)) (else (error 'size "Not a blob or vector" v)))) ) ; end gl-utils-core