fix environment texture drag to viewport didn't create SkylightComponent; fix PhysicsWrappers::CreateConvexMesh collier worng scale;some tweaks

This commit is contained in:
2026-03-09 01:03:35 +08:00
parent c1bb8f9fba
commit eb0a463370
10 changed files with 54 additions and 49 deletions

View File

@ -606,28 +606,39 @@ namespace Prism
if (ImGui::BeginDragDropTarget()) if (ImGui::BeginDragDropTarget())
{ {
auto payload = ImGui::AcceptDragDropPayload("asset_payload"); if (auto payload = ImGui::AcceptDragDropPayload("asset_payload"))
if (payload)
{ {
int count = payload->DataSize / sizeof(AssetHandle); int count = payload->DataSize / sizeof(AssetHandle);
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
AssetHandle assetHandle = *(((AssetHandle*)payload->Data) + i); AssetHandle assetHandle = *(static_cast<AssetHandle*>(payload->Data) + i);
Ref<Asset> asset = AssetsManager::GetAsset<Asset>(assetHandle); Ref<Asset> asset = AssetsManager::GetAsset<Asset>(assetHandle);
// We can't really support dragging and dropping scenes when we're dropping multiple assets
if (count == 1 && asset->Type == AssetType::Scene) if (count == 1 && asset->Type == AssetType::Scene)
{ {
OpenScene(asset->FilePath); OpenScene(asset->FilePath);
break;
} }
if (asset->Type == AssetType::Mesh) switch (asset->Type)
{
case AssetType::Mesh:
{ {
Entity entity = m_EditorScene->CreateEntity(asset->FileName); Entity entity = m_EditorScene->CreateEntity(asset->FileName);
entity.AddComponent<MeshComponent>(Ref<Mesh>(asset)); entity.AddComponent<MeshComponent>(Ref<Mesh>(asset));
SelectEntity(entity); SelectEntity(entity);
break;
} }
case AssetType::EnvMap:
{
Entity entity = m_EditorScene->CreateEntity(asset->FileName);
entity.AddComponent<SkyLightComponent>(Ref<Environment>(asset));
SelectEntity(entity);
break;
}
}
} }
} }
ImGui::EndDragDropTarget(); ImGui::EndDragDropTarget();

View File

