Compare commits

..

No commits in common. "56ce826205efdacc53be7283ba986515e2fad2bb" and "beac06fd456d3436b0e55cd232343e1c60513fe2" have entirely different histories.

17 changed files with 213 additions and 19367 deletions

View File

@ -25,7 +25,7 @@ macro(check_and_download URL ARCHIVE_NAME EXTRACTED_DIR_NAME CHECK_FILE)
endmacro() endmacro()
# 1) ZLIB (Нужна только для инклудов, если не используете emscripten порты) # 1) ZLIB (Нужна только для инклудов, если не используете emscripten порты)
check_and_download("https://www.zlib.net/zlib132.zip" "zlib132.zip" "zlib-1.3.2" "CMakeLists.txt") check_and_download("https://www.zlib.net/zlib131.zip" "zlib131.zip" "zlib-1.3.1" "CMakeLists.txt")
# 2) SDL2 # 2) SDL2
check_and_download("https://github.com/libsdl-org/SDL/archive/refs/tags/release-2.32.10.zip" "release-2.32.10.zip" "SDL-release-2.32.10" "CMakeLists.txt") check_and_download("https://github.com/libsdl-org/SDL/archive/refs/tags/release-2.32.10.zip" "release-2.32.10.zip" "SDL-release-2.32.10" "CMakeLists.txt")

View File

@ -10,9 +10,9 @@ set(BUILD_CONFIGS Debug Release)
# =========================================== # ===========================================
# 1) ZLIB (zlib131.zip zlib-1.3.2) - без изменений # 1) ZLIB (zlib131.zip zlib-1.3.1) - без изменений
# =========================================== # ===========================================
set(ZLIB_SRC_DIR "${THIRDPARTY_DIR}/zlib-1.3.2") set(ZLIB_SRC_DIR "${THIRDPARTY_DIR}/zlib-1.3.1")
set(ZLIB_BUILD_DIR "${ZLIB_SRC_DIR}/build") set(ZLIB_BUILD_DIR "${ZLIB_SRC_DIR}/build")
set(ZLIB_INSTALL_DIR "${ZLIB_SRC_DIR}/install") set(ZLIB_INSTALL_DIR "${ZLIB_SRC_DIR}/install")
@ -76,8 +76,8 @@ set_target_properties(zlib_external_lib PROPERTIES
#IMPORTED_LOCATION_RELEASE "${ZLIB_INSTALL_DIR}/lib/zlib.lib" #IMPORTED_LOCATION_RELEASE "${ZLIB_INSTALL_DIR}/lib/zlib.lib"
# Можно также указать статические библиотеки, если вы хотите их использовать # Можно также указать статические библиотеки, если вы хотите их использовать
IMPORTED_LOCATION_DEBUG "${ZLIB_INSTALL_DIR}/lib/zsd.lib" IMPORTED_LOCATION_DEBUG "${ZLIB_INSTALL_DIR}/lib/zlibstaticd.lib"
IMPORTED_LOCATION_RELEASE "${ZLIB_INSTALL_DIR}/lib/zs.lib" IMPORTED_LOCATION_RELEASE "${ZLIB_INSTALL_DIR}/lib/zlibstatic.lib"
INTERFACE_INCLUDE_DIRECTORIES "${ZLIB_INSTALL_DIR}/include" INTERFACE_INCLUDE_DIRECTORIES "${ZLIB_INSTALL_DIR}/include"
) )

View File

