History

change how render engine is told about model position changes

Seth Alves committed 11 years ago

Commit bc99ef71 parent 5c28c0b11 files · +211 −193Browse files

Showing the changes to interface/src/Application.cpp (1 of 11 files). Show all

Unified · Split

interface/src/Application.cpp+69−67
@@ -1086,75 +1086,77 @@ void Application::paintGL() { · 1085 unmodified lines
10861086
10871087 {
10881088 PerformanceTimer perfTimer("CameraUpdates");
1089−
10901089 auto myAvatar = getMyAvatar();
1091−
1092− myAvatar->startCapture();
1093− if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON || _myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) {
1094− Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson, myAvatar->getBoomLength() <= MyAvatar::ZOOM_MIN);
1095− Menu::getInstance()->setIsOptionChecked(MenuOption::ThirdPerson, !(myAvatar->getBoomLength() <= MyAvatar::ZOOM_MIN));
1096− cameraMenuChanged();
1097− }
1098−
1099− // The render mode is default or mirror if the camera is in mirror mode, assigned further below
1100− renderArgs._renderMode = RenderArgs::DEFAULT_RENDER_MODE;
1101−
1102− // Always use the default eye position, not the actual head eye position.
1103− // Using the latter will cause the camera to wobble with idle animations,
1104− // or with changes from the face tracker
1105− if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON) {
1106− if (isHMDMode()) {
1107− mat4 camMat = myAvatar->getSensorToWorldMatrix() * myAvatar->getHMDSensorMatrix();
1108− _myCamera.setPosition(extractTranslation(camMat));
1109− _myCamera.setRotation(glm::quat_cast(camMat));
1110− } else {
1111− _myCamera.setPosition(myAvatar->getDefaultEyePosition());
1112− _myCamera.setRotation(myAvatar->getHead()->getCameraOrientation());
1090+ myAvatar->withReadLock([&] {
1091+ if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON || _myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) {
1092+ Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson,
1093+ myAvatar->getBoomLength() <= MyAvatar::ZOOM_MIN);
1094+ Menu::getInstance()->setIsOptionChecked(MenuOption::ThirdPerson,
1095+ !(myAvatar->getBoomLength() <= MyAvatar::ZOOM_MIN));
1096+ cameraMenuChanged();
11131097 }
1114− } else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) {
1115− if (isHMDMode()) {
1116− auto hmdWorldMat = myAvatar->getSensorToWorldMatrix() * myAvatar->getHMDSensorMatrix();
1117− _myCamera.setRotation(glm::normalize(glm::quat_cast(hmdWorldMat)));
1118− auto worldBoomOffset = myAvatar->getOrientation() * (myAvatar->getScale() * myAvatar->getBoomLength() * glm::vec3(0.0f, 0.0f, 1.0f));
1119− _myCamera.setPosition(extractTranslation(hmdWorldMat) + worldBoomOffset);
1120− } else {
1121− _myCamera.setRotation(myAvatar->getHead()->getOrientation());
1122− if (Menu::getInstance()->isOptionChecked(MenuOption::CenterPlayerInView)) {
1098+
1099+ // The render mode is default or mirror if the camera is in mirror mode, assigned further below
1100+ renderArgs._renderMode = RenderArgs::DEFAULT_RENDER_MODE;
1101+
1102+ // Always use the default eye position, not the actual head eye position.
1103+ // Using the latter will cause the camera to wobble with idle animations,
1104+ // or with changes from the face tracker
1105+ if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON) {
1106+ if (isHMDMode()) {
1107+ mat4 camMat = myAvatar->getSensorToWorldMatrix() * myAvatar->getHMDSensorMatrix();
1108+ _myCamera.setPosition(extractTranslation(camMat));
1109+ _myCamera.setRotation(glm::quat_cast(camMat));
1110+ } else {
1111+ _myCamera.setPosition(myAvatar->getDefaultEyePosition());
1112+ _myCamera.setRotation(myAvatar->getHead()->getCameraOrientation());
1113+ }
1114+ } else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) {
1115+ if (isHMDMode()) {
1116+ auto hmdWorldMat = myAvatar->getSensorToWorldMatrix() * myAvatar->getHMDSensorMatrix();
1117+ _myCamera.setRotation(glm::normalize(glm::quat_cast(hmdWorldMat)));
1118+ auto worldBoomOffset = myAvatar->getOrientation() *
1119+ (myAvatar->getScale() * myAvatar->getBoomLength() * glm::vec3(0.0f, 0.0f, 1.0f));
1120+ _myCamera.setPosition(extractTranslation(hmdWorldMat) + worldBoomOffset);
1121+ } else {
1122+ _myCamera.setRotation(myAvatar->getHead()->getOrientation());
1123+ if (Menu::getInstance()->isOptionChecked(MenuOption::CenterPlayerInView)) {
1124+ _myCamera.setPosition(myAvatar->getDefaultEyePosition()
1125+ + _myCamera.getRotation() *
1126+ (myAvatar->getScale() * myAvatar->getBoomLength() * glm::vec3(0.0f, 0.0f, 1.0f)));
1127+ } else {
1128+ _myCamera.setPosition(myAvatar->getDefaultEyePosition()
1129+ + myAvatar->getOrientation() *
1130+ (myAvatar->getScale() * myAvatar->getBoomLength() * glm::vec3(0.0f, 0.0f, 1.0f)));
1131+ }
1132+ }
1133+ } else if (_myCamera.getMode() == CAMERA_MODE_MIRROR) {
1134+ if (isHMDMode()) {
1135+ glm::quat hmdRotation = extractRotation(myAvatar->getHMDSensorMatrix());
1136+ _myCamera.setRotation(myAvatar->getWorldAlignedOrientation()
1137+ * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f)) * hmdRotation);
1138+ glm::vec3 hmdOffset = extractTranslation(myAvatar->getHMDSensorMatrix());
11231139 _myCamera.setPosition(myAvatar->getDefaultEyePosition()
1124− + _myCamera.getRotation()
1125− * (myAvatar->getScale() * myAvatar->getBoomLength() * glm::vec3(0.0f, 0.0f, 1.0f)));
1140+ + glm::vec3(0, _raiseMirror * myAvatar->getAvatarScale(), 0)
1141+ + (myAvatar->getOrientation() * glm::quat(glm::vec3(0.0f, _rotateMirror, 0.0f))) *
1142+ glm::vec3(0.0f, 0.0f, -1.0f) * MIRROR_FULLSCREEN_DISTANCE * _scaleMirror
1143+ + (myAvatar->getOrientation() *
1144+ glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f))) * hmdOffset);
11261145 } else {
1146+ _myCamera.setRotation(myAvatar->getWorldAlignedOrientation()
1147+ * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f)));
11271148 _myCamera.setPosition(myAvatar->getDefaultEyePosition()
1128− + myAvatar->getOrientation()
1129− * (myAvatar->getScale() * myAvatar->getBoomLength() * glm::vec3(0.0f, 0.0f, 1.0f)));
1149+ + glm::vec3(0, _raiseMirror * myAvatar->getAvatarScale(), 0)
1150+ + (myAvatar->getOrientation() * glm::quat(glm::vec3(0.0f, _rotateMirror, 0.0f))) *
1151+ glm::vec3(0.0f, 0.0f, -1.0f) * MIRROR_FULLSCREEN_DISTANCE * _scaleMirror);
11301152 }
1153+ renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE;
11311154 }
1132− } else if (_myCamera.getMode() == CAMERA_MODE_MIRROR) {
1133− if (isHMDMode()) {
1134− glm::quat hmdRotation = extractRotation(myAvatar->getHMDSensorMatrix());
1135− _myCamera.setRotation(myAvatar->getWorldAlignedOrientation()
1136− * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f)) * hmdRotation);
1137− glm::vec3 hmdOffset = extractTranslation(myAvatar->getHMDSensorMatrix());
1138− _myCamera.setPosition(myAvatar->getDefaultEyePosition()
1139− + glm::vec3(0, _raiseMirror * myAvatar->getAvatarScale(), 0)
1140− + (myAvatar->getOrientation() * glm::quat(glm::vec3(0.0f, _rotateMirror, 0.0f))) *
1141− glm::vec3(0.0f, 0.0f, -1.0f) * MIRROR_FULLSCREEN_DISTANCE * _scaleMirror
1142− + (myAvatar->getOrientation() * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f))) * hmdOffset);
1143− } else {
1144− _myCamera.setRotation(myAvatar->getWorldAlignedOrientation()
1145− * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f)));
1146− _myCamera.setPosition(myAvatar->getDefaultEyePosition()
1147− + glm::vec3(0, _raiseMirror * myAvatar->getAvatarScale(), 0)
1148− + (myAvatar->getOrientation() * glm::quat(glm::vec3(0.0f, _rotateMirror, 0.0f))) *
1149− glm::vec3(0.0f, 0.0f, -1.0f) * MIRROR_FULLSCREEN_DISTANCE * _scaleMirror);
1155+ // Update camera position
1156+ if (!isHMDMode()) {
1157+ _myCamera.update(1.0f / _fps);
11501158 }
1151− renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE;
1152− }
1153− // Update camera position
1154− if (!isHMDMode()) {
1155− _myCamera.update(1.0f / _fps);
1156− }
1157− myAvatar->endCapture();
1159+ });
11581160 }
11591161
11601162 // Primary rendering pass
@@ -3386,9 +3388,9 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se · 2225 unmodified lines
33863388 // FIXME: This preRender call is temporary until we create a separate render::scene for the mirror rendering.
33873389 // Then we can move this logic into the Avatar::simulate call.
33883390 auto myAvatar = getMyAvatar();
3389− myAvatar->startRender();
3390− myAvatar->preRender(renderArgs);
3391− myAvatar->endRender();
3391+ myAvatar->withReadLock([&] {
3392+ myAvatar->preRender(renderArgs);
3393+ });
33923394
33933395
33943396 activeRenderingThread = QThread::currentThread();
@@ -3502,9 +3504,9 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se · 107 unmodified lines
35023504 _renderEngine->setRenderContext(renderContext);
35033505
35043506 // Before the deferred pass, let's try to use the render engine
3505− myAvatar->startRenderRun();
3506− _renderEngine->run();
3507− myAvatar->endRenderRun();
3507+ myAvatar->withReadLock([&] {
3508+ _renderEngine->run();
3509+ });
35083510
35093511 auto engineRC = _renderEngine->getRenderContext();
35103512 sceneInterface->setEngineFeedOpaqueItems(engineRC->_numFeedOpaqueItems);