liImg *lrmResourceManager::LoadImg(const std::string &filename) { map<string,liImg *>::iterator I = LoadedImages.find(filename); map<string,liFramebuffer *>::iterator J = AddedFramebuffers.find(filename); if(J != AddedFramebuffers.end()) { return J->second->GetColorBuffer(); } if(I == LoadedImages.end()) { BMP *Bmp = new BMP(ImagePath + filename); if(Bmp->GetError() != BMP::ERR_OK) { delete Bmp; cerr << "Nem sikerult betolteni a kepfajlt: " << filename << endl; LoadedImages[filename] = nullptr; return nullptr; } #ifdef L_TESTING Bmp->Print(cout); #endif liImg *Img; GPUFactory->UploadImage(Img,Bmp); delete Bmp; LoadedImages[filename] = Img; return Img; } else { return I->second; } //return LoadedImages[filename]; }
liStaticMesh *lrmResourceManager::LoadHeightmap(const std::string &filename) { auto I = LoadedStaticMeshes.find(filename); if(I != LoadedStaticMeshes.end()) { return LoadedStaticMeshes[filename]; } BMP *bmp = new BMP(HeightmapPath + filename); if(bmp->GetError() != BMP::ERR_OK) { std::cerr << "Couldn't open file " << filename << std::endl; delete bmp; return nullptr; } bmp->Print(cout); lrmStaticMesh *StaticMeshSrc = new lrmStaticMesh(); LoadHeightmapVertices(bmp,StaticMeshSrc->Vertices); StaticMeshSrc->Normals.resize(bmp->GetHeight() * bmp->GetWidth()); StaticMeshSrc->Tangents.resize(bmp->GetHeight() * bmp->GetWidth()); StaticMeshSrc->Bitangents.resize(bmp->GetHeight() * bmp->GetWidth()); StaticMeshSrc->TexCoords.resize(bmp->GetHeight() * bmp->GetWidth()); lrmStaticMesh::lrmMtlGroup *MtlGroup = new lrmStaticMesh::lrmMtlGroup(); MtlGroup->Material = "Material"; StaticMeshSrc->MatGroups.push_back(MtlGroup); bool Puszcsy = true; bool Szercsy = true; for(int i=0;i < bmp->GetHeight()-1;i++) { for(int j=0;j < bmp->GetWidth()-1;j++) { const lmVector3D &V1 = StaticMeshSrc->Vertices[i * bmp->GetWidth() + j ]; const lmVector3D &V2 = StaticMeshSrc->Vertices[i * bmp->GetWidth() + (j+1)]; const lmVector3D &V3 = StaticMeshSrc->Vertices[(i+1) * bmp->GetWidth() + j ]; const lmVector3D &V4 = StaticMeshSrc->Vertices[(i+1) * bmp->GetWidth() + (j+1)]; lmVector3D Normal1 = lmCross(V2-V1,V4-V1); Normal1.Normalize(); lmVector3D Normal2 = lmCross(V4-V1,V3-V1); Normal2.Normalize(); LoadHeightmapTriangles_SM(bmp,i,j,Normal1,Normal2,StaticMeshSrc->Normals,StaticMeshSrc->MatGroups[0]->IndexBuffer); if(Puszcsy) { StaticMeshSrc->TexCoords[i * bmp->GetWidth() + (j+1)][0] = 1.0; } Puszcsy = !Puszcsy; if(Szercsy) { StaticMeshSrc->TexCoords[(i+1) * bmp->GetWidth() + j ][1] = 1.0; StaticMeshSrc->TexCoords[(i+1) * bmp->GetWidth() + (j+1)][1] = 1.0; } } Szercsy = !Szercsy; } delete bmp; for(lmVector3D &Normal : StaticMeshSrc->Normals) { Normal.Normalize(); } for(int i=0;i < StaticMeshSrc->Normals.size();i++) { //lmVector3D Tangent = lmCross(lmCross(StaticMeshSrc->Normals[i],(-1.0)*StaticMeshSrc->Vertices[i]),StaticMeshSrc->Normals[i]); lmVector3D Tangent = lmCross(lmCross(StaticMeshSrc->Normals[i],{1.0,0.0,0.0}),StaticMeshSrc->Normals[i]); Tangent.Normalize(); StaticMeshSrc->Tangents[i] = Tangent; lmVector3D Bitangent = lmCross(Tangent,StaticMeshSrc->Normals[i]); Bitangent.Normalize(); StaticMeshSrc->Bitangents[i] = Bitangent; } liStaticMesh *StaticMesh; GPUFactory->UploadStaticMesh(StaticMesh,StaticMeshSrc); delete StaticMeshSrc; LoadedStaticMeshes[filename] = StaticMesh; return LoadedStaticMeshes[filename]; }