Merge branch 'n00b87:dev' into dev

This commit is contained in:
arc1tec4
2024-12-11 21:16:40 -07:00
committed by GitHub
18 changed files with 3629 additions and 1448 deletions

View File

@@ -1541,6 +1541,10 @@ ul, #myUL {
<li><a href="drawtilemap.html" target="main">DrawTileMap</a></li> <li><a href="drawtilemap.html" target="main">DrawTileMap</a></li>
<li><a href="deletetileset.html" target="main">DeleteTileSet</a></li>
<li><a href="deletetilemap.html" target="main">DeleteTileMap</a></li>
</ul> </ul>
</li> </li>
@@ -2091,6 +2095,8 @@ ul, #myUL {
<li><a href="getscenefog.html" target="main">GetSceneFog</a></li> <li><a href="getscenefog.html" target="main">GetSceneFog</a></li>
<li><a href="clearscene.html" target="main">ClearScene</a></li>
</ul> </ul>
</li> </li>

View File

@@ -620,6 +620,8 @@ rc_setTile( SETTILE_TILEMAP, SETTILE_TILE, SETTILE_X, SETTILE_Y )
rc_getTile( GETTILE_TILEMAP, GETTILE_X, GETTILE_Y ) rc_getTile( GETTILE_TILEMAP, GETTILE_X, GETTILE_Y )
rc_fillTile( FILLTILE_TILEMAP, FILLTILE_TILE, FILLTILE_X, FILLTILE_Y, FILLTILE_WIDTHINTILES, FILLTILE_HEIGHTINTILES ) rc_fillTile( FILLTILE_TILEMAP, FILLTILE_TILE, FILLTILE_X, FILLTILE_Y, FILLTILE_WIDTHINTILES, FILLTILE_HEIGHTINTILES )
rc_drawTileMap( DRAWTILEMAP_TILEMAP, DRAWTILEMAP_X, DRAWTILEMAP_Y, DRAWTILEMAP_W, DRAWTILEMAP_H, DRAWTILEMAP_OFFSET_X, DRAWTILEMAP_OFFSET_Y ) rc_drawTileMap( DRAWTILEMAP_TILEMAP, DRAWTILEMAP_X, DRAWTILEMAP_Y, DRAWTILEMAP_W, DRAWTILEMAP_H, DRAWTILEMAP_OFFSET_X, DRAWTILEMAP_OFFSET_Y )
rc_deleteTileSet( DELETETILESET_TILESET )
rc_deleteTileMap( DELETETILEMAP_TILEMAP )
rc_loadMesh( LOADMESH_MESH_FILE$ ) rc_loadMesh( LOADMESH_MESH_FILE$ )
rc_deleteMesh( DELETEMESH_MESH ) rc_deleteMesh( DELETEMESH_MESH )
rc_createMesh( ) rc_createMesh( )

View File

@@ -12,3 +12,5 @@ Sub SetTile(tilemap, tile, x, y)
Function GetTile(tilemap, x, y) Function GetTile(tilemap, x, y)
Sub FillTile(tilemap, tile, x, y, widthInTiles, heightInTiles) Sub FillTile(tilemap, tile, x, y, widthInTiles, heightInTiles)
Sub DrawTileMap(tilemap, x, y, w, h, offset_x, offset_y) Sub DrawTileMap(tilemap, x, y, w, h, offset_x, offset_y)
Sub DeleteTileSet(tileset)
Sub DeleteTileMap(tilemap)

View File

@@ -1847,6 +1847,10 @@ void init_embedded_functions()
add_embedded_arg("h", ID_TYPE_NUM); add_embedded_arg("h", ID_TYPE_NUM);
add_embedded_arg("offset_x", ID_TYPE_NUM); add_embedded_arg("offset_x", ID_TYPE_NUM);
add_embedded_arg("offset_y", ID_TYPE_NUM); add_embedded_arg("offset_y", ID_TYPE_NUM);
embed_function("DeleteTileSet", ID_TYPE_SUB);
add_embedded_arg("tileset", ID_TYPE_NUM);
embed_function("DeleteTileMap", ID_TYPE_SUB);
add_embedded_arg("tilemap", ID_TYPE_NUM);
embed_function("LoadMesh", ID_TYPE_FN_NUM); embed_function("LoadMesh", ID_TYPE_FN_NUM);
add_embedded_arg("mesh_file$", ID_TYPE_STR); add_embedded_arg("mesh_file$", ID_TYPE_STR);
embed_function("DeleteMesh", ID_TYPE_SUB); embed_function("DeleteMesh", ID_TYPE_SUB);

View File

@@ -1 +1,43 @@
/home/n00b/projects/rcbasic_alpha3/test_project/main.bas embedded_functions.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/conio.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/arrays.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/math.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/strings.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/stacks.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/files.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/directories.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/datetime.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/window.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/canvas.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/prim2d.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/images.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/keyboard.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/audio.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/joystick.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/gfxconsole.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/text.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/touch.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/network.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/video.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/system.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/matrix.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/process.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/clipboard.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/textedit.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/sprites.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/sprite_animation.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/sprite_physics.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/joint2D.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/tilemaps.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/mesh.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/actor.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/actor_animation.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/actor_physics.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/constraint3D.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/camera.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/scene.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/particles.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/lights.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/terrain.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/water.bas
/home/n00b/Projects/RCBASIC4/rcbasic_build/intern_lib/materials.bas

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -1841,6 +1841,10 @@ add_embedded_arg("w", ID_TYPE_NUM);
add_embedded_arg("h", ID_TYPE_NUM); add_embedded_arg("h", ID_TYPE_NUM);
add_embedded_arg("offset_x", ID_TYPE_NUM); add_embedded_arg("offset_x", ID_TYPE_NUM);
add_embedded_arg("offset_y", ID_TYPE_NUM); add_embedded_arg("offset_y", ID_TYPE_NUM);
embed_function("DeleteTileSet", ID_TYPE_SUB);
add_embedded_arg("tileset", ID_TYPE_NUM);
embed_function("DeleteTileMap", ID_TYPE_SUB);
add_embedded_arg("tilemap", ID_TYPE_NUM);
embed_function("LoadMesh", ID_TYPE_FN_NUM); embed_function("LoadMesh", ID_TYPE_FN_NUM);
add_embedded_arg("mesh_file$", ID_TYPE_STR); add_embedded_arg("mesh_file$", ID_TYPE_STR);
embed_function("DeleteMesh", ID_TYPE_SUB); embed_function("DeleteMesh", ID_TYPE_SUB);

File diff suppressed because it is too large Load Diff

View File

@@ -1892,6 +1892,12 @@ case FN_FillTile: //Sub Procedure
case FN_DrawTileMap: //Sub Procedure case FN_DrawTileMap: //Sub Procedure
rc_drawTileMap( DRAWTILEMAP_TILEMAP, DRAWTILEMAP_X, DRAWTILEMAP_Y, DRAWTILEMAP_W, DRAWTILEMAP_H, DRAWTILEMAP_OFFSET_X, DRAWTILEMAP_OFFSET_Y ); rc_drawTileMap( DRAWTILEMAP_TILEMAP, DRAWTILEMAP_X, DRAWTILEMAP_Y, DRAWTILEMAP_W, DRAWTILEMAP_H, DRAWTILEMAP_OFFSET_X, DRAWTILEMAP_OFFSET_Y );
break; break;
case FN_DeleteTileSet: //Sub Procedure
rc_deleteTileSet( DELETETILESET_TILESET );
break;
case FN_DeleteTileMap: //Sub Procedure
rc_deleteTileMap( DELETETILEMAP_TILEMAP );
break;
case FN_LoadMesh: //Number Function case FN_LoadMesh: //Number Function
rc_push_num(rc_loadMesh( LOADMESH_MESH_FILE$ )); rc_push_num(rc_loadMesh( LOADMESH_MESH_FILE$ ));
break; break;

View File

@@ -56,6 +56,7 @@
#include "rc_audio.h" #include "rc_audio.h"
#include "rc_net.h" #include "rc_net.h"
#include "rc_video.h" #include "rc_video.h"
#include "rc_windowclose.h"
#include "rc_test.h" #include "rc_test.h"
#include <irrtheora.h> #include <irrtheora.h>

File diff suppressed because it is too large Load Diff

View File

