Ejemplo n.º 1
0
// prepare values ImageSize, TextureSize, and ColorFormat based on image
void COpenGLTexture::getImageValues(ISGPImage* image)
{
	COpenGLConfig* pOpenGLConfig = COpenGLConfig::getInstance();
	if (!image)
	{
		Logger::getCurrentLogger()->writeToLog(String("No image for OpenGL texture."), ELL_ERROR);
		return;
	}

	ImageSize = image->getDimension();

	if ( !ImageSize.Width || !ImageSize.Height)
	{
		Logger::getCurrentLogger()->writeToLog(String("Invalid size of image for OpenGL Texture."), ELL_ERROR);
		return;
	}

	const float ratio = (float)ImageSize.Width/(float)ImageSize.Height;
	if ( (ImageSize.Width > pOpenGLConfig->MaxTextureSize) && (ratio >= 1.0f) )
	{
		ImageSize.Width = pOpenGLConfig->MaxTextureSize;
		ImageSize.Height = (uint32)(pOpenGLConfig->MaxTextureSize/ratio);
	}
	else if (ImageSize.Height > pOpenGLConfig->MaxTextureSize)
	{
		ImageSize.Height = pOpenGLConfig->MaxTextureSize;
		ImageSize.Width = (uint32)(pOpenGLConfig->MaxTextureSize*ratio);
	}

	TextureSize = ImageSize.getOptimalSize( !RenderDevice->queryDriverFeature(SGPVDF_TEXTURE_NPOT) );

	m_ColorFormat = getBestColorFormat(image->getColorFormat());
}
Ejemplo n.º 2
0
		// prepare values ImageSize, TextureSize, and ColorFormat based on image
		void COpenGLTexture::getImageValues(IImage* image)
		{
			IRR_ASSERT(image);

			ImageSize = image->getDimension();

			IRR_ASSERT(ImageSize.Width && ImageSize.Height);

			const f32 ratio = (f32) ImageSize.Width / (f32) ImageSize.Height;

			if ((ImageSize.Width > Driver->getMaxTextureSize().Width)
					&& (ratio >= 1.0f))
			{
				ImageSize.Width = Driver->getMaxTextureSize().Width;
				ImageSize.Height = (u32) (Driver->getMaxTextureSize().Height
						/ ratio);
			}
			else if (ImageSize.Height > Driver->getMaxTextureSize().Height)
			{
				ImageSize.Height = Driver->getMaxTextureSize().Height;
				ImageSize.Width = (u32) (Driver->getMaxTextureSize().Width
						* ratio);
			}

			TextureSize = ImageSize.getOptimalSize(
					!SharedOpenGLExtensionHandler::getInstance().queryFeature(
							EVDF_TEXTURE_NPOT));

			ColorFormat = getBestColorFormat(image->getColorFormat());

		}
Ejemplo n.º 3
0
void CD3D9Texture::getImageValues(const IImage* image)
{
	OriginalColorFormat = image->getColorFormat();
	ColorFormat = getBestColorFormat(OriginalColorFormat);

	InternalFormat = Driver->getD3DFormatFromColorFormat(ColorFormat);

	if (IImage::isCompressedFormat(image->getColorFormat()))
	{
		AutoGenerateMipMaps = false;
	}

	OriginalSize = image->getDimension();
	Size = OriginalSize;

	if (Size.Width == 0 || Size.Height == 0)
	{
		os::Printer::log("Invalid size of image for texture.", ELL_ERROR);
		return;
	}

	const f32 ratio = (f32)Size.Width / (f32)Size.Height;

	if ((Size.Width > Driver->Caps.MaxTextureWidth) && (ratio >= 1.f))
	{
		Size.Width = Driver->Caps.MaxTextureWidth;
		Size.Height = (u32)(Driver->Caps.MaxTextureWidth / ratio);
	}
	else if (Size.Height > Driver->Caps.MaxTextureHeight)
	{
		Size.Height = Driver->Caps.MaxTextureHeight;
		Size.Width = (u32)(Driver->Caps.MaxTextureHeight * ratio);
	}

	bool needSquare = (!Driver->queryFeature(EVDF_TEXTURE_NSQUARE) || Type == ETT_CUBEMAP);

	Size = Size.getOptimalSize(!Driver->queryFeature(EVDF_TEXTURE_NPOT), needSquare, true, Driver->Caps.MaxTextureWidth);

	Pitch = Size.Width * IImage::getBitsPerPixelFromFormat(ColorFormat) / 8;
}