+++ /dev/null
-/* guile-irrlicht --- GNU Guile bindings for Irrlicht Engine
-
- Copyright (C) 2020 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/>.
-*/
-
-#include <irrlicht/irrlicht.h>
-#include <libguile.h>
-#include "gsubr.h"
-#include "scene-manager.h"
-#include "vector3d.h"
-#include "wrapped.h"
-
-using namespace irr;
-
-template <typename TParent>
-SCM
-ISceneManager_addAnimatedMeshSceneNode (SCM scene_manager,
- SCM mesh,
- SCM parent,
- SCM id,
- SCM position,
- SCM rotation,
- SCM scale,
- SCM also_add_if_mesh_pointer_zero)
-{
- scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_irr_pointer (scene_manager);
- scene::IAnimatedMeshSceneNode* node =
- smgr->addAnimatedMeshSceneNode ((scene::IAnimatedMesh*) scm_to_irr_pointer (mesh),
- (TParent) scm_to_irr_pointer (parent),
- scm_to_int32 (id),
- scm_to_vector3df (position),
- scm_to_vector3df (rotation),
- scm_to_vector3df (scale),
- scm_to_bool (also_add_if_mesh_pointer_zero));
- return scm_from_irr_pointer ("<animated-mesh-scene-node>", (void*) node);
-}
-
-template <typename TParent>
-SCM
-ISceneManager_addCameraSceneNode (SCM scene_manager,
- SCM parent,
- SCM position,
- SCM lookat,
- SCM id,
- SCM make_active)
-{
- scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_irr_pointer (scene_manager);
- scene::ICameraSceneNode* camera =
- smgr->addCameraSceneNode ((TParent) scm_to_irr_pointer (parent),
- scm_to_vector3df (position),
- scm_to_vector3df (lookat),
- scm_to_int32 (id),
- scm_to_bool (make_active));
- return scm_from_irr_pointer ("<camera-scene-node>", (void*) camera);
-}
-
-template <typename TParent>
-SCM
-ISceneManager_addCameraSceneNodeFPS (SCM scene_manager,
- SCM rest)
-{
- SCM parent;
- SCM rotate_speed;
- SCM move_speed;
- SCM id;
- SCM key_map_array;
- SCM key_map_size;
- SCM no_vertical_movement;
- SCM jump_speed;
- SCM invert_mouse;
- SCM make_active;
-
- scm_c_bind_keyword_arguments ("scene_ISceneManager_addCameraSceneNodeFPS",
- rest, (scm_t_keyword_arguments_flags)0,
- scm_from_utf8_keyword ("parent"), &parent,
- scm_from_utf8_keyword ("rotate-speed"), &rotate_speed,
- scm_from_utf8_keyword ("move-speed"), &move_speed,
- scm_from_utf8_keyword ("id"), &id,
- scm_from_utf8_keyword ("key-map-array"), &key_map_array,
- scm_from_utf8_keyword ("key-map-size"), &key_map_size,
- scm_from_utf8_keyword ("no-vertical-movement"), &no_vertical_movement,
- scm_from_utf8_keyword ("jump-speed"), &jump_speed,
- scm_from_utf8_keyword ("invert-mouse"), &invert_mouse,
- scm_from_utf8_keyword ("make-active"), &make_active,
- SCM_UNDEFINED);
-
- scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_irr_pointer (scene_manager);
- scene::ICameraSceneNode* camera =
- smgr->addCameraSceneNodeFPS ((TParent) scm_to_irr_pointer (parent),
- scm_to_double (rotate_speed),
- scm_to_double (move_speed),
- scm_to_int32 (id),
- (SKeyMap*) scm_to_irr_pointer (key_map_array),
- scm_to_int32 (key_map_size),
- scm_to_bool (no_vertical_movement),
- scm_to_double (jump_speed),
- scm_to_bool (invert_mouse),
- scm_to_bool (make_active));
- return scm_from_irr_pointer ("<camera-scene-node>", (void*) camera);
-}
-
-template <typename TParent>
-SCM
-ISceneManager_addCubeSceneNode (SCM scene_manager,
- SCM size,
- SCM parent,
- SCM id,
- SCM position,
- SCM rotation,
- SCM scale)
-{
- scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_irr_pointer (scene_manager);
- scene::IMeshSceneNode* node =
- smgr->addCubeSceneNode (scm_to_double (size),
- (TParent) scm_to_irr_pointer (parent),
- scm_to_int32 (id),
- scm_to_vector3df (position),
- scm_to_vector3df (rotation),
- scm_to_vector3df (scale));
- return scm_from_irr_pointer ("<mesh-scene-node>", (void*) node);
-}
-
-template <typename TParent>
-SCM
-ISceneManager_addCustomSceneNode (SCM scene_manager,
- SCM proc_render,
- SCM proc_get_bounding_box,
- SCM proc_get_material_count,
- SCM proc_get_material,
- SCM parent,
- SCM id,
- SCM position,
- SCM rotation,
- SCM scale)
-{
- class CustomSceneNode : public scene::ISceneNode
- {
- SCM scm_render;
- SCM scm_get_bounding_box;
- SCM scm_get_material_count;
- SCM scm_get_material;
-
- public:
- CustomSceneNode (scene::ISceneNode* parent,
- scene::ISceneManager* smgr,
- s32 id,
- const core::vector3df& position,
- const core::vector3df& rotation,
- const core::vector3df& scale,
- SCM render,
- SCM get_bounding_box,
- SCM get_material_count,
- SCM get_material)
- : scene::ISceneNode (parent, smgr, id, position, rotation, scale)
- {
- scm_render = render;
- scm_get_bounding_box = get_bounding_box;
- scm_get_material_count = get_material_count;
- scm_get_material = get_material;
- }
-
- virtual void OnRegisterSceneNode ()
- {
- if (IsVisible)
- {
- SceneManager->registerNodeForRendering (this);
- }
- ISceneNode::OnRegisterSceneNode ();
- }
-
- virtual void render ()
- {
- scm_call_0 (scm_render);
- }
-
- virtual const core::aabbox3d<f32>& getBoundingBox () const
- {
- SCM box = scm_call_0 (scm_get_bounding_box);
- return *((core::aabbox3d<f32>*) scm_to_irr_pointer (box));
- }
-
- virtual u32 getMaterialCount () const
- {
- return scm_to_uint32 (scm_call_0 (scm_get_material_count));
- }
-
- virtual video::SMaterial& getMaterial (u32 i)
- {
- SCM material = scm_call_1 (scm_get_material, scm_from_uint32 (i));
- return *((video::SMaterial*) scm_to_irr_pointer (material));
- }
- };
-
- CustomSceneNode* node =
- new CustomSceneNode ((TParent) scm_to_irr_pointer (parent),
- (scene::ISceneManager*) scm_to_irr_pointer (scene_manager),
- scm_to_int32 (id),
- scm_to_vector3df (position),
- scm_to_vector3df (rotation),
- scm_to_vector3df (scale),
- proc_render,
- proc_get_bounding_box,
- proc_get_material_count,
- proc_get_material);
- return scm_from_irr_pointer ("<scene-node>", (void*) node);
-}
-
-template <typename TParent, typename TMesh>
-SCM
-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_irr_pointer (scene_manager);
- scene::IMeshSceneNode* node =
- smgr->addOctreeSceneNode ((TMesh) scm_to_irr_pointer (mesh),
- (TParent) scm_to_irr_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_irr_pointer ("<mesh-scene-node>", (void*) node);
-}
-
-template <typename TParent>
-SCM
-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_irr_pointer (scene_manager);
- scene::IMeshSceneNode* node =
- smgr->addSphereSceneNode (scm_to_double (radius),
- scm_to_int32 (poly_count),
- (TParent) scm_to_irr_pointer (parent),
- scm_to_int32 (id),
- scm_to_vector3df (position),
- scm_to_vector3df (rotation),
- scm_to_vector3df (scale));
- return scm_from_irr_pointer ("<mesh-scene-node>", (void*) node);
-}
-
-SCM
-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_irr_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_irr_pointer ("<scene-node-animator>", (void*) anim);
-}
-
-SCM
-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_irr_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_irr_pointer ("<scene-node-animator>", (void*) anim);
-}
-
-SCM
-ISceneManager_createRotationAnimator (SCM scene_manager,
- SCM rotation_speed)
-{
- scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_irr_pointer (scene_manager);
- scene::ISceneNodeAnimator* anim =
- smgr->createRotationAnimator (scm_to_vector3df (rotation_speed));
- return scm_from_irr_pointer ("<scene-node-animator>", (void*) anim);
-}
-
-SCM
-ISceneManager_drawAll (SCM scene_manager)
-{
- ((scene::ISceneManager*) scm_to_irr_pointer (scene_manager))->drawAll ();
- return SCM_UNSPECIFIED;
-}
-
-SCM
-ISceneManager_getMesh (SCM scene_manager,
- SCM filename)
-{
- char* cfilename = scm_to_utf8_string (filename);
- scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_irr_pointer (scene_manager);
- scene::IAnimatedMesh* mesh = smgr->getMesh(cfilename);
- free (cfilename);
- return scm_from_irr_pointer ("<animated-mesh>", (void*) mesh);
-}
-
-SCM
-ISceneManager_getRootSceneNode (SCM scene_manager)
-{
- scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_irr_pointer (scene_manager);
- return scm_from_irr_pointer ("<scene-node>", (void*) smgr->getRootSceneNode ());
-}
-
-void
-init_scene_manager (void)
-{
- DEFINE_GSUBR ("ISceneManager_addAnimatedMeshSceneNode_ISceneNode", 8, 0, 0,
- ISceneManager_addAnimatedMeshSceneNode<scene::ISceneNode*>);
- DEFINE_GSUBR ("ISceneManager_addCameraSceneNode_ISceneNode", 6, 0, 0,
- ISceneManager_addCameraSceneNode<scene::ISceneNode*>);
- DEFINE_GSUBR ("ISceneManager_addCameraSceneNodeFPS_ISceneNode", 1, 0, 1,
- ISceneManager_addCameraSceneNodeFPS<scene::ISceneNode*>);
- DEFINE_GSUBR ("ISceneManager_addCubeSceneNode_ISceneNode", 7, 0, 0,
- ISceneManager_addCubeSceneNode<scene::ISceneNode*>);
- DEFINE_GSUBR ("ISceneManager_addCustomSceneNode_ISceneNode", 10, 0, 0,
- ISceneManager_addCustomSceneNode<scene::ISceneNode*>);
- DEFINE_GSUBR ("ISceneManager_addOctreeSceneNode_ISceneNode_IAnimatedMesh", 6, 0, 0,
- (ISceneManager_addOctreeSceneNode<scene::ISceneNode*, scene::IAnimatedMesh*>));
- DEFINE_GSUBR ("ISceneManager_addOctreeSceneNode_ISceneNode_IMesh", 6, 0, 0,
- (ISceneManager_addOctreeSceneNode<scene::ISceneNode*, scene::IMesh*>));
- DEFINE_GSUBR ("ISceneManager_addSphereSceneNode_ISceneNode", 8, 0, 0,
- ISceneManager_addSphereSceneNode<scene::ISceneNode*>);
- DEFINE_GSUBR ("ISceneManager_createFlyCircleAnimator", 7, 0, 0,
- ISceneManager_createFlyCircleAnimator);
- DEFINE_GSUBR ("ISceneManager_createFlyStraightAnimator", 6, 0, 0,
- ISceneManager_createFlyStraightAnimator);
- DEFINE_GSUBR ("ISceneManager_createRotationAnimator", 2, 0, 0,
- ISceneManager_createRotationAnimator);
- DEFINE_GSUBR ("ISceneManager_drawAll", 1, 0, 0, ISceneManager_drawAll);
- DEFINE_GSUBR ("ISceneManager_getMesh", 2, 0, 0, ISceneManager_getMesh);
- DEFINE_GSUBR ("ISceneManager_getRootSceneNode", 1, 0, 0, ISceneManager_getRootSceneNode);
-}