@ -34,16 +34,16 @@ add_executable(space-game001
../src/utils/Utils.h ../src/utils/Utils.h
../src/SparkEmitter.cpp ../src/SparkEmitter.cpp
../src/SparkEmitter.h ../src/SparkEmitter.h
# ../src/planet/PlanetObject.cpp ../src/planet/PlanetObject.cpp
# ../src/planet/PlanetObject.h ../src/planet/PlanetObject.h
# ../src/planet/PlanetData.cpp ../src/planet/PlanetData.cpp
# ../src/planet/PlanetData.h ../src/planet/PlanetData.h
../src/utils/Perlin.cpp ../src/utils/Perlin.cpp
../src/utils/Perlin.h ../src/utils/Perlin.h
../src/utils/TaskManager.cpp ../src/utils/TaskManager.cpp
../src/utils/TaskManager.h ../src/utils/TaskManager.h
# ../src/planet/StoneObject.cpp ../src/planet/StoneObject.cpp
# ../src/planet/StoneObject.h ../src/planet/StoneObject.h
../src/render/FrameBuffer.cpp ../src/render/FrameBuffer.cpp
../src/render/FrameBuffer.h ../src/render/FrameBuffer.h
../src/UiManager.cpp ../src/UiManager.cpp
@ -65,8 +65,8 @@ add_executable(space-game001
../src/render/TextRenderer.cpp ../src/render/TextRenderer.cpp
../src/MenuManager.h ../src/MenuManager.h
../src/MenuManager.cpp ../src/MenuManager.cpp
# ../src/Space.h ../src/Space.h
# ../src/Space.cpp ../src/Space.cpp
../src/GameConstants.h ../src/GameConstants.h
../src/GameConstants.cpp ../src/GameConstants.cpp
) )
@ -90,7 +90,7 @@ target_compile_definitions(space-game001 PRIVATE
WIN32_LEAN_AND_MEAN WIN32_LEAN_AND_MEAN
PNG_ENABLED PNG_ENABLED
SDL_MAIN_HANDLED SDL_MAIN_HANDLED
# NETWORK NETWORK
# SIMPLIFIED # SIMPLIFIED
) )
@ -126,8 +126,8 @@ if (WIN32)
set(LIBZIP_DLL_SRC "$<IF:$<CONFIG:Debug>,${LIBZIP_BASE_DIR}-Debug/bin/zip.dll,${LIBZIP_BASE_DIR}-Release/bin/zip.dll>") set(LIBZIP_DLL_SRC "$<IF:$<CONFIG:Debug>,${LIBZIP_BASE_DIR}-Debug/bin/zip.dll,${LIBZIP_BASE_DIR}-Release/bin/zip.dll>")
set(ZLIB_DLL_SRC "$<IF:$<CONFIG:Debug>,${ZLIB_INSTALL_DIR}/bin/zd.dll,${ZLIB_INSTALL_DIR}/bin/z.dll>") set(ZLIB_DLL_SRC "$<IF:$<CONFIG:Debug>,${ZLIB_INSTALL_DIR}/bin/zlibd.dll,${ZLIB_INSTALL_DIR}/bin/zlib.dll>")
set(ZLIB_DLL_DST "$<IF:$<CONFIG:Debug>,$<TARGET_FILE_DIR:space-game001>/zd.dll,$<TARGET_FILE_DIR:space-game001>/z.dll>") set(ZLIB_DLL_DST "$<IF:$<CONFIG:Debug>,$<TARGET_FILE_DIR:space-game001>/zlibd.dll,$<TARGET_FILE_DIR:space-game001>/zlib.dll>")
set(SDL2TTF_DLL_SRC "$<IF:$<CONFIG:Debug>,${SDL2TTF_BASE_DIR}-Debug/bin/SDL2_ttfd.dll,${SDL2TTF_BASE_DIR}-Release/bin/SDL2_ttf.dll>") set(SDL2TTF_DLL_SRC "$<IF:$<CONFIG:Debug>,${SDL2TTF_BASE_DIR}-Debug/bin/SDL2_ttfd.dll,${SDL2TTF_BASE_DIR}-Release/bin/SDL2_ttf.dll>")

BIN
resources/w/Cube001.png (Stored with Git LFS)

Binary file not shown.

BIN
resources/w/bench001opt.png (Stored with Git LFS)

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,29 +0,0 @@
===Vertices (Split by UV/Normal): 14
V 0: Pos(-2.494679, 31.51618, 1.524048) Norm(-0.577372, -0.577339, 0.577339) UV(0.625, 0.0)
V 1: Pos(-2.494679, 32.87888, 0.161349) Norm(-0.577372, 0.577339, -0.577339) UV(0.375, 0.25)
V 2: Pos(-2.494679, 31.51618, 0.161349) Norm(-0.57737, -0.57734, -0.57734) UV(0.375, 0.0)
V 3: Pos(-2.494679, 32.87888, 1.524048) Norm(-0.57737, 0.57734, 0.57734) UV(0.625, 0.25)
V 4: Pos(-2.057763, 32.87888, 0.161349) Norm(0.57737, 0.57734, -0.57734) UV(0.375, 0.5)
V 5: Pos(-2.057763, 32.87888, 1.524048) Norm(0.577372, 0.577339, 0.577339) UV(0.625, 0.5)
V 6: Pos(-2.057763, 31.51618, 0.161349) Norm(0.577372, -0.577339, -0.577339) UV(0.375, 0.75)
V 7: Pos(-2.057763, 31.51618, 1.524048) Norm(0.57737, -0.57734, 0.57734) UV(0.625, 0.75)
V 8: Pos(-2.494679, 31.51618, 0.161349) Norm(-0.57737, -0.57734, -0.57734) UV(0.375, 1.0)
V 9: Pos(-2.494679, 31.51618, 0.161349) Norm(-0.57737, -0.57734, -0.57734) UV(0.125, 0.75)
V 10: Pos(-2.494679, 32.87888, 0.161349) Norm(-0.577372, 0.577339, -0.577339) UV(0.125, 0.5)
V 11: Pos(-2.494679, 32.87888, 1.524048) Norm(-0.57737, 0.57734, 0.57734) UV(0.875, 0.5)
V 12: Pos(-2.494679, 31.51618, 1.524048) Norm(-0.577372, -0.577339, 0.577339) UV(0.625, 1.0)
V 13: Pos(-2.494679, 31.51618, 1.524048) Norm(-0.577372, -0.577339, 0.577339) UV(0.875, 0.75)
===Triangles (Indices): 12
Tri: 0 1 2
Tri: 3 4 1
Tri: 5 6 4
Tri: 7 8 6
Tri: 4 9 10
Tri: 11 7 5
Tri: 0 3 1
Tri: 3 5 4
Tri: 5 7 6
Tri: 7 12 8
Tri: 4 6 9
Tri: 11 13 7

