From: Javier Sancho Date: Sun, 17 May 2020 11:49:58 +0000 (+0200) Subject: Check null objects X-Git-Url: https://git.jsancho.org/?p=guile-irrlicht.git;a=commitdiff_plain;h=384a8fb56d8500dc3551085191a39c9da70e221c Check null objects --- diff --git a/examples/01-hello-world.scm b/examples/01-hello-world.scm index 4029b7e..c320ed3 100644 --- a/examples/01-hello-world.scm +++ b/examples/01-hello-world.scm @@ -29,8 +29,6 @@ (create-device #:device-type 'software #:window-size '(640 480))) -(when (not device) - (exit #f)) (set-window-caption! device "Hello World! - Irrlicht Engine Demo") @@ -47,15 +45,10 @@ ;; load a Quake2 model (define mesh (get-mesh scene-manager "media/sydney.md2")) -(when (is-empty? mesh) - (drop! device) - (exit #f)) - (define node (add-animated-mesh-scene-node! scene-manager mesh)) -(when node - (set-material-flag! node 'lighting #f) - (set-md2-animation! node 'stand) - (set-material-texture! node 0 (get-texture driver "media/sydney.bmp"))) +(set-material-flag! node 'lighting #f) +(set-md2-animation! node 'stand) +(set-material-texture! node 0 (get-texture driver "media/sydney.bmp")) ;; place camera (add-camera-scene-node! scene-manager #:position '(0 30 -40) #:lookat '(0 5 0)) diff --git a/irrlicht.scm b/irrlicht.scm index 0e468c2..c9bbd68 100644 --- a/irrlicht.scm +++ b/irrlicht.scm @@ -56,7 +56,6 @@ get-scene-manager get-texture get-video-driver - is-empty? is-window-active? make-box3d make-material diff --git a/irrlicht/base.scm b/irrlicht/base.scm index db1de76..76a7a6b 100644 --- a/irrlicht/base.scm +++ b/irrlicht/base.scm @@ -23,8 +23,7 @@ #:use-module (system foreign) #:export ( irr-class - irr-pointer - is-empty?)) + irr-pointer)) (define-class () (irr-class #:init-value "") @@ -34,6 +33,3 @@ ;; in multiple inherited classes (define-method (irr-class (obj )) (slot-ref obj 'irr-class)) - -(define-method (is-empty? (obj )) - (equal? (irr-pointer obj) %null-pointer)) diff --git a/irrlicht/device.scm b/irrlicht/device.scm index b18a58e..04988d3 100644 --- a/irrlicht/device.scm +++ b/irrlicht/device.scm @@ -46,16 +46,13 @@ "In procedure create-device: Wrong type argument (expecting ):" receiver)) - (make - #:irr-pointer - ((get-irrlicht-proc "createDevice") - device-type - window-size - bits - fullscreen - stencilbuffer - vsync - receiver))) + (let* ((createDevice (get-irrlicht-proc "createDevice")) + (device-pointer (createDevice device-type window-size bits fullscreen stencilbuffer + vsync receiver))) + (cond ((null-pointer? device-pointer) + (error "In procedure create-device: Device cannot be created")) + (else + (make #:irr-pointer device-pointer))))) (define-method (get-cursor-control (device )) (let ((getCursorControl (get-irrlicht-proc "getCursorControl" device))) diff --git a/irrlicht/foreign.scm b/irrlicht/foreign.scm index f6e2036..94aab7c 100644 --- a/irrlicht/foreign.scm +++ b/irrlicht/foreign.scm @@ -19,8 +19,10 @@ (define-module (irrlicht foreign) + #:use-module (system foreign) #:use-module (irrlicht base) - #:export (get-irrlicht-proc)) + #:export (get-irrlicht-proc + null-pointer?)) ;; We use a hash table to store foreign irrlicht methods related with their ;; classes @@ -40,3 +42,6 @@ new-proc)) (else proc)))) + +(define (null-pointer? pointer) + (eq? pointer %null-pointer)) diff --git a/irrlicht/scene.scm b/irrlicht/scene.scm index 425d01e..9626f4b 100644 --- a/irrlicht/scene.scm +++ b/irrlicht/scene.scm @@ -63,17 +63,15 @@ (rotation '(0 0 0)) (scale '(1 1 1)) (also-add-if-mesh-pointer-zero #f)) - (make - #:irr-pointer - ((get-irrlicht-proc "addAnimatedMeshSceneNode" scene-manager parent) - scene-manager - mesh - parent - id - position - rotation - scale - also-add-if-mesh-pointer-zero)))) + (let* ((addAnimatedMeshSceneNode (get-irrlicht-proc "addAnimatedMeshSceneNode" + scene-manager + parent)) + (node-pointer (addAnimatedMeshSceneNode scene-manager mesh parent id position + rotation scale also-add-if-mesh-pointer-zero))) + (cond ((null-pointer? node-pointer) + (error "In procedure add-animated-mesh-scene-node!: Scene node cannot be created")) + (else + (make #:irr-pointer node-pointer)))))) (define-method (add-camera-scene-node! (scene-manager ) . rest) (let-keywords rest #f @@ -169,11 +167,12 @@ scene-manager)) (define-method (get-mesh (scene-manager ) filename) - (make - #:irr-pointer - ((get-irrlicht-proc "getMesh" scene-manager) - scene-manager - filename))) + (let* ((getMesh (get-irrlicht-proc "getMesh" scene-manager)) + (mesh-pointer (getMesh scene-manager filename))) + (cond ((null-pointer? mesh-pointer) + (error "In procedure get-mesh: Mesh cannot be created")) + (else + (make #:irr-pointer mesh-pointer))))) (define-method (get-root-scene-node (scene-manager )) (let ((getRootSceneNode (get-irrlicht-proc "getRootSceneNode" scene-manager)))