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"
30 template <typename TParent>
32 ISceneManager_addAnimatedMeshSceneNode (SCM scene_manager,
39 SCM also_add_if_mesh_pointer_zero)
41 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
42 scene::IAnimatedMeshSceneNode* node =
43 smgr->addAnimatedMeshSceneNode ((scene::IAnimatedMesh*) scm_to_pointer (mesh),
44 (TParent) scm_to_pointer (parent),
46 scm_to_vector3df (position),
47 scm_to_vector3df (rotation),
48 scm_to_vector3df (scale),
49 scm_to_bool (also_add_if_mesh_pointer_zero));
50 return scm_from_pointer ((void*) node, NULL);
53 template <typename TParent>
55 ISceneManager_addCameraSceneNode (SCM scene_manager,
62 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
63 scene::ICameraSceneNode* camera =
64 smgr->addCameraSceneNode ((TParent) scm_to_pointer (parent),
65 scm_to_vector3df (position),
66 scm_to_vector3df (lookat),
68 scm_to_bool (make_active));
69 return scm_from_pointer ((void*) camera, NULL);
72 template <typename TParent>
74 ISceneManager_addCameraSceneNodeFPS (SCM scene_manager,
83 SCM no_vertical_movement;
88 scm_c_bind_keyword_arguments ("scene_ISceneManager_addCameraSceneNodeFPS",
89 rest, (scm_t_keyword_arguments_flags)0,
90 scm_from_utf8_keyword ("parent"), &parent,
91 scm_from_utf8_keyword ("rotate-speed"), &rotate_speed,
92 scm_from_utf8_keyword ("move-speed"), &move_speed,
93 scm_from_utf8_keyword ("id"), &id,
94 scm_from_utf8_keyword ("key-map-array"), &key_map_array,
95 scm_from_utf8_keyword ("key-map-size"), &key_map_size,
96 scm_from_utf8_keyword ("no-vertical-movement"), &no_vertical_movement,
97 scm_from_utf8_keyword ("jump-speed"), &jump_speed,
98 scm_from_utf8_keyword ("invert-mouse"), &invert_mouse,
99 scm_from_utf8_keyword ("make-active"), &make_active,
102 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
103 scene::ICameraSceneNode* camera =
104 smgr->addCameraSceneNodeFPS ((TParent) scm_to_pointer (parent),
105 scm_to_double (rotate_speed),
106 scm_to_double (move_speed),
108 (SKeyMap*) scm_to_pointer (key_map_array),
109 scm_to_int32 (key_map_size),
110 scm_to_bool (no_vertical_movement),
111 scm_to_double (jump_speed),
112 scm_to_bool (invert_mouse),
113 scm_to_bool (make_active));
114 return scm_from_pointer ((void*) camera, NULL);
117 template <typename TParent>
119 ISceneManager_addCubeSceneNode (SCM scene_manager,
127 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
128 scene::IMeshSceneNode* node =
129 smgr->addCubeSceneNode (scm_to_double (size),
130 (TParent) scm_to_pointer (parent),
132 scm_to_vector3df (position),
133 scm_to_vector3df (rotation),
134 scm_to_vector3df (scale));
135 return scm_from_pointer ((void*) node, NULL);
138 template <typename TParent>
140 ISceneManager_addCustomSceneNode (SCM scene_manager,
142 SCM proc_get_bounding_box,
143 SCM proc_get_material_count,
144 SCM proc_get_material,
151 class CustomSceneNode : public scene::ISceneNode
154 SCM scm_get_bounding_box;
155 SCM scm_get_material_count;
156 SCM scm_get_material;
159 CustomSceneNode (scene::ISceneNode* parent,
160 scene::ISceneManager* smgr,
162 const core::vector3df& position,
163 const core::vector3df& rotation,
164 const core::vector3df& scale,
166 SCM get_bounding_box,
167 SCM get_material_count,
169 : scene::ISceneNode (parent, smgr, id, position, rotation, scale)
172 scm_get_bounding_box = get_bounding_box;
173 scm_get_material_count = get_material_count;
174 scm_get_material = get_material;
177 virtual void OnRegisterSceneNode ()
181 SceneManager->registerNodeForRendering (this);
183 ISceneNode::OnRegisterSceneNode ();
186 virtual void render ()
188 scm_call_0 (scm_render);
191 virtual const core::aabbox3d<f32>& getBoundingBox () const
193 SCM box = scm_call_0 (scm_get_bounding_box);
194 return *((core::aabbox3d<f32>*) scm_to_pointer (box));
197 virtual u32 getMaterialCount () const
199 return scm_to_uint32 (scm_call_0 (scm_get_material_count));
202 virtual video::SMaterial& getMaterial (u32 i)
204 SCM material = scm_call_1 (scm_get_material, scm_from_uint32 (i));
205 return *((video::SMaterial*) scm_to_pointer (material));
209 CustomSceneNode* node =
210 new CustomSceneNode ((TParent) scm_to_pointer (parent),
211 (scene::ISceneManager*) scm_to_pointer (scene_manager),
213 scm_to_vector3df (position),
214 scm_to_vector3df (rotation),
215 scm_to_vector3df (scale),
217 proc_get_bounding_box,
218 proc_get_material_count,
220 return scm_from_pointer ((void*) node, NULL);
223 template <typename TParent, typename TMesh>
225 ISceneManager_addOctreeSceneNode (SCM scene_manager,
229 SCM minimal_polys_per_node,
230 SCM also_add_if_mesh_pointer_zero)
232 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
233 scene::IMeshSceneNode* node =
234 smgr->addOctreeSceneNode ((TMesh) scm_to_pointer (mesh),
235 (TParent) scm_to_pointer (parent),
237 scm_to_int32 (minimal_polys_per_node),
238 scm_to_bool (also_add_if_mesh_pointer_zero));
239 return scm_from_pointer ((void*) node, NULL);
242 template <typename TParent>
244 ISceneManager_addSphereSceneNode (SCM scene_manager,
253 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
254 scene::IMeshSceneNode* node =
255 smgr->addSphereSceneNode (scm_to_double (radius),
256 scm_to_int32 (poly_count),
257 (TParent) scm_to_pointer (parent),
259 scm_to_vector3df (position),
260 scm_to_vector3df (rotation),
261 scm_to_vector3df (scale));
262 return scm_from_pointer ((void*) node, NULL);
266 ISceneManager_createFlyCircleAnimator (SCM scene_manager,
272 SCM radius_ellipsoid)
274 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
275 scene::ISceneNodeAnimator* anim =
276 smgr->createFlyCircleAnimator (scm_to_vector3df (center),
277 scm_to_double (radius),
278 scm_to_double (speed),
279 scm_to_vector3df (direction),
280 scm_to_double (start_position),
281 scm_to_double (radius_ellipsoid));
282 return scm_from_pointer ((void*) anim, NULL);
286 ISceneManager_createFlyStraightAnimator (SCM scene_manager,
293 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
294 scene::ISceneNodeAnimator* anim =
295 smgr->createFlyStraightAnimator (scm_to_vector3df (start_point),
296 scm_to_vector3df (end_point),
297 scm_to_uint32 (time_for_way),
299 scm_to_bool (pingpong));
300 return scm_from_pointer ((void*) anim, NULL);
304 ISceneManager_createRotationAnimator (SCM scene_manager,
307 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
308 scene::ISceneNodeAnimator* anim =
309 smgr->createRotationAnimator (scm_to_vector3df (rotation_speed));
310 return scm_from_pointer ((void*) anim, NULL);
314 ISceneManager_drawAll (SCM scene_manager)
316 ((scene::ISceneManager*) scm_to_pointer (scene_manager))->drawAll ();
317 return SCM_UNSPECIFIED;
321 ISceneManager_getMesh (SCM scene_manager,
324 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
325 scene::IAnimatedMesh* mesh = smgr->getMesh(scm_to_utf8_stringn (filename, NULL));
326 return scm_from_pointer ((void*) mesh, NULL);
330 ISceneManager_getRootSceneNode (SCM scene_manager)
332 scene::ISceneManager* smgr = (scene::ISceneManager*) scm_to_pointer (scene_manager);
333 return scm_from_pointer ((void*) smgr->getRootSceneNode (), NULL);
337 init_scene_manager (void)
339 DEFINE_GSUBR ("ISceneManager_addAnimatedMeshSceneNode_ISceneNode", 8, 0, 0,
340 ISceneManager_addAnimatedMeshSceneNode<scene::ISceneNode*>);
341 DEFINE_GSUBR ("ISceneManager_addCameraSceneNode_ISceneNode", 6, 0, 0,
342 ISceneManager_addCameraSceneNode<scene::ISceneNode*>);
343 DEFINE_GSUBR ("ISceneManager_addCameraSceneNodeFPS_ISceneNode", 1, 0, 1,
344 ISceneManager_addCameraSceneNodeFPS<scene::ISceneNode*>);
345 DEFINE_GSUBR ("ISceneManager_addCubeSceneNode_ISceneNode", 7, 0, 0,
346 ISceneManager_addCubeSceneNode<scene::ISceneNode*>);
347 DEFINE_GSUBR ("ISceneManager_addCustomSceneNode_ISceneNode", 10, 0, 0,
348 ISceneManager_addCustomSceneNode<scene::ISceneNode*>);
349 DEFINE_GSUBR ("ISceneManager_addOctreeSceneNode_ISceneNode_IAnimatedMesh", 6, 0, 0,
350 (ISceneManager_addOctreeSceneNode<scene::ISceneNode*, scene::IAnimatedMesh*>));
351 DEFINE_GSUBR ("ISceneManager_addOctreeSceneNode_ISceneNode_IMesh", 6, 0, 0,
352 (ISceneManager_addOctreeSceneNode<scene::ISceneNode*, scene::IMesh*>));
353 DEFINE_GSUBR ("ISceneManager_addSphereSceneNode_ISceneNode", 8, 0, 0,
354 ISceneManager_addSphereSceneNode<scene::ISceneNode*>);
355 DEFINE_GSUBR ("ISceneManager_createFlyCircleAnimator", 7, 0, 0,
356 ISceneManager_createFlyCircleAnimator);
357 DEFINE_GSUBR ("ISceneManager_createFlyStraightAnimator", 6, 0, 0,
358 ISceneManager_createFlyStraightAnimator);
359 DEFINE_GSUBR ("ISceneManager_createRotationAnimator", 2, 0, 0,
360 ISceneManager_createRotationAnimator);
361 DEFINE_GSUBR ("ISceneManager_drawAll", 1, 0, 0, ISceneManager_drawAll);
362 DEFINE_GSUBR ("ISceneManager_getMesh", 2, 0, 0, ISceneManager_getMesh);
363 DEFINE_GSUBR ("ISceneManager_getRootSceneNode", 1, 0, 0, ISceneManager_getRootSceneNode);