void GLMRenderTarget::Resize(int x,int y) { int c=m_textures.size(); math::vector3di sz(x,y,1); for(int i=0;i<c;++i) { video::ITexture* tex = GetColorTexture(i); if(tex && tex->getSize()!=sz) tex->createTexture(sz,tex->getImageFormat()); } }
GXBOOL RenderTargetImpl::SaveToMemory(clstd::MemBuffer* pBuffer, GXLPCSTR pImageFormat) { GXSIZE sDimension; GXBOOL bval = TRUE; GXFormat format = m_pColorTexture->GetFormat(); m_pColorTexture->GetDimension(&sDimension); Texture* pReadBackTexture = NULL; GetColorTexture(&pReadBackTexture, GXResUsage::Read); Texture::MAPPED mapped; if(pReadBackTexture->Map(&mapped, GXResMap::Read)) { GXUINT bpp = GetBytesOfGraphicsFormat(format); GXLPVOID pSourceBits = mapped.pBits; GXINT nSourcePitch = mapped.Pitch; clstd::Image temp_image; FREE_IMAGE_TYPE fit = FIT_BITMAP; switch(format) { case Format_R8G8B8A8: temp_image.Set(sDimension.cx, sDimension.cy, "RGBA", 8, pSourceBits, nSourcePitch); break; case Format_B8G8R8X8: temp_image.Set(sDimension.cx, sDimension.cy, "BGRX", 8, pSourceBits, nSourcePitch); break; case Format_B8G8R8: temp_image.Set(sDimension.cx, sDimension.cy, "BGRX", 8, pSourceBits, nSourcePitch); break; case Format_R8: temp_image.Set(sDimension.cx, sDimension.cy, "R", 8, pSourceBits, nSourcePitch); break; case Format_R8G8: temp_image.Set(sDimension.cx, sDimension.cy, "RG", 8, pSourceBits, nSourcePitch); break; case Format_R32G32B32A32_Float: fit = FIT_RGBAF; break; case Format_R32: fit = FIT_FLOAT; break; } if(temp_image.GetDataSize() > 0) { temp_image.SetFormat("BGRA"); pSourceBits = temp_image.GetLine(0); nSourcePitch = temp_image.GetPitch(); bpp = temp_image.GetChannels(); } FIBITMAP* fibmp = (fit == FIT_BITMAP) ? FreeImage_Allocate(sDimension.cx, sDimension.cy, bpp * 8) : FreeImage_AllocateT(fit, sDimension.cx, sDimension.cy, bpp * 8); BYTE* pDest = FreeImage_GetBits(fibmp); GXINT nDestPitch = FreeImage_GetPitch(fibmp); pDest += nDestPitch * (sDimension.cy - 1); for(int y = 0; y < sDimension.cy; y++) { memcpy(pDest, pSourceBits, clMin(nDestPitch, nSourcePitch)); pDest -= nDestPitch; pSourceBits = reinterpret_cast<GXLPVOID>(reinterpret_cast<size_t>(pSourceBits) + nSourcePitch); } pReadBackTexture->Unmap(); FREE_IMAGE_FORMAT fi_format = FIF_UNKNOWN; clStringA strFormat = pImageFormat; strFormat.MakeUpper(); if(strFormat == "PNG") { fi_format = FIF_PNG; } else if(strFormat == "JPEG" || strFormat == "JPG") { fi_format = FIF_JPEG; } else if(strFormat == "TIF" || strFormat == "TIFF") { fi_format = FIF_TIFF; } else if(strFormat == "TGA") { fi_format = FIF_TARGA; } else if(strFormat == "BMP") { fi_format = FIF_BMP; } else if(strFormat == "EXR") { fi_format = FIF_EXR; } if(fi_format != FIF_UNKNOWN) { FIMEMORY* fimemory = FreeImage_OpenMemory(); if(FreeImage_SaveToMemory(fi_format, fibmp, fimemory)) { BYTE *pData; DWORD size_in_bytes; if(FreeImage_AcquireMemory(fimemory, &pData, &size_in_bytes)) { pBuffer->Resize(0, FALSE); pBuffer->Append(pData, size_in_bytes); } else { bval = FALSE; } } else { bval = FALSE; } FreeImage_CloseMemory(fimemory); } else { bval = FALSE; } FreeImage_Unload(fibmp); } SAFE_RELEASE(pReadBackTexture); return bval; }
void GLFramebuffer::ActivateAndBindColorTexture(GLuint slot){ glActiveTexture(slot); glBindTexture(GL_TEXTURE_2D, GetColorTexture()); }