2019-12-12 17:32:41 +01:00
|
|
|
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
|
|
|
// This file is part of the "Irrlicht Engine".
|
|
|
|
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
|
|
|
|
|
|
|
#include "IrrCompileConfig.h"
|
|
|
|
#ifdef _IRR_COMPILE_WITH_SOFTWARE_
|
|
|
|
|
|
|
|
#include "CSoftwareTexture.h"
|
|
|
|
#include "CSoftwareDriver.h"
|
|
|
|
#include "os.h"
|
|
|
|
|
|
|
|
namespace irr
|
|
|
|
{
|
|
|
|
namespace video
|
|
|
|
{
|
|
|
|
|
|
|
|
//! constructor
|
|
|
|
CSoftwareTexture::CSoftwareTexture(IImage* image, const io::path& name, bool renderTarget)
|
|
|
|
: ITexture(name, ETT_2D), Texture(0)
|
|
|
|
{
|
|
|
|
#ifdef _DEBUG
|
|
|
|
setDebugName("CSoftwareTexture");
|
|
|
|
#endif
|
|
|
|
|
|
|
|
DriverType = EDT_SOFTWARE;
|
|
|
|
ColorFormat = ECF_A1R5G5B5;
|
|
|
|
HasMipMaps = false;
|
|
|
|
IsRenderTarget = renderTarget;
|
|
|
|
|
|
|
|
if (image)
|
|
|
|
{
|
|
|
|
bool IsCompressed = false;
|
|
|
|
|
|
|
|
if(IImage::isCompressedFormat(image->getColorFormat()))
|
|
|
|
{
|
|
|
|
os::Printer::log("Texture compression not available.", ELL_ERROR);
|
|
|
|
IsCompressed = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
OriginalSize = image->getDimension();
|
|
|
|
core::dimension2d<u32> optSize = OriginalSize.getOptimalSize();
|
|
|
|
|
|
|
|
Image = new CImage(ECF_A1R5G5B5, OriginalSize);
|
|
|
|
|
|
|
|
if (!IsCompressed)
|
|
|
|
image->copyTo(Image);
|
|
|
|
|
|
|
|
if (optSize == OriginalSize)
|
|
|
|
{
|
|
|
|
Texture = Image;
|
|
|
|
Texture->grab();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Texture = new CImage(ECF_A1R5G5B5, optSize);
|
|
|
|
Image->copyToScaling(Texture);
|
|
|
|
}
|
|
|
|
|
|
|
|
Size = Texture->getDimension();
|
|
|
|
Pitch = Texture->getDimension().Width * 2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//! destructor
|
|
|
|
CSoftwareTexture::~CSoftwareTexture()
|
|
|
|
{
|
|
|
|
if (Image)
|
|
|
|
Image->drop();
|
|
|
|
|
|
|
|
if (Texture)
|
|
|
|
Texture->drop();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//! lock function
|
|
|
|
void* CSoftwareTexture::lock(E_TEXTURE_LOCK_MODE mode, u32 mipmapLevel, u32 layer, E_TEXTURE_LOCK_FLAGS lockFlags)
|
|
|
|
{
|
|
|
|
return Image->getData();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//! unlock function
|
|
|
|
void CSoftwareTexture::unlock()
|
|
|
|
{
|
|
|
|
if (Image != Texture)
|
|
|
|
{
|
|
|
|
os::Printer::log("Performance warning, slow unlock of non power of 2 texture.", ELL_WARNING);
|
|
|
|
Image->copyToScaling(Texture);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//! returns unoptimized surface
|
|
|
|
CImage* CSoftwareTexture::getImage()
|
|
|
|
{
|
|
|
|
return Image;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//! returns texture surface
|
|
|
|
CImage* CSoftwareTexture::getTexture()
|
|
|
|
{
|
|
|
|
return Texture;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CSoftwareTexture::regenerateMipMapLevels(void* data, u32 layer)
|
|
|
|
{
|
|
|
|
// our software textures don't have mip maps
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Software Render Target */
|
|
|
|
|
|
|
|
CSoftwareRenderTarget::CSoftwareRenderTarget(CSoftwareDriver* driver) : Driver(driver)
|
|
|
|
{
|
|
|
|
DriverType = EDT_SOFTWARE;
|
|
|
|
|
2021-08-26 16:09:35 +02:00
|
|
|
Textures.set_used(1);
|
|
|
|
Textures[0] = 0;
|
2019-12-12 17:32:41 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
CSoftwareRenderTarget::~CSoftwareRenderTarget()
|
|
|
|
{
|
2021-08-26 16:09:35 +02:00
|
|
|
if (Textures[0])
|
|
|
|
Textures[0]->drop();
|
2019-12-12 17:32:41 +01:00
|
|
|
}
|
|
|
|
|
2021-08-26 18:45:20 +02:00
|
|
|
void CSoftwareRenderTarget::setTextures(ITexture* const * textures, u32 numTextures, ITexture* depthStencil, const E_CUBE_SURFACE* cubeSurfaces, u32 numCubeSurfaces)
|
2019-12-12 17:32:41 +01:00
|
|
|
{
|
2021-08-26 18:45:20 +02:00
|
|
|
if (!Textures.equals(textures, numTextures))
|
2019-12-12 17:32:41 +01:00
|
|
|
{
|
2021-08-26 16:09:35 +02:00
|
|
|
ITexture* prevTexture = Textures[0];
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
bool textureDetected = false;
|
|
|
|
|
2021-08-26 18:45:20 +02:00
|
|
|
for (u32 i = 0; i < numTextures; ++i)
|
2019-12-12 17:32:41 +01:00
|
|
|
{
|
2021-08-26 16:09:35 +02:00
|
|
|
if (textures[i] && textures[i]->getDriverType() == EDT_SOFTWARE)
|
2019-12-12 17:32:41 +01:00
|
|
|
{
|
2021-08-26 16:09:35 +02:00
|
|
|
Textures[0] = textures[i];
|
|
|
|
Textures[0]->grab();
|
2019-12-12 17:32:41 +01:00
|
|
|
textureDetected = true;
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (prevTexture)
|
|
|
|
prevTexture->drop();
|
|
|
|
|
|
|
|
if (!textureDetected)
|
2021-08-26 16:09:35 +02:00
|
|
|
Textures[0] = 0;
|
2019-12-12 17:32:41 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ITexture* CSoftwareRenderTarget::getTexture() const
|
|
|
|
{
|
2021-08-26 16:09:35 +02:00
|
|
|
return Textures[0];
|
2019-12-12 17:32:41 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
} // end namespace video
|
|
|
|
} // end namespace irr
|
|
|
|
|
|
|
|
#endif // _IRR_COMPILE_WITH_SOFTWARE_
|
|
|
|
|