//----------------------------------------------------------------------------- // Torque Game Engine // Copyright (C) GarageGames.com, Inc. //----------------------------------------------------------------------------- #ifndef _TRANS_SORT #define _TRANS_SORT #include "DTSTypes.h" #include "DTSShape.h" #include "DTSPlusTypes.h" #include "DTSUtil.h" namespace DTS { typedef std::vector IntegerSet; class TranslucentSort { std::vector frontClusters; std::vector backClusters; std::vector middleCluster; Point3D splitNormal; F32 splitK; S32 mNumBigFaces; S32 mMaxDepth; bool mZLayerUp; bool mZLayerDown; S32 currentDepth; TranslucentSort * frontSort; TranslucentSort * backSort; struct FaceInfo { bool used; S32 priority; S32 parentFace; S32 childFace1; S32 childFace2; S32 childFace3; Point3D normal; F32 k; IntegerSet isInFrontOfMe; IntegerSet isBehindMe; IntegerSet isCutByMe; IntegerSet isCoplanarWithMe; }; std::vector faceInfoList; std::vector saveFaceInfoList; std::vector & mFaces; std::vector & mIndices; std::vector & mVerts; std::vector & mNorms; std::vector & mTVerts; void initFaces(); void initFaceInfo(Primitive & face, FaceInfo & faceInfo, bool setPriority = true); void setFaceInfo(Primitive & face, FaceInfo & faceInfo); void clearFaces(IntegerSet &); void saveFaceInfo(); void restoreFaceInfo(); void addFaces(IntegerSet *, std::vector & faces, std::vector & indices, bool continueLast = false); void addFaces(std::vector &, std::vector & faces, std::vector & indices, bool continueLast = false); void addOrderedFaces(std::vector &, std::vector &, std::vector & indices, bool continueLast = false); void splitFace(S32 faceIndex, Point3D normal, F32 k); void splitFace2(S32 faceIndex, Point3D normal, F32 k); void sort(); // routines for sorting faces when there is no perfect solution for all cases void copeSort(std::vector &); void layerSort(std::vector &, bool upFirst); // these are for debugging bool anyInFrontOfPlane(Point3D normal, F32 k); bool anyBehindPlane(Point3D normal, F32 k); // void generateClusters(std::vector & clusters, std::vector & faces, std::vector & indices, S32 retIndex = -1); TranslucentSort(TranslucentSort *); TranslucentSort(std::vector & faces, std::vector & indices, std::vector & verts, std::vector & norms, std::vector & tverts, S32 numBigFaces, S32 maxDepth, bool zLayerUp, bool zLayerDown); ~TranslucentSort(); public: static void generateSortedMesh(Mesh * mesh, S32 numBigFaces, S32 maxDepth, bool zLayerUp, bool zLayerDown); }; }; #endif // _TRANS_SORT