jdebroy opened this issue on Nov 10, 2006 · 27 posts
kuroyume0161 posted Wed, 22 November 2006 at 1:30 PM
That worked!! The image is a screencap from Poser 4 of the RSR created by my plugin in Cinema 4D. 8P
So, I used the RSR header/footer Byte arrays, but updated the Map offset and Data length to the PICT file size being embedded. This code uses the SDK file access, but matching to other file accesses (C++ file stream, C file pointer, etc.) should be easily determined. These are Dodger's template header/footer.
Quote -
// RSR Header (Resource Header, Reserved, and Resource Data header
UCHAR RSRHeader[304] =
{
// Resource Header (Constant - shouldn't need to be changed)
// Rsrc Data Start | Rsrc Map Start | Rsrc Data Len | Rsrc Map Len*
0x00,0x00,0x01,0x00,0x00,0x00,0x26,0x16,0x00,0x00,0x25,0x16,0x00,0x00,0x00,0x3A,
// - Reserved -
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
// Start of Resource Data
0x00,0x00,0x25,0x12,0x25,0x12,0x00,0x00,0x00,0x00,0x00,0x5B,0x00,0x5B,0x00,0x11,
0x02,0xFF,0x0C,0x00,0xFF,0xFE,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x48,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x5B,0x00,0x5B,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0A
};
// RSR Footer (Resource Map)
UCHAR RSRFooter[58] =
{
// Start of Resource Map
0x00,0x00,0x01,0x00,0x00,0x00,0x21,0xAC,0x00,0x00,0x20,0xAC,0x00,0x00,0x00,0x3A,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x32,0x00,0x00,0x50,0x49,
0x43,0x54,0x00,0x00,0x00,0x0A,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x07,0x70,0x72,0x65,0x76,0x69,0x65,0x77
};
// IPPSaver.ConvertPCTToRSR - Write to file
//---------------------------------------------------------------------------
BOOL IPPSaver::ConvertPCTToRSR()
//---------------------------------------------------------------------------
{
AutoAllocpctFile;
AutoAllocrsrFile;
if (!(pctFile && rsrFile)) return FALSE;// Open PCT thumbnail and RSR files (Must be MOTOROLA for RSR file!)
if (!(pctFile->Open(poseFilename, GE_READ, FILE_NODIALOG, GE_MOTOROLA))) return FALSE;
poseFilename.SetSuffix("rsr");
if (!(rsrFile->Open(poseFilename, GE_WRITE, FILE_NODIALOG, GE_MOTOROLA))) return FALSE;// - Skip to first 0A byte
UCHAR c;
do
{
if (!pctFile->ReadUChar(&c)) return FALSE;
} while (c != 0x0A);
LONG datasize = pctFile->GetLength()-pctFile->GetPosition();
// Resource Map Offset (from start of file)
LONG offset = datasize+304;
// Resource Data Length = Resource Map Start-256
LONG length = offset-256;
// Resource Map Offset
RSRHeader[4] = (offset & 0xFF000000L) >> 24;
RSRHeader[5] = (offset & 0x00FF0000L) >> 16;
RSRHeader[6] = (offset & 0x0000FF00L) >> 8;
RSRHeader[7] = (offset & 0x000000FFL);
// Resource Data Length
RSRHeader[8] = (length & 0xFF000000L) >> 24;
RSRHeader[9] = (length & 0x00FF0000L) >> 16;
RSRHeader[10] = (length & 0x0000FF00L) >> 8;
RSRHeader[11] = (length & 0x000000FFL);
// Copy of Resource Header in Resource Map
// - Resource Map Offset
RSRFooter[4] = RSRHeader[4];
RSRFooter[5] = RSRHeader[5];
RSRFooter[6] = RSRHeader[6];
RSRFooter[7] = RSRHeader[7];
// - Resource Data Length
RSRFooter[8] = RSRHeader[8];
RSRFooter[9] = RSRHeader[9];
RSRFooter[10] = RSRHeader[10];
RSRFooter[11] = RSRHeader[11];// Write RSR Header
if (!rsrFile->WriteBytes(&RSRHeader[0], 304)) return FALSE;
// Copy PICT data to RSR file
// - Write PCT data to RSR file
for (LONG size = 1024; datasize; datasize -= size)
{
if (size > datasize) size = datasize;
size = pctFile->ReadBytes(&strBuf[0], size, FALSE);
if (!size) return FALSE;
if (!rsrFile->WriteBytes(&strBuf[0], size)) return FALSE;
}
// Write RSR Footer
if (!rsrFile->WriteBytes(&RSRFooter[0], 58)) return FALSE;// Close PCT and RSR files
rsrFile->Close();
pctFile->Close();
return TRUE;
}
Thank you all!
Robert
C makes it easy to shoot yourself in the
foot. C++ makes it harder, but when you do, you blow your whole leg
off.
-- Bjarne
Stroustrup
Contact Me | Kuroyume's DevelopmentZone