00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "std3d.h"
00027
00028 #include "3d/vegetable_sort_block.h"
00029 #include "3d/radix_sort.h"
00030 #include "3d/fast_floor.h"
00031
00032
00033 using namespace std;
00034 using namespace NLMISC;
00035
00036 namespace NL3D
00037 {
00038
00039
00040
00041 #define NL3D_VEGETABLE_TRI_RADIX_KEY_PRECISION 512
00042
00043
00044
00045 CVegetableSortBlock::CVegetableSortBlock()
00046 {
00047 ZSortHardMode= true;
00048 _NTriangles= 0;
00049 _NIndices= 0;
00050 _Dirty= false;
00051 _UnderWater= false;
00052 }
00053
00054
00055
00056
00057 struct CSortTri
00058 {
00059
00060 uint16 TriIndex;
00061
00062
00063
00064 float Dist;
00065 bool operator<(const CSortTri &o) const
00066 {
00067 return Dist>o.Dist;
00068 }
00069 };
00070
00071
00072
00073 void CVegetableSortBlock::updateSortBlock(CVegetableManager &vegetManager)
00074 {
00075
00076 if(!_Dirty)
00077 {
00078
00079 return;
00080 }
00081 else
00082 {
00083
00084 _Dirty= false;
00085 }
00086
00087
00088
00089 _NTriangles= 0;
00090 CVegetableInstanceGroup *ptrIg= _InstanceGroupList.begin();
00091 while(ptrIg)
00092 {
00093
00094 _NTriangles+= ptrIg->_RdrPass[NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT].NTriangles;
00095
00096
00097 ptrIg= (CVegetableInstanceGroup*)(ptrIg->Next);
00098 }
00099
00100 _NIndices= _NTriangles*3;
00101
00102
00103
00104 if(_NTriangles == 0)
00105 {
00106
00107 _SortedTriangleArray.clear();
00108
00109 return;
00110 }
00111 else
00112 {
00113
00114 _SortedTriangleArray.resize(_NIndices * NL3D_VEGETABLE_NUM_QUADRANT);
00115 }
00116
00117
00118
00119 nlassert(_NTriangles < 65536);
00120 static std::vector<CSortTri> triSort;
00121 static std::vector<uint32> triIndices;
00122 triSort.clear();
00123 triSort.resize(_NTriangles);
00124 triIndices.resize(_NIndices);
00125
00126
00127
00128 for(uint quadrant=0; quadrant<NL3D_VEGETABLE_NUM_QUADRANT; quadrant++)
00129 {
00130
00131
00132 CSortTri *triPtr= &triSort[0];
00133 uint32 *triIdxPtr= &triIndices[0];
00134 uint triId= 0;
00135
00136 ptrIg= _InstanceGroupList.begin();
00137 while(ptrIg)
00138 {
00139 CVegetableInstanceGroup::CVegetableRdrPass &vegetRdrPass= ptrIg->_RdrPass[NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT];
00140
00141
00142 for(uint i=0; i<vegetRdrPass.NTriangles; i++, triPtr++, triId++)
00143 {
00144
00145 triPtr->Dist = ptrIg->_TriangleQuadrantOrders[quadrant][i];
00146
00147
00148 triPtr->TriIndex= triId;
00149
00150
00151 *(triIdxPtr++)= vegetRdrPass.TriangleIndices[i*3 + 0];
00152 *(triIdxPtr++)= vegetRdrPass.TriangleIndices[i*3 + 1];
00153 *(triIdxPtr++)= vegetRdrPass.TriangleIndices[i*3 + 2];
00154 }
00155
00156
00157 ptrIg= (CVegetableInstanceGroup*)(ptrIg->Next);
00158 }
00159
00160
00161
00162
00163 sort(triSort.begin(), triSort.end());
00164
00165
00166
00167
00168
00169 _SortedTriangleIndices[quadrant]= _SortedTriangleArray.getPtr() + quadrant * _NIndices;
00170
00171
00172 uint32 *pIdx= _SortedTriangleIndices[quadrant];
00173 for(uint i=0; i<_NTriangles; i++)
00174 {
00175 uint32 idTriIdx= triSort[i].TriIndex * 3;
00176 *(pIdx++)= triIndices[idTriIdx+0];
00177 *(pIdx++)= triIndices[idTriIdx+1];
00178 *(pIdx++)= triIndices[idTriIdx+2];
00179 }
00180 }
00181 }
00182
00183
00184
00185
00186 }