Can move around scene again .. working on Rendering engine still

This commit is contained in:
Nigel Barink 2023-05-03 16:40:43 +02:00
parent 7448017701
commit 89f5b1497f
4 changed files with 133 additions and 101 deletions

View File

@ -18,6 +18,7 @@ void Viewport::Draw() {
});
cam.Update();
renderer.SetMainCamera(cam);
renderer.Render(scene);
ImVec2 WinPos = ImGui::GetWindowPos();
@ -37,6 +38,7 @@ void Viewport::Draw() {
ImGuizmo::SetRect(ScreenSpaceMin.x, ScreenSpaceMin.y, ContentRegionMax.x, ContentRegionMax.y);
glm::mat4 transposed_view = glm::transpose(cam.ViewMatrix);
isFocused = ImGui::IsWindowFocused();
//ImGuizmo::DrawGrid(glm::value_ptr(cam.ViewMatrix), glm::value_ptr(cam.ProjectionMatrix), glm::value_ptr(worldOrigin), 100.0f);
//ImGuizmo::ViewManipulate(glm::value_ptr(cam.ViewMatrix), 1, { ScreenSpaceMin.x,ScreenSpaceMin.y }, { 90,90 }, 0x22CCCCCC);
@ -44,12 +46,4 @@ void Viewport::Draw() {
// Matrix is the model matrix we would want to manipulate
//ImGuizmo::Manipulate(glm::value_ptr(cam.ViewMatrix), glm::value_ptr(cam.ProjectionMatrix), ImGuizmo::TRANSLATE, ImGuizmo::WORLD, glm::value_ptr(cam.ViewMatrix));
if (ImGui::IsWindowFocused())
{
isFocused = true;
}
else {
isFocused = false;
}
}

View File

@ -38,7 +38,7 @@ public:
SceneExplorer explorer(Selected, scene);
Inspector inspector = Inspector(Selected);
Settings settings = Settings();
// AssetFinder assetsView = AssetFinder();
// AssetFinder assetsView = AssetFinder();
Console console = Console();
Selected = YoggieEngine::Entity((entt::entity) -1, &scene);
@ -54,68 +54,16 @@ public:
lag += elapsed;
scene.Update();
if (sceneview.isFocused)
{
const float movement_speed = 0.1f;
static float lastX = 400, lastY = 300;
const float sensitivity = 0.1;
static bool firstMouse = true;
if (MouseButtonPressed(YOGGIE_MOUSE_BUTTON_RIGHT)) {
glfwSetInputMode((GLFWwindow*)appWindow->GetHandle(), GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
auto newX = getCursorPosX(appWindow);
auto newY = getCursorPosY(appWindow);
if (firstMouse)
{
lastX = newX;
lastY = newY;
firstMouse = false;
}
float xoffset = newX - lastX;
float yoffset = newY - lastY;
lastX = newX;
lastY = newY;
xoffset *= sensitivity;
yoffset *= sensitivity;
sceneview.cam.yaw += xoffset;
sceneview.cam.pitch += yoffset;
if (sceneview.cam.pitch > 89.0f)
sceneview.cam.pitch = 89.0f;
if (sceneview.cam.pitch < -89.0f)
sceneview.cam.pitch = -89.0f;
}
else if (firstMouse == false)
{
glfwSetInputMode((GLFWwindow*)appWindow->GetHandle(), GLFW_CURSOR, GLFW_CURSOR_NORMAL);
firstMouse = true;
}
// Check for Camara movement input here!
if (keyIsPressed(YOGGIE_KEY_W))
sceneview.cam.Position += sceneview.cam.Front * movement_speed;
if (keyIsPressed(YOGGIE_KEY_A))
sceneview.cam.Position -= sceneview.cam.Right * movement_speed;
if (keyIsPressed(YOGGIE_KEY_S))
sceneview.cam.Position -= sceneview.cam.Front * movement_speed;
if (keyIsPressed(YOGGIE_KEY_D))
sceneview.cam.Position += sceneview.cam.Right * movement_speed;
if (sceneview.isFocused) {
UpdateSceneCamera(sceneview);
std::cout << "Scene view in Focus!\r" ;
}
GuiBegin();
{
MainMenuBar menuBar = MainMenuBar();
@ -181,10 +129,70 @@ public:
private:
bool SimulatePhysics = true;
YoggieEngine::Entity Selected;
Project project;
Scene scene;
void UpdateSceneCamera(Viewport& sceneview) {
const float movement_speed = 0.1f;
static float lastX = 400, lastY = 300;
const float sensitivity = 0.1;
static bool firstMouse = true;
if (MouseButtonPressed(YOGGIE_MOUSE_BUTTON_RIGHT)) {
glfwSetInputMode((GLFWwindow*)appWindow->GetHandle(), GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
auto newX = getCursorPosX(appWindow);
auto newY = getCursorPosY(appWindow);
if (firstMouse)
{
lastX = newX;
lastY = newY;
firstMouse = false;
}
float xoffset = newX - lastX;
float yoffset = newY - lastY;
lastX = newX;
lastY = newY;
xoffset *= sensitivity;
yoffset *= sensitivity;
sceneview.cam.yaw += xoffset;
sceneview.cam.pitch += yoffset;
if (sceneview.cam.pitch > 89.0f)
sceneview.cam.pitch = 89.0f;
if (sceneview.cam.pitch < -89.0f)
sceneview.cam.pitch = -89.0f;
}
else if (firstMouse == false)
{
glfwSetInputMode((GLFWwindow*)appWindow->GetHandle(), GLFW_CURSOR, GLFW_CURSOR_NORMAL);
firstMouse = true;
}
// Check for Camara movement input here!
if (keyIsPressed(YOGGIE_KEY_W)) {
sceneview.cam.Position += sceneview.cam.Front * movement_speed;
std::cout << "Pressed W !" << std::endl;
}
if (keyIsPressed(YOGGIE_KEY_A))
sceneview.cam.Position -= sceneview.cam.Right * movement_speed;
if (keyIsPressed(YOGGIE_KEY_S))
sceneview.cam.Position -= sceneview.cam.Front * movement_speed;
if (keyIsPressed(YOGGIE_KEY_D))
sceneview.cam.Position += sceneview.cam.Right * movement_speed;
}
};
YoggieEngine::Application* CreateApplication() {
@ -192,3 +200,5 @@ YoggieEngine::Application* CreateApplication() {
return new Editor();
}

View File

@ -71,14 +71,14 @@ Renderer::Renderer(RendererConfig& config)
lightingPassShader("build/Debug/Shaders/deferred/lightPass.vert", "build/Debug/Shaders/deferred/lightPass.frag"),
SkyboxShader("build/Debug/Shaders/Cubemaps/Skybox.vert", "build/Debug/Shaders/Cubemaps/Skybox.frag"),
BlendingShader("build/Debug/Shaders/forward/Blending.vert", "build/Debug/Shaders/forward/Blending.frag"),
forwardShader("build/Debug/Shaders/forward/geometry.vert", "build/Debug/Shaders/forward/geometry.frag")
forwardShader("build/Debug/Shaders/forward/geometry.vert", "build/Debug/Shaders/forward/geometry.frag"),
postProcessingShader("build/Debug/Shaders/forward/postprocessing.vert", "build/Debug/Shaders/forward/postprocessing.frag")
{
width = config.ScreenWidth;
height = config.ScreenHeight;
glEnable(GL_DEPTH_TEST);
// Deferred Rendering
glGenFramebuffers(1, &gBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, gBuffer);
@ -150,9 +150,6 @@ Renderer::Renderer(RendererConfig& config)
#else
grassTexture = Texture("build/Debug/Texture/grass.png", true);
#endif
}
@ -257,6 +254,32 @@ void Renderer::GeometryPass() {
}
void Renderer::ForwardGeometryPass()
{
for (const DrawCommand& command : commands)
{
if (command.isDynamic == false)
continue;
glBindVertexArray(command.VAO_identifier);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, command.IBO_identifier);
forwardShader.Use();
forwardShader.setUniformVec3("Color", command.color);
forwardShader.setUniformMat4("M", command.transform.LocalTransform);
forwardShader.setUniformMat4("V", MainCamera.ViewMatrix);
forwardShader.setUniformMat4("P", MainCamera.ProjectionMatrix);
glDrawElements(GL_TRIANGLES, static_cast<unsigned int>(command.num_elements),
GL_UNSIGNED_INT, NULL);
glBindVertexArray(0);
}
}
void Renderer::SkyboxPass() {
// Render skybox
glDepthMask(GL_FALSE);
@ -267,7 +290,6 @@ void Renderer::SkyboxPass() {
glBindTexture(GL_TEXTURE_CUBE_MAP, sky.getID());
glDrawArrays(GL_TRIANGLES, 0, 36);
glBindVertexArray(0);
glDepthMask(GL_TRUE);
}
@ -361,12 +383,38 @@ void Renderer::BlendingPass() {
}
glBindVertexArray(0);
glDisable(GL_BLEND);
}
void Renderer::PostProcessing()
{
postProcessingShader.Use();
postProcessingShader.setUniformInt("screen", 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_framebuffer.GetColourAttachment());
glBindVertexArray(quadVAO);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glBindVertexArray(0);
}
void Renderer::CopyGBuffer() {
glBindFramebuffer(GL_READ_FRAMEBUFFER, gBuffer);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_framebuffer.GetId());
glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer.GetId());
}
void Renderer::Render(Scene& scene)
{
SubmitVegetationDemo();
@ -380,37 +428,13 @@ void Renderer::Render(Scene& scene)
lightingPass(scene);
CopyGBuffer();
glBindFramebuffer(GL_READ_FRAMEBUFFER, gBuffer);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_framebuffer.GetId());
glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
ForwardGeometryPass();
// Forward rendering approach
glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer.GetId());
for (const DrawCommand& command : commands)
{
if (command.isDynamic == false)
continue;
glBindVertexArray(command.VAO_identifier);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, command.IBO_identifier);
forwardShader.Use();
forwardShader.setUniformVec3("Color", command.color);
forwardShader.setUniformMat4("M", command.transform.LocalTransform);
forwardShader.setUniformMat4("V", MainCamera.ViewMatrix);
forwardShader.setUniformMat4("P", MainCamera.ProjectionMatrix);
glDrawElements(GL_TRIANGLES, static_cast<unsigned int>(command.num_elements),
GL_UNSIGNED_INT, NULL);
glBindVertexArray(0);
}
BlendingPass();
//PostProcessing();
// Lighting pass

View File

@ -35,10 +35,12 @@ namespace YoggieEngine {
Framebuffer& getCurrentFrameBuffer() { return m_framebuffer; }
private:
void GeometryPass();
void ForwardGeometryPass();
void SkyboxPass();
void lightingPass(Scene& scene);
void BlendingPass();
void PostProcessing();
void CopyGBuffer();
private:
@ -59,6 +61,8 @@ namespace YoggieEngine {
Shader lightingPassShader;
Shader gBufferShader;
Shader SkyboxShader;
Shader postProcessingShader;
// blending
Shader BlendingShader;