;;; guile-irrlicht --- FFI bindings for Irrlicht Engine
-;;; Copyright (C) 2019 Javier Sancho <jsf@jsancho.org>
+;;; Copyright (C) 2020 Javier Sancho <jsf@jsancho.org>
;;;
;;; This file is part of guile-irrlicht.
;;;
(define-module (irrlicht video)
- #:use-module (system foreign)
- #:use-module ((irrlicht bindings core) #:prefix ffi-core:)
- #:use-module ((irrlicht bindings video) #:prefix ffi-video:)
- #:use-module (irrlicht util)
- #:export (begin-scene
- end-scene
- get-fps
- get-texture
- get-video-driver-name))
-
-(define* (begin-scene driver
- #:key
- (back-buffer #t)
- (z-buffer #t)
- (color '(255 0 0 0))
- (video-data %null-pointer)
- (source-rect '()))
- (ffi-video:begin-scene driver
- (bool->integer back-buffer)
- (bool->integer z-buffer)
- (make-c-struct ffi-video:scolor (reverse color))
- video-data
- (if (null? source-rect)
- %null-pointer
- (make-c-struct ffi-core:rect source-rect))))
-
-(define (end-scene driver)
- (ffi-video:end-scene driver))
-
-(define (get-fps driver)
- (ffi-video:get-fps driver))
-
-(define (get-texture driver filename)
- (ffi-video:get-texture driver (string->pointer filename)))
-
-(define (get-video-driver-name driver)
- (pointer->string
- (ffi-video:get-video-driver-name driver)))
+ #:use-module (oop goops)
+ #:use-module (ice-9 optargs)
+ #:use-module (irrlicht base)
+ #:use-module (irrlicht foreign))
+
+
+;; ITexture
+(define-class <texture> (<irrlicht-base>)
+ (irr-class #:init-value "ITexture"))
+
+(export <texture>)
+
+
+;; IVideoDriver
+(define-class <video-driver> (<irrlicht-base>)
+ (irr-class #:init-value "IVideoDriver"))
+
+(define-method (begin-scene (video-driver <video-driver>) . rest)
+ (let-keywords rest #f
+ ((back-buffer #t)
+ (z-buffer #t)
+ (color '(255 0 0 0))
+ video-data
+ source-rect)
+ ((get-irrlicht-proc "beginScene" video-driver)
+ video-driver
+ back-buffer
+ z-buffer
+ color
+ video-data
+ source-rect)))
+
+(define-method (end-scene (video-driver <video-driver>))
+ ((get-irrlicht-proc "endScene" video-driver)
+ video-driver))
+
+(define-method (get-name (video-driver <video-driver>))
+ (let ((getName (get-irrlicht-proc "getName" video-driver)))
+ (getName video-driver)))
+
+(define-method (get-texture (video-driver <video-driver>) filename)
+ (make <texture>
+ #:irr-pointer
+ ((get-irrlicht-proc "getTexture" video-driver)
+ video-driver
+ filename)))
+
+(export <video-driver> begin-scene end-scene get-name get-texture)