style(gx): tidy up GxPrimVertexPtr function

This commit is contained in:
Joshua Achorn 2023-04-07 14:32:17 -04:00
parent 0afae15295
commit a11c01e078

View File

@ -238,192 +238,116 @@ void GxPrimVertexPtr(CGxBuf* buf, EGxVertexBufferFormat format) {
void GxPrimVertexPtr(uint32_t vertexCount, const C3Vector* pos, uint32_t posStride, const C3Vector* normal, uint32_t normalStride, const CImVector* color, uint32_t colorStride, const C2Vector* tex0, uint32_t tex0Stride, const C2Vector* tex1, uint32_t tex1Stride) { void GxPrimVertexPtr(uint32_t vertexCount, const C3Vector* pos, uint32_t posStride, const C3Vector* normal, uint32_t normalStride, const CImVector* color, uint32_t colorStride, const C2Vector* tex0, uint32_t tex0Stride, const C2Vector* tex1, uint32_t tex1Stride) {
// Select vertex buffer format based on given parameters // Select vertex buffer format based on given parameters
EGxVertexBufferFormat bufFmt = GxVBF_P; auto format = GxVBF_P;
if (pos != nullptr) { if (pos && normal && color) {
if (normal != nullptr) { format = GxVBF_PNC;
if (color != nullptr) { if (tex0 && tex1) {
if (tex0 != nullptr) { format = GxVBF_PNCT2;
if (tex1 != nullptr) { } else if (tex0) {
bufFmt = GxVBF_PNCT2; format = GxVBF_PNCT;
} else { }
bufFmt = GxVBF_PNCT; } else if (pos && normal) {
} format = GxVBF_PN;
} else { if (tex0 && tex1) {
if (tex1 == nullptr) { format = GxVBF_PNT2;
bufFmt = GxVBF_PNC; } else if (tex0) {
} format = GxVBF_PNT;
} }
} else { } else if (pos && color) {
if (tex0 != nullptr) { format = GxVBF_PC;
if (tex1 != nullptr) { if (tex0 && tex1) {
bufFmt = GxVBF_PNT2; format = GxVBF_PCT2;
} else { } else if (tex0) {
bufFmt = GxVBF_PNT; format = GxVBF_PCT;
} }
} else { } else if (pos) {
if (tex1 == nullptr) { if (tex0 && tex1) {
bufFmt = GxVBF_PN; format = GxVBF_PT2;
} } else if (tex0) {
} format = GxVBF_PT;
}
} else {
if (color != nullptr) {
if (tex0 != nullptr) {
if (tex1 != nullptr) {
bufFmt = GxVBF_PCT2;
} else {
bufFmt = GxVBF_PCT;
}
} else {
if (tex1 == nullptr) {
bufFmt = GxVBF_PC;
}
}
} else {
if (tex0 != nullptr) {
if (tex1 != nullptr) {
bufFmt = GxVBF_PT2;
} else {
bufFmt = GxVBF_PT;
}
}
}
} }
} }
auto vertexSize = Buffer::s_vertexBufDesc[bufFmt].size; auto vertexSize = Buffer::s_vertexBufDesc[format].size;
auto buf = g_theGxDevicePtr->BufStream(GxPoolTarget_Vertex, vertexSize, vertexCount); auto buf = g_theGxDevicePtr->BufStream(GxPoolTarget_Vertex, vertexSize, vertexCount);
auto bufData = g_theGxDevicePtr->BufLock(buf); auto bufData = g_theGxDevicePtr->BufLock(buf);
C3Vector genericNormal = {}; C3Vector emptyNormal = { 0.0f, 0.0f, 0.0f };
CImVector genericColor = {}; CImVector emptyColor = { 0x00, 0x00, 0x00, 0x00 };
C2Vector genericTexCoord0 = {}; C2Vector emptyTex0 = { 0.0f, 0.0f };
C2Vector genericTexCoord1 = {}; C2Vector emptyTex1 = { 0.0f, 0.0f };
C3Vector* writeNormal; C3Vector* bufNormal;
CImVector* writeColor; CImVector* bufColor;
C2Vector* writeTexCoord0; C2Vector* bufTex0;
C2Vector* writeTexCoord1; C2Vector* bufTex1;
uintptr_t writeNormalStride = normal != nullptr ? vertexSize : 0; auto bufPos = reinterpret_cast<C3Vector*>(bufData + GxVertexAttribOffset(format, GxVA_Position));
if (normal == nullptr) { auto bufPosStride = vertexSize;
writeNormal = &genericNormal; auto bufNormal = reinterpret_cast<C3Vector*>(bufData + GxVertexAttribOffset(format, GxVA_Normal));
} else { auto bufNormalStride = vertexSize;
writeNormal = reinterpret_cast<C3Vector*>( if (!normal) {
uintptr_t(bufData) + uintptr_t(GxVertexAttribOffset(bufFmt, GxVA_Normal)) normal = &emptyNormal;
);
}
uintptr_t writeColorStride = color != nullptr ? vertexSize : 0;
if (color == nullptr) {
writeColor = &genericColor;
} else {
writeColor = reinterpret_cast<CImVector*>(
uintptr_t(bufData) + uintptr_t(GxVertexAttribOffset(bufFmt, GxVA_Color0))
);
}
uintptr_t writeTexCoord0Stride = tex0 != nullptr ? vertexSize : 0;
if (tex0 == nullptr) {
writeTexCoord0 = &genericTexCoord0;
} else {
writeTexCoord0 = reinterpret_cast<C2Vector*>(
uintptr_t(bufData) + uintptr_t(GxVertexAttribOffset(bufFmt, GxVA_TexCoord0))
);
}
uintptr_t writeTexCoord1Stride = tex1 != nullptr ? vertexSize : 0;
if (tex1 == nullptr) {
writeTexCoord1 = &genericTexCoord1;
} else {
writeTexCoord1 = reinterpret_cast<C2Vector*>(
uintptr_t(bufData) + uintptr_t(GxVertexAttribOffset(bufFmt, GxVA_TexCoord1))
);
}
if (normal == nullptr) {
normal = &genericNormal;
normalStride = 0; normalStride = 0;
bufNormal = &emptyNormal;
bufNormalStride = 0;
} }
auto bufColor = reinterpret_cast<CImVector*>(bufData + GxVertexAttribOffset(format, GxVA_Color0));
if (color == nullptr) { auto bufColorStride = vertexSize;
color = &genericColor; if (!color) {
color = &emptyColor;
colorStride = 0; colorStride = 0;
bufColor = &emptyColor;
bufColorStride = 0;
} }
auto bufTex0 = reinterpret_cast<C2Vector*>(bufData + GxVertexAttribOffset(format, GxVA_TexCoord0));
if (tex0 == nullptr) { auto bufTex0Stride = vertexSize;
tex0 = &genericTexCoord0; if (!tex0) {
tex0 = &emptyTex0;
tex0Stride = 0; tex0Stride = 0;
bufTex0 = &emptyTex0;
bufTex0Stride = 0;
} }
auto bufTex1 = reinterpret_cast<C2Vector*>(bufData + GxVertexAttribOffset(format, GxVA_TexCoord1));
if (tex1 == nullptr) { auto bufTex1Stride = vertexSize;
tex1 = &genericTexCoord1; if (!tex1) {
tex1 = &emptyTex1;
tex1Stride = 0; tex1Stride = 0;
bufTex1 = &emptyTex1;
bufTex1Stride = 0;
} }
if (vertexCount != 0) { if (vertexCount != 0) {
auto useRgba = GxCaps().m_colorFormat == GxCF_rgba; C3Vector* bufPos = reinterpret_cast<C3Vector*>(reinterpret_cast<uintptr_t>(bufData) + uintptr_t(GxVertexAttribOffset(format, GxVA_Position)));
C3Vector* writePos = reinterpret_cast<C3Vector*>( for (uint32_t i = 0; i < vertexCount; i++) {
uintptr_t(bufData) + uintptr_t(GxVertexAttribOffset(bufFmt, GxVA_Position)) *bufPos = *pos;
); pos = reinterpret_cast<const C3Vector*>(reinterpret_cast<uintptr_t>(pos) + posStride);
bufPos = reinterpret_cast<C3Vector*>(reinterpret_cast<uintptr_t>(bufPos) + bufPosStride);
for (uint32_t v = 0; v < vertexCount; v++) { *bufNormal = *normal;
*writePos = *pos; normal = reinterpret_cast<const C3Vector*>(reinterpret_cast<uintptr_t>(normal) + normalStride);
pos = reinterpret_cast<C3Vector*>( bufNormal = reinterpret_cast<C3Vector*>(reinterpret_cast<uintptr_t>(bufNormal) + bufNormalStride);
uintptr_t(pos) + uintptr_t(posStride) *bufColor = *color;
);
writePos = reinterpret_cast<C3Vector*>(
uintptr_t(writePos) + uintptr_t(vertexSize)
);
*writeNormal = *normal; GxFormatColor(*bufColor);
normal = reinterpret_cast<C3Vector*>( color = reinterpret_cast<const CImVector*>(reinterpret_cast<uintptr_t>(color) + colorStride);
uintptr_t(normal) + uintptr_t(normalStride) bufColor = reinterpret_cast<CImVector*>(reinterpret_cast<uintptr_t>(bufColor) + bufColorStride);
);
writeNormal = reinterpret_cast<C3Vector*>(
uintptr_t(writeNormal) + writeNormalStride
);
if (useRgba) { *bufTex0 = *tex0;
uint8_t rgba[4]; tex0 = reinterpret_cast<const C2Vector*>(reinterpret_cast<uintptr_t>(tex0) + tex0Stride);
rgba[0] = color->r; bufTex0 = reinterpret_cast<C2Vector*>(reinterpret_cast<uintptr_t>(bufTex0) + bufTex0Stride);
rgba[1] = color->g;
rgba[2] = color->b;
rgba[3] = color->a;
memcpy(writeColor, rgba, 4);
} else {
*writeColor = *color;
}
color = reinterpret_cast<CImVector*>(
uintptr_t(color) + colorStride
);
writeColor = reinterpret_cast<CImVector*>(
uintptr_t(writeColor) + writeColorStride
);
*writeTexCoord0 = *tex0; *bufTex1 = *tex1;
tex0 = reinterpret_cast<C2Vector*>( tex1 = reinterpret_cast<const C2Vector*>(reinterpret_cast<uintptr_t>(tex1) + tex1Stride);
uintptr_t(tex0) + tex0Stride bufTex1 = reinterpret_cast<C2Vector*>(reinterpret_cast<uintptr_t>(bufTex1) + bufTex1Stride);
);
writeTexCoord0 = reinterpret_cast<C2Vector*>(
uintptr_t(writeTexCoord0) + writeTexCoord0Stride
);
*writeTexCoord1 = *tex1;
tex1 = reinterpret_cast<C2Vector*>(
uintptr_t(tex1) + tex1Stride
);
writeTexCoord1 = reinterpret_cast<C2Vector*>(
uintptr_t(writeTexCoord1) + writeTexCoord1Stride
);
} }
} }
GxBufUnlock(buf, vertexSize * vertexCount); GxBufUnlock(buf, vertexSize * vertexCount);
GxPrimVertexPtr(buf, bufFmt); GxPrimVertexPtr(buf, format);
} }
void GxPrimLockVertexPtrs(uint32_t vertexCount, const C3Vector* pos, uint32_t posStride, const C3Vector* normal, uint32_t normalStride, const CImVector* color, uint32_t colorStride, const uint8_t* bone, uint32_t boneStride, const C2Vector* tex0, uint32_t tex0Stride, const C2Vector* tex1, uint32_t tex1Stride) { void GxPrimLockVertexPtrs(uint32_t vertexCount, const C3Vector* pos, uint32_t posStride, const C3Vector* normal, uint32_t normalStride, const CImVector* color, uint32_t colorStride, const uint8_t* bone, uint32_t boneStride, const C2Vector* tex0, uint32_t tex0Stride, const C2Vector* tex1, uint32_t tex1Stride) {