Added GIF recording and screenshot support.
This commit is contained in:
parent
0357230af8
commit
c083aed903
|
|
@ -56,6 +56,12 @@ void App::Initialize(Windows::ApplicationModel::Core::CoreApplicationView^ appli
|
||||||
|
|
||||||
CoreApplication::Suspending += ref new Windows::Foundation::EventHandler<Windows::ApplicationModel::SuspendingEventArgs^>(this, &App::OnSuspending);
|
CoreApplication::Suspending += ref new Windows::Foundation::EventHandler<Windows::ApplicationModel::SuspendingEventArgs^>(this, &App::OnSuspending);
|
||||||
CoreApplication::Resuming += ref new EventHandler<Platform::Object^>(this, &App::OnResuming);
|
CoreApplication::Resuming += ref new EventHandler<Platform::Object^>(this, &App::OnResuming);
|
||||||
|
|
||||||
|
// Store the app data directory
|
||||||
|
auto dataPath = Windows::Storage::ApplicationData::Current->LocalFolder->Path;
|
||||||
|
std::wstring dataPathW(dataPath->Begin());
|
||||||
|
static std::string dataPathA(dataPathW.begin(), dataPathW.end());
|
||||||
|
UWPSetDataPath(dataPathA.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void App::SetWindow(Windows::UI::Core::CoreWindow^ window)
|
void App::SetWindow(Windows::UI::Core::CoreWindow^ window)
|
||||||
|
|
@ -300,11 +306,13 @@ void App::OnSuspending(Platform::Object^ sender, Windows::ApplicationModel::Susp
|
||||||
void App::OnWindowSizeChanged(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::WindowSizeChangedEventArgs^ args)
|
void App::OnWindowSizeChanged(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::WindowSizeChangedEventArgs^ args)
|
||||||
{
|
{
|
||||||
UWPResizeEvent(args->Size.Width, args->Size.Height);
|
UWPResizeEvent(args->Size.Width, args->Size.Height);
|
||||||
|
args->Handled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void App::OnVisibilityChanged(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::VisibilityChangedEventArgs^ args)
|
void App::OnVisibilityChanged(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::VisibilityChangedEventArgs^ args)
|
||||||
{
|
{
|
||||||
mWindowVisible = args->Visible;
|
mWindowVisible = args->Visible;
|
||||||
|
args->Handled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Input event handlers
|
// Input event handlers
|
||||||
|
|
@ -319,6 +327,8 @@ void App::OnPointerPressed(Windows::UI::Core::CoreWindow^ sender, Windows::UI::C
|
||||||
if (props->IsMiddleButtonPressed) UWPMouseButtonEvent(MOUSE_MIDDLE_BUTTON, true);
|
if (props->IsMiddleButtonPressed) UWPMouseButtonEvent(MOUSE_MIDDLE_BUTTON, true);
|
||||||
if (props->IsRightButtonPressed) UWPMouseButtonEvent(MOUSE_RIGHT_BUTTON, true);
|
if (props->IsRightButtonPressed) UWPMouseButtonEvent(MOUSE_RIGHT_BUTTON, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
args->Handled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void App::OnPointerReleased(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::PointerEventArgs^ args)
|
void App::OnPointerReleased(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::PointerEventArgs^ args)
|
||||||
|
|
@ -332,17 +342,21 @@ void App::OnPointerReleased(Windows::UI::Core::CoreWindow^ sender, Windows::UI::
|
||||||
if (!props->IsMiddleButtonPressed) UWPMouseButtonEvent(MOUSE_MIDDLE_BUTTON, false);
|
if (!props->IsMiddleButtonPressed) UWPMouseButtonEvent(MOUSE_MIDDLE_BUTTON, false);
|
||||||
if (!props->IsRightButtonPressed) UWPMouseButtonEvent(MOUSE_RIGHT_BUTTON, false);
|
if (!props->IsRightButtonPressed) UWPMouseButtonEvent(MOUSE_RIGHT_BUTTON, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
args->Handled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void App::OnPointerWheelChanged(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::PointerEventArgs^ args)
|
void App::OnPointerWheelChanged(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::PointerEventArgs^ args)
|
||||||
{
|
{
|
||||||
UWPMouseWheelEvent(args->CurrentPoint->Properties->MouseWheelDelta);
|
UWPMouseWheelEvent(args->CurrentPoint->Properties->MouseWheelDelta);
|
||||||
|
args->Handled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void App::OnPointerMoved(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::PointerEventArgs^ args)
|
void App::OnPointerMoved(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::PointerEventArgs^ args)
|
||||||
{
|
{
|
||||||
auto pos = args->CurrentPoint->Position;
|
auto pos = args->CurrentPoint->Position;
|
||||||
UWPMousePosEvent((double)pos.X, (double)pos.Y);
|
UWPMousePosEvent((double)pos.X, (double)pos.Y);
|
||||||
|
args->Handled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int App::GetRaylibKey(Windows::System::VirtualKey kVey)
|
int App::GetRaylibKey(Windows::System::VirtualKey kVey)
|
||||||
|
|
@ -420,15 +434,18 @@ int App::GetRaylibKey(Windows::System::VirtualKey kVey)
|
||||||
void App::OnKeyDown(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::KeyEventArgs^ args)
|
void App::OnKeyDown(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::KeyEventArgs^ args)
|
||||||
{
|
{
|
||||||
auto k = GetRaylibKey(args->VirtualKey);
|
auto k = GetRaylibKey(args->VirtualKey);
|
||||||
|
auto controlState = (sender->GetKeyState(Windows::System::VirtualKey::Control) & Windows::UI::Core::CoreVirtualKeyStates::Down) == Windows::UI::Core::CoreVirtualKeyStates::Down;
|
||||||
if (k != -1)
|
if (k != -1)
|
||||||
UWPKeyDownEvent(k, true);
|
UWPKeyDownEvent(k, true, controlState);
|
||||||
|
args->Handled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void App::OnKeyUp(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::KeyEventArgs^ args)
|
void App::OnKeyUp(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::KeyEventArgs^ args)
|
||||||
{
|
{
|
||||||
auto k = GetRaylibKey(args->VirtualKey);
|
auto k = GetRaylibKey(args->VirtualKey);
|
||||||
if (k != -1)
|
if (k != -1)
|
||||||
UWPKeyDownEvent(k, false);
|
UWPKeyDownEvent(k, false, false);
|
||||||
|
args->Handled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// AppSource implementation
|
// AppSource implementation
|
||||||
|
|
|
||||||
|
|
@ -162,7 +162,7 @@
|
||||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||||
<CompileAsWinRT>false</CompileAsWinRT>
|
<CompileAsWinRT>false</CompileAsWinRT>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;GRAPHICS_API_OPENGL_ES2;PLATFORM_UWP;_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>SUPPORT_GIF_RECORDING;_CRT_SECURE_NO_WARNINGS;GRAPHICS_API_OPENGL_ES2;PLATFORM_UWP;_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)packages\ANGLE.WindowsStore.2.1.13\Include;$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(SolutionDir)packages\ANGLE.WindowsStore.2.1.13\Include;$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
|
|
|
||||||
68
src/core.c
68
src/core.c
|
|
@ -375,6 +375,11 @@ typedef struct CoreData {
|
||||||
const char *internalDataPath; // Android internal data path to write data (/data/data/<package>/files)
|
const char *internalDataPath; // Android internal data path to write data (/data/data/<package>/files)
|
||||||
bool contextRebindRequired; // Used to know context rebind required
|
bool contextRebindRequired; // Used to know context rebind required
|
||||||
} Android;
|
} Android;
|
||||||
|
#endif
|
||||||
|
#if defined(PLATFORM_UWP)
|
||||||
|
struct {
|
||||||
|
const char* internalDataPath; // UWP App data path
|
||||||
|
} UWP;
|
||||||
#endif
|
#endif
|
||||||
struct {
|
struct {
|
||||||
#if defined(PLATFORM_RPI)
|
#if defined(PLATFORM_RPI)
|
||||||
|
|
@ -1891,6 +1896,10 @@ void TakeScreenshot(const char *fileName)
|
||||||
strcpy(path, CORE.Android.internalDataPath);
|
strcpy(path, CORE.Android.internalDataPath);
|
||||||
strcat(path, "/");
|
strcat(path, "/");
|
||||||
strcat(path, fileName);
|
strcat(path, fileName);
|
||||||
|
#elif defined(PLATFORM_UWP)
|
||||||
|
strcpy(path, CORE.UWP.internalDataPath);
|
||||||
|
strcat(path, "/");
|
||||||
|
strcat(path, fileName);
|
||||||
#else
|
#else
|
||||||
strcpy(path, fileName);
|
strcpy(path, fileName);
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -5200,6 +5209,10 @@ bool UWPIsConfigured()
|
||||||
}
|
}
|
||||||
return pass;
|
return pass;
|
||||||
}
|
}
|
||||||
|
void UWPSetDataPath(const char* path)
|
||||||
|
{
|
||||||
|
CORE.UWP.internalDataPath = path;
|
||||||
|
}
|
||||||
|
|
||||||
UWPQueryTimeFunc UWPGetQueryTimeFunc(void)
|
UWPQueryTimeFunc UWPGetQueryTimeFunc(void)
|
||||||
{
|
{
|
||||||
|
|
@ -5296,13 +5309,64 @@ void UWPMouseWheelEvent(int deltaY)
|
||||||
CORE.Input.Mouse.currentWheelMove = (int)deltaY;
|
CORE.Input.Mouse.currentWheelMove = (int)deltaY;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UWPKeyDownEvent(int key, bool down)
|
void UWPKeyDownEvent(int key, bool down, bool controlKey)
|
||||||
{
|
{
|
||||||
if (key == CORE.Input.Keyboard.exitKey && down)
|
if (key == CORE.Input.Keyboard.exitKey && down)
|
||||||
{
|
{
|
||||||
// Time to close the window.
|
// Time to close the window.
|
||||||
CORE.Window.shouldClose = true;
|
CORE.Window.shouldClose = true;
|
||||||
}// TODO: Could UWP possibly support GIF recording?
|
}
|
||||||
|
else if (key == KEY_F12 && down)
|
||||||
|
{
|
||||||
|
#if defined(SUPPORT_GIF_RECORDING)
|
||||||
|
if (controlKey)
|
||||||
|
{
|
||||||
|
if (gifRecording)
|
||||||
|
{
|
||||||
|
GifEnd();
|
||||||
|
gifRecording = false;
|
||||||
|
|
||||||
|
#if defined(PLATFORM_WEB)
|
||||||
|
// Download file from MEMFS (emscripten memory filesystem)
|
||||||
|
// saveFileFromMEMFSToDisk() function is defined in raylib/templates/web_shel/shell.html
|
||||||
|
emscripten_run_script(TextFormat("saveFileFromMEMFSToDisk('%s','%s')", TextFormat("screenrec%03i.gif", screenshotCounter - 1), TextFormat("screenrec%03i.gif", screenshotCounter - 1)));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
TRACELOG(LOG_INFO, "SYSTEM: Finish animated GIF recording");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gifRecording = true;
|
||||||
|
gifFramesCounter = 0;
|
||||||
|
|
||||||
|
char path[512] = { 0 };
|
||||||
|
#if defined(PLATFORM_ANDROID)
|
||||||
|
strcpy(path, CORE.Android.internalDataPath);
|
||||||
|
strcat(path, TextFormat("./screenrec%03i.gif", screenshotCounter));
|
||||||
|
#elif defined(PLATFORM_UWP)
|
||||||
|
strcpy(path, CORE.UWP.internalDataPath);
|
||||||
|
strcat(path, TextFormat("./screenrec%03i.gif", screenshotCounter));
|
||||||
|
#else
|
||||||
|
strcpy(path, TextFormat("./screenrec%03i.gif", screenshotCounter));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// NOTE: delay represents the time between frames in the gif, if we capture a gif frame every
|
||||||
|
// 10 game frames and each frame trakes 16.6ms (60fps), delay between gif frames should be ~16.6*10.
|
||||||
|
GifBegin(path, CORE.Window.screen.width, CORE.Window.screen.height, (int)(GetFrameTime() * 10.0f), 8, false);
|
||||||
|
screenshotCounter++;
|
||||||
|
|
||||||
|
TRACELOG(LOG_INFO, "SYSTEM: Start animated GIF recording: %s", TextFormat("screenrec%03i.gif", screenshotCounter));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif // SUPPORT_GIF_RECORDING
|
||||||
|
#if defined(SUPPORT_SCREEN_CAPTURE)
|
||||||
|
{
|
||||||
|
TakeScreenshot(TextFormat("screenshot%03i.png", screenshotCounter));
|
||||||
|
screenshotCounter++;
|
||||||
|
}
|
||||||
|
#endif // SUPPORT_SCREEN_CAPTURE
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CORE.Input.Keyboard.currentKeyState[key] = down;
|
CORE.Input.Keyboard.currentKeyState[key] = down;
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,8 @@ extern "C" {
|
||||||
// Determine if UWP functions are set and ready for raylib's use.
|
// Determine if UWP functions are set and ready for raylib's use.
|
||||||
bool UWPIsConfigured();
|
bool UWPIsConfigured();
|
||||||
|
|
||||||
|
void UWPSetDataPath(const char* path);
|
||||||
|
|
||||||
// Function for getting program time.
|
// Function for getting program time.
|
||||||
typedef double(*UWPQueryTimeFunc)();
|
typedef double(*UWPQueryTimeFunc)();
|
||||||
UWPQueryTimeFunc UWPGetQueryTimeFunc(void);
|
UWPQueryTimeFunc UWPGetQueryTimeFunc(void);
|
||||||
|
|
@ -71,7 +73,7 @@ void UWPSetMouseSetPosFunc(UWPMouseSetPosFunc func);
|
||||||
// This choice is made as platform-specific code is preferred to be kept away from raylib.h
|
// This choice is made as platform-specific code is preferred to be kept away from raylib.h
|
||||||
|
|
||||||
// Call this when a Key is pressed or released.
|
// Call this when a Key is pressed or released.
|
||||||
void UWPKeyDownEvent(int key, bool down);
|
void UWPKeyDownEvent(int key, bool down, bool controlKey);
|
||||||
|
|
||||||
// Call when a mouse button state changes
|
// Call when a mouse button state changes
|
||||||
void UWPMouseButtonEvent(int button, bool down);
|
void UWPMouseButtonEvent(int button, bool down);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user