Home | nevrax.com |
|
mrm_level_detail.hGo to the documentation of this file.00001 00007 /* Copyright, 2000-2002 Nevrax Ltd. 00008 * 00009 * This file is part of NEVRAX NEL. 00010 * NEVRAX NEL is free software; you can redistribute it and/or modify 00011 * it under the terms of the GNU General Public License as published by 00012 * the Free Software Foundation; either version 2, or (at your option) 00013 * any later version. 00014 00015 * NEVRAX NEL is distributed in the hope that it will be useful, but 00016 * WITHOUT ANY WARRANTY; without even the implied warranty of 00017 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00018 * General Public License for more details. 00019 00020 * You should have received a copy of the GNU General Public License 00021 * along with NEVRAX NEL; see the file COPYING. If not, write to the 00022 * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, 00023 * MA 02111-1307, USA. 00024 */ 00025 00026 #ifndef NL_MRM_LEVEL_DETAIL_H 00027 #define NL_MRM_LEVEL_DETAIL_H 00028 00029 #include "nel/misc/types_nl.h" 00030 #include "nel/misc/common.h" 00031 00032 00033 namespace NL3D 00034 { 00035 00036 00037 // *************************************************************************** 00038 /* This is used to have correct max Polygon count setuped. This suppose that MRM.NumLod==10 00039 Hence, a mean value of 0.5*1/10 is used 00040 */ 00041 #define NL3D_MRM_LD_SHIFT_POLY_COUNT 0.05f 00042 00043 00044 // *************************************************************************** 00051 class CMRMLevelDetail 00052 { 00053 public: 00054 00056 uint32 MinFaceUsed; 00058 uint32 MaxFaceUsed; 00059 00061 float DistanceFinest; 00063 float DistanceMiddle; 00065 float DistanceCoarsest; 00066 00068 float OODistanceDelta; 00069 float DistancePow; 00070 00071 public: 00073 CMRMLevelDetail() {} 00074 00076 void compileDistanceSetup(); 00077 00079 float getLevelDetailFromDist(float dist); 00080 00082 float getNumTriangles (float dist) 00083 { 00084 // return the lod detail [0,1]. 00085 float ld= getLevelDetailFromDist(dist); 00086 // return in nb face. 00087 if(ld<=0) 00088 return (float)MinFaceUsed; 00089 else 00090 { 00091 /* over-estimate the number of poly rendered 00092 because this is always the higher Lod which is rendered, geomorphing to the coarser one. 00093 NB: still need to over-estimate if ld==1, because getLevelDetailFromPolyCount() remove the shift... 00094 */ 00095 ld+= NL3D_MRM_LD_SHIFT_POLY_COUNT; 00096 return MinFaceUsed + ld * (MaxFaceUsed - MinFaceUsed); 00097 } 00098 } 00099 00101 float getLevelDetailFromPolyCount(float polygonCount) 00102 { 00103 float ld; 00104 if(MaxFaceUsed > MinFaceUsed) 00105 { 00106 // compute the level of detail we want. 00107 ld= (polygonCount - MinFaceUsed) / (MaxFaceUsed - MinFaceUsed); 00108 /* remove the value added in getNumTriangles(). For the same reason: 00109 this is always the higher Lod which is rendered, geomorphing to the coarser one. 00110 Hence we must degrade a bit. 00111 NB: if polygonCount==MinFaceUsed, then we have here ld= -NL3D_MRM_LD_SHIFT_POLY_COUNT (ie -0.05f) 00112 but it is clamped below 00113 */ 00114 ld-= NL3D_MRM_LD_SHIFT_POLY_COUNT; 00115 NLMISC::clamp(ld, 0, 1); 00116 } 00117 else 00118 ld= 1; 00119 00120 return ld; 00121 } 00122 00123 }; 00124 00125 00126 } // NL3D 00127 00128 00129 #endif // NL_MRM_LEVEL_DETAIL_H 00130 00131 /* End of mrm_level_detail.h */ |