Inverse view experiment.

This commit is contained in:
Dario 2024-11-26 23:01:37 -03:00
parent 10b924ac80
commit c4fcd8bf6b
4 changed files with 40 additions and 9 deletions

View File

@ -74,7 +74,8 @@
#define G_EX_SETDITHERNOISESTRENGTH_V1 0x00002B
#define G_EX_SETRDRAMEXTENDED_V1 0x00002C
#define G_EX_MATRIX_V1 0x00002D
#define G_EX_MAX 0x00002E
#define G_EX_SETINVVIEWMATRIXFLOAT_V1 0x00002E
#define G_EX_MAX 0x00002F
#define G_EX_ORIGIN_NONE 0x800
#define G_EX_ORIGIN_LEFT 0x0
@ -518,12 +519,18 @@ typedef union {
PARAM(isExtended, 1, 0) \
)
#define gEXMatrix(cmd, matrix, matrixp, param) \
#define gEXMatrix(cmd, matrix, param, matrixp) \
G_EX_COMMAND2(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_MATRIX_V1, 24, 0), \
(unsigned)(param), \
(unsigned)(matrix), \
(unsigned)(param), \
(unsigned)(matrixp) \
)
#define gEXSetInvViewMatrixFloat(cmd, matrix) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_SETINVVIEWMATRIXFLOAT_V1, 24, 0), \
(unsigned)(matrix) \
)
#endif // RT64_EXTENDED_GBI

View File

@ -292,9 +292,13 @@ namespace RT64 {
}
void matrixV1(State *state, DisplayList **dl) {
uint32_t params = (*dl)->w0;
uint32_t matrix = (*dl)->w1;
*dl = *dl + 1;
state->rsp->matrix((*dl)->w1, params, (*dl)->w0);
state->rsp->matrix(matrix, (*dl)->w0, (*dl)->w1);
}
void setInvViewMatrixFloatV1(State *state, DisplayList **dl) {
state->rsp->setInvViewMatrixFloat((*dl)->w1);
}
void noOpHook(State *state, DisplayList **dl) {
@ -399,6 +403,7 @@ namespace RT64 {
Map[G_EX_SETDITHERNOISESTRENGTH_V1] = &setDitherNoiseStrengthV1;
Map[G_EX_SETRDRAMEXTENDED_V1] = &setRDRAMExtendedV1;
Map[G_EX_MATRIX_V1] = &matrixV1;
Map[G_EX_SETINVVIEWMATRIXFLOAT_V1] = &setInvViewMatrixFloatV1;
MapInitialized = true;
}
}

View File

@ -321,6 +321,20 @@ namespace RT64 {
modelViewProjChanged = false;
}
void RSP::setInvViewMatrixFloat(uint32_t address) {
const uint32_t rdramAddress = fromSegmentedMasked(address);
const float *floatMatrix = reinterpret_cast<float *>(state->fromRDRAM(rdramAddress));
for (uint32_t j = 0; j < 4; j++) {
for (uint32_t i = 0; i < 4; i++) {
extended.invViewMatrix[j][i] = floatMatrix[j * 4 + i];
}
}
extended.invViewMatrixModel = hlslpp::inverse(extended.invViewMatrix);
projectionMatrixChanged = true;
modelViewProjChanged = true;
}
void RSP::computeModelViewProj() {
const hlslpp::float4x4 &viewProjMatrix = viewProjMatrixStack[projectionMatrixStackSize - 1];
modelViewProjMatrix = hlslpp::mul(modelMatrixStack[modelMatrixStackSize - 1], viewProjMatrix);
@ -436,9 +450,9 @@ namespace RT64 {
uint32_t physicalAddress = projectionMatrixPhysicalAddressStack[projectionMatrixStackSize - 1];
workload.physicalAddressTransformMap.emplace(physicalAddress, uint32_t(drawData.viewProjTransformGroups.size()));
drawData.viewTransforms.emplace_back(viewMatrixStack[projectionMatrixStackSize - 1]);
drawData.viewTransforms.emplace_back(hlslpp::mul(extended.invViewMatrix, viewMatrixStack[projectionMatrixStackSize - 1]));
drawData.projTransforms.emplace_back(projMatrixStack[projectionMatrixStackSize - 1]);
drawData.viewProjTransforms.emplace_back(viewProjMatrixStack[projectionMatrixStackSize - 1]);
drawData.viewProjTransforms.emplace_back(hlslpp::mul(extended.invViewMatrix, viewProjMatrixStack[projectionMatrixStackSize - 1]));
drawData.viewProjTransformGroups.emplace_back(extended.curViewProjMatrixIdGroupIndex);
drawData.rspViewports.emplace_back(viewportStack[viewportStackSize - 1]);
drawData.viewportOrigins.emplace_back(extended.viewportOrigin);
@ -473,7 +487,7 @@ namespace RT64 {
if (modelViewProjChanged) {
computeModelViewProj();
curTransformIndex = static_cast<uint16_t>(worldTransforms.size());
worldTransforms.emplace_back(modelMatrixStack[modelMatrixStackSize - 1]);
worldTransforms.emplace_back(hlslpp::mul(modelMatrixStack[modelMatrixStackSize - 1], extended.invViewMatrixModel));
}
else if (modelViewProjInserted) {
# ifdef LOG_SPECIAL_MATRIX_OPERATIONS
@ -488,7 +502,7 @@ namespace RT64 {
}
curTransformIndex = static_cast<uint16_t>(worldTransforms.size());
worldTransforms.emplace_back(hlslpp::mul(modelViewProjMatrix, invViewProjMatrixStack[projectionMatrixStackSize - 1]));
worldTransforms.emplace_back(hlslpp::mul(hlslpp::mul(modelViewProjMatrix, invViewProjMatrixStack[projectionMatrixStackSize - 1]), extended.invViewMatrixModel));
}
if (addWorldTransform) {
@ -1212,6 +1226,8 @@ namespace RT64 {
extended.viewProjMatrixIdStackChanged = false;
extended.curViewProjMatrixIdGroupIndex = 0;
extended.forceBranch = false;
extended.invViewMatrix = hlslpp::float4x4::identity();
extended.invViewMatrixModel = hlslpp::float4x4::identity();
}
void RSP::setGBI(GBI *gbi) {

View File

@ -217,6 +217,8 @@ namespace RT64 {
bool viewProjMatrixIdStackChanged;
int curViewProjMatrixIdGroupIndex;
bool forceBranch;
hlslpp::float4x4 invViewMatrix;
hlslpp::float4x4 invViewMatrixModel;
} extended;
RSP(State *state);
@ -234,6 +236,7 @@ namespace RT64 {
void popProjectionMatrix();
void insertMatrix(uint32_t address, uint32_t value);
void forceMatrix(uint32_t address);
void setInvViewMatrixFloat(uint32_t address);
void computeModelViewProj();
void specialComputeModelViewProj();
void setModelViewProjChanged(bool changed);