1
0

Merging r6075 through r6106 from trunk to ogl-es branch.

Burnings renderer changes.


git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@6116 dfc29bdd-3216-0410-991c-e03cc46cb475
This commit is contained in:
cutealien
2020-06-12 20:41:49 +00:00
parent 084e0e669a
commit 20b3d56987
117 changed files with 10384 additions and 3817 deletions

View File

@@ -21,6 +21,14 @@ class CBurningVideoDriver;
/*!
interface for a Video Driver dependent Texture.
*/
struct CSoftwareTexture2_Bound
{
f32 w; // width - 0.5f;
f32 h; // height- 0.5f;
f32 cx; // texelcenter x 1.f/width*0.5f
f32 cy; // texelcenter y 1.f/height*0.5f
};
class CSoftwareTexture2 : public ITexture
{
public:
@@ -28,21 +36,34 @@ public:
//! constructor
enum eTex2Flags
{
GEN_MIPMAP = 1,
IS_RENDERTARGET = 2,
NP2_SIZE = 4,
GEN_MIPMAP = 1, // has mipmaps
GEN_MIPMAP_AUTO = 2, // automatic mipmap generation
IS_RENDERTARGET = 4,
ALLOW_NPOT = 8, //allow non power of two
IMAGE_IS_LINEAR = 16,
TEXTURE_IS_LINEAR = 32,
};
CSoftwareTexture2(IImage* surface, const io::path& name, u32 flags);
CSoftwareTexture2(IImage* surface, const io::path& name, u32 flags /*eTex2Flags*/, CBurningVideoDriver* driver);
//! destructor
virtual ~CSoftwareTexture2();
u32 getMipmapLevel(s32 newLevel) const
{
if ( newLevel < 0 ) newLevel = 0;
else if ( newLevel >= SOFTWARE_DRIVER_2_MIPMAPPING_MAX ) newLevel = SOFTWARE_DRIVER_2_MIPMAPPING_MAX - 1;
while ( newLevel > 0 && MipMap[newLevel] == 0 ) newLevel -= 1;
return newLevel;
}
//! lock function
virtual void* lock(E_TEXTURE_LOCK_MODE mode, u32 mipmapLevel, u32 layer, E_TEXTURE_LOCK_FLAGS lockFlags = ETLF_FLIP_Y_UP_RTT) _IRR_OVERRIDE_
{
if (Flags & GEN_MIPMAP)
{
MipMapLOD = mipmapLevel;
//called from outside. must test
MipMapLOD = getMipmapLevel(mipmapLevel);
Size = MipMap[MipMapLOD]->getDimension();
Pitch = MipMap[MipMapLOD]->getPitch();
}
@@ -55,14 +76,19 @@ public:
{
}
//! Returns the size of the largest mipmap.
//! compare the area drawn with the area of the texture
f32 getLODFactor( const f32 texArea ) const
{
return OrigImageDataSizeInPixels * texArea;
return MipMap0_Area[0]* MipMap0_Area[1] * 0.5f * texArea;
//return MipMap[0]->getImageDataSizeInPixels () * texArea;
}
//! returns unoptimized surface
const u32* getMipMap0_Area() const
{
return MipMap0_Area;
}
//! returns unoptimized surface (misleading name. burning can scale down originalimage)
virtual CImage* getImage() const
{
return MipMap[0];
@@ -74,16 +100,27 @@ public:
return MipMap[MipMapLOD];
}
//precalculated dimx-1/dimx*0.5f
const CSoftwareTexture2_Bound& getTexBound() const
{
return TexBound[MipMapLOD];
}
virtual void regenerateMipMapLevels(void* data = 0, u32 layer = 0) _IRR_OVERRIDE_;
f32 get_lod_bias() const { return LodBIAS; }
private:
f32 OrigImageDataSizeInPixels;
void calcDerivative();
CImage * MipMap[SOFTWARE_DRIVER_2_MIPMAPPING_MAX];
//! controls MipmapSelection. relation between drawn area and image size
u32 MipMapLOD; // 0 .. original Texture pot -SOFTWARE_DRIVER_2_MIPMAPPING_MAX
u32 Flags; //eTex2Flags
CBurningVideoDriver* Driver;
u32 MipMapLOD;
u32 Flags;
ECOLOR_FORMAT OriginalFormat;
CImage* MipMap[SOFTWARE_DRIVER_2_MIPMAPPING_MAX];
CSoftwareTexture2_Bound TexBound[SOFTWARE_DRIVER_2_MIPMAPPING_MAX];
u32 MipMap0_Area[2];
f32 LodBIAS;
};
/*!
@@ -103,9 +140,9 @@ protected:
CBurningVideoDriver* Driver;
};
} // end namespace video
} // end namespace irr
#endif
#endif // __C_SOFTWARE_2_TEXTURE_H_INCLUDED__