Register    Login    Forum    Search    FAQ

Board index » Everything




Post new topic Reply to topic  [ 1 post ] 
Author Message
 Post subject: Sharing resources
 Post Posted: January 20th, 2016, 6:23 pm 
 

Joined: November 30th, 2013, 7:40 pm
Posts: 562
Location: Merville, British Columbia Canada
Well . textures are annoying to me (too many in the folders) so I came up with a sprite sheet for DX11. I thought i'd share it wilh anyone who wants to do sprite sheets.
This uses DirectXTex lib, so you must link that into your project. Can be found on GitHub
This function loads a sprite sheet of the .jpg format. I am currently working on handling other file formats
Code:
bool SpriteSheet::LoadSpriteSheet(string filename)
{
   
   
   if (!DXStringHandler::DXDoesFileExist(filename))
      return false;

   HRESULT result;
   wstring fName;
   DXStringHandler::DXConvertFromStrToWStr(filename, fName);

   // Load the texture in.
   TexMetadata imageMetadata;

   ScratchImage* pScratchImage = new ScratchImage();

   result = LoadFromWICFile((WCHAR*)fName.data(), WIC_FLAGS_NONE, &imageMetadata, *pScratchImage);
   if (FAILED(result))
   {
      return false;
   }
   D3D11_TEXTURE2D_DESC textureDesc;
   HRESULT hResult;
   unsigned int rowPitch;
   D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;



   // Setup the description of the texture.
   //m_clipWidth and m_clipHeight set during initialization of class
   textureDesc.Height = m_clipHeight;
   textureDesc.Width = m_clipWidth;
   textureDesc.MipLevels = 0;
   textureDesc.ArraySize = 1;
   textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
   textureDesc.SampleDesc.Count = 1;
   textureDesc.SampleDesc.Quality = 0;
   textureDesc.Usage = D3D11_USAGE_DEFAULT;
   textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
   textureDesc.CPUAccessFlags = 0;
   textureDesc.MiscFlags = D3D11_RESOURCE_MISC_GENERATE_MIPS;
   
   // get how many images will be extracted from source
   size_t rows = imageMetadata.height / m_clipHeight;
   size_t cols = imageMetadata.width / m_clipWidth;
   
   // std::vector of ID3D11ShaderResourceView
   m_textures.resize(rows * cols);
   // pointer to hold read data
   uint8_t* destDataPtr = 0;
   // main sprite sheet raw data
   uint8_t* srcDataPtr = pScratchImage->GetPixels();
   // used to create a texture
   ID3D11Texture2D* m_Tex;
   
   int width = m_clipWidth;
   int height = m_clipHeight;
   // size of destDataPtr array
   size_t size = width * height * 4;
   // index of ID3D11_srv
   int texCount;
   
   //counters
   int i, j, srcIndex, index;
   index = 0;
   srcIndex = 0;
   for (int y = 0; y < rows; y++)
   {
      for (int x = 0; x < cols; x++)
      {
         // reset destDataPtr index
         index = 0;
         // new array to hold data
         destDataPtr = new uint8_t[size];
         // index for texture container
         texCount = y * cols + x;

         for (j = y * height; j < (y * height) + height; j++)
         {
            for (i = x * width; i <(x * width) + width; i++)
            {
               // where in the source data are we
               srcIndex = (j * (width * cols)  + i) * 4;
               //** NOTE *** some data files (.TGA ect) reads in upside down
               // from bottom to top, this is top to bottom
               destDataPtr[index + 0] = srcDataPtr[srcIndex + 0];  // Red.
               destDataPtr[index + 1] = srcDataPtr[srcIndex + 1];  // Green.
               destDataPtr[index + 2] = srcDataPtr[srcIndex + 2];  // Blue
               destDataPtr[index + 3] = srcDataPtr[srcIndex + 3];  // Alpha
               // index to next set of 4
               index += 4;
            }

         }
         
         // create the new texture to hold data
         m_Tex = nullptr;
         result = m_pDevice->CreateTexture2D(&textureDesc, NULL, &m_Tex);
         if (FAILED(result))
         {
                 delete pScratchImage;
                 delete destDataPtr;            
                 return false;
         }
         // set pitch of row
         rowPitch = (width * 4) * sizeof(unsigned char);

         // Copy the image data into the texture.
         m_pContext->UpdateSubresource(m_Tex, 0, NULL, destDataPtr, rowPitch, 0);
         // release memory
         delete[] destDataPtr;
         // Setup the shader resource view description.
         srvDesc.Format = textureDesc.Format;
         srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
         srvDesc.Texture2D.MostDetailedMip = 0;
         srvDesc.Texture2D.MipLevels = -1;

         // Create the shader resource view for the texture.
         result = m_pDevice->CreateShaderResourceView(m_Tex, &srvDesc, &m_textures[texCount]);
         if (FAILED(result))
         {
            delete pScratchImage;
            return false;
         }
         m_pContext->GenerateMips(m_textures[texCount]);
         if(m_Tex)
           m_Tex->Release();

      }
   }
    // clean up   
   delete pScratchImage;
   
   return true;
};

_________________
Curiosity killed the cat, satisfaction brought him back


Top 
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
 
Post new topic Reply to topic  [ 1 post ] 

Board index » Everything


 
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
cron