From db4254e2058a6805e9565cfc0fc05dce1192a0f1 Mon Sep 17 00:00:00 2001 From: Vladislav Khorev Date: Mon, 23 Feb 2026 11:45:55 +0300 Subject: [PATCH] working on web --- src/MenuManager.cpp | 4 +-- src/Space.cpp | 27 ++++++++++++++++--- src/network/WebSocketClientEmscripten.cpp | 4 +-- src/render/Renderer.cpp | 32 ++++++++++++++++++++--- 4 files changed, 55 insertions(+), 12 deletions(-) diff --git a/src/MenuManager.cpp b/src/MenuManager.cpp index e14bd56..752552c 100644 --- a/src/MenuManager.cpp +++ b/src/MenuManager.cpp @@ -103,10 +103,10 @@ namespace ZL { }); uiManager.setSliderCallback("velocitySlider", [this](const std::string& name, float value) { int newVel = roundf(value * 10); - /*if (newVel > 2) + if (newVel > 2) { newVel = 2; - }*/ + } if (newVel != Environment::shipState.selectedVelocity) { onVelocityChanged(newVel); diff --git a/src/Space.cpp b/src/Space.cpp index acff0dd..7dd4e16 100644 --- a/src/Space.cpp +++ b/src/Space.cpp @@ -816,11 +816,16 @@ namespace ZL // defaultColor shader likely uses vColor (vec3), но нам нужен alpha. // У тебя в Renderer есть RenderUniform4fv, но шейдер может брать vColor. - // Поэтому: сделаем ColorData vec3, а alpha дадим через uniform uColor, если есть. - // Если в defaultColor нет uniform uColor — тогда alpha будет 1.0. - // Для совместимости: кладём RGB, alpha будем задавать uniform'ом отдельно. + // Поэтому: сделаем ColorData vec3, а alpha будем задавать uniform'ом отдельно. Vector3f rgb{ rgba.x(), rgba.y(), rgba.z() }; v.ColorData = { rgb, rgb, rgb, rgb, rgb, rgb }; + + // defaultColor vertex shader expects vNormal and vTexCoord; provide valid values + // so WebGL/GLSL doesn't get NaN from normalize(vec3(0,0,0)). + const Vector3f n{ 0.f, 0.f, 1.f }; + v.NormalData = { n, n, n, n, n, n }; + const Vector2f uv{ 0.f, 0.f }; + v.TexCoordData = { uv, uv, uv, uv, uv, uv }; return v; } @@ -915,7 +920,7 @@ namespace ZL // 4) Настройки стиля Eigen::Vector4f enemyColor(1.f, 0.f, 0.f, 1.f); // красный - float thickness = 2.0f; // толщина линий (px) + float thickness = 10.0f; // толщина линий (px) float z = 0.0f; // 2D слой // 5) Если цель в кадре: рисуем скобки @@ -959,12 +964,14 @@ namespace ZL glDisable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glClear(GL_DEPTH_BUFFER_BIT); renderer.shaderManager.PushShader("defaultColor"); renderer.PushProjectionMatrix((float)Environment::width, (float)Environment::height, 0.f, 1.f); renderer.PushMatrix(); renderer.LoadIdentity(); +<<<<<<< Updated upstream // рисуем кружок упреждения (только если есть решение) if (haveLead) { float leadNdcX, leadNdcY, leadNdcZ, leadClipW; @@ -987,6 +994,10 @@ namespace ZL } } } +======= + renderer.EnableVertexAttribArray("vPosition"); + +>>>>>>> Stashed changes // верх-лево: горизонт + вертикаль drawBar(left + cornerLen * 0.5f, top, cornerLen, thickness); @@ -1004,6 +1015,9 @@ namespace ZL drawBar(right - cornerLen * 0.5f, bottom, cornerLen, thickness); drawBar(right, bottom + cornerLen * 0.5f, thickness, cornerLen); + renderer.DisableVertexAttribArray("vPosition"); + + renderer.PopMatrix(); renderer.PopProjectionMatrix(); renderer.shaderManager.PopShader(); @@ -1069,6 +1083,11 @@ namespace ZL v.PositionData = { a, b, c }; Vector3f rgb{ enemyColor.x(), enemyColor.y(), enemyColor.z() }; v.ColorData = { rgb, rgb, rgb }; + // defaultColor vertex shader expects vNormal and vTexCoord (avoids NaN on WebGL). + const Vector3f n{ 0.f, 0.f, 1.f }; + v.NormalData = { n, n, n }; + const Vector2f uv{ 0.f, 0.f }; + v.TexCoordData = { uv, uv, uv }; hudTempMesh.AssignFrom(v); renderer.DrawVertexRenderStruct(hudTempMesh); }; diff --git a/src/network/WebSocketClientEmscripten.cpp b/src/network/WebSocketClientEmscripten.cpp index 9534cf0..98044e9 100644 --- a/src/network/WebSocketClientEmscripten.cpp +++ b/src/network/WebSocketClientEmscripten.cpp @@ -7,8 +7,8 @@ namespace ZL { void WebSocketClientEmscripten::Connect(const std::string& host, uint16_t port) { // Формируем URL. Обратите внимание, что в Web часто лучше использовать ws://localhost - std::string url = "ws://" + host + ":" + std::to_string(port); - //std::string url = "wss://api.spacegame.fishrungames.com"; + //std::string url = "ws://" + host + ":" + std::to_string(port); + std::string url = "wss://api.spacegame.fishrungames.com"; EmscriptenWebSocketCreateAttributes attr = { url.c_str(), diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index a11ed19..721ae54 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -895,41 +895,65 @@ namespace ZL { static const std::string vColor("vColor"); static const std::string vTexCoord("vTexCoord"); static const std::string vPosition("vPosition"); - - //glBindVertexArray(VertexRenderStruct.vao->getBuffer()); - //Check if main thread, check if data is not empty... + // On WebGL (and when not using VAO), vertex attribute arrays must be explicitly + // enabled before drawing. Desktop with VAO can rely on stored state; WebGL cannot. if (VertexRenderStruct.data.NormalData.size() > 0) { glBindBuffer(GL_ARRAY_BUFFER, VertexRenderStruct.normalVBO->getBuffer()); VertexAttribPointer3fv(vNormal, 0, NULL); + EnableVertexAttribArray(vNormal); + } + else + { + DisableVertexAttribArray(vNormal); } if (VertexRenderStruct.data.TangentData.size() > 0) { glBindBuffer(GL_ARRAY_BUFFER, VertexRenderStruct.tangentVBO->getBuffer()); VertexAttribPointer3fv(vTangent, 0, NULL); + EnableVertexAttribArray(vTangent); + } + else + { + DisableVertexAttribArray(vTangent); } if (VertexRenderStruct.data.BinormalData.size() > 0) { glBindBuffer(GL_ARRAY_BUFFER, VertexRenderStruct.binormalVBO->getBuffer()); VertexAttribPointer3fv(vBinormal, 0, NULL); + EnableVertexAttribArray(vBinormal); + } + else + { + DisableVertexAttribArray(vBinormal); } if (VertexRenderStruct.data.ColorData.size() > 0) { glBindBuffer(GL_ARRAY_BUFFER, VertexRenderStruct.colorVBO->getBuffer()); VertexAttribPointer3fv(vColor, 0, NULL); + EnableVertexAttribArray(vColor); + } + else + { + DisableVertexAttribArray(vColor); } if (VertexRenderStruct.data.TexCoordData.size() > 0) { glBindBuffer(GL_ARRAY_BUFFER, VertexRenderStruct.texCoordVBO->getBuffer()); VertexAttribPointer2fv(vTexCoord, 0, NULL); + EnableVertexAttribArray(vTexCoord); + } + else + { + DisableVertexAttribArray(vTexCoord); } glBindBuffer(GL_ARRAY_BUFFER, VertexRenderStruct.positionVBO->getBuffer()); VertexAttribPointer3fv(vPosition, 0, NULL); + EnableVertexAttribArray(vPosition); glDrawArrays(GL_TRIANGLES, 0, static_cast(VertexRenderStruct.data.PositionData.size())); - } void worldToScreenCoordinates(Vector3f objectPos,