BIN
resources/w/inai001.png (Stored with Git LFS)

Binary file not shown.

View File

@ -1,39 +0,0 @@
===Vertices (Split by UV/Normal): 24
V 0: Pos(-0.037932, -0.443994, 0.688038) Norm(-0.577353, -0.577349, 0.577349) UV(0.001657, 0.001657)
V 1: Pos(-0.037932, 0.443994, -0.688038) Norm(-0.577353, 0.577349, -0.577349) UV(0.437515, 0.677088)
V 2: Pos(-0.037932, -0.443994, -0.688038) Norm(-0.577344, -0.577354, -0.577353) UV(0.001657, 0.677088)
V 3: Pos(-0.037932, 0.443994, 0.688038) Norm(-0.577344, 0.577354, 0.577353) UV(0.880002, 0.001657)
V 4: Pos(0.037932, 0.443994, -0.688038) Norm(0.577344, 0.577354, -0.577353) UV(0.91724, 0.677088)
V 5: Pos(-0.037932, 0.443994, -0.688038) Norm(-0.577353, 0.577349, -0.577349) UV(0.880002, 0.677088)
V 6: Pos(0.037932, 0.443994, 0.688038) Norm(0.577353, 0.577349, 0.577349) UV(0.44083, 0.001657)
V 7: Pos(0.037932, -0.443994, -0.688038) Norm(0.577353, -0.577349, -0.577349) UV(0.876688, 0.677088)
V 8: Pos(0.037932, 0.443994, -0.688038) Norm(0.577344, 0.577354, -0.577353) UV(0.44083, 0.677088)
V 9: Pos(0.037932, -0.443994, 0.688038) Norm(0.577344, -0.577354, 0.577353) UV(0.920554, 0.001657)
V 10: Pos(-0.037932, -0.443994, -0.688038) Norm(-0.577344, -0.577354, -0.577353) UV(0.957791, 0.677088)
V 11: Pos(0.037932, -0.443994, -0.688038) Norm(0.577353, -0.577349, -0.577349) UV(0.920554, 0.677088)
V 12: Pos(0.037932, 0.443994, -0.688038) Norm(0.577344, 0.577354, -0.577353) UV(0.961105, 0.437515)
V 13: Pos(-0.037932, -0.443994, -0.688038) Norm(-0.577344, -0.577354, -0.577353) UV(0.998343, 0.001657)
V 14: Pos(-0.037932, 0.443994, -0.688038) Norm(-0.577353, 0.577349, -0.577349) UV(0.998343, 0.437515)
V 15: Pos(-0.037932, 0.443994, 0.688038) Norm(-0.577344, 0.577354, 0.577353) UV(0.961105, 0.876688)
V 16: Pos(0.037932, -0.443994, 0.688038) Norm(0.577344, -0.577354, 0.577353) UV(0.998343, 0.44083)
V 17: Pos(0.037932, 0.443994, 0.688038) Norm(0.577353, 0.577349, 0.577349) UV(0.998343, 0.876688)
V 18: Pos(-0.037932, 0.443994, 0.688038) Norm(-0.577344, 0.577354, 0.577353) UV(0.437515, 0.001657)
V 19: Pos(0.037932, 0.443994, 0.688038) Norm(0.577353, 0.577349, 0.577349) UV(0.91724, 0.001657)
V 20: Pos(0.037932, -0.443994, 0.688038) Norm(0.577344, -0.577354, 0.577353) UV(0.876688, 0.001657)
V 21: Pos(-0.037932, -0.443994, 0.688038) Norm(-0.577353, -0.577349, 0.577349) UV(0.957791, 0.001657)
V 22: Pos(0.037932, -0.443994, -0.688038) Norm(0.577353, -0.577349, -0.577349) UV(0.961105, 0.001657)
V 23: Pos(-0.037932, -0.443994, 0.688038) Norm(-0.577353, -0.577349, 0.577349) UV(0.961105, 0.44083)
===Triangles (Indices): 12
Tri: 0 1 2
Tri: 3 4 5
Tri: 6 7 8
Tri: 9 10 11
Tri: 12 13 14
Tri: 15 16 17
Tri: 0 18 1
Tri: 3 19 4
Tri: 6 20 7
Tri: 9 21 10
Tri: 12 22 13
Tri: 15 23 16

File diff suppressed because it is too large Load Diff

BIN
resources/w/room005.png (Stored with Git LFS)

Binary file not shown.

View File

