simplified draw functions

This commit is contained in:
Bigfoot71 2026-03-18 03:11:10 +01:00
parent f9dc728e46
commit 1117b130c7

126
src/external/rlsw.h vendored
View File

@ -4769,61 +4769,29 @@ void swDrawArrays(SWdraw mode, int offset, int count)
sw_immediate_begin(mode); sw_immediate_begin(mode);
{ {
const float *texMatrix = RLSW.stackTexture[RLSW.stackTextureCounter - 1];
const float *defaultTexcoord = RLSW.primitive.texcoord;
const float *defaultColor = RLSW.primitive.color;
const float *positions = RLSW.array.positions; const float *positions = RLSW.array.positions;
const float *texcoords = RLSW.array.texcoords; const float *texcoords = RLSW.array.texcoords;
const uint8_t *colors = RLSW.array.colors; const uint8_t *colors = RLSW.array.colors;
int end = offset + count; int end = offset + count;
for (int i = offset; i < end; i++) for (int i = offset; i < end; i++)
{ {
float u, v; if (texcoords) sw_immediate_set_texcoord(&texcoords[2*i]);
if (texcoords)
{
int idx = 2*i;
u = texcoords[idx];
v = texcoords[idx + 1];
}
else
{
u = defaultTexcoord[0];
v = defaultTexcoord[1];
}
float texcoord[2];
texcoord[0] = texMatrix[0]*u + texMatrix[4]*v + texMatrix[12];
texcoord[1] = texMatrix[1]*u + texMatrix[5]*v + texMatrix[13];
float color[4] = {
defaultColor[0],
defaultColor[1],
defaultColor[2],
defaultColor[3]
};
if (colors) if (colors)
{ {
int idx = 4*i; const uint8_t *c = &colors[4*i];
color[0] *= (float)colors[idx]*SW_INV_255; float color[4] = {
color[1] *= (float)colors[idx + 1]*SW_INV_255; (float)c[0]*SW_INV_255,
color[2] *= (float)colors[idx + 2]*SW_INV_255; (float)c[1]*SW_INV_255,
color[3] *= (float)colors[idx + 3]*SW_INV_255; (float)c[2]*SW_INV_255,
(float)c[3]*SW_INV_255,
};
sw_immediate_set_color(color);
} }
int idx = 3*i; const float *p = &positions[3*i];
float position[4] = { float position[4] = { p[0], p[1], p[2], 1.0f };
positions[idx],
positions[idx + 1],
positions[idx + 2],
1.0f
};
sw_immediate_set_color(color);
sw_immediate_set_texcoord(texcoord);
sw_immediate_push_vertex(position); sw_immediate_push_vertex(position);
} }
} }
@ -4844,76 +4812,42 @@ void swDrawElements(SWdraw mode, int count, int type, const void *indices)
return; return;
} }
const uint8_t *indicesUb = NULL; if ((type != SW_UNSIGNED_BYTE) && (type != SW_UNSIGNED_SHORT) && (type != SW_UNSIGNED_INT))
const uint16_t *indicesUs = NULL;
const uint32_t *indicesUi = NULL;
switch (type)
{ {
case SW_UNSIGNED_BYTE: indicesUb = (const uint8_t *)indices; break; RLSW.errCode = SW_INVALID_ENUM;
case SW_UNSIGNED_SHORT: indicesUs = (const uint16_t *)indices; break; return;
case SW_UNSIGNED_INT: indicesUi = (const uint32_t *)indices; break;
default: RLSW.errCode = SW_INVALID_ENUM; return;
} }
sw_immediate_begin(mode); sw_immediate_begin(mode);
{ {
const float *texMatrix = RLSW.stackTexture[RLSW.stackTextureCounter - 1];
const float *defaultTexcoord = RLSW.primitive.texcoord;
const float *defaultColor = RLSW.primitive.color;
const float *positions = RLSW.array.positions; const float *positions = RLSW.array.positions;
const float *texcoords = RLSW.array.texcoords; const float *texcoords = RLSW.array.texcoords;
const uint8_t *colors = RLSW.array.colors; const uint8_t *colors = RLSW.array.colors;
const uint8_t *indicesUb = (type == SW_UNSIGNED_BYTE)? indices : NULL;
const uint16_t *indicesUs = (type == SW_UNSIGNED_SHORT)? indices : NULL;
const uint32_t *indicesUi = (type == SW_UNSIGNED_INT)? indices : NULL;
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
int index = indicesUb? indicesUb[i] : uint32_t index = indicesUb? (uint32_t)indicesUb[i] : (indicesUs? (uint32_t)indicesUs[i] : (uint32_t)indicesUi[i]);
(indicesUs? indicesUs[i] : indicesUi[i]);
float u, v; if (texcoords) sw_immediate_set_texcoord(&texcoords[2*index]);
if (texcoords)
{
int idx = 2*index;
u = texcoords[idx];
v = texcoords[idx + 1];
}
else
{
u = defaultTexcoord[0];
v = defaultTexcoord[1];
}
float texcoord[2];
texcoord[0] = texMatrix[0]*u + texMatrix[4]*v + texMatrix[12];
texcoord[1] = texMatrix[1]*u + texMatrix[5]*v + texMatrix[13];
float color[4] = {
defaultColor[0],
defaultColor[1],
defaultColor[2],
defaultColor[3]
};
if (colors) if (colors)
{ {
int idx = 4*index; const uint8_t *c = &colors[4*index];
color[0] *= (float)colors[idx]*SW_INV_255; float color[4] = {
color[1] *= (float)colors[idx + 1]*SW_INV_255; (float)c[0]*SW_INV_255,
color[2] *= (float)colors[idx + 2]*SW_INV_255; (float)c[1]*SW_INV_255,
color[3] *= (float)colors[idx + 3]*SW_INV_255; (float)c[2]*SW_INV_255,
(float)c[3]*SW_INV_255,
};
sw_immediate_set_color(color);
} }
int idx = 3*index; const float *p = &positions[3*index];
float position[4] = { float position[4] = { p[0], p[1], p[2], 1.0f };
positions[idx],
positions[idx + 1],
positions[idx + 2],
1.0f
};
sw_immediate_set_color(color);
sw_immediate_set_texcoord(texcoord);
sw_immediate_push_vertex(position); sw_immediate_push_vertex(position);
} }
} }