#ifndef _LCR_RENDERER_H #define _LCR_RENDERER_H struct LCR_Renderer { // TODO }; void LCR_drawBackground(int verticalOffset) { uint16_t color = LCR_skyImages[LCR_skyImages[256] & 0x00ff] ; // TODO int limit = verticalOffset - LCR_SETTING_SKY_SIZE * LCR_SKY_IMAGE_SIZE / 2; if (limit >= LCR_EFFECTIVE_RESOLUTION_Y) limit = LCR_EFFECTIVE_RESOLUTION_Y - 1; for (int y = 0; y <= limit; ++y) for (int x = 0; x < LCR_EFFECTIVE_RESOLUTION_X; ++x) LCR_drawPixelUnsafe(x,y,color); color = LCR_skyImages[LCR_skyImages[255 + (128 * 128) / 2] >> 8]; // TODO limit = verticalOffset + LCR_SETTING_SKY_SIZE * LCR_SKY_IMAGE_SIZE / 2 - LCR_SETTING_SKY_SIZE; if (limit < 0) limit = 0; for (int y = LCR_EFFECTIVE_RESOLUTION_Y - 1; y >= limit; --y) for (int x = 0; x < LCR_EFFECTIVE_RESOLUTION_X; ++x) LCR_drawPixelUnsafe(x,y,color); } void LCR_drawSkyStrip(int verticalOffset, uint8_t horizontalOffset) { #if LCR_SETTING_SKY_SIZE != 0 verticalOffset -= (LCR_SETTING_SKY_SIZE * LCR_SKY_IMAGE_SIZE) / 2; int finalY = verticalOffset + LCR_SETTING_SKY_SIZE * LCR_SKY_IMAGE_SIZE; finalY = (finalY / LCR_SETTING_SKY_SIZE) * LCR_SETTING_SKY_SIZE; if (finalY >= LCR_EFFECTIVE_RESOLUTION_Y) finalY = LCR_EFFECTIVE_RESOLUTION_Y - 1; const uint16_t *skyLine = LCR_skyImages + 256; if (verticalOffset < 0) { skyLine += (-1 * verticalOffset / LCR_SETTING_SKY_SIZE) * (LCR_SKY_IMAGE_SIZE / 2); verticalOffset = 0; } while (verticalOffset < finalY) { for (int i = 0; i < LCR_EFFECTIVE_RESOLUTION_X; ++i) { // TODO: check z-buffer int offsetX = (i / LCR_SETTING_SKY_SIZE + horizontalOffset) % LCR_SKY_IMAGE_SIZE; uint16_t pixel = *(skyLine + offsetX / 2); pixel = offsetX % 2 ? (pixel >> 8) : (pixel & 0x00ff); LCR_drawPixelUnsafe(i,verticalOffset,LCR_skyImages[pixel]); } verticalOffset++; if (verticalOffset % LCR_SETTING_SKY_SIZE == 0) skyLine += LCR_SKY_IMAGE_SIZE / 2; } #endif } #endif // guard