@ -61,9 +61,12 @@ namespace ZL
#endif #endif
Game::Game() Game::Game()
: newTickCount(0) : /*window(nullptr)
, glContext(nullptr)
, */newTickCount(0)
, lastTickCount(0) , lastTickCount(0)
, menuManager(renderer) , menuManager(renderer)
, space(renderer, taskManager, mainThreadHandler, networkClient, menuManager)
{ {
} }
@ -76,6 +79,9 @@ namespace ZL
} }
void Game::setup() { void Game::setup() {
//glContext = SDL_GL_CreateContext(ZL::Environment::window);
//glContext = in_glContext;
Environment::width = Environment::CONST_DEFAULT_WIDTH; Environment::width = Environment::CONST_DEFAULT_WIDTH;
Environment::height = Environment::CONST_DEFAULT_HEIGHT; Environment::height = Environment::CONST_DEFAULT_HEIGHT;
Environment::computeProjectionDimensions(); Environment::computeProjectionDimensions();
@ -89,11 +95,12 @@ namespace ZL
// so they are available immediately without waiting for resources.zip. // so they are available immediately without waiting for resources.zip.
renderer.shaderManager.AddShaderFromFiles("defaultColor", "resources/shaders/defaultColor.vertex", "resources/shaders/defaultColor_web.fragment", ""); renderer.shaderManager.AddShaderFromFiles("defaultColor", "resources/shaders/defaultColor.vertex", "resources/shaders/defaultColor_web.fragment", "");
renderer.shaderManager.AddShaderFromFiles("default", "resources/shaders/default.vertex", "resources/shaders/default_web.fragment", ""); renderer.shaderManager.AddShaderFromFiles("default", "resources/shaders/default.vertex", "resources/shaders/default_web.fragment", "");
loadingTexture = std::make_unique<Texture>(CreateTextureDataFromPng("resources/loading.png", ""));
#else #else
renderer.shaderManager.AddShaderFromFiles("defaultColor", "resources/shaders/defaultColor.vertex", "resources/shaders/defaultColor_desktop.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("defaultColor", "resources/shaders/defaultColor.vertex", "resources/shaders/defaultColor_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("default", "resources/shaders/default.vertex", "resources/shaders/default_desktop.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("default", "resources/shaders/default.vertex", "resources/shaders/default_desktop.fragment", CONST_ZIP_FILE);
#endif
loadingTexture = std::make_unique<Texture>(CreateTextureDataFromPng("resources/loading.png", CONST_ZIP_FILE)); loadingTexture = std::make_unique<Texture>(CreateTextureDataFromPng("resources/loading.png", CONST_ZIP_FILE));
#endif
float minDimension; float minDimension;
float width = Environment::projectionWidth; float width = Environment::projectionWidth;
@ -148,29 +155,72 @@ namespace ZL
renderer.shaderManager.AddShaderFromFiles("spark", "resources/shaders/spark.vertex", "resources/shaders/spark_desktop.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("spark", "resources/shaders/spark.vertex", "resources/shaders/spark_desktop.fragment", CONST_ZIP_FILE);
#endif #endif
roomTexture = std::make_unique<Texture>(CreateTextureDataFromPng("resources/w/room005.png", CONST_ZIP_FILE)); menuManager.setupMenu();
roomMesh.data = LoadFromTextFile02("resources/w/room001.txt", CONST_ZIP_FILE);
roomMesh.data.RotateByMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(-M_PI*0.5, Eigen::Vector3f::UnitY())).toRotationMatrix());
roomMesh.RefreshVBO();
fireboxTexture = std::make_unique<Texture>(CreateTextureDataFromPng("resources/w/Cube001.png", CONST_ZIP_FILE)); menuManager.onMainMenuEntered = [this]() {
fireboxMesh.data = LoadFromTextFile02("resources/w/firebox.txt", CONST_ZIP_FILE); if (networkClient) {
fireboxMesh.data.RotateByMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(-M_PI * 0.5, Eigen::Vector3f::UnitY())).toRotationMatrix()); networkClient->Disconnect();
fireboxMesh.RefreshVBO(); networkClient.reset();
}
};
inaiTexture = std::make_unique<Texture>(CreateTextureDataFromPng("resources/w/inai001.png", CONST_ZIP_FILE)); menuManager.onSingleplayerPressed = [this](const std::string& nickname, int shipType) {
inaiMesh.data = LoadFromTextFile02("resources/w/inai001.txt", CONST_ZIP_FILE); Environment::shipState.nickname = nickname;
inaiMesh.data.RotateByMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(-M_PI * 0.5, Eigen::Vector3f::UnitY())).toRotationMatrix()); Environment::shipState.shipType = shipType;
inaiMesh.data.Move({ 2.5, 1.4, -9.9 });
inaiMesh.RefreshVBO();
benchTexture = std::make_unique<Texture>(CreateTextureDataFromPng("resources/w/bench001opt.png", CONST_ZIP_FILE)); if (Environment::shipState.shipType == 1)
benchMesh.data = LoadFromTextFile02("resources/w/bench002opt.txt", CONST_ZIP_FILE); {
benchMesh.data.Scale(3.f); menuManager.uiManager.findButton("shootButton")->state = ButtonState::Disabled;
benchMesh.data.RotateByMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(M_PI, Eigen::Vector3f::UnitY())).toRotationMatrix()); menuManager.uiManager.findButton("shootButton2")->state = ButtonState::Disabled;
benchMesh.data.Move({ -2.1, 0.5, -7.9 }); }
benchMesh.RefreshVBO(); else
{
menuManager.uiManager.findButton("shootButton")->state = ButtonState::Normal;
menuManager.uiManager.findButton("shootButton2")->state = ButtonState::Normal;
}
auto localClient = new LocalClient;
ClientState st = Environment::shipState;
st.id = localClient->GetClientId();
localClient->setLocalPlayerState(st);
networkClient = std::unique_ptr<INetworkClient>(localClient);
networkClient->Connect("", 0);
space.resetPlayerState();
lastTickCount = 0;
};
menuManager.onMultiplayerPressed = [this](const std::string& nickname, int shipType) {
Environment::shipState.nickname = nickname;
Environment::shipState.shipType = shipType;
#ifdef EMSCRIPTEN
networkClient = std::make_unique<WebSocketClientEmscripten>();
networkClient->Connect("localhost", 8081);
#else
networkClient = std::make_unique<WebSocketClient>(taskManager.getIOContext());
networkClient->Connect("localhost", 8081);
#endif
if (networkClient) {
std::string joinMsg = std::string("JOIN:") + nickname + ":" + std::to_string(shipType);
networkClient->Send(joinMsg);
std::cerr << "Sent JOIN: " << joinMsg << std::endl;
}
space.boxCoordsArr.clear();
space.boxRenderArr.clear();
space.boxAlive.clear();
space.serverBoxesApplied = false;
space.resetPlayerState();
connectingStartTicks = SDL_GetTicks();
lastTickCount = 0;
};
space.setup();
loadingCompleted = true; loadingCompleted = true;
} }
@ -189,42 +239,11 @@ namespace ZL
CheckGlError(); CheckGlError();
} }
void Game::drawGame() void Game::drawUnderMainMenu()
{ {
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
renderer.shaderManager.PushShader(defaultShaderName);
renderer.RenderUniform1i(textureUniformName, 0);
renderer.PushPerspectiveProjectionMatrix(1.0 / 1.5,
static_cast<float>(Environment::width) / static_cast<float>(Environment::height),
Environment::CONST_Z_NEAR, Environment::CONST_Z_FAR);
renderer.PushMatrix();
renderer.LoadIdentity();
renderer.TranslateMatrix({ 0,0, -1.0f * Environment::zoom });
renderer.TranslateMatrix({ 0, -6.f, 0 }); //Ship camera offset
renderer.RotateMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(M_PI * 30 / 180.f, Eigen::Vector3f::UnitX())).toRotationMatrix());
glBindTexture(GL_TEXTURE_2D, roomTexture->getTexID());
renderer.DrawVertexRenderStruct(roomMesh);
glBindTexture(GL_TEXTURE_2D, fireboxTexture->getTexID());
renderer.DrawVertexRenderStruct(fireboxMesh);
glBindTexture(GL_TEXTURE_2D, inaiTexture->getTexID());
renderer.DrawVertexRenderStruct(inaiMesh);
glBindTexture(GL_TEXTURE_2D, benchTexture->getTexID());
renderer.DrawVertexRenderStruct(benchMesh);
renderer.PopMatrix();
renderer.PopProjectionMatrix();
renderer.shaderManager.PopShader();
} }
void Game::drawScene() { void Game::drawScene() {
@ -234,7 +253,14 @@ namespace ZL
} }
else else
{ {
drawGame();
if (menuManager.shouldRenderSpace()) {
space.drawScene();
}
else
{
drawUnderMainMenu();
}
drawUI(); drawUI();
} }
CheckGlError(); CheckGlError();
@ -267,14 +293,19 @@ namespace ZL
CheckGlError(); CheckGlError();
} }
int64_t Game::getSyncTimeMs() { int64_t Game::getSyncTimeMs() {
int64_t localNow = std::chrono::duration_cast<std::chrono::milliseconds>( int64_t localNow = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now().time_since_epoch()).count(); std::chrono::system_clock::now().time_since_epoch()).count();
return localNow; if(networkClient)
{
return localNow + networkClient->getTimeOffset();
}
else
{
return localNow;
}
} }
void Game::processTickCount() { void Game::processTickCount() {
if (lastTickCount == 0) { if (lastTickCount == 0) {
@ -292,19 +323,30 @@ namespace ZL
if (newTickCount - lastTickCount > CONST_TIMER_INTERVAL) { if (newTickCount - lastTickCount > CONST_TIMER_INTERVAL) {
int64_t delta = newTickCount - lastTickCount; int64_t delta = newTickCount - lastTickCount;
if (delta > CONST_MAX_TIME_INTERVAL)
{
//throw std::runtime_error("Synchronization is lost");
}
if (menuManager.shouldRenderSpace()) {
space.processTickCount(newTickCount, delta);
}
menuManager.uiManager.update(static_cast<float>(delta));
lastTickCount = newTickCount; lastTickCount = newTickCount;
} }
} }
void Game::render() { void Game::render() {
//SDL_GL_MakeCurrent(ZL::Environment::window, glContext);
ZL::CheckGlError(); ZL::CheckGlError();
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//processTickCount();
drawScene(); drawScene();
processTickCount(); processTickCount();
//std::this_thread::sleep_for(std::chrono::milliseconds(50));
SDL_GL_SwapWindow(ZL::Environment::window); SDL_GL_SwapWindow(ZL::Environment::window);
} }
@ -322,10 +364,10 @@ namespace ZL
Environment::width = event.window.data1; Environment::width = event.window.data1;
Environment::height = event.window.data2; Environment::height = event.window.data2;
Environment::computeProjectionDimensions(); Environment::computeProjectionDimensions();
//menuManager.uiManager.updateAllLayouts(); menuManager.uiManager.updateAllLayouts();
std::cout << "Window resized: " << Environment::width << "x" << Environment::height << std::endl; std::cout << "Window resized: " << Environment::width << "x" << Environment::height << std::endl;
//space.clearTextRendererCache(); space.clearTextRendererCache();
} }
#ifdef __ANDROID__ #ifdef __ANDROID__
@ -403,14 +445,14 @@ namespace ZL
// Обработка ввода текста // Обработка ввода текста
if (event.type == SDL_KEYDOWN) { if (event.type == SDL_KEYDOWN) {
if (event.key.keysym.sym == SDLK_BACKSPACE) { if (event.key.keysym.sym == SDLK_BACKSPACE) {
//menuManager.uiManager.onKeyBackspace(); menuManager.uiManager.onKeyBackspace();
} }
} }
if (event.type == SDL_TEXTINPUT) { if (event.type == SDL_TEXTINPUT) {
// Пропускаем ctrl+c и другие команды // Пропускаем ctrl+c и другие команды
if ((event.text.text[0] & 0x80) == 0) { // ASCII символы if ((event.text.text[0] & 0x80) == 0) { // ASCII символы
//menuManager.uiManager.onKeyPress((unsigned char)event.text.text[0]); menuManager.uiManager.onKeyPress((unsigned char)event.text.text[0]);
} }
} }
@ -419,30 +461,65 @@ namespace ZL
std::cout << "Camera position: x=" << x << " y=" << y << " z=" << z << std::endl; std::cout << "Camera position: x=" << x << " y=" << y << " z=" << z << std::endl;
} }
} }
if (event.type == SDL_KEYUP) {
/*benchMesh.data.Move({-x, -y, 0});
if (event.key.keysym.sym == SDLK_a) {
x = x - 0.1;
}
if (event.key.keysym.sym == SDLK_d) {
x = x + 0.1;
}
if (event.key.keysym.sym == SDLK_w) {
y = y - 0.1;
}
if (event.key.keysym.sym == SDLK_s) {
y = y + 0.1;
}
benchMesh.data.Move({ x, y, 0 });
benchMesh.RefreshVBO();*/
}
#endif #endif
} }
render(); render();
if (networkClient) {
//#ifndef NETWORK
auto localClient = dynamic_cast<ZL::LocalClient*>(networkClient.get());
if (localClient) {
localClient->setLocalPlayerState(Environment::shipState);
}
//#endif
networkClient->Poll();
if (menuManager.getState() == GameState::Connecting) {
if (networkClient->IsConnected()) {
menuManager.notifyConnected();
// Enable/disable shoot buttons based on ship type
if (Environment::shipState.shipType == 1) {
if (auto b = menuManager.uiManager.findButton("shootButton")) b->state = ButtonState::Disabled;
if (auto b = menuManager.uiManager.findButton("shootButton2")) b->state = ButtonState::Disabled;
} else {
if (auto b = menuManager.uiManager.findButton("shootButton")) b->state = ButtonState::Normal;
if (auto b = menuManager.uiManager.findButton("shootButton2")) b->state = ButtonState::Normal;
}
} else if (SDL_GetTicks() - connectingStartTicks > CONNECTING_TIMEOUT_MS) {
menuManager.notifyConnectionFailed();
}
}
#ifdef NETWORK
auto* wsBase = dynamic_cast<ZL::WebSocketClientBase*>(networkClient.get());
if (wsBase) {
auto spawns = wsBase->getPendingSpawns();
for (auto& st : spawns) {
if (st.id == wsBase->getClientId()) {
// применяем к локальному кораблю
ZL::Environment::shipState.position = st.position;
ZL::Environment::shipState.rotation = st.rotation;
// обнуляем движение чтобы не было рывков
ZL::Environment::shipState.currentAngularVelocity = Eigen::Vector3f::Zero();
ZL::Environment::shipState.velocity = 0.0f;
ZL::Environment::shipState.selectedVelocity = 0;
ZL::Environment::shipState.discreteMag = 0.0f;
ZL::Environment::shipState.discreteAngle = -1;
std::cout << "Game: Applied SPAWN at "
<< st.position.x() << ", "
<< st.position.y() << ", "
<< st.position.z() << std::endl;
}
}
}
#endif
}
mainThreadHandler.processMainThreadTasks(); mainThreadHandler.processMainThreadTasks();
if (menuManager.shouldRenderSpace()) {
space.update();
}
} }
void Game::handleDown(int64_t fingerId, int mx, int my) void Game::handleDown(int64_t fingerId, int mx, int my)
@ -450,9 +527,13 @@ namespace ZL
int uiX = mx; int uiX = mx;
int uiY = Environment::projectionHeight - my; int uiY = Environment::projectionHeight - my;
menuManager.uiManager.onTouchDown(fingerId, uiX, uiY); menuManager.uiManager.onTouchDown(fingerId, uiX, uiY);
if (!menuManager.uiManager.isUiInteractionForFinger(fingerId)) {
if (menuManager.shouldRenderSpace()) {
space.handleDown(mx, my);
}
}
} }
void Game::handleUp(int64_t fingerId, int mx, int my) void Game::handleUp(int64_t fingerId, int mx, int my)
@ -466,6 +547,11 @@ namespace ZL
bool wasUiInteraction = menuManager.uiManager.isUiInteractionForFinger(fingerId); bool wasUiInteraction = menuManager.uiManager.isUiInteractionForFinger(fingerId);
menuManager.uiManager.onTouchUp(fingerId, uiX, uiY); menuManager.uiManager.onTouchUp(fingerId, uiX, uiY);
if (!wasUiInteraction) {
if (menuManager.shouldRenderSpace()) {
space.handleUp(mx, my);
}
}
} }
void Game::handleMotion(int64_t fingerId, int mx, int my) void Game::handleMotion(int64_t fingerId, int mx, int my)
@ -478,6 +564,11 @@ namespace ZL
bool wasUiInteraction = menuManager.uiManager.isUiInteractionForFinger(fingerId); bool wasUiInteraction = menuManager.uiManager.isUiInteractionForFinger(fingerId);
menuManager.uiManager.onTouchMove(fingerId, uiX, uiY); menuManager.uiManager.onTouchMove(fingerId, uiX, uiY);
if (!wasUiInteraction) {
if (menuManager.shouldRenderSpace()) {
space.handleMotion(mx, my);
}
}
} }

