AppState_Benchmark03.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. // Copyright (c) 2008-2023 the Urho3D project
  2. // License: MIT
  3. #include "AppState_Benchmark03.h"
  4. #include "AppStateManager.h"
  5. #include "Benchmark03_MoleculeLogic.h"
  6. #include <Urho3D/Core/Context.h>
  7. #include <Urho3D/Graphics/Camera.h>
  8. #include <Urho3D/Graphics/Model.h>
  9. #include <Urho3D/Graphics/Octree.h>
  10. #include <Urho3D/Graphics/StaticModel.h>
  11. #include <Urho3D/Graphics/Zone.h>
  12. #include <Urho3D/Input/Input.h>
  13. #include <Urho3D/Resource/ResourceCache.h>
  14. #include <Urho3D/Scene/SceneEvents.h>
  15. #include <Urho3D/DebugNew.h>
  16. using namespace Urho3D;
  17. AppState_Benchmark03::AppState_Benchmark03(Context* context)
  18. : AppState_Base(context)
  19. {
  20. name_ = "Molecules";
  21. // This constructor is called once when the application runs, so we can register here
  22. context->RegisterFactory<Benchmark03_MoleculeLogic>();
  23. ResourceCache* cache = GetSubsystem<ResourceCache>();
  24. SharedPtr<Material> material0 = MakeShared<Material>(context_);
  25. material0->SetName("Molecule0");
  26. material0->SetShaderParameter("MatDiffColor", Vector4(0, 1, 1, 1));
  27. material0->SetShaderParameter("MatSpecColor", Vector4(1, 1, 1, 100));
  28. cache->AddManualResource(material0);
  29. SharedPtr<Material> material1 = material0->Clone("Molecule1");
  30. material1->SetShaderParameter("MatDiffColor", Vector4(0, 1, 0, 1));
  31. cache->AddManualResource(material1);
  32. SharedPtr<Material> material2 = material0->Clone("Molecule2");
  33. material2->SetShaderParameter("MatDiffColor", Vector4(0, 0, 1, 1));
  34. cache->AddManualResource(material2);
  35. SharedPtr<Material> material3 = material0->Clone("Molecule3");
  36. material3->SetShaderParameter("MatDiffColor", Vector4(1, 0.5f, 0, 1));
  37. cache->AddManualResource(material3);
  38. SharedPtr<Material> material4 = material0->Clone("Molecule4");
  39. material4->SetShaderParameter("MatDiffColor", Vector4(1, 0, 0, 1));
  40. cache->AddManualResource(material4);
  41. SharedPtr<Material> material5 = material0->Clone("Molecule5");
  42. material5->SetShaderParameter("MatDiffColor", Vector4(1, 0, 1, 1));
  43. cache->AddManualResource(material5);
  44. SharedPtr<Material> material6 = material0->Clone("Molecule6");
  45. material6->SetShaderParameter("MatDiffColor", Vector4(1, 1, 0, 1));
  46. cache->AddManualResource(material6);
  47. }
  48. void AppState_Benchmark03::OnEnter()
  49. {
  50. assert(!scene_);
  51. scene_ = new Scene(context_);
  52. scene_->CreateComponent<Octree>();
  53. Node* zoneNode = scene_->CreateChild();
  54. Zone* zone = zoneNode->CreateComponent<Zone>();
  55. zone->SetBoundingBox(BoundingBox(-1000.f, 1000.f));
  56. zone->SetAmbientColor(Color(0.5f, 0.5f, 0.5f));
  57. zone->SetFogColor(Color(0.3f, 0.6f, 0.9f));
  58. zone->SetFogStart(10000.f);
  59. zone->SetFogEnd(10000.f);
  60. Node* lightNode = scene_->CreateChild();
  61. lightNode->SetRotation(Quaternion(45.f, 45.f, 0.f));
  62. Light* light = lightNode->CreateComponent<Light>();
  63. light->SetLightType(LIGHT_DIRECTIONAL);
  64. Node* cameraNode = scene_->CreateChild("Camera");
  65. cameraNode->SetPosition(Vector3(0.f, 0.f, -10.f));
  66. Camera* camera = cameraNode->CreateComponent<Camera>();
  67. camera->SetOrthographic(true);
  68. constexpr int NUM_MOLECULES = 280;
  69. for (int i = 0; i < NUM_MOLECULES; ++i)
  70. CreateMolecule({Random(-10.f, 10.f), Random(-6.f, 6.f)}, Random(7));
  71. GetSubsystem<Input>()->SetMouseVisible(false);
  72. SetupViewport();
  73. SubscribeToEvent(scene_, E_SCENEUPDATE, URHO3D_HANDLER(AppState_Benchmark03, HandleSceneUpdate));
  74. fpsCounter_.Clear();
  75. }
  76. void AppState_Benchmark03::OnLeave()
  77. {
  78. UnsubscribeFromAllEvents();
  79. DestroyViewport();
  80. scene_ = nullptr;
  81. }
  82. void AppState_Benchmark03::CreateMolecule(const Vector2& pos, i32 type)
  83. {
  84. assert(type >= 0 && type <= 6);
  85. ResourceCache* cache = GetSubsystem<ResourceCache>();
  86. Node* node = scene_->CreateChild();
  87. node->SetPosition2D(pos);
  88. StaticModel* obj = node->CreateComponent<StaticModel>();
  89. obj->SetModel(cache->GetResource<Model>("Models/Sphere.mdl"));
  90. obj->SetMaterial(cache->GetResource<Material>("Molecule" + String(type)));
  91. Benchmark03_MoleculeLogic* logic = node->CreateComponent<Benchmark03_MoleculeLogic>();
  92. logic->SetParameters(type);
  93. }
  94. void AppState_Benchmark03::HandleSceneUpdate(StringHash eventType, VariantMap& eventData)
  95. {
  96. float timeStep = eventData[SceneUpdate::P_TIMESTEP].GetFloat();
  97. fpsCounter_.Update(timeStep);
  98. UpdateCurrentFpsElement();
  99. if (GetSubsystem<Input>()->GetKeyDown(KEY_ESCAPE))
  100. {
  101. GetSubsystem<AppStateManager>()->SetRequiredAppStateId(APPSTATEID_MAINSCREEN);
  102. return;
  103. }
  104. if (fpsCounter_.GetTotalTime() >= 30.f)
  105. GetSubsystem<AppStateManager>()->SetRequiredAppStateId(APPSTATEID_RESULTSCREEN);
  106. }