public void Generate(byte[] data, int width, int height, TextureFilter filter, bool allowDownSize, TextureRepeat repeat, TextureDepth depth)
{
if(this.Disposed == true)
{
throw new ObjectDisposedException(this.GetType().Name);
}
// FIXME: should we implement cinematics this way, instead of with explicit calls?
/*Purge();
_filter = filter;
_allowDownSize = allowDownSize;
_repeat = repeat;
_depth = depth;*/
idConsole.Warning("TODO: generate");
// if we don't have a rendering context, just return after we
// have filled in the parms. We must have the values set, or
// an image match from a shader before OpenGL starts would miss
// the generated texture
if(idE.RenderSystem.IsRunning == false)
{
return;
}
// don't let mip mapping smear the texture into the clamped border
/*bool preserveBorder = (_repeat == TextureRepeat.ClampToZero);
// make sure it is a power of 2
int scaledWidth = idHelper.MakePowerOfTwo(width);
int scaledHeight = idHelper.MakePowerOfTwo(height);
if((scaledWidth != width) || (scaledHeight != height))
{
idConsole.Error("Image.Generate: not a power of 2 image.");
}
// Optionally modify our width/height based on options/hardware
GetDownSize(ref scaledWidth, ref scaledHeight);
byte[] scaledBuffer = null;
/*idE.RenderSystem.CheckOpenGLErrors();
uint[] tex = new uint[1];
//Gl.glGenTextures(1, tex);
_texNumber = (int) tex[0];
idE.RenderSystem.CheckOpenGLErrors();*/
/*_loaded = true;
// select proper internal format before we resample
_internalFormat = Gl.GL_RGB8; // SelectInternalFormat(data, 1, width, height, depth, out _isMonochrome);
// copy or resample data as appropriate for first MIP level.
if((scaledWidth == width) && (scaledHeight == height))
{
// we must copy even if unchanged, because the border zeroing
// would otherwise modify const data
scaledBuffer = data;
}
else
{
idConsole.Warning("TODO: DONT SUPPORT MIMAP RIGHT NOW");
// resample down as needed (FIXME: this doesn't seem like it resamples anymore!)
// scaledBuffer = R_ResampleTexture( pic, width, height, width >>= 1, height >>= 1 );
/*scaledBuffer = R_MipMap( pic, width, height, preserveBorder );
width >>= 1;
height >>= 1;
if ( width < 1 ) {
width = 1;
}
if ( height < 1 ) {
height = 1;
}
while ( width > scaled_width || height > scaled_height ) {
shrunk = R_MipMap( scaledBuffer, width, height, preserveBorder );
R_StaticFree( scaledBuffer );
scaledBuffer = shrunk;
width >>= 1;
height >>= 1;
if ( width < 1 ) {
width = 1;
}
if ( height < 1 ) {
height = 1;
}
}
// one might have shrunk down below the target size
scaled_width = width;
scaled_height = height;*/
/*}*/
/*_uploadWidth = scaledWidth;
_uploadHeight = scaledHeight;
_type = TextureType.TwoD;
// zero the border if desired, allowing clamped projection textures
// even after picmip resampling or careless artists.
if(repeat == TextureRepeat.ClampToZero)
{
byte[] rgba = new byte[4] { 0, 0, 0, 255 };
SetBorderTexels(scaledBuffer, width, height, rgba);
}
else if(repeat == TextureRepeat.ClampToZeroAlpha)
{
byte[] rgba = new byte[4] { 255, 255, 255, 0 };
SetBorderTexels(scaledBuffer, width, height, rgba);
}*/
/*if((_generator == null) && ((_depth == TextureDepth.Bump) && (idE.CvarSystem.GetBool("image_writeNormalTGA") == true) || (_depth != TextureDepth.Bump) && (idE.CvarSystem.GetBool("image_writeTGA") == true)))
{
idConsole.Warning("TODO: gen = null && bump && write");
// Optionally write out the texture to a .tga
/*char filename[MAX_IMAGE_NAME];
ImageProgramStringToCompressedFileName( imgName, filename );
char *ext = strrchr(filename, '.');
if ( ext ) {
strcpy( ext, ".tga" );
// swap the red/alpha for the write
/*
if ( depth == TD_BUMP ) {
for ( int i = 0; i < scaled_width * scaled_height * 4; i += 4 ) {
scaledBuffer[ i ] = scaledBuffer[ i + 3 ];
scaledBuffer[ i + 3 ] = 0;
}
}
*/
// TODO: R_WriteTGA( filename, scaledBuffer, scaled_width, scaled_height, false );
// put it back
/*
if ( depth == TD_BUMP ) {
for ( int i = 0; i < scaled_width * scaled_height * 4; i += 4 ) {
scaledBuffer[ i + 3 ] = scaledBuffer[ i ];
scaledBuffer[ i ] = 0;
}
}
*/
/*}*/
/* }*/
// swap the red and alpha for rxgb support
// do this even on tga normal maps so we only have to use
// one fragment program.
// if the image is precompressed (either in palletized mode or true rxgb mode)
// then it is loaded above and the swap never happens here.
/*if((depth == TextureDepth.Bump) && (idE.CvarSystem.GetInteger("image_useNormalCompression") != 1))
{
for(int i = 0; i < scaledWidth * scaledHeight * 4; i += 4)
{
scaledBuffer[i + 3] = scaledBuffer[i];
scaledBuffer[i] = 0;
}
}
// upload the main image level
Bind();
if(_internalFormat == Gl.GL_COLOR_INDEX8_EXT)
{
idConsole.Warning("TODO: UploadCompressedNormalMap( scaled_width, scaled_height, scaledBuffer, 0 );");
}
else
{
//Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, _internalFormat, scaledWidth, scaledHeight, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, scaledBuffer);
}
// create and upload the mip map levels, which we do in all cases, even if we don't think they are needed
/*int miplevel = 0;
// TODO: remove this if not needed
while((scaledWidth > 1) || (scaledHeight > 1))
{
// preserve the border after mip map unless repeating
scaledBuffer = MipMap(scaledBuffer, scaledWidth, scaledHeight, preserveBorder);
scaledWidth >>= 1;
scaledHeight >>= 1;
if(scaledWidth < 1)
{
scaledWidth = 1;
}
if(scaledHeight < 1)
{
scaledHeight = 1;
}
miplevel++;
// this is a visualization tool that shades each mip map
// level with a different color so you can see the
// rasterizer's texture level selection algorithm
// Changing the color doesn't help with lumminance/alpha/intensity formats...
// TODO
/*if ( depth == TD_DIFFUSE && globalImages->image_colorMipLevels.GetBool() ) {
R_BlendOverTexture( (byte *)scaledBuffer, scaled_width * scaled_height, mipBlendColors[miplevel] );
}*/
// upload the mip map
/*if(_internalFormat == Gl.GL_COLOR_INDEX8_EXT)
{
idConsole.Warning("TODO: UploadCompressedNormalMap( scaled_width, scaled_height, scaledBuffer, miplevel );");
}
else
{
//Gl.glTexImage2D(Gl.GL_TEXTURE_2D, miplevel, _internalFormat, scaledWidth, scaledHeight, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, scaledBuffer);
}
}*/
//SetImageFilterAndRepeat();
}