View File

@ -37,31 +37,19 @@ namespace ZL {
Renderer renderer; Renderer renderer;
TaskManager taskManager; TaskManager taskManager;
MainThreadHandler mainThreadHandler; MainThreadHandler mainThreadHandler;
//std::unique_ptr<INetworkClient> networkClient; std::unique_ptr<INetworkClient> networkClient;
std::shared_ptr<Texture> loadingTexture; std::shared_ptr<Texture> loadingTexture;
VertexRenderStruct loadingMesh; VertexRenderStruct loadingMesh;
bool loadingCompleted = false; bool loadingCompleted = false;
std::shared_ptr<Texture> roomTexture;
VertexRenderStruct roomMesh;
std::shared_ptr<Texture> fireboxTexture;
VertexRenderStruct fireboxMesh;
std::shared_ptr<Texture> inaiTexture;
VertexRenderStruct inaiMesh;
std::shared_ptr<Texture> benchTexture;
VertexRenderStruct benchMesh;
private: private:
int64_t getSyncTimeMs(); int64_t getSyncTimeMs();
void processTickCount(); void processTickCount();
void drawScene(); void drawScene();
void drawUI(); void drawUI();
void drawGame(); void drawUnderMainMenu();
void drawLoading(); void drawLoading();
void handleDown(int64_t fingerId, int mx, int my); void handleDown(int64_t fingerId, int mx, int my);
void handleUp(int64_t fingerId, int mx, int my); void handleUp(int64_t fingerId, int mx, int my);
@ -85,7 +73,7 @@ namespace ZL {
static const size_t CONST_MAX_TIME_INTERVAL = 1000; static const size_t CONST_MAX_TIME_INTERVAL = 1000;
MenuManager menuManager; MenuManager menuManager;
//Space space; Space space;
}; };

