* A couple of fixes for SDL/Emscripten build.

This commit is contained in:
iProgramInCpp
2023-08-17 17:49:52 +03:00
parent 5707419665
commit 8a38dee562
5 changed files with 47 additions and 21 deletions

View File

@@ -20,9 +20,9 @@ Texture AppPlatform_emscripten::loadTexture(const std::string& path, bool b)
char *data = emscripten_get_preloaded_image_data(("/" + realPath).c_str(), &out.m_width, &out.m_height);
if (data != NULL)
{
size_t data_size = out.m_width * out.m_height * 4;
out.m_pixels = (uint32_t *) new unsigned char[data_size];
memcpy(out.m_pixels, data, data_size);
size_t data_size = out.m_width * out.m_height;
out.m_pixels = new uint32_t[data_size];
memcpy(out.m_pixels, data, data_size * sizeof(uint32_t));
free(data);
return out;
}

View File

@@ -7,10 +7,10 @@
#include "App.hpp"
#ifdef __EMSCRIPTEN__
#include "../emscripten/AppPlatform_emscripten.hpp"
#define APP_PLATFORM_TYPE AppPlatform_emscripten
typedef AppPlatform_emscripten UsedAppPlatform
#else
#include "AppPlatform_sdl.hpp"
#define APP_PLATFORM_TYPE AppPlatform_sdl
typedef AppPlatform_sdl UsedAppPlatform;
#endif
#include "NinecraftApp.hpp"
@@ -46,7 +46,7 @@ void LogMsgNoCR(const char* fmt, ...)
va_end(lst);
}
APP_PLATFORM_TYPE *g_AppPlatform;
UsedAppPlatform *g_pAppPlatform;
NinecraftApp *g_pApp;
SDL_Window *window = NULL;
@@ -84,16 +84,16 @@ static void handle_events()
{
if (event.key.keysym.sym == SDLK_F2)
{
if (event.key.state == SDL_PRESSED && g_AppPlatform != nullptr)
if (event.key.state == SDL_PRESSED && g_pAppPlatform != nullptr)
{
g_AppPlatform->saveScreenshot("", -1, -1);
g_pAppPlatform->saveScreenshot("", -1, -1);
}
break;
}
Keyboard::feed(event.key.state == SDL_PRESSED ? 1 : 0, translate_sdl_key_to_mcpe(event.key.keysym.sym));
if (event.key.keysym.sym == SDLK_LSHIFT || event.key.keysym.sym == SDLK_RSHIFT)
{
g_AppPlatform->setShiftPressed(event.key.state == SDL_PRESSED, event.key.keysym.sym == SDLK_LSHIFT);
g_pAppPlatform->setShiftPressed(event.key.state == SDL_PRESSED, event.key.keysym.sym == SDLK_LSHIFT);
}
break;
}
@@ -111,7 +111,7 @@ static void handle_events()
float y = event.motion.y * scale;
Mouse::setX(x); Mouse::setY(y);
Mouse::feed(0, 0, x, y);
g_AppPlatform->setMouseDiff(event.motion.xrel * scale, event.motion.yrel * scale);
g_pAppPlatform->setMouseDiff(event.motion.xrel * scale, event.motion.yrel * scale);
break;
}
case SDL_MOUSEWHEEL:
@@ -199,7 +199,7 @@ static EM_BOOL main_loop(double time, void *user_data)
if (g_pApp->wantToQuit())
{
delete g_pApp;
delete g_AppPlatform;
delete g_pAppPlatform;
teardown();
// Stop Looping
return EM_FALSE;
@@ -214,10 +214,30 @@ static EM_BOOL main_loop(double time, void *user_data)
extern bool g_bIsMenuBackgroundAvailable; // client/gui/Screen.cpp
extern bool g_bAreCloudsAvailable; // client/renderer/LevelRenderer.cpp
#ifdef __EMSCRIPTEN__
bool DoesAssetExist(const std::string & fileName)
{
std::string realPath = g_pAppPlatform->getAssetPath(fileName);
int width = 0, height = 0;
char *data = emscripten_get_preloaded_image_data(("/" + realPath).c_str(), &width, &height);
if (data == NULL)
return false;
free(data);
return true;
}
#endif
void CheckOptionalTextureAvailability()
{
//g_bIsMenuBackgroundAvailable = XPL_ACCESS("assets/gui/background/panorama_0.png", 0) == 0;
//g_bAreCloudsAvailable = XPL_ACCESS("assets/environment/clouds.png", 0) == 0;
#ifdef __EMSCRIPTEN__
g_bIsMenuBackgroundAvailable = DoesAssetExist("gui/background/panorama_0.png");
g_bAreCloudsAvailable = DoesAssetExist("environment/clouds.png");
#else
// access works just fine on linux and friends
g_bIsMenuBackgroundAvailable = XPL_ACCESS("assets/gui/background/panorama_0.png", 0) == 0;
g_bAreCloudsAvailable = XPL_ACCESS("assets/environment/clouds.png", 0) == 0;
#endif
}
// Main
@@ -248,8 +268,6 @@ int main(int argc, char *argv[])
Minecraft::height = std::stoi(argv[2]);
#endif
CheckOptionalTextureAvailability();
// Create Window
int flags = SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI;
window = SDL_CreateWindow("ReMinecraftPE", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, Minecraft::width, Minecraft::height, flags);
@@ -297,9 +315,11 @@ int main(int argc, char *argv[])
// Start MCPE
g_pApp = new NinecraftApp;
g_pApp->m_externalStorageDir = storagePath;
g_AppPlatform = new APP_PLATFORM_TYPE(g_pApp->m_externalStorageDir, window);
g_pApp->m_pPlatform = g_AppPlatform;
g_pAppPlatform = new UsedAppPlatform(g_pApp->m_externalStorageDir, window);
g_pApp->m_pPlatform = g_pAppPlatform;
g_pApp->init();
CheckOptionalTextureAvailability();
// Set Size
resize();

View File

@@ -56,7 +56,7 @@ public:
virtual std::string getPatchData();
#endif
protected:
public:
virtual std::string getAssetPath(const std::string& path) const;
private:

View File

@@ -557,13 +557,19 @@ void Minecraft::sendMessage(const std::string& message)
if (isOnlineClient())
{
// send the server a message packet
m_pRakNetInstance->send(new MessagePacket(message));
if (m_pRakNetInstance)
m_pRakNetInstance->send(new MessagePacket(message));
else
m_gui.addMessage("You aren't actually playing multiplayer!");
}
else
{
// fake the server having received a packet
MessagePacket mp(message);
m_pNetEventCallback->handle(m_pRakNetInstance->m_pRakPeerInterface->GetMyGUID(), &mp);
if (m_pNetEventCallback && m_pRakNetInstance)
m_pNetEventCallback->handle(m_pRakNetInstance->m_pRakPeerInterface->GetMyGUID(), &mp);
else
m_gui.addMessage("You aren't hosting a multiplayer server!");
}
}

View File

@@ -50,7 +50,7 @@ void NinecraftApp::initGLStates()
glDepthFunc(GL_LEQUAL);
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.1f);
glCullFace(GL_NONE);
glCullFace(GL_BACK);
glEnable(GL_TEXTURE_2D);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
}