Atoms Crowd  4.1.0
MeshScatterLayoutGenerator.h
1 #pragma once
2 // ===========================================================================
3 // Copyright (c) 2015 Toolchefs Ltd. All rights reserved.
4 //
5 // Use of this software is subject to the terms of the Toolchefs license
6 // agreement provided at the time of installation or download, or which
7 // otherwise accompanies this software in either electronic or hard copy form.
8 // ===========================================================================
9 
10 #include <vector>
11 #include <Atoms/LayoutGenerators/DynamicLayoutGenerator.h>
12 #include <AtomsUtils/Mesh.h>
13 #include <AtomsUtils/Image.h>
14 
15 namespace Atoms
16 {
18  {
19  public:
20 
21  enum ScatterMode
22  {
23  kRandom = 0,
24  kVertices,
25  kFaceCenter,
26  kVerticesIteration,
27  kFaceCenterIteration
28  };
29 
31 
32  virtual ~MeshScatterLayoutGenerator();
33 
34  virtual std::vector<Atoms::AgentInitData> generate(double time)
35  #ifdef __APPLE__
36  override
37  #endif
38  ;
39 
40  void setMesh(const AtomsUtils::Mesh &mesh, short mode = 0);
41  inline void setDefaultRadius(double radius){m_defaultRadius = radius;}
42  inline void setDensityMap(AtomsUtils::Image* densityMap){m_densityMap = densityMap;}
43  inline void setMaxRadius(double radius){m_maxRadius = radius;}
44  inline void setUseDensityMap(bool state){m_useDensityMap = state;}
45  inline void setRandomizeRadius(bool state){m_randomizeRadius = state;}
46  inline void setIterations(int iterations){m_iterations = iterations;}
47  inline void setDirection(const AtomsMath::Vector3f &direction){m_direction = direction;}
48  inline void setRandomDirection(const AtomsMath::Vector3f &randomDirection) { m_randomDirection = randomDirection; }
49  inline void setUpVector(const AtomsMath::Vector3f &direction) { m_upVector = direction; }
50  inline void setScale(const AtomsMath::Vector3f &direction) { m_scale = direction; }
51  inline void setMeshMatrix(const AtomsMath::Matrix &matrix){m_meshMatrix = matrix;}
52  inline void setRandomSeed(unsigned int seed){m_randomSeed = seed;}
53  inline void setEraseMap(AtomsUtils::Image* densityMap) { m_eraseMap = densityMap; }
54  inline void setEraseThreshold(double radius) { m_eraseThreshold = radius; }
55  inline void setUseEraseMap(bool state) { m_useEraseMap = state; }
56  inline void useNormalAsUpVector(bool value) { m_useNormalAsUp = value; }
57  inline void setUseNavMesh(bool value) { m_useNavMesh = value; }
58  inline void setNavMeshName(const std::string & value) { m_navMeshName = value; };
59  inline void setClamp(const bool useClampVector, const AtomsCore::Vector3 &clampVector, const double clampAngle) { m_useClampVector = useClampVector; m_clampVector = clampVector; m_clampAngle = clampAngle;}
60  inline void setOtherSamples(const std::vector<AtomsCore::Vector3> &otherSamples) { m_otherSamples = otherSamples; }
61  inline void setAgentMaxNum(const int agentMaxNum) { m_agentMaxNum = agentMaxNum; }
62 
63  inline const std::map<int, std::string>& agentTypeOverride() const { return m_agentTypeOverride; };
64 
65  inline void setAgentTypeOverride(const std::map<int, std::string>& value) { m_agentTypeOverride = value; }
66 
67  inline const std::map<int, AtomsCore::Vector3>& directionOverride() const { return m_directionOverride; };
68 
69  inline void setDirectionOverride(const std::map<int, AtomsCore::Vector3>& value) { m_directionOverride = value; }
70 
71  inline const std::map<int, AtomsCore::Vector3>& upVectorOverride() const { return m_upVectorOverride; };
72 
73  inline void setUpVectorOverride(const std::map<int, AtomsCore::Vector3>& value) { m_upVectorOverride = value; }
74 
75  inline const std::map<int, AtomsCore::Vector3>& scaleOverride() const { return m_scaleOverride; };
76 
77  inline void setScaleOverride(const std::map<int, AtomsCore::Vector3>& value) { m_scaleOverride = value; }
78 
79  inline const char* typeName() override { return "meshScatter"; };
80 
81  private:
82  int m_iterations;
83  int m_agentMaxNum;
84  double m_defaultRadius;
85  double m_maxRadius;
86  double m_eraseThreshold;
87  AtomsUtils::Mesh m_mesh;
88  AtomsUtils::Image* m_densityMap;
89  AtomsUtils::Image* m_eraseMap;
90  AtomsMath::Vector3 m_direction;
91  AtomsMath::Vector3 m_randomDirection;
92  AtomsMath::Vector3 m_upVector;
93  AtomsMath::Vector3 m_scale;
94  AtomsMath::Vector3 m_clampVector;
95  AtomsMath::Matrix m_meshMatrix;
96  double m_clampAngle;
97  unsigned int m_randomSeed;
98  short m_scatterMode;
99  bool m_randomizeRadius;
100  bool m_useDensityMap;
101  bool m_useEraseMap;
102  bool m_useNormalAsUp;
103  bool m_useNavMesh;
104  bool m_useClampVector;
105  std::string m_navMeshName;
106 
107  AtomsCore::Rand48 m_random;
108 
109  std::vector<AtomsCore::Vector3> m_otherSamples;
110  std::map<int, std::string> m_agentTypeOverride;
111  std::map<int, AtomsCore::Vector3> m_directionOverride;
112  std::map<int, AtomsCore::Vector3> m_upVectorOverride;
113  std::map<int, AtomsCore::Vector3> m_scaleOverride;
114  };
115 }
Atoms::MeshScatterLayoutGenerator::typeName
const char * typeName() override
Get the type name for this generator.
Definition: MeshScatterLayoutGenerator.h:79
Atoms::MeshScatterLayoutGenerator
Definition: MeshScatterLayoutGenerator.h:18
Atoms::MeshScatterLayoutGenerator::generate
virtual std::vector< Atoms::AgentInitData > generate(double time)
Generate a vector of agent init data.
AtomsCore::Vector3
AtomsMath::Vector3 Vector3
Vector3 class.
Definition: AtomsMath.h:57
Atoms
Atoms namespace.
Definition: Agent.h:28
AtomsUtils::Image
Image class.
Definition: Image.h:22
AtomsUtils::Mesh
Mesh class.
Definition: Mesh.h:30
Atoms::DynamicLayoutGenerator
Definition: DynamicLayoutGenerator.h:15