EXTRA BG MAKER:Does anyone have this tool for Downlod?

Discussion in 'Sega Dreamcast Development and Research' started by psobb2009, Aug 4, 2019.

  1. psobb2009

    psobb2009 Rising Member

    Joined:
    Sep 6, 2016
    Messages:
    64
    Likes Received:
    80
    Does anyone have this tool for Downlod?

    EXTRA BG MAKER
    Permite que você altere a imagem bacground do menu de inicialização DC de uma textura PVR ou uma imagem PNG / GIF / JPEG como desejar. Observe que, para uma imagem PNG / GIF / JPEG, seu tamanho deve ser um desses:
    - 16x16
    - 32 x 32
    - 64 x 64
    - 128 x 128
    A melhor qualidade / taxa de tamanho é obtida com uma imagem 64x64.

    [​IMG]

    [​IMG]
     
    Last edited: Aug 4, 2019
  2. TerdFerguson

    TerdFerguson ls ~/

    Joined:
    Apr 27, 2015
    Messages:
    732
    Likes Received:
    435
  3. psobb2009

    psobb2009 Rising Member

    Joined:
    Sep 6, 2016
    Messages:
    64
    Likes Received:
    80
    Last edited: Aug 4, 2019
  4. Dreamcast

    Dreamcast Intrepid Member

    Joined:
    Jul 17, 2007
    Messages:
    649
    Likes Received:
    113
    This is easy to do yourself if you're able to write some code. There are two parts:

    1) Create a RGB565 rectangular PVR
    2) Create a VMI / VMS pair with PVR file (with GBIX header) embedded in the VMS

    Creating the PVR is super easy. Here is some C code I put together. You just need to feed it an array of RGB888 data (8-bits per pixel)

    Code:
    /* Simple RGB888 -> PVR RGB565 (RECTANGLE) | <BR> 2019 */
    
    enum ImgDimension {
    
       DIM_16X16 = 0x10,
       DIM_32X32 = 0x20,
       DIM_64X64 = 0x40,
       DIM_128X128 = 0x80
    };
    
    void RGB888ToRGB565(enum ImgDimension eImgDimension, uint8_t *pRGB888, uint8_t **pRGB565, int *nRGB565Size) {
    
       uint8_t GBIX_HEADER[] = {'G', 'B', 'I', 'X', 0x08, 0x00, 0x00, 0x00, 0x9A, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
       uint8_t PVRT_HEADER[] = {'P', 'V', 'R', 'T', 0x00, 0x00, 0x00, 0x00, 0x01, 0x09, 0x00, 0x00, eImgDimension, 0x00, eImgDimension, 0x00};
    
       uint32_t nHdrSz = (sizeof(GBIX_HEADER) + sizeof(PVRT_HEADER));
       
       uint32_t nImgSz = (2 * (eImgDimension * eImgDimension));
    
       uint32_t nTmpSz = (nHdrSz + nImgSz);
       
       uint8_t *pTmp = malloc(nTmpSz);
    
       uint8_t *p = pTmp;
           
       int i;
       
       // set the size of the image data
       
       PVRT_HEADER[4] = (nImgSz & 0xFF);
       PVRT_HEADER[5] = ((nImgSz >> 0x08) & 0xFF);
       PVRT_HEADER[6] = ((nImgSz >> 0x10) & 0xFF);
       PVRT_HEADER[7] = ((nImgSz >> 0x18) & 0xFF);
           
       // copy the GBIX header
       
       memmove(p, GBIX_HEADER, sizeof(GBIX_HEADER));
    
       p += sizeof(GBIX_HEADER);
       
       // copy the PVRT header
    
       memmove(p, PVRT_HEADER, sizeof(PVRT_HEADER));
       
       p += sizeof(PVRT_HEADER);
       
       // do the conversion
       
       for(i = 0; i < (eImgDimension * eImgDimension); i++) {
               
           uint16_t nR = (((*pRGB888++ >> 3) & 0x1F) << 11);  
           uint16_t nG = (((*pRGB888++ >> 2) & 0x3F) << 5);
           uint16_t nB = ((*pRGB888++ >> 3) & 0x1F);
       
           uint16_t nRGB565 = (nR | nG | nB);
           
           *p++ = (nRGB565 & 0xFF);
           *p++ = ((nRGB565 >> 8) & 0xFF);
       }
       
       *nRGB565Size = nTmpSz;
    
       *pRGB565 = pTmp;   
    }
    The PVR created above can then be swapped out with the PVR data from a VMS that's already a BG replacement file. Be sure to recalculate the checksum and pad accordingly to 512 bytes so the block sizes are correct.
     
    MastaG, darcagn, LuizNai and 2 others like this.
  5. psobb2009

    psobb2009 Rising Member

    Joined:
    Sep 6, 2016
    Messages:
    64
    Likes Received:
    80
    Too complex for me!
     

Share This Page