#include <zone_smoother.h>
Nevrax France
Definition at line 46 of file zone_smoother.h.
Public Member Functions | |
| CZoneSmoother () | |
| Constructor. | |
| void | smoothTangents (CZoneInfo zones[5], float angleThreshold=NLMISC::Pi/6, bool continuityC1=false) |
Private Types | |
| typedef std::map< sint, CZoneInfo > | TZoneInfoMap |
Private Member Functions | |
| bool | smoothTangent (const CVector &tgt, const CVector &int0, const CVector &int1, CVector &tgtres) |
Private Attributes | |
| bool | _ContinuityC1 |
| float | _CosThreshold |
| TZoneInfoMap | _Zones |
|
|
Definition at line 90 of file zone_smoother.h. |
|
|
Constructor.
Definition at line 66 of file zone_smoother.h.
00066 {}
|
|
||||||||||||||||||||
|
Definition at line 36 of file zone_smoother.cpp. References _ContinuityC1, _CosThreshold, NLMISC::CVector::norm(), and NLMISC::CVector::normalize(). Referenced by smoothTangents().
00037 {
00038 // First, test anglethreshold.
00039 CVector dir0= tgt-int0;
00040 CVector dir1= int1-tgt;
00041 float norm0= dir0.norm();
00042 float norm1= dir1.norm();
00043 dir0.normalize();
00044 dir1.normalize();
00045 // If not so colinear...
00046 if(dir0*dir1<_CosThreshold)
00047 return false;
00048
00049 // Then smooth.
00050 if(_ContinuityC1)
00051 {
00052 tgtres= (int0+int1)/2;
00053 }
00054 else
00055 {
00056 // Make it colinear, but not at the middle.
00057 // Respect the old distance ratio.
00058 tgtres= (int0*norm1 + int1*norm0)/ (norm0+norm1);
00059 }
00060
00061
00062 return true;
00063 }
|
|
||||||||||||||||
|
Smooth the tangents of those zones. Zones must be correclty welded. Only all patchs of zones[0] are parsed. But other zones may be modified on their edge (so you must save them). NB: tangent smoothing is only done on bind 1/1.
Definition at line 67 of file zone_smoother.cpp. References _ContinuityC1, _CosThreshold, NL3D::CPatchInfo::BindEdges, NL3D::CPatchInfo::CBindInfo::Edge, NL3D::CPatchInfo::getSmoothFlag(), NL3D::CBezierPatch::Interiors, NL3D::CPatchInfo::CBindInfo::Next, nlassert, NL3D::CPatchInfo::CBindInfo::NPatchs, NL3D::CPatchInfo::Patch, NL3D::CZoneSmoother::CZoneInfo::Patchs, sint, smoothTangent(), NL3D::CBezierPatch::Tangents, and NL3D::CPatchInfo::CBindInfo::ZoneId.
00068 {
00069 sint i,j;
00070
00071 nlassert(zones[0].Patchs);
00072
00073 // Local info.
00074 _CosThreshold= (float)cos(angleThreshold);
00075 _ContinuityC1= continuityC1;
00076
00077 // 0. fill local Zone map.
00078 //========================
00079 _Zones.clear();
00080 for(i=0;i<5;i++)
00081 {
00082 // If not NULL
00083 if(zones[i].Patchs)
00084 {
00085 _Zones.insert( TZoneInfoMap::value_type(zones[i].ZoneId, zones[i]) );
00086 }
00087 }
00088
00089 // 1. Fot all patchs of zones[0].
00090 //===============================
00091 std::vector<CPatchInfo> &patchs= *(zones[0].Patchs);
00092 for(i=0;i<(sint)patchs.size();i++)
00093 {
00094 CPatchInfo &pat0= patchs[i];
00095
00096 // For all edges.
00097 for(j=0;j<4;j++)
00098 {
00099 if (pat0.getSmoothFlag (i))
00100 {
00101 CPatchInfo::CBindInfo &bd= pat0.BindEdges[j];
00102 // If normal bind (1/1), we can do the smooth.
00103 if(bd.NPatchs==1)
00104 {
00105 // Retrieve the good neighbor zone.
00106 TZoneInfoMap::iterator itZone= _Zones.find(bd.ZoneId);
00107 // If zone here.
00108 if(itZone!=_Zones.end())
00109 {
00110 CZoneInfo &zi= itZone->second;
00111 CPatchInfo &pat1= (*zi.Patchs)[bd.Next[0]];
00112 // Here, we have the 2 patchs, and we must smooth 2 tangents.
00113 CVector tgtRes;
00114 sint edge0= j;
00115 sint edge1= bd.Edge[0];
00116
00117 // Make a draw to understand (see Bezier patchs conventions).
00118 // The key is: Patchs are always CCW, so must smooth the patchs one front of the other.
00119
00120 // a. First tangent.
00121 //==================
00122 if(smoothTangent(pat0.Patch.Tangents[edge0*2], pat0.Patch.Interiors[edge0],
00123 pat1.Patch.Interiors[(edge1+1)%4], tgtRes))
00124 {
00125 // Set the result on the 2 patchs.
00126 pat0.Patch.Tangents[edge0*2]= tgtRes;
00127 pat1.Patch.Tangents[edge1*2+1]= tgtRes;
00128 }
00129
00130 // b. Second tangent.
00131 //==================
00132 if(smoothTangent(pat0.Patch.Tangents[edge0*2+1], pat0.Patch.Interiors[(edge0+1)%4],
00133 pat1.Patch.Interiors[edge1], tgtRes))
00134 {
00135 // Set the result on the 2 patchs.
00136 pat0.Patch.Tangents[edge0*2+1]= tgtRes;
00137 pat1.Patch.Tangents[edge1*2]= tgtRes;
00138 }
00139
00140 }
00141 }
00142 }
00143 }
00144 }
00145
00146 // End!!
00147 }
|
|
|
Definition at line 93 of file zone_smoother.h. Referenced by smoothTangent(), and smoothTangents(). |
|
|
Definition at line 92 of file zone_smoother.h. Referenced by smoothTangent(), and smoothTangents(). |
|
|
Definition at line 91 of file zone_smoother.h. |
1.3.6