]> git.jsancho.org Git - guile-irrlicht.git/blobdiff - irrlicht/scene.scm
TOC with direct C++
[guile-irrlicht.git] / irrlicht / scene.scm
index 8c622efec9c19512e6479a7f1651357bc2a3d5b0..83eb9ba9a4b0a5a02623268628813a3c86e4b9fa 100644 (file)
   #: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)))