Optimize sprites even more
This commit is contained in:
parent
d54399f7a3
commit
86fc9d3dda
2 changed files with 16 additions and 7 deletions
|
@ -756,9 +756,12 @@ void draw()
|
||||||
PixelInfo pos = mapToScreen(sprites[i].mPosition,sprites[i].mHeight,player.mCamera);
|
PixelInfo pos = mapToScreen(sprites[i].mPosition,sprites[i].mHeight,player.mCamera);
|
||||||
|
|
||||||
if (pos.depth > 0)
|
if (pos.depth > 0)
|
||||||
drawSprite(sprites[i].mImage,pos.position.x * SUBSAMPLE,pos.position.y,
|
drawSpriteSquare(sprites[i].mImage,pos.position.x * SUBSAMPLE,
|
||||||
pos.depth,perspectiveScale(sprites[i].mPixelSize,pos.depth));
|
pos.position.y, pos.depth,
|
||||||
|
perspectiveScale(sprites[i].mPixelSize,pos.depth));
|
||||||
|
|
||||||
|
/* trick: sort the sprites by distance with bubble sort as we draw - the
|
||||||
|
order will be correct in a few frames */
|
||||||
if (i != 0 && pos.depth > previousDepth)
|
if (i != 0 && pos.depth > previousDepth)
|
||||||
{
|
{
|
||||||
Sprite tmp = sprites[i];
|
Sprite tmp = sprites[i];
|
||||||
|
@ -791,7 +794,6 @@ int main()
|
||||||
initGeneral();
|
initGeneral();
|
||||||
|
|
||||||
player.setPositionSquare(6,4);
|
player.setPositionSquare(6,4);
|
||||||
player.setPosition(7119,14343,5120,566);
|
|
||||||
|
|
||||||
sprites[0] = Sprite(sprite1,10,5,1,100);
|
sprites[0] = Sprite(sprite1,10,5,1,100);
|
||||||
sprites[1] = Sprite(sprite1,14,5,1,100);
|
sprites[1] = Sprite(sprite1,14,5,1,100);
|
||||||
|
|
15
general.hpp
15
general.hpp
|
@ -177,9 +177,14 @@ inline uint8_t sampleImage(const unsigned char *image, Unit x, Unit y)
|
||||||
return image[2 + index];
|
return image[2 + index];
|
||||||
}
|
}
|
||||||
|
|
||||||
void inline drawSprite(const unsigned char *sprite, int16_t x, int16_t y, Unit depth, int16_t size)
|
/**
|
||||||
|
Draws a scaled sprite on screen in an optimized way. The sprite has to be
|
||||||
|
square in resolution.
|
||||||
|
*/
|
||||||
|
void inline drawSpriteSquare(const unsigned char *sprite, int16_t x, int16_t y, Unit depth, int16_t size)
|
||||||
{
|
{
|
||||||
if (size < 0 || size > 200) // let's not mess up with the incoming array
|
if (size < 0 || size > 200 || // let's not mess up with the incoming array
|
||||||
|
sprite[0] != sprite[1]) // only draw square sprites
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int16_t samplingIndices[size];
|
int16_t samplingIndices[size];
|
||||||
|
@ -187,7 +192,7 @@ void inline drawSprite(const unsigned char *sprite, int16_t x, int16_t y, Unit d
|
||||||
// optimization: precompute the indices
|
// optimization: precompute the indices
|
||||||
|
|
||||||
for (Unit i = 0; i < size; ++i)
|
for (Unit i = 0; i < size; ++i)
|
||||||
samplingIndices[i] = (i * UNITS_PER_SQUARE) / size;
|
samplingIndices[i] = (i * sprite[0]) / size;
|
||||||
|
|
||||||
x -= size / 2;
|
x -= size / 2;
|
||||||
y -= size / 2;
|
y -= size / 2;
|
||||||
|
@ -206,9 +211,11 @@ void inline drawSprite(const unsigned char *sprite, int16_t x, int16_t y, Unit d
|
||||||
if (zBuffer[xPos / SUBSAMPLE] <= depth)
|
if (zBuffer[xPos / SUBSAMPLE] <= depth)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
int16_t columnLocation = 2 + samplingIndices[i] * sprite[0];
|
||||||
|
|
||||||
for (Unit j = max(-1 * y,0); j < jTo; ++j)
|
for (Unit j = max(-1 * y,0); j < jTo; ++j)
|
||||||
{
|
{
|
||||||
c = sampleImage(sprite,samplingIndices[i],samplingIndices[j]);
|
c = sprite[columnLocation + samplingIndices[j]];
|
||||||
|
|
||||||
if (c != TRANSPARENT_COLOR)
|
if (c != TRANSPARENT_COLOR)
|
||||||
pokitto.display.drawPixel(xPos,y + j,c);
|
pokitto.display.drawPixel(xPos,y + j,c);
|
||||||
|
|
Loading…
Reference in a new issue