#include <cstdint>
#include "mempool.h"
#include "cpufrb.h"

#define SCR_WIDTH 320
#define mul320(value) (((value) << 8) + ((value) << 6))

extern int32_t ybuffer[SCR_WIDTH];

void renderTerrainHoriz(int32_t ipleftx, int32_t iplefty, int32_t idx, int32_t idy, int32_t heightConstPart, int32_t heightVarPartMul)
{
    TerData terT;
    int32_t iCoord, iCoordX, iCoordY, yscr, ybuftmp;
    uint8_t* cpuFB_ptr;
    int32_t i = 0;
    for (int32_t x = SCR_WIDTH - 1; x != -1; --x)
    {
        iCoordX = (ipleftx + 32768) >> 16;
        if (0xfffffc00 & iCoordX)
        {
            iCoordX = 0x80000000 & iCoordX ? 0 : 1023;
        }
        iCoordY = (iplefty + 32768) >> 16;
        if (0xfffffc00 & iCoordY)
        {
            iCoordY = 0x80000000 & iCoordY ? 0 : 1023;
        }
        iCoord = iCoordX + (iCoordY << 10);
        terT = poolTerTotal[iCoord];
        yscr = ((terT.total * heightVarPartMul) >> 16) + heightConstPart;
        if (yscr < 0)
        {
            yscr = 0;
        }
        ybuftmp = ybuffer[i] - yscr;
        if (ybuftmp > 0)
        {
            cpuFB_ptr = cpuFrameBuff + x + mul320(yscr);
            for (int32_t y = ybuftmp; y != 0; --y)
            {
                *cpuFB_ptr = terT.color;
                cpuFB_ptr += 320;
            }
            ybuffer[i] = yscr;
        }
        ipleftx += idx;
        iplefty += idy;
        ++i;
    }
}
