TOLTECS: Finished sprite clipping.
This commit is contained in:
parent
32d958508b
commit
c82349c1b8
1 changed files with 31 additions and 13 deletions
|
@ -271,7 +271,7 @@ void Screen::clearSprites() {
|
||||||
void Screen::addDrawRequest(const DrawRequest &drawRequest) {
|
void Screen::addDrawRequest(const DrawRequest &drawRequest) {
|
||||||
|
|
||||||
int16 scaleValueX, scaleValueY;
|
int16 scaleValueX, scaleValueY;
|
||||||
int16 spriteDraw_X, spriteDraw_Y;
|
int16 xoffs, yoffs;
|
||||||
byte *spriteData;
|
byte *spriteData;
|
||||||
int16 frameNum;
|
int16 frameNum;
|
||||||
|
|
||||||
|
@ -290,6 +290,10 @@ void Screen::addDrawRequest(const DrawRequest &drawRequest) {
|
||||||
|
|
||||||
spriteData = _vm->_res->load(drawRequest.resIndex);
|
spriteData = _vm->_res->load(drawRequest.resIndex);
|
||||||
|
|
||||||
|
if (drawRequest.flags & 0x1000) {
|
||||||
|
sprite.flags |= 4;
|
||||||
|
}
|
||||||
|
|
||||||
if (drawRequest.flags & 0x2000) {
|
if (drawRequest.flags & 0x2000) {
|
||||||
sprite.flags |= 0x10;
|
sprite.flags |= 0x10;
|
||||||
}
|
}
|
||||||
|
@ -316,12 +320,12 @@ void Screen::addDrawRequest(const DrawRequest &drawRequest) {
|
||||||
sprite.origHeight = spriteFrameEntry.h;
|
sprite.origHeight = spriteFrameEntry.h;
|
||||||
|
|
||||||
if (drawRequest.flags & 0x1000) {
|
if (drawRequest.flags & 0x1000) {
|
||||||
spriteDraw_X = spriteFrameEntry.w - spriteFrameEntry.x;
|
xoffs = spriteFrameEntry.w - spriteFrameEntry.x;
|
||||||
} else {
|
} else {
|
||||||
spriteDraw_X = spriteFrameEntry.x;
|
xoffs = spriteFrameEntry.x;
|
||||||
}
|
}
|
||||||
|
|
||||||
spriteDraw_Y = spriteFrameEntry.y;
|
yoffs = spriteFrameEntry.y;
|
||||||
|
|
||||||
// If the sprite should be scaled we need to initialize some values now
|
// If the sprite should be scaled we need to initialize some values now
|
||||||
|
|
||||||
|
@ -341,22 +345,22 @@ void Screen::addDrawRequest(const DrawRequest &drawRequest) {
|
||||||
sprite.flags |= 2;
|
sprite.flags |= 2;
|
||||||
sprite.width = sprite.origWidth + scaleValueX;
|
sprite.width = sprite.origWidth + scaleValueX;
|
||||||
sprite.height = sprite.origHeight + scaleValueY;
|
sprite.height = sprite.origHeight + scaleValueY;
|
||||||
spriteDraw_X += (spriteDraw_X * scaleValue) / 100;
|
xoffs += (xoffs * scaleValue) / 100;
|
||||||
spriteDraw_Y += (spriteDraw_Y * scaleValue) / 100;
|
yoffs += (yoffs * scaleValue) / 100;
|
||||||
} else {
|
} else {
|
||||||
sprite.flags |= 1;
|
sprite.flags |= 1;
|
||||||
sprite.width = sprite.origWidth - scaleValueX;
|
sprite.width = sprite.origWidth - scaleValueX;
|
||||||
sprite.height = sprite.origHeight - 1 - scaleValueY;
|
sprite.height = sprite.origHeight - 1 - scaleValueY;
|
||||||
if (sprite.width <= 0 || sprite.height <= 0)
|
if (sprite.width <= 0 || sprite.height <= 0)
|
||||||
return;
|
return;
|
||||||
spriteDraw_X -= (spriteDraw_X * scaleValue) / 100;
|
xoffs -= (xoffs * scaleValue) / 100;
|
||||||
spriteDraw_Y -= (spriteDraw_Y * scaleValue) / 100;
|
yoffs -= (yoffs * scaleValue) / 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sprite.x -= spriteDraw_X;
|
sprite.x -= xoffs;
|
||||||
sprite.y -= spriteDraw_Y;
|
sprite.y -= yoffs;
|
||||||
|
|
||||||
sprite.yerror = sprite.ydelta;
|
sprite.yerror = sprite.ydelta;
|
||||||
|
|
||||||
|
@ -435,7 +439,6 @@ void Screen::addDrawRequest(const DrawRequest &drawRequest) {
|
||||||
|
|
||||||
if (drawRequest.flags & 0x1000) {
|
if (drawRequest.flags & 0x1000) {
|
||||||
// Left border
|
// Left border
|
||||||
sprite.flags |= 4;
|
|
||||||
if (sprite.x - _vm->_cameraX < 0) {
|
if (sprite.x - _vm->_cameraX < 0) {
|
||||||
sprite.width -= ABS(sprite.x - _vm->_cameraX);
|
sprite.width -= ABS(sprite.x - _vm->_cameraX);
|
||||||
if (sprite.width <= 0)
|
if (sprite.width <= 0)
|
||||||
|
@ -551,6 +554,9 @@ void Screen::drawSpriteCore(byte *dest, SpriteFilter &reader, SpriteDrawItem *sp
|
||||||
byte *destp = dest;
|
byte *destp = dest;
|
||||||
int16 skipX = sprite->value1;
|
int16 skipX = sprite->value1;
|
||||||
|
|
||||||
|
int16 w = sprite->width;
|
||||||
|
int16 h = sprite->height;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
status = reader.readPacket(packet);
|
status = reader.readPacket(packet);
|
||||||
|
|
||||||
|
@ -565,6 +571,11 @@ void Screen::drawSpriteCore(byte *dest, SpriteFilter &reader, SpriteDrawItem *sp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (w - packet.count < 0)
|
||||||
|
packet.count = w;
|
||||||
|
|
||||||
|
w -= packet.count;
|
||||||
|
|
||||||
if (((sprite->flags & 0x40) && (packet.pixel != 0)) ||
|
if (((sprite->flags & 0x40) && (packet.pixel != 0)) ||
|
||||||
((sprite->flags & 0x10) && (packet.pixel != 0xFF)) ||
|
((sprite->flags & 0x10) && (packet.pixel != 0xFF)) ||
|
||||||
!(sprite->flags & 0x10) && (packet.pixel != 0))
|
!(sprite->flags & 0x10) && (packet.pixel != 0))
|
||||||
|
@ -589,13 +600,20 @@ void Screen::drawSpriteCore(byte *dest, SpriteFilter &reader, SpriteDrawItem *sp
|
||||||
dest += packet.count * destInc;
|
dest += packet.count * destInc;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status == kSrsEndOfLine) {
|
if (status == kSrsEndOfLine || w == 0) {
|
||||||
|
if (w == 0) {
|
||||||
|
while (status != kSrsEndOfLine) {
|
||||||
|
status = reader.readPacket(packet);
|
||||||
|
}
|
||||||
|
}
|
||||||
dest = destp + 640;
|
dest = destp + 640;
|
||||||
destp = dest;
|
destp = dest;
|
||||||
skipX = sprite->value1;
|
skipX = sprite->value1;
|
||||||
|
w = sprite->width;
|
||||||
|
h--;
|
||||||
}
|
}
|
||||||
|
|
||||||
} while (status != kSrsEndOfSprite);
|
} while (status != kSrsEndOfSprite && h > 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue