diff --git a/src/gameui/CGWorldFrame.cpp b/src/gameui/CGWorldFrame.cpp index 1f2d713..5c8c798 100644 --- a/src/gameui/CGWorldFrame.cpp +++ b/src/gameui/CGWorldFrame.cpp @@ -14,6 +14,7 @@ #include #include +#include CGWorldFrame* CGWorldFrame::s_currentWorldFrame = nullptr; @@ -166,7 +167,7 @@ void CGWorldFrame::OnWorldRender() { GxRsSet(GxRs_Multisample, 1); if (true) { - CImVector clearColor = { 0, 0, 0, 0xFF }; + CImVector clearColor = { 0x80, 0x80, 0x80, 0xFF }; GxSceneClear(3, clearColor); } @@ -187,7 +188,11 @@ void CGWorldFrame::OnWorldRender() { CShaderEffect::UpdateProjMatrix(); - CWorld::Render(C3Vector(), 0.0f); + static auto s_time = 0; + + float elapsed = static_cast(OsGetAsyncTimeMs() - s_time) / 1000.0f; + s_time = OsGetAsyncTimeMs(); + CWorld::Render(C3Vector(), elapsed); if (CWorldScene::s_m2Scene) { CWorldScene::s_m2Scene->Draw(M2PASS_0); diff --git a/src/world/CWorldScene.cpp b/src/world/CWorldScene.cpp index 6c0253a..5c72aa4 100644 --- a/src/world/CWorldScene.cpp +++ b/src/world/CWorldScene.cpp @@ -17,14 +17,39 @@ CM2Scene* CWorldScene::s_m2Scene; +HTEXTURE CWorldScene::s_defaultTexture; +HTEXTURE CWorldScene::s_defaultBlendTexture; +CM2Model* g_models[10] = {}; + +void CWorldSceneLightingCallback(CM2Model* model, CM2Lighting* lighting, void* userArg) { + lighting->AddAmbient({ 1.0f, 1.0f, 1.0f }); + lighting->AddDiffuse({ 1.0f, 1.0f, 1.0f }, { 1.0f, 0.0f, 0.0f }); + lighting->AddSpecular({ 0.0f, 0.0f, 0.0f }); +} void CWorldScene::Initialize() { // TODO CWorldScene::s_m2Scene = M2CreateScene(); - auto model = CWorldScene::s_m2Scene->CreateModel("Spells\\ErrorCube.mdx", 0); - model->SetAnimating(1); - model->SetVisible(1); + g_models[0] = CWorldScene::s_m2Scene->CreateModel(R"(World\LORDAERON\Arathi\PassiveDoodads\Trees\ArathiStump01.m2)", 0); + g_models[0]->SetWorldTransform(C3Vector(1.0f, 0.0f, 0.0f), 0.0f, 0.1f); + + g_models[1] = CWorldScene::s_m2Scene->CreateModel(R"(World\NoDXT\Detail\ApkBus01.m2)", 0); + g_models[1]->SetWorldTransform(C3Vector(1.5f), 0.0f, 1.0f); + + g_models[2] = CWorldScene::s_m2Scene->CreateModel(R"(Creature\BloodElfGuard\BloodElfMale_Guard.m2)", 0); + g_models[2]->SetWorldTransform(C3Vector(0.0f), 0.0f, 1.0f); + + for (size_t i = 0; i < 10; ++i) { + if (!g_models[i]) + continue; + + g_models[i]->SetBoneSequence(0xFFFFFFFF, 0, 0xFFFFFFFF, 0, 1.0f, 1, 1); + g_models[i]->SetLightingCallback(&CWorldSceneLightingCallback, nullptr); + } + + CWorldScene::s_defaultTexture = TextureCreateSolid({ 0x80, 0x80, 0x80, 0xFF }); + CWorldScene::s_defaultBlendTexture = TextureCreateSolid({ 0, 0, 0, 0xFF }); } void CWorldScene::Render(const C3Vector& cameraPos, float time) { @@ -37,12 +62,25 @@ void CWorldScene::Render(const C3Vector& cameraPos, float time) { if (CWorldScene::s_m2Scene) { + for (size_t i = 0; i < 10; ++i) { + if (!g_models[i]) + continue; + g_models[i]->SetAnimating(1); + g_models[i]->SetVisible(1); + } + CWorldScene::s_m2Scene->m_flags |= 1u; CWorldScene::s_m2Scene->AdvanceTime(static_cast(time * 1000.0f)); CWorldScene::s_m2Scene->Animate(cameraPos); CWorldScene::s_m2Scene->m_flags &= ~1u; } + // sub_6FDA20(); + // sub_7BB570(); + + CShaderEffect::UpdateProjMatrix(); + // CWorldScene::RenderSetFog(); + DayNight::Update(); DayNight::RenderSky(); diff --git a/src/world/CWorldScene.hpp b/src/world/CWorldScene.hpp index 2e03580..d53f4b9 100644 --- a/src/world/CWorldScene.hpp +++ b/src/world/CWorldScene.hpp @@ -4,11 +4,16 @@ #include #include +#include "gx/Texture.hpp" + class CM2Scene; class CWorldScene { public: static CM2Scene* s_m2Scene; + static HTEXTURE s_defaultTexture; + static HTEXTURE s_defaultBlendTexture; + static void Initialize(); static void Render(const C3Vector& cameraPos, float time);