Ignore:
Timestamp:
06/12/06 16:36:26 (18 years ago)
Author:
mattausch
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/Lib/Vis/Preprocessing/src/VspOspTree.cpp

    r1010 r1011  
    124124{} 
    125125 
     126 
    126127VspInterior::~VspInterior()  
    127128{  
     
    130131} 
    131132 
     133 
    132134bool VspInterior::IsLeaf() const 
    133135{  
     
    135137} 
    136138 
     139 
    137140VspNode *VspInterior::GetBack()  
    138141{ 
     
    140143} 
    141144 
     145 
    142146VspNode *VspInterior::GetFront()  
    143147{ 
     
    145149} 
    146150 
     151 
    147152AxisAlignedPlane VspInterior::GetPlane() const 
    148153{ 
    149154        return mPlane; 
    150155} 
     156 
    151157 
    152158void VspInterior::ReplaceChildLink(VspNode *oldChild, VspNode *newChild)  
     
    157163                mFront = newChild; 
    158164} 
     165 
    159166 
    160167void VspInterior::SetupChildLinks(VspNode *b, VspNode *f)  
     
    527534{ 
    528535        return 
    529                 (mOutOfMemory  
    530                 || (mVspStats.Leaves() >= mMaxViewCells)  
    531                 || (mGlobalCostMisses >= mTermGlobalCostMissTolerance) 
    532                  ); 
     536                (mOutOfMemory ||  
     537                (mVspStats.Leaves() >= mMaxViewCells) ||  
     538                (mGlobalCostMisses >= mTermGlobalCostMissTolerance)); 
    533539} 
    534540 
     
    680686        backData.mRays = new RayInfoContainer(); 
    681687         
    682  
    683688        //-- subdivide rays 
    684 #if TODO         
    685689        SplitRays(splitPlane, 
    686690                          *tData.mRays, 
    687691                          *frontData.mRays, 
    688692                          *backData.mRays); 
    689 #endif 
    690  
    691         // compute pvs 
     693 
     694        //-- compute pvs 
    692695        frontData.mPvs = ComputePvsSize(*frontData.mRays); 
    693696        backData.mPvs = ComputePvsSize(*backData.mRays); 
    694697 
    695698        // split front and back node geometry and compute area 
    696          
    697         // if geometry was not already computed 
    698         // TODO 
    699  
    700 #if TODO 
    701699        tData.mBoundingBox.Split(splitPlane.mAxis, splitPlane.mPosition,  
    702700                                                         frontData.mBoundingBox, backData.mBoundingBox); 
    703701 
    704 #endif 
    705702 
    706703        frontData.mProbability = frontData.mBoundingBox.GetVolume(); 
     
    10391036        int bestAxis = -1; 
    10401037 
    1041 #if 0 
    1042         // maximum cost ratio for axis to be valid: 
    1043         // if exceeded, spatial mid split is used instead 
    1044         const maxCostRatioForHeur = 0.99f; 
    1045 #endif 
    10461038 
    10471039        // if we use some kind of specialised fixed axis 
     
    11461138        } 
    11471139 
    1148 #if TODO 
    1149         pFront = geomFront.GetVolume(); 
     1140        AxisAlignedBox3 frontBox; 
     1141        AxisAlignedBox3 backBox; 
     1142 
     1143        data.mBoundingBox.Split(candidatePlane.mAxis, candidatePlane.mPosition, frontBox, backBox); 
     1144 
     1145        pFront = frontBox.GetVolume(); 
    11501146        pBack = pOverall - pFront; 
    1151 #endif 
    11521147                 
    11531148 
     
    13991394        Intersectable::NewMail(); 
    14001395        ViewCell::NewMail(); 
     1396 
    14011397        Vector3 entp = ray.Extrap(mint); 
    14021398        Vector3 extp = ray.Extrap(maxt); 
     
    16511647 
    16521648 
    1653 int VspOspTree::SplitRays(const Plane3 &plane, 
    1654                                                   RayInfoContainer &rays, 
    1655                                                   RayInfoContainer &frontRays, 
    1656                                                   RayInfoContainer &backRays) const 
    1657 { 
    1658         int splits = 0; 
    1659  
    1660         RayInfoContainer::const_iterator it, it_end = rays.end(); 
    1661  
    1662         for (it = rays.begin(); it != it_end; ++ it) 
    1663         { 
    1664                 RayInfo bRay = *it; 
    1665                  
    1666                 VssRay *ray = bRay.mRay; 
    1667                 float t; 
    1668  
    1669                 // get classification and receive new t 
    1670                 const int cf = bRay.ComputeRayIntersection(plane, t); 
    1671  
    1672                 switch (cf) 
    1673                 { 
    1674                 case -1: 
    1675                         backRays.push_back(bRay); 
    1676                         break; 
    1677                 case 1: 
    1678                         frontRays.push_back(bRay); 
    1679                         break; 
    1680                 case 0: 
    1681                         { 
    1682                                 //-- split ray 
    1683                                 //-- test if start point behind or in front of plane 
    1684                                 const int side = plane.Side(bRay.ExtrapOrigin()); 
    1685  
    1686                                 if (side <= 0) 
    1687                                 { 
    1688                                         backRays.push_back(RayInfo(ray, bRay.GetMinT(), t)); 
    1689                                         frontRays.push_back(RayInfo(ray, t, bRay.GetMaxT())); 
    1690                                 } 
    1691                                 else 
    1692                                 { 
    1693                                         frontRays.push_back(RayInfo(ray, bRay.GetMinT(), t)); 
    1694                                         backRays.push_back(RayInfo(ray, t, bRay.GetMaxT())); 
    1695                                 } 
    1696                         } 
    1697                         break; 
    1698                 default: 
    1699                         Debug << "Should not come here" << endl; 
    1700                         break; 
    1701                 } 
    1702         } 
    1703  
    1704         return splits; 
    1705 } 
    1706  
    1707  
    17081649int VspOspTree::FindNeighbors(VspNode *n, vector<VspLeaf *> &neighbors, 
    17091650                                                          const bool onlyUnmailed) const 
     
    18491790        int hits = 0; 
    18501791#if TODO 
    1851         stack<BspRayTraversalData> tStack; 
     1792        stack<VspRayTraversalData> tStack; 
    18521793 
    18531794        float mint = 0.0f, maxt = 1.0f; 
     
    21952136} 
    21962137 
    2197 } 
     2138 
     2139int VspOspTree::SplitRays(const AxisAlignedPlane &plane, 
     2140                                                  RayInfoContainer &rays, 
     2141                                                  RayInfoContainer &frontRays, 
     2142                                                  RayInfoContainer &backRays) const 
     2143{ 
     2144        int splits = 0; 
     2145 
     2146        RayInfoContainer::const_iterator rit, rit_end = rays.end(); 
     2147 
     2148        for (rit = rays.begin(); rit != rit_end; ++ rit) 
     2149        { 
     2150                RayInfo bRay = *rit; 
     2151                 
     2152                VssRay *ray = bRay.mRay; 
     2153                float t; 
     2154 
     2155                // get classification and receive new t 
     2156                //-- test if start point behind or in front of plane 
     2157                const int side = plane.ComputeRayIntersection(bRay, t); 
     2158 
     2159                if (side == 0) 
     2160                { 
     2161                        ++ splits; 
     2162 
     2163                        if (ray->HasPosDir(plane.mAxis)) 
     2164                        { 
     2165                                backRays.push_back(RayInfo(ray, bRay.GetMinT(), t)); 
     2166                                frontRays.push_back(RayInfo(ray, t, bRay.GetMaxT())); 
     2167                        } 
     2168                        else 
     2169                        { 
     2170                                frontRays.push_back(RayInfo(ray, bRay.GetMinT(), t)); 
     2171                                backRays.push_back(RayInfo(ray, t, bRay.GetMaxT())); 
     2172                        } 
     2173                } 
     2174                else if (side == 1) 
     2175                { 
     2176                        frontRays.push_back(bRay); 
     2177                } 
     2178                else 
     2179                { 
     2180                        backRays.push_back(bRay); 
     2181                } 
     2182 
     2183        } 
     2184 
     2185        return splits; 
     2186} 
     2187 
     2188} 
Note: See TracChangeset for help on using the changeset viewer.