View File

@ -15,7 +15,6 @@ namespace ZL {
{ {
} }
/*
void MenuManager::setupMenu() void MenuManager::setupMenu()
{ {
mainMenuRoot = loadUiFromFile("resources/config/main_menu.json", renderer, CONST_ZIP_FILE); mainMenuRoot = loadUiFromFile("resources/config/main_menu.json", renderer, CONST_ZIP_FILE);
@ -257,7 +256,12 @@ namespace ZL {
} }
/*
auto velocityTv = uiManager.findTextView("velocityText");
if (velocityTv) {
velocityTv->rect.x = 10.0f;
velocityTv->rect.y = static_cast<float>(Environment::height) - velocityTv->rect.h - 10.0f;
}*/
uiManager.setButtonPressCallback("shootButton", [this](const std::string&) { uiManager.setButtonPressCallback("shootButton", [this](const std::string&) {
if (onFirePressed) onFirePressed(); if (onFirePressed) onFirePressed();
@ -313,6 +317,14 @@ namespace ZL {
}); });
/*
uiManager.setSliderCallback("velocitySlider", [this](const std::string&, float value) {
int newVel = static_cast<int>(roundf(value * 10));
if (newVel > 2) newVel = 2;
if (newVel != Environment::shipState.selectedVelocity) {
if (onVelocityChanged) onVelocityChanged(newVel);
}
});*/
} }
// ── State: GameOver ────────────────────────────────────────────────────── // ── State: GameOver ──────────────────────────────────────────────────────
@ -387,6 +399,6 @@ namespace ZL {
if (state == GameState::Gameplay) { if (state == GameState::Gameplay) {
enterConnectionLost(); enterConnectionLost();
} }
}*/ }
} // namespace ZL } // namespace ZL

