diff --git a/Editor/Editor.cpp b/Editor/Editor.cpp index 2723a990..5062427e 100644 --- a/Editor/Editor.cpp +++ b/Editor/Editor.cpp @@ -85,55 +85,55 @@ int main() Ref currentScene = Nuake::Engine::GetCurrentScene(); if (currentScene && !Nuake::Engine::IsPlayMode) { - GuizmoShader->Bind(); - - glDisable(GL_CULL_FACE); - glDisable(GL_DEPTH_TEST); - auto camView = currentScene->m_Registry.view(); - for (auto e : camView) { - auto [transformComponent, cam] = camView.get(e); - - GuizmoShader->SetUniformMat4f("model", transformComponent.GetGlobalTransform()); - GuizmoShader->SetUniformMat4f("view", currentScene->m_EditorCamera->GetTransform()); - GuizmoShader->SetUniformMat4f("projection", currentScene->m_EditorCamera->GetPerspective()); - - camTexture->Bind(2); - GuizmoShader->SetUniform1i("gizmo_texture", 2); - - Nuake::Renderer::DrawQuad(transformComponent.GetGlobalTransform()); - } - - auto view = currentScene->m_Registry.view(); - for (auto e : view) { - auto [transformComponent, light] = view.get(e); - - GuizmoShader->SetUniformMat4f("model", transformComponent.GetGlobalTransform()); - GuizmoShader->SetUniformMat4f("view", currentScene->m_EditorCamera->GetTransform()); - GuizmoShader->SetUniformMat4f("projection", currentScene->m_EditorCamera->GetPerspective()); - - lightTexture->Bind(2); - GuizmoShader->SetUniform1i("gizmo_texture", 2); - - Nuake::Renderer::DrawQuad(transformComponent.GetGlobalTransform()); - } - - glEnable(GL_CULL_FACE); - - GuizmoShader->Unbind(); - - ditherShader->Bind(); - ditherShader->SetUniformMat4f("u_View", Nuake::Engine::GetCurrentScene()->m_EditorCamera->GetTransform()); - ditherShader->SetUniformMat4f("u_Projection", Nuake::Engine::GetCurrentScene()->m_EditorCamera->GetPerspective()); - ditherShader->SetUniform1f("u_Time", Nuake::Engine::GetTime()); - ditherShader->SetUniform4f("u_Color", 252.0 / 255.0, 3.0 / 255.0, 65.0 / 255.0, 1.0); - - if (editor.m_IsEntitySelected && editor.m_SelectedEntity.HasComponent()) - { - for (auto& m : editor.m_SelectedEntity.GetComponent().Meshes) - Nuake::Renderer::SubmitMesh(m, editor.m_SelectedEntity.GetComponent().GetGlobalTransform()); - - Nuake::Renderer::Flush(ditherShader, true); - } + //GuizmoShader->Bind(); + // + //glDisable(GL_CULL_FACE); + //glDisable(GL_DEPTH_TEST); + //auto camView = currentScene->m_Registry.view(); + //for (auto e : camView) { + // auto [transformComponent, cam] = camView.get(e); + // + // GuizmoShader->SetUniformMat4f("model", transformComponent.GetGlobalTransform()); + // GuizmoShader->SetUniformMat4f("view", currentScene->m_EditorCamera->GetTransform()); + // GuizmoShader->SetUniformMat4f("projection", currentScene->m_EditorCamera->GetPerspective()); + // + // camTexture->Bind(2); + // GuizmoShader->SetUniform1i("gizmo_texture", 2); + // + // Nuake::Renderer::DrawQuad(transformComponent.GetGlobalTransform()); + //} + // + //auto view = currentScene->m_Registry.view(); + //for (auto e : view) { + // auto [transformComponent, light] = view.get(e); + // + // GuizmoShader->SetUniformMat4f("model", transformComponent.GetGlobalTransform()); + // GuizmoShader->SetUniformMat4f("view", currentScene->m_EditorCamera->GetTransform()); + // GuizmoShader->SetUniformMat4f("projection", currentScene->m_EditorCamera->GetPerspective()); + // + // lightTexture->Bind(2); + // GuizmoShader->SetUniform1i("gizmo_texture", 2); + // + // Nuake::Renderer::DrawQuad(transformComponent.GetGlobalTransform()); + //} + // + //glEnable(GL_CULL_FACE); + // + //GuizmoShader->Unbind(); + // + //ditherShader->Bind(); + //ditherShader->SetUniformMat4f("u_View", Nuake::Engine::GetCurrentScene()->m_EditorCamera->GetTransform()); + //ditherShader->SetUniformMat4f("u_Projection", Nuake::Engine::GetCurrentScene()->m_EditorCamera->GetPerspective()); + //ditherShader->SetUniform1f("u_Time", Nuake::Engine::GetTime()); + //ditherShader->SetUniform4f("u_Color", 252.0 / 255.0, 3.0 / 255.0, 65.0 / 255.0, 1.0); + // + //if (editor.m_IsEntitySelected && editor.m_SelectedEntity.HasComponent()) + //{ + // for (auto& m : editor.m_SelectedEntity.GetComponent().Meshes) + // Nuake::Renderer::SubmitMesh(m, editor.m_SelectedEntity.GetComponent().GetGlobalTransform()); + // + // Nuake::Renderer::Flush(ditherShader, true); + //} glEnable(GL_DEPTH_TEST); } sceneFramebuffer->Unbind(); diff --git a/Editor/resources/Scripts/Scene.wren b/Editor/resources/Scripts/Scene.wren index ce6e1e89..4b870cbd 100644 --- a/Editor/resources/Scripts/Scene.wren +++ b/Editor/resources/Scripts/Scene.wren @@ -43,7 +43,8 @@ class Scene { foreign static GetScript_(e) foreign static GetTranslation_(e) foreign static SetTranslation_(e, x, y, z) - //foreign static SetRotation_(e, x, y, z) + foreign static SetRotation_(e, x, y, z) + foreign static GetRotation_(e) //foreign static SetScale_(e, x, y, z) // Light @@ -101,6 +102,15 @@ class TransformComponent { Scene.SetTranslation_(_entityId, t.x, t.y, t.z) } + GetRotation() { + var result = Scene.GetRotation_(_entityId) + return Vector3.new(result[0], result[1], result[2]) + } + + SetRotation(t) { + Scene.SetRotation_(_entityId, t.x, t.y, t.z) + } + } class Light { diff --git a/Editor/resources/Shaders/deferred.shader b/Editor/resources/Shaders/deferred.shader index c8bb1fa1..c95d7942 100644 --- a/Editor/resources/Shaders/deferred.shader +++ b/Editor/resources/Shaders/deferred.shader @@ -265,13 +265,17 @@ void main() if (Lights[i].Volumetric == 1) fog += ComputeVolumetric(worldPos, Lights[i]); - shadow = ShadowCalculation(Lights[i], worldPos, N); + shadow += ShadowCalculation(Lights[i], worldPos, N); } - vec3 H = normalize(V + L); - vec3 radiance = Lights[i].Color * attenuation * (1.0f - shadow); + vec3 radiance = Lights[i].Color * attenuation ; + + if (Lights[i].Type == 0) { + radiance *= 1.0f - shadow; + } // Cook-Torrance BRDF + vec3 H = normalize(V + L); float NDF = DistributionGGX(N, H, roughness); float G = GeometrySmith(N, V, L, roughness); vec3 F = fresnelSchlick(max(dot(H, V), 0.0), F0); diff --git a/Editor/src/EditorInterface.cpp b/Editor/src/EditorInterface.cpp index 1dbe3bb8..d203d663 100644 --- a/Editor/src/EditorInterface.cpp +++ b/Editor/src/EditorInterface.cpp @@ -279,11 +279,22 @@ namespace Nuake { if (ImGui::BeginPopupContextItem()) { + if (m_SelectedEntity.HasComponent()) + { + if (ImGui::Selectable("Focus camera")) + { + Engine::GetCurrentScene()->m_EditorCamera->Translation = m_SelectedEntity.GetComponent().Translation; + Engine::GetCurrentScene()->m_EditorCamera->SetDirection(m_SelectedEntity.GetComponent().CameraInstance->GetDirection()); + } + ImGui::Separator(); + } + if (ImGui::Selectable("Remove")) { QueueDeletion = e; } + if (ImGui::Selectable("Move to root")) { auto& p = m_SelectedEntity.GetComponent(); @@ -1051,8 +1062,7 @@ namespace Nuake { if (ImGui::CollapsingHeader("Albedo", ImGuiTreeNodeFlags_DefaultOpen)) { unsigned int textureID = 0; - if (material->HasAlbedo()) - textureID = material->m_Albedo->GetID(); + textureID = material->m_Albedo->GetID(); ImGui::ColorEdit3("Color", &material->data.m_AlbedoColor.r); diff --git a/Nuake/dependencies/assimp_p5.lua b/Nuake/dependencies/assimp_p5.lua index 0dcf65ca..0d1a386e 100644 --- a/Nuake/dependencies/assimp_p5.lua +++ b/Nuake/dependencies/assimp_p5.lua @@ -37,8 +37,9 @@ project 'assimp' -- 'assimp/code/Blender/**', 'assimp/contrib/poly2tri/poly2tri/**', 'assimp/code/AssetLib/FBX/**', '../src/Vendors/pugixml/**', - -- 'assimp/code/glTF2/**', + 'assimp/code/glTF2/**', 'assimp/code/AssetLib/glTF/**', + 'assimp/code/AssetLib/glTF2/**', 'assimp/code/AssetLib/MDL/**', 'assimp/code/AssetLib/MD2/**', 'assimp/code/AssetLib/MD3/**', @@ -63,7 +64,7 @@ project 'assimp' 'ASSIMP_BUILD_NO_CSM_IMPORTER', 'ASSIMP_BUILD_NO_DXF_IMPORTER', -- 'ASSIMP_BUILD_NO_FBX_IMPORTER', - 'ASSIMP_BUILD_NO_GLTF_IMPORTER', + -- 'ASSIMP_BUILD_NO_GLTF_IMPORTER', 'ASSIMP_BUILD_NO_HMP_IMPORTER', 'ASSIMP_BUILD_NO_IFC_IMPORTER', 'ASSIMP_BUILD_NO_IRR_IMPORTER', diff --git a/Nuake/src/Rendering/Textures/Material.cpp b/Nuake/src/Rendering/Textures/Material.cpp index 71f4e2ee..3901cebb 100644 --- a/Nuake/src/Rendering/Textures/Material.cpp +++ b/Nuake/src/Rendering/Textures/Material.cpp @@ -86,8 +86,8 @@ namespace Nuake void Material::Bind(Ref shader) { - if (MaterialManager::Get()->CurrentlyBoundedMaterial == m_Name) - return; + //if (MaterialManager::Get()->CurrentlyBoundedMaterial == m_Name) + // return; MaterialManager::Get()->CurrentlyBoundedMaterial = m_Name; glBindBuffer(GL_UNIFORM_BUFFER, UBO); diff --git a/Nuake/src/Rendering/Textures/Texture.cpp b/Nuake/src/Rendering/Textures/Texture.cpp index 59245392..8048168f 100644 --- a/Nuake/src/Rendering/Textures/Texture.cpp +++ b/Nuake/src/Rendering/Textures/Texture.cpp @@ -38,6 +38,7 @@ namespace Nuake Texture::Texture(glm::vec2 size, GLenum format) { + m_RendererId = 0; m_Format = format; m_Width = size.x; @@ -51,8 +52,35 @@ namespace Nuake //glGenerateMipmap(GL_TEXTURE_2D); } + Texture::Texture(Vector2 size, unsigned char* data, int len) + { + m_RendererId = 0; + m_Width = size.x; + m_Height = size.y; + int channels = 0; + m_LocalBuffer = stbi_load_from_memory(data, len, &m_Width, &m_Height, &channels, 0); + glGenTextures(1, &m_RendererId); + glBindTexture(GL_TEXTURE_2D, m_RendererId); + glGenerateMipmap(GL_TEXTURE_2D); + //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, -1.0f); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_Width, m_Height, 0, GL_RGB, GL_UNSIGNED_BYTE, m_LocalBuffer); + glGenerateMipmap(GL_TEXTURE_2D); + + if (m_LocalBuffer) + stbi_image_free(m_LocalBuffer); + else + std::cout << "Error: failed to load texture buffer " << std::endl; + } + Texture::Texture(glm::vec2 size, msdfgen::BitmapConstRef& bitmap, bool t) { + m_RendererId = 0; m_Width = size.x; m_Height = size.y; @@ -69,6 +97,7 @@ namespace Nuake void Texture::Resize(glm::vec2 size) { + glDeleteTextures(1, &m_RendererId); m_Width = size.x; m_Height = size.y; diff --git a/Nuake/src/Rendering/Textures/Texture.h b/Nuake/src/Rendering/Textures/Texture.h index 714e9128..51f74434 100644 --- a/Nuake/src/Rendering/Textures/Texture.h +++ b/Nuake/src/Rendering/Textures/Texture.h @@ -1,4 +1,5 @@ #pragma once + #include "stb_image/stb_image.h" #include #include "src/Core/Maths.h" @@ -24,7 +25,7 @@ namespace Nuake Texture(const std::string& path); Texture(glm::vec2 size, msdfgen::BitmapConstRef& bitmap, bool t); Texture(glm::vec2 size, GLenum format); - + Texture(Vector2 size, unsigned char* data, int len); ~Texture(); void Resize(glm::vec2 size); diff --git a/Nuake/src/Scene/Components/MeshComponent.cpp b/Nuake/src/Scene/Components/MeshComponent.cpp index 99842540..a7b85bce 100644 --- a/Nuake/src/Scene/Components/MeshComponent.cpp +++ b/Nuake/src/Scene/Components/MeshComponent.cpp @@ -10,8 +10,15 @@ namespace Nuake { this->meshes.clear(); Assimp::Importer import; import.SetPropertyFloat("PP_GSN_MAX_SMOOTHING_ANGLE", 90); - const aiScene* scene = import.ReadFile(FileSystem::Root + ModelPath, aiProcess_Triangulate |aiProcess_FixInfacingNormals | aiProcess_CalcTangentSpace); - + const aiScene* scene = import.ReadFile(FileSystem::Root + ModelPath, aiProcess_Triangulate | aiProcess_GenSmoothNormals | aiProcess_FixInfacingNormals | aiProcess_CalcTangentSpace); + if (scene->HasTextures()) + { + int textureCount = scene->mNumTextures; + for (unsigned int i = 0; i < textureCount; i++) + { + scene->mTextures[i]; + } + } if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) { Logger::Log("ASSIMP! Failed to load model" + std::string(import.GetErrorString()), CRITICAL); @@ -92,10 +99,23 @@ namespace Nuake { if (mesh->mMaterialIndex >= 0) { aiMaterial* material = scene->mMaterials[mesh->mMaterialIndex]; + Ref newMaterial = MaterialManager::Get()->GetMaterial(material->GetName().C_Str()); + aiString str; - std::string directory = FileSystem::Root + "/textures/d3b_concrt02a.png"; + + unsigned int textureCount = material->GetTextureCount(aiTextureType_DIFFUSE); material->GetTexture(aiTextureType_DIFFUSE, 0, &str); - Ref newMaterial = MaterialManager::Get()->GetMaterial(directory); + + // Embedded texture + if (String::BeginsWith(str.C_Str(), "*")) + { + int textureIndex = std::atoi(String::Split(str.C_Str(), '*')[1].c_str()); + const aiTexture* texture = scene->GetEmbeddedTexture(str.C_Str()); + + Ref newTexture = CreateRef(Vector2(texture->mWidth, texture->mHeight), (unsigned char*)texture->pcData, texture->mWidth); + newMaterial->SetAlbedo(newTexture); + } + //material->GetTexture(aiTextureType_NORMALS, 0, &str); //newMaterial->SetNormal(TextureManager::Get()->GetTexture(directory + str.C_Str())); diff --git a/Nuake/src/Scene/Scene.cpp b/Nuake/src/Scene/Scene.cpp index a2d9eddb..6fc69cc5 100644 --- a/Nuake/src/Scene/Scene.cpp +++ b/Nuake/src/Scene/Scene.cpp @@ -42,8 +42,8 @@ namespace Nuake { m_Interfaces = std::vector>(); // Adding systems - Order is important - m_Systems.push_back(CreateRef(this)); m_Systems.push_back(CreateRef(this)); + m_Systems.push_back(CreateRef(this)); m_Systems.push_back(CreateRef(this)); } @@ -156,21 +156,22 @@ namespace Nuake { void Scene::DrawShadows() { + glEnable(GL_DEPTH_TEST); auto meshView = m_Registry.view(); auto quakeView = m_Registry.view(); auto view = m_Registry.view(); Ref cam = m_EditorCamera; - if (Engine::IsPlayMode) - { - auto view = m_Registry.view(); - for (auto e : view) - { - auto [transform, camera] = view.get(e); - cam = camera.CameraInstance; - break; - } - } + //if (Engine::IsPlayMode) + //{ + // auto view = m_Registry.view(); + // for (auto e : view) + // { + // auto [transform, camera] = view.get(e); + // cam = camera.CameraInstance; + // break; + // } + //} Ref shadowShader = ShaderManager::GetShader("resources/Shaders/shadowMap.shader"); shadowShader->Bind(); @@ -186,7 +187,6 @@ namespace Nuake { light.CalculateViewProjection(cam->GetTransform(), cam->GetPerspective()); - for (int i = 0; i < CSM_AMOUNT; i++) { light.m_Framebuffers[i]->Bind(); @@ -224,7 +224,6 @@ namespace Nuake { Renderer::Flush(shadowShader, true); light.m_Framebuffers[i]->Unbind(); } - } } diff --git a/Nuake/src/Scripting/Modules/SceneModule.h b/Nuake/src/Scripting/Modules/SceneModule.h index 9c733990..ad18e161 100644 --- a/Nuake/src/Scripting/Modules/SceneModule.h +++ b/Nuake/src/Scripting/Modules/SceneModule.h @@ -33,6 +33,8 @@ namespace Nuake { RegisterMethod("GetTranslation_(_)", (void*)GetTranslation); RegisterMethod("SetTranslation_(_,_,_,_)", (void*)SetTranslation); + RegisterMethod("GetRotation_(_)", (void*)GetRotation); + RegisterMethod("SetRotation_(_,_,_,_)", (void*)SetRotation); RegisterMethod("SetLightIntensity_(_,_)", (void*)SetLightIntensity); RegisterMethod("GetLightIntensity_(_)", (void*)GetLightIntensity); @@ -234,6 +236,36 @@ namespace Nuake { wrenInsertInList(vm, 0, 2, 3); } + static void GetRotation(WrenVM* vm) + { + int handle = wrenGetSlotDouble(vm, 1); + Entity ent = Entity((entt::entity)handle, Engine::GetCurrentScene().get()); + auto& transform = ent.GetComponent(); + // set the slots + wrenSetSlotDouble(vm, 1, transform.Rotation.x); + wrenSetSlotDouble(vm, 2, transform.Rotation.y); + wrenSetSlotDouble(vm, 3, transform.Rotation.z); + + // Fill the list + wrenSetSlotNewList(vm, 0); + wrenInsertInList(vm, 0, 0, 1); + wrenInsertInList(vm, 0, 1, 2); + wrenInsertInList(vm, 0, 2, 3); + } + + static void SetRotation(WrenVM* vm) + { + int handle = wrenGetSlotDouble(vm, 1); + Entity ent = Entity((entt::entity)handle, Engine::GetCurrentScene().get()); + auto& transform = ent.GetComponent(); + // set the slots + float x = wrenGetSlotDouble(vm, 2); + float y = wrenGetSlotDouble(vm, 3); + float z = wrenGetSlotDouble(vm, 4); + + transform.Rotation = Vector3(x, y, z); + } + static void SetTranslation(WrenVM* vm) { int handle = wrenGetSlotDouble(vm, 1); diff --git a/Nuake/src/Window.cpp b/Nuake/src/Window.cpp index e07b39f9..387d2ac6 100644 --- a/Nuake/src/Window.cpp +++ b/Nuake/src/Window.cpp @@ -315,7 +315,7 @@ namespace Nuake { Renderer::DrawQuad(Matrix4()); } m_DeferredBuffer->Unbind(); - + glEnable(GL_DEPTH_TEST); Renderer::EndDraw(); }