@ -145,7 +145,7 @@ namespace Prism
if (!asset->Extension.empty()) if (!asset->Extension.empty())
metaFileName += "." + asset->Extension; metaFileName += "." + asset->Extension;
FileSystem::Rename(oldFilePath + ".meta", metaFileName); FileSystem::PrismDeleteFile(oldFilePath + ".meta");
AssetSerializer::CreateMetaFile(asset); AssetSerializer::CreateMetaFile(asset);
} }
} }
@ -204,6 +204,7 @@ namespace Prism
s_LoadedAssets[asset->Handle] = asset; s_LoadedAssets[asset->Handle] = asset;
AssetSerializer::SerializeAsset(asset); AssetSerializer::SerializeAsset(asset);
AssetSerializer::CreateMetaFile(asset);
return asset; return asset;
} }
@ -255,6 +256,7 @@ namespace Prism
s_LoadedAssets[asset->Handle] = asset; s_LoadedAssets[asset->Handle] = asset;
AssetSerializer::SerializeAsset(asset); AssetSerializer::SerializeAsset(asset);
AssetSerializer::CreateMetaFile(asset);
return asset; return asset;
} }
@ -308,7 +310,6 @@ namespace Prism
const AssetType type = AssetTypes::GetAssetTypeFromExtension(extension); const AssetType type = AssetTypes::GetAssetTypeFromExtension(extension);
Ref<Asset> asset = AssetSerializer::LoadAssetInfo(filepath, parentHandle, type); Ref<Asset> asset = AssetSerializer::LoadAssetInfo(filepath, parentHandle, type);
if (s_LoadedAssets.find(asset->Handle) != s_LoadedAssets.end()) if (s_LoadedAssets.find(asset->Handle) != s_LoadedAssets.end())
{ {
if (s_LoadedAssets[asset->Handle]->IsDataLoaded) if (s_LoadedAssets[asset->Handle]->IsDataLoaded)

View File

@ -2,14 +2,12 @@
// Created by sfd on 25-11-15. // Created by sfd on 25-11-15.
// //
#include "pmpch.h"
#include "Log.h" #include "Log.h"
#include <filesystem> #include <filesystem>
#include "spdlog/sinks/basic_file_sink.h" #include "spdlog/sinks/basic_file_sink.h"
#include "spdlog/sinks/stdout_color_sinks-inl.h" #include "spdlog/sinks/stdout_color_sinks-inl.h"
#include "spdlog/sinks/stdout_sinks.h"
#ifdef _DEBUG #ifdef _DEBUG
#define LOG_LEVEL spdlog::level::trace #define LOG_LEVEL spdlog::level::trace
@ -30,29 +28,23 @@ namespace Prism
std::vector<spdlog::sink_ptr> prismSinks = std::vector<spdlog::sink_ptr> prismSinks =
{ {
std::make_shared<spdlog::sinks::stdout_sink_mt>(), std::make_shared<spdlog::sinks::stdout_color_sink_mt>(),
std::make_shared<spdlog::sinks::basic_file_sink_mt>("logs/PRISM.log", true) std::make_shared<spdlog::sinks::basic_file_sink_mt>("logs/PRISM.log", true)
}; };
std::vector<spdlog::sink_ptr> appSinks = std::vector<spdlog::sink_ptr> appSinks =
{ {
std::make_shared<spdlog::sinks::stdout_sink_mt>(), std::make_shared<spdlog::sinks::stdout_color_sink_mt>(),
std::make_shared<spdlog::sinks::basic_file_sink_mt>("logs/APP.log", true) std::make_shared<spdlog::sinks::basic_file_sink_mt>("logs/APP.log", true)
}; };
s_CoreLogger = std::make_shared<spdlog::logger>("PRISM", prismSinks.begin(), prismSinks.end()); s_CoreLogger = std::make_shared<spdlog::logger>("PRISM", prismSinks.begin(), prismSinks.end());
s_CoreLogger->set_level(LOG_LEVEL); s_CoreLogger->set_level(LOG_LEVEL);
s_CoreLogger->set_pattern("%^[%Y-%m-%d %H:%M:%S.%e] [%l] %v%$");
s_ClientLogger = std::make_shared<spdlog::logger>("APP", appSinks.begin(), appSinks.end()); s_ClientLogger = std::make_shared<spdlog::logger>("APP", appSinks.begin(), appSinks.end());
s_ClientLogger->set_level(LOG_LEVEL); s_ClientLogger->set_level(LOG_LEVEL);
/* s_CoreLogger->set_pattern("%^[%Y-%m-%d %H:%M:%S.%e] [%l] %v%$");
spdlog::set_pattern("%^[%T] [%n]%v%$");
s_CoreLogger = spdlog::stdout_color_mt("PRISM");
s_CoreLogger->set_level(LOG_LEVEL);
s_ClientLogger = spdlog::stdout_color_mt("APP");
s_ClientLogger->set_level(LOG_LEVEL);
*/
} }
void Log::Shutdown() void Log::Shutdown()

View File

@ -26,18 +26,18 @@ namespace Prism
} }
#define PM_CORE_TRACE(...) ::Prism::Log::GetCoreLogger()->trace("[TRACE]: " __VA_ARGS__) #define PM_CORE_TRACE(...) ::Prism::Log::GetCoreLogger()->trace(__VA_ARGS__)
#define PM_CORE_DEBUG(...) ::Prism::Log::GetCoreLogger()->debug("[DEBUG]: " __VA_ARGS__) #define PM_CORE_DEBUG(...) ::Prism::Log::GetCoreLogger()->debug( __VA_ARGS__)
#define PM_CORE_INFO(...) ::Prism::Log::GetCoreLogger()->info("[INFO]: " __VA_ARGS__) #define PM_CORE_INFO(...) ::Prism::Log::GetCoreLogger()->info(__VA_ARGS__)
#define PM_CORE_WARN(...) ::Prism::Log::GetCoreLogger()->warn("[WARN]: " __VA_ARGS__) #define PM_CORE_WARN(...) ::Prism::Log::GetCoreLogger()->warn(__VA_ARGS__)
#define PM_CORE_ERROR(...) ::Prism::Log::GetCoreLogger()->error("[ERROR]: " __VA_ARGS__) #define PM_CORE_ERROR(...) ::Prism::Log::GetCoreLogger()->error(__VA_ARGS__)
#define PM_CORE_FATAL(...) ::Prism::Log::GetCoreLogger()->critical("[FATAL]: " __VA_ARGS__) #define PM_CORE_FATAL(...) ::Prism::Log::GetCoreLogger()->critical(__VA_ARGS__)
#define PM_CLIENT_TRACE(...) ::Prism::Log::GetClientLogger()->trace("[TRACE]: " __VA_ARGS__) #define PM_CLIENT_TRACE(...) ::Prism::Log::GetClientLogger()->trace(__VA_ARGS__)
#define PM_CLIENT_DEBUG(...) ::Prism::Log::GetClientLogger()->debug("[DEBUG]: " __VA_ARGS__) #define PM_CLIENT_DEBUG(...) ::Prism::Log::GetClientLogger()->debug(__VA_ARGS__)
#define PM_CLIENT_INFO(...) ::Prism::Log::GetClientLogger()->info("[INFO]: " __VA_ARGS__) #define PM_CLIENT_INFO(...) ::Prism::Log::GetClientLogger()->info(__VA_ARGS__)
#define PM_CLIENT_WARN(...) ::Prism::Log::GetClientLogger()->warn("[WARN]: " __VA_ARGS__) #define PM_CLIENT_WARN(...) ::Prism::Log::GetClientLogger()->warn(__VA_ARGS__)
#define PM_CLIENT_ERROR(...) ::Prism::Log::GetClientLogger()->error("[ERROR]: " __VA_ARGS__) #define PM_CLIENT_ERROR(...) ::Prism::Log::GetClientLogger()->error(__VA_ARGS__)
#define PM_CLIENT_FATAL(...) ::Prism::Log::GetClientLogger()->critical("[FATAL]: " __VA_ARGS__) #define PM_CLIENT_FATAL(...) ::Prism::Log::GetClientLogger()->critical(__VA_ARGS__)
#endif //LOG_H #endif //LOG_H

