wild guess to handle view correction, hide portalExitID in create when mirrorMode != portal

This commit is contained in:
HifiExperiments 2023-12-04 14:44:28 -08:00
parent 6af7b9f772
commit 3e0c50e077
8 changed files with 32 additions and 1 deletions

View file

@ -81,6 +81,7 @@ GLBackend::CommandCall GLBackend::_commandCalls[Batch::NUM_COMMANDS] =
(&::gpu::gl::GLBackend::do_disableContextViewCorrection), (&::gpu::gl::GLBackend::do_disableContextViewCorrection),
(&::gpu::gl::GLBackend::do_restoreContextViewCorrection), (&::gpu::gl::GLBackend::do_restoreContextViewCorrection),
(&::gpu::gl::GLBackend::do_setContextMirrorViewCorrection),
(&::gpu::gl::GLBackend::do_disableContextStereo), (&::gpu::gl::GLBackend::do_disableContextStereo),
(&::gpu::gl::GLBackend::do_restoreContextStereo), (&::gpu::gl::GLBackend::do_restoreContextStereo),
@ -619,6 +620,10 @@ void GLBackend::do_restoreContextViewCorrection(const Batch& batch, size_t param
_transform._viewCorrectionEnabled = true; _transform._viewCorrectionEnabled = true;
} }
void GLBackend::do_setContextMirrorViewCorrection(const Batch& batch, size_t paramOffset) {
_transform._mirrorViewCorrection = batch._params[paramOffset + 1]._uint != 0;
}
void GLBackend::do_disableContextStereo(const Batch& batch, size_t paramOffset) { void GLBackend::do_disableContextStereo(const Batch& batch, size_t paramOffset) {
} }

View file

@ -211,6 +211,7 @@ public:
virtual void do_disableContextViewCorrection(const Batch& batch, size_t paramOffset) final; virtual void do_disableContextViewCorrection(const Batch& batch, size_t paramOffset) final;
virtual void do_restoreContextViewCorrection(const Batch& batch, size_t paramOffset) final; virtual void do_restoreContextViewCorrection(const Batch& batch, size_t paramOffset) final;
virtual void do_setContextMirrorViewCorrection(const Batch& batch, size_t paramOffset) final;
virtual void do_disableContextStereo(const Batch& batch, size_t paramOffset) final; virtual void do_disableContextStereo(const Batch& batch, size_t paramOffset) final;
virtual void do_restoreContextStereo(const Batch& batch, size_t paramOffset) final; virtual void do_restoreContextStereo(const Batch& batch, size_t paramOffset) final;
@ -433,6 +434,7 @@ protected:
Transform _view; Transform _view;
CameraCorrection _correction; CameraCorrection _correction;
bool _viewCorrectionEnabled{ true }; bool _viewCorrectionEnabled{ true };
bool _mirrorViewCorrection{ false };
Mat4 _projection; Mat4 _projection;
Vec4i _viewport{ 0, 0, 1, 1 }; Vec4i _viewport{ 0, 0, 1, 1 };

View file

