void Image::SetTextureData(ImageData *ImgInfo, bool Reassign) { if (Reassign) Destroy(); CreateTexture(); // Make sure our texture exists. Bind(); if (ImgInfo->Data == nullptr && !Reassign) { return; } if (!TextureAssigned || Reassign) // We haven't set any data to this texture yet, or we want to regenerate storage { TextureAssigned = true; Directory Dir = ImgInfo->Filename; Dir = Dir.Filename(); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); if (!Configuration::TextureParameterExists(Dir, "gen-mipmap") || Configuration::GetTextureParameter(Dir, "gen-mipmap") == "true") glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); GLint param; switch (ImgInfo->WrapMode) { case ImageData::WM_CLAMP_TO_EDGE: param = GL_CLAMP_TO_EDGE; break; case ImageData::WM_REPEAT: param = GL_REPEAT; break; default: param = GL_CLAMP_TO_EDGE; } GLint wrapS = param, wrapT = param; if (Configuration::GetTextureParameter(Dir, "wrap-s") == "clamp-edge") wrapS = GL_CLAMP_TO_EDGE; else if (Configuration::GetTextureParameter(Dir, "wrap-s") == "repeat") wrapS = GL_REPEAT; else if (Configuration::GetTextureParameter(Dir, "wrap-s") == "clamp-border") wrapS = GL_CLAMP_TO_BORDER; else if (Configuration::GetTextureParameter(Dir, "wrap-s") == "repeat-mirrored") wrapS = GL_MIRRORED_REPEAT; if (Configuration::GetTextureParameter(Dir, "wrap-t") == "clamp-edge") wrapT = GL_CLAMP_TO_EDGE; else if (Configuration::GetTextureParameter(Dir, "wrap-t") == "repeat") wrapT = GL_REPEAT; else if (Configuration::GetTextureParameter(Dir, "wrap-t") == "clamp-border") wrapT = GL_CLAMP_TO_BORDER; else if (Configuration::GetTextureParameter(Dir, "wrap-t") == "repeat-mirrored") wrapT = GL_MIRRORED_REPEAT; glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapS); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapT); GLint minparam; switch (ImgInfo->ScalingMode) { case ImageData::SM_LINEAR: minparam = GL_LINEAR; param = GL_LINEAR; break; case ImageData::SM_MIPMAP: minparam = GL_LINEAR_MIPMAP_LINEAR; param = GL_LINEAR; break; case ImageData::SM_NEAREST: minparam = GL_NEAREST; param = GL_NEAREST; break; default: minparam = GL_LINEAR_MIPMAP_LINEAR; param = GL_LINEAR; } GLint minp = minparam, maxp = param; if (Configuration::GetTextureParameter(Dir, "minfilter") == "linear") minp = GL_LINEAR; else if (Configuration::GetTextureParameter(Dir, "minfilter") == "nearest") minp = GL_NEAREST; else if (Configuration::GetTextureParameter(Dir, "minfilter") == "linear-mipmap-linear") minp = GL_LINEAR_MIPMAP_LINEAR; else if (Configuration::GetTextureParameter(Dir, "minfilter") == "linear-mipmap-nearest") minp = GL_LINEAR_MIPMAP_NEAREST; else if (Configuration::GetTextureParameter(Dir, "minfilter") == "nearest-mipmap-nearest") minp = GL_NEAREST_MIPMAP_NEAREST; else if (Configuration::GetTextureParameter(Dir, "minfilter") == "nearest-mipmap-linear") minp = GL_NEAREST_MIPMAP_LINEAR; if (Configuration::GetTextureParameter(Dir, "maxfilter") == "linear") maxp = GL_LINEAR; else if (Configuration::GetTextureParameter(Dir, "maxfilter") == "nearest") maxp = GL_NEAREST; else if (Configuration::GetTextureParameter(Dir, "maxfilter") == "linear-mipmap-linear") maxp = GL_LINEAR_MIPMAP_LINEAR; else if (Configuration::GetTextureParameter(Dir, "maxfilter") == "linear-mipmap-nearest") maxp = GL_LINEAR_MIPMAP_NEAREST; else if (Configuration::GetTextureParameter(Dir, "maxfilter") == "nearest-mipmap-nearest") maxp = GL_NEAREST_MIPMAP_NEAREST; else if (Configuration::GetTextureParameter(Dir, "maxfilter") == "nearest-mipmap-linear") maxp = GL_NEAREST_MIPMAP_LINEAR; glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minp); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, maxp); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ImgInfo->Width, ImgInfo->Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, ImgInfo->Data); } else // We did, so let's update instead. { glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, ImgInfo->Width, ImgInfo->Height, GL_RGBA, GL_UNSIGNED_BYTE, ImgInfo->Data); } w = ImgInfo->Width; h = ImgInfo->Height; fname = ImgInfo->Filename; }