diff --git a/src/engine/include/models/mesh.hpp b/src/engine/include/models/mesh.hpp index 99ca327..94541c0 100644 --- a/src/engine/include/models/mesh.hpp +++ b/src/engine/include/models/mesh.hpp @@ -35,7 +35,6 @@ public: DffModel *dff; float scale; color_t color; - Vector3 boxVertices[8]; Mesh(); ~Mesh(); @@ -55,7 +54,7 @@ public: u8 isMd2Loaded, isObjLoaded, isDffLoaded, isSpecInitialized; clutbuffer_t clut; lod_t lod; - MeshTexture *textures; + MeshTexture **textures; private: void setupLodAndClut(); @@ -63,7 +62,6 @@ private: u32 verticesCount; Vector3 *vertices; void loadTextures(char *t_subfolder, char *t_extension); - void computeBoundingBox(); void setVerticesReference(u32 t_verticesCount, Vector3 *t_verticesRef); void createSpecIfNotCreated(); void setDefaultColor(); diff --git a/src/engine/include/models/mesh_frame.hpp b/src/engine/include/models/mesh_frame.hpp index bca6eff..5c548d2 100644 --- a/src/engine/include/models/mesh_frame.hpp +++ b/src/engine/include/models/mesh_frame.hpp @@ -62,6 +62,12 @@ public: /** Array of materials. Size of getMaterialsCount() */ MeshMaterial *getMaterials() const { return materials; }; + /** + * Returns bounding box (AABB) vertex. + * Total length: 8 + */ + Vector3 &getBoundingBox(const u8 &i) { return boundingBox[i]; }; + // ---- // Setters // ---- @@ -92,6 +98,7 @@ public: const u8 &areVerticesAllocated() const { return _areVerticesAllocated; }; const u8 &areNormalsAllocated() const { return _areNormalsAllocated; }; const u8 &areMaterialsAllocated() const { return _areMaterialsAllocated; }; + const u8 &isBoundingBoxCalculated() const { return _isBoundingBoxCalculated; }; /** Set STs count and allocate memory. */ void allocateSTs(const u32 &t_val); @@ -105,8 +112,20 @@ public: /** Set materials count and allocate memory. */ void allocateMaterials(const u32 &t_val); + /** + * Calculates bounding box (AABB). + * Should be called by data loader, + * so there is no need to run it again. + */ + void calculateBoundingBox(); + private: - u8 _areSTsAllocated, _areVerticesAllocated, _areNormalsAllocated, _areMaterialsAllocated; + Vector3 boundingBox[8]; + u8 _areSTsAllocated, + _areVerticesAllocated, + _areNormalsAllocated, + _areMaterialsAllocated, + _isBoundingBoxCalculated; u32 vertexCount, stsCount, normalsCount, materialsCount; MeshMaterial *materials; Point *sts __attribute__((aligned(16))); diff --git a/src/engine/include/modules/texture_repository.hpp b/src/engine/include/modules/texture_repository.hpp new file mode 100644 index 0000000..45fac61 --- /dev/null +++ b/src/engine/include/modules/texture_repository.hpp @@ -0,0 +1,33 @@ +/* +# ______ ____ ___ +# | \/ ____| |___| +# | | | \ | | +#----------------------------------------------------------------------- +# Copyright 2020, tyra - https://github.com/h4570/tyra +# Licenced under Apache License 2.0 +# Sandro Sobczyński +*/ + +#ifndef _TYRA_TEXTURE_REPOSITORY_ +#define _TYRA_TEXTURE_REPOSITORY_ + +#include +#include +#include "../models/mesh.hpp" + +/** Class responsible for intializing draw env, textures and buffers */ +class TextureRepository +{ + +public: + TextureRepository(); + ~TextureRepository(); + +private: + void allocateTextureBuffer(u16 t_width, u16 t_height); + void deallocateTextureBuffer(); + void changeTexture(Mesh *t_mesh, u8 t_textureIndex); + texbuffer_t textureBuffer; +}; + +#endif diff --git a/src/engine/loaders/obj_loader.cpp b/src/engine/loaders/obj_loader.cpp index 1e46608..9a0b2a3 100644 --- a/src/engine/loaders/obj_loader.cpp +++ b/src/engine/loaders/obj_loader.cpp @@ -100,6 +100,7 @@ void ObjLoader::load(MeshFrame *o_result, char *t_filename, float t_scale, u8 in else break; } + o_result->calculateBoundingBox(); fclose(file); } diff --git a/src/engine/models/mesh.cpp b/src/engine/models/mesh.cpp index e114bf9..7b6e721 100644 --- a/src/engine/models/mesh.cpp +++ b/src/engine/models/mesh.cpp @@ -139,7 +139,6 @@ void Mesh::setVerticesReference(u32 t_verticesCount, Vector3 *t_verticesRef) { verticesCount = t_verticesCount; vertices = t_verticesRef; - computeBoundingBox(); } u32 Mesh::getVertexCount() @@ -172,26 +171,29 @@ void Mesh::loadTextures(char *t_subfolder, char *t_extension) BmpLoader bmpLoader = BmpLoader(); if (isObjLoaded) { - textures = new MeshTexture[obj->frames[0].getMaterialsCount()]; + textures = new MeshTexture *[obj->frames[0].getMaterialsCount()]; for (u8 i = 0; i < obj->frames[0].getMaterialsCount(); i++) { - bmpLoader.load(textures[i], t_subfolder, obj->frames[0].getMaterial(i).getName(), t_extension); + textures[i] = new MeshTexture(); + bmpLoader.load(*textures[i], t_subfolder, obj->frames[0].getMaterial(i).getName(), t_extension); // setDefaultWrapSettings(spec->textures[i].wrapSettings); } } else if (isMd2Loaded) { - textures = new MeshTexture[1]; - bmpLoader.load(textures[0], t_subfolder, md2->filename, t_extension); + textures = new MeshTexture *[1]; + textures[0] = new MeshTexture(); + bmpLoader.load(*textures[0], t_subfolder, md2->filename, t_extension); // setDefaultWrapSettings(spec->textures[0].wrapSettings); } else if (isDffLoaded) { - textures = new MeshTexture[dff->clump.geometryList.geometries[0].materialList.data.materialCount]; + textures = new MeshTexture *[dff->clump.geometryList.geometries[0].materialList.data.materialCount]; for (u8 i = 0; i < dff->clump.geometryList.geometries[0].materialList.data.materialCount; i++) for (u8 j = 0; j < dff->clump.geometryList.geometries[0].materialList.materials[i].data.textureCount; j++) { - bmpLoader.load(textures[i], t_subfolder, dff->clump.geometryList.geometries[0].materialList.materials[i].textures[j].textureName.text, t_extension); + textures[i] = new MeshTexture(); + bmpLoader.load(*textures[i], t_subfolder, dff->clump.geometryList.geometries[0].materialList.materials[i].textures[j].textureName.text, t_extension); // setDefaultWrapSettings(spec->textures[i].wrapSettings); } } @@ -291,9 +293,10 @@ void Mesh::playAnimation(u32 t_startFrame, u32 t_endFrame) */ void Mesh::getFarthestVertex(Vector3 *o_result, int t_offset) { - o_result->x = boxVertices[t_offset].x + position.x; - o_result->y = boxVertices[t_offset].y + position.y; - o_result->z = boxVertices[t_offset].z + position.z; + // TODO current frame + o_result->x = obj->frames[0].getBoundingBox(t_offset).x + position.x; + o_result->y = obj->frames[0].getBoundingBox(t_offset).y + position.y; + o_result->z = obj->frames[0].getBoundingBox(t_offset).z + position.z; } /** Sets texture level of details settings and CLUT settings */ @@ -344,38 +347,3 @@ u8 Mesh::isInFrustum(Plane *t_frustumPlanes) } return boxResult; } - -/** Compute 8 farthest corners for intersection check */ -void Mesh::computeBoundingBox() -{ - float lowX, lowY, lowZ, hiX, hiY, hiZ; - lowX = hiX = vertices[0].x; - lowY = hiY = vertices[0].y; - lowZ = hiZ = vertices[0].z; - for (u32 i = 0; i < verticesCount; i++) - { - if (lowX > vertices[i].x) - lowX = vertices[i].x; - if (hiX < vertices[i].x) - hiX = vertices[i].x; - - if (lowY > vertices[i].y) - lowY = vertices[i].y; - if (hiY < vertices[i].y) - hiY = vertices[i].y; - - if (lowZ > vertices[i].z) - lowZ = vertices[i].z; - if (hiZ < vertices[i].z) - hiZ = vertices[i].z; - } - boxVertices[0].set(lowX, lowY, lowZ); - boxVertices[1].set(lowX, lowY, hiZ); - boxVertices[2].set(lowX, hiY, lowZ); - boxVertices[3].set(lowX, hiY, hiZ); - - boxVertices[4].set(hiX, lowY, lowZ); - boxVertices[5].set(hiX, lowY, hiZ); - boxVertices[6].set(hiX, hiY, lowZ); - boxVertices[7].set(hiX, hiY, hiZ); -} diff --git a/src/engine/models/mesh_frame.cpp b/src/engine/models/mesh_frame.cpp index fc587f2..2d40d1c 100644 --- a/src/engine/models/mesh_frame.cpp +++ b/src/engine/models/mesh_frame.cpp @@ -90,3 +90,43 @@ void MeshFrame::allocateMaterials(const u32 &t_val) materials = new MeshMaterial[t_val]; _areMaterialsAllocated = true; } + +void MeshFrame::calculateBoundingBox() +{ + if (!_areVerticesAllocated) + { + PRINT_ERR("Can't calculate bounding box, because vertices was not allocated!"); + return; + } + float lowX, lowY, lowZ, hiX, hiY, hiZ; + lowX = hiX = vertices[0].x; + lowY = hiY = vertices[0].y; + lowZ = hiZ = vertices[0].z; + for (u32 i = 0; i < vertexCount; i++) + { + if (lowX > vertices[i].x) + lowX = vertices[i].x; + if (hiX < vertices[i].x) + hiX = vertices[i].x; + + if (lowY > vertices[i].y) + lowY = vertices[i].y; + if (hiY < vertices[i].y) + hiY = vertices[i].y; + + if (lowZ > vertices[i].z) + lowZ = vertices[i].z; + if (hiZ < vertices[i].z) + hiZ = vertices[i].z; + } + boundingBox[0].set(lowX, lowY, lowZ); + boundingBox[1].set(lowX, lowY, hiZ); + boundingBox[2].set(lowX, hiY, lowZ); + boundingBox[3].set(lowX, hiY, hiZ); + + boundingBox[4].set(hiX, lowY, lowZ); + boundingBox[5].set(hiX, lowY, hiZ); + boundingBox[6].set(hiX, hiY, lowZ); + boundingBox[7].set(hiX, hiY, hiZ); + _isBoundingBoxCalculated = true; +} diff --git a/src/engine/modules/renderer.cpp b/src/engine/modules/renderer.cpp index 64da7b5..ee7de1b 100644 --- a/src/engine/modules/renderer.cpp +++ b/src/engine/modules/renderer.cpp @@ -115,12 +115,12 @@ void Renderer::deallocateTextureBuffer() void Renderer::changeTexture(Mesh *t_mesh, u8 t_textureIndex) { - if (t_mesh->textures[t_textureIndex].getId() != lastTextureId) + if (t_mesh->textures[t_textureIndex]->getId() != lastTextureId) { - lastTextureId = t_mesh->textures[t_textureIndex].getId(); + lastTextureId = t_mesh->textures[t_textureIndex]->getId(); deallocateTextureBuffer(); - allocateTextureBuffer(t_mesh->textures[t_textureIndex].getWidth(), t_mesh->textures[t_textureIndex].getHeight()); - GifSender::sendTexture(t_mesh->textures[t_textureIndex], &textureBuffer); + allocateTextureBuffer(t_mesh->textures[t_textureIndex]->getWidth(), t_mesh->textures[t_textureIndex]->getHeight()); + GifSender::sendTexture(*t_mesh->textures[t_textureIndex], &textureBuffer); } } diff --git a/src/engine/modules/texture_repository.cpp b/src/engine/modules/texture_repository.cpp new file mode 100644 index 0000000..9cfe457 --- /dev/null +++ b/src/engine/modules/texture_repository.cpp @@ -0,0 +1,29 @@ +/* +# ______ ____ ___ +# | \/ ____| |___| +# | | | \ | | +#----------------------------------------------------------------------- +# Copyright 2020, tyra - https://github.com/h4570/tyra +# Licenced under Apache License 2.0 +# Sandro Sobczyński +*/ + +#include "../include/modules/texture_repository.hpp" +#include "../include/utils/debug.hpp" + +// ---- +// Constructors/Destructors +// ---- + +TextureRepository::TextureRepository() +{ + PRINT_LOG("Initializing texture repository"); + + PRINT_LOG("Texture repository initialized!"); +} + +TextureRepository::~TextureRepository() {} + +// ---- +// Methods +// ---- diff --git a/src/samples/ari/objects/player.hpp b/src/samples/ari/objects/player.hpp index a0bcc75..0ffb771 100644 --- a/src/samples/ari/objects/player.hpp +++ b/src/samples/ari/objects/player.hpp @@ -30,4 +30,36 @@ private: Vector3 playerNextPosition; }; +// TODO Rysowanie idzie wg tekstur + +// 2 Graczy, 1 mesh 2 tekstury +// sharedFrames = objLoader.load("meshes/", "block", 1.0F); +// var addedTextures = texturesRepo.addByMaterialNames("textures/dirt/", sharedFrames); +// var addedTexture = texturesRepo.add("textures/blocks/sand.bmp"); +// dirt = new Mesh(sharedFrames); +// sand = new Mesh(sharedFrames); +// addedTextures[0].addUsage(dirt.Id, sharedFrames.getMaterialId(0)); +// addedTexture.addUsage(sand.Id, sand.getMaterialId(0)); + +// 1 gracz, 2 dynamic tekstury +// sharedFrames = objLoader.load("meshes/", "block", 1.0F); +// var addedTexture1 = texturesRepo.add("textures/blocks/sand.bmp"); +// var addedTexture2 = texturesRepo.add("textures/blocks/sand_damaged.bmp"); +// sand = new Mesh(sharedFrames); +// addedTexture1.removeUsage(sand.Id, sand.getMaterialId(0)); +// draw() +// addedTexture2.addUsage(sand.Id, sand.getMaterialId(0)); + +// 2 różne obj, te same tekstury +// frames1 = objLoader.load("meshes/", "island", 1.0F); +// frames2 = objLoader.load("meshes/", "islandAddons", 1.0F); +// island = new Mesh(frames1); +// islandAddons = new Mesh(frames2); +// var addedTextures1 = texturesRepo.addByMaterialNames("textures/island/",frames1); +// var addedTextures2 = texturesRepo.addByMaterialNames("textures/island/",frames2); +// texturesRepo.remove(addedTextures2[0]); // duplicate +// addedTextures1[0].addUsage(islandAddons.Id, islandAddons.getMaterialId(0)); + +// Mesh -> position, rotation, color, scale, shouldBeLighted, clut, lod + #endif