@@ -1892,6 +1892,12 @@ case FN_FillTile: //Sub Procedure
case FN_DrawTileMap: //Sub Procedure case FN_DrawTileMap: //Sub Procedure
rc_drawTileMap( DRAWTILEMAP_TILEMAP, DRAWTILEMAP_X, DRAWTILEMAP_Y, DRAWTILEMAP_W, DRAWTILEMAP_H, DRAWTILEMAP_OFFSET_X, DRAWTILEMAP_OFFSET_Y ); rc_drawTileMap( DRAWTILEMAP_TILEMAP, DRAWTILEMAP_X, DRAWTILEMAP_Y, DRAWTILEMAP_W, DRAWTILEMAP_H, DRAWTILEMAP_OFFSET_X, DRAWTILEMAP_OFFSET_Y );
break; break;
case FN_DeleteTileSet: //Sub Procedure
rc_deleteTileSet( DELETETILESET_TILESET );
break;
case FN_DeleteTileMap: //Sub Procedure
rc_deleteTileMap( DELETETILEMAP_TILEMAP );
break;
case FN_LoadMesh: //Number Function case FN_LoadMesh: //Number Function
rc_push_num(rc_loadMesh( LOADMESH_MESH_FILE$ )); rc_push_num(rc_loadMesh( LOADMESH_MESH_FILE$ ));
break; break;

View File