@ -111,7 +111,11 @@ void GLBackend::TransformStageState::preUpdate(size_t commandIndex, const Stereo
if (_viewIsCamera && (_viewCorrectionEnabled && _correction.correction != glm::mat4())) { if (_viewIsCamera && (_viewCorrectionEnabled && _correction.correction != glm::mat4())) {
// FIXME should I switch to using the camera correction buffer in Transform.slf and leave this out? // FIXME should I switch to using the camera correction buffer in Transform.slf and leave this out?
Transform result; Transform result;
_view.mult(result, _view, _correction.correctionInverse); glm::mat4 correction = _correction.correctionInverse;
if (_mirrorViewCorrection) {
correction = glm::scale(glm::mat4(), glm::vec3(-1.0f, 1.0f, 1.0f)) * correction;
}
_view.mult(result, _view, correction);
if (_skybox) { if (_skybox) {
result.setTranslation(vec3()); result.setTranslation(vec3());
} }

View file

@ -464,6 +464,12 @@ void Batch::restoreContextViewCorrection() {
ADD_COMMAND(restoreContextViewCorrection); ADD_COMMAND(restoreContextViewCorrection);
} }
void Batch::setContextMirrorViewCorrection(bool shouldMirror) {
ADD_COMMAND(setContextMirrorViewCorrection);
uint mirrorFlag = shouldMirror ? 1 : 0;
_params.emplace_back(mirrorFlag);
}
void Batch::disableContextStereo() { void Batch::disableContextStereo() {
ADD_COMMAND(disableContextStereo); ADD_COMMAND(disableContextStereo);
} }

View file

@ -239,6 +239,7 @@ public:
void disableContextViewCorrection(); void disableContextViewCorrection();
void restoreContextViewCorrection(); void restoreContextViewCorrection();
void setContextMirrorViewCorrection(bool shouldMirror);
void disableContextStereo(); void disableContextStereo();
void restoreContextStereo(); void restoreContextStereo();
@ -340,6 +341,7 @@ public:
COMMAND_disableContextViewCorrection, COMMAND_disableContextViewCorrection,
COMMAND_restoreContextViewCorrection, COMMAND_restoreContextViewCorrection,
COMMAND_setContextMirrorViewCorrection,
COMMAND_disableContextStereo, COMMAND_disableContextStereo,
COMMAND_restoreContextStereo, COMMAND_restoreContextStereo,

View file

@ -181,6 +181,7 @@ constexpr const char* COMMAND_NAMES[] = {
"disableContextViewCorrection", "disableContextViewCorrection",
"restoreContextViewCorrection", "restoreContextViewCorrection",
"setContextMirrorViewCorrection",
"disableContextStereo", "disableContextStereo",
"restoreContextStereo", "restoreContextStereo",

View file

@ -307,6 +307,11 @@ public:
args->_ignoreItem = portalExitID != Item::INVALID_ITEM_ID ? portalExitID : mirror.id; args->_ignoreItem = portalExitID != Item::INVALID_ITEM_ID ? portalExitID : mirror.id;
args->_mirrorDepth = _depth; args->_mirrorDepth = _depth;
gpu::doInBatch("SetupMirrorTask::run", args->_context, [&](gpu::Batch& batch) {
bool shouldMirror = _depth % 2 == (args->_renderMode != RenderArgs::MIRROR_RENDER_MODE);
batch.setContextMirrorViewCorrection(shouldMirror);
});
// Without calculating the bound planes, the mirror will use the same culling frustum as the main camera, // Without calculating the bound planes, the mirror will use the same culling frustum as the main camera,
// which is not what we want here. // which is not what we want here.
srcViewFrustum.calculate(); srcViewFrustum.calculate();
@ -360,6 +365,11 @@ public:
gpu::doInBatch("DrawMirrorTask::run", args->_context, [&](gpu::Batch& batch) { gpu::doInBatch("DrawMirrorTask::run", args->_context, [&](gpu::Batch& batch) {
args->_batch = &batch; args->_batch = &batch;
if (cachedArgs) {
bool shouldMirror = cachedArgs->_mirrorDepth % 2 == (args->_renderMode != RenderArgs::MIRROR_RENDER_MODE);
batch.setContextMirrorViewCorrection(shouldMirror);
}
batch.setFramebuffer(framebuffer); batch.setFramebuffer(framebuffer);
batch.setViewportTransform(args->_viewport); batch.setViewportTransform(args->_viewport);
batch.setStateScissorRect(args->_viewport); batch.setStateScissorRect(args->_viewport);

View file

@ -146,6 +146,7 @@ const GROUPS = [
label: "Portal Exit", label: "Portal Exit",
type: "string", type: "string",
propertyID: "portalExitID", propertyID: "portalExitID",
showPropertyRule: { "mirrorMode": "portal" },
} }
] ]
}, },