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 scene_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 scene_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 scene_ISceneManager_addCameraSceneNodeFPS (SCM scene_manager,
85 SCM no_vertical_movement,
90 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
91 scene::ICameraSceneNode* camera =
92 smgr->addCameraSceneNodeFPS ((TParent) scm_to_pointer (parent),
93 scm_to_double (rotate_speed),
94 scm_to_double (move_speed),
96 (SKeyMap*) scm_to_pointer (key_map_array),
97 scm_to_int32 (key_map_size),
98 scm_to_bool (no_vertical_movement),
99 scm_to_double (jump_speed),
100 scm_to_bool (invert_mouse),
101 scm_to_bool (make_active));
102 return scm_from_pointer ((void*) camera, NULL);
106 template <typename TParent>
108 scene_ISceneManager_addCubeSceneNode (SCM scene_manager,
116 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
117 scene::IMeshSceneNode* node =
118 smgr->addCubeSceneNode (scm_to_double (size),
119 (TParent) scm_to_pointer (parent),
121 scm_to_vector3df (position),
122 scm_to_vector3df (rotation),
123 scm_to_vector3df (scale));
124 return scm_from_pointer ((void*) node, NULL);
128 template <typename TParent>
130 scene_ISceneManager_addCustomSceneNode (SCM scene_manager,
132 SCM proc_get_bounding_box,
133 SCM proc_get_material_count,
134 SCM proc_get_material,
141 class CustomSceneNode : public scene::ISceneNode
144 SCM scm_get_bounding_box;
145 SCM scm_get_material_count;
146 SCM scm_get_material;
149 CustomSceneNode (scene::ISceneNode* parent,
150 scene::ISceneManager* smgr,
152 const core::vector3df& position,
153 const core::vector3df& rotation,
154 const core::vector3df& scale,
156 SCM get_bounding_box,
157 SCM get_material_count,
159 : scene::ISceneNode (parent, smgr, id, position, rotation, scale)
162 scm_get_bounding_box = get_bounding_box;
163 scm_get_material_count = get_material_count;
164 scm_get_material = get_material;
167 virtual void OnRegisterSceneNode ()
171 SceneManager->registerNodeForRendering (this);
173 ISceneNode::OnRegisterSceneNode ();
176 virtual void render ()
178 scm_call_0 (scm_render);
181 virtual const core::aabbox3d<f32>& getBoundingBox () const
183 SCM box = scm_call_0 (scm_get_bounding_box);
184 return *((core::aabbox3d<f32>*) scm_to_pointer (box));
187 virtual u32 getMaterialCount () const
189 return scm_to_uint32 (scm_call_0 (scm_get_material_count));
192 virtual video::SMaterial& getMaterial (u32 i)
194 SCM material = scm_call_1 (scm_get_material, scm_from_uint32 (i));
195 return *((video::SMaterial*) scm_to_pointer (material));
199 CustomSceneNode* node =
200 new CustomSceneNode ((TParent) scm_to_pointer (parent),
201 (scene::ISceneManager*) scm_to_pointer (scene_manager),
203 scm_to_vector3df (position),
204 scm_to_vector3df (rotation),
205 scm_to_vector3df (scale),
207 proc_get_bounding_box,
208 proc_get_material_count,
210 return scm_from_pointer ((void*) node, NULL);
214 template <typename TParent, typename TMesh>
216 scene_ISceneManager_addOctreeSceneNode (SCM scene_manager,
220 SCM minimal_polys_per_node,
221 SCM also_add_if_mesh_pointer_zero)
223 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
224 scene::IMeshSceneNode* node =
225 smgr->addOctreeSceneNode ((TMesh) scm_to_pointer (mesh),
226 (TParent) scm_to_pointer (parent),
228 scm_to_int32 (minimal_polys_per_node),
229 scm_to_bool (also_add_if_mesh_pointer_zero));
230 return scm_from_pointer ((void*) node, NULL);
234 template <typename TParent>
236 scene_ISceneManager_addSphereSceneNode (SCM scene_manager,
245 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
246 scene::IMeshSceneNode* node =
247 smgr->addSphereSceneNode (scm_to_double (radius),
248 scm_to_int32 (poly_count),
249 (TParent) scm_to_pointer (parent),
251 scm_to_vector3df (position),
252 scm_to_vector3df (rotation),
253 scm_to_vector3df (scale));
254 return scm_from_pointer ((void*) node, NULL);
259 scene_ISceneManager_createFlyCircleAnimator (SCM scene_manager,
265 SCM radius_ellipsoid)
267 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
268 scene::ISceneNodeAnimator* anim =
269 smgr->createFlyCircleAnimator (scm_to_vector3df (center),
270 scm_to_double (radius),
271 scm_to_double (speed),
272 scm_to_vector3df (direction),
273 scm_to_double (start_position),
274 scm_to_double (radius_ellipsoid));
275 return scm_from_pointer ((void*) anim, NULL);
280 scene_ISceneManager_createFlyStraightAnimator (SCM scene_manager,
287 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
288 scene::ISceneNodeAnimator* anim =
289 smgr->createFlyStraightAnimator (scm_to_vector3df (start_point),
290 scm_to_vector3df (end_point),
291 scm_to_uint32 (time_for_way),
293 scm_to_bool (pingpong));
294 return scm_from_pointer ((void*) anim, NULL);
299 scene_ISceneManager_createRotationAnimator (SCM scene_manager,
302 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
303 scene::ISceneNodeAnimator* anim =
304 smgr->createRotationAnimator (scm_to_vector3df (rotation_speed));
305 return scm_from_pointer ((void*) anim, NULL);
310 scene_ISceneManager_drawAll (SCM scene_manager)
312 ((scene::ISceneManager*) scm_to_pointer (scene_manager))->drawAll ();
313 return SCM_UNSPECIFIED;
318 scene_ISceneManager_getMesh (SCM scene_manager,
321 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
322 scene::IAnimatedMesh* mesh = smgr->getMesh(scm_to_utf8_stringn (filename, NULL));
323 return scm_from_pointer ((void*) mesh, NULL);
328 scene_ISceneManager_getRootSceneNode (SCM scene_manager)
330 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
331 return scm_from_pointer ((void*) smgr->getRootSceneNode (), NULL);
338 init_scene_manager (void)
340 DEFINE_GSUBR ("scene_ISceneManager_addAnimatedMeshSceneNode_ISceneNode", 8, 0, 0,
341 scene_ISceneManager_addAnimatedMeshSceneNode<scene::ISceneNode*>);
342 DEFINE_GSUBR ("scene_ISceneManager_addCameraSceneNode_ISceneNode", 6, 0, 0,
343 scene_ISceneManager_addCameraSceneNode<scene::ISceneNode*>);
344 DEFINE_GSUBR ("scene_ISceneManager_addCameraSceneNodeFPS_ISceneNode", 11, 0, 0,
345 scene_ISceneManager_addCameraSceneNodeFPS<scene::ISceneNode*>);
346 DEFINE_GSUBR ("scene_ISceneManager_addCubeSceneNode_ISceneNode", 7, 0, 0,
347 scene_ISceneManager_addCubeSceneNode<scene::ISceneNode*>);
348 DEFINE_GSUBR ("scene_ISceneManager_addCustomSceneNode_ISceneNode", 10, 0, 0,
349 scene_ISceneManager_addCustomSceneNode<scene::ISceneNode*>);
350 DEFINE_GSUBR ("scene_ISceneManager_addOctreeSceneNode_ISceneNode_IAnimatedMesh", 6, 0, 0,
351 (scene_ISceneManager_addOctreeSceneNode<scene::ISceneNode*, scene::IAnimatedMesh*>));
352 DEFINE_GSUBR ("scene_ISceneManager_addOctreeSceneNode_ISceneNode_IMesh", 6, 0, 0,
353 (scene_ISceneManager_addOctreeSceneNode<scene::ISceneNode*, scene::IMesh*>));
354 DEFINE_GSUBR ("scene_ISceneManager_addSphereSceneNode_ISceneNode", 8, 0, 0,
355 scene_ISceneManager_addSphereSceneNode<scene::ISceneNode*>);
356 DEFINE_GSUBR ("scene_ISceneManager_createFlyCircleAnimator", 7, 0, 0,
357 scene_ISceneManager_createFlyCircleAnimator);
358 DEFINE_GSUBR ("scene_ISceneManager_createFlyStraightAnimator", 6, 0, 0,
359 scene_ISceneManager_createFlyStraightAnimator);
360 DEFINE_GSUBR ("scene_ISceneManager_createRotationAnimator", 2, 0, 0,
361 scene_ISceneManager_createRotationAnimator);
362 DEFINE_GSUBR ("scene_ISceneManager_drawAll", 1, 0, 0, scene_ISceneManager_drawAll);
363 DEFINE_GSUBR ("scene_ISceneManager_getMesh", 2, 0, 0, scene_ISceneManager_getMesh);
364 DEFINE_GSUBR ("scene_ISceneManager_getRootSceneNode", 1, 0, 0,
365 scene_ISceneManager_getRootSceneNode);