]> git.jsancho.org Git - guile-irrlicht.git/blob - src/scene-node.cpp
50d402b3866031277d9fab2edf9ca143dde2b3a1
[guile-irrlicht.git] / src / scene-node.cpp
1 /* guile-irrlicht --- GNU Guile bindings for Irrlicht Engine
2
3    Copyright (C) 2020 Javier Sancho <jsf@jsancho.org>
4
5    This file is part of guile-irrlicht.
6
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.
11
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.
16
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/>.
20 */
21
22 #include <irrlicht/irrlicht.h>
23 #include <libguile.h>
24
25 #include "animated-mesh-scene-node.h"
26 #include "camera-scene-node.h"
27 #include "gsubr.h"
28 #include "material-flags.h"
29 #include "matrix4.h"
30 #include "mesh-scene-node.h"
31 #include "scene-node.h"
32 #include "scene-node-animator.h"
33 #include "texture.h"
34 #include "vector3d.h"
35 #include "wrapped.h"
36
37 extern "C" {
38
39   void
40   init_scene_node (void)
41   {
42     init_scene_node_type ();
43     DEFINE_GSUBR ("add-animator!", 2, 0, 0, irr_scene_addAnimator);
44     DEFINE_GSUBR ("get-absolute-transformation", 1, 0, 0, irr_scene_getAbsoluteTransformation);
45     DEFINE_GSUBR ("set-material-texture!", 3, 0, 0, irr_scene_setMaterialTexture);
46     DEFINE_GSUBR ("set-rotation!", 2, 0, 0, irr_scene_setRotation);
47     DEFINE_GSUBR ("set-scale!", 2, 0, 0, irr_scene_setScale);
48   }
49
50   DEFINE_WRAPPED_TYPE (irr::scene::ISceneNode*, "scene-node",
51                        init_scene_node_type, scene_node_p,
52                        wrap_scene_node, unwrap_scene_node);
53
54   SCM
55   irr_scene_addAnimator (SCM wrapped_scene_node,
56                          SCM animator)
57   {
58 #define ADD_ANIMATOR(NODE) NODE->addAnimator (unwrap_scene_node_animator (animator));
59
60     if (animated_mesh_scene_node_p (wrapped_scene_node))
61       {
62         ADD_ANIMATOR (unwrap_animated_mesh_scene_node (wrapped_scene_node));
63       }
64     else if (mesh_scene_node_p (wrapped_scene_node))
65       {
66         ADD_ANIMATOR (unwrap_mesh_scene_node (wrapped_scene_node));
67       }
68     else if (scene_node_p (wrapped_scene_node))
69       {
70         ADD_ANIMATOR (unwrap_scene_node (wrapped_scene_node));
71       }
72     else
73       {
74         scm_error (scm_arg_type_key, NULL, "Cannot add animator flag to object: ~S",
75                    scm_list_1 (wrapped_scene_node), scm_list_1 (wrapped_scene_node));
76       }
77
78     return SCM_UNSPECIFIED;
79   }
80
81   SCM
82   irr_scene_getAbsoluteTransformation (SCM wrapped_scene_node)
83   {
84     irr::scene::ISceneNode* node = unwrap_scene_node (wrapped_scene_node);
85     return scm_from_matrix4 (node->getAbsoluteTransformation ());
86   }
87
88   SCM
89   irr_scene_ISceneNode_setMaterialFlag (SCM wrapped_scene_node,
90                                         SCM flag,
91                                         SCM newvalue)
92   {
93 #define SET_MATERIAL_FLAG(NODE) NODE->setMaterialFlag (scm_to_material_flag (flag), \
94                                                        scm_to_bool (newvalue));
95
96     if (animated_mesh_scene_node_p (wrapped_scene_node))
97       {
98         SET_MATERIAL_FLAG (unwrap_animated_mesh_scene_node (wrapped_scene_node));
99       }
100     else if (mesh_scene_node_p (wrapped_scene_node))
101       {
102         SET_MATERIAL_FLAG (unwrap_mesh_scene_node (wrapped_scene_node));
103       }
104     else if (scene_node_p (wrapped_scene_node))
105       {
106         SET_MATERIAL_FLAG (unwrap_scene_node (wrapped_scene_node));
107       }
108     else
109       {
110         scm_error (scm_arg_type_key, NULL, "Cannot set material flag to object: ~S",
111                    scm_list_1 (wrapped_scene_node), scm_list_1 (wrapped_scene_node));
112       }
113
114     return SCM_UNSPECIFIED;
115   }
116
117   SCM
118   irr_scene_setMaterialTexture (SCM wrapped_scene_node,
119                                 SCM texture_layer,
120                                 SCM texture)
121   {
122 #define SET_MATERIAL_TEXTURE(NODE) NODE->setMaterialTexture (scm_to_uint32 (texture_layer), \
123                                                              unwrap_texture (texture));
124
125     if (animated_mesh_scene_node_p (wrapped_scene_node))
126       {
127         SET_MATERIAL_TEXTURE (unwrap_animated_mesh_scene_node (wrapped_scene_node));
128       }
129     else if (mesh_scene_node_p (wrapped_scene_node))
130       {
131         SET_MATERIAL_TEXTURE (unwrap_mesh_scene_node (wrapped_scene_node));
132       }
133     else if (scene_node_p (wrapped_scene_node))
134       {
135         SET_MATERIAL_TEXTURE (unwrap_scene_node (wrapped_scene_node));
136       }
137     else
138       {
139         scm_error (scm_arg_type_key, NULL, "Cannot set material texture to object: ~S",
140                    scm_list_1 (wrapped_scene_node), scm_list_1 (wrapped_scene_node));
141       }
142
143     return SCM_UNSPECIFIED;
144   }
145
146   SCM
147   irr_scene_setPosition (SCM wrapped_scene_node,
148                          SCM position)
149   {
150 #define SET_POSITION(NODE) NODE->setPosition (scm_to_vector3df (position));
151
152     if (scene_node_p (wrapped_scene_node))
153       {
154         SET_POSITION (unwrap_scene_node (wrapped_scene_node));
155       }
156     else if (mesh_scene_node_p (wrapped_scene_node))
157       {
158         SET_POSITION (unwrap_mesh_scene_node (wrapped_scene_node));
159       }
160     else
161       {
162         scm_error (scm_arg_type_key, NULL, "Cannot set position to object: ~S",
163                    scm_list_1 (wrapped_scene_node), scm_list_1 (wrapped_scene_node));
164       }
165
166     return SCM_UNSPECIFIED;
167   }
168
169   SCM
170   irr_scene_setRotation (SCM wrapped_scene_node,
171                          SCM rotation)
172   {
173 #define SET_ROTATION(NODE) NODE->setRotation (scm_to_vector3df (rotation));
174
175     if (animated_mesh_scene_node_p (wrapped_scene_node))
176       {
177         SET_ROTATION (unwrap_animated_mesh_scene_node (wrapped_scene_node));
178       }
179     else if (camera_scene_node_p (wrapped_scene_node))
180       {
181         SET_ROTATION (unwrap_camera_scene_node (wrapped_scene_node));
182       }
183     else if (scene_node_p (wrapped_scene_node))
184       {
185         SET_ROTATION (unwrap_scene_node (wrapped_scene_node));
186       }
187     else
188       {
189         scm_error (scm_arg_type_key, NULL, "Cannot set rotation to object: ~S",
190                    scm_list_1 (wrapped_scene_node), scm_list_1 (wrapped_scene_node));
191       }
192
193     return SCM_UNSPECIFIED;
194   }
195
196   SCM
197   irr_scene_setScale (SCM wrapped_scene_node,
198                       SCM scale)
199   {
200 #define SET_SCALE(NODE) NODE->setScale (scm_to_vector3df (scale));
201
202     if (animated_mesh_scene_node_p (wrapped_scene_node))
203       {
204         SET_SCALE (unwrap_animated_mesh_scene_node (wrapped_scene_node));
205       }
206     else if (scene_node_p (wrapped_scene_node))
207       {
208         SET_SCALE (unwrap_scene_node (wrapped_scene_node));
209       }
210     else
211       {
212         scm_error (scm_arg_type_key, NULL, "Cannot set scale to object: ~S",
213                    scm_list_1 (wrapped_scene_node), scm_list_1 (wrapped_scene_node));
214       }
215
216     return SCM_UNSPECIFIED;
217   }
218
219 }