View File

@ -24,7 +24,7 @@ namespace ZL {
class MenuManager { class MenuManager {
protected: protected:
Renderer& renderer; Renderer& renderer;
/*
// Pre-loaded UI roots (loaded once in setupMenu) // Pre-loaded UI roots (loaded once in setupMenu)
std::shared_ptr<UiNode> mainMenuRoot; std::shared_ptr<UiNode> mainMenuRoot;
std::shared_ptr<UiNode> aboutMenuRoot; std::shared_ptr<UiNode> aboutMenuRoot;
@ -53,15 +53,14 @@ namespace ZL {
void enterGameOver(int score); void enterGameOver(int score);
void enterHelp(); void enterHelp();
void enterConnectionLost(); void enterConnectionLost();
*/
public: public:
UiManager uiManager; UiManager uiManager;
MenuManager(Renderer& iRenderer); MenuManager(Renderer& iRenderer);
//void setupMenu(); void setupMenu();
/*
// Returns true for states where Space should render and run (Gameplay, GameOver, ConnectionLost) // Returns true for states where Space should render and run (Gameplay, GameOver, ConnectionLost)
bool shouldRenderSpace() const; bool shouldRenderSpace() const;
GameState getState() const { return state; } GameState getState() const { return state; }
@ -82,7 +81,7 @@ namespace ZL {
std::function<void(const std::string&, int)> onMultiplayerPressed; std::function<void(const std::string&, int)> onMultiplayerPressed;
std::function<void()> onShowPlayersPressed; std::function<void()> onShowPlayersPressed;
std::function<void()> forceSetupSpaceUICallback;*/ std::function<void()> forceSetupSpaceUICallback;
}; };
} // namespace ZL } // namespace ZL

