void Load(const std::string& p_file_name) { FILE* file; file = fopen(p_file_name.c_str(), "rb"); if (file) { unsigned long size; fseek(file, 0, SEEK_END); size = ftell(file); fseek(file, 0, SEEK_SET); r2::Byte* buffer = new r2::Byte[size]; try { fread(buffer, 1, size, file); r2::SerialLoader loader(buffer, size); Serialize(loader); } catch (...) { delete [] buffer; throw; } delete [] buffer; fclose(file); } else { throw r2ExceptionIOM(std::string("Could not open file: ") + p_file_name); } }
void Save(const std::string& p_file_name) { r2::SerialSizer sizer; Serialize(sizer); r2::Byte* buffer = new r2::Byte[sizer.GetSize()]; try { r2::SerialSaver saver(buffer, sizer.GetSize()); Serialize(saver); FILE* file; file = fopen(p_file_name.c_str(), "w+b"); if (file) { fwrite(buffer, 1, sizer.GetSize(), file); fclose(file); } else { throw r2ExceptionIOM(std::string("Could not create/open file: ") + p_file_name); } } catch (...) { delete [] buffer; throw; } delete [] buffer; }
std::shared_ptr<Texture> Texture::loadTexture(const std::string& filename) { std::shared_ptr<Texture> texture(new Texture); ILuint imageName; ilGenImages(1, &imageName); ilBindImage(imageName); if (!ilLoadImage(filename.c_str())) { throw r2ExceptionIOM("Failed to load texture image: " + filename); } GLCheck(glBindTexture(GL_TEXTURE_2D, texture->getId())); ILuint imageWidth = ilGetInteger(IL_IMAGE_WIDTH); ILuint imageHeight = ilGetInteger(IL_IMAGE_HEIGHT); ILuint imageBpp = ilGetInteger(IL_IMAGE_BPP); ILubyte* imageData = ilGetData(); GLenum format = (imageBpp == 3) ? GL_RGB : GL_RGBA; if (imageBpp != 3 && imageBpp != 4) { std::stringstream ss; ss << "Texture image in bad format (bytes per pixel = " << imageBpp << "): " << filename; throw r2ExceptionIOM(ss.str()); } GLCheck(glTexImage2D(GL_TEXTURE_2D, 0, format, imageWidth, imageHeight, 0, format, GL_UNSIGNED_BYTE, (const GLvoid*)imageData)); ilBindImage(0); ilDeleteImages(1, &imageName); return texture; }