1 /* guile-irrlicht --- GNU Guile bindings for Irrlicht Engine
3 Copyright (C) 2020 Javier Sancho <jsf@jsancho.org>
5 This file is part of guile-irrlicht.
7 guile-irrlicht is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as
9 published by the Free Software Foundation; either version 3 of the
10 License, or (at your option) any later version.
12 guile-irrlicht is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public
18 License along with guile-irrlicht. If not, see
19 <http://www.gnu.org/licenses/>.
22 #include <irrlicht/irrlicht.h>
25 #include "scene-manager.h"
32 template <typename TParent>
34 ISceneManager_addAnimatedMeshSceneNode (SCM scene_manager,
41 SCM also_add_if_mesh_pointer_zero)
43 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
44 scene::IAnimatedMeshSceneNode* node =
45 smgr->addAnimatedMeshSceneNode ((scene::IAnimatedMesh*) scm_to_pointer (mesh),
46 (TParent) scm_to_pointer (parent),
48 scm_to_vector3df (position),
49 scm_to_vector3df (rotation),
50 scm_to_vector3df (scale),
51 scm_to_bool (also_add_if_mesh_pointer_zero));
52 return scm_from_pointer ((void*) node, NULL);
56 template <typename TParent>
58 ISceneManager_addCameraSceneNode (SCM scene_manager,
65 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
66 scene::ICameraSceneNode* camera =
67 smgr->addCameraSceneNode ((TParent) scm_to_pointer (parent),
68 scm_to_vector3df (position),
69 scm_to_vector3df (lookat),
71 scm_to_bool (make_active));
72 return scm_from_pointer ((void*) camera, NULL);
76 template <typename TParent>
78 ISceneManager_addCameraSceneNodeFPS (SCM scene_manager,
87 SCM no_vertical_movement;
92 scm_c_bind_keyword_arguments ("scene_ISceneManager_addCameraSceneNodeFPS",
93 rest, (scm_t_keyword_arguments_flags)0,
94 scm_from_utf8_keyword ("parent"), &parent,
95 scm_from_utf8_keyword ("rotate-speed"), &rotate_speed,
96 scm_from_utf8_keyword ("move-speed"), &move_speed,
97 scm_from_utf8_keyword ("id"), &id,
98 scm_from_utf8_keyword ("key-map-array"), &key_map_array,
99 scm_from_utf8_keyword ("key-map-size"), &key_map_size,
100 scm_from_utf8_keyword ("no-vertical-movement"), &no_vertical_movement,
101 scm_from_utf8_keyword ("jump-speed"), &jump_speed,
102 scm_from_utf8_keyword ("invert-mouse"), &invert_mouse,
103 scm_from_utf8_keyword ("make-active"), &make_active,
106 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
107 scene::ICameraSceneNode* camera =
108 smgr->addCameraSceneNodeFPS ((TParent) scm_to_pointer (parent),
109 scm_to_double (rotate_speed),
110 scm_to_double (move_speed),
112 (SKeyMap*) scm_to_pointer (key_map_array),
113 scm_to_int32 (key_map_size),
114 scm_to_bool (no_vertical_movement),
115 scm_to_double (jump_speed),
116 scm_to_bool (invert_mouse),
117 scm_to_bool (make_active));
118 return scm_from_pointer ((void*) camera, NULL);
122 template <typename TParent>
124 ISceneManager_addCubeSceneNode (SCM scene_manager,
132 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
133 scene::IMeshSceneNode* node =
134 smgr->addCubeSceneNode (scm_to_double (size),
135 (TParent) scm_to_pointer (parent),
137 scm_to_vector3df (position),
138 scm_to_vector3df (rotation),
139 scm_to_vector3df (scale));
140 return scm_from_pointer ((void*) node, NULL);
144 template <typename TParent>
146 ISceneManager_addCustomSceneNode (SCM scene_manager,
148 SCM proc_get_bounding_box,
149 SCM proc_get_material_count,
150 SCM proc_get_material,
157 class CustomSceneNode : public scene::ISceneNode
160 SCM scm_get_bounding_box;
161 SCM scm_get_material_count;
162 SCM scm_get_material;
165 CustomSceneNode (scene::ISceneNode* parent,
166 scene::ISceneManager* smgr,
168 const core::vector3df& position,
169 const core::vector3df& rotation,
170 const core::vector3df& scale,
172 SCM get_bounding_box,
173 SCM get_material_count,
175 : scene::ISceneNode (parent, smgr, id, position, rotation, scale)
178 scm_get_bounding_box = get_bounding_box;
179 scm_get_material_count = get_material_count;
180 scm_get_material = get_material;
183 virtual void OnRegisterSceneNode ()
187 SceneManager->registerNodeForRendering (this);
189 ISceneNode::OnRegisterSceneNode ();
192 virtual void render ()
194 scm_call_0 (scm_render);
197 virtual const core::aabbox3d<f32>& getBoundingBox () const
199 SCM box = scm_call_0 (scm_get_bounding_box);
200 return *((core::aabbox3d<f32>*) scm_to_pointer (box));
203 virtual u32 getMaterialCount () const
205 return scm_to_uint32 (scm_call_0 (scm_get_material_count));
208 virtual video::SMaterial& getMaterial (u32 i)
210 SCM material = scm_call_1 (scm_get_material, scm_from_uint32 (i));
211 return *((video::SMaterial*) scm_to_pointer (material));
215 CustomSceneNode* node =
216 new CustomSceneNode ((TParent) scm_to_pointer (parent),
217 (scene::ISceneManager*) scm_to_pointer (scene_manager),
219 scm_to_vector3df (position),
220 scm_to_vector3df (rotation),
221 scm_to_vector3df (scale),
223 proc_get_bounding_box,
224 proc_get_material_count,
226 return scm_from_pointer ((void*) node, NULL);
230 template <typename TParent, typename TMesh>
232 ISceneManager_addOctreeSceneNode (SCM scene_manager,
236 SCM minimal_polys_per_node,
237 SCM also_add_if_mesh_pointer_zero)
239 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
240 scene::IMeshSceneNode* node =
241 smgr->addOctreeSceneNode ((TMesh) scm_to_pointer (mesh),
242 (TParent) scm_to_pointer (parent),
244 scm_to_int32 (minimal_polys_per_node),
245 scm_to_bool (also_add_if_mesh_pointer_zero));
246 return scm_from_pointer ((void*) node, NULL);
250 template <typename TParent>
252 ISceneManager_addSphereSceneNode (SCM scene_manager,
261 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
262 scene::IMeshSceneNode* node =
263 smgr->addSphereSceneNode (scm_to_double (radius),
264 scm_to_int32 (poly_count),
265 (TParent) scm_to_pointer (parent),
267 scm_to_vector3df (position),
268 scm_to_vector3df (rotation),
269 scm_to_vector3df (scale));
270 return scm_from_pointer ((void*) node, NULL);
275 ISceneManager_createFlyCircleAnimator (SCM scene_manager,
281 SCM radius_ellipsoid)
283 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
284 scene::ISceneNodeAnimator* anim =
285 smgr->createFlyCircleAnimator (scm_to_vector3df (center),
286 scm_to_double (radius),
287 scm_to_double (speed),
288 scm_to_vector3df (direction),
289 scm_to_double (start_position),
290 scm_to_double (radius_ellipsoid));
291 return scm_from_pointer ((void*) anim, NULL);
296 ISceneManager_createFlyStraightAnimator (SCM scene_manager,
303 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
304 scene::ISceneNodeAnimator* anim =
305 smgr->createFlyStraightAnimator (scm_to_vector3df (start_point),
306 scm_to_vector3df (end_point),
307 scm_to_uint32 (time_for_way),
309 scm_to_bool (pingpong));
310 return scm_from_pointer ((void*) anim, NULL);
315 ISceneManager_createRotationAnimator (SCM scene_manager,
318 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
319 scene::ISceneNodeAnimator* anim =
320 smgr->createRotationAnimator (scm_to_vector3df (rotation_speed));
321 return scm_from_pointer ((void*) anim, NULL);
326 ISceneManager_drawAll (SCM scene_manager)
328 ((scene::ISceneManager*) scm_to_pointer (scene_manager))->drawAll ();
329 return SCM_UNSPECIFIED;
334 ISceneManager_getMesh (SCM scene_manager,
337 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
338 scene::IAnimatedMesh* mesh = smgr->getMesh(scm_to_utf8_stringn (filename, NULL));
339 return scm_from_pointer ((void*) mesh, NULL);
344 ISceneManager_getRootSceneNode (SCM scene_manager)
346 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
347 return scm_from_pointer ((void*) smgr->getRootSceneNode (), NULL);
354 init_scene_manager (void)
356 DEFINE_GSUBR ("ISceneManager_addAnimatedMeshSceneNode_ISceneNode", 8, 0, 0,
357 ISceneManager_addAnimatedMeshSceneNode<scene::ISceneNode*>);
358 DEFINE_GSUBR ("ISceneManager_addCameraSceneNode_ISceneNode", 6, 0, 0,
359 ISceneManager_addCameraSceneNode<scene::ISceneNode*>);
360 DEFINE_GSUBR ("ISceneManager_addCameraSceneNodeFPS_ISceneNode", 1, 0, 1,
361 ISceneManager_addCameraSceneNodeFPS<scene::ISceneNode*>);
362 DEFINE_GSUBR ("ISceneManager_addCubeSceneNode_ISceneNode", 7, 0, 0,
363 ISceneManager_addCubeSceneNode<scene::ISceneNode*>);
364 DEFINE_GSUBR ("ISceneManager_addCustomSceneNode_ISceneNode", 10, 0, 0,
365 ISceneManager_addCustomSceneNode<scene::ISceneNode*>);
366 DEFINE_GSUBR ("ISceneManager_addOctreeSceneNode_ISceneNode_IAnimatedMesh", 6, 0, 0,
367 (ISceneManager_addOctreeSceneNode<scene::ISceneNode*, scene::IAnimatedMesh*>));
368 DEFINE_GSUBR ("ISceneManager_addOctreeSceneNode_ISceneNode_IMesh", 6, 0, 0,
369 (ISceneManager_addOctreeSceneNode<scene::ISceneNode*, scene::IMesh*>));
370 DEFINE_GSUBR ("ISceneManager_addSphereSceneNode_ISceneNode", 8, 0, 0,
371 ISceneManager_addSphereSceneNode<scene::ISceneNode*>);
372 DEFINE_GSUBR ("ISceneManager_createFlyCircleAnimator", 7, 0, 0,
373 ISceneManager_createFlyCircleAnimator);
374 DEFINE_GSUBR ("ISceneManager_createFlyStraightAnimator", 6, 0, 0,
375 ISceneManager_createFlyStraightAnimator);
376 DEFINE_GSUBR ("ISceneManager_createRotationAnimator", 2, 0, 0,
377 ISceneManager_createRotationAnimator);
378 DEFINE_GSUBR ("ISceneManager_drawAll", 1, 0, 0, ISceneManager_drawAll);
379 DEFINE_GSUBR ("ISceneManager_getMesh", 2, 0, 0, ISceneManager_getMesh);
380 DEFINE_GSUBR ("ISceneManager_getRootSceneNode", 1, 0, 0, ISceneManager_getRootSceneNode);