#lang scribble/doc @(require "common.ss" scribble/bnf (for-syntax scheme/base)) @title[#:tag "gl-vectors"]{OpenGL Vectors} @defmodule[sgl/gl-vectors] The @schememodname[sgl/gl-vectors] module supports OpenGL programming with @scheme[cvector]s. In this document and in the error messages, a ``gl-vector'' is just a @scheme[cvector], while a ``gl-@nonterm{type}-vector'' is a @scheme[cvector] with an appropriate type. Using the @schememodname[sgl/gl-vectors] module instead of using @scheme[cvector] directly because these functions are specialized to handling the OpenGL types correctly. @deftogether[( @defproc[(gl-vector? [v any/c]) boolean?] @defproc[(gl-vector->vector [vec cvector?]) vector?] @defproc[(gl-vector->list [vec cvector?]) list?] @defproc[(gl-vector-length [vec cvector?]) exact-nonnegative-integer?] @defproc[(gl-vector-ref [vec cvector?][pos exact-nonnegative-integer?]) any/v] @defproc[(gl-vector-set! [vec cvector?][pos exact-nonnegative-integer?][v any/v]) void?] )]{ Synonyms for @scheme[cvector?], @scheme[cvector->vector], @scheme[cvector-length], etc.} @(define-syntax (define-gl-vector stx) (syntax-case stx () [(_ type) (let ([mk (lambda s (string->symbol (apply string-append s)))] [type (symbol->string (syntax-e #'type))] [locs (lambda (l) (datum->syntax #'here (list (datum->syntax #'here (car l) #("?" 1 1 2 1)) (datum->syntax #'here (cadr l) #("?" 1 3 4 1))) #("?" 1 0 1 3)))]) (with-syntax ([ (mk type)] [? (mk type "?")] [gl--vector? (mk "gl-" type "-vector?")] [gl--vector (mk "gl-" type "-vector")] [make-gl--vector (mk "make-gl-" type "-vector")] [vector->gl--vector (mk "vector->gl-" type "-vector")] [list->gl--vector (mk "list->gl-" type "-vector")] [gl--vector+ (mk "gl-" type "-vector+")] [gl--vector- (mk "gl-" type "-vector-")] [gl--vector* (mk "gl-" type "-vector*")] [vectorof-? (locs `(vectorof ,(mk type "?")))] [listof-? (locs `(listof ,(mk type "?")))]) #'(... @deftogether[( @defproc[(gl--vector? [v any/c]) boolean?] @defproc[(make-gl--vector [pos exact-nonnegative-integer?]) gl--vector?] @defproc[(gl--vector [v ?] ...) gl--vector?] @defproc[(vector->gl--vector [v vectorof-?] ...) gl--vector?] @defproc[(list->gl--vector [v listof-?] ...) gl--vector?] @defproc[(gl--vector+ [vec gl--vector?] ...+) gl--vector?] @defproc[(gl--vector- [vec gl--vector?] ...+) gl--vector?] @defproc[(gl--vector* [x real?][vec gl--vector?]) gl--vector?] )]{ Operations on vectors of @scheme[] elements. The @scheme[gl--vector+] and @scheme[gl--vector-] functions compute the element-by-element sum and difference of the given vectors, respectively. The @scheme[gl--vector*] function multiplies each element of @scheme[vec] by @scheme[x].})))])) @(define-gl-vector byte) @(define-gl-vector ubyte) @(define-gl-vector short) @(define-gl-vector ushort) @(define-gl-vector int) @(define-gl-vector uint) @(define-gl-vector float) @(define-gl-vector double) @(define-gl-vector boolean) @defproc[(gl-vector-norm [vec gl-vector?]) real?]{ Returns the square root of the sum of the squares of the elements of @scheme[vec].}