View File

@ -9,8 +9,6 @@
#include <cstdint> #include <cstdint>
#include <type_traits> #include <type_traits>
#include "Log.h"
namespace Prism namespace Prism
{ {
class PRISM_API RefCounted class PRISM_API RefCounted
@ -143,9 +141,6 @@ namespace Prism
if (m_Instance) if (m_Instance)
{ {
m_Instance->IncRefCount(); m_Instance->IncRefCount();
// PM_CORE_DEBUG("{");
// PM_CORE_DEBUG("{0}:{1}: +{2}",(uint64_t)(&m_Instance), typeid(*m_Instance).name(), m_Instance->GetRefCount());
// if (m_Instance->GetRefCount() >= 1000) PM_CORE_ASSERT(false);
} }
} }
@ -154,11 +149,8 @@ namespace Prism
if (m_Instance) if (m_Instance)
{ {
m_Instance->DecRefCount(); m_Instance->DecRefCount();
// PM_CORE_DEBUG("{0}:{1}: -{2}",(uint64_t)(&m_Instance), typeid(*m_Instance).name(), m_Instance->GetRefCount());
// PM_CORE_DEBUG("}");
if (m_Instance->GetRefCount() == 0) if (m_Instance->GetRefCount() == 0)
{ {
// PM_CORE_DEBUG("{0}:{1}: delete",(uint64_t)(&m_Instance), typeid(*m_Instance).name());
delete m_Instance; delete m_Instance;
} }
} }

View File

@ -24,7 +24,7 @@ namespace Prism
m_FocalPoint = glm::vec3(0.0f); m_FocalPoint = glm::vec3(0.0f);
glm::vec3 position = { -5, 5, 5}; constexpr glm::vec3 position = { -5, 5, 5};
m_Distance = glm::distance(position, m_FocalPoint); m_Distance = glm::distance(position, m_FocalPoint);
m_Yaw = 3.0f * (float)M_PI / 4.0f; m_Yaw = 3.0f * (float)M_PI / 4.0f;
@ -57,7 +57,6 @@ namespace Prism
m_InitialMousePosition = { Input::GetMouseX(), Input::GetMouseY() }; m_InitialMousePosition = { Input::GetMouseX(), Input::GetMouseY() };
m_IsRightButtonDownState = true; m_IsRightButtonDownState = true;
m_FreeLookActive = true; m_FreeLookActive = true;
m_FreeLookPosition = m_Position;
m_Velocity = glm::vec3(0.0f); m_Velocity = glm::vec3(0.0f);
} }
@ -88,11 +87,11 @@ namespace Prism
// m_Velocity *= (1.0f - m_Damping * deltaTime); // m_Velocity *= (1.0f - m_Damping * deltaTime);
m_FreeLookPosition += m_Velocity * deltaTime.GetSeconds(); m_Position += m_Velocity * deltaTime.GetSeconds();
// --------------------------------- // ---------------------------------
glm::quat orientation = GetOrientation(); glm::quat orientation = GetOrientation();
m_ViewMatrix = glm::translate(glm::mat4(1.0f), m_FreeLookPosition) * glm::toMat4(orientation); m_ViewMatrix = glm::translate(glm::mat4(1.0f), m_Position) * glm::toMat4(orientation);
m_ViewMatrix = glm::inverse(m_ViewMatrix); m_ViewMatrix = glm::inverse(m_ViewMatrix);
m_Rotation = glm::eulerAngles(orientation) * (180.0f / (float)M_PI); m_Rotation = glm::eulerAngles(orientation) * (180.0f / (float)M_PI);
return; return;
@ -105,7 +104,6 @@ namespace Prism
m_IsRightButtonDownState = false; m_IsRightButtonDownState = false;
if (m_FreeLookActive) if (m_FreeLookActive)
{ {
m_Position = m_FreeLookPosition;
m_FocalPoint = m_Position + GetForwardDirection() * m_Distance; m_FocalPoint = m_Position + GetForwardDirection() * m_Distance;
m_FreeLookActive = false; m_FreeLookActive = false;
} }

