]> git.jsancho.org Git - guile-irrlicht.git/blobdiff - src/reference-counted.cpp
reference counted refactor
[guile-irrlicht.git] / src / reference-counted.cpp
index 58878d38f019c17d32bea88d9d9522b1f0f85909..b13cbb02f799c656c7c65a652147209d90a4837e 100644 (file)
 #include <libguile.h>
 
 #include "device.h"
+#include "gsubr.h"
 #include "reference-counted.h"
+#include "scene-node-animator.h"
 
 extern "C" {
 
+  DEFINE_WRAPPED_TYPE (irr::IReferenceCounted*, "reference-counted",
+                       init_reference_counted_type, reference_counted_p,
+                       wrap_reference_counted, unwrap_reference_counted);
+
   void
   init_reference_counted (void)
   {
-    scm_c_define_gsubr ("drop!", 1, 0, 0, (scm_t_subr)irr_drop);
+    init_reference_counted_type ();
+    DEFINE_GSUBR ("drop!", 1, 0, 0, irr_drop);
+  }
+
+  bool
+  is_reference_counted_object (SCM wrapped_obj)
+  {
+    return
+      device_p (wrapped_obj) ||
+      reference_counted_p (wrapped_obj) ||
+      scene_node_animator_p (wrapped_obj);
   }
 
   SCM
   irr_drop (SCM wrapped_obj)
   {
-    bool result = 0;
-    if (device_p (wrapped_obj))
+    if (is_reference_counted_object (wrapped_obj))
       {
-        result = unwrap_device (wrapped_obj)->drop ();
+        irr::IReferenceCounted* obj = unwrap_reference_counted (wrapped_obj, false);
+        return scm_from_bool (obj->drop ());
       }
     else
       {
         scm_error (scm_arg_type_key, NULL, "Object cannot be dropped: ~S",
                    scm_list_1 (wrapped_obj), scm_list_1 (wrapped_obj));
       }
-    return scm_from_bool (result);
   }
 
 }