History

Merge branch 'master' of github.com:highfidelity/hifi into punk

sam gateau committed 7 years ago

Commit 89dfd9a2 parents 34a6988 735be623 files · +110 −3Browse files

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

Unified · Split

interface/src/SecondaryCamera.cpp+68−2
@@ -34,6 +34,7 @@ public: · 33 unmodified lines
34 34
35 void configure(const Config& config) {35 void configure(const Config& config) {
36 _attachedEntityId = config.attachedEntityId;36 _attachedEntityId = config.attachedEntityId;
37 _portalEntranceEntityId = config.portalEntranceEntityId;
37 _position = config.position;38 _position = config.position;
38 _orientation = config.orientation;39 _orientation = config.orientation;
39 _vFoV = config.vFoV;40 _vFoV = config.vFoV;
@@ -41,7 +42,60 @@ public: · 1 unmodified line
41 _farClipPlaneDistance = config.farClipPlaneDistance;42 _farClipPlaneDistance = config.farClipPlaneDistance;
42 _textureWidth = config.textureWidth;43 _textureWidth = config.textureWidth;
43 _textureHeight = config.textureHeight;44 _textureHeight = config.textureHeight;
44 _mirrorProjection = config.mirrorProjection; 45 _mirrorProjection = config.mirrorProjection;
46 _portalProjection = config.portalProjection;
47 }
48
49 void setPortalProjection(ViewFrustum& srcViewFrustum) {
50 if (_portalEntranceEntityId.isNull() || _attachedEntityId.isNull()) {
51 qWarning() << "ERROR: Cannot set portal projection for SecondaryCamera without an attachedEntityId AND portalEntranceEntityId set.";
52 return;
53 }
54
55 EntityItemPointer portalEntrance = qApp->getEntities()->getTree()->findEntityByID(_portalEntranceEntityId);
56 if (!portalEntrance) {
57 qWarning() << "ERROR: Cannot get EntityItemPointer for portalEntrance.";
58 return;
59 }
60
61 EntityItemPointer portalExit = qApp->getEntities()->getTree()->findEntityByID(_attachedEntityId);
62 if (!portalExit) {
63 qWarning() << "ERROR: Cannot get EntityItemPointer for portalExit.";
64 return;
65 }
66
67 glm::vec3 portalEntrancePropertiesPosition = portalEntrance->getWorldPosition();
68 glm::quat portalEntrancePropertiesRotation = portalEntrance->getWorldOrientation();
69 glm::mat4 worldFromPortalEntranceRotation = glm::mat4_cast(portalEntrancePropertiesRotation);
70 glm::mat4 worldFromPortalEntranceTranslation = glm::translate(portalEntrancePropertiesPosition);
71 glm::mat4 worldFromPortalEntrance = worldFromPortalEntranceTranslation * worldFromPortalEntranceRotation;
72 glm::mat4 portalEntranceFromWorld = glm::inverse(worldFromPortalEntrance);
73
74 glm::vec3 portalExitPropertiesPosition = portalExit->getWorldPosition();
75 glm::quat portalExitPropertiesRotation = portalExit->getWorldOrientation();
76 glm::vec3 portalExitPropertiesDimensions = portalExit->getScaledDimensions();
77 glm::vec3 halfPortalExitPropertiesDimensions = 0.5f * portalExitPropertiesDimensions;
78
79 glm::mat4 worldFromPortalExitRotation = glm::mat4_cast(portalExitPropertiesRotation);
80 glm::mat4 worldFromPortalExitTranslation = glm::translate(portalExitPropertiesPosition);
81 glm::mat4 worldFromPortalExit = worldFromPortalExitTranslation * worldFromPortalExitRotation;
82
83 glm::vec3 mainCameraPositionWorld = qApp->getCamera().getPosition();
84 glm::vec3 mainCameraPositionPortalEntrance = vec3(portalEntranceFromWorld * vec4(mainCameraPositionWorld, 1.0f));
85 mainCameraPositionPortalEntrance = vec3(-mainCameraPositionPortalEntrance.x, mainCameraPositionPortalEntrance.y,
86 -mainCameraPositionPortalEntrance.z);
87 glm::vec3 portalExitCameraPositionWorld = vec3(worldFromPortalExit * vec4(mainCameraPositionPortalEntrance, 1.0f));
88
89 srcViewFrustum.setPosition(portalExitCameraPositionWorld);
90 srcViewFrustum.setOrientation(portalExitPropertiesRotation);
91
92 float nearClip = mainCameraPositionPortalEntrance.z + portalExitPropertiesDimensions.z * 2.0f;
93 // `mainCameraPositionPortalEntrance` should technically be `mainCameraPositionPortalExit`,
94 // but the values are the same.
95 glm::vec3 upperRight = halfPortalExitPropertiesDimensions - mainCameraPositionPortalEntrance;
96 glm::vec3 bottomLeft = -halfPortalExitPropertiesDimensions - mainCameraPositionPortalEntrance;
97 glm::mat4 frustum = glm::frustum(bottomLeft.x, upperRight.x, bottomLeft.y, upperRight.y, nearClip, _farClipPlaneDistance);
98 srcViewFrustum.setProjection(frustum);
45 }99 }
46 100
47 void setMirrorProjection(ViewFrustum& srcViewFrustum) {101 void setMirrorProjection(ViewFrustum& srcViewFrustum) {
@@ -110,7 +164,17 @@ public: · 62 unmodified lines
110 164
111 auto srcViewFrustum = args->getViewFrustum();165 auto srcViewFrustum = args->getViewFrustum();
112 if (_mirrorProjection) {166 if (_mirrorProjection) {
113 setMirrorProjection(srcViewFrustum);167 if (_portalProjection) {
168 qWarning() << "ERROR: You can't set both _portalProjection and _mirrorProjection";
169 } else {
170 setMirrorProjection(srcViewFrustum);
171 }
172 } else if (_portalProjection) {
173 if (_mirrorProjection) {
174 qWarning() << "ERROR: You can't set both _portalProjection and _mirrorProjection";
175 } else {
176 setPortalProjection(srcViewFrustum);
177 }
114 } else {178 } else {
115 if (!_attachedEntityId.isNull()) {179 if (!_attachedEntityId.isNull()) {
116 EntityItemPointer attachedEntity = qApp->getEntities()->getTree()->findEntityByID(_attachedEntityId);180 EntityItemPointer attachedEntity = qApp->getEntities()->getTree()->findEntityByID(_attachedEntityId);
@@ -142,6 +206,7 @@ protected: · 25 unmodified lines
142 206
143private:207private:
144 QUuid _attachedEntityId;208 QUuid _attachedEntityId;
209 QUuid _portalEntranceEntityId;
145 glm::vec3 _position;210 glm::vec3 _position;
146 glm::quat _orientation;211 glm::quat _orientation;
147 float _vFoV;212 float _vFoV;
@@ -150,6 +215,7 @@ private: · 2 unmodified lines
150 int _textureWidth;215 int _textureWidth;
151 int _textureHeight;216 int _textureHeight;
152 bool _mirrorProjection;217 bool _mirrorProjection;
218 bool _portalProjection;
153 EntityPropertyFlags _attachedEntityPropertyFlags;219 EntityPropertyFlags _attachedEntityPropertyFlags;
154};220};
155 221