Fixing rooms

This commit is contained in:
maka70vv 2025-03-01 23:52:55 +06:00
parent 243dd61209
commit 74a2dc78a6
7 changed files with 58 additions and 94 deletions

View File

@ -3,6 +3,7 @@
#include "Math.h" #include "Math.h"
#include <memory> #include <memory>
namespace ZL {
struct ActiveObject { struct ActiveObject {
std::shared_ptr<ZL::Texture> activeObjectTexturePtr; std::shared_ptr<ZL::Texture> activeObjectTexturePtr;
ZL::VertexDataStruct activeObjectMesh; ZL::VertexDataStruct activeObjectMesh;
@ -15,3 +16,5 @@ struct ActiveObject {
ZL::Vector3f objectPos; ZL::Vector3f objectPos;
bool highlighted = false; bool highlighted = false;
}; };
}

View File

@ -47,13 +47,21 @@ void Game::setup() {
ZL::BindOpenGlFunctions(); ZL::BindOpenGlFunctions();
ZL::CheckGlError(); ZL::CheckGlError();
std::cout << "Hello 1" << std::endl;
// Initialize renderer // Initialize renderer
renderer.shaderManager.AddShaderFromFiles("default", "./default.vertex", "./default.fragment"); renderer.shaderManager.AddShaderFromFiles("default", "./default.vertex", "./default.fragment");
renderer.shaderManager.AddShaderFromFiles("defaultColor", "./defaultColor.vertex", "./defaultColor.fragment"); renderer.shaderManager.AddShaderFromFiles("defaultColor", "./defaultColor.vertex", "./defaultColor.fragment");
renderer.InitOpenGL();
// Initialize game objects // Initialize game objects
std::cout << "Hello 2" << std::endl;
gameObjects.initialize(); gameObjects.initialize();
std::cout << "Hello 3" << std::endl;
renderer.InitOpenGL();
} }
void Game::drawScene() { void Game::drawScene() {
@ -72,7 +80,7 @@ void Game::processTickCount() {
size_t delta = (newTickCount - lastTickCount > CONST_MAX_TIME_INTERVAL) ? size_t delta = (newTickCount - lastTickCount > CONST_MAX_TIME_INTERVAL) ?
CONST_MAX_TIME_INTERVAL : newTickCount - lastTickCount; CONST_MAX_TIME_INTERVAL : newTickCount - lastTickCount;
gameObjects.update(); gameObjects.updateScene(delta);
lastTickCount = newTickCount; lastTickCount = newTickCount;
} }
@ -98,6 +106,7 @@ void Game::update() {
exitGameLoop = true; exitGameLoop = true;
} }
gameObjects.handleEvent(event); gameObjects.handleEvent(event);
} }
render(); render();
} }

View File

