1 | // Copyright (C) 2015 ChaosForge Ltd
|
---|
2 | // http://chaosforge.org/
|
---|
3 | //
|
---|
4 | // This file is part of Nova libraries.
|
---|
5 | // For conditions of distribution and use, see copying.txt file in root folder.
|
---|
6 |
|
---|
7 | #include "nv/rocket/rocket_interface.hh"
|
---|
8 |
|
---|
9 | #include <nv/interface/context.hh>
|
---|
10 | #include <nv/gl/gl_device.hh>
|
---|
11 | #include <nv/core/time.hh>
|
---|
12 | #include <Rocket/Core.h>
|
---|
13 | #include <Rocket/Debugger/Debugger.h>
|
---|
14 |
|
---|
15 |
|
---|
16 | class rocket_c_file_interface : public Rocket::Core::FileInterface
|
---|
17 | {
|
---|
18 | public:
|
---|
19 | rocket_c_file_interface( const Rocket::Core::String& root ) : root( root ) {}
|
---|
20 | virtual ~rocket_c_file_interface() {}
|
---|
21 | virtual Rocket::Core::FileHandle Open( const Rocket::Core::String& path );
|
---|
22 | virtual void Close( Rocket::Core::FileHandle file );
|
---|
23 | virtual size_t Read( void* buffer, size_t size, Rocket::Core::FileHandle file );
|
---|
24 | virtual bool Seek( Rocket::Core::FileHandle file, long offset, int origin );
|
---|
25 | virtual size_t Tell( Rocket::Core::FileHandle file );
|
---|
26 | private:
|
---|
27 | Rocket::Core::String root;
|
---|
28 | };
|
---|
29 |
|
---|
30 | class rocket_sdl2_system_interface : public Rocket::Core::SystemInterface
|
---|
31 | {
|
---|
32 | public:
|
---|
33 | float GetElapsedTime();
|
---|
34 | bool LogMessage( Rocket::Core::Log::Type type, const Rocket::Core::String& message );
|
---|
35 | };
|
---|
36 |
|
---|
37 | class rocket_sdl2_render_interface : public Rocket::Core::RenderInterface
|
---|
38 | {
|
---|
39 | public:
|
---|
40 | rocket_sdl2_render_interface( nv::context* context );
|
---|
41 |
|
---|
42 | /// Called by Rocket when it wants to render geometry that it does not wish to optimise.
|
---|
43 | virtual void RenderGeometry( Rocket::Core::Vertex* vertices, int num_vertices, int* indices, int num_indices, Rocket::Core::TextureHandle texture, const Rocket::Core::Vector2f& translation );
|
---|
44 | /// Called by Rocket when it wants to enable or disable scissoring to clip content.
|
---|
45 | virtual void EnableScissorRegion( bool enable );
|
---|
46 | /// Called by Rocket when it wants to change the scissor region.
|
---|
47 | virtual void SetScissorRegion( int x, int y, int width, int height );
|
---|
48 |
|
---|
49 | /// Called by Rocket when a texture is required by the library.
|
---|
50 | virtual bool LoadTexture( Rocket::Core::TextureHandle& texture_handle, Rocket::Core::Vector2i& texture_dimensions, const Rocket::Core::String& source );
|
---|
51 | /// Called by Rocket when a texture is required to be built from an internally-generated sequence of pixels.
|
---|
52 | virtual bool GenerateTexture( Rocket::Core::TextureHandle& texture_handle, const Rocket::Core::byte* source, const Rocket::Core::Vector2i& source_dimensions );
|
---|
53 | /// Called by Rocket when a loaded texture is no longer required.
|
---|
54 | virtual void ReleaseTexture( Rocket::Core::TextureHandle texture_handle );
|
---|
55 | private:
|
---|
56 | nv::device* m_device;
|
---|
57 | nv::context* m_context;
|
---|
58 | nv::program m_program;
|
---|
59 | nv::scene_state m_state;
|
---|
60 | nv::render_state m_rstate;
|
---|
61 | };
|
---|
62 |
|
---|
63 |
|
---|
64 | static const char *rocket_vertex_shader = R"(
|
---|
65 | #version 120
|
---|
66 | attribute vec2 nv_position;
|
---|
67 | attribute vec2 nv_texcoord;
|
---|
68 | attribute vec4 nv_color;
|
---|
69 | varying vec4 v_color;
|
---|
70 | varying vec2 v_texcoord;
|
---|
71 | uniform mat4 nv_m_projection;
|
---|
72 | uniform mat4 nv_m_model;
|
---|
73 | uniform vec2 texsize;
|
---|
74 | void main(void)
|
---|
75 | {
|
---|
76 | gl_Position = nv_m_projection * nv_m_model * vec4(nv_position.x, nv_position.y, 0.0, 1.0);
|
---|
77 | v_texcoord = nv_texcoord; // / texsize;
|
---|
78 | v_color = nv_color / 256;
|
---|
79 | }
|
---|
80 | )";
|
---|
81 |
|
---|
82 | static const char *rocket_fragment_shader = R"(
|
---|
83 | #version 120
|
---|
84 | varying vec4 v_color;
|
---|
85 | varying vec2 v_texcoord;
|
---|
86 | uniform sampler2D nv_t_diffuse;
|
---|
87 | void main(void)
|
---|
88 | {
|
---|
89 | vec4 tex_color = texture2D( nv_t_diffuse, v_texcoord );
|
---|
90 |
|
---|
91 | gl_FragColor = tex_color * v_color;
|
---|
92 | }
|
---|
93 | )";
|
---|
94 |
|
---|
95 | Rocket::Core::FileHandle rocket_c_file_interface::Open( const Rocket::Core::String& path )
|
---|
96 | {
|
---|
97 | // Attempt to open the file relative to the application's root.
|
---|
98 | FILE* fp = fopen( ( root + path ).CString(), "rb" );
|
---|
99 | if ( fp != NULL )
|
---|
100 | return ( Rocket::Core::FileHandle ) fp;
|
---|
101 |
|
---|
102 | // Attempt to open the file relative to the current working directory.
|
---|
103 | fp = fopen( path.CString(), "rb" );
|
---|
104 | return ( Rocket::Core::FileHandle ) fp;
|
---|
105 | }
|
---|
106 |
|
---|
107 | void rocket_c_file_interface::Close( Rocket::Core::FileHandle file )
|
---|
108 | {
|
---|
109 | fclose( (FILE*)file );
|
---|
110 | }
|
---|
111 |
|
---|
112 | size_t rocket_c_file_interface::Read( void* buffer, size_t size, Rocket::Core::FileHandle file )
|
---|
113 | {
|
---|
114 | return fread( buffer, 1, size, (FILE*)file );
|
---|
115 | }
|
---|
116 |
|
---|
117 | bool rocket_c_file_interface::Seek( Rocket::Core::FileHandle file, long offset, int origin )
|
---|
118 | {
|
---|
119 | return fseek( (FILE*)file, offset, origin ) == 0;
|
---|
120 | }
|
---|
121 |
|
---|
122 | size_t rocket_c_file_interface::Tell( Rocket::Core::FileHandle file )
|
---|
123 | {
|
---|
124 | return ftell( (FILE*)file );
|
---|
125 | }
|
---|
126 |
|
---|
127 | float rocket_sdl2_system_interface::GetElapsedTime()
|
---|
128 | {
|
---|
129 | return nv::get_ticks() / 1000;
|
---|
130 | }
|
---|
131 |
|
---|
132 | bool rocket_sdl2_system_interface::LogMessage( Rocket::Core::Log::Type type, const Rocket::Core::String& message )
|
---|
133 | {
|
---|
134 | switch ( type )
|
---|
135 | {
|
---|
136 | case Rocket::Core::Log::LT_ALWAYS: NV_LOG( nv::LOG_NOTICE, message.CString() ); break;
|
---|
137 | case Rocket::Core::Log::LT_ERROR: NV_LOG( nv::LOG_ERROR, message.CString() ); break;
|
---|
138 | case Rocket::Core::Log::LT_ASSERT: NV_LOG( nv::LOG_CRITICAL, message.CString() ); break;
|
---|
139 | case Rocket::Core::Log::LT_WARNING: NV_LOG( nv::LOG_WARNING, message.CString() ); break;
|
---|
140 | case Rocket::Core::Log::LT_INFO: NV_LOG( nv::LOG_INFO, message.CString() ); break;
|
---|
141 | case Rocket::Core::Log::LT_DEBUG: NV_LOG( nv::LOG_DEBUG, message.CString() ); break;
|
---|
142 | case Rocket::Core::Log::LT_MAX: break;
|
---|
143 | };
|
---|
144 |
|
---|
145 | return true;
|
---|
146 | }
|
---|
147 |
|
---|
148 | struct rocket_vertex
|
---|
149 | {
|
---|
150 | nv::vec2 position;
|
---|
151 | nv::u8vec4 color;
|
---|
152 | nv::vec2 texcoord;
|
---|
153 | };
|
---|
154 |
|
---|
155 |
|
---|
156 | union texture_handle_convert
|
---|
157 | {
|
---|
158 | Rocket::Core::TextureHandle th;
|
---|
159 | struct
|
---|
160 | {
|
---|
161 | nv::uint16 index;
|
---|
162 | nv::uint16 counter;
|
---|
163 | };
|
---|
164 | };
|
---|
165 |
|
---|
166 | rocket_sdl2_render_interface::rocket_sdl2_render_interface( nv::context* context )
|
---|
167 | {
|
---|
168 | m_context = context;
|
---|
169 | m_device = m_context->get_device();
|
---|
170 | m_rstate.depth_test.enabled = false;
|
---|
171 | m_rstate.culling.enabled = false;
|
---|
172 | m_rstate.blending.enabled = true;
|
---|
173 | m_rstate.blending.src_rgb_factor = nv::blending::SRC_ALPHA;
|
---|
174 | m_rstate.blending.dst_rgb_factor = nv::blending::ONE_MINUS_SRC_ALPHA;
|
---|
175 | m_rstate.blending.src_alpha_factor = nv::blending::SRC_ALPHA;
|
---|
176 | m_rstate.blending.dst_alpha_factor = nv::blending::ONE_MINUS_SRC_ALPHA;
|
---|
177 |
|
---|
178 | m_program = m_device->create_program( rocket_vertex_shader, rocket_fragment_shader );
|
---|
179 |
|
---|
180 | m_state.get_camera().set_ortho( 0.0f, float( 1024 ), float( 728 ), 0.0f );
|
---|
181 | }
|
---|
182 |
|
---|
183 | void rocket_sdl2_render_interface::EnableScissorRegion( bool enable )
|
---|
184 | {
|
---|
185 | m_rstate.scissor_test.enabled = enable;
|
---|
186 | }
|
---|
187 |
|
---|
188 | void rocket_sdl2_render_interface::SetScissorRegion( int x, int y, int width, int height )
|
---|
189 | {
|
---|
190 | m_rstate.scissor_test.pos.x = x;
|
---|
191 | m_rstate.scissor_test.pos.y = y;
|
---|
192 | m_rstate.scissor_test.dim.x = width;
|
---|
193 | m_rstate.scissor_test.pos.y = height;
|
---|
194 | }
|
---|
195 |
|
---|
196 | bool rocket_sdl2_render_interface::LoadTexture( Rocket::Core::TextureHandle& texture_handle, Rocket::Core::Vector2i& texture_dimensions, const Rocket::Core::String& source )
|
---|
197 | {
|
---|
198 | Rocket::Core::FileInterface* file_interface = Rocket::Core::GetFileInterface();
|
---|
199 | Rocket::Core::FileHandle file_handle = file_interface->Open( source );
|
---|
200 | if ( !file_handle )
|
---|
201 | return false;
|
---|
202 |
|
---|
203 | file_interface->Seek( file_handle, 0, SEEK_END );
|
---|
204 | size_t buffer_size = file_interface->Tell( file_handle );
|
---|
205 | file_interface->Seek( file_handle, 0, SEEK_SET );
|
---|
206 |
|
---|
207 | nv::uint8* buffer = new nv::uint8[buffer_size];
|
---|
208 | file_interface->Read( buffer, buffer_size, file_handle );
|
---|
209 | file_interface->Close( file_handle );
|
---|
210 |
|
---|
211 | Rocket::Core::String ext = source.Substring( source.Length() - 3, 3 ).ToLower();
|
---|
212 |
|
---|
213 | nv::sampler sampler( nv::sampler::LINEAR, nv::sampler::REPEAT );
|
---|
214 | nv::image_data* data = m_device->create_image_data( buffer, buffer_size );
|
---|
215 | nv::image_format iformat( nv::RGBA, nv::UBYTE );
|
---|
216 | if ( ext == "tga" ) iformat.format = nv::BGRA;
|
---|
217 |
|
---|
218 | nv::texture tex = m_device->create_texture( data->get_size(), iformat, sampler, (void*)data->get_data() );
|
---|
219 | texture_dimensions.x = data->get_size().x;
|
---|
220 | texture_dimensions.y = data->get_size().y;
|
---|
221 | delete data;
|
---|
222 |
|
---|
223 | typedef nv::handle_operator< nv::texture > op;
|
---|
224 | texture_handle_convert thc;
|
---|
225 | thc.index = op::get_index( tex );
|
---|
226 | thc.counter = op::get_counter( tex );
|
---|
227 | texture_handle = thc.th;
|
---|
228 | NV_LOG( nv::LOG_DEBUG, "load " << source.CString() << " as " << thc.index << "," << thc.counter );
|
---|
229 | return true;
|
---|
230 | }
|
---|
231 |
|
---|
232 | bool rocket_sdl2_render_interface::GenerateTexture( Rocket::Core::TextureHandle& texture_handle, const Rocket::Core::byte* source, const Rocket::Core::Vector2i& source_dimensions )
|
---|
233 | {
|
---|
234 | nv::sampler sampler( nv::sampler::LINEAR, nv::sampler::REPEAT );
|
---|
235 | nv::texture tex = m_device->create_texture( nv::ivec2( source_dimensions.x, source_dimensions.y ), nv::image_format( nv::RGBA, nv::UBYTE ), sampler, (void*)source );
|
---|
236 | typedef nv::handle_operator< nv::texture > op;
|
---|
237 | texture_handle_convert thc;
|
---|
238 | thc.index = op::get_index( tex );
|
---|
239 | thc.counter = op::get_counter( tex );
|
---|
240 | texture_handle = thc.th;
|
---|
241 | return true;
|
---|
242 | }
|
---|
243 |
|
---|
244 | void rocket_sdl2_render_interface::ReleaseTexture( Rocket::Core::TextureHandle texture_handle )
|
---|
245 | {
|
---|
246 | texture_handle_convert thc;
|
---|
247 | thc.th = texture_handle;
|
---|
248 | typedef nv::handle_operator< nv::texture > op;
|
---|
249 | m_device->release( op::create( thc.index, thc.counter ) );
|
---|
250 | }
|
---|
251 |
|
---|
252 |
|
---|
253 | void rocket_sdl2_render_interface::RenderGeometry( Rocket::Core::Vertex* vertices, int num_vertices, int* indices, int num_indices, Rocket::Core::TextureHandle texture, const Rocket::Core::Vector2f& translation )
|
---|
254 | {
|
---|
255 | const nv::texture_info* info = nullptr;
|
---|
256 | if ( texture != 0 )
|
---|
257 | {
|
---|
258 | texture_handle_convert thc;
|
---|
259 | thc.th = texture;
|
---|
260 | typedef nv::handle_operator< nv::texture > op;
|
---|
261 | nv::texture tex( op::create( thc.index, thc.counter ) );
|
---|
262 | m_context->bind( tex, nv::TEX_DIFFUSE );
|
---|
263 | info = m_device->get_texture_info( tex );
|
---|
264 | }
|
---|
265 | else
|
---|
266 | {
|
---|
267 | m_context->bind( nv::texture(), nv::TEX_DIFFUSE );
|
---|
268 | return;
|
---|
269 | }
|
---|
270 |
|
---|
271 | rocket_vertex* rv = (rocket_vertex*)vertices;
|
---|
272 |
|
---|
273 | nv::vertex_array m_va = m_context->create_vertex_array( rv, num_vertices, (unsigned*)indices, num_indices, nv::STATIC_DRAW );
|
---|
274 | //if ( info ) m_device->set_uniform( m_program, "texsize", nv::vec2( info->size ) );
|
---|
275 | m_state.set_model( glm::translate( glm::mat4(), nv::vec3( translation.x, translation.y, 0.0f ) ) );
|
---|
276 | m_context->draw( nv::TRIANGLES, m_rstate, m_state, m_program, m_va, num_indices );
|
---|
277 | m_context->release( m_va );
|
---|
278 |
|
---|
279 | }
|
---|
280 |
|
---|
281 | /*
|
---|
282 | int RocketSDL2SystemInterface::TranslateMouseButton( Uint8 button )
|
---|
283 | {
|
---|
284 | switch ( button )
|
---|
285 | {
|
---|
286 | case SDL_BUTTON_LEFT:
|
---|
287 | return 0;
|
---|
288 | case SDL_BUTTON_RIGHT:
|
---|
289 | return 1;
|
---|
290 | case SDL_BUTTON_MIDDLE:
|
---|
291 | return 2;
|
---|
292 | default:
|
---|
293 | return 3;
|
---|
294 | }
|
---|
295 | }
|
---|
296 |
|
---|
297 | int RocketSDL2SystemInterface::GetKeyModifiers()
|
---|
298 | {
|
---|
299 | SDL_Keymod sdlMods = SDL_GetModState();
|
---|
300 |
|
---|
301 | int retval = 0;
|
---|
302 |
|
---|
303 | if ( sdlMods & KMOD_CTRL )
|
---|
304 | retval |= Rocket::Core::Input::KM_CTRL;
|
---|
305 |
|
---|
306 | if ( sdlMods & KMOD_SHIFT )
|
---|
307 | retval |= Rocket::Core::Input::KM_SHIFT;
|
---|
308 |
|
---|
309 | if ( sdlMods & KMOD_ALT )
|
---|
310 | retval |= Rocket::Core::Input::KM_ALT;
|
---|
311 |
|
---|
312 | return retval;
|
---|
313 | }
|
---|
314 |
|
---|
315 | */
|
---|
316 |
|
---|
317 | int rocket_get_key_modifiers()
|
---|
318 | {
|
---|
319 | return 0;
|
---|
320 | }
|
---|
321 |
|
---|
322 | int rocket_get_mouse_buttons( const nv::mouse_button_event& button )
|
---|
323 | {
|
---|
324 | return 0;
|
---|
325 | }
|
---|
326 |
|
---|
327 | Rocket::Core::Input::KeyIdentifier rocket_translate_key( const nv::key_event& key )
|
---|
328 | {
|
---|
329 | using namespace Rocket::Core::Input;
|
---|
330 |
|
---|
331 | switch ( key.code )
|
---|
332 | {
|
---|
333 | case nv::KEY_NONE : return KI_UNKNOWN;
|
---|
334 | case nv::KEY_SPACE : return KI_SPACE;
|
---|
335 | case nv::KEY_0: return KI_0;
|
---|
336 | case nv::KEY_1: return KI_1;
|
---|
337 | case nv::KEY_2: return KI_2;
|
---|
338 | case nv::KEY_3: return KI_3;
|
---|
339 | case nv::KEY_4: return KI_4;
|
---|
340 | case nv::KEY_5: return KI_5;
|
---|
341 | case nv::KEY_6: return KI_6;
|
---|
342 | case nv::KEY_7: return KI_7;
|
---|
343 | case nv::KEY_8: return KI_8;
|
---|
344 | case nv::KEY_9: return KI_9;
|
---|
345 | case nv::KEY_A: return KI_A;
|
---|
346 | case nv::KEY_B: return KI_B;
|
---|
347 | case nv::KEY_C: return KI_C;
|
---|
348 | case nv::KEY_D: return KI_D;
|
---|
349 | case nv::KEY_E: return KI_E;
|
---|
350 | case nv::KEY_F: return KI_F;
|
---|
351 | case nv::KEY_G: return KI_G;
|
---|
352 | case nv::KEY_H: return KI_H;
|
---|
353 | case nv::KEY_I: return KI_I;
|
---|
354 | case nv::KEY_J: return KI_J;
|
---|
355 | case nv::KEY_K: return KI_K;
|
---|
356 | case nv::KEY_L: return KI_L;
|
---|
357 | case nv::KEY_M: return KI_M;
|
---|
358 | case nv::KEY_N: return KI_N;
|
---|
359 | case nv::KEY_O: return KI_O;
|
---|
360 | case nv::KEY_P: return KI_P;
|
---|
361 | case nv::KEY_Q: return KI_Q;
|
---|
362 | case nv::KEY_R: return KI_R;
|
---|
363 | case nv::KEY_S: return KI_S;
|
---|
364 | case nv::KEY_T: return KI_T;
|
---|
365 | case nv::KEY_U: return KI_U;
|
---|
366 | case nv::KEY_V: return KI_V;
|
---|
367 | case nv::KEY_W: return KI_W;
|
---|
368 | case nv::KEY_X: return KI_X;
|
---|
369 | case nv::KEY_Y: return KI_Y;
|
---|
370 | case nv::KEY_Z: return KI_Z;
|
---|
371 | case nv::KEY_SCOLON:return KI_OEM_1;
|
---|
372 | // case nv::KEY_PLUS:return KI_OEM_PLUS;
|
---|
373 | case nv::KEY_COMMA:return KI_OEM_COMMA;
|
---|
374 | case nv::KEY_MINUS:return KI_OEM_MINUS;
|
---|
375 | case nv::KEY_PERIOD:return KI_OEM_PERIOD;
|
---|
376 | case nv::KEY_SLASH:return KI_OEM_2;
|
---|
377 | case nv::KEY_BQUOTE:return KI_OEM_3;
|
---|
378 | case nv::KEY_LBRACKET:return KI_OEM_4;
|
---|
379 | case nv::KEY_BSLASH:return KI_OEM_5;
|
---|
380 | case nv::KEY_RBRACKET:return KI_OEM_6;
|
---|
381 | // case nv::KEY_QUOTEDBL:return KI_OEM_7;
|
---|
382 | // case nv::KEY_KP_0:return KI_NUMPAD0;
|
---|
383 | // case nv::KEY_KP_1:return KI_NUMPAD1;
|
---|
384 | // case nv::KEY_KP_2:return KI_NUMPAD2;
|
---|
385 | // case nv::KEY_KP_3:return KI_NUMPAD3;
|
---|
386 | // case nv::KEY_KP_4:return KI_NUMPAD4;
|
---|
387 | // case nv::KEY_KP_5:return KI_NUMPAD5;
|
---|
388 | // case nv::KEY_KP_6:return KI_NUMPAD6;
|
---|
389 | // case nv::KEY_KP_7:return KI_NUMPAD7;
|
---|
390 | // case nv::KEY_KP_8:return KI_NUMPAD8;
|
---|
391 | // case nv::KEY_KP_9:return KI_NUMPAD9;
|
---|
392 | // case nv::KEY_KP_ENTER:return KI_NUMPADENTER;
|
---|
393 | // case nv::KEY_KP_MULTIPLY:return KI_MULTIPLY;
|
---|
394 | // case nv::KEY_KP_PLUS:return KI_ADD;
|
---|
395 | // case nv::KEY_KP_MINUS: return KI_SUBTRACT;
|
---|
396 | // case nv::KEY_KP_PERIOD: return KI_DECIMAL;
|
---|
397 | // case nv::KEY_KP_DIVIDE: return KI_DIVIDE;
|
---|
398 | // case nv::KEY_KP_EQUALS: return KI_OEM_NEC_EQUAL;
|
---|
399 | case nv::KEY_BACK : return KI_BACK;
|
---|
400 | case nv::KEY_TAB : return KI_TAB;
|
---|
401 | // case nv::KEY_CLEAR : return KI_CLEAR;
|
---|
402 | case nv::KEY_ENTER : return KI_RETURN;
|
---|
403 | // case nv::KEY_PAUSE : return KI_PAUSE;
|
---|
404 | // case nv::KEY_CAPSLOCK: return KI_CAPITAL;
|
---|
405 | case nv::KEY_PGUP : return KI_PRIOR;
|
---|
406 | case nv::KEY_PGDOWN: return KI_NEXT;
|
---|
407 | case nv::KEY_END : return KI_END;
|
---|
408 | case nv::KEY_HOME : return KI_HOME;
|
---|
409 | case nv::KEY_LEFT : return KI_LEFT;
|
---|
410 | case nv::KEY_UP : return KI_UP;
|
---|
411 | case nv::KEY_RIGHT : return KI_RIGHT;
|
---|
412 | case nv::KEY_DOWN : return KI_DOWN;
|
---|
413 | case nv::KEY_INSERT: return KI_INSERT;
|
---|
414 | case nv::KEY_DELETE: return KI_DELETE;
|
---|
415 | case nv::KEY_F1 : return KI_F1;
|
---|
416 | case nv::KEY_F2 : return KI_F2;
|
---|
417 | case nv::KEY_F3 : return KI_F3;
|
---|
418 | case nv::KEY_F4 : return KI_F4;
|
---|
419 | case nv::KEY_F5 : return KI_F5;
|
---|
420 | case nv::KEY_F6 : return KI_F6;
|
---|
421 | case nv::KEY_F7 : return KI_F7;
|
---|
422 | case nv::KEY_F8 : return KI_F8;
|
---|
423 | case nv::KEY_F9 : return KI_F9;
|
---|
424 | case nv::KEY_F10 : return KI_F10;
|
---|
425 | case nv::KEY_F11 : return KI_F11;
|
---|
426 | case nv::KEY_F12 : return KI_F12;
|
---|
427 | // case nv::KEY_F13 : return KI_F13;
|
---|
428 | // case nv::KEY_F14 : return KI_F14;
|
---|
429 | // case nv::KEY_F15 : return KI_F15;
|
---|
430 | // case nv::KEY_NUMLOCKCLEAR : return KI_NUMLOCK;
|
---|
431 | // case nv::KEY_SCROLLLOCK : return KI_SCROLL;
|
---|
432 | // case nv::KEY_LSHIFT : return KI_LSHIFT;
|
---|
433 | // case nv::KEY_RSHIFT : return KI_RSHIFT;
|
---|
434 | // case nv::KEY_LCTRL : return KI_LCONTROL;
|
---|
435 | // case nv::KEY_RCTRL : return KI_RCONTROL;
|
---|
436 | // case nv::KEY_LALT : return KI_LMENU;
|
---|
437 | // case nv::KEY_RALT : return KI_RMENU;
|
---|
438 | // case nv::KEY_LGUI : return KI_LMETA;
|
---|
439 | // case nv::KEY_RGUI : return KI_RMETA;
|
---|
440 | // case nv::KEY_LSUPER : return KI_LWIN;
|
---|
441 | // case nv::KEY_RSUPER : return KI_RWIN;
|
---|
442 | default: return KI_UNKNOWN;
|
---|
443 | }
|
---|
444 |
|
---|
445 | return KI_UNKNOWN;
|
---|
446 | }
|
---|
447 |
|
---|
448 | static rocket_sdl2_render_interface* s_render_interface = nullptr;
|
---|
449 | static rocket_sdl2_system_interface* s_system_interface = nullptr;
|
---|
450 | static rocket_c_file_interface* s_file_interface = nullptr;
|
---|
451 |
|
---|
452 | bool nv::rocket_event( void* context, nv::io_event& event )
|
---|
453 | {
|
---|
454 | Rocket::Core::Context *Context = ( Rocket::Core::Context * )context;
|
---|
455 | switch ( event.type )
|
---|
456 | {
|
---|
457 | case nv::EV_MOUSE_MOVE :
|
---|
458 | Context->ProcessMouseMove( event.mmove.x, event.mmove.y, rocket_get_key_modifiers() );
|
---|
459 | break;
|
---|
460 | case nv::EV_MOUSE_BUTTON :
|
---|
461 | if ( event.mbutton.pressed )
|
---|
462 | Context->ProcessMouseButtonDown( rocket_get_mouse_buttons( event.mbutton ), rocket_get_key_modifiers() );
|
---|
463 | else
|
---|
464 | Context->ProcessMouseButtonUp( rocket_get_mouse_buttons( event.mbutton ), rocket_get_key_modifiers() );
|
---|
465 | break;
|
---|
466 | case nv::EV_MOUSE_WHEEL:
|
---|
467 | return Context->ProcessMouseWheel( event.mwheel.y, rocket_get_key_modifiers() );
|
---|
468 | case nv::EV_KEY:
|
---|
469 | if (event.key.pressed)
|
---|
470 | {
|
---|
471 | if ( event.key.code == KEY_BQUOTE )
|
---|
472 | {
|
---|
473 | Rocket::Debugger::SetVisible( !Rocket::Debugger::IsVisible() );
|
---|
474 | return true;
|
---|
475 | }
|
---|
476 |
|
---|
477 | return Context->ProcessKeyDown( rocket_translate_key( event.key ) , rocket_get_key_modifiers() );
|
---|
478 | }
|
---|
479 | break;
|
---|
480 | default:
|
---|
481 | break;
|
---|
482 | }
|
---|
483 | return false;
|
---|
484 | }
|
---|
485 |
|
---|
486 | bool nv::rocket_initialize( nv::window* w, const char* assets_root )
|
---|
487 | {
|
---|
488 | s_render_interface = new rocket_sdl2_render_interface( w->get_context() );
|
---|
489 | s_system_interface = new rocket_sdl2_system_interface();
|
---|
490 | s_file_interface = new rocket_c_file_interface( assets_root );
|
---|
491 |
|
---|
492 | Rocket::Core::SetFileInterface( s_file_interface );
|
---|
493 | Rocket::Core::SetRenderInterface( s_render_interface );
|
---|
494 | Rocket::Core::SetSystemInterface( s_system_interface );
|
---|
495 |
|
---|
496 | return Rocket::Core::Initialise();
|
---|
497 | }
|
---|
498 |
|
---|
499 | void nv::rocket_shutdown()
|
---|
500 | {
|
---|
501 | Rocket::Core::Shutdown();
|
---|
502 | delete s_render_interface;
|
---|
503 | delete s_system_interface;
|
---|
504 | delete s_file_interface;
|
---|
505 | }
|
---|