#include <zone_corner_smoother.h>
Nevrax France
Definition at line 51 of file zone_corner_smoother.h.
Public Member Functions | |
| void | computeAllCornerSmoothFlags (CZone *zone, std::vector< CZone * > neighborZones) |
| CZoneCornerSmoother () | |
| Constructor. | |
Private Types | |
| typedef TIdVertexMap::iterator | ItIdVertexMap |
| typedef TVertexMap::iterator | ItVertexMap |
| typedef std::map< const CTessVertex *, sint > | TIdVertexMap |
| typedef std::map< sint, CVertexSmoothInfo > | TVertexMap |
Private Member Functions | |
| void | buildPatchBindInfo (CPatch &pa, const CZone::CPatchConnect &pc, bool smoothEdge[4], bool cornerOnBind[4]) |
| void | updateVertex (uint idVert, uint corner, bool smoothEdge[4], bool cornerOnBind[4]) |
Private Attributes | |
| TIdVertexMap | IdVertexMap |
| TVertexMap | VertexMap |
|
|
Definition at line 95 of file zone_corner_smoother.h. Referenced by computeAllCornerSmoothFlags(). |
|
|
Definition at line 92 of file zone_corner_smoother.h. |
|
|
Definition at line 94 of file zone_corner_smoother.h. |
|
|
Definition at line 91 of file zone_corner_smoother.h. |
|
|
Constructor.
Definition at line 36 of file zone_corner_smoother.cpp.
00037 {
00038 }
|
|
||||||||||||||||||||
|
Definition at line 42 of file zone_corner_smoother.cpp. References NL3D::CPatchUVLocator::build(), NL3D::CPatch::getBindNeighbor(), NL3D::CPatch::getSmoothFlag(), NL3D::CPatch::CBindInfo::MultipleBindId, NL3D::CPatch::CBindInfo::MultipleBindNum, NL3D::CPatchUVLocator::sameEdgeOrder(), uint, and NL3D::CPatch::CBindInfo::Zone. Referenced by computeAllCornerSmoothFlags().
00043 {
00044 uint edge, corner;
00045
00046 /*
00047 Some terminology here: an edge is supposed going from Corner=edge, to corner=(edge+1)&3.
00048 eg: edge 0 goes from corner0 to corner1.
00049 */
00050
00051 for(corner=0; corner<4; corner++)
00052 cornerOnBind[corner]= false;
00053
00054 // for 4 edges.
00055 for(edge=0; edge<4; edge++)
00056 {
00057 // Is this edge smoothed??
00058 smoothEdge[edge]= pa.getSmoothFlag(edge);
00059
00060 // build bindInfo.
00061 CPatch::CBindInfo bindInfo;
00062 CPatchUVLocator patchUvLocator;
00063 pa.getBindNeighbor(edge, bindInfo);
00064 // if neighbor(s) is present.
00065 if(bindInfo.Zone)
00066 {
00067 patchUvLocator.build(&pa, edge, bindInfo);
00068 // if not sameEdgeOnOrder (NB: all special cases of bind 1/X X/1 managed :) ), not smoothed!
00069 if( !patchUvLocator.sameEdgeOrder() )
00070 smoothEdge[edge]= false;
00071
00072 // Manage bind 1/4 for the 2 patchs on the center of the bind.
00073 if(bindInfo.MultipleBindNum==4 && (bindInfo.MultipleBindId==1 || bindInfo.MultipleBindId==2) )
00074 {
00075 // easy, this edge starts and ends on a bind...
00076 cornerOnBind[edge]= true;
00077 cornerOnBind[(edge+1)&3]= true;
00078 }
00079 // else for case bind 1/2, and for case of patch 0 and patch 3 of the bind 1/4.
00080 else if(bindInfo.MultipleBindNum>=2)
00081 {
00082 // Beware of the mirroring!! (make a draw...)
00083 /*
00084 ----------|-----------
00085 |
00086 | |
00087 1 | |
00088 ^ | v
00089 | |
00090 | *-----------
00091 | |
00092 | | |
00093 0 | |
00094 | v
00095 |
00096 ----------|-----------
00097 */
00098 // If we are the patch0 on the neighbor, then we start on a bind, else we ends.
00099 if(bindInfo.MultipleBindId==0)
00100 cornerOnBind[edge]= true;
00101 else
00102 cornerOnBind[(edge+1)&3]= true;
00103 }
00104
00105 }
00106 }
00107 }
|
|
||||||||||||
|
the doit method. this Zone and his 8 neighbors should be added into a landscape. this method call setCornerSmoothFlag() on all CPatch of the zone. All corner smooth are set to false but if:
This is important for noise computing, and lighting. Definition at line 134 of file zone_corner_smoother.cpp. References NL3D::CZone::CPatchConnect::BaseVertices, buildPatchBindInfo(), NL3D::CPatch::getCornerVertex(), NL3D::CZone::getNumPatchs(), NL3D::CZone::getPatchConnect(), IdVertexMap, ItIdVertexMap, nlassert, NL3D::CZoneCornerSmoother::CVertexSmoothInfo::NPatchShared, NL3D::CPatch::setCornerSmoothFlag(), sint, NL3D::CZoneCornerSmoother::CVertexSmoothInfo::Smoothed, uint, updateVertex(), VertexMap, and NL3D::CZoneCornerSmoother::CVertexSmoothInfo::VertexOnBind.
00135 {
00136 nlassert(zone);
00137 sint npatchs= zone->getNumPatchs();
00138 sint i;
00139
00140 VertexMap.clear();
00141 IdVertexMap.clear();
00142
00143 // for all patchs of the center zone, build the vertexMap.
00144 //==================
00145 for(i=0; i<npatchs; i++)
00146 {
00147 CPatch &pa= (CPatch&)*(((const CZone*)zone)->getPatch(i));
00148 const CZone::CPatchConnect &pc= *(zone->getPatchConnect(i));
00149 uint corner;
00150
00151 // build bind info for 4 edges and 4 vertices.
00152 bool smoothEdge[4];
00153 bool cornerOnBind[4];
00154 buildPatchBindInfo(pa, pc, smoothEdge, cornerOnBind);
00155
00156 // for 4 corners.
00157 for(corner=0; corner<4; corner++)
00158 {
00159 // get the vertex id for this patch.
00160 uint idVert= pc.BaseVertices[corner];
00161
00162 // update this vertex smooth info.
00163 updateVertex(idVert, corner, smoothEdge, cornerOnBind);
00164
00165 // for Bind with neighbor zones, must insert it in the map CTessVertex* -> VertexId.
00166 IdVertexMap[pa.getCornerVertex(corner)]= idVert;
00167 }
00168 }
00169
00170
00171 // for all patchs of all neigbhors zone, update for vertices that are connected to the centerZone.
00172 //==================
00173 for(uint nbZone=0; nbZone<neighborZones.size(); nbZone++)
00174 {
00175 CZone *neighborZone= neighborZones[nbZone];
00176 nlassert(neighborZone);
00177 for(i=0; i<neighborZone->getNumPatchs(); i++)
00178 {
00179 CPatch &pa= (CPatch&)*(((const CZone*)neighborZone)->getPatch(i));
00180 const CZone::CPatchConnect &pc= *(neighborZone->getPatchConnect(i));
00181 uint corner;
00182
00183 // build bind info for 4 edges and 4 vertices.
00184 bool smoothEdge[4];
00185 bool cornerOnBind[4];
00186 buildPatchBindInfo(pa, pc, smoothEdge, cornerOnBind);
00187
00188 // for 4 corners.
00189 for(corner=0; corner<4; corner++)
00190 {
00191 // try to find the vertex of the centerZone binded to this corner.
00192 ItIdVertexMap it= IdVertexMap.find(pa.getCornerVertex(corner));
00193
00194 // If this patch is binded on a vertex of the centerZone, must update this vertex.
00195 if(it != IdVertexMap.end())
00196 {
00197 // get the vertex id for this patch.
00198 uint idVert= it->second;
00199
00200 // update this vertex smooth info.
00201 updateVertex(idVert, corner, smoothEdge, cornerOnBind);
00202 }
00203
00204 }
00205 }
00206 }
00207
00208
00209 // for all patchs of the center zone, build the finalSmooth.
00210 //==================
00211 for(i=0; i<npatchs; i++)
00212 {
00213 CPatch &pa= (CPatch&)*(((const CZone*)zone)->getPatch(i));
00214 const CZone::CPatchConnect &pc= *(zone->getPatchConnect(i));
00215 uint corner;
00216
00217 // for 4 corners.
00218 for(corner=0; corner<4; corner++)
00219 {
00220 uint idVert= pc.BaseVertices[corner];
00221 // get from map.
00222 CVertexSmoothInfo &vert= VertexMap[idVert];
00223
00224 // the vertex is smoothed if all edges around him are smoothed, AND
00225 // if it has 4 patchs around him or if it is a bind.
00226 bool finalSmooth;
00227 finalSmooth= vert.Smoothed && (vert.VertexOnBind || vert.NPatchShared==4);
00228
00229 // update the patch.
00230 pa.setCornerSmoothFlag(corner, finalSmooth);
00231 }
00232
00233 }
00234
00235
00236 }
|
|
||||||||||||||||||||
|
Definition at line 111 of file zone_corner_smoother.cpp. References NL3D::CZoneCornerSmoother::CVertexSmoothInfo::NPatchShared, NL3D::CZoneCornerSmoother::CVertexSmoothInfo::Smoothed, uint, VertexMap, and NL3D::CZoneCornerSmoother::CVertexSmoothInfo::VertexOnBind. Referenced by computeAllCornerSmoothFlags().
00112 {
00113 // get or insert into map (with default).
00114 CVertexSmoothInfo &vert= VertexMap[idVert];
00115
00116 // inc the number of patch binded to this point.
00117 vert.NPatchShared++;
00118
00119 // get the smooth flag of edge before and after this corner.
00120 uint e0= (4+corner-1)&3;
00121 uint e1= corner;
00122 // if any one of those edge is not smoothed, then this vertex is not smoothed.
00123 if( !smoothEdge[e0] || !smoothEdge[e1] )
00124 vert.Smoothed= false;
00125
00126
00127 // Are we a vertex on a bind??
00128 if(cornerOnBind[corner])
00129 vert.VertexOnBind= true;
00130 }
|
|
|
Definition at line 100 of file zone_corner_smoother.h. Referenced by computeAllCornerSmoothFlags(). |
|
|
Definition at line 99 of file zone_corner_smoother.h. Referenced by computeAllCornerSmoothFlags(), and updateVertex(). |
1.3.6