;;; Catbird Game Engine ;;; Copyright © 2023 David Thompson ;;; ;;; Catbird is free software: you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation, either version 3 of the License, or ;;; (at your option) any later version. ;;; ;;; Catbird is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;;; General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with Catbird. If not, see . ;;; Commentary: ;; ;; Generic math methods. ;; ;;; Code: (define-module (catbird math) #:use-module (chickadee math matrix) #:use-module (chickadee math vector) #:use-module (oop goops) #:export ( vec)) (define (class-of (vec2 0.0 0.0))) (define (class-of (vec3 0.0 0.0 0.0))) (define (class-of (make-identity-matrix3))) (define (class-of (make-identity-matrix4))) (define-method (vec (x ) (y )) (vec2 x y)) (define-method (vec (x ) (y ) (z )) (vec3 x y z)) (define-method (vec (v ) (z )) (vec3 (vec2-x v) (vec2-y v) z)) (define-method (vec (x ) (v )) (vec3 x (vec2-x v) (vec2-y v))) (define-method (+ (a ) (b )) (vec2+ a b)) (define-method (+ (a ) (b )) (vec2+ a b)) (define-method (+ (a ) (b )) (vec2+ b a)) (define-method (+ (a ) (b )) (vec3+ a b)) (define-method (+ (a ) (b )) (vec3+ a b)) (define-method (+ (a ) (b )) (vec3+ b a)) (define-method (- (a ) (b )) (vec2- a b)) (define-method (- (a ) (b )) (vec2- a b)) (define-method (- (a ) (b )) (vec3- a b)) (define-method (- (a ) (b )) (vec3- a b)) (define-method (* (a ) (b )) (vec2* a b)) (define-method (* (a ) (b )) (vec2* a b)) (define-method (* (a ) (b )) (vec2* b a)) (define-method (* (a ) (b )) (vec3* a b)) (define-method (* (a ) (b )) (vec3* a b)) (define-method (* (a ) (b )) (vec3* b a)) (define-method (* (a ) (b )) (matrix3* a b)) (define-method (* (a ) (b )) (matrix4* a b)) (define-method (/ (a ) (b )) (vec2* a (vec2 (/ 1.0 (vec2-x b)) (/ 1.0 (vec2-y b))))) (define-method (/ (a ) (b )) (vec2* a (/ 1.0 b))) (define-method (/ (a ) (b )) (vec2* (vec2 (/ 1.0 (vec2-x b)) (/ 1.0 (vec2-y b))) b)) (define-method (/ (a ) (b )) (vec3* a (vec3 (/ 1.0 (vec3-x b)) (/ 1.0 (vec3-y b)) (/ 1.0 (vec3-z b))))) (define-method (/ (a ) (b )) (vec3* a (/ 1.0 b))) (define-method (/ (a ) (b )) (vec3* (vec3 (/ 1.0 (vec3-x b)) (/ 1.0 (vec3-y b)) (/ 1.0 (vec3-z b))) b))