ObjectClusterizer.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /*
  2. * DangerHitMapAnalyzer.h, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #pragma once
  11. #include "../Pathfinding/AINodeStorage.h"
  12. #include "../Engine/PriorityEvaluator.h"
  13. namespace NK2AI
  14. {
  15. static constexpr float MINIMUM_STRATEGICAL_VALUE_NON_TOWN = 0.3f;
  16. struct ClusterObjectInfo
  17. {
  18. float priority = 0.f;
  19. float movementCost = 0.f;
  20. uint64_t danger = 0;
  21. uint8_t turn = 0;
  22. };
  23. struct ObjectInstanceIDHash
  24. {
  25. ObjectInstanceID::hash hash;
  26. bool equal(ObjectInstanceID o1, ObjectInstanceID o2) const
  27. {
  28. return o1 == o2;
  29. }
  30. };
  31. using ClusterObjects = tbb::concurrent_hash_map<ObjectInstanceID, ClusterObjectInfo, ObjectInstanceIDHash>;
  32. struct ObjectCluster
  33. {
  34. public:
  35. ClusterObjects objects;
  36. const CGObjectInstance * blocker;
  37. void reset()
  38. {
  39. objects.clear();
  40. }
  41. void addObject(const CGObjectInstance * object, const AIPath & path, float priority);
  42. ObjectCluster(const CGObjectInstance * blocker): blocker(blocker) {}
  43. ObjectCluster() : ObjectCluster(nullptr)
  44. {
  45. }
  46. std::vector<const CGObjectInstance *> getObjects(const CPlayerSpecificInfoCallback * cpsic) const;
  47. const CGObjectInstance * calculateCenter(const CPlayerSpecificInfoCallback * cpsic) const;
  48. };
  49. using ClusterMap = tbb::concurrent_hash_map<ObjectInstanceID, std::shared_ptr<ObjectCluster>, ObjectInstanceIDHash>;
  50. class ObjectClusterizer
  51. {
  52. private:
  53. static Obj IgnoredObjectTypes[];
  54. ObjectCluster nearObjects;
  55. ObjectCluster farObjects;
  56. ClusterMap blockedObjects;
  57. const Nullkiller * aiNk;
  58. RewardEvaluator valueEvaluator;
  59. bool isUpToDate;
  60. std::vector<ObjectInstanceID> invalidated;
  61. public:
  62. void clusterize();
  63. std::vector<const CGObjectInstance *> getNearbyObjects() const;
  64. std::vector<const CGObjectInstance *> getFarObjects() const;
  65. std::vector<std::shared_ptr<ObjectCluster>> getLockedClusters() const;
  66. const CGObjectInstance * getBlocker(const AIPath & path) const;
  67. std::optional<const CGObjectInstance *> getBlocker(const AIPathNodeInfo & node) const;
  68. ObjectClusterizer(const Nullkiller * aiNk): aiNk(aiNk), valueEvaluator(aiNk), isUpToDate(false){}
  69. void validateObjects();
  70. void onObjectRemoved(ObjectInstanceID id);
  71. void invalidate(ObjectInstanceID id);
  72. void reset() {
  73. isUpToDate = false;
  74. invalidated.clear();
  75. }
  76. private:
  77. bool shouldVisitObject(const CGObjectInstance * obj) const;
  78. void clusterizeObject(
  79. const CGObjectInstance * obj,
  80. PriorityEvaluator * priorityEvaluator,
  81. std::vector<AIPath> & pathCache,
  82. std::vector<const CGHeroInstance *> & heroes);
  83. };
  84. }