View File

@ -84,7 +84,6 @@ namespace Prism
bool m_IsAltKeyDownState = false; bool m_IsAltKeyDownState = false;
bool m_FreeLookActive; bool m_FreeLookActive;
glm::vec3 m_FreeLookPosition;
glm::vec3 m_Velocity = glm::vec3(0.0f); // 当前速度 glm::vec3 m_Velocity = glm::vec3(0.0f); // 当前速度
float m_MaxSpeed = 20.0f; // 最大移动速度(单位/秒) float m_MaxSpeed = 20.0f; // 最大移动速度(单位/秒)

View File

@ -449,11 +449,17 @@ namespace Prism
continue; continue;
} }
auto convexGeometry = physx::PxConvexMeshGeometry(convexMesh, physx::PxMeshScale(ToPhysXVector(scale)));
glm::vec3 submeshTranslation, submeshRotation, submeshScale;
Math::DecomposeTransform(submesh.Transform, submeshTranslation, submeshRotation, submeshScale);
auto convexGeometry = physx::PxConvexMeshGeometry( convexMesh, physx::PxMeshScale(ToPhysXVector(submeshScale * scale)) );
convexGeometry.meshFlags = physx::PxConvexMeshGeometryFlag::eTIGHT_BOUNDS; convexGeometry.meshFlags = physx::PxConvexMeshGeometryFlag::eTIGHT_BOUNDS;
physx::PxMaterial* material = s_Physics->createMaterial(0, 0, 0); // Dummy material, will be replaced at runtime. physx::PxMaterial* material = s_Physics->createMaterial(0, 0, 0); // Dummy material, will be replaced at runtime.
physx::PxShape* shape = s_Physics->createShape(convexGeometry, *material, true); physx::PxShape* shape = s_Physics->createShape(convexGeometry, *material, true);
shape->setLocalPose(ToPhysXTransform(submesh.Transform)); shape->setLocalPose(ToPhysXTransform(submeshTranslation, submeshRotation));
shapes.push_back(shape); shapes.push_back(shape);
@ -499,7 +505,9 @@ namespace Prism
} }
} }
collider.ProcessedMeshes.push_back(Ref<Mesh>::Create(collisionVertices, collisionIndices, FromPhysXTransform(shape->getLocalPose()))); glm::mat4 scale_mat = glm::scale(glm::mat4(1.0f), *(glm::vec3*)&convexGeometry.scale.scale);
glm::mat4 transform = FromPhysXTransform(shape->getLocalPose()) * scale_mat;
collider.ProcessedMeshes.push_back(Ref<Mesh>::Create(collisionVertices, collisionIndices, transform));
} }
} }

View File

@ -50,7 +50,7 @@ namespace Prism
float CurrentExposure = 1.0f; float CurrentExposure = 1.0f;
bool EnableAutoExposure = true; bool EnableAutoExposure = true;
float Key = 0.18f; // middle gray float Key = 0.11f; // middle gray
float AdaptationSpeed = 5.0f; // stops per second float AdaptationSpeed = 5.0f; // stops per second
Timer ExposureTimer; Timer ExposureTimer;

View File

@ -284,6 +284,10 @@ namespace Prism
float Intensity = 1.0f; float Intensity = 1.0f;
float Angle = 0.0f; float Angle = 0.0f;
SkyLightComponent(const Ref<Environment>& environment)
: SceneEnvironment(environment)
{
}
SkyLightComponent() SkyLightComponent()
: SceneEnvironment(Ref<Environment>::Create()) : SceneEnvironment(Ref<Environment>::Create())
{ {