@@ -377,23 +377,6 @@ bool rc_windowOpen(std::string title, int w, int h, bool fullscreen, bool vsync)
return true; return true;
} }
void rc_closeWindow_hw()
{
irrtheora::stopVideo();
irrtheora::deleteVideo();
if(rc_window!=NULL)
SDL_DestroyWindow(rc_window);
rc_window = NULL;
rc_canvas.clear();
rc_canvas_zOrder.clear();
rc_font.clear();
device->drop();
device = NULL;
}
void rc_cls() void rc_cls()
{ {
if(rc_canvas.size()>0) if(rc_canvas.size()>0)
@@ -733,13 +716,8 @@ bool rc_setWindowFullscreen(int flag)
} }
int w, h; //int w, h;
SDL_GetWindowSize(rc_window, &w, &h); //SDL_GetWindowSize(rc_window, &w, &h);
if(flag)
SDL_SetWindowSize(rc_window, w, h);
else
SDL_SetWindowSize(rc_window, rc_window_size.Width, rc_window_size.Height);
//irr::core::dimension2d<u32> win_size(w, h); //irr::core::dimension2d<u32> win_size(w, h);
//device->setWindowSize(win_size); //device->setWindowSize(win_size);
@@ -3232,580 +3210,4 @@ int rc_canvasClip(int x, int y, int w, int h)
return img_id; return img_id;
} }
void rc_preUpdate()
{
//3D World Update
//rc_physics3D.DeltaTime = device->getTimer()->getTime() - rc_physics3D.TimeStamp;
//rc_physics3D.TimeStamp = device->getTimer()->getTime();
rc_physics3D.DeltaTime = SDL_GetTicks() - rc_physics3D.TimeStamp;
rc_physics3D.TimeStamp = SDL_GetTicks();
float fixed_timestep = rc_physics3D.fixedTimeStep < 0 ? rc_physics3D.DeltaTime*0.001f : rc_physics3D.fixedTimeStep;
rc_physics3D.world->stepSimulation(rc_physics3D.DeltaTime*0.001f, rc_physics3D.maxSubSteps, fixed_timestep);
for(int i = 0; i < rc_canvas.size(); i++)
{
if(rc_canvas[i].type != RC_CANVAS_TYPE_SPRITE)
continue;
Uint32 delta_time = SDL_GetTicks() - rc_canvas[i].physics2D.time_stamp;
rc_canvas[i].physics2D.time_stamp = SDL_GetTicks();
float step = rc_canvas[i].physics2D.timeStep < 0 ? (delta_time*0.001f) : rc_canvas[i].physics2D.timeStep;
int32 velocityIterations = rc_canvas[i].physics2D.velocityIterations;
int32 positionIterations = rc_canvas[i].physics2D.positionIterations;
if(rc_canvas[i].physics2D.enabled)
rc_canvas[i].physics2D.world->Step(step, velocityIterations, positionIterations);
}
hasPreUpdated = true;
}
bool rc_update()
{
if(!device->run())
return false;
int win_w = 0, win_h = 0;
double w_scale = 1, h_scale = 1;
if(rc_window)
{
SDL_GetWindowSize(rc_window, &win_w, &win_h);
//std::cout << "size = " << win_w << ", " << win_h << std::endl;
}
w_scale = ( (double)win_w / (double)rc_window_size.Width );
h_scale = ( (double)win_h / (double)rc_window_size.Height );
rc_window_mouse_scale_x = ( (double)rc_window_size.Width / (double)win_w );
rc_window_mouse_scale_y = ( (double)rc_window_size.Height / (double)win_h );
rc_window_zone_scale_x = w_scale;
rc_window_zone_scale_y = h_scale;
SEvent irrevent;
SDL_Event SDL_event;
bool Close = false;
rc_inkey_val = 0;
while ( !Close && SDL_PollEvent( &SDL_event ) )
{
// os::Printer::log("event: ", core::stringc((int)SDL_event.type).c_str(), ELL_INFORMATION); // just for debugging
switch ( SDL_event.type )
{
case SDL_QUIT:
SDL_PumpEvents();
Close = true;
break;
case SDL_MOUSEMOTION:
irrevent.EventType = irr::EET_MOUSE_INPUT_EVENT;
irrevent.MouseInput.Event = irr::EMIE_MOUSE_MOVED;
MouseX = irrevent.MouseInput.X = SDL_event.motion.x;
MouseY = irrevent.MouseInput.Y = SDL_event.motion.y;
MouseXRel = SDL_event.motion.xrel;
MouseYRel = SDL_event.motion.yrel;
irrevent.MouseInput.ButtonStates = MouseButtonStates;
device->postEventFromUser(irrevent);
break;
case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONUP:
irrevent.EventType = irr::EET_MOUSE_INPUT_EVENT;
irrevent.MouseInput.X = SDL_event.button.x;
irrevent.MouseInput.Y = SDL_event.button.y;
irrevent.MouseInput.Event = irr::EMIE_MOUSE_MOVED;
switch(SDL_event.button.button)
{
case SDL_BUTTON_LEFT:
if (SDL_event.type == SDL_MOUSEBUTTONDOWN)
{
irrevent.MouseInput.Event = irr::EMIE_LMOUSE_PRESSED_DOWN;
MouseButtonStates |= irr::EMBSM_LEFT;
}
else
{
irrevent.MouseInput.Event = irr::EMIE_LMOUSE_LEFT_UP;
MouseButtonStates &= !irr::EMBSM_LEFT;
}
//std::cout << "Position = " << SDL_event.button.x << ", " << SDL_event.button.y << std::endl;
//rc_canvas[0].offset.X++;
break;
case SDL_BUTTON_RIGHT:
if (SDL_event.type == SDL_MOUSEBUTTONDOWN)
{
irrevent.MouseInput.Event = irr::EMIE_RMOUSE_PRESSED_DOWN;
MouseButtonStates |= irr::EMBSM_RIGHT;
}
else
{
irrevent.MouseInput.Event = irr::EMIE_RMOUSE_LEFT_UP;
MouseButtonStates &= !irr::EMBSM_RIGHT;
}
//rc_setWindowFullscreen(1);
//rc_canvas[0].offset.X--;
break;
case SDL_BUTTON_MIDDLE:
if (SDL_event.type == SDL_MOUSEBUTTONDOWN)
{
irrevent.MouseInput.Event = irr::EMIE_MMOUSE_PRESSED_DOWN;
MouseButtonStates |= irr::EMBSM_MIDDLE;
}
else
{
irrevent.MouseInput.Event = irr::EMIE_MMOUSE_LEFT_UP;
MouseButtonStates &= !irr::EMBSM_MIDDLE;
}
break;
}
irrevent.MouseInput.ButtonStates = MouseButtonStates;
if (irrevent.MouseInput.Event != irr::EMIE_MOUSE_MOVED)
{
device->postEventFromUser(irrevent);
if ( irrevent.MouseInput.Event >= EMIE_LMOUSE_PRESSED_DOWN && irrevent.MouseInput.Event <= EMIE_MMOUSE_PRESSED_DOWN )
{
u32 clicks = device->checkSuccessiveClicks(irrevent.MouseInput.X, irrevent.MouseInput.Y, irrevent.MouseInput.Event);
if ( clicks == 2 )
{
irrevent.MouseInput.Event = (EMOUSE_INPUT_EVENT)(EMIE_LMOUSE_DOUBLE_CLICK + irrevent.MouseInput.Event-EMIE_LMOUSE_PRESSED_DOWN);
device->postEventFromUser(irrevent);
}
else if ( clicks == 3 )
{
irrevent.MouseInput.Event = (EMOUSE_INPUT_EVENT)(EMIE_LMOUSE_TRIPLE_CLICK + irrevent.MouseInput.Event-EMIE_LMOUSE_PRESSED_DOWN);
device->postEventFromUser(irrevent);
}
}
}
break;
case SDL_MOUSEWHEEL:
irrevent.MouseInput.Event = irr::EMIE_MOUSE_WHEEL;
irrevent.MouseInput.Wheel = SDL_event.wheel.y;
rc_mwheelx = SDL_event.wheel.x;
rc_mwheely = SDL_event.wheel.y;
break;
case SDL_TEXTINPUT:
if(rc_textinput_flag == true)
{
rc_textinput_string += SDL_event.text.text;
}
break;
case SDL_KEYUP:
case SDL_KEYDOWN:
{
SDLKeyMap mp;
mp.SDLKey = SDL_event.key.keysym.sym;
s32 idx = KeyMap.binary_search(mp);
EKEY_CODE key;
if (idx == -1)
key = (EKEY_CODE)0;
else
key = (EKEY_CODE)KeyMap[idx].Win32Key;
irrevent.EventType = irr::EET_KEY_INPUT_EVENT;
irrevent.KeyInput.Char = SDL_event.key.keysym.sym;
irrevent.KeyInput.Key = key;
irrevent.KeyInput.PressedDown = (SDL_event.type == SDL_KEYDOWN);
irrevent.KeyInput.Shift = (SDL_event.key.keysym.mod & KMOD_SHIFT) != 0;
irrevent.KeyInput.Control = (SDL_event.key.keysym.mod & KMOD_CTRL ) != 0;
device->postEventFromUser(irrevent);
}
if(SDL_event.type == SDL_KEYDOWN)
{
if(rc_textinput_flag && SDL_event.key.keysym.sym == SDLK_BACKSPACE && rc_textinput_string.length() > 0
&& rc_toggleBackspace)
{
rc_textinput_string = rc_utf8_substr(rc_textinput_string, 0, rc_utf8_length(rc_textinput_string)-1);
}
rc_inkey_val = SDL_event.key.keysym.sym;
}
break;
case SDL_WINDOWEVENT:
if (SDL_event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)
{
// FIXME: Implement more precise window control
// FIXME: Check if the window is game window
s32 Width = SDL_event.window.data1;
s32 Height = SDL_event.window.data2;
rc_win_event = RC_WIN_EVENT_RESIZE;
//resizeWindow(Width, Height);
if (VideoDriver)
VideoDriver->OnResize(core::dimension2d<u32>(Width, Height));
win_w = Width;
win_h = Height;
}
else if(SDL_event.window.event == SDL_WINDOWEVENT_CLOSE)
{
if(rc_window)
{
rc_win_event = RC_WIN_EVENT_CLOSE;
if(SDL_QuitRequested() != 0)
{
SDL_FlushEvent(SDL_QUIT);
}
if(rc_win_exitOnClose)
{
rc_closeWindow_hw();
Close = true;
}
}
}
else if(SDL_event.window.event == SDL_WINDOWEVENT_MINIMIZED)
{
if(rc_window)
{
rc_win_event = RC_WIN_EVENT_MINIMIZE;
}
}
else if(SDL_event.window.event == SDL_WINDOWEVENT_MAXIMIZED)
{
if(rc_window)
{
rc_win_event = RC_WIN_EVENT_MAXIMIZE;
}
}
break;
case SDL_JOYDEVICEREMOVED:
//cout << "Joystick Removed: Instance " << event.jdevice.which << endl;
for(int i = 0; i < 8; i++)
{
if(SDL_event.jdevice.which == rc_joyID[i] && rc_joystick[i])
{
//cout << "Joystick [" << i << "] was removed" << endl;
SDL_HapticClose(rc_haptic[i]);
SDL_JoystickClose(rc_joystick[i]);
rc_joystick[i] = NULL;
rc_haptic[i] = NULL;
rc_joyID[i] = -1;
rc_numJoysticks--;
break;
}
}
break;
case SDL_JOYDEVICEADDED:
//cout << "Joystick Added: " << event.jdevice.which << endl;
tmp_joy = SDL_JoystickOpen(SDL_event.jdevice.which);
tmp_joy_id = SDL_JoystickInstanceID(tmp_joy);
tmp_joy_flag = 0;
for(int i = 0; i < 8; i++)
{
if(tmp_joy_id == rc_joyID[i])
{
tmp_joy_flag = 1;
break;
}
}
if(SDL_event.jdevice.which >= 0 && tmp_joy_flag == 0)
{
for(int i = 0; i < 8; i++)
{
if(rc_joystick[i] == NULL)
{
//cout << "Assigned " << i << endl;
rc_joystick[i] = tmp_joy;
rc_haptic[i] = SDL_HapticOpenFromJoystick(rc_joystick[i]);
SDL_HapticRumbleInit(rc_haptic[i]);
rc_joyID[i] = tmp_joy_id;
rc_numJoysticks++;
break;
}
}
}
break;
#ifndef RC_MOBILE //This block handles touch events for non-mobile devices, Just in case it has a touch screen that SDL2 can get events for
case SDL_FINGERDOWN:
rc_touch = 1;
rc_touchX = SDL_event.tfinger.x * win_w;
rc_touchY = SDL_event.tfinger.y * win_h;
#ifdef RC_IOS
rc_pressure = 1; //FIXME: On IOS pressure is always getting reported as 0 on finger down so I am just setting it to 1 until I figure this out
#else
rc_pressure = SDL_event.tfinger.pressure;
#endif
rc_setTouchFingerEvent(SDL_event.tfinger.fingerId, rc_touchX, rc_touchY, rc_pressure);
break;
case SDL_FINGERUP:
rc_touch = 0;
rc_mt_status = 0;
rc_touchX = SDL_event.tfinger.x * win_w;
rc_touchY = SDL_event.tfinger.y * win_h;
rc_pressure = SDL_event.tfinger.pressure;
rc_setTouchFingerEvent(SDL_event.tfinger.fingerId, -1, -1, 0);
break;
case SDL_FINGERMOTION:
rc_touch = 1;
rc_touchX = SDL_event.tfinger.x * win_w;
rc_touchY = SDL_event.tfinger.y * win_h;
rc_motionX = SDL_event.tfinger.dx * win_w;
rc_motionY = SDL_event.tfinger.dy * win_h;
#ifdef RC_IOS
rc_pressure = 1;
#else
rc_pressure = SDL_event.tfinger.pressure;
#endif
rc_setTouchFingerEvent(SDL_event.tfinger.fingerId, rc_touchX, rc_touchY, rc_pressure);
break;
case SDL_MULTIGESTURE:
rc_touch = 2;
rc_mt_status = 1;
rc_mt_x = SDL_event.mgesture.x;
rc_mt_y = SDL_event.mgesture.y;
rc_mt_numFingers = SDL_event.mgesture.numFingers;
rc_mt_dist = SDL_event.mgesture.dDist;
rc_mt_theta = SDL_event.mgesture.dTheta;
#ifdef RC_IOS
rc_pressure = 1;
#else
rc_pressure = SDL_event.tfinger.pressure;
#endif
break;
#endif
case SDL_USEREVENT:
irrevent.EventType = irr::EET_USER_EVENT;
irrevent.UserEvent.UserData1 = reinterpret_cast<uintptr_t>(SDL_event.user.data1);
irrevent.UserEvent.UserData2 = reinterpret_cast<uintptr_t>(SDL_event.user.data2);
//device->postEventFromUser(irrevent);
break;
default:
break;
} // end switch
} // end while
if(!Close)
{
irrtheora::updateVideo();
VideoDriver->setRenderTarget(rc_canvas[0].texture);
irr::core::vector2d<s32> bb_position(0,0);
irr::core::dimension2d<u32> bb_dimension = rc_canvas[0].texture->getSize();
irr::core::dimension2d<u32> win_dimension(win_w, win_h);
VideoDriver->setViewPort( irr::core::rect<irr::s32>(bb_position, bb_dimension) );
irr::core::vector2d<irr::f32> screenSize( (irr::f32) rc_canvas[0].dimension.Width, (irr::f32) rc_canvas[0].dimension.Height );
//irr::core::vector2d<irr::f32> screenSize( (irr::f32) win_h, (irr::f32) win_w );
Uint32 current_time_ms = SDL_GetTicks();
double frame_current_time = ((double)current_time_ms)/1000.0;
for(int i = 0; i < rc_transition_actor.size();)
{
int t_actor = rc_transition_actor[i];
if((frame_current_time - rc_actor[t_actor].transition_start_time) >= rc_actor[t_actor].transition_time)
{
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[t_actor].mesh_node;
node->setTransitionTime(0);
node->setJointMode(irr::scene::EJUOR_NONE);
rc_actor[t_actor].transition = false;
rc_actor[t_actor].transition_time = 0;
rc_actor[t_actor].transition_start_time = 0;
rc_transition_actor.erase(t_actor);
rc_actor[t_actor].animation[0].start_frame = (int)rc_actor[t_actor].transition_frame;
rc_actor[t_actor].animation[0].end_frame = (int)rc_actor[t_actor].transition_frame;
rc_actor[t_actor].animation[0].fps = 0;
rc_actor[t_actor].current_animation_loop = 0;
rc_actor[t_actor].isPlaying = true;
rc_actor[t_actor].current_animation = 0;
}
else
{
//std::cout << "Animate dammit" << std::endl;
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[t_actor].mesh_node;
node->animateJoints();
i++;
}
}
VideoDriver->beginScene(true, true);
if(!hasPreUpdated)
{
//rc_physics3D.DeltaTime = device->getTimer()->getTime() - rc_physics3D.TimeStamp;
//rc_physics3D.TimeStamp = device->getTimer()->getTime();
rc_physics3D.DeltaTime = SDL_GetTicks() - rc_physics3D.TimeStamp;
rc_physics3D.TimeStamp = SDL_GetTicks();
float fixed_timestep = rc_physics3D.fixedTimeStep < 0 ? rc_physics3D.DeltaTime*0.001f : rc_physics3D.fixedTimeStep;
rc_physics3D.world->stepSimulation(rc_physics3D.DeltaTime*0.001f, rc_physics3D.maxSubSteps, fixed_timestep);
}
for(int i = 0; i < rc_canvas.size(); i++)
{
if(rc_canvas[i].show3D)
{
VideoDriver->setRenderTarget(rc_canvas[i].texture, true, true, irr::video::SColor(255,120,120,120));
if(rc_canvas[i].camera.camera)
SceneManager->setActiveCamera(rc_canvas[i].camera.camera);
rc_canvas[i].camera.update();
VideoDriver->setViewPort(irr::core::rect<irr::s32>(0,0,rc_canvas[i].texture->getSize().Width,rc_canvas[i].texture->getSize().Height));
//irr::core::rect viewport(irr::core::position, rc_canvas[i].viewport.dimension);
//VideoDriver->setViewPort(viewport);
SceneManager->drawAll();
//VideoDriver->draw2DRectangle(irr::video::SColor(255,0,255,0), irr::core::rect<irr::s32>(10,40,100,500));
//vector3df p0(0, 0, 0);
//vector3df p1(10, 30, 0);
//vector3df p2(20, -30, 0);
//vector3df p3(30, 0, 0);
//drawBezierCurve(VideoDriver, p0, p1, p2, p3, irr::video::SColor(255, 0, 255, 0), 100);
VideoDriver->setRenderTarget(rc_canvas[0].texture);
}
}
for(int cz = 0; cz < rc_canvas_zOrder.size(); cz++)
{
int canvas_id = rc_canvas_zOrder[cz];
if(rc_canvas[canvas_id].texture && rc_canvas[canvas_id].visible)
{
irr::core::rect<s32> dest(rc_canvas[canvas_id].viewport.position, rc_canvas[canvas_id].viewport.dimension);
irr::core::rect<s32> src(rc_canvas[canvas_id].offset, rc_canvas[canvas_id].viewport.dimension);
irr::video::SColor color(rc_canvas[canvas_id].color_mod);
//color.set(255,255,255,255);
//std::cout << "draw canvas[" << canvas_id << "] (" << rc_canvas[canvas_id].offset.X << ", " << rc_canvas[canvas_id].offset.Y << ") (" << rc_canvas[canvas_id].viewport.dimension.Width << ", " << rc_canvas[canvas_id].viewport.dimension.Height << ")" << std::endl;
#if defined(RC_DRIVER_GLES2)
if(rc_canvas[canvas_id].type == RC_CANVAS_TYPE_3D)
{
src = irr::core::rect<s32>( irr::core::vector2d<s32>(0, 0), rc_canvas[canvas_id].texture->getSize() );
dest = irr::core::rect<s32>( irr::core::vector2d<s32>(dest.UpperLeftCorner.X, dest.UpperLeftCorner.Y + dest.getHeight()), irr::core::dimension2d<s32>(dest.getWidth(), -1*dest.getHeight()) );
}
else if(rc_canvas[canvas_id].type == RC_CANVAS_TYPE_2D)
{
irr::core::dimension2d<irr::u32> cv_dim = rc_canvas[canvas_id].viewport.dimension;
irr::core::position2d<irr::s32> cv_pos = rc_canvas[canvas_id].viewport.position;
irr::core::vector2d<irr::s32> cv_offset(rc_canvas[canvas_id].offset.X, rc_canvas[canvas_id].texture->getSize().Height - rc_canvas[canvas_id].offset.Y - cv_dim.Height);
src = irr::core::rect<s32>( cv_offset, cv_dim );
dest = irr::core::rect<s32>( irr::core::vector2d<s32>(cv_pos.X, cv_pos.Y + cv_dim.Height), irr::core::dimension2d<s32>(cv_dim.Width, -1*cv_dim.Height) );
}
else if(rc_canvas[canvas_id].type == RC_CANVAS_TYPE_SPRITE)
{
src = irr::core::rect<s32>( irr::core::vector2d<s32>(0, 0), rc_canvas[canvas_id].texture->getSize() );
dest = irr::core::rect<s32>( irr::core::vector2d<s32>(dest.UpperLeftCorner.X, dest.UpperLeftCorner.Y + dest.getHeight()), irr::core::dimension2d<s32>(dest.getWidth(), -1*dest.getHeight()) );
drawSprites(canvas_id);
}
//dest = irr::core::rect<s32>( irr::core::vector2d<s32>(dest.UpperLeftCorner.X, dest.UpperLeftCorner.Y + dest.getHeight()), irr::core::dimension2d<s32>(dest.getWidth(), -1*dest.getHeight()) );
draw2DImage2(VideoDriver, rc_canvas[canvas_id].texture, src, dest, irr::core::position2d<irr::s32>(0, 0), 0, true, color, screenSize);
#else
if(rc_canvas[canvas_id].type == RC_CANVAS_TYPE_SPRITE)
{
src = irr::core::rect<s32>( irr::core::vector2d<s32>(0, 0), rc_canvas[canvas_id].viewport.dimension); //sprite layers will just offset the sprites in drawSprites()
drawSprites(canvas_id);
}
draw2DImage2(VideoDriver, rc_canvas[canvas_id].texture, src, dest, irr::core::position2d<irr::s32>(0, 0), 0, true, color, screenSize);
#endif // defined
//drawSprites(canvas_id);
//draw2DImage2(VideoDriver, rc_canvas[canvas_id].sprite_layer, src, dest, irr::core::vector2d<irr::s32>(0, 0), 0, true, color, screenSize);
//drawCanvasImage(rc_canvas[canvas_id].texture, dest.UpperLeftCorner.X, dest.UpperLeftCorner.Y,
// src.UpperLeftCorner.X, src.UpperLeftCorner.Y, src.getWidth(), src.getHeight(), dest.getWidth(), dest.getHeight());
//VideoDriver->draw2DImage(rc_canvas[canvas_id].texture, dest, src, 0, &color, true);
}
}
//env->drawAll();
//VideoDriver->draw2DRectangle(irr::video::SColor(255,255,0,0), irr::core::rect<irr::s32>(0,0,100,500));
VideoDriver->setRenderTarget(0);
//VideoDriver->beginScene(true, true);
//VideoDriver->draw2DImage(rc_canvas[0].texture, irr::core::vector2d<irr::s32>(0,0));
//debug
//std::cout << "scale:: " << rc_window_size.Width << ", " << win_w << ", " << rc_canvas[0].texture->getSize().Width << std::endl;
//irr::core::rect<s32> src( irr::core::vector2d<s32>(0,0), rc_canvas[0].texture->getSize() );
#ifdef RC_DRIVER_GLES2
irr::core::rect<s32> src( irr::core::vector2d<s32>(0,0), rc_canvas[0].texture->getSize() );
irr::core::rect<s32> dest( irr::core::vector2d<s32>(0,0), irr::core::dimension2d<s32>(win_w*w_scale, win_h*h_scale) );
#else
irr::core::rect<s32> src( irr::core::vector2d<s32>(0,0), rc_window_size );
irr::core::rect<s32> dest;
if(rc_windowIsFullscreen())
dest = irr::core::rect<s32>( irr::core::vector2d<s32>(0,0), irr::core::dimension2d<s32>(win_w, win_h) );
else
dest = irr::core::rect<s32>( irr::core::vector2d<s32>(0,rc_canvas[0].texture->getSize().Height - rc_window_size.Height), irr::core::dimension2d<s32>(win_w, win_h) );
#endif // RC_DRIVER_GLES2
//irr::video::SColor color(0);
VideoDriver->draw2DImage(rc_canvas[0].texture, dest, src);
//draw2DImage2(VideoDriver, rc_canvas[0].texture, src, dest, irr::core::position2d<irr::s32>(0, 0), 0, false, color, screenSize);
//irr::core::rect<irr::s32> src( irr::core::vector2d<irr::s32>(0, 0), rc_canvas[0].texture->getSize() );
//irr::core::rect<irr::s32> dest( irr::core::vector2d<irr::s32>(0, 0), irr::core::dimension2d<irr::s32>( );
//draw2DImage2(VideoDriver, rc_canvas[canvas_id].texture, src, dest, irr::core::position2d<irr::s32>(0, 0), 0, true, color, screenSize);
//VideoDriver->draw2DImage(rc_image[0].image, irr::core::rect<irr::s32>(0,0,100,100), irr::core::rect<irr::s32>(0,0,100,100));
//VideoDriver->draw2DRectangle(irr::video::SColor(255,255,0,0), irr::core::rect<irr::s32>(0,0,100,100));
//end debug
//device->getGUIEnvironment()->drawAll();
VideoDriver->endScene();
rc_setActiveCanvas(rc_active_canvas);
}
hasPreUpdated = false; //Will be set to true if PreUpdate() is called
#ifdef RC_WEB
emscripten_sleep(0);
#else
SDL_Delay(0);
#endif // RC_WEB
return (!Close);
}
#endif // RC_GFX_INCLUDED #endif // RC_GFX_INCLUDED

