+template <typename TParent, typename TMesh>
+SCM
+scene_ISceneManager_addOctreeSceneNode (SCM scene_manager,
+ SCM mesh,
+ SCM parent,
+ SCM id,
+ SCM minimal_polys_per_node,
+ SCM also_add_if_mesh_pointer_zero)
+{
+ scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
+ scene::IMeshSceneNode* node =
+ smgr->addOctreeSceneNode ((TMesh) scm_to_pointer (mesh),
+ (TParent) scm_to_pointer (parent),
+ scm_to_int32 (id),
+ scm_to_int32 (minimal_polys_per_node),
+ scm_to_bool (also_add_if_mesh_pointer_zero));
+ return scm_from_pointer ((void*) node, NULL);
+}
+
+
+template <typename TParent>
+SCM
+scene_ISceneManager_addSphereSceneNode (SCM scene_manager,
+ SCM radius,
+ SCM poly_count,
+ SCM parent,
+ SCM id,
+ SCM position,
+ SCM rotation,
+ SCM scale)
+{
+ scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
+ scene::IMeshSceneNode* node =
+ smgr->addSphereSceneNode (scm_to_double (radius),
+ scm_to_int32 (poly_count),
+ (TParent) scm_to_pointer (parent),
+ scm_to_int32 (id),
+ scm_to_vector3df (position),
+ scm_to_vector3df (rotation),
+ scm_to_vector3df (scale));
+ return scm_from_pointer ((void*) node, NULL);
+}
+
+
+SCM
+scene_ISceneManager_createFlyCircleAnimator (SCM scene_manager,
+ SCM center,
+ SCM radius,
+ SCM speed,
+ SCM direction,
+ SCM start_position,
+ SCM radius_ellipsoid)
+{
+ scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
+ scene::ISceneNodeAnimator* anim =
+ smgr->createFlyCircleAnimator (scm_to_vector3df (center),
+ scm_to_double (radius),
+ scm_to_double (speed),
+ scm_to_vector3df (direction),
+ scm_to_double (start_position),
+ scm_to_double (radius_ellipsoid));
+ return scm_from_pointer ((void*) anim, NULL);
+}
+
+
+SCM
+scene_ISceneManager_createFlyStraightAnimator (SCM scene_manager,
+ SCM start_point,
+ SCM end_point,
+ SCM time_for_way,
+ SCM loop,
+ SCM pingpong)
+{
+ scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
+ scene::ISceneNodeAnimator* anim =
+ smgr->createFlyStraightAnimator (scm_to_vector3df (start_point),
+ scm_to_vector3df (end_point),
+ scm_to_uint32 (time_for_way),
+ scm_to_bool (loop),
+ scm_to_bool (pingpong));
+ return scm_from_pointer ((void*) anim, NULL);
+}
+
+
+SCM
+scene_ISceneManager_createRotationAnimator (SCM scene_manager,
+ SCM rotation_speed)
+{
+ scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
+ scene::ISceneNodeAnimator* anim =
+ smgr->createRotationAnimator (scm_to_vector3df (rotation_speed));
+ return scm_from_pointer ((void*) anim, NULL);
+}
+
+
+SCM
+scene_ISceneManager_drawAll (SCM scene_manager)
+{
+ ((scene::ISceneManager*) scm_to_pointer (scene_manager))->drawAll ();
+ return SCM_UNSPECIFIED;
+}
+
+
+SCM
+scene_ISceneManager_getMesh (SCM scene_manager,
+ SCM filename)
+{
+ scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
+ scene::IAnimatedMesh* mesh = smgr->getMesh(scm_to_utf8_stringn (filename, NULL));
+ return scm_from_pointer ((void*) mesh, NULL);
+}
+
+
+SCM
+scene_ISceneManager_getRootSceneNode (SCM scene_manager)
+{
+ scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
+ return scm_from_pointer ((void*) smgr->getRootSceneNode (), NULL);
+}
+
+
+extern "C" {
+
+ void
+ init_scene_manager (void)