Overte C++ Documentation
ConicalViewFrustum.h
1 //
2 // ConicalViewFrustum.h
3 // libraries/shared/src/shared
4 //
5 // Created by Clement Brisset 4/26/18
6 // Copyright 2017 High Fidelity, Inc.
7 //
8 // Distributed under the Apache License, Version 2.0.
9 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10 //
11 
12 #ifndef hifi_ConicalViewFrustum_h
13 #define hifi_ConicalViewFrustum_h
14 
15 #include <vector>
16 
17 #include <glm/glm.hpp>
18 
19 class AACube;
20 class AABox;
21 class ViewFrustum;
22 using ViewFrustums = std::vector<ViewFrustum>;
23 
24 const float SQRT_TWO_OVER_TWO = 0.7071067811865f;
25 const float DEFAULT_VIEW_ANGLE = 1.0f;
26 const float DEFAULT_VIEW_RADIUS = 10.0f;
27 const float DEFAULT_VIEW_FAR_CLIP = 100.0f;
28 
29 // ConicalViewFrustum is an approximation of a ViewFrustum for fast calculation of sort priority.
30 class ConicalViewFrustum {
31 public:
32  ConicalViewFrustum() = default;
33  ConicalViewFrustum(const ViewFrustum& viewFrustum) { set(viewFrustum); }
34 
35  void set(const ViewFrustum& viewFrustum);
36  void calculate();
37 
38  const glm::vec3& getPosition() const { return _position; }
39  const glm::vec3& getDirection() const { return _direction; }
40  float getAngle() const { return _angle; }
41  float getRadius() const { return _radius; }
42  float getFarClip() const { return _farClip; }
43 
44  bool isVerySimilar(const ConicalViewFrustum& other) const;
45 
46  bool intersects(const AACube& cube) const;
47  bool intersects(const AABox& box) const;
48  float getAngularSize(const AACube& cube) const;
49  float getAngularSize(const AABox& box) const;
50 
51  bool intersects(const glm::vec3& relativePosition, float distance, float radius) const;
52  float getAngularSize(float distance, float radius) const;
53 
54  int serialize(unsigned char* destinationBuffer) const;
55  int deserialize(const unsigned char* sourceBuffer);
56 
57  // Just test for within radius.
58  void setPositionAndSimpleRadius(const glm::vec3& position, float radius);
59 
60 private:
61  glm::vec3 _position { 0.0f, 0.0f, 0.0f };
62  glm::vec3 _direction { 0.0f, 0.0f, 1.0f };
63  float _angle { DEFAULT_VIEW_ANGLE };
64  float _radius { DEFAULT_VIEW_RADIUS };
65  float _farClip { DEFAULT_VIEW_FAR_CLIP };
66 
67  float _sinAngle { SQRT_TWO_OVER_TWO };
68  float _cosAngle { SQRT_TWO_OVER_TWO };
69 };
70 using ConicalViewFrustums = std::vector<ConicalViewFrustum>;
71 
72 
73 #endif /* hifi_ConicalViewFrustum_h */