View File

@ -265,7 +265,7 @@ namespace ZL
// Обновленные регулярки // Обновленные регулярки
// pattern_float стал чуть надежнее для чисел вида "0" или "-1" без точки, если вдруг Python округлит до int // pattern_float стал чуть надежнее для чисел вида "0" или "-1" без точки, если вдруг Python округлит до int
static const std::regex pattern_count(R"(\d+)"); static const std::regex pattern_count(R"(\d+)");
static const std::regex pattern_float(R"([-+]?\d*\.?\d+([eE][-+]?\d+)?)"); static const std::regex pattern_float(R"([-]?\d+(\.\d+)?)");
static const std::regex pattern_int(R"([-]?\d+)"); static const std::regex pattern_int(R"([-]?\d+)");
// --- 2. Парсинг Вершин (Pos + Norm + UV) --- // --- 2. Парсинг Вершин (Pos + Norm + UV) ---
@ -317,11 +317,6 @@ namespace ZL
throw std::runtime_error("Malformed vertex line at index " + std::to_string(i)); throw std::runtime_error("Malformed vertex line at index " + std::to_string(i));
} }
/*if (floatValues[2] > 1.f)
{
std::cout << "got" << std::endl;
}*/
tempPositions[i] = Vector3f{ floatValues[1], floatValues[2], floatValues[3] }; tempPositions[i] = Vector3f{ floatValues[1], floatValues[2], floatValues[3] };
tempNormals[i] = Vector3f{ floatValues[4], floatValues[5], floatValues[6] }; tempNormals[i] = Vector3f{ floatValues[4], floatValues[5], floatValues[6] };
tempUVs[i] = Vector2f{ floatValues[7], floatValues[8] }; tempUVs[i] = Vector2f{ floatValues[7], floatValues[8] };