feat: basic shadow map + renderdoc labels
This commit is contained in:
+110
-98
@@ -153,65 +153,65 @@ void LightKeeper::customInit()
|
||||
characterModelOptions.loadSkeleton = true;
|
||||
characterModelOptions.loadAnimations = true;
|
||||
|
||||
// auto charModel = ModelDoc::LoadModel(
|
||||
// AssetFS::GetInstance().GetFullPath("engine://cotw-capybara-male/source/capybara.fbx").generic_string(),
|
||||
// characterModelOptions
|
||||
// );
|
||||
// ModelDocUtils::LogModelDocSummary(charModel, "capybara.fbx");
|
||||
//
|
||||
// const auto& charPrimitive = ModelDocUtils::GetFirstSkinnedPrimitiveOrFirstOrThrow(
|
||||
// charModel,
|
||||
// "engine://cotw-capybara-male/source/capybara.fbx"
|
||||
// );
|
||||
//
|
||||
// const auto charMeshID = resources.meshes().addMesh(gfxDevice, charPrimitive.mesh);
|
||||
//
|
||||
// const auto charTexturePath = ModelDocUtils::PickTexturePath(
|
||||
// charModel,
|
||||
// charPrimitive,
|
||||
// AssetFS::GetInstance().GetFullPath(
|
||||
// "engine://cotw-capybara-male/textures/capybara_male_light_brown_dif.ddsc.DECA.RE.pngballs")
|
||||
// );
|
||||
//
|
||||
// const auto charTextureID = resources.loadImageFromFile(gfxDevice, charTexturePath);
|
||||
// // const auto charTextureID = gfxDevice.loadImageFromFile(AssetFS::GetInstance().GetFullPath("engine://char.jpg"));
|
||||
// const auto charMaterialID = resources.materials().addMaterial({
|
||||
// .baseColor = ModelDocUtils::GetImportedBaseColor(
|
||||
// charModel, charPrimitive),
|
||||
// .diffuseTexture = charTextureID,
|
||||
// .name = ModelDocUtils::GetImportedMaterialName(
|
||||
// charModel, charPrimitive, "CharacterMaterial"),
|
||||
// });
|
||||
//
|
||||
// const auto charMeshComp = CharObj->AddComponent<MeshRendererComponent>();
|
||||
// charMeshComp->SetMeshID(charMeshID);
|
||||
// charMeshComp->SetMaterialID(charMaterialID);
|
||||
//
|
||||
// const auto animator = CharObj->AddComponent<Animator>();
|
||||
// animator->setSkeleton(std::move(charModel.skeleton));
|
||||
//
|
||||
// std::string firstAnimationName;
|
||||
//
|
||||
// for (auto& clip : charModel.animations)
|
||||
// {
|
||||
// spdlog::info("Loaded animation: '{}' ({:.2f}s)", clip.name, clip.duration);
|
||||
//
|
||||
// if (firstAnimationName.empty())
|
||||
// firstAnimationName = clip.name;
|
||||
//
|
||||
// animator->addClip(std::make_shared<SkeletalAnimation>(std::move(clip)));
|
||||
// }
|
||||
//
|
||||
// if (!firstAnimationName.empty())
|
||||
// {
|
||||
// spdlog::info("Playing animation: '{}'", firstAnimationName);
|
||||
// animator->play(firstAnimationName);
|
||||
// }
|
||||
//
|
||||
// animator->play("capybara_canter_fwd_01|capybara_canter_fwd_01|run");
|
||||
//
|
||||
// CharObj->GetTransform().SetWorldPosition(glm::vec3(0.f, 0.f, 0.f));
|
||||
// CharObj->GetTransform().SetWorldScale(0.01f, 0.01f, 0.01f);
|
||||
auto charModel = ModelDoc::LoadModel(
|
||||
AssetFS::GetInstance().GetFullPath("engine://cotw-capybara-male/source/capybara.fbx").generic_string(),
|
||||
characterModelOptions
|
||||
);
|
||||
ModelDocUtils::LogModelDocSummary(charModel, "capybara.fbx");
|
||||
|
||||
const auto& charPrimitive = ModelDocUtils::GetFirstSkinnedPrimitiveOrFirstOrThrow(
|
||||
charModel,
|
||||
"engine://cotw-capybara-male/source/capybara.fbx"
|
||||
);
|
||||
|
||||
const auto charMeshID = resources.meshes().addMesh(gfxDevice, charPrimitive.mesh);
|
||||
|
||||
const auto charTexturePath = ModelDocUtils::PickTexturePath(
|
||||
charModel,
|
||||
charPrimitive,
|
||||
AssetFS::GetInstance().GetFullPath(
|
||||
"engine://cotw-capybara-male/textures/capybara_male_light_brown_dif.ddsc.DECA.RE.pngballs")
|
||||
);
|
||||
|
||||
const auto charTextureID = resources.loadImageFromFile(gfxDevice, charTexturePath);
|
||||
// const auto charTextureID = gfxDevice.loadImageFromFile(AssetFS::GetInstance().GetFullPath("engine://char.jpg"));
|
||||
const auto charMaterialID = resources.materials().addMaterial({
|
||||
.baseColor = ModelDocUtils::GetImportedBaseColor(
|
||||
charModel, charPrimitive),
|
||||
.diffuseTexture = charTextureID,
|
||||
.name = ModelDocUtils::GetImportedMaterialName(
|
||||
charModel, charPrimitive, "CharacterMaterial"),
|
||||
});
|
||||
|
||||
const auto charMeshComp = CharObj->AddComponent<MeshRendererComponent>();
|
||||
charMeshComp->SetMeshID(charMeshID);
|
||||
charMeshComp->SetMaterialID(charMaterialID);
|
||||
|
||||
const auto animator = CharObj->AddComponent<Animator>();
|
||||
animator->setSkeleton(std::move(charModel.skeleton));
|
||||
|
||||
std::string firstAnimationName;
|
||||
|
||||
for (auto& clip : charModel.animations)
|
||||
{
|
||||
spdlog::info("Loaded animation: '{}' ({:.2f}s)", clip.name, clip.duration);
|
||||
|
||||
if (firstAnimationName.empty())
|
||||
firstAnimationName = clip.name;
|
||||
|
||||
animator->addClip(std::make_shared<SkeletalAnimation>(std::move(clip)));
|
||||
}
|
||||
|
||||
if (!firstAnimationName.empty())
|
||||
{
|
||||
spdlog::info("Playing animation: '{}'", firstAnimationName);
|
||||
animator->play(firstAnimationName);
|
||||
}
|
||||
|
||||
animator->play("capybara_canter_fwd_01|capybara_canter_fwd_01|run");
|
||||
|
||||
CharObj->GetTransform().SetWorldPosition(glm::vec3(0.f, 0.f, 0.f));
|
||||
CharObj->GetTransform().SetWorldScale(0.01f, 0.01f, 0.01f);
|
||||
|
||||
// ModelDoc::LoadOptions options{};
|
||||
// options.meshImportMode = ModelDoc::MeshImportMode::MergedPerNode;
|
||||
@@ -450,46 +450,58 @@ void LightKeeper::customInit()
|
||||
triggerObj->GetTransform().SetWorldPosition({0.0f, 0.0f, 0.0f});
|
||||
|
||||
// Forward+ test lights: a dim sun and a ring of colored point lights orbiting the origin
|
||||
auto sunObj = scene.CreateGameObject("Sun");
|
||||
auto* sun = sunObj->AddComponent<LightComponent>(LightType::Directional);
|
||||
sun->SetColor(glm::vec3{1.0f, 0.95f, 0.85f});
|
||||
sun->SetIntensity(1.0f);
|
||||
sunObj->GetTransform().SetWorldRotation(glm::vec3{-50.0f, 30.0f, 0.0f});
|
||||
// auto sunObj = scene.CreateGameObject("Sun");
|
||||
// auto* sun = sunObj->AddComponent<LightComponent>(LightType::Directional);
|
||||
// sun->SetColor(glm::vec3{1.0f, 0.95f, 0.85f});
|
||||
// sun->SetIntensity(1.0f);
|
||||
// sun->SetCastShadows(true);
|
||||
// sunObj->GetTransform().SetWorldRotation(glm::vec3{-50.0f, 30.0f, 0.0f});
|
||||
//
|
||||
// // static shadow casters, so the sun's shadows are visible without spawning balls
|
||||
// for (int i = 0; i < 3; i++)
|
||||
// {
|
||||
// auto casterObj = scene.CreateGameObject("ShadowCaster " + std::to_string(i));
|
||||
// auto* casterMesh = casterObj->AddComponent<MeshRendererComponent>();
|
||||
// casterMesh->SetMeshID(sphereMesh);
|
||||
// casterMesh->SetMaterialID(sphereMaterial);
|
||||
// casterObj->GetTransform().SetWorldPosition(glm::vec3{-4.0f + 4.0f * static_cast<float>(i), 0.5f, 3.0f});
|
||||
// casterObj->GetTransform().SetWorldScale(glm::vec3{0.015f});
|
||||
// }
|
||||
//
|
||||
// constexpr int pointLightCount = 32;
|
||||
// constexpr float pointLightRingRadius = 6.0f;
|
||||
// for (int i = 0; i < pointLightCount; i++)
|
||||
// {
|
||||
// const float t = static_cast<float>(i) / static_cast<float>(pointLightCount);
|
||||
// const float angle = t * glm::two_pi<float>();
|
||||
//
|
||||
// auto lightObj = scene.CreateGameObject("PointLight " + std::to_string(i));
|
||||
// lightObj->GetTransform().SetWorldPosition(glm::vec3{
|
||||
// std::cos(angle) * pointLightRingRadius,
|
||||
// -0.25f,
|
||||
// std::sin(angle) * pointLightRingRadius
|
||||
// });
|
||||
//
|
||||
// auto* light = lightObj->AddComponent<LightComponent>(LightType::Point);
|
||||
// light->SetColor(glm::vec3{
|
||||
// 0.5f + 0.5f * std::cos(glm::two_pi<float>() * t),
|
||||
// 0.5f + 0.5f * std::cos(glm::two_pi<float>() * (t + 0.33f)),
|
||||
// 0.5f + 0.5f * std::cos(glm::two_pi<float>() * (t + 0.67f))
|
||||
// });
|
||||
// light->SetIntensity(1.0f);
|
||||
// light->SetRange(3.0f);
|
||||
//
|
||||
// auto* orbit = lightObj->AddComponent<Rotator>(pointLightRingRadius, 0.5f);
|
||||
// orbit->SetAxis(glm::vec3{0.0f, 1.0f, 0.0f});
|
||||
// orbit->SetPivotPosition(glm::vec3{0.0f, -0.25f, 0.0f});
|
||||
// }
|
||||
|
||||
constexpr int pointLightCount = 32;
|
||||
constexpr float pointLightRingRadius = 6.0f;
|
||||
for (int i = 0; i < pointLightCount; i++)
|
||||
{
|
||||
const float t = static_cast<float>(i) / static_cast<float>(pointLightCount);
|
||||
const float angle = t * glm::two_pi<float>();
|
||||
|
||||
auto lightObj = scene.CreateGameObject("PointLight " + std::to_string(i));
|
||||
lightObj->GetTransform().SetWorldPosition(glm::vec3{
|
||||
std::cos(angle) * pointLightRingRadius,
|
||||
-0.25f,
|
||||
std::sin(angle) * pointLightRingRadius
|
||||
});
|
||||
|
||||
auto* light = lightObj->AddComponent<LightComponent>(LightType::Point);
|
||||
light->SetColor(glm::vec3{
|
||||
0.5f + 0.5f * std::cos(glm::two_pi<float>() * t),
|
||||
0.5f + 0.5f * std::cos(glm::two_pi<float>() * (t + 0.33f)),
|
||||
0.5f + 0.5f * std::cos(glm::two_pi<float>() * (t + 0.67f))
|
||||
});
|
||||
light->SetIntensity(1.0f);
|
||||
light->SetRange(3.0f);
|
||||
|
||||
auto* orbit = lightObj->AddComponent<Rotator>(pointLightRingRadius, 0.5f);
|
||||
orbit->SetAxis(glm::vec3{0.0f, 1.0f, 0.0f});
|
||||
orbit->SetPivotPosition(glm::vec3{0.0f, -0.25f, 0.0f});
|
||||
}
|
||||
|
||||
auto playerObj = scene.CreateGameObject("Player");
|
||||
playerObj->GetTransform().SetWorldPosition(glm::vec3(0.0f, 2.0f, -5.0f));
|
||||
auto* fps = playerObj->AddComponent<FirstPersonController>();
|
||||
m_Player = playerObj;
|
||||
m_FPSController = fps;
|
||||
scene.GetPhysics().RegisterGameObject(*playerObj);
|
||||
// auto playerObj = scene.CreateGameObject("Player");
|
||||
// playerObj->GetTransform().SetWorldPosition(glm::vec3(0.0f, 2.0f, -5.0f));
|
||||
// auto* fps = playerObj->AddComponent<FirstPersonController>();
|
||||
// m_Player = playerObj;
|
||||
// m_FPSController = fps;
|
||||
// scene.GetPhysics().RegisterGameObject(*playerObj);
|
||||
|
||||
const auto texPath = AssetFS::GetInstance().GetFullPath("engine://textures/kobe.png");
|
||||
texID = resources.loadImageFromFile(gfxDevice, texPath);
|
||||
|
||||
Reference in New Issue
Block a user