- #:use-module (ice-9 match)
- #:use-module (system foreign)
- #:use-module ((irrlicht bindings core) #:prefix ffi-core:)
- #:use-module ((irrlicht bindings scene) #:prefix ffi-scene:)
- #:use-module ((irrlicht bindings video) #:prefix ffi-video:)
- #:use-module (irrlicht util)
- #:export (add-animated-mesh-scene-node
- add-camera-scene-node!
- add-camera-scene-node-fps!
- add-custom-scene-node!
- add-octree-scene-node
- get-mesh
- get-root-scene-node
- scene-draw-all
- set-material-flag!
- set-material-texture!
- set-md2-animation!
- set-position!))
-
-(define* (add-animated-mesh-scene-node scene-manager mesh
- #:key
- (parent %null-pointer)
- (id -1)
- (position '(0 0 0))
- (rotation '(0 0 0))
- (scale '(1 1 1))
- (also-add-if-mesh-pointer-zero #f))
- (let ((node (ffi-scene:add-animated-mesh-scene-node
- scene-manager
- mesh
- parent
- id
- (ffi-core:vector3df->pointer position)
- (ffi-core:vector3df->pointer rotation)
- (ffi-core:vector3df->pointer scale)
- (bool->integer also-add-if-mesh-pointer-zero))))
- (if (null-pointer? node) #f node)))
-
-(define* (add-camera-scene-node! scene-manager
- #:key
- (parent %null-pointer)
- (position '(0 0 0))
- (lookat '(0 0 100))
- (id -1)
- (make-active #t))
- (let ((camera (ffi-scene:add-camera-scene-node
- scene-manager
- parent
- (ffi-core:vector3df->pointer position)
- (ffi-core:vector3df->pointer lookat)
- id
- (bool->integer make-active))))
- (if (null-pointer? camera) #f camera)))
-
-(define* (add-camera-scene-node-fps! scene-manager
- #:key
- (parent %null-pointer)
- (rotate-speed 100.0)
- (move-speed 0.5)
- (id -1)
- (key-map-array %null-pointer)
- (key-map-size 0)
- (no-vertical-movement #f)
- (jump-speed 0.0)
- (invert-mouse #f)
- (make-active #t))
- (ffi-scene:add-camera-scene-node-fps
- scene-manager
- parent
- rotate-speed
- move-speed
- id
- key-map-array
- key-map-size
- (bool->integer no-vertical-movement)
- jump-speed
- (bool->integer invert-mouse)
- (bool->integer make-active)))
-
-(define* (add-custom-scene-node! scene-manager
- render
- get-bounding-box
- get-material-count
- get-material
- #:key
- (parent %null-pointer)
- (id -1)
- (position '(0 0 0))
- (rotation '(0 0 0))
- (scale '(1 1 1)))
- (let ((c-get-bounding-box
- (lambda ()
- (ffi-core:aabbox3df->pointer (get-bounding-box))))
- (c-get-material
- (lambda (i)
- (ffi-core:material->pointer (get-material i)))))
- (ffi-scene:add-custom-scene-node
+ #:use-module (oop goops)
+ #:use-module (ice-9 optargs)
+ #:use-module (irrlicht base)
+ #:use-module (irrlicht foreign)
+ #:use-module (irrlicht io)
+ #:use-module (irrlicht irr)
+ #:use-module (irrlicht video))
+
+
+;; IMesh
+(define-class <mesh> (<reference-counted>)
+ (irr-class #:init-value "IMesh"))
+
+(export <mesh>)
+
+
+;; IAnimatedMesh
+(define-class <animated-mesh> (<mesh>)
+ (irr-class #:init-value "IAnimatedMesh"))
+
+(export <animated-mesh>)
+
+
+;; ISceneNodeAnimator
+(define-class <scene-node-animator> (<attribute-exchanging-object> <event-receiver>)
+ (irr-class #:init-value "ISceneNodeAnimator"))
+
+(export <scene-node-animator>)
+
+
+;; ISceneManager
+(define-class <scene-manager> (<reference-counted>)
+ (irr-class #:init-value "ISceneManager"))
+
+(define-method (add-animated-mesh-scene-node! (scene-manager <scene-manager>)
+ (mesh <animated-mesh>)
+ . rest)
+ (let-keywords rest #f
+ ((parent (make <scene-node>))
+ (id -1)
+ (position '(0 0 0))
+ (rotation '(0 0 0))
+ (scale '(1 1 1))
+ (also-add-if-mesh-pointer-zero #f))
+ (make <animated-mesh-scene-node>
+ #:irr-pointer
+ ((get-irrlicht-proc "addAnimatedMeshSceneNode" scene-manager parent)
+ scene-manager
+ mesh
+ parent
+ id
+ position
+ rotation
+ scale
+ also-add-if-mesh-pointer-zero))))
+
+(define-method (add-camera-scene-node! (scene-manager <scene-manager>) . rest)
+ (let-keywords rest #f
+ ((parent (make <scene-node>))
+ (position '(0 0 0))
+ (lookat '(0 0 100))
+ (id -1)
+ (make-active #t))
+ (make <camera-scene-node>
+ #:irr-pointer
+ ((get-irrlicht-proc "addCameraSceneNode" scene-manager parent)
+ scene-manager
+ parent
+ position
+ lookat
+ id
+ make-active))))
+
+(define-method (add-camera-scene-node-fps! (scene-manager <scene-manager>) . rest)
+ (let-keywords rest #f
+ ((parent (make <scene-node>))
+ (rotate-speed 100)
+ (move-speed 0.5)
+ (id -1)
+ (key-map-array (make <key-map>))
+ (key-map-size 0)
+ (no-vertical-movement #f)
+ (jump-speed 0)
+ (invert-mouse #f)
+ (make-active #t))
+ (let ((addCameraSceneNodeFPS (get-irrlicht-proc "addCameraSceneNodeFPS"
+ scene-manager parent)))
+ (make <camera-scene-node>
+ #:irr-pointer
+ (addCameraSceneNodeFPS scene-manager #:parent parent #:rotate-speed rotate-speed
+ #:move-speed move-speed #:id id #:key-map-array key-map-array
+ #:key-map-size key-map-size
+ #:no-vertical-movement no-vertical-movement
+ #:jump-speed jump-speed #:invert-mouse invert-mouse
+ #:make-active make-active)))))
+
+(define-method (add-custom-scene-node! (scene-manager <scene-manager>) proc-render
+ proc-get-bounding-box proc-get-material-count
+ proc-get-material . rest)
+ (let-keywords rest #f
+ ((parent (make <scene-node>))
+ (id -1)
+ (position '(0 0 0))
+ (rotation '(0 0 0))
+ (scale '(1 1 1)))
+ (let ((addCustomSceneNode (get-irrlicht-proc "addCustomSceneNode" scene-manager parent)))
+ (make <scene-node>
+ #:irr-pointer
+ (addCustomSceneNode scene-manager proc-render proc-get-bounding-box proc-get-material-count
+ proc-get-material parent id position rotation scale)))))
+
+(define-method (add-octree-scene-node! (scene-manager <scene-manager>)
+ (mesh <animated-mesh>)
+ . rest)
+ (let-keywords rest #f
+ ((parent (make <scene-node>))
+ (id -1)
+ (minimal-polys-per-node 512)
+ (also-add-if-mesh-pointer-zero #f))
+ (let ((addOctreeSceneNode (get-irrlicht-proc "addOctreeSceneNode" scene-manager parent mesh)))
+ (make <mesh-scene-node>
+ #:irr-pointer
+ (addOctreeSceneNode scene-manager mesh parent id minimal-polys-per-node
+ also-add-if-mesh-pointer-zero)))))
+
+(define-method (add-octree-scene-node! (scene-manager <scene-manager>)
+ (mesh <mesh>)
+ . rest)
+ (let-keywords rest #f
+ ((parent (make <scene-node>))
+ (id -1)
+ (minimal-polys-per-node 256)
+ (also-add-if-mesh-pointer-zero #f))
+ (let ((addOctreeSceneNode (get-irrlicht-proc "addOctreeSceneNode" scene-manager parent mesh)))
+ (make <mesh-scene-node>
+ #:irr-pointer
+ (addOctreeSceneNode scene-manager mesh parent id minimal-polys-per-node
+ also-add-if-mesh-pointer-zero)))))
+
+(define-method (create-rotation-animator (scene-manager <scene-manager>) rotation-speed)
+ (let ((createRotationAnimator (get-irrlicht-proc "createRotationAnimator" scene-manager)))
+ (make <scene-node-animator>
+ #:irr-pointer
+ (createRotationAnimator scene-manager rotation-speed))))
+
+(define-method (draw-all (scene-manager <scene-manager>))
+ ((get-irrlicht-proc "drawAll" scene-manager)
+ scene-manager))
+
+(define-method (get-mesh (scene-manager <scene-manager>) filename)
+ (make <animated-mesh>
+ #:irr-pointer
+ ((get-irrlicht-proc "getMesh" scene-manager)