summaryrefslogtreecommitdiff
path: root/indra/llmath/llvolume.h
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llmath/llvolume.h')
-rw-r--r--indra/llmath/llvolume.h45
1 files changed, 30 insertions, 15 deletions
diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h
index 7c63266aab..a40a21b405 100644
--- a/indra/llmath/llvolume.h
+++ b/indra/llmath/llvolume.h
@@ -40,6 +40,9 @@ class LLPathParams;
class LLVolumeParams;
class LLProfile;
class LLPath;
+
+template <class T> class LLOctreeNode;
+class LLVector4a;
class LLVolumeFace;
class LLVolume;
@@ -49,15 +52,14 @@ class LLVolume;
//#include "vmath.h"
#include "v2math.h"
#include "v3math.h"
+#include "v3dmath.h"
#include "v4math.h"
-#include "llvector4a.h"
#include "llquaternion.h"
#include "llstrider.h"
#include "v4coloru.h"
#include "llrefcount.h"
#include "llfile.h"
-
//============================================================================
const S32 MIN_DETAIL_FACES = 6;
@@ -830,6 +832,9 @@ public:
LLVolumeFace& operator=(const LLVolumeFace& rhs);
~LLVolumeFace();
+private:
+ void freeData();
+public:
BOOL create(LLVolume* volume, BOOL partial_build = FALSE);
void createBinormals();
@@ -855,26 +860,19 @@ public:
public:
U16 mIndex;
- bool operator==(const LLVolumeFace::VertexData& rhs) const
- {
- return getPosition().equal3(rhs.getPosition()) &&
- mTexCoord == rhs.mTexCoord &&
- getNormal().equal3(rhs.getNormal());
- }
+ bool operator==(const LLVolumeFace::VertexData& rhs) const;
struct ComparePosition
{
- bool operator()(const LLVector4a& a, const LLVector4a& b) const
- {
- return a.less3(b);
- }
+ bool operator()(const LLVector4a& a, const LLVector4a& b) const;
};
typedef std::map<LLVector4a, std::vector<VertexMapData>, VertexMapData::ComparePosition > PointMap;
};
void optimize(F32 angle_cutoff = 2.f);
-
+ void createOctree();
+
enum
{
SINGLE_MASK = 0x0001,
@@ -919,6 +917,21 @@ public:
// mWeights.size() should be empty or match mVertices.size()
LLVector4a* mWeights;
+ class Triangle : public LLRefCount
+ {
+ public:
+ const LLVector4a* mV[3];
+ U16 mIndex[3];
+
+ LLVector3d mPositionGroup;
+ F64 mRadius;
+
+ virtual const LLVector3d& getPositionGroup() const;
+ virtual const F64& getBinRadius() const;
+ };
+
+ LLOctreeNode<Triangle>* mOctree;
+
private:
BOOL createUnCutCubeCap(LLVolume* volume, BOOL partial_build = FALSE);
BOOL createCap(LLVolume* volume, BOOL partial_build = FALSE);
@@ -1084,10 +1097,12 @@ BOOL LLLineSegmentBoxIntersect(const F32* start, const F32* end, const F32* cent
BOOL LLLineSegmentBoxIntersect(const LLVector3& start, const LLVector3& end, const LLVector3& center, const LLVector3& size);
BOOL LLTriangleRayIntersect(const LLVector3& vert0, const LLVector3& vert1, const LLVector3& vert2, const LLVector3& orig, const LLVector3& dir,
- F32* intersection_a, F32* intersection_b, F32* intersection_t, BOOL two_sided);
+ F32& intersection_a, F32& intersection_b, F32& intersection_t, BOOL two_sided);
BOOL LLTriangleRayIntersect(const LLVector4a& vert0, const LLVector4a& vert1, const LLVector4a& vert2, const LLVector4a& orig, const LLVector4a& dir,
- F32* intersection_a, F32* intersection_b, F32* intersection_t, BOOL two_sided);
+ F32& intersection_a, F32& intersection_b, F32& intersection_t);
+BOOL LLTriangleRayIntersectTwoSided(const LLVector4a& vert0, const LLVector4a& vert1, const LLVector4a& vert2, const LLVector4a& orig, const LLVector4a& dir,
+ F32& intersection_a, F32& intersection_b, F32& intersection_t);