@ -2,6 +2,7 @@
#include "Environment.h" #include "Environment.h"
#include "ObjLoader.h" #include "ObjLoader.h"
#include "Inventory.h" #include "Inventory.h"
#include "Room.h"
#include "TextModel.h" // Add this include for LoadFromTextFile #include "TextModel.h" // Add this include for LoadFromTextFile
namespace ZL { namespace ZL {
@ -10,10 +11,13 @@ const float GameObjectManager::INVENTORY_ICON_SIZE = 32.0f;
const float GameObjectManager::INVENTORY_MARGIN = 10.0f; const float GameObjectManager::INVENTORY_MARGIN = 10.0f;
void GameObjectManager::initialize() { void GameObjectManager::initialize() {
// Load textures
roomTexturePtr = std::make_shared<Texture>(CreateTextureDataFromBmp24("./Kitchen_ceramics.bmp")); std::cout << "Hello x1" << std::endl;
coneTexturePtr = std::make_shared<Texture>(CreateTextureDataFromBmp24("./conus.bmp")); coneTexturePtr = std::make_shared<Texture>(CreateTextureDataFromBmp24("./conus.bmp"));
std::cout << "Hello x2" << std::endl;
// Load models // Load models
colorCubeMesh = CreateCube3D(5.0); colorCubeMesh = CreateCube3D(5.0);
colorCubeMeshMutable.data = CreateCube3D(5.0); colorCubeMeshMutable.data = CreateCube3D(5.0);
@ -25,15 +29,23 @@ void GameObjectManager::initialize() {
testObjMeshMutable.data = testObjMesh; testObjMeshMutable.data = testObjMesh;
testObjMeshMutable.RefreshVBO(); testObjMeshMutable.RefreshVBO();
std::cout << "Hello x2" << std::endl;
textMesh = ZL::LoadFromTextFile("./mesh001.txt"); // Add ZL:: namespace textMesh = ZL::LoadFromTextFile("./mesh001.txt"); // Add ZL:: namespace
coneMesh = ZL::LoadFromTextFile("./cone001.txt"); // Add ZL:: namespace coneMesh = ZL::LoadFromTextFile("./cone001.txt"); // Add ZL:: namespace
coneMesh.Scale(200); coneMesh.Scale(200);
std::cout << "Hello x3" << std::endl;
textMeshMutable.AssignFrom(textMesh); textMeshMutable.AssignFrom(textMesh);
textMeshMutable.RefreshVBO(); textMeshMutable.RefreshVBO();
coneMeshMutable.AssignFrom(coneMesh); coneMeshMutable.AssignFrom(coneMesh);
coneMeshMutable.RefreshVBO(); coneMeshMutable.RefreshVBO();
std::cout << "Hello x4" << std::endl;
// Load bone animations // Load bone animations
bx.LoadFromFile("mesh_armature_and_animation_data.txt"); bx.LoadFromFile("mesh_armature_and_animation_data.txt");
@ -51,12 +63,17 @@ void GameObjectManager::initialize() {
ao1.activeObjectScreenMeshMutable.RefreshVBO(); ao1.activeObjectScreenMeshMutable.RefreshVBO();
activeObjects.push_back(ao1); activeObjects.push_back(ao1);
std::cout << "Hello x5" << std::endl;
// Initialize audio // Initialize audio
audioPlayer = std::make_unique<AudioPlayer>(); audioPlayer = std::make_unique<AudioPlayer>();
if (audioPlayer) { if (audioPlayer) {
audioPlayer->playMusic("Symphony No.6 (1st movement).ogg"); audioPlayer->playMusic("Symphony No.6 (1st movement).ogg");
} }
std::cout << "Hello x6" << std::endl;
// Initialize inventory // Initialize inventory
inventoryIconMesh = CreateRect2D( inventoryIconMesh = CreateRect2D(
{0.0f, 0.0f}, {0.0f, 0.0f},
@ -66,21 +83,33 @@ void GameObjectManager::initialize() {
inventoryIconMeshMutable.AssignFrom(inventoryIconMesh); inventoryIconMeshMutable.AssignFrom(inventoryIconMesh);
inventoryIconMeshMutable.RefreshVBO(); inventoryIconMeshMutable.RefreshVBO();
std::cout << "Hello x7" << std::endl;
// Add test items to inventory // Add test items to inventory
auto testRoomTexture = std::make_shared<Texture>(CreateTextureDataFromBmp24("./Kitchen_ceramics.bmp")); auto testRoomTexture = std::make_shared<Texture>(CreateTextureDataFromBmp24("./Kitchen_ceramics.bmp"));
auto testConeTexture = std::make_shared<Texture>(CreateTextureDataFromBmp24("./conus.bmp")); auto testConeTexture = std::make_shared<Texture>(CreateTextureDataFromBmp24("./conus.bmp"));
AddItemToInventory("RoomCeramics", testRoomTexture); AddItemToInventory("RoomCeramics", testRoomTexture);
AddItemToInventory("Cone", testConeTexture); AddItemToInventory("Cone", testConeTexture);
std::cout << "Hello x8" << std::endl;
roomTexturePtr = std::make_shared<Texture>(CreateTextureDataFromBmp24("./Kitchen_ceramics.bmp"));
} }
void GameObjectManager::update() {
updateScene(16); // Добавим фиксированный timestep для обновления сцены
}
void GameObjectManager::handleEvent(const SDL_Event& event) { void GameObjectManager::handleEvent(const SDL_Event& event) {
if (event.type == SDL_MOUSEBUTTONDOWN) { if (event.type == SDL_MOUSEBUTTONDOWN) {
bx.Interpolate(animationCounter); bx.Interpolate(animationCounter);
animationCounter += 2; animationCounter += 2;
}
else if (event.type == SDL_MOUSEBUTTONDOWN && event.button.button == SDL_BUTTON_RIGHT) {
//switchRoom();
} }
else if (event.type == SDL_MOUSEWHEEL) { else if (event.type == SDL_MOUSEWHEEL) {
static const float zoomstep = 1.0f; static const float zoomstep = 1.0f;
@ -154,6 +183,7 @@ void GameObjectManager::handleEvent(const SDL_Event& event) {
} }
} }
void GameObjectManager::updateScene(size_t ms) { void GameObjectManager::updateScene(size_t ms) {
const float SPEED = 0.1f; const float SPEED = 0.1f;
if (Environment::leftPressed) { if (Environment::leftPressed) {
@ -180,6 +210,7 @@ void GameObjectManager::updateScene(size_t ms) {
pow(Environment::characterPos.v[2] - ao.objectPos.v[2], 2) pow(Environment::characterPos.v[2] - ao.objectPos.v[2], 2)
); );
ao.highlighted = (dist < 50.f); ao.highlighted = (dist < 50.f);
} }
} }

View File

@ -12,7 +12,7 @@ namespace ZL {
class GameObjectManager { class GameObjectManager {
public: public:
void initialize(); void initialize();
void update();
void handleEvent(const SDL_Event& event); void handleEvent(const SDL_Event& event);
void updateScene(size_t ms); void updateScene(size_t ms);
void checkMouseIntersection(int mouseX, int mouseY, const Matrix4f& projectionModelView); // Добавляем новый метод void checkMouseIntersection(int mouseX, int mouseY, const Matrix4f& projectionModelView); // Добавляем новый метод
@ -36,7 +36,7 @@ public:
ZL::VertexDataStruct coneMesh; ZL::VertexDataStruct coneMesh;
ZL::VertexRenderStruct coneMeshMutable; ZL::VertexRenderStruct coneMeshMutable;
std::vector<ActiveObject> activeObjects; std::vector<ZL::ActiveObject> activeObjects;
std::unique_ptr<AudioPlayer> audioPlayer; std::unique_ptr<AudioPlayer> audioPlayer;
ZL::VertexDataStruct inventoryIconMesh; ZL::VertexDataStruct inventoryIconMesh;

View File

@ -18,7 +18,7 @@ void RenderSystem::drawScene(const GameObjectManager& gameObjects) {
static const std::string vTexCoordName = "vTexCoord"; static const std::string vTexCoordName = "vTexCoord";
static const std::string textureUniformName = "Texture"; static const std::string textureUniformName = "Texture";
glClearColor(0.3f, 0.3f, 0.3f, 1.0f); glClearColor(0.0f, 0.5f, 1.0f, 1.0f);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glViewport(0, 0, Environment::width, Environment::height); glViewport(0, 0, Environment::width, Environment::height);
@ -51,6 +51,7 @@ void RenderSystem::drawWorld(const GameObjectManager& gameObjects) {
float t = 0.3; float t = 0.3;
renderer.RotateMatrix(QuatFromRotateAroundX(t * M_PI / 2.0)); renderer.RotateMatrix(QuatFromRotateAroundX(t * M_PI / 2.0));
// Draw cone // Draw cone
glBindTexture(GL_TEXTURE_2D, gameObjects.coneTexturePtr->getTexID()); glBindTexture(GL_TEXTURE_2D, gameObjects.coneTexturePtr->getTexID());
renderer.DrawVertexRenderStruct(gameObjects.coneMeshMutable); renderer.DrawVertexRenderStruct(gameObjects.coneMeshMutable);
@ -70,6 +71,7 @@ void RenderSystem::drawWorld(const GameObjectManager& gameObjects) {
glBindTexture(GL_TEXTURE_2D, gameObjects.roomTexturePtr->getTexID()); glBindTexture(GL_TEXTURE_2D, gameObjects.roomTexturePtr->getTexID());
renderer.DrawVertexRenderStruct(gameObjects.textMeshMutable); renderer.DrawVertexRenderStruct(gameObjects.textMeshMutable);
Matrix4f latestProjectionModelView = renderer.GetProjectionModelViewMatrix(); Matrix4f latestProjectionModelView = renderer.GetProjectionModelViewMatrix();
// Проверяем пересечение с мышью после расчета всех матриц // Проверяем пересечение с мышью после расчета всех матриц

83
Room.h
View File

@ -7,89 +7,8 @@
#include "Renderer.h" #include "Renderer.h"
#include "ObjLoader.h" #include "ObjLoader.h"
#include "Physics.h" #include "Physics.h"
#include "ActiveObject.h"
namespace ZL namespace ZL
{ {
struct ActiveObject
{
std::shared_ptr<Texture> activeObjectTexturePtr;
VertexDataStruct activeObjectMesh;
VertexRenderStruct activeObjectMeshMutable;
std::shared_ptr<Texture> activeObjectScreenTexturePtr;
VertexDataStruct activeObjectScreenMesh;
VertexRenderStruct activeObjectScreenMeshMutable;
Vector3f objectPos;
bool highlighted = false;
};
class Room
{
private:
std::string name;
std::vector<std::shared_ptr<Texture>> textures;
VertexDataStruct roomMesh;
VertexRenderStruct roomMeshMutable;
std::vector<ActiveObject> objects;
public:
Room(const std::string& roomName) : name(roomName) {}
// Создаем меш комнаты (куб)
void createRoomMesh(const std::string& texturePath)
{
// Загружаем текстуру
auto texture = std::make_shared<Texture>(CreateTextureDataFromBmp24(texturePath));
addTexture(texture); // Добавляем текстуру в комнату
// Создаём меш комнаты на основе текстуры (например, прямоугольник)
roomMesh = CreateRect2D({0.0f, 0.0f}, {1024.0f, 1024.0f}, 1.0f);
roomMeshMutable.AssignFrom(roomMesh);
roomMeshMutable.RefreshVBO();
}
void addTexture(std::shared_ptr<Texture> texture)
{
textures.push_back(texture);
}
void addObject(const ActiveObject& obj)
{
objects.push_back(obj);
}
std::vector<ActiveObject>& getObjects() {
return objects; // Теперь можно изменять элементы вектора
}
void render(Renderer& renderer)
{
renderer.PushMatrix();
renderer.LoadIdentity();
// Рисуем комнату
if (!textures.empty())
{
glBindTexture(GL_TEXTURE_2D, textures[0]->getTexID());
}
renderer.DrawVertexRenderStruct(roomMeshMutable);
// Рисуем объекты в комнате
for (const auto& obj : objects)
{
renderer.PushMatrix();
renderer.TranslateMatrix(obj.objectPos);
glBindTexture(GL_TEXTURE_2D, obj.activeObjectTexturePtr->getTexID());
renderer.DrawVertexRenderStruct(obj.activeObjectMeshMutable);
renderer.PopMatrix();
}
renderer.PopMatrix();
}
std::string getName() const { return name; }
};
} }

View File

@ -8,4 +8,4 @@ g++ Game.cpp main.cpp Math.cpp OpenGlExtensions.cpp Physics.cpp Renderer.cpp \
$(pkg-config --cflags --libs vorbis vorbisfile ogg) \ $(pkg-config --cflags --libs vorbis vorbisfile ogg) \
-lopenal -lopenal
./sdl_app #./sdl_app