Working on fog, 2nd level, locations, dialogs

This commit is contained in:
Vladislav Khorev committed 2026-04-25 19:56:00 +03:00
1 parent eac914e073
commit c7b3f04cd4
38 files changed
+150471 -145

No files matched your search

+18 -7
View File
@@ -421,8 +421,10 @@ void Character::draw(Renderer& renderer) {
auto it = animations.find(drawState);
if (it == animations.end()) return;
renderer.shaderManager.PushShader(defaultShaderName);
renderer.shaderManager.PushShader("fog");
renderer.RenderUniform1i(textureUniformName, 0);
const float playerEyePos[3] = { 0.0f, 0.0f, -Environment::zoom };
renderer.RenderUniform3fv("uPlayerEyePos", playerEyePos);
renderer.PushPerspectiveProjectionMatrix(1.0 / 1.5,
static_cast<float>(Environment::width) / static_cast<float>(Environment::height),
@@ -473,11 +475,13 @@ void Character::drawGpuSkinning(Renderer& renderer) {
if (anim.gpuSkinningShaderData.skinningMatrices.empty()) return;
}
static const std::string skinningShaderName = "skinning";
static const std::string skinningShaderName = "fog_skinning";
static const std::string boneMatricesUniform = "uBoneMatrices[0]";
renderer.shaderManager.PushShader(skinningShaderName);
renderer.RenderUniform1i(textureUniformName, 0);
const float playerEyePosSkin[3] = { 0.0f, 0.0f, -Environment::zoom };
renderer.RenderUniform3fv("uPlayerEyePos", playerEyePosSkin);
renderer.PushPerspectiveProjectionMatrix(1.0 / 1.5,
static_cast<float>(Environment::width) / static_cast<float>(Environment::height),
@@ -505,8 +509,9 @@ void Character::drawGpuSkinning(Renderer& renderer) {
renderer.PopMatrix();
renderer.shaderManager.PushShader(defaultShaderName);
renderer.shaderManager.PushShader("fog");
renderer.RenderUniform1i(textureUniformName, 0);
renderer.RenderUniform3fv("uPlayerEyePos", playerEyePosSkin);
drawAttachedWeapon(renderer);
renderer.shaderManager.PopShader();
@@ -688,13 +693,15 @@ void Character::drawCpuWithShadow(Renderer& renderer, const Eigen::Matrix4f& lig
auto it = animations.find(drawState);
if (it == animations.end()) return;
static const std::string shadowShader = "default_shadow";
static const std::string shadowShader = "fog_shadow";
renderer.shaderManager.PushShader(shadowShader);
renderer.RenderUniform1i(textureUniformName, 0);
renderer.RenderUniform1i("uShadowMap", 1);
renderer.RenderUniformMatrix4fv("uLightFromCamera", false, lightFromCamera.data());
renderer.RenderUniform3fv("uLightDir", lightDirCamera.data());
const float playerEyePosShadow[3] = { 0.0f, 0.0f, -Environment::zoom };
renderer.RenderUniform3fv("uPlayerEyePos", playerEyePosShadow);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, shadowMapTex);
@@ -724,8 +731,9 @@ void Character::drawCpuWithShadow(Renderer& renderer, const Eigen::Matrix4f& lig
renderer.PopMatrix();
renderer.shaderManager.PushShader(defaultShaderName);
renderer.shaderManager.PushShader("fog");
renderer.RenderUniform1i(textureUniformName, 0);
renderer.RenderUniform3fv("uPlayerEyePos", playerEyePosShadow);
drawAttachedWeapon(renderer);
renderer.shaderManager.PopShader();
@@ -744,7 +752,7 @@ void Character::drawGpuSkinningWithShadow(Renderer& renderer, const Eigen::Matri
CheckGlError(__FILE__, __LINE__);
static const std::string skinningShadowShader = "skinning_shadow";
static const std::string skinningShadowShader = "fog_skinning_shadow";
static const std::string boneMatricesUniform = "uBoneMatrices[0]";
renderer.shaderManager.PushShader(skinningShadowShader);
@@ -752,6 +760,8 @@ void Character::drawGpuSkinningWithShadow(Renderer& renderer, const Eigen::Matri
renderer.RenderUniform1i("uShadowMap", 1);
renderer.RenderUniformMatrix4fv("uLightFromCamera", false, lightFromCamera.data());
renderer.RenderUniform3fv("uLightDir", lightDirCamera.data());
const float playerEyePosSkinShadow[3] = { 0.0f, 0.0f, -Environment::zoom };
renderer.RenderUniform3fv("uPlayerEyePos", playerEyePosSkinShadow);
CheckGlError(__FILE__, __LINE__);
@@ -789,8 +799,9 @@ void Character::drawGpuSkinningWithShadow(Renderer& renderer, const Eigen::Matri
renderer.PopMatrix();
renderer.shaderManager.PushShader(defaultShaderName);
renderer.shaderManager.PushShader("fog");
renderer.RenderUniform1i(textureUniformName, 0);
renderer.RenderUniform3fv("uPlayerEyePos", playerEyePosSkinShadow);
drawAttachedWeapon(renderer);
renderer.shaderManager.PopShader();
+45 -9
View File
@@ -24,12 +24,12 @@
namespace ZL
{
void set_Texture(Character& npc, TextureDataStruct& texture)
void set_Texture(Character& npc, const TextureDataStruct& texture)
{
auto tt = std::make_shared<Texture>(texture);
npc.setTexture(tt);
}
void set_Texture(Character& npc, const std::string& meshName, TextureDataStruct& texture)
void set_Texture(Character& npc, const std::string& meshName, const TextureDataStruct& texture)
{
auto tt = std::make_shared<Texture>(texture);
npc.setTexture(meshName, tt);
@@ -142,6 +142,8 @@ namespace ZL
renderer.shaderManager.AddShaderFromFiles("planetLand", "resources/shaders/planet_land.vertex", "resources/shaders/planet_land_web.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("spark", "resources/shaders/spark.vertex", "resources/shaders/spark_web.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("skinning", "resources/shaders/skinning.vertex", "resources/shaders/default_web.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("fog", "resources/shaders/fog.vertex", "resources/shaders/fog_web.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("fog_skinning", "resources/shaders/fog_skinning.vertex", "resources/shaders/fog_web.fragment", CONST_ZIP_FILE);
#else
renderer.shaderManager.AddShaderFromFiles("env_sky", "resources/shaders/env_sky.vertex", "resources/shaders/env_sky_desktop.fragment", CONST_ZIP_FILE);
@@ -151,14 +153,43 @@ namespace ZL
renderer.shaderManager.AddShaderFromFiles("planetLand", "resources/shaders/planet_land.vertex", "resources/shaders/planet_land_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("spark", "resources/shaders/spark.vertex", "resources/shaders/spark_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("skinning", "resources/shaders/skinning.vertex", "resources/shaders/default_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("fog", "resources/shaders/fog.vertex", "resources/shaders/fog_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("fog_skinning", "resources/shaders/fog_skinning.vertex", "resources/shaders/fog_desktop.fragment", CONST_ZIP_FILE);
#endif
std::cout << "Load resurces step 4" << std::endl;
currentLocation = std::make_unique<Location>(renderer, inventory);
LocationSetup params1;
params1.roomMeshPath = "resources/w/room001.txt";
params1.roomTexturePath = "resources/w/room005.png";
params1.gameObjectsJsonPath = "resources/config2/gameobjects.json";
params1.npcsJsonPath = "resources/config2/npcs.json";
params1.dialoguesJsonPath = "resources/dialogue/sample_dialogues.json";
params1.navigationJsonPath = "resources/config2/navigation.json";
params1.scriptPath = "resources/start.lua";
params1.playerPosition = Eigen::Vector3f::Zero();
params1.ghostPosition = Eigen::Vector3f(0.f, 0.f, -20.f);
location1 = std::make_shared<Location>(renderer, inventory);
location1->setup(params1);
LocationSetup params2 = params1;
params2.roomMeshPath = "resources/w/exterior/Segmented_Plane002.txt";
params2.roomTexturePath = "resources/w/exterior/Segmented_Plane002.png";
params2.gameObjectsJsonPath = "resources/config2/gameobjects2.json";
params2.navigationJsonPath = "resources/config2/navigation2.json";
params2.scriptPath = "resources/start2.lua";
params2.playerPosition = Eigen::Vector3f(7.f, 0.f, 27.f);
params2.npcsJsonPath = "resources/config2/npcs2.json";
params2.ghostPosition = Eigen::Vector3f(700.f, 0.f, 700.f);
location2 = std::make_shared<Location>(renderer, inventory);
location2->setup(params2);
currentLocation = location1;
currentLocation->setup();
std::cout << "Load resurces step 5" << std::endl;
std::cout << "Load resurces step 12" << std::endl;
@@ -169,14 +200,17 @@ namespace ZL
renderer.shaderManager.AddShaderFromFiles("shadow_depth_skinning", "resources/shaders/shadow_depth_skinning.vertex", "resources/shaders/shadow_depth_web.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("default_shadow", "resources/shaders/default_shadow.vertex", "resources/shaders/default_shadow_web.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("skinning_shadow", "resources/shaders/skinning_shadow.vertex", "resources/shaders/default_shadow_web.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("fog_shadow", "resources/shaders/fog_shadow.vertex", "resources/shaders/fog_shadow_web.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("fog_skinning_shadow", "resources/shaders/fog_skinning_shadow.vertex", "resources/shaders/fog_shadow_web.fragment", CONST_ZIP_FILE);
#else
renderer.shaderManager.AddShaderFromFiles("shadow_depth", "resources/shaders/shadow_depth.vertex", "resources/shaders/shadow_depth_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("shadow_depth_skinning", "resources/shaders/shadow_depth_skinning.vertex", "resources/shaders/shadow_depth_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("default_shadow", "resources/shaders/default_shadow.vertex", "resources/shaders/default_shadow_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("skinning_shadow", "resources/shaders/skinning_shadow.vertex", "resources/shaders/default_shadow_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("fog_shadow", "resources/shaders/fog_shadow.vertex", "resources/shaders/fog_shadow_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("fog_skinning_shadow", "resources/shaders/fog_skinning_shadow.vertex", "resources/shaders/fog_shadow_desktop.fragment", CONST_ZIP_FILE);
#endif
std::cout << "Load resurces step 13" << std::endl;
// Load UI with inventory button
@@ -470,16 +504,18 @@ namespace ZL
break;
case SDLK_o:
y = y + 0.002;
//y = y + 0.002;
currentLocation->player->hp = 5;
break;
case SDLK_k:
y = y - 0.002;
//y = y - 0.002;
std::cout << "Player pos: " << currentLocation->player->position.transpose() << std::endl;
break;
case SDLK_p:
x = x + 0.002;
currentLocation = (currentLocation == location1) ? location2 : location1;
std::cout << "Switched to location " << ((currentLocation == location1) ? "1" : "2") << std::endl;
break;
case SDLK_l:
+2
View File
@@ -44,6 +44,8 @@ namespace ZL {
VertexRenderStruct loadingMesh;
bool loadingCompleted = false;
std::shared_ptr<Location> location1;
std::shared_ptr<Location> location2;
std::shared_ptr<Location> currentLocation;
Inventory inventory;
+23 -17
View File
@@ -30,18 +30,18 @@ namespace ZL
}
void Location::setup()
void Location::setup(const LocationSetup& params)
{
roomTexture = std::make_unique<Texture>(CreateTextureDataFromPng("resources/w/room005.png", CONST_ZIP_FILE));
roomMesh.data = LoadFromTextFile02("resources/w/room001.txt", CONST_ZIP_FILE);
roomTexture = std::make_unique<Texture>(CreateTextureDataFromPng(params.roomTexturePath, CONST_ZIP_FILE));
roomMesh.data = LoadFromTextFile02(params.roomMeshPath, CONST_ZIP_FILE);
roomMesh.data.RotateByMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(-M_PI * 0.5, Eigen::Vector3f::UnitY())).toRotationMatrix());
roomMesh.RefreshVBO();
// Load static game objects
gameObjects = GameObjectLoader::loadAndCreateGameObjects("resources/config2/gameobjects.json", renderer, CONST_ZIP_FILE);
gameObjects = GameObjectLoader::loadAndCreateGameObjects(params.gameObjectsJsonPath, renderer, CONST_ZIP_FILE);
// Load interactive objects
interactiveObjects = GameObjectLoader::loadAndCreateInteractiveObjects("resources/config2/gameobjects.json", renderer, CONST_ZIP_FILE);
interactiveObjects = GameObjectLoader::loadAndCreateInteractiveObjects(params.gameObjectsJsonPath, renderer, CONST_ZIP_FILE);
//auto playerTexture = std::make_shared<Texture>(CreateTextureDataFromPng("resources/w/gg/IMG_20260413_182354_992.png", CONST_ZIP_FILE));
@@ -98,11 +98,13 @@ namespace ZL
player->canAttack = true;
player->isPlayer = true;
player->position = params.playerPosition;
player->setTarget(params.playerPosition);
player->setupHitSparks(sparkTexture);
std::cout << "Load resurces step 9" << std::endl;
// Load NPCs from JSON
npcs = GameObjectLoader::loadAndCreate_Npcs("resources/config2/npcs.json", CONST_ZIP_FILE);
npcs = GameObjectLoader::loadAndCreate_Npcs(params.npcsJsonPath, CONST_ZIP_FILE);
for (auto& npc : npcs) {
if (npc) npc->setupHitSparks(sparkTexture);
}
@@ -131,7 +133,7 @@ namespace ZL
//npc02->modelScale = 0.1f;
npc02->modelCorrectionRotation = Eigen::Quaternionf(Eigen::AngleAxisf(M_PI, Eigen::Vector3f::UnitY()));
npc02->position = Eigen::Vector3f(0.f, 0.f, -20.f);
npc02->position = params.ghostPosition;
npc02->setTarget(npc02->position);
npc02->canAttack = true;
npc02->attackTarget = player.get();
@@ -145,12 +147,12 @@ namespace ZL
std::cout << "Shadow map initialized" << std::endl;
setupNavigation();
setupNavigation(params.navigationJsonPath);
scriptEngine.init(this, &inventory);
scriptEngine.init(this, &inventory, params.scriptPath);
dialogueSystem.init(renderer, CONST_ZIP_FILE);
dialogueSystem.loadDatabase("resources/dialogue/sample_dialogues.json");
dialogueSystem.loadDatabase(params.dialoguesJsonPath);
npcNameText = std::make_unique<TextRenderer>();
if (!npcNameText->init(renderer, "resources/fonts/DroidSans.ttf", 24, CONST_ZIP_FILE)) {
@@ -169,7 +171,7 @@ namespace ZL
}
void Location::setupNavigation()
void Location::setupNavigation(const std::string& navigationJsonPath)
{
std::vector<PathFinder::ObstacleMesh> obstacles;
obstacles.reserve(gameObjects.size() + interactiveObjects.size());
@@ -186,7 +188,7 @@ namespace ZL
obstacles.push_back({ &intObj.mesh.data, intObj.position });
}
navigation.build(obstacles, "resources/config2/navigation.json", CONST_ZIP_FILE);
navigation.build(obstacles, navigationJsonPath, CONST_ZIP_FILE);
#ifdef SHOW_PATH
buildDebugNavMeshes();
@@ -361,12 +363,14 @@ namespace ZL
void Location::drawGame()
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClearColor(0.53, 0.81, 0.92, 1.0f);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
renderer.shaderManager.PushShader(defaultShaderName);
renderer.shaderManager.PushShader("fog");
renderer.RenderUniform1i(textureUniformName, 0);
const float playerEyePos[3] = { 0.0f, 0.0f, -Environment::zoom };
renderer.RenderUniform3fv("uPlayerEyePos", playerEyePos);
renderer.PushPerspectiveProjectionMatrix(1.0 / 1.5,
static_cast<float>(Environment::width) / static_cast<float>(Environment::height),
@@ -500,7 +504,7 @@ namespace ZL
void Location::drawGameWithShadows()
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClearColor(0.53, 0.81, 0.92, 1.0f);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
#ifdef DEBUG_LIGHT
@@ -517,11 +521,13 @@ namespace ZL
renderer.PushSpecialMatrix(shadowMap->getLightViewMatrix());
#else
static const std::string shadowShaderName = "default_shadow";
static const std::string shadowShaderName = "fog_shadow";
renderer.shaderManager.PushShader(shadowShaderName);
renderer.RenderUniform1i(textureUniformName, 0);
renderer.RenderUniform1i("uShadowMap", 1);
const float playerEyePos[3] = { 0.0f, 0.0f, -Environment::zoom };
renderer.RenderUniform3fv("uPlayerEyePos", playerEyePos);
// Bind shadow map texture to unit 1
glActiveTexture(GL_TEXTURE1);
+15 -2
View File
@@ -14,6 +14,19 @@
namespace ZL
{
struct LocationSetup
{
std::string roomMeshPath;
std::string roomTexturePath;
std::string gameObjectsJsonPath;
std::string npcsJsonPath;
std::string dialoguesJsonPath;
std::string navigationJsonPath;
std::string scriptPath;
Eigen::Vector3f playerPosition = Eigen::Vector3f::Zero();
Eigen::Vector3f ghostPosition = Eigen::Vector3f::Zero();
};
class Location
{
public:
@@ -63,8 +76,8 @@ namespace ZL
int lastMouseY = 0;
void setup();
void setupNavigation();
void setup(const LocationSetup& params);
void setupNavigation(const std::string& navigationJsonPath);
InteractiveObject* raycastInteractiveObjects(const Eigen::Vector3f& rayOrigin, const Eigen::Vector3f& rayDir);
Character* raycastNpcs(const Eigen::Vector3f& rayOrigin, const Eigen::Vector3f& rayDir, float maxDistance = 100.0f);
+2 -2
View File
@@ -16,7 +16,7 @@ namespace ZL {
ScriptEngine::ScriptEngine() = default;
ScriptEngine::~ScriptEngine() = default;
void ScriptEngine::init(Location* game, Inventory* inventory) {
void ScriptEngine::init(Location* game, Inventory* inventory, const std::string& scriptPath) {
impl = std::make_unique<Impl>();
sol::state& lua = impl->lua;
@@ -165,7 +165,7 @@ namespace ZL {
<< npc->giftItem.name << std::endl;
});
lua.script_file("resources/start.lua");
lua.script_file(scriptPath);
}
void ScriptEngine::callNpcInteractCallback(int npcIndex) {
+1 -1
View File
@@ -13,7 +13,7 @@ public:
~ScriptEngine();
// Must be called once, after the Game's NPCs are ready.
void init(Location* game, Inventory* inventory);
void init(Location* game, Inventory* inventory, const std::string& scriptPath);
// Execute a Lua script file. Logs errors to stderr.
void runScript(const std::string& path);
+2 -2
View File
@@ -9,8 +9,8 @@
#include "../Character.h"
namespace ZL {
void set_Texture(Character& npc, TextureDataStruct& texture);
void set_Texture(Character& npc, const std::string& meshName, TextureDataStruct& texture);
void set_Texture(Character& npc, const TextureDataStruct& texture);
void set_Texture(Character& npc, const std::string& meshName, const TextureDataStruct& texture);
using json = nlohmann::json;
-2
View File
@@ -866,12 +866,10 @@ namespace ZL {
auto shader = shaderManager.GetCurrentShader();
if (shader->attribList.find(attribName) != shader->attribList.end())
glVertexAttribPointer(shader->attribList[attribName], 2, GL_FLOAT, GL_FALSE, stride, pointer);
}
void Renderer::VertexAttribPointer3fv(const std::string& attribName, int stride, const char* pointer)
{
auto shader = shaderManager.GetCurrentShader();
if (shader->attribList.find(attribName) != shader->attribList.end())
glVertexAttribPointer(shader->attribList[attribName], 3, GL_FLOAT, GL_FALSE, stride, pointer);