From b055faf882b2a03ae6166c093871f26e7c49cd31 Mon Sep 17 00:00:00 2001 From: Vladislav Khorev Date: Thu, 8 Jan 2026 23:23:39 +0300 Subject: [PATCH] Working on web version --- CMakeLists.txt | 2 +- Readme.md | 2 +- ...ent => defaultAtmosphere_desktop.fragment} | 0 shaders/defaultAtmosphere_web.fragment | 125 ++++++++++++++++++ shaders/env_sky_web.fragment | 37 ++++++ shaders/planet_bake_web.fragment | 14 ++ shaders/planet_land.vertex | 2 +- shaders/planet_land_web.fragment | 116 ++++++++++++++++ shaders/planet_stone.vertex | 2 +- shaders/planet_stone_web.fragment | 102 ++++++++++++++ src/Game.cpp | 34 +++-- src/planet/PlanetData.cpp | 4 +- src/planet/PlanetObject.cpp | 29 ++-- 13 files changed, 439 insertions(+), 30 deletions(-) rename shaders/{defaultAtmosphere.fragment => defaultAtmosphere_desktop.fragment} (100%) create mode 100644 shaders/defaultAtmosphere_web.fragment create mode 100644 shaders/env_sky_web.fragment create mode 100644 shaders/planet_bake_web.fragment create mode 100644 shaders/planet_land_web.fragment create mode 100644 shaders/planet_stone_web.fragment diff --git a/CMakeLists.txt b/CMakeLists.txt index 2227018..aaeea34 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -503,7 +503,7 @@ set_target_properties(space-game001 PROPERTIES target_compile_definitions(space-game001 PRIVATE PNG_ENABLED SDL_MAIN_HANDLED -# SIMPLIFIED + SIMPLIFIED ) # Линкуем с SDL2main, если он вообще установлен diff --git a/Readme.md b/Readme.md index e6bdace..874bf39 100644 --- a/Readme.md +++ b/Readme.md @@ -157,7 +157,7 @@ emrun --no_browser --port 8080 . # Emscripten new ``` -emcc src/main.cpp src/Game.cpp src/Environment.cpp src/BoneAnimatedModel.cpp src/TextModel.cpp src/Projectile.cpp src/SparkEmitter.cpp src/UiManager.cpp src/render/Renderer.cpp src/render/ShaderManager.cpp src/render/TextureManager.cpp src/render/FrameBuffer.cpp src/render/OpenGlExtensions.cpp src/utils/Utils.cpp src/utils/Perlin.cpp src/planet/PlanetData.cpp src/planet/PlanetObject.cpp src/planet/StoneObject.cpp -O2 -std=c++17 -pthread -sUSE_PTHREADS=1 -sPTHREAD_POOL_SIZE=4 -sTOTAL_MEMORY=4294967296 -sINITIAL_MEMORY=3221225472 -sMAXIMUM_MEMORY=4294967296 -sALLOW_MEMORY_GROWTH=1 -I./thirdparty1/eigen-5.0.0 -I./src -I./thirdparty/libzip-1.11.3/build-emcmake/install/include -L./thirdparty/libzip-1.11.3/build-emcmake/install/lib -lzip -lz -sUSE_SDL_IMAGE=2 -sUSE_SDL=2 -sUSE_LIBPNG=1 -DSIMPLIFIED=1 --preload-file space-game001.zip -o space-game001.html +emcc src/main.cpp src/Game.cpp src/Environment.cpp src/BoneAnimatedModel.cpp src/TextModel.cpp src/Projectile.cpp src/SparkEmitter.cpp src/UiManager.cpp src/render/Renderer.cpp src/render/ShaderManager.cpp src/render/TextureManager.cpp src/render/FrameBuffer.cpp src/render/OpenGlExtensions.cpp src/utils/Utils.cpp src/utils/Perlin.cpp src/planet/PlanetData.cpp src/planet/PlanetObject.cpp src/planet/StoneObject.cpp -O2 -std=c++17 -pthread -sUSE_PTHREADS=1 -sPTHREAD_POOL_SIZE=4 -sTOTAL_MEMORY=4294967296 -sINITIAL_MEMORY=3221225472 -sMAXIMUM_MEMORY=4294967296 -sALLOW_MEMORY_GROWTH=1 -I./thirdparty1/eigen-5.0.0 -I./src -I./thirdparty/libzip-1.11.3/build-emcmake/install/include -L./thirdparty/libzip-1.11.3/build-emcmake/install/lib -lzip -lz -sUSE_SDL_IMAGE=2 -sUSE_SDL=2 -sUSE_LIBPNG=1 -DSIMPLIFIED=1 --preload-file space-game001x.zip -o space-game001.html ``` # License diff --git a/shaders/defaultAtmosphere.fragment b/shaders/defaultAtmosphere_desktop.fragment similarity index 100% rename from shaders/defaultAtmosphere.fragment rename to shaders/defaultAtmosphere_desktop.fragment diff --git a/shaders/defaultAtmosphere_web.fragment b/shaders/defaultAtmosphere_web.fragment new file mode 100644 index 0000000..8ad78af --- /dev/null +++ b/shaders/defaultAtmosphere_web.fragment @@ -0,0 +1,125 @@ +precision highp float; + +// Фрагментный шейдер: +uniform vec3 uColor; +uniform float uDistanceToPlanetSurface; // Расстояние корабля до поверхности + +// Константы затухания, определенные прямо в шейдере +const float DIST_FOG_MAX = 2000.0; +const float DIST_FOG_MIN = 1000.0; + +varying vec3 vWorldNormal; +varying vec3 vViewNormal; +varying vec3 vViewPosition; + + +// Добавь эти uniform-ы +//uniform float uTime; +uniform vec3 uLightDirView; +uniform vec3 uPlayerDirWorld; + +// Простая функция псевдослучайного шума +float hash(float n) { return fract(sin(n) * 43758.5453123); } + +float noise(vec3 x) { + vec3 p = floor(x); + vec3 f = fract(x); + f = f * f * (3.0 - 2.0 * f); + float n = p.x + p.y * 57.0 + 113.0 * p.z; + return mix(mix(mix(hash(n + 0.0), hash(n + 1.0), f.x), + mix(hash(n + 57.0), hash(n + 58.0), f.x), f.y), + mix(mix(hash(n + 113.0), hash(n + 114.0), f.x), + mix(hash(n + 170.0), hash(n + 171.0), f.x), f.y), f.z); +} + +// Fractal Brownian Motion для "кучевости" облаков +float fbm(vec3 p) { + float f = 0.5000 * noise(p); p *= 2.02; + f += 0.2500 * noise(p); p *= 2.03; + f += 0.1250 * noise(p); + return f; +} + +void main() +{ +//gl_FragColor = vec4(1.0, 0.0, 0.0, 0.5); + + vec3 normal = normalize(vViewNormal); + vec3 viewVector = normalize(-vViewPosition); + float NdotV = dot(normal, viewVector); + + // Вектор направления от центра планеты к текущему фрагменту атмосферы (Мировой) + vec3 fragmentDir = normalize(vWorldNormal); + // Вектор направления от центра планеты к игроку (нужно передать как uniform) + // Передай его в C++: renderer.RenderUniform3fv("uPlayerDirWorld", playerDirWorld.data()); + + + // --- 1. Плавное отсечение за горизонтом (Horizon Mask) --- + // Считаем косинус угла между игроком и точкой атмосферы + float cosAngle = dot(fragmentDir, uPlayerDirWorld); + // Плавно затухаем от 0.0 (горизонт) до 0.2 (над головой) + //float horizonMask = smoothstep(0.0, 0.4, cosAngle); + float horizonMask = smoothstep(0.93, 1.0, cosAngle); + + + // --- 2. Плавный переход при прохождении сквозь слой (Transition Mask) --- + // Определяем "высоту" игрока относительно слоя (напр. слой на 1.03 * R) + // uDistanceToPlanetSurface уже вычислен в PlanetData + float layerHeight = 600.0; // Примерная толщина слоя атмосферы (3% от 20000) + + // Делаем прозрачным при приближении к границе (dist около layerHeight) + // и снова видимым, когда спустились ниже + float distToLayer = abs(uDistanceToPlanetSurface - layerHeight); + float transitionMask = smoothstep(0.0, 200.0, distToLayer); + + // --- 3. Освещение и облака --- + float diff = max(dot(normal, uLightDirView), 0.0); + if (uDistanceToPlanetSurface < layerHeight) { + diff = max(dot(-normal, uLightDirView), 0.0); // Инверсия для взгляда снизу + } + float lightIntensity = diff + 0.05; + + vec3 cloudCoord = fragmentDir * 6.0; + //cloudCoord.x += uTime * 0.03; + float n = fbm(cloudCoord); + float cloudMask = smoothstep(0.4, 0.65, n); + + // --- 4. Финальный расчет альфы --- + float atmosphereDensity = pow(1.0 - abs(NdotV), 5.0); + float distanceFactor = clamp((uDistanceToPlanetSurface - DIST_FOG_MIN) / (DIST_FOG_MAX - DIST_FOG_MIN), 0.0, 1.0); + + // Базовая прозрачность облаков + float cloudAlpha = cloudMask * 0.8; + + // Применяем маски: + // В космосе важен distanceFactor, на планете важен horizonMask + float finalCloudAlpha = cloudAlpha * transitionMask; + if (uDistanceToPlanetSurface < layerHeight) { + finalCloudAlpha *= horizonMask; // На планете скрываем то, что под ногами + } else { + finalCloudAlpha *= distanceFactor; // В космосе скрываем по вашей старой логике + if (NdotV <=0.0) + { + //finalCloudAlpha = 0.0; + discard; + } + } + + vec3 currentAtmo = mix(vec3(0.01, 0.02, 0.1), uColor, lightIntensity); + vec3 currentCloud = mix(vec3(0.1, 0.1, 0.15), vec3(1.0, 1.0, 1.0), lightIntensity); + vec3 finalRGB = mix(currentAtmo, currentCloud, cloudMask); + //vec3 finalRGB = currentAtmo; + + // Для дымки (atmo) оставляем затухание при посадке + float atmoAlpha = atmosphereDensity * distanceFactor; + //float atmoAlpha = distanceFactor; + + float finalAtmoAlpha = atmoAlpha; + + if (uDistanceToPlanetSurface < layerHeight) { + finalCloudAlpha *= horizonMask; + finalAtmoAlpha *= horizonMask; // Принудительно гасим дымку под горизонтом + } + + gl_FragColor = vec4(finalRGB, max(finalAtmoAlpha, finalCloudAlpha)); +} \ No newline at end of file diff --git a/shaders/env_sky_web.fragment b/shaders/env_sky_web.fragment new file mode 100644 index 0000000..971d78c --- /dev/null +++ b/shaders/env_sky_web.fragment @@ -0,0 +1,37 @@ +precision mediump float; +uniform samplerCube Texture; +uniform float skyPercent; +uniform float uPlayerLightFactor; // Глобальный фактор дня/ночи для позиции игрока +uniform vec3 uSkyColor; + +varying vec3 vViewDir; + +void main() { + vec3 viewDir = normalize(vViewDir); + + // 1. Получаем звезды + vec4 starsColor = textureCube(Texture, viewDir); + + // 2. Цвета атмосферы + vec3 dayColor = uSkyColor; + vec3 nightColor = vec3(0.01, 0.01, 0.04); + + // 3. Теперь всё небо окрашивается одинаково в зависимости от положения игрока + // Мы плавно смешиваем ночной и дневной купол + vec3 atmosphericColor = mix(nightColor, dayColor, uPlayerLightFactor); + + // 4. Логика видимости звезд + // Звезды видны в космосе (skyPercent=0) + // И в атмосфере, если сейчас ночь (uPlayerLightFactor -> 0) + float starsVisibility = (1.0 - skyPercent) + (skyPercent * (1.0 - uPlayerLightFactor)); + + // Делаем звезды чуть ярче на ночном небе + starsVisibility = pow(starsVisibility, 1.5); + + // 5. Итоговый цвет + // Добавляем слой атмосферы к звездам + vec3 skyLayer = atmosphericColor * skyPercent; + vec3 finalColor = (starsColor.rgb * starsVisibility) + skyLayer; + + gl_FragColor = vec4(finalColor, 1.0); +} \ No newline at end of file diff --git a/shaders/planet_bake_web.fragment b/shaders/planet_bake_web.fragment new file mode 100644 index 0000000..c08c976 --- /dev/null +++ b/shaders/planet_bake_web.fragment @@ -0,0 +1,14 @@ +precision mediump float; +varying vec2 TexCoord; +varying float vHeight; + +uniform sampler2D Texture; + +void main() +{ + vec4 stoneColor = texture2D(Texture, TexCoord); + + gl_FragColor = vec4(stoneColor.rgb, vHeight); + //gl_FragColor = vec4(vHeight, vHeight, vHeight, vHeight); + //gl_FragColor = vec4(1.0, 0.0, 1.0, 1.0); +} \ No newline at end of file diff --git a/shaders/planet_land.vertex b/shaders/planet_land.vertex index bbec690..1eb3120 100644 --- a/shaders/planet_land.vertex +++ b/shaders/planet_land.vertex @@ -15,7 +15,7 @@ varying vec3 vWorldNormal; uniform mat4 ProjectionModelViewMatrix; uniform mat4 ModelViewMatrix; -uniform vec3 uViewPos; +uniform highp vec3 uViewPos; void main() { gl_Position = ProjectionModelViewMatrix * vec4(vPosition, 1.0); diff --git a/shaders/planet_land_web.fragment b/shaders/planet_land_web.fragment new file mode 100644 index 0000000..d2047cc --- /dev/null +++ b/shaders/planet_land_web.fragment @@ -0,0 +1,116 @@ +precision highp float; +varying vec2 TexCoord; +varying vec3 vViewDirTangent; +varying vec3 Color; +varying vec3 worldPosition; +varying vec3 vWorldNormal; + +uniform sampler2D Texture; +uniform sampler2D BakedTexture; +uniform float uHeightScale; +uniform float uDistanceToPlanetSurface; +uniform float uCurrentZFar; + +uniform vec3 uViewPos; +const vec4 FOG_COLOR = vec4(0.0, 0.5, 1.0, 1.0); // Синий туман + + +uniform vec3 uLightDirWorld; // Направление ЛУЧЕЙ (1, -1, -1) +uniform float uPlayerLightFactor; +uniform vec3 uPlayerDirWorld; + +void main() { + // --- 1. Расчет освещения поверхности --- + // Направление НА источник света + vec3 lightToSource = normalize(-uLightDirWorld); + + vec3 fragmentDir = normalize(vWorldNormal); + + // Используем vNormal (нормаль в мировом пространстве, так как vPosition тоже в мировом) + // Важно: если vNormal не нормализована в вершинном, делаем это здесь + vec3 normal = normalize(fragmentDir); // На планете-сфере нормаль совпадает с направлением от центра + + float diff = max(dot(normal, lightToSource), 0.0); + float ambient = 0.3; // Базовая освещенность ночной стороны + float surfaceLightIntensity = diff + ambient; + + // --- 2. Динамический цвет тумана --- + // Синхронизируем туман с атмосферой: днем голубой, ночью темно-синий + vec3 dayFog = vec3(0.0, 0.5, 1.0); + vec3 nightFog = vec3(0.01, 0.01, 0.04); + vec3 dynamicFogColor = mix(nightFog, dayFog, uPlayerLightFactor); + + // --- 3. Основная логика текстур (твой код) --- + vec3 viewDir = normalize(vViewDirTangent); + float height = texture2D(Texture, TexCoord).a; + vec2 p = vec2(viewDir.x, -viewDir.y) * (height * uHeightScale); + vec2 finalTexCoord = TexCoord + p; + + float realDist = distance(worldPosition, uViewPos); + float textureMixFactor = clamp((2000.0 - realDist) / 500.0, 0.0, 1.0); + + vec4 bakedTextureColor = texture2D(BakedTexture, finalTexCoord); + vec4 textureColor = texture2D(Texture, TexCoord); + vec4 textureFlavoredColor = vec4(textureColor.rgb * Color, 1.0); + + if (bakedTextureColor.x < 0.01 && bakedTextureColor.y < 0.01 && bakedTextureColor.z < 0.01) { + textureMixFactor = 1.0; + } + + vec4 finalColor = textureMixFactor * textureFlavoredColor + (1.0 - textureMixFactor) * bakedTextureColor; + + // --- 4. ПРИМЕНЕНИЕ ОСВЕЩЕНИЯ --- + // Умножаем результат текстурирования на освещенность + finalColor.rgb *= surfaceLightIntensity; + + // --- 5. Расчет тумана (с использованием динамического цвета) --- + float h = uDistanceToPlanetSurface; + float fogStart, fogEnd; + + if (h >= 1000.0) { + gl_FragColor = vec4(finalColor.rgb, 1.0); + } + else + { + if (h > 100.0) { + // Нормализуем высоту от 100 до 1000 (t: 0 -> 1) + float t = (h - 100.0) / 900.0; + + // На высоте 100 туман начинается со 100. + // К высоте 1000 он плавно "убегает" к границе 2500, где объект исчезает. + fogStart = mix(1500.0, 15000.0, t); + + // Держим ширину зоны тумана в пределах 400-600 единиц + float fogRange = mix(1000.0, 6000.0, t); + fogEnd = fogStart + fogRange; + } + else if (h > 40.0) { + float t = (h - 40.0) / 60.0; + + // На высоте 100 туман начинается со 100. + // К высоте 1000 он плавно "убегает" к границе 2500, где объект исчезает. + fogStart = mix(800.0, 1500.0, t); + + fogEnd = mix(1000.0, 2500.0, t); + } + else if (h > 20.0) { + float t = (h - 20.0) / 20.0; + fogStart = mix(200.0, 800.0, t); + fogEnd = mix(500.0, 1000.0, t); + } + else { + // Минимумы при h = 0: start 25, end 125 + float t = clamp(h / 20.0, 0.0, 1.0); + fogStart = mix(100.0, 200.0, t); + fogEnd = mix(250.0, 500.0, t); + } + + float fogRange = max(fogEnd - fogStart, 1.0); + float fogFactor = clamp((realDist - fogStart) / fogRange, 0.0, 1.0); + + // Смешиваем с динамическим цветом тумана + vec3 mixedColor = mix(finalColor.rgb, dynamicFogColor, fogFactor); + + gl_FragColor = vec4(mixedColor, 1.0); + } +} \ No newline at end of file diff --git a/shaders/planet_stone.vertex b/shaders/planet_stone.vertex index 841ea5f..ab7d17f 100644 --- a/shaders/planet_stone.vertex +++ b/shaders/planet_stone.vertex @@ -14,7 +14,7 @@ varying vec3 vWorldNormal; uniform mat4 ProjectionModelViewMatrix; uniform mat4 ModelViewMatrix; -uniform vec3 uViewPos; +uniform highp vec3 uViewPos; void main() { vWorldNormal = vNormal; diff --git a/shaders/planet_stone_web.fragment b/shaders/planet_stone_web.fragment new file mode 100644 index 0000000..64333e4 --- /dev/null +++ b/shaders/planet_stone_web.fragment @@ -0,0 +1,102 @@ +precision highp float; +// planetStone фрагментный шейдер + +varying vec2 TexCoord; +varying vec3 worldPosition; +varying vec3 vWorldNormal; + +uniform sampler2D Texture; +uniform float uDistanceToPlanetSurface; +uniform vec3 uViewPos; +uniform vec3 uLightDirWorld; +uniform float uPlayerLightFactor; + +void main() +{ + // --- 1. Подготовка векторов --- + vec3 normal = normalize(vWorldNormal); + vec3 lightToSource = normalize(-uLightDirWorld); + + // Вектор от центра планеты к камню (нормаль самой поверхности планеты под камнем) + // Предполагаем, что центр планеты в (0,0,0) + vec3 surfaceNormal = normalize(worldPosition); + + // --- 2. Расчет Shadow Mask --- + // Проверяем, освещена ли точка планеты, на которой стоит камень + float shadowMask = clamp(dot(surfaceNormal, lightToSource) * 5.0, 0.0, 1.0); + // Коэффициент 5.0 делает переход на терминаторе более четким + + // --- 3. Освещение камня --- + float diff = max(dot(normal, lightToSource), 0.0); + + // Применяем shadowMask к диффузной составляющей + // Если точка на планете в тени, то прямой свет (diff) обнуляется + float ambient = 0.3; + float lightIntensity = (diff * shadowMask); + + lightIntensity *= mix(0.2, 1.0, shadowMask); + + lightIntensity += ambient; + + // --- 4. Остальная логика (цвета и туман) --- + vec3 dayFog = vec3(0.0, 0.5, 1.0); + vec3 nightFog = vec3(0.01, 0.01, 0.04); + vec3 dynamicFogColor = mix(nightFog, dayFog, uPlayerLightFactor); + + vec4 textureColor = texture2D(Texture, TexCoord); + vec3 litColor = textureColor.rgb * lightIntensity; + + float realDist = distance(worldPosition, uViewPos); + float h = uDistanceToPlanetSurface; + float alphaFactor = clamp((2000.0 - realDist) / 500.0, 0.0, 1.0); + + float fogStart, fogEnd; + + // --- Логика расчета границ тумана --- + if (h >= 1000.0) { + gl_FragColor = vec4(litColor, alphaFactor); + } + else + { + if (h > 100.0) { + // Нормализуем высоту от 100 до 1000 (t: 0 -> 1) + float t = (h - 100.0) / 900.0; + + // На высоте 100 туман начинается со 100. + // К высоте 1000 он плавно "убегает" к границе 2500, где объект исчезает. + fogStart = mix(1500.0, 15000.0, t); + + // Держим ширину зоны тумана в пределах 400-600 единиц + float fogRange = mix(1000.0, 6000.0, t); + fogEnd = fogStart + fogRange; + } + else if (h > 40.0) { + float t = (h - 40.0) / 60.0; + + // На высоте 100 туман начинается со 100. + // К высоте 1000 он плавно "убегает" к границе 2500, где объект исчезает. + fogStart = mix(800.0, 1500.0, t); + + fogEnd = mix(1000.0, 2500.0, t); + } + else if (h > 20.0) { + float t = (h - 20.0) / 20.0; + fogStart = mix(200.0, 800.0, t); + fogEnd = mix(500.0, 1000.0, t); + } + else { + // Минимумы при h = 0: start 25, end 125 + float t = clamp(h / 20.0, 0.0, 1.0); + fogStart = mix(100.0, 200.0, t); + fogEnd = mix(250.0, 500.0, t); + } + + // Расчет фактора тумана + float fogRange = max(fogEnd - fogStart, 1.0); + float fogFactor = clamp((realDist - fogStart) / fogRange, 0.0, 1.0); + + // Смешивание освещенного камня с динамическим туманом + vec3 mixedColor = mix(litColor, dynamicFogColor, fogFactor); + gl_FragColor = vec4(mixedColor, alphaFactor); + } +} \ No newline at end of file diff --git a/src/Game.cpp b/src/Game.cpp index 4488cd5..4f948c2 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -13,7 +13,7 @@ namespace ZL { #ifdef EMSCRIPTEN - const char* CONST_ZIP_FILE = "space-game001.zip"; + const char* CONST_ZIP_FILE = "space-game001a.zip"; #else const char* CONST_ZIP_FILE = ""; #endif @@ -137,30 +137,42 @@ namespace ZL renderer.shaderManager.AddShaderFromFiles("defaultAtmosphere", "./shaders/defaultAtmosphere.vertex", "./shaders/defaultAtmosphere.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("defaultColorPlanet", "./shaders/defaultColorPlanet.vertex", "./shaders/defaultColorPlanet_web.fragment", CONST_ZIP_FILE); */ + renderer.shaderManager.AddShaderFromFiles("defaultColor", "./shaders/defaultColor.vertex", "./shaders/defaultColor_web.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("default", "./shaders/default.vertex", "./shaders/default_web.fragment", CONST_ZIP_FILE); - renderer.shaderManager.AddShaderFromFiles("env_sky", "./shaders/default_env.vertex", "./shaders/default_env_web.fragment", CONST_ZIP_FILE); - renderer.shaderManager.AddShaderFromFiles("defaultAtmosphere", "./shaders/default_texture.vertex", "./shaders/default_texture_web.fragment", CONST_ZIP_FILE); - renderer.shaderManager.AddShaderFromFiles("planetBake", "./shaders/default_texture.vertex", "./shaders/default_texture_web.fragment", CONST_ZIP_FILE); - renderer.shaderManager.AddShaderFromFiles("planetStone", "./shaders/default_texture.vertex", "./shaders/default_texture_web.fragment", CONST_ZIP_FILE); - renderer.shaderManager.AddShaderFromFiles("planetLand", "./shaders/default_texture.vertex", "./shaders/default_texture_web.fragment", CONST_ZIP_FILE); + renderer.shaderManager.AddShaderFromFiles("env_sky", "./shaders/env_sky.vertex", "./shaders/env_sky_web.fragment", CONST_ZIP_FILE); + renderer.shaderManager.AddShaderFromFiles("defaultAtmosphere", "./shaders/defaultAtmosphere.vertex", "./shaders/defaultAtmosphere_web.fragment", CONST_ZIP_FILE); + renderer.shaderManager.AddShaderFromFiles("planetBake", "./shaders/planet_bake.vertex", "./shaders/planet_bake_web.fragment", CONST_ZIP_FILE); + renderer.shaderManager.AddShaderFromFiles("planetStone", "./shaders/planet_stone.vertex", "./shaders/planet_stone_web.fragment", CONST_ZIP_FILE); + renderer.shaderManager.AddShaderFromFiles("planetLand", "./shaders/planet_land.vertex", "./shaders/planet_land_web.fragment", CONST_ZIP_FILE); #else #ifndef SIMPLIFIED + renderer.shaderManager.AddShaderFromFiles("defaultColor", "./shaders/defaultColor.vertex", "./shaders/defaultColor_web.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("default", "./shaders/default.vertex", "./shaders/default_desktop.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("env_sky", "./shaders/env_sky.vertex", "./shaders/env_sky_desktop.fragment", CONST_ZIP_FILE); - renderer.shaderManager.AddShaderFromFiles("defaultAtmosphere", "./shaders/defaultAtmosphere.vertex", "./shaders/defaultAtmosphere.fragment", CONST_ZIP_FILE); + renderer.shaderManager.AddShaderFromFiles("defaultAtmosphere", "./shaders/defaultAtmosphere.vertex", "./shaders/defaultAtmosphere_desktop.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("planetBake", "./shaders/planet_bake.vertex", "./shaders/planet_bake_desktop.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("planetStone", "./shaders/planet_stone.vertex", "./shaders/planet_stone_desktop.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("planetLand", "./shaders/planet_land.vertex", "./shaders/planet_land_desktop.fragment", CONST_ZIP_FILE); #else - renderer.shaderManager.AddShaderFromFiles("default", "./shaders/default.vertex", "./shaders/default_desktop.fragment", CONST_ZIP_FILE); + /*renderer.shaderManager.AddShaderFromFiles("default", "./shaders/default.vertex", "./shaders/default_desktop.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("env_sky", "./shaders/default_env.vertex", "./shaders/default_env_desktop.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("defaultAtmosphere", "./shaders/default_texture.vertex", "./shaders/default_texture_desktop.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("planetBake", "./shaders/default_texture.vertex", "./shaders/default_texture_desktop.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("planetStone", "./shaders/default_texture.vertex", "./shaders/default_texture_desktop.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("planetLand", "./shaders/default_texture.vertex", "./shaders/default_texture_desktop.fragment", CONST_ZIP_FILE); +*/ + renderer.shaderManager.AddShaderFromFiles("defaultColor", "./shaders/defaultColor.vertex", "./shaders/defaultColor_web.fragment", CONST_ZIP_FILE); + renderer.shaderManager.AddShaderFromFiles("default", "./shaders/default.vertex", "./shaders/default_web.fragment", CONST_ZIP_FILE); + renderer.shaderManager.AddShaderFromFiles("env_sky", "./shaders/env_sky.vertex", "./shaders/env_sky_web.fragment", CONST_ZIP_FILE); + renderer.shaderManager.AddShaderFromFiles("defaultAtmosphere", "./shaders/defaultAtmosphere.vertex", "./shaders/defaultAtmosphere_web.fragment", CONST_ZIP_FILE); + renderer.shaderManager.AddShaderFromFiles("planetBake", "./shaders/planet_bake.vertex", "./shaders/planet_bake_web.fragment", CONST_ZIP_FILE); + renderer.shaderManager.AddShaderFromFiles("planetStone", "./shaders/planet_stone.vertex", "./shaders/planet_stone_web.fragment", CONST_ZIP_FILE); + renderer.shaderManager.AddShaderFromFiles("planetLand", "./shaders/planet_land.vertex", "./shaders/planet_land_web.fragment", CONST_ZIP_FILE); + + #endif #endif @@ -224,8 +236,8 @@ namespace ZL spaceshipBase = LoadFromTextFile02("./resources/spaceship006.txt", CONST_ZIP_FILE); spaceshipBase.RotateByMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(M_PI / 2.0, Eigen::Vector3f::UnitY())).toRotationMatrix());// QuatFromRotateAroundY(M_PI / 2.0).toRotationMatrix()); - //spaceshipTexture = std::make_unique(CreateTextureDataFromPng("./resources/Untitled.001.png", CONST_ZIP_FILE)); - //spaceshipBase = LoadFromTextFile02("./resources/spaceshipnew001.txt", CONST_ZIP_FILE); + //spaceshipTexture = std::make_unique(CreateTextureDataFromPng("./resources/cap_D.png", CONST_ZIP_FILE)); + //spaceshipBase = LoadFromTextFile02("./resources/spaceship006x.txt", CONST_ZIP_FILE); //spaceshipBase.RotateByMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(-M_PI / 2.0, Eigen::Vector3f::UnitY())).toRotationMatrix());// QuatFromRotateAroundY(M_PI / 2.0).toRotationMatrix()); @@ -248,7 +260,7 @@ namespace ZL boxRenderArr.resize(boxCoordsArr.size()); - std::cout << "Init step 3 " << std::endl; + std::cout << "Init step 3x " << std::endl; for (int i = 0; i < boxCoordsArr.size(); i++) { diff --git a/src/planet/PlanetData.cpp b/src/planet/PlanetData.cpp index 0ea3557..8458f95 100644 --- a/src/planet/PlanetData.cpp +++ b/src/planet/PlanetData.cpp @@ -52,11 +52,11 @@ namespace ZL { } -#ifndef SIMPLIFIED +//#ifndef SIMPLIFIED planetAtmosphereLod = generateSphere(5, 0); planetAtmosphereLod.Scale(PLANET_RADIUS * 1.03); planetAtmosphereLod.Move(PLANET_CENTER_OFFSET); -#endif +//#endif } const LodLevel& PlanetData::getLodLevel(int level) const { diff --git a/src/planet/PlanetObject.cpp b/src/planet/PlanetObject.cpp index 2deb03c..5f4a86f 100644 --- a/src/planet/PlanetObject.cpp +++ b/src/planet/PlanetObject.cpp @@ -78,14 +78,14 @@ namespace ZL { stoneTexture = std::make_unique(CreateTextureDataFromPng("./resources/rock.png", CONST_ZIP_FILE)); -#ifndef SIMPLIFIED +//#ifndef SIMPLIFIED // Атмосфера planetAtmosphereRenderStruct.data = planetData.getAtmosphereLod().vertexData; if (planetAtmosphereRenderStruct.data.PositionData.size() > 0) { planetAtmosphereRenderStruct.RefreshVBO(); } -#endif +//#endif planetStones = CreateStoneGroupData(778, planetData.getLodLevel(lodIndex)); @@ -205,7 +205,7 @@ namespace ZL { void PlanetObject::draw(Renderer& renderer) { -#ifndef SIMPLIFIED +//#ifndef SIMPLIFIED { if (stoneMapFB == nullptr) { @@ -221,7 +221,8 @@ namespace ZL { stoneMapFB->GenerateMipmaps(); } -#endif +//#endif + //bakeStoneTexture(renderer); @@ -232,9 +233,9 @@ namespace ZL { drawPlanet(renderer); drawStones(renderer); -#ifndef SIMPLIFIED +//#ifndef SIMPLIFIED drawAtmosphere(renderer); -#endif +//#endif } void PlanetObject::drawPlanet(Renderer& renderer) @@ -305,12 +306,12 @@ namespace ZL { playerLightFactor = max(0.0f, (playerLightFactor + 0.2f) / 1.2f); renderer.RenderUniform1f("uPlayerLightFactor", playerLightFactor); -#ifndef SIMPLIFIED + glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, stoneMapFB->getTextureID()); -#endif glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, sandTexture->getTexID()); + //glBindTexture(GL_TEXTURE_2D, stoneMapFB->getTextureID()); renderer.DrawVertexRenderStruct(planetRenderStruct); CheckGlError(); @@ -351,6 +352,7 @@ namespace ZL { const float currentZNear = zRange.first; const float currentZFar = zRange.second; + // 2. Применяем динамическую матрицу проекции renderer.PushPerspectiveProjectionMatrix(1.0 / 1.5, static_cast(Environment::width) / static_cast(Environment::height), @@ -365,7 +367,7 @@ namespace ZL { renderer.RenderUniform1f("uDistanceToPlanetSurface", dist); renderer.RenderUniform1f("uCurrentZFar", currentZFar); renderer.RenderUniform3fv("uViewPos", Environment::shipPosition.data()); - + //std::cout << "uViewPos" << Environment::shipPosition << std::endl; // PlanetObject.cpp, метод drawStones Vector3f sunDirWorld = Vector3f(1.0f, -1.0f, -1.0f).normalized(); renderer.RenderUniform3fv("uLightDirWorld", sunDirWorld.data()); @@ -380,6 +382,7 @@ namespace ZL { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBindTexture(GL_TEXTURE_2D, stoneTexture->getTexID()); + for (int i : triangleIndicesToDraw) //for (int i = 0; i < stonesToRender.size(); i++) { @@ -406,6 +409,7 @@ namespace ZL { void PlanetObject::drawAtmosphere(Renderer& renderer) { static const std::string defaultShaderName = "defaultAtmosphere"; + //static const std::string defaultShaderName = "defaultColor"; static const std::string vPositionName = "vPosition"; static const std::string vNormalName = "vNormal"; //glClear(GL_DEPTH_BUFFER_BIT); @@ -441,7 +445,6 @@ namespace ZL { Vector3f color = { 0.0, 0.5, 1.0 }; - renderer.RenderUniform3fv("uColor", color.data()); renderer.RenderUniformMatrix4fv("ModelViewMatrix", false, viewMatrix.data()); @@ -449,8 +452,8 @@ namespace ZL { renderer.RenderUniform1f("uDistanceToPlanetSurface", dist); // В начале drawAtmosphere или как uniform - float time = SDL_GetTicks() / 1000.0f; - renderer.RenderUniform1f("uTime", time); + //float time = SDL_GetTicks() / 1000.0f; + //renderer.RenderUniform1f("uTime", time); // В методе PlanetObject::drawAtmosphere Vector3f worldLightDir = Vector3f(1.0f, -1.0f, -1.0f).normalized(); @@ -467,7 +470,7 @@ namespace ZL { renderer.RenderUniform3fv("uLightDirView", lightToSource.data()); // В методе Game::drawCubemap - renderer.RenderUniform1f("uTime", SDL_GetTicks() / 1000.0f); + //renderer.RenderUniform1f("uTime", SDL_GetTicks() / 1000.0f); // Направление света в мировом пространстве для освещения облаков //Vector3f worldLightDir = Vector3f(1.0f, -1.0f, -1.0f).normalized(); renderer.RenderUniform3fv("uWorldLightDir", worldLightDir.data());