mirror of
https://github.com/aap/librw.git
synced 2025-02-16 17:26:18 +00:00
added palette support
This commit is contained in:
parent
926b0a639a
commit
ee96da332f
@ -369,14 +369,18 @@ makeNativeRaster(Raster *raster)
|
|||||||
D3dRaster *ras = PLUGINOFFSET(D3dRaster, raster, nativeRasterOffset);
|
D3dRaster *ras = PLUGINOFFSET(D3dRaster, raster, nativeRasterOffset);
|
||||||
if(raster->flags & 0x80)
|
if(raster->flags & 0x80)
|
||||||
return;
|
return;
|
||||||
uint32 format = formatMap[(raster->format >> 8) & 0xF];
|
uint32 format;
|
||||||
|
if(raster->format & (Raster::PAL4 | Raster::PAL8)){
|
||||||
|
format = D3DFMT_P8;
|
||||||
|
ras->palette = new uint8[4*256];
|
||||||
|
}else
|
||||||
|
format = formatMap[(raster->format >> 8) & 0xF];
|
||||||
ras->format = 0;
|
ras->format = 0;
|
||||||
ras->hasAlpha = alphaMap[(raster->format >> 8) & 0xF];
|
ras->hasAlpha = alphaMap[(raster->format >> 8) & 0xF];
|
||||||
int32 levels = Raster::calculateNumLevels(raster->width, raster->height);
|
int32 levels = Raster::calculateNumLevels(raster->width, raster->height);
|
||||||
ras->texture = createTexture(raster->width, raster->width,
|
ras->texture = createTexture(raster->width, raster->width,
|
||||||
raster->format & Raster::MIPMAP ? levels : 1,
|
raster->format & Raster::MIPMAP ? levels : 1,
|
||||||
format);
|
format);
|
||||||
assert((raster->flags & (Raster::PAL4 | Raster::PAL8)) == 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8*
|
uint8*
|
||||||
|
18
src/d3d8.cpp
18
src/d3d8.cpp
@ -424,11 +424,16 @@ readNativeTexture(Stream *stream)
|
|||||||
raster->flags &= ~0x80;
|
raster->flags &= ~0x80;
|
||||||
}else
|
}else
|
||||||
raster = new Raster(width, height, depth, format | type, PLATFORM_D3D8);
|
raster = new Raster(width, height, depth, format | type, PLATFORM_D3D8);
|
||||||
|
|
||||||
|
ras = PLUGINOFFSET(D3dRaster, raster, nativeRasterOffset);
|
||||||
tex->raster = raster;
|
tex->raster = raster;
|
||||||
|
|
||||||
// TODO: check if format supported and convert if necessary
|
// TODO: check if format supported and convert if necessary
|
||||||
if(raster->format & (Raster::PAL4 | Raster::PAL8))
|
|
||||||
assert(0 && "don't support palettes");
|
if(raster->format & Raster::PAL4)
|
||||||
|
stream->read(ras->palette, 4*32);
|
||||||
|
else if(raster->format & Raster::PAL8)
|
||||||
|
stream->read(ras->palette, 4*256);
|
||||||
|
|
||||||
uint32 size;
|
uint32 size;
|
||||||
uint8 *data;
|
uint8 *data;
|
||||||
@ -491,6 +496,11 @@ writeNativeTexture(Texture *tex, Stream *stream)
|
|||||||
}
|
}
|
||||||
stream->writeU8(compression);
|
stream->writeU8(compression);
|
||||||
|
|
||||||
|
if(raster->format & Raster::PAL4)
|
||||||
|
stream->write(ras->palette, 4*32);
|
||||||
|
else if(raster->format & Raster::PAL8)
|
||||||
|
stream->write(ras->palette, 4*256);
|
||||||
|
|
||||||
uint32 size;
|
uint32 size;
|
||||||
uint8 *data;
|
uint8 *data;
|
||||||
for(int32 i = 0; i < numLevels; i++){
|
for(int32 i = 0; i < numLevels; i++){
|
||||||
@ -508,6 +518,10 @@ getSizeNativeTexture(Texture *tex)
|
|||||||
{
|
{
|
||||||
uint32 size = 12 + 72 + 16;
|
uint32 size = 12 + 72 + 16;
|
||||||
int32 levels = tex->raster->getNumLevels();
|
int32 levels = tex->raster->getNumLevels();
|
||||||
|
if(tex->raster->format & Raster::PAL4)
|
||||||
|
size += 4*32;
|
||||||
|
else if(tex->raster->format & Raster::PAL8)
|
||||||
|
size += 4*256;
|
||||||
for(int32 i = 0; i < levels; i++)
|
for(int32 i = 0; i < levels; i++)
|
||||||
size += 4 + getLevelSize(tex->raster, i);
|
size += 4 + getLevelSize(tex->raster, i);
|
||||||
size += 12 + tex->streamGetPluginSize();
|
size += 12 + tex->streamGetPluginSize();
|
||||||
|
@ -208,10 +208,19 @@ Texture::streamGetSize(void)
|
|||||||
Texture*
|
Texture*
|
||||||
Texture::streamReadNative(Stream *stream)
|
Texture::streamReadNative(Stream *stream)
|
||||||
{
|
{
|
||||||
if(rw::platform == PLATFORM_D3D8)
|
assert(findChunk(stream, ID_STRUCT, NULL, NULL));
|
||||||
|
uint32 platform = stream->readU32();
|
||||||
|
stream->seek(-16);
|
||||||
|
if(platform == PLATFORM_D3D8)
|
||||||
return d3d8::readNativeTexture(stream);
|
return d3d8::readNativeTexture(stream);
|
||||||
if(rw::platform == PLATFORM_XBOX)
|
if(platform == PLATFORM_XBOX)
|
||||||
return xbox::readNativeTexture(stream);
|
return xbox::readNativeTexture(stream);
|
||||||
|
|
||||||
|
// if(rw::platform == PLATFORM_D3D8)
|
||||||
|
// return d3d8::readNativeTexture(stream);
|
||||||
|
// if(rw::platform == PLATFORM_XBOX)
|
||||||
|
// return xbox::readNativeTexture(stream);
|
||||||
|
|
||||||
assert(0 && "unsupported platform");
|
assert(0 && "unsupported platform");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -533,12 +542,12 @@ Raster::Raster(int32 width, int32 height, int32 depth, int32 format, int32 platf
|
|||||||
this->height = height;
|
this->height = height;
|
||||||
this->depth = depth;
|
this->depth = depth;
|
||||||
this->texels = this->palette = NULL;
|
this->texels = this->palette = NULL;
|
||||||
|
this->constructPlugins();
|
||||||
if(this->platform == PLATFORM_D3D8 ||
|
if(this->platform == PLATFORM_D3D8 ||
|
||||||
this->platform == PLATFORM_D3D9)
|
this->platform == PLATFORM_D3D9)
|
||||||
d3d::makeNativeRaster(this);
|
d3d::makeNativeRaster(this);
|
||||||
if(this->platform == PLATFORM_XBOX)
|
if(this->platform == PLATFORM_XBOX)
|
||||||
xbox::makeNativeRaster(this);
|
xbox::makeNativeRaster(this);
|
||||||
this->constructPlugins();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Raster::~Raster(void)
|
Raster::~Raster(void)
|
||||||
|
@ -429,7 +429,7 @@ private:
|
|||||||
void frameListStreamWrite(Stream *stream, Frame **flp, int32 nf);
|
void frameListStreamWrite(Stream *stream, Frame **flp, int32 nf);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TexDictionary : PluginBase<Texture>
|
struct TexDictionary : PluginBase<TexDictionary>
|
||||||
{
|
{
|
||||||
Texture *first;
|
Texture *first;
|
||||||
|
|
||||||
|
24
src/xbox.cpp
24
src/xbox.cpp
@ -873,14 +873,18 @@ makeNativeRaster(Raster *raster)
|
|||||||
XboxRaster *ras = PLUGINOFFSET(XboxRaster, raster, nativeRasterOffset);
|
XboxRaster *ras = PLUGINOFFSET(XboxRaster, raster, nativeRasterOffset);
|
||||||
if(raster->flags & 0x80)
|
if(raster->flags & 0x80)
|
||||||
return;
|
return;
|
||||||
uint32 format = formatMap[(raster->format >> 8) & 0xF];
|
uint32 format;
|
||||||
|
if(raster->format & (Raster::PAL4 | Raster::PAL8)){
|
||||||
|
format = D3DFMT_P8;
|
||||||
|
ras->palette = new uint8[4*256];
|
||||||
|
}else
|
||||||
|
format = formatMap[(raster->format >> 8) & 0xF];
|
||||||
ras->format = 0;
|
ras->format = 0;
|
||||||
ras->hasAlpha = alphaMap[(raster->format >> 8) & 0xF];
|
ras->hasAlpha = alphaMap[(raster->format >> 8) & 0xF];
|
||||||
int32 levels = Raster::calculateNumLevels(raster->width, raster->height);
|
int32 levels = Raster::calculateNumLevels(raster->width, raster->height);
|
||||||
ras->texture = createTexture(raster->width, raster->width,
|
ras->texture = createTexture(raster->width, raster->width,
|
||||||
raster->format & Raster::MIPMAP ? levels : 1,
|
raster->format & Raster::MIPMAP ? levels : 1,
|
||||||
format);
|
format);
|
||||||
assert((raster->flags & (Raster::PAL4 | Raster::PAL8)) == 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8*
|
uint8*
|
||||||
@ -951,10 +955,13 @@ readNativeTexture(Stream *stream)
|
|||||||
raster->flags &= ~0x80;
|
raster->flags &= ~0x80;
|
||||||
}else
|
}else
|
||||||
raster = new Raster(width, height, depth, format | type, PLATFORM_XBOX);
|
raster = new Raster(width, height, depth, format | type, PLATFORM_XBOX);
|
||||||
|
XboxRaster *ras = PLUGINOFFSET(XboxRaster, raster, nativeRasterOffset);
|
||||||
tex->raster = raster;
|
tex->raster = raster;
|
||||||
|
|
||||||
if(raster->format & (Raster::PAL4 | Raster::PAL8))
|
if(raster->format & Raster::PAL4)
|
||||||
assert(0 && "don't support palettes");
|
stream->read(ras->palette, 4*32);
|
||||||
|
else if(raster->format & Raster::PAL8)
|
||||||
|
stream->read(ras->palette, 4*256);
|
||||||
|
|
||||||
// exploit the fact that mipmaps are allocated consecutively
|
// exploit the fact that mipmaps are allocated consecutively
|
||||||
uint8 *data = raster->lock(0);
|
uint8 *data = raster->lock(0);
|
||||||
@ -999,6 +1006,11 @@ writeNativeTexture(Texture *tex, Stream *stream)
|
|||||||
totalSize = (totalSize+3)&~3;
|
totalSize = (totalSize+3)&~3;
|
||||||
stream->writeI32(totalSize);
|
stream->writeI32(totalSize);
|
||||||
|
|
||||||
|
if(raster->format & Raster::PAL4)
|
||||||
|
stream->write(ras->palette, 4*32);
|
||||||
|
else if(raster->format & Raster::PAL8)
|
||||||
|
stream->write(ras->palette, 4*256);
|
||||||
|
|
||||||
// exploit the fact that mipmaps are allocated consecutively
|
// exploit the fact that mipmaps are allocated consecutively
|
||||||
uint8 *data = raster->lock(0);
|
uint8 *data = raster->lock(0);
|
||||||
stream->write(data, totalSize);
|
stream->write(data, totalSize);
|
||||||
@ -1015,6 +1027,10 @@ getSizeNativeTexture(Texture *tex)
|
|||||||
for(int32 i = 0; i < levels; i++)
|
for(int32 i = 0; i < levels; i++)
|
||||||
size += getLevelSize(tex->raster, i);
|
size += getLevelSize(tex->raster, i);
|
||||||
size = (size+3)&~3;
|
size = (size+3)&~3;
|
||||||
|
if(tex->raster->format & Raster::PAL4)
|
||||||
|
size += 4*32;
|
||||||
|
else if(tex->raster->format & Raster::PAL8)
|
||||||
|
size += 4*256;
|
||||||
size += 12 + tex->streamGetPluginSize();
|
size += 12 + tex->streamGetPluginSize();
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
@ -188,7 +188,7 @@ initrw(void)
|
|||||||
rw::platform = rw::PLATFORM_D3D8;
|
rw::platform = rw::PLATFORM_D3D8;
|
||||||
rw::d3d::device = Device;
|
rw::d3d::device = Device;
|
||||||
|
|
||||||
if(0){
|
if(1){
|
||||||
char *filename = "D:\\rockstargames\\pc\\gtavc\\models\\gta3_archive\\admiral.txd";
|
char *filename = "D:\\rockstargames\\pc\\gtavc\\models\\gta3_archive\\admiral.txd";
|
||||||
rw::StreamFile in;
|
rw::StreamFile in;
|
||||||
if(in.open(filename, "rb") == NULL){
|
if(in.open(filename, "rb") == NULL){
|
||||||
@ -209,6 +209,7 @@ initrw(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char *filename = "D:\\rockstargames\\pc\\gtavc\\models\\gta3_archive\\admiral.dff";
|
char *filename = "D:\\rockstargames\\pc\\gtavc\\models\\gta3_archive\\admiral.dff";
|
||||||
|
// char *filename = "D:\\rockstargames\\pc\\gta3\\models\\gta3_archive\\kuruma.dff";
|
||||||
// char *filename = "D:\\rockstargames\\pc\\gtavc\\models\\gta3_archive\\player.dff";
|
// char *filename = "D:\\rockstargames\\pc\\gtavc\\models\\gta3_archive\\player.dff";
|
||||||
// char *filename = "D:\\rockstargames\\pc\\gtavc\\models\\gta3_archive\\od_newscafe_dy.dff";
|
// char *filename = "D:\\rockstargames\\pc\\gtavc\\models\\gta3_archive\\od_newscafe_dy.dff";
|
||||||
// char *filename = "D:\\rockstargames\\pc\\gtasa\\models\\gta3_archive\\admiral.dff";
|
// char *filename = "D:\\rockstargames\\pc\\gtasa\\models\\gta3_archive\\admiral.dff";
|
||||||
|
@ -14,18 +14,19 @@ int
|
|||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
gta::attachPlugins();
|
gta::attachPlugins();
|
||||||
|
rw::ps2::registerNativeRaster();
|
||||||
rw::xbox::registerNativeRaster();
|
rw::xbox::registerNativeRaster();
|
||||||
rw::d3d::registerNativeRaster();
|
rw::d3d::registerNativeRaster();
|
||||||
|
|
||||||
// rw::version = 0x33002;
|
// rw::version = 0x33002;
|
||||||
// rw::platform = rw::PLATFORM_PS2;
|
// rw::platform = rw::PLATFORM_PS2;
|
||||||
// rw::platform = rw::PLATFORM_OGL;
|
// rw::platform = rw::PLATFORM_OGL;
|
||||||
rw::platform = rw::PLATFORM_XBOX;
|
// rw::platform = rw::PLATFORM_XBOX;
|
||||||
// rw::platform = rw::PLATFORM_D3D8;
|
// rw::platform = rw::PLATFORM_D3D8;
|
||||||
// rw::platform = rw::PLATFORM_D3D9;
|
// rw::platform = rw::PLATFORM_D3D9;
|
||||||
|
|
||||||
if(argc < 2){
|
if(argc < 2){
|
||||||
printf("usage: %s in.txd\n", argv[0]);
|
printf("usage (%d): %s in.txd\n", rw::platform, argv[0]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user