mirror of https://github.com/mgba-emu/mgba.git
DS GX: Add color modulation
This commit is contained in:
parent
c29dd3c1d3
commit
9b5bda237a
|
@ -47,6 +47,16 @@ DECL_BITS(DSGXTexParams, Format, 26, 3);
|
||||||
DECL_BIT(DSGXTexParams, 0Transparent, 29);
|
DECL_BIT(DSGXTexParams, 0Transparent, 29);
|
||||||
DECL_BITS(DSGXTexParams, CoordTfMode, 30, 2);
|
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 {
|
enum DSGXCommand {
|
||||||
DS_GX_CMD_NOP = 0,
|
DS_GX_CMD_NOP = 0,
|
||||||
DS_GX_CMD_MTX_MODE = 0x10,
|
DS_GX_CMD_MTX_MODE = 0x10,
|
||||||
|
|
|
@ -20,6 +20,7 @@ struct DSGXSoftwarePolygon {
|
||||||
uint16_t* texBase;
|
uint16_t* texBase;
|
||||||
uint16_t* palBase;
|
uint16_t* palBase;
|
||||||
int texFormat;
|
int texFormat;
|
||||||
|
int blendFormat;
|
||||||
int texW;
|
int texW;
|
||||||
int texH;
|
int texH;
|
||||||
};
|
};
|
||||||
|
|
|
@ -109,9 +109,20 @@ static color_t _lookupColor(struct DSGXSoftwareEndpoint* ep, struct DSGXSoftware
|
||||||
return FLAG_UNWRITTEN;
|
return FLAG_UNWRITTEN;
|
||||||
}
|
}
|
||||||
uint8_t r, g, b;
|
uint8_t r, g, b;
|
||||||
|
unsigned wr, wg, wb;
|
||||||
texel = poly->palBase[texel];
|
texel = poly->palBase[texel];
|
||||||
_expandColor(texel, &r, &g, &b);
|
_expandColor(texel, &r, &g, &b);
|
||||||
|
switch (poly->blendFormat) {
|
||||||
|
case 1:
|
||||||
|
default:
|
||||||
|
// TODO: Alpha
|
||||||
return _finishColor(r, g, b);
|
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) {
|
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);
|
struct DSGXSoftwareEdge* edge = DSGXSoftwareEdgeListAppend(&softwareRenderer->activeEdges);
|
||||||
poly->poly = &polys[i];
|
poly->poly = &polys[i];
|
||||||
poly->texFormat = DSGXTexParamsGetFormat(poly->poly->texParams);
|
poly->texFormat = DSGXTexParamsGetFormat(poly->poly->texParams);
|
||||||
|
poly->blendFormat = DSGXPolygonAttrsGetMode(poly->poly->polyParams);
|
||||||
poly->texW = 8 << DSGXTexParamsGetSSize(poly->poly->texParams);
|
poly->texW = 8 << DSGXTexParamsGetSSize(poly->poly->texParams);
|
||||||
poly->texH = 8 << DSGXTexParamsGetTSize(poly->poly->texParams);
|
poly->texH = 8 << DSGXTexParamsGetTSize(poly->poly->texParams);
|
||||||
switch (poly->texFormat) {
|
switch (poly->texFormat) {
|
||||||
|
|
Loading…
Reference in New Issue