]> git.jsancho.org Git - guile-irrlicht.git/commitdiff
Custom Scene Node example
authorJavier Sancho <jsf@jsancho.org>
Sun, 1 Mar 2020 18:29:06 +0000 (19:29 +0100)
committerJavier Sancho <jsf@jsancho.org>
Sun, 1 Mar 2020 18:29:06 +0000 (19:29 +0100)
examples/03.CustomSceneNode.scm [new file with mode: 0644]
irrlicht/bindings/scene.scm
irrlicht/bindings/video.scm
irrlicht/video.scm

diff --git a/examples/03.CustomSceneNode.scm b/examples/03.CustomSceneNode.scm
new file mode 100644 (file)
index 0000000..46e35fd
--- /dev/null
@@ -0,0 +1,128 @@
+;;; guile-irrlicht --- FFI bindings for Irrlicht Engine
+;;; Copyright (C) 2019 Javier Sancho <jsf@jsancho.org>
+;;;
+;;; This file is part of guile-irrlicht.
+;;;
+;;; Guile-irrlicht is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU Lesser General Public License as
+;;; published by the Free Software Foundation; either version 3 of the
+;;; License, or (at your option) any later version.
+;;;
+;;; Guile-irrlicht 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 Lesser General Public
+;;; License along with guile-irrlicht.  If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+
+;;; Irrlicht 03.CustomSceneNode example
+;;; http://irrlicht.sourceforge.net/docu/example003.html
+
+
+(use-modules (irrlicht)
+             (ice-9 match))
+
+;; ask user for driver
+(format #t
+        "Please select the driver you want for this example:
+ (a) OpenGL 1.5
+ (b) Direct3D 9.0c
+ (c) Direct3D 8.1
+ (d) Burning's Software Renderer
+ (e) Software Renderer
+ (f) NullDevice
+ (otherKey) exit~%~%")
+
+(define device-type (match (read-char)
+                           (#\a 'opengl)
+                           (#\b 'direct3d9)
+                           (#\c 'direct3d8)
+                           (#\d 'burnings)
+                           (#\e 'software)
+                           (#\f 'null)
+                           (_ #f)))
+
+(when (not device-type)
+  (exit #f))
+
+;; start up the engine
+(define device
+  (create-device
+   #:device-type device-type
+   #:window-size '(640 480)))
+(when (not device)
+  (exit #f))
+
+;; create engine and camera
+(set-window-caption! device "Custom Scene Node - Irrlicht Engine Demo")
+
+(define my-node #f)
+(define driver (get-video-driver device))
+(define scene-manager (get-scene-manager device))
+(add-camera-scene-node! scene-manager
+                        #:position '(0 -40 0)
+                        #:lookat '(0 0 0))
+
+;; create our custom scene node
+(define box (make-aabbox3df))
+(define vertices
+  (list (make-s3dvertex '(0 0 10) '(1 1 0) '(255 0 255 255) '(0 1))
+        (make-s3dvertex '(10 0 -10) '(1 0 0) '(255 255 0 255) '(1 1))
+        (make-s3dvertex '(0 20 0) '(0 1 1) '(255 255 255 0) '(1 0))
+        (make-s3dvertex '(-10 0 -10) '(0 0 1) '(255 0 255 0) '(0 0))))
+(define material (make-material #:wireframe #f #:lighting #f))
+
+(aabbox3d-reset! box (vertex-position (car vertices)))
+(for-each (lambda (vertex)
+            (aabbox3d-add-internal-point! box (vertex-position vertex)))
+          (cdr vertices))
+
+(define (custom-render)
+  (let ((indices '((0 2 3) (2 1 3) (1 0 3) (2 0 1))))
+    ;;(set-material! driver material)
+    ;;(set-transform! driver 'world (get-absolute-transformation my-node))
+    ;;(draw-vertex-primitive-list driver vertices indices)))
+    #f))
+
+(define (custom-get-bounding-box)
+  box)
+
+(define (custom-get-material-count)
+  1)
+
+(define (custom-get-material i)
+  material)
+
+(set! my-node (add-custom-scene-node! scene-manager
+                                      custom-render
+                                      custom-get-bounding-box
+                                      custom-get-material-count
+                                      custom-get-material
+                                      #:parent (get-root-scene-node scene-manager)))
+
+;; add rotation
+(let ((anim (create-rotation-animator scene-manager '(0.8 0 0.8))))
+  (add-animator! my-node anim))
+
+;; loop
+(define frames 0)
+(while (device-run? device)
+  (begin-scene driver #:color '(0 100 100 100))
+  (scene-draw-all scene-manager)
+  (end-scene driver)
+
+  (set! frames (+ frames 1))
+  (when (= frames 100)
+    (let ((fps (get-fps driver))
+          (driver-name (get-video-driver-name driver)))
+      (let ((caption
+             (format #f "Irrlicht Engine [~a] FPS:~a" driver-name fps)))
+        (set-window-caption! device caption)))
+    (set! frames 0)))
+
+;; delete device
+(device-drop! device)
+(exit #t)
index cbb75a4d516f9b83cea4e0a668e70593ca0d8349..ad2646b27a1b4dae9765c9cfa5eec7e89bf4b4fc 100644 (file)
 (define-public EMAT_BOOM                 20)
 (define-public EMAT_COUNT                21)
 
+;; irr_scene_E_PRIMITIVE_TYPE enum
+(define-public EPT_POINTS          0)
+(define-public EPT_LINE_STRIP      1)
+(define-public EPT_LINE_LOOP       2)
+(define-public EPT_LINES           3)
+(define-public EPT_TRIANGLE_STRIP  4)
+(define-public EPT_TRIANGLE_FAN    5)
+(define-public EPT_TRIANGLES       6)
+(define-public EPT_QUAD_STRIP      7)
+(define-public EPT_QUADS           8)
+(define-public EPT_POLYGON         9)
+(define-public EPT_POINT_SPRITES  10)
+
 ;; Scene functions
 (define-foreign add-animated-mesh-scene-node
   '* "irr_scene_addAnimatedMeshSceneNode" (list '* '* '* int '* '* '* int))
index d9f92fae0efa58bb93e99deea07978f8bd0d70d5..de371331be07d305b29332612daeaacd40981265 100644 (file)
 (define-public ETS_TEXTURE_7  10)
 (define-public ETS_COUNT      11)
 
+;; irr_video_E_VERTEX_TYPE enum
+(define-public EVT_STANDARD 0)
+(define-public EVT_2TCOORDS 1)
+(define-public EVT_TANGENTS 2)
+
+;; irr_video_E_INDEX_TYPE enum
+(define-public EIT_16BIT 0)
+(define-public EIT_32BIT 1)
 
 ;; scolor struct
 (define-public scolor
 (define-foreign begin-scene
   int "irr_video_beginScene" (list '* int int '* '* '*))
 
+(define-foreign draw-vertex-primitive-list
+  void "irr_video_drawVertexPrimitiveList" (list '* '* int '* int int int int))
+
 (define-foreign end-scene
   int "irr_video_endScene" (list '*))
 
         (bit-field-group
          (uint8 4)  ; colorMask:4
          (uint8 3)  ; colorMaterial:3
-         (uint32 4) ; blendOperation:4
+         (uint16 4) ; blendOperation:4
          (uint8 3)  ; polygonOffsetFactor:3
-         (uint32 1) ; polygonOffsetDirection:1
+         (uint16 1) ; polygonOffsetDirection:1
          (uint8 1)  ; wireframe:1
          (uint8 1)  ; pointCloud:1
          (uint8 1)  ; gouraudShading:1
          (uint8 1)  ; normalizeNormals:1
          (uint8 1)  ; useMipMaps:1
         )))
+
+(define-foreign make-c-material
+  '* "makeMaterial" (list))
index dc61f644279cb1e90e18e4c45fc2a42065d697b2..0c334fe2d84344b7c101136ce55a7a3908448c5c 100644 (file)
   #: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)
   #:use-module (irrlicht util foreign)
   #:export (begin-scene
+            draw-vertex-primitive-list
             end-scene
             get-fps
             get-texture
                              %null-pointer
                              (ffi-core:rect->pointer source-rect))))
 
+(define* (draw-vertex-primitive-list driver vertices index-list
+                                     #:key
+                                     (v-type 'standard)
+                                     (p-type 'triangles))
+  (define (make-c-vertices vertices)
+    (let ((vals (map (lambda (vertex)
+                       (parse-c-struct (ffi-video:s3dvertex->pointer vertex)
+                                       ffi-video:s3dvertex))
+                     vertices))
+          (types (make-list (length vertices) ffi-video:s3dvertex)))
+      (make-c-struct types vals)))
+
+  (define (make-c-indices indices)
+    (let* ((vals (apply append indices))
+           (types (make-list (length vals) int32)))
+      (make-c-struct types vals)))
+
+  (let ((vertices-pointer (make-c-vertices vertices))
+        (vertex-count (length vertices))
+        (indices-pointer (make-c-indices index-list))
+        (prim-count (length index-list))
+        (vertex-type
+         (match v-type
+                ('standard ffi-video:EVT_STANDARD)
+                ('2tcoords ffi-video:EVT_2TCOORDS)
+                ('tangents ffi-video:EVT_TANGENTS)))
+        (primitive-type
+         (match p-type
+                ('points ffi-scene:EPT_POINTS)
+                ('strip ffi-scene:EPT_LINE_STRIP)
+                ('line-loop ffi-scene:EPT_LINE_LOOP)
+                ('lines ffi-scene:EPT_LINES)
+                ('triangle-strip ffi-scene:EPT_TRIANGLE_STRIP)
+                ('triangle-fan ffi-scene:EPT_TRIANGLE_FAN)
+                ('triangles ffi-scene:EPT_TRIANGLES)
+                ('quad-strip ffi-scene:EPT_QUAD_STRIP)
+                ('quads ffi-scene:EPT_QUADS)
+                ('polygon ffi-scene:EPT_POLYGON)
+                ('point-sprites ffi-scene:EPT_POINT_SPRITES))))
+
+
+    (ffi-video:draw-vertex-primitive-list
+     driver
+     vertices-pointer
+     vertex-count
+     indices-pointer
+     prim-count
+     vertex-type
+     primitive-type
+     ffi-video:EIT_32BIT)))
+
 (define (end-scene driver)
   (ffi-video:end-scene driver))
 
            (bool->integer #t)         ; useMipMaps
            ))))
     (ffi-video:pointer->smaterial
-     (make-c-struct+ ffi-video:smaterial material))))
+     ;;  (make-c-struct+ ffi-video:smaterial material))))
+     (make-c-material))))
+    
+(define-public (make-c-material)
+  (ffi-video:make-c-material))