Files
Tomas G. 23bb2d2749 init
2026-03-13 08:16:01 +01:00

81 lines
3.1 KiB
C++

#ifndef BOAT_H
#define BOAT_H
#include <glm/glm.hpp>
#include <glm/gtc/quaternion.hpp>
#include <vector>
#include "Input.h"
#include "Ocean.h"
#include "Terrain.h"
#include <string>
#include <tiny_obj_loader.h> // Include tinyobjloader
class Boat {
public:
Boat();
~Boat();
bool init(const char* modelPath, const char* texturePath); // Pass model and texture paths
void cleanup();
void update(const Input& input, const Ocean& ocean, const Terrain& terrain, float deltaTime);
glm::vec3 getPosition() const { return position; }
glm::quat getRotation() const { return rotation; }
float getSpeed() const { return speed; }
bool hasTerrainCollision() const { return lastCollisionWithTerrain; }
bool canDisembark() const { return lastCollisionAllowsDisembark; }
glm::vec3 getDisembarkPosition() const { return lastCollisionPoint; }
void clearCollisionState();
glm::vec3 getBoundingBoxMin() const { return boundingBoxMin; } // **Getter for boundingBoxMin**
glm::vec3 getBoundingBoxMax() const { return boundingBoxMax; } // **Getter for boundingBoxMax**
// Getters for model data to pass to Renderer
const std::vector<glm::vec3>& getVertices() const { return vertices; }
const std::vector<glm::vec3>& getNormals() const { return normals; }
const std::vector<glm::vec2>& getTexCoords() const { return texCoords; }
const std::string& getTexturePath() const { return boatTexturePath; } // Getter for texture path
const std::vector<tinyobj::material_t>& getMaterials() const { return materials; } // Getter for materials
const std::vector<int>& getMaterialIndices() const { return materialIndices; } // Getter for materials
// New: Getter and Setter for boatScale
float getScale() const { return boatScale; }
void setScale(float scale) { boatScale = scale; }
private:
glm::vec3 position;
glm::quat rotation;
float speed;
float steeringSpeed;
std::vector<glm::vec3> vertices;
std::vector<glm::vec3> normals;
std::vector<glm::vec2> texCoords;
std::vector<int> materialIndices; // New: Store material indices per vertex
std::vector<tinyobj::material_t> materials; // New: Store materials
void handleInput(const Input& input, const Ocean& ocean, const Terrain& terrain, float deltaTime);
void applyWaveMotion(const Ocean& ocean);
bool collidesWithTerrain(const Terrain& terrain, const Ocean& ocean, const glm::vec3& candidatePosition, glm::vec3* collisionPoint) const;
bool isGradientLowForDisembark(const Terrain& terrain, const glm::vec3& collisionPoint) const;
float getCollisionRadius() const;
bool loadModel(const char* path); // Function to load OBJ model
std::string boatTexturePath; // Store texture path for Renderer to access
glm::vec3 boundingBoxMin;
glm::vec3 boundingBoxMax;
int getGridIndex(int x, int z) const; // Helper function to get 1D index from 2D grid indices
float boatScale;
bool speedUpKeyWasDown;
bool speedDownKeyWasDown;
bool lastCollisionWithTerrain;
bool lastCollisionAllowsDisembark;
glm::vec3 lastCollisionPoint;
};
#endif // BOAT_H