DS GX: Add color modulation

This commit is contained in:
Vicki Pfau 2017-03-03 18:37:48 -08:00
parent c29dd3c1d3
commit 9b5bda237a
3 changed files with 24 additions and 1 deletions

View File

@ -47,6 +47,16 @@ DECL_BITS(DSGXTexParams, Format, 26, 3);
DECL_BIT(DSGXTexParams, 0Transparent, 29);
DECL_BITS(DSGXTexParams, CoordTfMode, 30, 2);
DECL_BITFIELD(DSGXPolygonAttrs, uint32_t);
DECL_BIT(DSGXPolygonAttrs, Light0, 0);
DECL_BIT(DSGXPolygonAttrs, Light1, 1);
DECL_BIT(DSGXPolygonAttrs, Light2, 2);
DECL_BIT(DSGXPolygonAttrs, Light3, 3);
DECL_BITS(DSGXPolygonAttrs, Mode, 4, 2);
DECL_BIT(DSGXPolygonAttrs, FrontFace, 6);
DECL_BIT(DSGXPolygonAttrs, BackFace, 7);
// TODO
enum DSGXCommand {
DS_GX_CMD_NOP = 0,
DS_GX_CMD_MTX_MODE = 0x10,

View File

@ -20,6 +20,7 @@ struct DSGXSoftwarePolygon {
uint16_t* texBase;
uint16_t* palBase;
int texFormat;
int blendFormat;
int texW;
int texH;
};

View File

@ -109,9 +109,20 @@ static color_t _lookupColor(struct DSGXSoftwareEndpoint* ep, struct DSGXSoftware
return FLAG_UNWRITTEN;
}
uint8_t r, g, b;
unsigned wr, wg, wb;
texel = poly->palBase[texel];
_expandColor(texel, &r, &g, &b);
switch (poly->blendFormat) {
case 1:
default:
// TODO: Alpha
return _finishColor(r, g, b);
case 0:
wr = ((r + 1) * (ep->cr + 1) - 1) >> 6;
wg = ((g + 1) * (ep->cg + 1) - 1) >> 6;
wb = ((b + 1) * (ep->cb + 1) - 1) >> 6;
return _finishColor(wr, wg, wb);
}
}
static int _edgeSort(const void* a, const void* b) {
@ -285,6 +296,7 @@ static void DSGXSoftwareRendererSetRAM(struct DSGXRenderer* renderer, struct DSG
struct DSGXSoftwareEdge* edge = DSGXSoftwareEdgeListAppend(&softwareRenderer->activeEdges);
poly->poly = &polys[i];
poly->texFormat = DSGXTexParamsGetFormat(poly->poly->texParams);
poly->blendFormat = DSGXPolygonAttrsGetMode(poly->poly->polyParams);
poly->texW = 8 << DSGXTexParamsGetSSize(poly->poly->texParams);
poly->texH = 8 << DSGXTexParamsGetTSize(poly->poly->texParams);
switch (poly->texFormat) {