View File

@@ -2,7 +2,7 @@
#define RC_OS_DEFINES_H_INCLUDED #define RC_OS_DEFINES_H_INCLUDED
//USED FOR TESTING ONLY //USED FOR TESTING ONLY
#define RC_TESTING //#define RC_TESTING
//I am checking Android first since I think it also defines __linux__ //I am checking Android first since I think it also defines __linux__

View File

@@ -52,6 +52,21 @@ int rc_createTileSet(int img_id, int tile_w, int tile_h)
return tset_id; return tset_id;
} }
void rc_deleteTileSet(int tileset)
{
if(tileset < 0 || tileset >= rc_tileset.size())
return;
if(!rc_tileset[tileset].active)
return;
rc_tileset[tileset].tiles.clear();
rc_tileset[tileset].img_id = -1;
rc_tileset[tileset].active = false;
rc_deleted_tileset.push_back(tileset);
}
void rc_setTileAnimationLength(int tileset, int base_tile, int num_frames) void rc_setTileAnimationLength(int tileset, int base_tile, int num_frames)
{ {
if(tileset < 0 || tileset >= rc_tileset.size()) if(tileset < 0 || tileset >= rc_tileset.size())
@@ -178,6 +193,24 @@ int rc_createTileMap(int tileset, int widthInTiles, int heightInTiles)
return tm_id; return tm_id;
} }
void rc_deleteTileMap(int tilemap)
{
if(tilemap < 0 || tilemap >= rc_tilemap.size())
return;
if(!rc_tilemap[tilemap].active)
return;
rc_tilemap[tilemap].rows.clear();
rc_tilemap[tilemap].num_tiles_across = 0;
rc_tilemap[tilemap].num_tiles_down = 0;
rc_tilemap[tilemap].texture = NULL;
rc_tilemap[tilemap].tileset = -1;
rc_tilemap[tilemap].active = false;
rc_deleted_tilemap.push_back(tilemap);
}
void rc_setTileMapSize(int tilemap, int widthInTiles, int heightInTiles) void rc_setTileMapSize(int tilemap, int widthInTiles, int heightInTiles)
{ {
if(tilemap < 0 || tilemap >= rc_tilemap.size()) if(tilemap < 0 || tilemap >= rc_tilemap.size())

View File

@@ -0,0 +1,626 @@
#ifndef RC_WINDOWCLOSE_H_INCLUDED
#define RC_WINDOWCLOSE_H_INCLUDED
void rc_closeWindow_hw()
{
irrtheora::stopVideo();
irrtheora::deleteVideo();
for(int i = 0; i < rc_font.size(); i++)
rc_deleteFont(i);
for(int i = 0; i < rc_tileset.size(); i++)
rc_deleteTileSet(i);
for(int i = 0; i < rc_tilemap.size(); i++)
rc_deleteTileMap(i);
for(int i = 0; i < rc_image.size(); i++)
rc_deleteImage(i);
for(int i = 0; i < rc_sprite.size(); i++)
rc_deleteSprite(i);
for(int i = 0; i < rc_joint.size(); i++)
rc_deleteJoint(i);
for(int i = 0; i < rc_actor.size(); i++)
rc_deleteActor(i);
for(int i = 0; i < rc_physics3D.constraints.size(); i++)
rc_deleteConstraint(i);
for(int i = 0; i < rc_canvas.size(); i++)
rc_canvasClose(i);
rc_clearScene();
device->drop();
device = NULL;
VideoDriver = NULL;
SceneManager = NULL;
if(rc_window!=NULL)
SDL_DestroyWindow(rc_window);
rc_window = NULL;
rc_canvas.clear();
rc_canvas_zOrder.clear();
rc_font.clear();
}
void rc_preUpdate()
{
//3D World Update
//rc_physics3D.DeltaTime = device->getTimer()->getTime() - rc_physics3D.TimeStamp;
//rc_physics3D.TimeStamp = device->getTimer()->getTime();
rc_physics3D.DeltaTime = SDL_GetTicks() - rc_physics3D.TimeStamp;
rc_physics3D.TimeStamp = SDL_GetTicks();
float fixed_timestep = rc_physics3D.fixedTimeStep < 0 ? rc_physics3D.DeltaTime*0.001f : rc_physics3D.fixedTimeStep;
rc_physics3D.world->stepSimulation(rc_physics3D.DeltaTime*0.001f, rc_physics3D.maxSubSteps, fixed_timestep);
for(int i = 0; i < rc_canvas.size(); i++)
{
if(rc_canvas[i].type != RC_CANVAS_TYPE_SPRITE)
continue;
Uint32 delta_time = SDL_GetTicks() - rc_canvas[i].physics2D.time_stamp;
rc_canvas[i].physics2D.time_stamp = SDL_GetTicks();
float step = rc_canvas[i].physics2D.timeStep < 0 ? (delta_time*0.001f) : rc_canvas[i].physics2D.timeStep;
int32 velocityIterations = rc_canvas[i].physics2D.velocityIterations;
int32 positionIterations = rc_canvas[i].physics2D.positionIterations;
if(rc_canvas[i].physics2D.enabled)
rc_canvas[i].physics2D.world->Step(step, velocityIterations, positionIterations);
}
hasPreUpdated = true;
}
bool rc_update()
{
if(!device->run())
return false;
int win_w = 0, win_h = 0;
double w_scale = 1, h_scale = 1;
if(rc_window)
{
SDL_GetWindowSize(rc_window, &win_w, &win_h);
//std::cout << "size = " << win_w << ", " << win_h << std::endl;
}
w_scale = ( (double)win_w / (double)rc_window_size.Width );
h_scale = ( (double)win_h / (double)rc_window_size.Height );
rc_window_mouse_scale_x = ( (double)rc_window_size.Width / (double)win_w );
rc_window_mouse_scale_y = ( (double)rc_window_size.Height / (double)win_h );
rc_window_zone_scale_x = w_scale;
rc_window_zone_scale_y = h_scale;
SEvent irrevent;
SDL_Event SDL_event;
bool Close = false;
rc_inkey_val = 0;
while ( !Close && SDL_PollEvent( &SDL_event ) )
{
// os::Printer::log("event: ", core::stringc((int)SDL_event.type).c_str(), ELL_INFORMATION); // just for debugging
switch ( SDL_event.type )
{
case SDL_QUIT:
SDL_PumpEvents();
Close = true;
break;
case SDL_MOUSEMOTION:
irrevent.EventType = irr::EET_MOUSE_INPUT_EVENT;
irrevent.MouseInput.Event = irr::EMIE_MOUSE_MOVED;
MouseX = irrevent.MouseInput.X = SDL_event.motion.x;
MouseY = irrevent.MouseInput.Y = SDL_event.motion.y;
MouseXRel = SDL_event.motion.xrel;
MouseYRel = SDL_event.motion.yrel;
irrevent.MouseInput.ButtonStates = MouseButtonStates;
device->postEventFromUser(irrevent);
break;
case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONUP:
irrevent.EventType = irr::EET_MOUSE_INPUT_EVENT;
irrevent.MouseInput.X = SDL_event.button.x;
irrevent.MouseInput.Y = SDL_event.button.y;
irrevent.MouseInput.Event = irr::EMIE_MOUSE_MOVED;
switch(SDL_event.button.button)
{
case SDL_BUTTON_LEFT:
if (SDL_event.type == SDL_MOUSEBUTTONDOWN)
{
irrevent.MouseInput.Event = irr::EMIE_LMOUSE_PRESSED_DOWN;
MouseButtonStates |= irr::EMBSM_LEFT;
}
else
{
irrevent.MouseInput.Event = irr::EMIE_LMOUSE_LEFT_UP;
MouseButtonStates &= !irr::EMBSM_LEFT;
}
//std::cout << "Position = " << SDL_event.button.x << ", " << SDL_event.button.y << std::endl;
//rc_canvas[0].offset.X++;
break;
case SDL_BUTTON_RIGHT:
if (SDL_event.type == SDL_MOUSEBUTTONDOWN)
{
irrevent.MouseInput.Event = irr::EMIE_RMOUSE_PRESSED_DOWN;
MouseButtonStates |= irr::EMBSM_RIGHT;
}
else
{
irrevent.MouseInput.Event = irr::EMIE_RMOUSE_LEFT_UP;
MouseButtonStates &= !irr::EMBSM_RIGHT;
}
//rc_setWindowFullscreen(1);
//rc_canvas[0].offset.X--;
break;
case SDL_BUTTON_MIDDLE:
if (SDL_event.type == SDL_MOUSEBUTTONDOWN)
{
irrevent.MouseInput.Event = irr::EMIE_MMOUSE_PRESSED_DOWN;
MouseButtonStates |= irr::EMBSM_MIDDLE;
}
else
{
irrevent.MouseInput.Event = irr::EMIE_MMOUSE_LEFT_UP;
MouseButtonStates &= !irr::EMBSM_MIDDLE;
}
break;
}
irrevent.MouseInput.ButtonStates = MouseButtonStates;
if (irrevent.MouseInput.Event != irr::EMIE_MOUSE_MOVED)
{
device->postEventFromUser(irrevent);
if ( irrevent.MouseInput.Event >= EMIE_LMOUSE_PRESSED_DOWN && irrevent.MouseInput.Event <= EMIE_MMOUSE_PRESSED_DOWN )
{
u32 clicks = device->checkSuccessiveClicks(irrevent.MouseInput.X, irrevent.MouseInput.Y, irrevent.MouseInput.Event);
if ( clicks == 2 )
{
irrevent.MouseInput.Event = (EMOUSE_INPUT_EVENT)(EMIE_LMOUSE_DOUBLE_CLICK + irrevent.MouseInput.Event-EMIE_LMOUSE_PRESSED_DOWN);
device->postEventFromUser(irrevent);
}
else if ( clicks == 3 )
{
irrevent.MouseInput.Event = (EMOUSE_INPUT_EVENT)(EMIE_LMOUSE_TRIPLE_CLICK + irrevent.MouseInput.Event-EMIE_LMOUSE_PRESSED_DOWN);
device->postEventFromUser(irrevent);
}
}
}
break;
case SDL_MOUSEWHEEL:
irrevent.MouseInput.Event = irr::EMIE_MOUSE_WHEEL;
irrevent.MouseInput.Wheel = SDL_event.wheel.y;
rc_mwheelx = SDL_event.wheel.x;
rc_mwheely = SDL_event.wheel.y;
break;
case SDL_TEXTINPUT:
if(rc_textinput_flag == true)
{
rc_textinput_string += SDL_event.text.text;
}
break;
case SDL_KEYUP:
case SDL_KEYDOWN:
{
SDLKeyMap mp;
mp.SDLKey = SDL_event.key.keysym.sym;
s32 idx = KeyMap.binary_search(mp);
EKEY_CODE key;
if (idx == -1)
key = (EKEY_CODE)0;
else
key = (EKEY_CODE)KeyMap[idx].Win32Key;
irrevent.EventType = irr::EET_KEY_INPUT_EVENT;
irrevent.KeyInput.Char = SDL_event.key.keysym.sym;
irrevent.KeyInput.Key = key;
irrevent.KeyInput.PressedDown = (SDL_event.type == SDL_KEYDOWN);
irrevent.KeyInput.Shift = (SDL_event.key.keysym.mod & KMOD_SHIFT) != 0;
irrevent.KeyInput.Control = (SDL_event.key.keysym.mod & KMOD_CTRL ) != 0;
device->postEventFromUser(irrevent);
}
if(SDL_event.type == SDL_KEYDOWN)
{
if(rc_textinput_flag && SDL_event.key.keysym.sym == SDLK_BACKSPACE && rc_textinput_string.length() > 0
&& rc_toggleBackspace)
{
rc_textinput_string = rc_utf8_substr(rc_textinput_string, 0, rc_utf8_length(rc_textinput_string)-1);
}
rc_inkey_val = SDL_event.key.keysym.sym;
}
break;
case SDL_WINDOWEVENT:
if (SDL_event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)
{
// FIXME: Implement more precise window control
// FIXME: Check if the window is game window
s32 Width = SDL_event.window.data1;
s32 Height = SDL_event.window.data2;
rc_win_event = RC_WIN_EVENT_RESIZE;
//resizeWindow(Width, Height);
if (VideoDriver)
VideoDriver->OnResize(core::dimension2d<u32>(Width, Height));
win_w = Width;
win_h = Height;
}
else if(SDL_event.window.event == SDL_WINDOWEVENT_CLOSE)
{
if(rc_window)
{
rc_win_event = RC_WIN_EVENT_CLOSE;
if(SDL_QuitRequested() != 0)
{
SDL_FlushEvent(SDL_QUIT);
}
if(rc_win_exitOnClose)
{
rc_closeWindow_hw();
Close = true;
}
}
}
else if(SDL_event.window.event == SDL_WINDOWEVENT_MINIMIZED)
{
if(rc_window)
{
rc_win_event = RC_WIN_EVENT_MINIMIZE;
}
}
else if(SDL_event.window.event == SDL_WINDOWEVENT_MAXIMIZED)
{
if(rc_window)
{
rc_win_event = RC_WIN_EVENT_MAXIMIZE;
}
}
break;
case SDL_JOYDEVICEREMOVED:
//cout << "Joystick Removed: Instance " << event.jdevice.which << endl;
for(int i = 0; i < 8; i++)
{
if(SDL_event.jdevice.which == rc_joyID[i] && rc_joystick[i])
{
//cout << "Joystick [" << i << "] was removed" << endl;
SDL_HapticClose(rc_haptic[i]);
SDL_JoystickClose(rc_joystick[i]);
rc_joystick[i] = NULL;
rc_haptic[i] = NULL;
rc_joyID[i] = -1;
rc_numJoysticks--;
break;
}
}
break;
case SDL_JOYDEVICEADDED:
//cout << "Joystick Added: " << event.jdevice.which << endl;
tmp_joy = SDL_JoystickOpen(SDL_event.jdevice.which);
tmp_joy_id = SDL_JoystickInstanceID(tmp_joy);
tmp_joy_flag = 0;
for(int i = 0; i < 8; i++)
{
if(tmp_joy_id == rc_joyID[i])
{
tmp_joy_flag = 1;
break;
}
}
if(SDL_event.jdevice.which >= 0 && tmp_joy_flag == 0)
{
for(int i = 0; i < 8; i++)
{
if(rc_joystick[i] == NULL)
{
//cout << "Assigned " << i << endl;
rc_joystick[i] = tmp_joy;
rc_haptic[i] = SDL_HapticOpenFromJoystick(rc_joystick[i]);
SDL_HapticRumbleInit(rc_haptic[i]);
rc_joyID[i] = tmp_joy_id;
rc_numJoysticks++;
break;
}
}
}
break;
#ifndef RC_MOBILE //This block handles touch events for non-mobile devices, Just in case it has a touch screen that SDL2 can get events for
case SDL_FINGERDOWN:
rc_touch = 1;
rc_touchX = SDL_event.tfinger.x * win_w;
rc_touchY = SDL_event.tfinger.y * win_h;
#ifdef RC_IOS
rc_pressure = 1; //FIXME: On IOS pressure is always getting reported as 0 on finger down so I am just setting it to 1 until I figure this out
#else
rc_pressure = SDL_event.tfinger.pressure;
#endif
rc_setTouchFingerEvent(SDL_event.tfinger.fingerId, rc_touchX, rc_touchY, rc_pressure);
break;
case SDL_FINGERUP:
rc_touch = 0;
rc_mt_status = 0;
rc_touchX = SDL_event.tfinger.x * win_w;
rc_touchY = SDL_event.tfinger.y * win_h;
rc_pressure = SDL_event.tfinger.pressure;
rc_setTouchFingerEvent(SDL_event.tfinger.fingerId, -1, -1, 0);
break;
case SDL_FINGERMOTION:
rc_touch = 1;
rc_touchX = SDL_event.tfinger.x * win_w;
rc_touchY = SDL_event.tfinger.y * win_h;
rc_motionX = SDL_event.tfinger.dx * win_w;
rc_motionY = SDL_event.tfinger.dy * win_h;
#ifdef RC_IOS
rc_pressure = 1;
#else
rc_pressure = SDL_event.tfinger.pressure;
#endif
rc_setTouchFingerEvent(SDL_event.tfinger.fingerId, rc_touchX, rc_touchY, rc_pressure);
break;
case SDL_MULTIGESTURE:
rc_touch = 2;
rc_mt_status = 1;
rc_mt_x = SDL_event.mgesture.x;
rc_mt_y = SDL_event.mgesture.y;
rc_mt_numFingers = SDL_event.mgesture.numFingers;
rc_mt_dist = SDL_event.mgesture.dDist;
rc_mt_theta = SDL_event.mgesture.dTheta;
#ifdef RC_IOS
rc_pressure = 1;
#else
rc_pressure = SDL_event.tfinger.pressure;
#endif
break;
#endif
case SDL_USEREVENT:
irrevent.EventType = irr::EET_USER_EVENT;
irrevent.UserEvent.UserData1 = reinterpret_cast<uintptr_t>(SDL_event.user.data1);
irrevent.UserEvent.UserData2 = reinterpret_cast<uintptr_t>(SDL_event.user.data2);
//device->postEventFromUser(irrevent);
break;
default:
break;
} // end switch
} // end while
if(!Close)
{
irrtheora::updateVideo();
VideoDriver->setRenderTarget(rc_canvas[0].texture);
irr::core::vector2d<s32> bb_position(0,0);
irr::core::dimension2d<u32> bb_dimension = rc_canvas[0].texture->getSize();
irr::core::dimension2d<u32> win_dimension(win_w, win_h);
VideoDriver->setViewPort( irr::core::rect<irr::s32>(bb_position, bb_dimension) );
irr::core::vector2d<irr::f32> screenSize( (irr::f32) rc_canvas[0].dimension.Width, (irr::f32) rc_canvas[0].dimension.Height );
//irr::core::vector2d<irr::f32> screenSize( (irr::f32) win_h, (irr::f32) win_w );
Uint32 current_time_ms = SDL_GetTicks();
double frame_current_time = ((double)current_time_ms)/1000.0;
for(int i = 0; i < rc_transition_actor.size();)
{
int t_actor = rc_transition_actor[i];
if((frame_current_time - rc_actor[t_actor].transition_start_time) >= rc_actor[t_actor].transition_time)
{
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[t_actor].mesh_node;
node->setTransitionTime(0);
node->setJointMode(irr::scene::EJUOR_NONE);
rc_actor[t_actor].transition = false;
rc_actor[t_actor].transition_time = 0;
rc_actor[t_actor].transition_start_time = 0;
rc_transition_actor.erase(t_actor);
rc_actor[t_actor].animation[0].start_frame = (int)rc_actor[t_actor].transition_frame;
rc_actor[t_actor].animation[0].end_frame = (int)rc_actor[t_actor].transition_frame;
rc_actor[t_actor].animation[0].fps = 0;
rc_actor[t_actor].current_animation_loop = 0;
rc_actor[t_actor].isPlaying = true;
rc_actor[t_actor].current_animation = 0;
}
else
{
//std::cout << "Animate dammit" << std::endl;
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[t_actor].mesh_node;
node->animateJoints();
i++;
}
}
VideoDriver->beginScene(true, true);
if(!hasPreUpdated)
{
//rc_physics3D.DeltaTime = device->getTimer()->getTime() - rc_physics3D.TimeStamp;
//rc_physics3D.TimeStamp = device->getTimer()->getTime();
rc_physics3D.DeltaTime = SDL_GetTicks() - rc_physics3D.TimeStamp;
rc_physics3D.TimeStamp = SDL_GetTicks();
float fixed_timestep = rc_physics3D.fixedTimeStep < 0 ? rc_physics3D.DeltaTime*0.001f : rc_physics3D.fixedTimeStep;
rc_physics3D.world->stepSimulation(rc_physics3D.DeltaTime*0.001f, rc_physics3D.maxSubSteps, fixed_timestep);
}
for(int i = 0; i < rc_canvas.size(); i++)
{
if(rc_canvas[i].show3D)
{
VideoDriver->setRenderTarget(rc_canvas[i].texture, true, true, irr::video::SColor(255,120,120,120));
if(rc_canvas[i].camera.camera)
SceneManager->setActiveCamera(rc_canvas[i].camera.camera);
rc_canvas[i].camera.update();
VideoDriver->setViewPort(irr::core::rect<irr::s32>(0,0,rc_canvas[i].texture->getSize().Width,rc_canvas[i].texture->getSize().Height));
//irr::core::rect viewport(irr::core::position, rc_canvas[i].viewport.dimension);
//VideoDriver->setViewPort(viewport);
SceneManager->drawAll();
//VideoDriver->draw2DRectangle(irr::video::SColor(255,0,255,0), irr::core::rect<irr::s32>(10,40,100,500));
//vector3df p0(0, 0, 0);
//vector3df p1(10, 30, 0);
//vector3df p2(20, -30, 0);
//vector3df p3(30, 0, 0);
//drawBezierCurve(VideoDriver, p0, p1, p2, p3, irr::video::SColor(255, 0, 255, 0), 100);
VideoDriver->setRenderTarget(rc_canvas[0].texture);
}
}
for(int cz = 0; cz < rc_canvas_zOrder.size(); cz++)
{
int canvas_id = rc_canvas_zOrder[cz];
if(rc_canvas[canvas_id].texture && rc_canvas[canvas_id].visible)
{
irr::core::rect<s32> dest(rc_canvas[canvas_id].viewport.position, rc_canvas[canvas_id].viewport.dimension);
irr::core::rect<s32> src(rc_canvas[canvas_id].offset, rc_canvas[canvas_id].viewport.dimension);
irr::video::SColor color(rc_canvas[canvas_id].color_mod);
//color.set(255,255,255,255);
//std::cout << "draw canvas[" << canvas_id << "] (" << rc_canvas[canvas_id].offset.X << ", " << rc_canvas[canvas_id].offset.Y << ") (" << rc_canvas[canvas_id].viewport.dimension.Width << ", " << rc_canvas[canvas_id].viewport.dimension.Height << ")" << std::endl;
#if defined(RC_DRIVER_GLES2)
if(rc_canvas[canvas_id].type == RC_CANVAS_TYPE_3D)
{
src = irr::core::rect<s32>( irr::core::vector2d<s32>(0, 0), rc_canvas[canvas_id].texture->getSize() );
dest = irr::core::rect<s32>( irr::core::vector2d<s32>(dest.UpperLeftCorner.X, dest.UpperLeftCorner.Y + dest.getHeight()), irr::core::dimension2d<s32>(dest.getWidth(), -1*dest.getHeight()) );
}
else if(rc_canvas[canvas_id].type == RC_CANVAS_TYPE_2D)
{
irr::core::dimension2d<irr::u32> cv_dim = rc_canvas[canvas_id].viewport.dimension;
irr::core::position2d<irr::s32> cv_pos = rc_canvas[canvas_id].viewport.position;
irr::core::vector2d<irr::s32> cv_offset(rc_canvas[canvas_id].offset.X, rc_canvas[canvas_id].texture->getSize().Height - rc_canvas[canvas_id].offset.Y - cv_dim.Height);
src = irr::core::rect<s32>( cv_offset, cv_dim );
dest = irr::core::rect<s32>( irr::core::vector2d<s32>(cv_pos.X, cv_pos.Y + cv_dim.Height), irr::core::dimension2d<s32>(cv_dim.Width, -1*cv_dim.Height) );
}
else if(rc_canvas[canvas_id].type == RC_CANVAS_TYPE_SPRITE)
{
src = irr::core::rect<s32>( irr::core::vector2d<s32>(0, 0), rc_canvas[canvas_id].texture->getSize() );
dest = irr::core::rect<s32>( irr::core::vector2d<s32>(dest.UpperLeftCorner.X, dest.UpperLeftCorner.Y + dest.getHeight()), irr::core::dimension2d<s32>(dest.getWidth(), -1*dest.getHeight()) );
drawSprites(canvas_id);
}
//dest = irr::core::rect<s32>( irr::core::vector2d<s32>(dest.UpperLeftCorner.X, dest.UpperLeftCorner.Y + dest.getHeight()), irr::core::dimension2d<s32>(dest.getWidth(), -1*dest.getHeight()) );
draw2DImage2(VideoDriver, rc_canvas[canvas_id].texture, src, dest, irr::core::position2d<irr::s32>(0, 0), 0, true, color, screenSize);
#else
if(rc_canvas[canvas_id].type == RC_CANVAS_TYPE_SPRITE)
{
src = irr::core::rect<s32>( irr::core::vector2d<s32>(0, 0), rc_canvas[canvas_id].viewport.dimension); //sprite layers will just offset the sprites in drawSprites()
drawSprites(canvas_id);
}
draw2DImage2(VideoDriver, rc_canvas[canvas_id].texture, src, dest, irr::core::position2d<irr::s32>(0, 0), 0, true, color, screenSize);
#endif // defined
//drawSprites(canvas_id);
//draw2DImage2(VideoDriver, rc_canvas[canvas_id].sprite_layer, src, dest, irr::core::vector2d<irr::s32>(0, 0), 0, true, color, screenSize);
//drawCanvasImage(rc_canvas[canvas_id].texture, dest.UpperLeftCorner.X, dest.UpperLeftCorner.Y,
// src.UpperLeftCorner.X, src.UpperLeftCorner.Y, src.getWidth(), src.getHeight(), dest.getWidth(), dest.getHeight());
//VideoDriver->draw2DImage(rc_canvas[canvas_id].texture, dest, src, 0, &color, true);
}
}
//env->drawAll();
//VideoDriver->draw2DRectangle(irr::video::SColor(255,255,0,0), irr::core::rect<irr::s32>(0,0,100,500));
VideoDriver->setRenderTarget(0);
//VideoDriver->beginScene(true, true);
//VideoDriver->draw2DImage(rc_canvas[0].texture, irr::core::vector2d<irr::s32>(0,0));
//debug
//std::cout << "scale:: " << rc_window_size.Width << ", " << win_w << ", " << rc_canvas[0].texture->getSize().Width << std::endl;
//irr::core::rect<s32> src( irr::core::vector2d<s32>(0,0), rc_canvas[0].texture->getSize() );
#ifdef RC_DRIVER_GLES2
irr::core::rect<s32> src( irr::core::vector2d<s32>(0,0), rc_canvas[0].texture->getSize() );
irr::core::rect<s32> dest( irr::core::vector2d<s32>(0,0), irr::core::dimension2d<s32>(win_w*w_scale, win_h*h_scale) );
#else
irr::core::rect<s32> src( irr::core::vector2d<s32>(0,0), rc_window_size );
irr::core::rect<s32> dest;
if(rc_windowIsFullscreen())
dest = irr::core::rect<s32>( irr::core::vector2d<s32>(0,0), irr::core::dimension2d<s32>(win_w, win_h) );
else
dest = irr::core::rect<s32>( irr::core::vector2d<s32>(0,rc_canvas[0].texture->getSize().Height - rc_window_size.Height), irr::core::dimension2d<s32>(win_w, win_h) );
#endif // RC_DRIVER_GLES2
//irr::video::SColor color(0);
VideoDriver->draw2DImage(rc_canvas[0].texture, dest, src);
//draw2DImage2(VideoDriver, rc_canvas[0].texture, src, dest, irr::core::position2d<irr::s32>(0, 0), 0, false, color, screenSize);
//irr::core::rect<irr::s32> src( irr::core::vector2d<irr::s32>(0, 0), rc_canvas[0].texture->getSize() );
//irr::core::rect<irr::s32> dest( irr::core::vector2d<irr::s32>(0, 0), irr::core::dimension2d<irr::s32>( );
//draw2DImage2(VideoDriver, rc_canvas[canvas_id].texture, src, dest, irr::core::position2d<irr::s32>(0, 0), 0, true, color, screenSize);
//VideoDriver->draw2DImage(rc_image[0].image, irr::core::rect<irr::s32>(0,0,100,100), irr::core::rect<irr::s32>(0,0,100,100));
//VideoDriver->draw2DRectangle(irr::video::SColor(255,255,0,0), irr::core::rect<irr::s32>(0,0,100,100));
//end debug
//device->getGUIEnvironment()->drawAll();
VideoDriver->endScene();
rc_setActiveCanvas(rc_active_canvas);
}
hasPreUpdated = false; //Will be set to true if PreUpdate() is called
#ifdef RC_WEB
emscripten_sleep(0);
#else
SDL_Delay(0);
#endif // RC_WEB
return (!Close);
}
#endif // RC_WINDOWCLOSE_H_INCLUDED

View File

@@ -1,5 +1,5 @@
# depslib dependency file v1.0 # depslib dependency file v1.0
1733892371 source:/home/n00b/Projects/RCBASIC4/rcbasic_runtime/main.cpp 1733959687 source:/home/n00b/Projects/RCBASIC4/rcbasic_runtime/main.cpp
"rc_os_defines.h" "rc_os_defines.h"
<emscripten.h> <emscripten.h>
<sys/param.h> <sys/param.h>
@@ -28,14 +28,15 @@
"rc_audio.h" "rc_audio.h"
"rc_net.h" "rc_net.h"
"rc_video.h" "rc_video.h"
"rc_windowclose.h"
"rc_test.h" "rc_test.h"
<irrtheora.h> <irrtheora.h>
"rc_func130_cases.h" "rc_func130_cases.h"
1733950891 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_os_defines.h 1733960003 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_os_defines.h
<TargetConditionals.h> <TargetConditionals.h>
1733777902 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_defines.h 1733959765 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_defines.h
1730291453 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_stdlib.h 1730291453 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_stdlib.h
"rc_os_defines.h" "rc_os_defines.h"
@@ -1247,7 +1248,7 @@
1727545973 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/RealisticWater.h 1727545973 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/RealisticWater.h
<irrlicht.h> <irrlicht.h>
1733950856 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_gfx.h 1733959687 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_gfx.h
"SDL.h" "SDL.h"
<SDL2/SDL.h> <SDL2/SDL.h>
<irrlicht.h> <irrlicht.h>
@@ -2272,7 +2273,7 @@
"rc_gfx_core.h" "rc_gfx_core.h"
<irrtheora.h> <irrtheora.h>
1733777902 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_func130_cases.h 1733959765 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_func130_cases.h
1724469097 source:/home/n00b/Projects/irrBullet/src/irrBullet.cpp 1724469097 source:/home/n00b/Projects/irrBullet/src/irrBullet.cpp
"irrBullet.h" "irrBullet.h"
@@ -2495,7 +2496,7 @@
"rc_sprite_physics.h" "rc_sprite_physics.h"
"rc_joints.h" "rc_joints.h"
1729551233 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_tilelib.h 1733959298 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_tilelib.h
"SDL.h" "SDL.h"
<SDL2/SDL.h> <SDL2/SDL.h>
"rc_tilemap.h" "rc_tilemap.h"
@@ -2536,3 +2537,5 @@
1731249956 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_camera.h 1731249956 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_camera.h
1733959687 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_windowclose.h