]> git.jsancho.org Git - guile-irrlicht.git/blob - src/video-driver.cpp
add-file-archive! get-file-system get-name
[guile-irrlicht.git] / src / video-driver.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 #include "color.h"
25 #include "gsubr.h"
26 #include "matrix4.h"
27 #include "primitive-types.h"
28 #include "rect.h"
29 #include "vertex3d.h"
30 #include "video-driver.h"
31 #include "wchar.h"
32 #include "wrapped.h"
33
34 using namespace irr;
35
36 SCM
37 IVideoDriver_beginScene (SCM video_driver,
38                          SCM back_buffer,
39                          SCM z_buffer,
40                          SCM color,
41                          SCM video_data,
42                          SCM source_rect)
43 {
44   video::IVideoDriver* driver = (video::IVideoDriver*) scm_to_irr_pointer (video_driver);
45
46   // Source rect
47   core::rect<s32>* sourceRectAddress = 0;
48   if (!scm_is_false (source_rect))
49     {
50       core::rect<s32> sourceRect = scm_to_rect_s32 (source_rect);
51       sourceRectAddress = &sourceRect;
52     }
53
54   return scm_from_bool (driver->beginScene (scm_to_bool (back_buffer),
55                                             scm_to_bool (z_buffer),
56                                             scm_to_color (color),
57                                             video::SExposedVideoData (),
58                                             sourceRectAddress));
59 }
60
61 SCM
62 IVideoDriver_drawVertexPrimitiveList (SCM video_driver,
63                                       SCM vertices,
64                                       SCM indices,
65                                       SCM v_type,
66                                       SCM p_type)
67 {
68   // Build vertex array
69   u32 vertex_count = scm_to_uint32 (scm_length (vertices));
70   video::S3DVertex s3d_vertices [vertex_count];
71   for (int i = 0; i < vertex_count; i++)
72     {
73       video::S3DVertex* vertex =
74         (video::S3DVertex*) scm_to_irr_pointer (scm_list_ref (vertices, scm_from_int (i)));
75       s3d_vertices[i] = video::S3DVertex (vertex->Pos,
76                                           vertex->Normal,
77                                           vertex->Color,
78                                           vertex->TCoords);
79     }
80
81   // Build index array
82   u32 index_count = scm_to_uint32 (scm_length (indices));
83   SCM flat_indices = scm_apply_0 (scm_eval_string (scm_from_utf8_string ("append")),
84                                   indices);
85   int flat_length = scm_to_int (scm_length (flat_indices));
86   u32 c_indices [flat_length];
87   for (int i = 0; i < flat_length; i++)
88     {
89       c_indices[i] = scm_to_uint32 (scm_list_ref (flat_indices, scm_from_int (i)));
90     }
91
92   // Draw vertices
93   video::IVideoDriver* driver = (video::IVideoDriver*) scm_to_irr_pointer (video_driver);
94   driver->drawVertexPrimitiveList (&s3d_vertices[0],
95                                    vertex_count,
96                                    &c_indices[0],
97                                    index_count,
98                                    scm_to_vertex_type (v_type),
99                                    scm_to_primitive_type (p_type),
100                                    video::EIT_32BIT);
101   return SCM_UNSPECIFIED;
102 }
103
104 SCM
105 IVideoDriver_endScene (SCM video_driver)
106 {
107   video::IVideoDriver* driver = (video::IVideoDriver*) scm_to_irr_pointer (video_driver);
108   return scm_from_bool (driver->endScene ());
109 }
110
111 SCM
112 IVideoDriver_getFPS (SCM video_driver)
113 {
114   video::IVideoDriver* driver = (video::IVideoDriver*) scm_to_irr_pointer (video_driver);
115   return scm_from_int32 (driver->getFPS ());
116 }
117
118 SCM
119 IVideoDriver_getName (SCM video_driver)
120 {
121   video::IVideoDriver* driver = (video::IVideoDriver*) scm_to_irr_pointer (video_driver);
122   return scm_from_wide_char_string (driver->getName ());
123 }
124
125 SCM
126 IVideoDriver_getTexture (SCM video_driver,
127                          SCM filename)
128 {
129   video::IVideoDriver* driver = (video::IVideoDriver*) scm_to_irr_pointer (video_driver);
130   video::ITexture* texture = driver->getTexture (scm_to_utf8_string (filename));
131   return scm_from_pointer ((void*) texture, NULL);
132 }
133
134 SCM
135 IVideoDriver_setMaterial (SCM video_driver,
136                           SCM material)
137 {
138   video::IVideoDriver* driver = (video::IVideoDriver*) scm_to_irr_pointer (video_driver);
139   driver->setMaterial (*((video::SMaterial*) scm_to_irr_pointer (material)));
140   return SCM_UNSPECIFIED;
141 }
142
143 SCM
144 IVideoDriver_setTransform (SCM video_driver,
145                            SCM state,
146                            SCM mat)
147 {
148   video::IVideoDriver* driver = (video::IVideoDriver*) scm_to_irr_pointer (video_driver);
149   driver->setTransform (scm_to_transformation_state (state),
150                         scm_to_matrix4 (mat));
151   return SCM_UNSPECIFIED;
152 }
153
154
155 void
156 init_video_driver (void)
157 {
158   DEFINE_GSUBR ("IVideoDriver_beginScene", 6, 0, 0, IVideoDriver_beginScene);
159   DEFINE_GSUBR ("IVideoDriver_drawVertexPrimitiveList", 5, 0, 1,
160                 IVideoDriver_drawVertexPrimitiveList);
161   DEFINE_GSUBR ("IVideoDriver_endScene", 1, 0, 0, IVideoDriver_endScene);
162   DEFINE_GSUBR ("IVideoDriver_getFPS", 1, 0, 0, IVideoDriver_getFPS);
163   DEFINE_GSUBR ("IVideoDriver_getName", 1, 0, 0, IVideoDriver_getName);
164   DEFINE_GSUBR ("IVideoDriver_getTexture", 2, 0, 0, IVideoDriver_getTexture);
165   DEFINE_GSUBR ("IVideoDriver_setMaterial", 2, 0, 0, IVideoDriver_setMaterial);
166   DEFINE_GSUBR ("IVideoDriver_setTransform", 3, 0, 0, IVideoDriver_setTransform);
167 }
168
169 video::E_TRANSFORMATION_STATE
170 scm_to_transformation_state (SCM transformation_state)
171 {
172   char* state = scm_to_utf8_string (scm_symbol_to_string (transformation_state));
173   if (!strcmp (state, "view"))
174     {
175       return video::ETS_VIEW;
176     }
177   else if (!strcmp (state, "world"))
178     {
179       return video::ETS_WORLD;
180     }
181   else if (!strcmp (state, "projection"))
182     {
183       return video::ETS_PROJECTION;
184     }
185   else if (!strcmp (state, "texture0"))
186     {
187       return video::ETS_TEXTURE_0;
188     }
189   else if (!strcmp (state, "texture1"))
190     {
191       return video::ETS_TEXTURE_1;
192     }
193   else if (!strcmp (state, "texture2"))
194     {
195       return video::ETS_TEXTURE_2;
196     }
197   else if (!strcmp (state, "texture3"))
198     {
199       return video::ETS_TEXTURE_3;
200     }
201   else
202     {
203       scm_error (scm_arg_type_key, NULL, "Wrong transformation state: ~S",
204                  scm_list_1 (transformation_state), scm_list_1 (transformation_state));
205     }
206 }