For this project it was important for the portals to feel as seamless as possible which was achieved with the help of a SceneCaptureComponent that renders from the back of the room.
When creating this I ran into performance problems which is why the system was created to use only one SceneCaptureComponent for all portals and only render the portal closest to the player.
In this project my main task was the portal system, I wanted to build it mostly in C++ but I also recognized that for designers to be able to use this system without having to dive into the code it would be good to keep the functionality in C++ and the implementation in blueprint. Because of this my other teammates were able to implement their functionality in an easy and time efficient way.
In the later stages of the project we ran into some time constraints when building the ending for the game. Because of this I stepped up and created the ending cinematic using Unreal Engine 4's built in tools and rendering it as a .mp4 file to increase performance.
The portal class was responsible for teleporting the player and calculating where the player would end up as well as the players rotation when exiting the portal.
The Portal Manager class is responsible for updating the active portal, creating the SceneCaptureComponent with the correct settings and choosing which objects should be ignored for each portal.
Rendering the world with the same post process settings turned out to be way more performance heavy than I had thought in the beginning and the only solution we found was to use bCaptureEveryFrame which hit performance hard. As such I added another distance check to only use it when the player is in distance where you can actually see the difference. This is updated at the same time as the closest portal is updated.
For the portals to look realistic they had to ignore certain objects such as the door frame where the portal renders from and certain walls that could obscure the portals view. To make it easy for the level designer to fix this I added a system for hiding certain objects in each room which would be updated when the player entered a certain room.