diff options
| author | RunitaiLinden <davep@lindenlab.com> | 2024-04-09 19:21:10 -0500 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-09 19:21:10 -0500 | 
| commit | b2a450a3087fb8393024876f6069a7cec9855bfd (patch) | |
| tree | 05a08420a5f4797ad8ce4d63668d1bf688888704 /indra/llmath | |
| parent | 5a47a3cb2366b9da9a595d37c88703497e111005 (diff) | |
#1126 gltf scene import prototype (#1172)
* #1126 GLTF Scene import initial prototype (working geometry import for some assets)
* #1126 WIP -- Expand support for more vertex formats, PoC material import, shadow support, scale support
* #1126 move GLTF implementation to newview/gltf
* #1126 Refactor attribute loading to be less copy/pasta for each combination of types
* #1126 Partially working object selection.  Ability to have multiple scenes at once.  Helpful message on how to use the preview button.
* #1126 Add bounding box debug display and untangle GLTF raycast from LLVOVolume raycast
* #1126 Working raycast on GLTF scenes.
* #1126 Remove some #pragma optimize offs
Diffstat (limited to 'indra/llmath')
| -rw-r--r-- | indra/llmath/llvolume.cpp | 85 | ||||
| -rw-r--r-- | indra/llmath/llvolume.h | 5 | ||||
| -rw-r--r-- | indra/llmath/llvolumeoctree.cpp | 8 | ||||
| -rw-r--r-- | indra/llmath/llvolumeoctree.h | 95 | 
4 files changed, 105 insertions, 88 deletions
| diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index 29eeebcf67..2f25a4359d 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -45,13 +45,13 @@  #include "llmatrix3a.h"  #include "lloctree.h"  #include "llvolume.h" -#include "llvolumeoctree.h"  #include "llstl.h"  #include "llsdserialize.h"  #include "llvector4a.h"  #include "llmatrix4a.h"  #include "llmeshoptimizer.h"  #include "lltimer.h" +#include "llvolumeoctree.h"  #include "mikktspace/mikktspace.h"  #include "mikktspace/mikktspace.c" // insert mikktspace implementation into llvolume object file @@ -377,77 +377,6 @@ BOOL LLTriangleRayIntersect(const LLVector3& vert0, const LLVector3& vert1, cons  	}  } -class LLVolumeOctreeRebound : public LLOctreeTravelerDepthFirst<LLVolumeTriangle, LLVolumeTriangle*> -{ -public: -	const LLVolumeFace* mFace; - -	LLVolumeOctreeRebound(const LLVolumeFace* face) -	{ -		mFace = face; -	} - -    virtual void visit(const LLOctreeNode<LLVolumeTriangle, LLVolumeTriangle*>* branch) -	{ //this is a depth first traversal, so it's safe to assum all children have complete -		//bounding data -	LL_PROFILE_ZONE_SCOPED_CATEGORY_VOLUME - -		LLVolumeOctreeListener* node = (LLVolumeOctreeListener*) branch->getListener(0); - -		LLVector4a& min = node->mExtents[0]; -		LLVector4a& max = node->mExtents[1]; - -		if (!branch->isEmpty()) -		{ //node has data, find AABB that binds data set -			const LLVolumeTriangle* tri = *(branch->getDataBegin()); -			 -			//initialize min/max to first available vertex -			min = *(tri->mV[0]); -			max = *(tri->mV[0]); -			 -            for (LLOctreeNode<LLVolumeTriangle, LLVolumeTriangle*>::const_element_iter iter = branch->getDataBegin(); iter != branch->getDataEnd(); ++iter) -			{ //for each triangle in node - -				//stretch by triangles in node -				tri = *iter; -				 -				min.setMin(min, *tri->mV[0]); -				min.setMin(min, *tri->mV[1]); -				min.setMin(min, *tri->mV[2]); - -				max.setMax(max, *tri->mV[0]); -				max.setMax(max, *tri->mV[1]); -				max.setMax(max, *tri->mV[2]); -			} -		} -		else if (branch->getChildCount() > 0) -		{ //no data, but child nodes exist -			LLVolumeOctreeListener* child = (LLVolumeOctreeListener*) branch->getChild(0)->getListener(0); - -			//initialize min/max to extents of first child -			min = child->mExtents[0]; -			max = child->mExtents[1]; -		} -		else -		{ -            llassert(!branch->isLeaf()); // Empty leaf -		} - -		for (S32 i = 0; i < branch->getChildCount(); ++i) -		{  //stretch by child extents -			LLVolumeOctreeListener* child = (LLVolumeOctreeListener*) branch->getChild(i)->getListener(0); -			min.setMin(min, child->mExtents[0]); -			max.setMax(max, child->mExtents[1]); -		} - -		node->mBounds[0].setAdd(min, max); -		node->mBounds[0].mul(0.5f); - -		node->mBounds[1].setSub(max,min); -		node->mBounds[1].mul(0.5f); -	} -}; -  //-------------------------------------------------------------------  // statics  //------------------------------------------------------------------- @@ -5509,7 +5438,6 @@ struct MikktData      }  }; -  bool LLVolumeFace::cacheOptimize(bool gen_tangents)  { //optimize for vertex cache according to Forsyth method:       LL_PROFILE_ZONE_SCOPED_CATEGORY_VOLUME; @@ -5687,8 +5615,7 @@ void LLVolumeFace::createOctree(F32 scaler, const LLVector4a& center, const LLVe      llassert(mNumIndices % 3 == 0); -    mOctree = new LLOctreeRoot<LLVolumeTriangle, LLVolumeTriangle*>(center, size, NULL); -	new LLVolumeOctreeListener(mOctree); +    mOctree = new LLVolumeOctree(center, size);      const U32 num_triangles = mNumIndices / 3;      // Initialize all the triangles we need      mOctreeTriangles = new LLVolumeTriangle[num_triangles]; @@ -5743,7 +5670,7 @@ void LLVolumeFace::createOctree(F32 scaler, const LLVector4a& center, const LLVe  	while (!mOctree->balance())	{ }  	//calculate AABB for each node -	LLVolumeOctreeRebound rebound(this); +	LLVolumeOctreeRebound rebound;  	rebound.traverse(mOctree);  	if (gDebugGL) @@ -5756,12 +5683,12 @@ void LLVolumeFace::createOctree(F32 scaler, const LLVector4a& center, const LLVe  void LLVolumeFace::destroyOctree()  {      delete mOctree; -    mOctree = NULL; +    mOctree = nullptr;      delete[] mOctreeTriangles; -    mOctreeTriangles = NULL; +    mOctreeTriangles = nullptr;  } -const LLOctreeNode<LLVolumeTriangle, LLVolumeTriangle*>* LLVolumeFace::getOctree() const +const LLVolumeOctree* LLVolumeFace::getOctree() const  {      return mOctree;  } diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h index c2586601ae..cca284d9bc 100644 --- a/indra/llmath/llvolume.h +++ b/indra/llmath/llvolume.h @@ -41,6 +41,7 @@ template <class T, typename T_PTR> class LLOctreeNode;  class LLVolumeFace;  class LLVolume;  class LLVolumeTriangle; +class LLVolumeOctree;  #include "lluuid.h"  #include "v4color.h" @@ -913,7 +914,7 @@ public:  	void createOctree(F32 scaler = 0.25f, const LLVector4a& center = LLVector4a(0,0,0), const LLVector4a& size = LLVector4a(0.5f,0.5f,0.5f));      void destroyOctree();      // Get a reference to the octree, which may be null -    const LLOctreeNode<LLVolumeTriangle, LLVolumeTriangle*>* getOctree() const; +    const LLVolumeOctree* getOctree() const;  	enum  	{ @@ -987,7 +988,7 @@ public:      LLVector3 mNormalizedScale = LLVector3(1,1,1);  private: -    LLOctreeNode<LLVolumeTriangle, LLVolumeTriangle*>* mOctree; +    LLVolumeOctree* mOctree;      LLVolumeTriangle* mOctreeTriangles;  	BOOL createUnCutCubeCap(LLVolume* volume, BOOL partial_build = FALSE); diff --git a/indra/llmath/llvolumeoctree.cpp b/indra/llmath/llvolumeoctree.cpp index 6894d04d3c..95c7cb0b5c 100644 --- a/indra/llmath/llvolumeoctree.cpp +++ b/indra/llmath/llvolumeoctree.cpp @@ -92,15 +92,15 @@ void LLVolumeOctreeListener::handleChildAddition(const LLOctreeNode<LLVolumeTria  }  LLOctreeTriangleRayIntersect::LLOctreeTriangleRayIntersect(const LLVector4a& start, const LLVector4a& dir,  -							   const LLVolumeFace* face, F32* closest_t, +                                LLVolumeFace* face, F32* closest_t,  							   LLVector4a* intersection,LLVector2* tex_coord, LLVector4a* normal, LLVector4a* tangent) -   : mFace(face), -     mStart(start), +   : mStart(start),  	 mDir(dir),  	 mIntersection(intersection),  	 mTexCoord(tex_coord),  	 mNormal(normal),  	 mTangent(tangent), +     mFace(face),  	 mClosestT(closest_t),  	 mHitFace(false)  { @@ -139,7 +139,7 @@ void LLOctreeTriangleRayIntersect::visit(const LLOctreeNode<LLVolumeTriangle, LL  			{  				*mClosestT = t;  				mHitFace = true; - +                mHitTriangle = tri;  				if (mIntersection != NULL)  				{  					LLVector4a intersect = mDir; diff --git a/indra/llmath/llvolumeoctree.h b/indra/llmath/llvolumeoctree.h index d65bca5e52..d6f536b9ca 100644 --- a/indra/llmath/llvolumeoctree.h +++ b/indra/llmath/llvolumeoctree.h @@ -112,7 +112,6 @@ public:  class LLOctreeTriangleRayIntersect : public LLOctreeTraveler<LLVolumeTriangle, LLVolumeTriangle*>  {  public: -	const LLVolumeFace* mFace;  	LLVector4a mStart;  	LLVector4a mDir;  	LLVector4a mEnd; @@ -121,10 +120,13 @@ public:  	LLVector4a* mNormal;  	LLVector4a* mTangent;  	F32* mClosestT; +    LLVolumeFace* mFace;  	bool mHitFace; +    const LLVolumeTriangle* mHitTriangle = nullptr; -	LLOctreeTriangleRayIntersect(const LLVector4a& start, const LLVector4a& dir,  -								   const LLVolumeFace* face, F32* closest_t, +	LLOctreeTriangleRayIntersect(const LLVector4a& start, const LLVector4a& dir, +                                    LLVolumeFace* face, +								   F32* closest_t,  								   LLVector4a* intersection,LLVector2* tex_coord, LLVector4a* normal, LLVector4a* tangent);      void traverse(const LLOctreeNode<LLVolumeTriangle, LLVolumeTriangle*>* node); @@ -137,4 +139,91 @@ class LLVolumeOctreeValidate : public LLOctreeTraveler<LLVolumeTriangle, LLVolum      virtual void visit(const LLOctreeNode<LLVolumeTriangle, LLVolumeTriangle*>* branch);  }; +class LLVolumeOctreeRebound : public LLOctreeTravelerDepthFirst<LLVolumeTriangle, LLVolumeTriangle*> +{ +public: +    LLVolumeOctreeRebound() +    { +    } + +    virtual void visit(const LLOctreeNode<LLVolumeTriangle, LLVolumeTriangle*>* branch) +    { //this is a depth first traversal, so it's safe to assum all children have complete +        //bounding data +        LL_PROFILE_ZONE_SCOPED_CATEGORY_VOLUME + +            LLVolumeOctreeListener* node = (LLVolumeOctreeListener*)branch->getListener(0); + +        LLVector4a& min = node->mExtents[0]; +        LLVector4a& max = node->mExtents[1]; + +        if (!branch->isEmpty()) +        { //node has data, find AABB that binds data set +            const LLVolumeTriangle* tri = *(branch->getDataBegin()); + +            //initialize min/max to first available vertex +            min = *(tri->mV[0]); +            max = *(tri->mV[0]); + +            for (LLOctreeNode<LLVolumeTriangle, LLVolumeTriangle*>::const_element_iter iter = branch->getDataBegin(); iter != branch->getDataEnd(); ++iter) +            { //for each triangle in node + +                //stretch by triangles in node +                tri = *iter; + +                min.setMin(min, *tri->mV[0]); +                min.setMin(min, *tri->mV[1]); +                min.setMin(min, *tri->mV[2]); + +                max.setMax(max, *tri->mV[0]); +                max.setMax(max, *tri->mV[1]); +                max.setMax(max, *tri->mV[2]); +            } +        } +        else if (branch->getChildCount() > 0) +        { //no data, but child nodes exist +            LLVolumeOctreeListener* child = (LLVolumeOctreeListener*)branch->getChild(0)->getListener(0); + +            //initialize min/max to extents of first child +            min = child->mExtents[0]; +            max = child->mExtents[1]; +        } +        else +        { +            llassert(!branch->isLeaf()); // Empty leaf +        } + +        for (S32 i = 0; i < branch->getChildCount(); ++i) +        {  //stretch by child extents +            LLVolumeOctreeListener* child = (LLVolumeOctreeListener*)branch->getChild(i)->getListener(0); +            min.setMin(min, child->mExtents[0]); +            max.setMax(max, child->mExtents[1]); +        } + +        node->mBounds[0].setAdd(min, max); +        node->mBounds[0].mul(0.5f); + +        node->mBounds[1].setSub(max, min); +        node->mBounds[1].mul(0.5f); +    } +}; + +class LLVolumeOctree : public LLOctreeRoot<LLVolumeTriangle, LLVolumeTriangle*>, public LLRefCount +{ +public: +    LLVolumeOctree(const LLVector4a& center, const LLVector4a& size) +        : +        LLOctreeRoot<LLVolumeTriangle, LLVolumeTriangle*>(center, size, nullptr), +        LLRefCount() +    { +        new LLVolumeOctreeListener(this); +    } +     +    LLVolumeOctree() +        : LLOctreeRoot<LLVolumeTriangle, LLVolumeTriangle*>(LLVector4a::getZero(), LLVector4a(1.f,1.f,1.f), nullptr), +        LLRefCount() +    { +        new LLVolumeOctreeListener(this); +    } +}; +  #endif | 
