#: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-animator!
+ add-camera-scene-node!
add-camera-scene-node-fps!
- add-octree-scene-node-am
+ add-custom-scene-node!
+ add-octree-scene-node
+ create-rotation-animator
+ get-absolute-transformation
get-mesh
+ get-root-scene-node
scene-draw-all
- set-material-flag-am!
- set-material-texture-am!
+ set-material-flag!
+ set-material-texture!
set-md2-animation!
set-position!))
mesh
parent
id
- (make-c-struct ffi-core:vector3df position)
- (make-c-struct ffi-core:vector3df rotation)
- (make-c-struct ffi-core:vector3df scale)
- (if also-add-if-mesh-pointer-zero 1 0))))
+ (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))
+(define (add-animator! node animator)
+ (ffi-scene:add-animator node animator))
+
+(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
- (make-c-struct ffi-core:vector3df position)
- (make-c-struct ffi-core:vector3df lookat)
+ (ffi-core:vector3df->pointer position)
+ (ffi-core:vector3df->pointer lookat)
id
- (if make-active 1 0))))
+ (bool->integer make-active))))
(if (null-pointer? camera) #f camera)))
(define* (add-camera-scene-node-fps! scene-manager
id
key-map-array
key-map-size
- (if no-vertical-movement 1 0)
+ (bool->integer no-vertical-movement)
jump-speed
- (if invert-mouse 1 0)
- (if make-active 1 0)))
-
-(define* (add-octree-scene-node-am scene-manager mesh
- #:key
- (parent %null-pointer)
- (id -1)
- (minimal-polys-per-node 512)
- (also-add-if-mesh-pointer-zero #f))
- (ffi-scene:add-octree-scene-node-am
+ (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-video:smaterial->pointer (get-material i)))))
+ (ffi-scene:add-custom-scene-node
+ scene-manager
+ parent
+ id
+ (ffi-core:vector3df->pointer position)
+ (ffi-core:vector3df->pointer rotation)
+ (ffi-core:vector3df->pointer scale)
+ (procedure->pointer void render '())
+ (procedure->pointer '* c-get-bounding-box '())
+ (procedure->pointer uint32 get-material-count '())
+ (procedure->pointer '* c-get-material (list uint32)))))
+
+(define* (add-octree-scene-node scene-manager mesh
+ #:key
+ (parent %null-pointer)
+ (id -1)
+ (minimal-polys-per-node 512)
+ (also-add-if-mesh-pointer-zero #f))
+ (ffi-scene:add-octree-scene-node
scene-manager
mesh
parent
id
minimal-polys-per-node
- (if also-add-if-mesh-pointer-zero 1 0)))
+ (bool->integer also-add-if-mesh-pointer-zero)))
+
+(define (create-rotation-animator scene-manager rotation-speed)
+ (let ((animator (ffi-scene:create-rotation-animator
+ scene-manager
+ (ffi-core:vector3df->pointer rotation-speed))))
+ (if (null-pointer? animator) #f animator)))
+
+(define (get-absolute-transformation node)
+ (ffi-scene:get-absolute-transformation node))
(define (get-mesh scene-manager filename)
(let ((mesh (ffi-scene:get-mesh scene-manager (string->pointer filename))))
(if (null-pointer? mesh) #f mesh)))
+(define (get-root-scene-node scene-manager)
+ (ffi-scene:get-root-scene-node scene-manager))
+
(define (scene-draw-all scene-manager)
(ffi-scene:draw-all scene-manager))
-(define (set-material-flag-am! node flag newvalue)
+(define (set-material-flag! node flag newvalue)
(let ((material-flag
(match flag
('wireframe ffi-video:EMF_WIREFRAME)
('use-mip-maps ffi-video:EMF_USE_MIP_MAPS)
('blend-operation ffi-video:EMF_BLEND_OPERATION)
('polygon-offset ffi-video:EMF_POLYGON_OFFSET))))
- (ffi-scene:set-material-flag-am
+ (ffi-scene:set-material-flag
node
material-flag
- (if newvalue 1 0))))
+ (bool->integer newvalue))))
-(define (set-material-texture-am! node texture-layer texture)
- (ffi-scene:set-material-texture-am node texture-layer texture))
+(define (set-material-texture! node texture-layer texture)
+ (ffi-scene:set-material-texture node texture-layer texture))
(define (set-md2-animation! node anim)
(let ((animation-type
(define (set-position! node newpos)
(ffi-scene:set-position
node
- (make-c-struct ffi-core:vector3df newpos)))
+ (ffi-core:vector3df->pointer newpos)))