From ff95163bcd263fe6c458437eb61bf9ab429eaf3b Mon Sep 17 00:00:00 2001 From: Vladislav Khorev Date: Fri, 16 Jan 2026 18:11:52 +0300 Subject: [PATCH] Yee render works --- src/Game.cpp | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/Game.h | 2 +- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/Game.cpp b/src/Game.cpp index 8ab04c9..fe8cab4 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -548,12 +548,71 @@ namespace ZL glClear(GL_DEPTH_BUFFER_BIT); } drawShip(); + drawRemoteShips(); drawBoxes(); drawUI(); CheckGlError(); } + void Game::drawRemoteShips() { + // Используем те же константы имен для шейдеров, что и в drawShip + static const std::string defaultShaderName = "default"; + static const std::string vPositionName = "vPosition"; + static const std::string vTexCoordName = "vTexCoord"; + static const std::string textureUniformName = "Texture"; + + // Активируем шейдер и текстуру (предполагаем, что меш у всех одинаковый) + renderer.shaderManager.PushShader(defaultShaderName); + renderer.RenderUniform1i(textureUniformName, 0); + + renderer.EnableVertexAttribArray(vPositionName); + renderer.EnableVertexAttribArray(vTexCoordName); + + renderer.PushPerspectiveProjectionMatrix(1.0 / 1.5, + static_cast(Environment::width) / static_cast(Environment::height), + Environment::CONST_Z_NEAR, Environment::CONST_Z_FAR); + + // Биндим текстуру корабля один раз для всех удаленных игроков (оптимизация батчинга) + glBindTexture(GL_TEXTURE_2D, spaceshipTexture->getTexID()); + + // Итерируемся по актуальным данным из extrapolateRemotePlayers + for (auto const& [id, playerState] : latestRemotePlayers) { + //if (id == networkClient->GetClientId()) continue; // Не рисуем себя через этот цикл + + renderer.PushMatrix(); + renderer.LoadIdentity(); + + // 1. Камера и вид игрока + renderer.TranslateMatrix({ 0, 0, -1.0f * Environment::zoom }); + renderer.RotateMatrix(Environment::inverseShipMatrix); + + // 2. Относительная позиция (ОЧЕНЬ ВАЖНО) + // Мы перемещаем объект в позицию (Враг - Я) + // Если враг в 44928, а я в 45000, результат будет -72 по Z. + // Поскольку камера смотрит в -Z, корабль должен быть ПЕРЕД нами. + Eigen::Vector3f relativePos = playerState.position - Environment::shipPosition; + renderer.TranslateMatrix(relativePos); + + // 3. Поворот врага + renderer.RotateMatrix(playerState.rotation); + + // 4. Смещение самого меша (если оно есть в drawShip, оно должно быть и тут) + // В твоем drawShip() есть: renderer.TranslateMatrix({ 0, -6.f, 0 }); + renderer.TranslateMatrix({ 0, -6.f, 0 }); + + renderer.DrawVertexRenderStruct(spaceship); + renderer.PopMatrix(); + } + + renderer.PopProjectionMatrix(); + renderer.DisableVertexAttribArray(vPositionName); + renderer.DisableVertexAttribArray(vTexCoordName); + renderer.shaderManager.PopShader(); + + CheckGlError(); + } + void Game::processTickCount() { if (lastTickCount == 0) { diff --git a/src/Game.h b/src/Game.h index 83d9b36..5724a1e 100644 --- a/src/Game.h +++ b/src/Game.h @@ -44,7 +44,7 @@ namespace ZL { void drawShip(); void drawBoxes(); void drawUI(); - + void drawRemoteShips(); void fireProjectiles(); void handleDown(int mx, int my);