1
// Copyright (C) 2002-2011 Nikolaus Gebhardt / Thomas Alten
2
// This file is part of the "Irrlicht Engine".
3
// For conditions of distribution and use, see copyright notice in irrlicht.h
5
#include "IrrCompileConfig.h"
6
#ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_
8
#include "SoftwareDriver2_compile_config.h"
9
#include "SoftwareDriver2_helper.h"
10
#include "CSoftwareTexture2.h"
19
CSoftwareTexture2::CSoftwareTexture2(IImage* image, const io::path& name,
20
u32 flags, void* mipmapData)
21
: ITexture(name), MipMapLOD(0), Flags ( flags ), OriginalFormat(video::ECF_UNKNOWN)
24
setDebugName("CSoftwareTexture2");
27
#ifndef SOFTWARE_DRIVER_2_MIPMAPPING
31
memset32 ( MipMap, 0, sizeof ( MipMap ) );
35
OrigSize = image->getDimension();
36
OriginalFormat = image->getColorFormat();
38
core::setbit_cond(Flags,
39
image->getColorFormat () == video::ECF_A8R8G8B8 ||
40
image->getColorFormat () == video::ECF_A1R5G5B5,
43
core::dimension2d<u32> optSize(
44
OrigSize.getOptimalSize( 0 != ( Flags & NP2_SIZE ),
46
( Flags & NP2_SIZE ) ? SOFTWARE_DRIVER_2_TEXTURE_MAXSIZE : 0)
49
if ( OrigSize == optSize )
51
MipMap[0] = new CImage(BURNINGSHADER_COLOR_FORMAT, image->getDimension());
52
image->copyTo(MipMap[0]);
57
core::stringw showName ( name );
58
snprintf ( buf, 256, "Burningvideo: Warning Texture %ls reformat %dx%d -> %dx%d,%d",
60
OrigSize.Width, OrigSize.Height, optSize.Width, optSize.Height,
61
BURNINGSHADER_COLOR_FORMAT
65
os::Printer::log ( buf, ELL_WARNING );
66
MipMap[0] = new CImage(BURNINGSHADER_COLOR_FORMAT, optSize);
67
image->copyToScalingBoxFilter ( MipMap[0],0, false );
70
OrigImageDataSizeInPixels = (f32) 0.3f * MipMap[0]->getImageDataSizeInPixels();
73
regenerateMipMapLevels(mipmapData);
78
CSoftwareTexture2::~CSoftwareTexture2()
80
for ( s32 i = 0; i!= SOFTWARE_DRIVER_2_MIPMAPPING_MAX; ++i )
88
//! Regenerates the mip map levels of the texture. Useful after locking and
89
//! modifying the texture
90
void CSoftwareTexture2::regenerateMipMapLevels(void* mipmapData)
98
for ( i = 1; i < SOFTWARE_DRIVER_2_MIPMAPPING_MAX; ++i )
104
core::dimension2d<u32> newSize;
105
core::dimension2d<u32> origSize=OrigSize;
107
for (i=1; i < SOFTWARE_DRIVER_2_MIPMAPPING_MAX; ++i)
109
newSize = MipMap[i-1]->getDimension();
110
newSize.Width = core::s32_max ( 1, newSize.Width >> SOFTWARE_DRIVER_2_MIPMAPPING_SCALE );
111
newSize.Height = core::s32_max ( 1, newSize.Height >> SOFTWARE_DRIVER_2_MIPMAPPING_SCALE );
112
origSize.Width = core::s32_max(1, origSize.Width >> 1);
113
origSize.Height = core::s32_max(1, origSize.Height >> 1);
117
if (OriginalFormat != BURNINGSHADER_COLOR_FORMAT)
119
IImage* tmpImage = new CImage(OriginalFormat, origSize, mipmapData, true, false);
120
MipMap[i] = new CImage(BURNINGSHADER_COLOR_FORMAT, newSize);
121
if (origSize==newSize)
122
tmpImage->copyTo(MipMap[i]);
124
tmpImage->copyToScalingBoxFilter(MipMap[i]);
129
if (origSize==newSize)
130
MipMap[i] = new CImage(BURNINGSHADER_COLOR_FORMAT, newSize, mipmapData, false);
133
MipMap[i] = new CImage(BURNINGSHADER_COLOR_FORMAT, newSize);
134
IImage* tmpImage = new CImage(BURNINGSHADER_COLOR_FORMAT, origSize, mipmapData, true, false);
135
tmpImage->copyToScalingBoxFilter(MipMap[i]);
139
mipmapData = (u8*)mipmapData+origSize.getArea()*IImage::getBitsPerPixelFromFormat(OriginalFormat)/8;
143
MipMap[i] = new CImage(BURNINGSHADER_COLOR_FORMAT, newSize);
145
//static u32 color[] = { 0, 0xFFFF0000, 0xFF00FF00,0xFF0000FF,0xFFFFFF00,0xFFFF00FF,0xFF00FFFF,0xFF0F0F0F };
146
MipMap[i]->fill ( 0 );
147
MipMap[0]->copyToScalingBoxFilter( MipMap[i], 0, false );
153
} // end namespace video
154
} // end namespace irr
156
#endif // _IRR_COMPILE_WITH_BURNINGSVIDEO_