NetworkPriority.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // Copyright (c) 2008-2023 the Urho3D project
  2. // License: MIT
  3. #include "../Precompiled.h"
  4. #include "../Core/Context.h"
  5. #include "../Network/NetworkPriority.h"
  6. #include "../DebugNew.h"
  7. namespace Urho3D
  8. {
  9. const char* NETWORK_CATEGORY = "Network";
  10. static const float DEFAULT_BASE_PRIORITY = 100.0f;
  11. static const float DEFAULT_DISTANCE_FACTOR = 0.0f;
  12. static const float DEFAULT_MIN_PRIORITY = 0.0f;
  13. static const float UPDATE_THRESHOLD = 100.0f;
  14. NetworkPriority::NetworkPriority(Context* context) :
  15. Component(context),
  16. basePriority_(DEFAULT_BASE_PRIORITY),
  17. distanceFactor_(DEFAULT_DISTANCE_FACTOR),
  18. minPriority_(DEFAULT_MIN_PRIORITY),
  19. alwaysUpdateOwner_(true)
  20. {
  21. }
  22. NetworkPriority::~NetworkPriority() = default;
  23. void NetworkPriority::RegisterObject(Context* context)
  24. {
  25. context->RegisterFactory<NetworkPriority>(NETWORK_CATEGORY);
  26. URHO3D_ATTRIBUTE("Base Priority", basePriority_, DEFAULT_BASE_PRIORITY, AM_DEFAULT);
  27. URHO3D_ATTRIBUTE("Distance Factor", distanceFactor_, DEFAULT_DISTANCE_FACTOR, AM_DEFAULT);
  28. URHO3D_ATTRIBUTE("Minimum Priority", minPriority_, DEFAULT_MIN_PRIORITY, AM_DEFAULT);
  29. URHO3D_ATTRIBUTE("Always Update Owner", alwaysUpdateOwner_, true, AM_DEFAULT);
  30. }
  31. void NetworkPriority::SetBasePriority(float priority)
  32. {
  33. basePriority_ = Max(priority, 0.0f);
  34. MarkNetworkUpdate();
  35. }
  36. void NetworkPriority::SetDistanceFactor(float factor)
  37. {
  38. distanceFactor_ = Max(factor, 0.0f);
  39. MarkNetworkUpdate();
  40. }
  41. void NetworkPriority::SetMinPriority(float priority)
  42. {
  43. minPriority_ = Max(priority, 0.0f);
  44. MarkNetworkUpdate();
  45. }
  46. void NetworkPriority::SetAlwaysUpdateOwner(bool enable)
  47. {
  48. alwaysUpdateOwner_ = enable;
  49. MarkNetworkUpdate();
  50. }
  51. bool NetworkPriority::CheckUpdate(float distance, float& accumulator)
  52. {
  53. float currentPriority = Max(basePriority_ - distanceFactor_ * distance, minPriority_);
  54. accumulator += currentPriority;
  55. if (accumulator >= UPDATE_THRESHOLD)
  56. {
  57. accumulator = fmodf(accumulator, UPDATE_THRESHOLD);
  58. return true;
  59. }
  60. else
  61. return false;
  62. }
  63. }