void D3D11Texture3D::CopyToTexture(Texture& target) { BOOST_ASSERT(type_ == target.Type()); D3D11Texture3D& other(*checked_cast<D3D11Texture3D*>(&target)); if ((this->Width(0) == target.Width(0)) && (this->Height(0) == target.Height(0)) && (this->Depth(0) == target.Depth(0)) && (this->Format() == target.Format()) && (this->NumMipMaps() == target.NumMipMaps())) { d3d_imm_ctx_->CopyResource(other.D3DTexture().get(), d3dTexture3D_.get()); } else { uint32_t const array_size = std::min(this->ArraySize(), target.ArraySize()); uint32_t const num_mips = std::min(this->NumMipMaps(), target.NumMipMaps()); for (uint32_t index = 0; index < array_size; ++ index) { for (uint32_t level = 0; level < num_mips; ++ level) { this->ResizeTexture3D(target, index, level, 0, 0, 0, target.Width(level), target.Height(level), target.Depth(level), index, level, 0, 0, 0, this->Width(level), this->Height(level), this->Depth(level), true); } } } }
void OGLESTexture3D::CopyToTexture(Texture& target) { BOOST_ASSERT(type_ == target.Type()); for (uint32_t level = 0; level < num_mip_maps_; ++ level) { this->CopyToSubTexture3D(target, 0, level, 0, 0, 0, target.Width(level), target.Height(level), target.Depth(level), 0, level, 0, 0, 0, this->Width(level), this->Height(level), this->Depth(level)); } }
void D3D12Texture3D::CopyToTexture(Texture& target) { BOOST_ASSERT(type_ == target.Type()); if ((this->Width(0) == target.Width(0)) && (this->Height(0) == target.Height(0)) && (this->Depth(0) == target.Depth(0)) && (this->Format() == target.Format()) && (this->NumMipMaps() == target.NumMipMaps())) { this->DoHWCopyToTexture(target); } else { uint32_t const array_size = std::min(this->ArraySize(), target.ArraySize()); uint32_t const num_mips = std::min(this->NumMipMaps(), target.NumMipMaps()); for (uint32_t index = 0; index < array_size; ++ index) { for (uint32_t level = 0; level < num_mips; ++ level) { this->ResizeTexture3D(target, index, level, 0, 0, 0, target.Width(level), target.Height(level), target.Depth(level), index, level, 0, 0, 0, this->Width(level), this->Height(level), this->Depth(level), true); } } } }
static bool LoadTex(char * FileName, unsigned char scdata [lmwid][lmwid][3]){ using namespace VSFileSystem; unsigned char ctemp; VSFile f; VSError err = f.OpenReadOnly( FileName, TextureFile); if (err>Ok) { return false; } Texture tex; unsigned char * data = tex.ReadImage( &f, texTransform, true); int bpp = tex.Depth(); int format = tex.Format(); unsigned char *buffer= NULL; bpp/=8; // 999 is the code for DDS file, we must decompress them. if(format == 999){ unsigned char *tmpbuffer = data + 2; TEXTUREFORMAT internformat; bpp = 1; // Make sure we are reading a DXT1 file. All backgrounds // should be DXT1 switch(tex.mode){ case ::VSImage::_DXT1: internformat = DXT1; break; default: return(false); } // we could hardware decompress, but that involves more // pollution of gl in gfx. ddsDecompress(tmpbuffer,buffer,internformat, tex.sizeY,tex.sizeX); // We are done with the DDS file data. Remove it. free(data); data = buffer; // stride and row_pointers are used for the texTransform unsigned long stride = 4 * sizeof(unsigned char); unsigned char **row_pointers = (unsigned char**)malloc(sizeof(unsigned char*)*tex.sizeY); for(unsigned int i = 0;i < tex.sizeY;++i){ row_pointers[i] = &data[i*stride*tex.sizeX]; } // texTransform demands that the first argument (bpp) be 8. So we abide int tmp = 8; int tmp2 = PNG_HAS_COLOR + PNG_HAS_ALPHA; buffer = texTransform(tmp,tmp2,tex.sizeX,tex.sizeY,row_pointers); // We're done with row_pointers, free it free(row_pointers); row_pointers = NULL; // We're done with the decompressed dds data, free it free(data); // We set data to the transformed image data data = buffer; buffer = NULL; // it's 3 because 24/8 bpp = 4; } else if (format&PNG_HAS_ALPHA) { bpp*=4; }else { bpp*=3; } if (data) { int ii; int jj; for (int i=0;i<lmwid;i++) { ii=(i*tex.sizeY)/lmwid; for (int j=0;j<lmwid;j++) { jj= (j*tex.sizeX)/lmwid; scdata[i][j][0]=data[(ii*tex.sizeX+jj)*bpp]; scdata[i][j][1]=data[(ii*tex.sizeX+jj)*bpp+1]; scdata[i][j][2]=data[(ii*tex.sizeX+jj)*bpp+2]; } } free(data); } else return false; f.Close(); return true; }