Ignore:
Timestamp:
04/23/07 16:19:30 (18 years ago)
Author:
mattausch
Message:

implemented part of rendering estimation of wimmer et al. for view space / object space subdivision.
warning: not working with undersampling estimation + local visibility based subdivision.

Location:
GTP/trunk/Lib/Vis/Preprocessing/src
Files:
23 edited

Legend:

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

    r2176 r2332  
    23562356 
    23572357        point *= 1.0f / sum; 
    2358  
    23592358        //normal = face.GetNormal(); 
    23602359 
  • GTP/trunk/Lib/Vis/Preprocessing/src/BvHierarchy.cpp

    r2255 r2332  
    2727#define USE_VOLUMES_FOR_HEURISTICS 1 
    2828#define TEST_POWERPLANT 0 
    29 #define USE_BETTER_RENDERCOST_EST 0 
     29 
    3030 
    3131//int BvhNode::sMailId = 10000; 
     
    5353/*              class BvhNode implementation                   */ 
    5454/***************************************************************/ 
    55  
    5655 
    5756BvhNode::BvhNode():  
     
    387386 
    388387 
     388void BvHierarchy::UpdateViewCells(const BvhSubdivisionCandidate &sc) 
     389{ 
     390        ViewCellContainer viewCells, frontViewCells, backViewCells; 
     391         
     392        CollectViewCells(*sc.mParentData.mSampledObjects, viewCells, false, false); 
     393        CollectViewCells(sc.mSampledFrontObjects, frontViewCells, false, false); 
     394        CollectViewCells(sc.mSampledBackObjects, backViewCells, false, false); 
     395 
     396        const float frontTri = (float)sc.mFrontObjects.size(); 
     397        const float backTri = (float)sc.mBackObjects.size(); 
     398        const float totalTri = (float)(*sc.mParentData.mSortedObjects[0]).size(); 
     399 
     400        ViewCell::NewMail(3); 
     401 
     402        ViewCellContainer::const_iterator fit, fit_end = frontViewCells.end(); 
     403 
     404        for (fit = frontViewCells.begin(); fit != fit_end; ++ fit) 
     405        { 
     406                ViewCell *vc = *fit; 
     407                vc->Mail(0); 
     408        } 
     409 
     410        ViewCellContainer::const_iterator bit, bit_end = backViewCells.end(); 
     411 
     412        for (bit = backViewCells.begin(); bit != bit_end; ++ bit) 
     413        { 
     414                ViewCell *vc = *bit; 
     415 
     416                if (vc->Mailed(0)) 
     417                        vc->Mail(2); 
     418                else 
     419                        vc->Mail(1); 
     420        } 
     421 
     422        ViewCellContainer::const_iterator vit, vit_end = viewCells.end(); 
     423         
     424        for (vit = viewCells.begin(); vit != viewCells.end(); ++ vit) 
     425        { 
     426                ViewCell *vc = *vit; 
     427 
     428                float vcTri; 
     429                int vcObj; 
     430 
     431                float oldVcTri = vc->GetPvsCost(); 
     432                int oldVcObj = vc->GetEntriesInPvs(); 
     433 
     434                // both objects in view cell 
     435                if (vc->Mailed(2)) 
     436                { 
     437                        vcTri = oldVcTri; 
     438                        vcObj = oldVcObj + 1;    
     439                } 
     440                else if (vc->Mailed(1)) 
     441                { 
     442                        vcTri = oldVcTri - totalTri + backTri;  
     443                        vcObj = oldVcObj;    
     444                } 
     445                else // (vc->Mailed(0)) 
     446                { 
     447                        vcTri = oldVcTri - totalTri + frontTri;  
     448                        vcObj = oldVcObj; 
     449                } 
     450 
     451                vc->SetPvsCost(vcTri); 
     452                vc->SetEntriesInPvs(vcObj); 
     453 
     454                //cout << "old pvs tri: " << oldVcTri << " new: " << vcTri << endl; 
     455                //cout << "old pvs obj: " << oldVcObj << " new: " << vcObj<< endl; 
     456        } 
     457} 
     458 
     459 
    389460BvhInterior *BvHierarchy::SubdivideNode(const BvhSubdivisionCandidate &sc, 
    390461                                                                                BvhTraversalData &frontData, 
     
    439510 
    440511  
    441         //////////////////////////////////////// 
     512        //////////////////////////////// 
    442513        //-- fill front and back traversal data with the new values 
    443514 
     
    467538        //-- compute pvs correction to cope with undersampling 
    468539 
    469         frontData.mPvs = (float)sc.mNumFrontViewCells;//(float)CountViewCells(sc.mSampledFrontObjects); 
    470         backData.mPvs = (float)sc.mNumBackViewCells;//(float)CountViewCells(sc.mSampledBackObjects); 
     540        frontData.mPvs = (float)sc.mNumFrontViewCells; 
     541        backData.mPvs = (float)sc.mNumBackViewCells; 
    471542 
    472543        frontData.mCorrectedPvs = sc.mCorrectedFrontPvs; 
     
    476547        // compute probability of this node being visible,  
    477548        // i.e., volume of the view cells that can see this node 
    478         frontData.mVolume = sc.mVolumeFrontViewCells;//EvalViewCellsVolume(sc.mSampledFrontObjects) / GetViewSpaceVolume(); 
    479         backData.mVolume = sc.mVolumeBackViewCells;//EvalViewCellsVolume(sc.mSampledBackObjects) / GetViewSpaceVolume(); 
     549        frontData.mVolume = sc.mVolumeFrontViewCells; 
     550        backData.mVolume = sc.mVolumeBackViewCells; 
    480551 
    481552        frontData.mCorrectedVolume = sc.mCorrectedFrontVolume; 
     
    495566                AssignSortedObjects(sc, frontData, backData); 
    496567        } 
     568 
     569        // compute e.g., new render cost decrease after this split 
     570        UpdateViewCells(sc); 
    497571 
    498572        mNodeTimer.Exit(); 
     
    649723        mPlaneTimer.Entry(); 
    650724 
     725        const BvhTraversalData &tData = splitCandidate.mParentData; 
     726        BvhLeaf *leaf = tData.mNode; 
     727 
    651728#if STORE_VIEWCELLS_WITH_BVH 
    652729        if (preprocessViewCells) // fill view cells cache 
     
    658735                splitCandidate.mFrontObjects.clear(); 
    659736                splitCandidate.mBackObjects.clear(); 
     737 
    660738                splitCandidate.mSampledFrontObjects.clear(); 
    661739                splitCandidate.mSampledBackObjects.clear(); 
    662740 
    663741                const bool sufficientSamples =  
    664                         splitCandidate.mParentData.mNumRays > mMinRaysForVisibility; 
    665  
    666                 //if (!sufficientSamples) cout << splitCandidate.mParentData.mNumRays << " "; 
     742                        tData.mNumRays > mMinRaysForVisibility; 
    667743 
    668744                const bool useVisibiliyBasedHeuristics =  
     
    673749 
    674750                // compute best object partition 
    675                 const float ratio =     SelectObjectPartition(splitCandidate.mParentData,  
     751                const float ratio =     SelectObjectPartition(tData,  
    676752                                                                                                  splitCandidate.mFrontObjects,  
    677753                                                                                                  splitCandidate.mBackObjects, 
     
    691767        mPlaneTimer.Exit(); 
    692768 
     769 
     770        /////////////////// 
     771 
    693772        mEvalTimer.Entry(); 
    694773 
    695         const BvhTraversalData &tData = splitCandidate.mParentData; 
    696         BvhLeaf *leaf = tData.mNode; 
    697  
    698         // avg contribution of a ray to a pvs 
    699         const float pvs = (float)CountViewCells(*tData.mSampledObjects); 
    700         //const float avgRayContri = AvgRayContribution((int)pvs, tData.mNumRays); 
     774        ViewCellContainer viewCells, frontViewCells, backViewCells; 
     775         
     776        CollectViewCells(*tData.mSampledObjects, viewCells, false, false); 
     777        CollectViewCells(splitCandidate.mSampledFrontObjects, frontViewCells, false, false); 
     778        CollectViewCells(splitCandidate.mSampledBackObjects, backViewCells, false, false); 
     779 
     780        // compute view cells seen from front and back side of the split 
     781        float volFront = 0, volBack = 0, parentVol = 0; 
     782 
     783        ViewCell::NewMail(3); 
     784 
     785        ViewCellContainer::const_iterator fvit, fvit_end = frontViewCells.end(); 
     786 
     787        for (fvit = frontViewCells.begin(); fvit != fvit_end; ++ fvit) 
     788        { 
     789                ViewCell *vc = *fvit; 
     790                vc->Mail(0); 
     791                 
     792                volFront += vc->GetVolume(); 
     793                parentVol += vc->GetVolume(); 
     794        } 
     795 
     796        ViewCellContainer::const_iterator bvit, bvit_end = backViewCells.end(); 
     797         
     798        int frontAndBackViewCells = 0; 
     799 
     800        for (bvit = backViewCells.begin(); bvit != bvit_end; ++ bvit) 
     801        { 
     802                ViewCell *vc = *bvit; 
     803 
     804                if (vc->Mailed(0)) 
     805                { 
     806                        // view cell sees front AND on back side 
     807                        ++ frontAndBackViewCells; 
     808                        vc->Mail(2); 
     809                } 
     810                else 
     811                { 
     812                        vc->Mail(1); 
     813                        parentVol += vc->GetVolume(); 
     814                } 
     815 
     816                volBack += vc->GetVolume(); 
     817        } 
     818 
     819         
     820        ///////////////////// 
     821        //-- this bvh node is a pvs entry in all the view cells that see one of the objects. 
     822         
     823        // pvs size induced by this bvh node is #view cells 
     824        const float pvs = (float)viewCells.size(); 
    701825        const float avgRaysPerObject = AvgRaysPerObject((int)pvs, tData.mNumRays); 
    702826 
    703         // high avg ray contri, the result is influenced by undersampling 
     827        // for low #rays per object => the result is influenced by undersampling 
    704828        splitCandidate.SetAvgRaysPerObject(avgRaysPerObject); 
    705829        const float viewSpaceVol = GetViewSpaceVolume(); 
    706830 
    707         const float oldVolume = EvalViewCellsVolume(*tData.mSampledObjects) / viewSpaceVol; 
    708         const float oldRatio = (tData.mVolume > 0) ? oldVolume / tData.mVolume : 1; 
    709         const float parentVol = tData.mCorrectedVolume * oldRatio; 
    710  
    711         //cout << "h " << avgRaysPerObject << " "; 
    712         // this leaf is a pvs entry in all the view cells 
    713         // that see one of the objects. 
    714         splitCandidate.mVolumeFrontViewCells = EvalViewCellsVolume(splitCandidate.mSampledFrontObjects) / viewSpaceVol; 
    715         splitCandidate.mVolumeBackViewCells = EvalViewCellsVolume(splitCandidate.mSampledBackObjects) / viewSpaceVol; 
    716  
    717         splitCandidate.mNumFrontViewCells = CountViewCells(splitCandidate.mSampledFrontObjects); 
    718         splitCandidate.mNumBackViewCells = CountViewCells(splitCandidate.mSampledBackObjects); 
    719  
     831        splitCandidate.mVolumeFrontViewCells = volFront / viewSpaceVol; 
     832        splitCandidate.mVolumeBackViewCells = volBack / viewSpaceVol; 
     833 
     834        splitCandidate.mNumFrontViewCells = (int)frontViewCells.size(); 
     835        splitCandidate.mNumBackViewCells = (int)backViewCells.size(); 
     836 
     837        // currently not working!! 
     838        // todo matt: fix this to cope with undersampling for new evaluation method 
    720839        splitCandidate.mCorrectedFrontVolume =  
    721                 mHierarchyManager->EvalCorrectedPvs(splitCandidate.mVolumeFrontViewCells, parentVol, avgRaysPerObject); 
     840                mHierarchyManager->EvalCorrectedPvs(splitCandidate.mVolumeFrontViewCells,  
     841                                                                                        parentVol,  
     842                                                                                        avgRaysPerObject); 
    722843         
    723844        splitCandidate.mCorrectedBackVolume =  
    724                 mHierarchyManager->EvalCorrectedPvs(splitCandidate.mVolumeBackViewCells, parentVol, avgRaysPerObject); 
    725          
    726         const float relfrontCost = splitCandidate.mCorrectedFrontVolume *  
    727                 EvalAbsCost(splitCandidate.mFrontObjects); 
    728         const float relBackCost =  splitCandidate.mCorrectedBackVolume *  
    729                 EvalAbsCost(splitCandidate.mBackObjects); 
    730         const float relParentCost = parentVol * EvalAbsCost(leaf->mObjects); 
     845                mHierarchyManager->EvalCorrectedPvs(splitCandidate.mVolumeBackViewCells,  
     846                                                                                        parentVol,  
     847                                                                                        avgRaysPerObject); 
     848 
     849        /////////////////////////////////// 
     850 
     851 
     852        float newRenderCost = 0, oldRenderCost = 0; 
     853 
     854        const float frontTri = (float)splitCandidate.mFrontObjects.size(); 
     855        const float backTri = (float)splitCandidate.mBackObjects.size(); 
     856        // total #triangles in parent 
     857        const float totalTri = (float)(*tData.mSortedObjects[0]).size(); 
     858 
     859 
     860        // compute render cost decrease in the seen view cells 
     861        ViewCellContainer::const_iterator vit, vit_end = viewCells.end(); 
     862         
     863        for (vit = viewCells.begin(); vit != viewCells.end(); ++ vit) 
     864        { 
     865                ViewCell *vc = *vit; 
     866 
     867                // triangles in this view cell 
     868                float vcTri; 
     869                // #entries in this view cell 
     870                int vcObj; 
     871 
     872                float oldVcTri = vc->GetPvsCost(); 
     873                int oldVcObj = vc->GetEntriesInPvs(); 
     874 
     875                // both nodes in this view cell 
     876                if (vc->Mailed(2)) 
     877                { 
     878                        vcTri = oldVcTri; 
     879                        // #entries is increasing 
     880                        vcObj = oldVcObj + 1;    
     881                } 
     882                else if (vc->Mailed(1)) 
     883                { 
     884                        // only front node in this view cell: #triangles is decreasing 
     885                        vcTri = oldVcTri - totalTri + backTri;  
     886                        vcObj = oldVcObj;    
     887                } 
     888                else // (vc->Mailed(0)) 
     889                { 
     890                        // // only back node in this view cell: #triangles is decreasing 
     891                        vcTri = oldVcTri - totalTri + frontTri;  
     892                        vcObj = oldVcObj; 
     893                } 
     894 
     895                oldRenderCost += mViewCellsManager->ComputeRenderCost((int)oldVcTri, (int)oldVcObj) * vc->GetVolume()  / viewSpaceVol; 
     896                newRenderCost += mViewCellsManager->ComputeRenderCost((int)vcTri, (int)vcObj) * vc->GetVolume() / viewSpaceVol; 
     897                //cout << "old rc=" << oldRenderCost << " new rc " << newRenderCost << endl; 
     898        } 
    731899 
    732900        // compute global decrease in render cost 
    733         const float newRenderCost = relfrontCost + relBackCost; 
    734         const float renderCostDecr = relParentCost - newRenderCost; 
    735          
     901        const float renderCostDecr = (oldRenderCost - newRenderCost); 
     902 
     903        // for each view cell seen from front and back there is a new entry 
     904        const int pvsEntriesIncr = frontAndBackViewCells; 
     905 
    736906        splitCandidate.SetRenderCostDecrease(renderCostDecr); 
    737  
    738         // increase in pvs entries 
    739         const int pvsEntriesIncr = EvalPvsEntriesIncr(splitCandidate,  
    740                                                                                                   avgRaysPerObject,  
    741                                                                                                   (int)pvs,  
    742                                                                                                   splitCandidate.mNumFrontViewCells,  
    743                                                                                                   splitCandidate.mNumBackViewCells); 
    744  
    745907        splitCandidate.SetPvsEntriesIncr(pvsEntriesIncr); 
    746908 
    747         if (0) 
    748         { 
    749                 cout << "bvh volume cost" 
    750                  << " avg rays per object: " << avgRaysPerObject << " ratio: " << oldRatio  
    751                  << " parent: " << parentVol << " old vol: " << oldVolume  
    752                  << " frontvol: " << splitCandidate.mVolumeFrontViewCells << " corr. " << splitCandidate.mCorrectedFrontVolume  
    753                  << " backvol: " << splitCandidate.mVolumeBackViewCells << " corr. " << splitCandidate.mCorrectedBackVolume << endl; 
    754         } 
    755  
    756 #ifdef GTP_DEBUG 
    757         Debug << "old render cost: " << oldRenderCost << endl; 
    758         Debug << "new render cost: " << newRenderCost << endl; 
    759         Debug << "render cost decrease: " << renderCostDecr << endl; 
    760 #endif 
    761  
    762         float priority = EvalPriority(splitCandidate,  
    763                                                                   renderCostDecr, 
    764                                                                   relParentCost); 
    765  
    766         // compute global decrease in render cost 
     909        //cout << "bvh render cost decrease=" << renderCostDecr << endl; 
     910 
     911        // at last computed priority based on render cost reduction / memory increase 
     912        const float priority = EvalPriority(splitCandidate, renderCostDecr,     oldRenderCost); 
    767913        splitCandidate.SetPriority(priority); 
    768914 
     
    782928                                                                        const int numBackViewCells) //const 
    783929{ 
    784         const float oldPvsSize = (float)numParentViewCells;//CountViewCells(*splitCandidate.mParentData.mSampledObjects); 
    785         const float oldPvsRatio = (splitCandidate.mParentData.mPvs > 0) ? oldPvsSize / splitCandidate.mParentData.mPvs : 1; 
     930        const float oldPvsSize = (float)numParentViewCells; 
     931        const float oldPvsRatio =  
     932                (splitCandidate.mParentData.mPvs > 0) ? oldPvsSize / splitCandidate.mParentData.mPvs : 1; 
    786933 
    787934        const float parentPvs = splitCandidate.mParentData.mCorrectedPvs * oldPvsRatio; 
    788935 
    789         const int frontViewCells = numFrontViewCells;//CountViewCells(splitCandidate.mSampledFrontObjects); 
    790         const int backViewCells = numBackViewCells;//CountViewCells(splitCandidate.mSampledBackObjects); 
     936        const int frontViewCells = numFrontViewCells; 
     937        const int backViewCells = numBackViewCells; 
    791938         
    792939        splitCandidate.mCorrectedFrontPvs =  
     
    10361183        PrepareLocalSubdivisionCandidates(tData, axis); 
    10371184 
    1038         const float totalRenderCost = EvalAbsCost(tData.mNode->mObjects); 
     1185        const float totalRenderCost = (float)tData.mNode->mObjects.size(); 
    10391186        float objectsLeft = 0, objectsRight = totalRenderCost; 
    10401187   
     
    10881235                Intersectable *obj = (*cit).mObject; 
    10891236 
    1090 #if USE_BETTER_RENDERCOST_EST 
    1091                 const float renderCost = ViewCellsManager::EvalRenderCost(obj); 
    1092                  
    1093                 objectsLeft += renderCost; 
    1094                 objectsRight -= renderCost; 
    1095  
    1096                 const bool noValidSplit = ((objectsLeft <= Limits::Small) || (objectsRight <= Limits::Small)); 
    1097  
    1098 #else 
    10991237                ++ objectsLeft; 
    11001238                -- objectsRight; 
    11011239 
    1102                 const bool noValidSplit = !objectsLeft || !objectsRight; 
    1103 #endif 
     1240                const bool noValidSplit = ((objectsLeft <= Limits::Small) || (objectsRight <= Limits::Small)); 
    11041241                const AxisAlignedBox3 obox = obj->GetBox(); 
    11051242 
     
    11311268                const float sum = noValidSplit ? 1e25f : objectsLeft * al + objectsRight * ar; 
    11321269#endif 
    1133                 /*cout << "pos=" << (*cit).mPos << "\t q=(" << objectsLeft << "," << objectsRight <<")\t r=("  
    1134                          << lbox.SurfaceArea() << "," << rbox.SurfaceArea() << ")" << endl; 
    1135                 cout << "minborder: " << minBorder << " maxborder: " << maxBorder << endl; 
    1136             cout << "cost= " << sum << endl;*/ 
    11371270         
    11381271                if (sum < minSum)  
     
    11831316        PrepareLocalSubdivisionCandidates(tData, axis); 
    11841317 
    1185         const float totalRenderCost = EvalAbsCost(tData.mNode->mObjects); 
     1318        const float totalRenderCost = (float)tData.mNode->mObjects.size(); 
    11861319        float objectsLeft = 0, objectsRight = totalRenderCost; 
    11871320   
     
    12421375                Intersectable *obj = (*cit).mObject; 
    12431376 
    1244                 const float renderCost = ViewCellsManager::EvalRenderCost(obj); 
    1245                  
    1246                 objectsLeft += renderCost; 
    1247                 objectsRight -= renderCost; 
     1377                objectsLeft ++;; 
     1378                objectsRight --; 
    12481379 
    12491380                const AxisAlignedBox3 obox = obj->GetBox(); 
     
    12701401         
    12711402                const bool noValidSplit = ((objectsLeft <= Limits::Small) || (objectsRight <= Limits::Small)); 
    1272                 const float sum =  noValidSplit ? 1e25 : objectsLeft * al + objectsRight * ar; 
     1403                const float sum =  noValidSplit ? 1e25f : objectsLeft * al + objectsRight * ar; 
    12731404       
    1274                 /*cout << "pos=" << (*cit).mPos << "\t q=(" << objectsLeft << "," << objectsRight <<")\t r=("  
    1275                          << lbox.SurfaceArea() << "," << rbox.SurfaceArea() << ")" << endl; 
    1276                 cout << "minborder: " << minBorder << " maxborder: " << maxBorder << endl; 
    1277             cout << "cost= " << sum << endl;*/ 
    1278          
    12791405                if (sum < minSum)  
    12801406                {        
     
    13671493        //-- left and right and evaluate the cost funcion 
    13681494 
    1369         // prepare the heuristics by setting mailboxes and counters 
     1495        // prepare the heuristics, set mailboxes and counters 
    13701496        const float totalVol = PrepareHeuristics(tData, axis); 
    13711497         
     
    13741500        float volRight = totalVol; 
    13751501         
    1376         const float nTotalObjects = EvalAbsCost(tData.mNode->mObjects); 
     1502        const float nTotalObjects = (float)tData.mNode->mObjects.size(); 
    13771503        float nObjectsLeft = 0; 
    13781504        float nObjectsRight = nTotalObjects; 
     
    14191545                EvalHeuristicsContribution(object, volLeft, volRight); 
    14201546 
    1421 #if USE_BETTER_RENDERCOST_EST 
    1422  
    1423                 const float rc = ViewCellsManager::EvalRenderCost(object); 
    1424                  
    1425                 nObjectsLeft += rc; 
    1426                 nObjectsRight -= rc; 
    1427          
    1428 #else 
    14291547                ++ nObjectsLeft; 
    14301548                -- nObjectsRight; 
    1431 #endif 
    14321549         
    14331550                // split is only valid if #objects on left and right is not zero 
    14341551                const bool noValidSplit = (nObjectsRight <= Limits::Small); 
    14351552 
    1436 #if BOUND_RENDERCOST 
    1437  
    1438                 const float rcLeft = max(nObjectsLeft, MIN_RENDERCOST); 
    1439                 const float rcRight = max(nObjectsRight, MIN_RENDERCOST); 
    1440                  
    1441                 // the heuristics 
    1442             const float sum = noValidSplit ?  
    1443                         1e25f : volLeft * (float)rcLeft + volRight * (float)rcRight; 
    1444 #else 
    1445          
    14461553                // the heuristics 
    14471554            const float sum = noValidSplit ?  
    14481555                        1e25f : volLeft * (float)nObjectsLeft + volRight * (float)nObjectsRight; 
    1449 #endif 
     1556 
    14501557                 
    14511558#ifdef GTP_DEBUG 
     
    18291936#endif 
    18301937                } 
    1831  
    18321938        } 
    18331939 
     
    18871993        const float viewSpaceArea = mViewCellsManager->GetViewSpaceBox().SurfaceArea(); 
    18881994 
    1889         return EvalAbsCost(leaf->mObjects) * area / viewSpaceArea; 
     1995        return (float)leaf->mObjects.size() * area / viewSpaceArea; 
    18901996} 
    18911997 
     
    18962002        //-- render cost heuristics 
    18972003 
    1898         const float objRenderCost = EvalAbsCost(objects); 
     2004        const float objRenderCost = (float)objects.size(); 
    18992005 
    19002006        const float viewSpaceVol = mViewCellsManager->GetViewSpaceBox().GetVolume(); 
     
    29233029 
    29243030 
    2925 BvhNode *BvHierarchy::SubdivideAndCopy(SplitQueue &tQueue,  
    2926                                                                            SubdivisionCandidate *splitCandidate) 
    2927 { 
    2928         BvhSubdivisionCandidate *sc =  
    2929                 static_cast<BvhSubdivisionCandidate *>(splitCandidate); 
    2930         BvhTraversalData &tData = sc->mParentData; 
    2931  
    2932         BvhNode *currentNode = tData.mNode; 
    2933         BvhNode *oldNode = (BvhNode *)splitCandidate->mEvaluationHack; 
    2934  
    2935         if (!oldNode->IsLeaf()) 
    2936         {        
    2937                 ////////////// 
    2938                 //-- continue subdivision 
    2939  
    2940                 BvhTraversalData tFrontData; 
    2941                 BvhTraversalData tBackData; 
    2942                          
    2943                 BvhInterior *oldInterior = static_cast<BvhInterior *>(oldNode); 
    2944                  
    2945                 sc->mFrontObjects.clear(); 
    2946                 sc->mBackObjects.clear(); 
    2947  
    2948                 oldInterior->GetFront()->CollectObjects(sc->mFrontObjects); 
    2949                 oldInterior->GetBack()->CollectObjects(sc->mBackObjects); 
    2950                  
    2951                 // evaluate the changes in render cost and pvs entries 
    2952                 EvalSubdivisionCandidate(*sc, false, true); 
    2953  
    2954                 // create new interior node and two leaf node 
    2955                 currentNode = SubdivideNode(*sc, tFrontData, tBackData); 
    2956          
    2957                 //oldNode->mRenderCostDecr += sc->GetRenderCostDecrease(); 
    2958                 //oldNode->mPvsEntriesIncr += sc->GetPvsEntriesIncr(); 
    2959                  
    2960                 //oldNode->mRenderCostDecr = sc->GetRenderCostDecrease(); 
    2961                 //oldNode->mPvsEntriesIncr = sc->GetPvsEntriesIncr(); 
    2962                  
    2963                 /////////////////////////// 
    2964                 //-- push the new split candidates on the queue 
    2965                  
    2966                 BvhSubdivisionCandidate *frontCandidate = new BvhSubdivisionCandidate(tFrontData); 
    2967                 BvhSubdivisionCandidate *backCandidate = new BvhSubdivisionCandidate(tBackData); 
    2968  
    2969                 frontCandidate->SetPriority((float)-oldInterior->GetFront()->GetTimeStamp()); 
    2970                 backCandidate->SetPriority((float)-oldInterior->GetBack()->GetTimeStamp()); 
    2971  
    2972                 frontCandidate->mEvaluationHack = oldInterior->GetFront(); 
    2973                 backCandidate->mEvaluationHack = oldInterior->GetBack(); 
    2974  
    2975                 // cross reference 
    2976                 tFrontData.mNode->SetSubdivisionCandidate(frontCandidate);  
    2977                 tBackData.mNode->SetSubdivisionCandidate(backCandidate); 
    2978  
    2979                 //cout << "f: " << frontCandidate->GetPriority() << " b: " << backCandidate->GetPriority() << endl; 
    2980                 tQueue.Push(frontCandidate); 
    2981                 tQueue.Push(backCandidate); 
    2982         } 
    2983  
    2984         ///////////////////////////////// 
    2985         //-- node is a leaf => terminate traversal 
    2986  
    2987         if (currentNode->IsLeaf()) 
    2988         { 
    2989                 // this leaf is no candidate for splitting anymore 
    2990                 // => detach subdivision candidate 
    2991                 tData.mNode->SetSubdivisionCandidate(NULL);  
    2992                 // detach node so we don't delete it with the traversal data 
    2993                 tData.mNode = NULL; 
    2994         } 
    2995          
    2996         return currentNode; 
    2997 } 
    2998  
    2999  
    30003031void BvHierarchy::CollectObjects(const AxisAlignedBox3 &box, 
    30013032                                                                 ObjectContainer &objects) 
     
    31713202 
    31723203// HACK 
    3173 float BvHierarchy::GetRenderCostIncrementially(BvhNode *node) const 
    3174 { 
    3175         if (node->mRenderCost < 0) // render cost must be evaluated ... 
    3176         { 
     3204float BvHierarchy::GetTriangleSizeIncrementially(BvhNode *node) const 
     3205{ 
     3206        if (node->mRenderCost < 0) 
     3207        { 
     3208                //cout <<"p"; 
    31773209                if (node->IsLeaf()) 
    31783210                { 
    31793211                        BvhLeaf *leaf = static_cast<BvhLeaf *>(node); 
    3180                         node->mRenderCost = EvalAbsCost(leaf->mObjects);                 
    3181                         //if (leaf->mObjects.size() < 100) cout <<"p"; 
     3212                        node->mRenderCost = (float)leaf->mObjects.size(); 
    31823213                } 
    31833214                else 
     
    31853216                        BvhInterior *interior = static_cast<BvhInterior *>(node); 
    31863217                 
    3187                         node->mRenderCost = GetRenderCostIncrementially(interior->GetFront()) +  
    3188                                                                 GetRenderCostIncrementially(interior->GetBack()); 
     3218                        node->mRenderCost = GetTriangleSizeIncrementially(interior->GetFront()) +  
     3219                                                                GetTriangleSizeIncrementially(interior->GetBack()); 
    31893220                } 
    31903221        } 
  • GTP/trunk/Lib/Vis/Preprocessing/src/BvHierarchy.h

    r2255 r2332  
    5252        int Nodes() const {return nodes;} 
    5353        int Interior() const { return nodes / 2; } 
    54         int Leaves() const { return (nodes / 2) + 1; } 
     54        int Leaves() const { return nodes / 2 + 1; } 
    5555         
    5656        double AvgDepth() const  
     
    668668        void StoreSampledObjects(ObjectContainer &sampledObjects, const ObjectContainer &objects); 
    669669 
    670         /////////////////////////// 
    671         // hacks in order to provide interleaved heurisitcs 
    672  
    673         BvhNode *SubdivideAndCopy(SplitQueue &tQueue, SubdivisionCandidate *splitCandidate); 
    674  
    675670        ///////////////////////////////// 
    676671 
    677         static inline float EvalAbsCost(const ObjectContainer &objects); 
    678  
    679672        void CollectObjects(const AxisAlignedBox3 &box, ObjectContainer &objects); 
    680673 
    681         float GetRenderCostIncrementially(BvhNode *node) const; 
     674        float GetTriangleSizeIncrementially(BvhNode *node) const; 
    682675 
    683676        void Compress(); 
     
    995988        */ 
    996989        void SetUniqueNodeIds(); 
     990 
     991        void UpdateViewCells(const BvhSubdivisionCandidate &sc); 
     992 
    997993 
    998994protected: 
     
    11011097 
    11021098 
    1103 float BvHierarchy::EvalAbsCost(const ObjectContainer &objects) 
    1104 { 
    1105         float result; 
    1106  
    1107 #if USE_BETTER_RENDERCOST_EST 
    1108          
    1109         const float switchcost = 1.0f; 
    1110  
    1111         float o = 0; 
    1112  
    1113         ObjectContainer::const_iterator oit, oit_end = objects.end(); 
    1114  
    1115         for (oit = objects.begin(); oit != oit_end; ++ oit) 
    1116         { 
    1117                 o += ViewCellsManager::GetRendercost(*oit); 
    1118         } 
    1119  
    1120         float n = (float)objects.size() * switchcost; 
    1121          
    1122 #else 
    1123          
    1124         result = (float)objects.size(); 
     1099 
     1100} 
    11251101 
    11261102#endif 
    1127  
    1128 #if BOUND_RENDERCOST 
    1129          
    1130         if (result > MIN_RENDERCOST) 
    1131                 return result; 
    1132         else 
    1133         { 
    1134                 //std::cout << "b"; 
    1135                 return MIN_RENDERCOST; 
    1136         } 
    1137 #endif 
    1138  
    1139         return result; 
    1140 } 
    1141  
    1142 } 
    1143  
    1144 #endif 
  • GTP/trunk/Lib/Vis/Preprocessing/src/Environment.cpp

    r2228 r2332  
    15321532                                        "0.1"); 
    15331533 
     1534        RegisterOption("ViewCells.triangleWeight", 
     1535                                        optFloat, 
     1536                                        "view_cells_triangle_weight=", 
     1537                                        "1.0"); 
     1538 
     1539        RegisterOption("ViewCells.objectWeight", 
     1540                                        optFloat, 
     1541                                        "view_cells_object_weight=", 
     1542                                        "0.0"); 
     1543 
    15341544        RegisterOption("ViewCells.filename", 
    15351545                                        optString, 
  • GTP/trunk/Lib/Vis/Preprocessing/src/HierarchyManager.cpp

    r2237 r2332  
    304304 
    305305 
    306 void HierarchyManager::EvalSubdivisionStats() 
     306void HierarchyManager::PrintSubdivisionStats() 
    307307{ 
    308308         
     
    492492 
    493493        // create first nodes 
    494         mVspTree->Initialise(sampleRays, forcedViewSpace); 
     494        mVspTree->Initialise(sampleRays, forcedViewSpace, objects); 
    495495        InitialiseObjectSpaceSubdivision(objects); 
    496496 
    497497        // hack: assume that object space can be seen from view space 
    498         mHierarchyStats.mTotalCost = mInitialRenderCost = (float)objects.size(); 
     498        mHierarchyStats.mTotalCost = mInitialRenderCost = GetViewCellsManager()->ComputeRenderCost(objects.size(), 1); 
     499 
    499500        // only one entry for start 
    500501        mHierarchyStats.mPvsEntries = 1; 
    501502        mHierarchyStats.mMemory = (float)ObjectPvs::GetEntrySizeByte(); 
    502503 
    503         EvalSubdivisionStats(); 
     504        PrintSubdivisionStats(); 
    504505        Debug << "setting total cost to " << mHierarchyStats.mTotalCost << endl; 
    505506 
     
    678679        mHierarchyStats.mPvsEntries = 1; 
    679680        mHierarchyStats.mMemory = (float)ObjectPvs::GetEntrySizeByte(); 
    680         mHierarchyStats.mTotalCost = (float)objects.size(); 
     681        mHierarchyStats.mTotalCost = GetViewCellsManager()->ComputeRenderCost(objects.size(), 1); 
    681682 
    682683        mHierarchyStats.mRenderCostDecrease = 0; 
    683684 
    684         EvalSubdivisionStats(); 
     685        PrintSubdivisionStats(); 
    685686        Debug << "setting total cost to " << mHierarchyStats.mTotalCost << endl; 
    686687 
     
    689690         
    690691        // create only roots 
    691         mVspTree->Initialise(sampleRays, forcedViewSpace); 
     692        mVspTree->Initialise(sampleRays, forcedViewSpace, objects); 
    692693        InitialiseObjectSpaceSubdivision(objects); 
    693694 
     
    745746        //-- new stats 
    746747 
    747         mHierarchyStats.mTotalCost = mVspTree->mTotalCost; 
    748         cout << "\nreseting cost for vsp, new total cost: " << mHierarchyStats.mTotalCost << endl; 
     748        if (0) 
     749        { 
     750                mHierarchyStats.mTotalCost = mVspTree->mTotalCost; 
     751                cout << "\nreseting cost for vsp construction, new total cost: " << mHierarchyStats.mTotalCost << endl; 
     752        } 
    749753} 
    750754 
     
    960964 
    961965        // output stats 
    962         EvalSubdivisionStats(); 
     966        PrintSubdivisionStats(); 
    963967 
    964968        return true; 
     
    12231227 
    12241228                        // evaluate stats before first subdivision 
    1225                         EvalSubdivisionStats(); 
     1229                        PrintSubdivisionStats(); 
    12261230                        cout << "finished bv hierarchy preparation" << endl; 
    12271231                } 
     
    12411245                                                                                                 AxisAlignedBox3 *forcedViewSpace) 
    12421246{ 
    1243         ViewCellsManager *vm = mVspTree->mViewCellsManager; 
     1247        ViewCellsManager *vm = GetViewCellsManager(); 
    12441248 
    12451249        // HACK: rather not destroy vsp tree 
     
    12501254        mVspTree->mViewCellsManager = vm; 
    12511255 
    1252         mVspTree->Initialise(sampleRays, forcedViewSpace); 
     1256        mVspTree->Initialise(sampleRays, forcedViewSpace, objects); 
     1257         
    12531258         
    12541259        ////////// 
    12551260        //-- reset stats 
     1261 
    12561262    mHierarchyStats.mNodes = GetObjectSpaceSubdivisionNodes(); 
    12571263                //-mVspTree->mVspStats.nodes + 1; 
     
    12661272 
    12671273        // evaluate new stats before first subdivsiion 
    1268         EvalSubdivisionStats(); 
     1274        PrintSubdivisionStats(); 
    12691275} 
    12701276 
     
    12781284        mHierarchyStats.mNodes = 2; 
    12791285         
    1280         mHierarchyStats.mTotalCost = (float)objects.size(); 
     1286        mHierarchyStats.mTotalCost = GetViewCellsManager()->ComputeRenderCost(objects.size(), 1); 
    12811287        Debug << "setting total cost to " << mHierarchyStats.mTotalCost << endl; 
    12821288 
     
    12851291         
    12861292        // initialise view / object space 
    1287         mVspTree->Initialise(sampleRays, forcedViewSpace); 
     1293        mVspTree->Initialise(sampleRays, forcedViewSpace, objects); 
    12881294        InitialiseObjectSpaceSubdivision(objects); 
    12891295 
     
    19871993 
    19881994void HierarchyManager::ComputePvs(const ObjectPvs &pvs,  
    1989                                                                   float &rc,  
     1995                                                                  float &triangles,  
    19901996                                                                  int &pvsEntries) 
    19911997{ 
     
    20262032                        ObjectContainer objects; 
    20272033            activeNode->CollectObjects(objects); 
    2028                         rc += mBvHierarchy->EvalAbsCost(objects); 
     2034                        triangles += (float)objects.size(); 
    20292035#else 
    2030                         rc += mBvHierarchy->GetRenderCostIncrementially(activeNode); 
     2036                        triangles += mBvHierarchy->GetTriangleSizeIncrementially(activeNode); 
    20312037#endif 
    20322038                        ++ pvsEntries; 
     
    22322238        { 
    22332239                ViewCell *vc = *vit; 
    2234                 float rc = 0; 
    2235          
     2240                 
    22362241#if STUPID_METHOD        
    22372242                ObjectPvs pvs; 
     
    22542259                vc->Mail(); 
    22552260 
     2261                float triangles = 0; 
     2262                int entries = 0; 
     2263 
    22562264                if (useFilter) 
    22572265                { 
    22582266                        const long startT = GetTime(); 
     2267                         
    22592268                        ObjectPvs filteredPvs; 
    2260                         mVspTree->mViewCellsManager->ApplyFilter2(vc, false, 1.0f, filteredPvs); 
     2269                        GetViewCellsManager()->ApplyFilter2(vc, false, 1.0f, filteredPvs); 
     2270 
    22612271                        const long endT = GetTime(); 
    22622272 
    22632273                        //cout << "filter computed in " << TimeDiff(startT, endT) * 1e-3f << " secs" << endl; 
    2264                         ComputePvs(filteredPvs, rc, pvsEntries); 
     2274                         
     2275                        ComputePvs(filteredPvs, triangles, entries); 
    22652276                } 
    22662277                else 
    22672278                { 
    2268                         ComputePvs(vc->GetPvs(), rc, pvsEntries); 
    2269                         vc->SetPvsCost(rc); 
    2270                 } 
    2271  
    2272                 rc *= vc->GetVolume(); 
     2279                        ComputePvs(vc->GetPvs(), triangles, entries); 
     2280                        vc->SetPvsCost(triangles); 
     2281                } 
     2282 
     2283                const float rc = GetViewCellsManager()->ComputeRenderCost((int)triangles, entries) * vc->GetVolume(); 
     2284                 
    22732285                renderCost += rc; 
    2274         } 
    2275  
    2276         renderCost /= mVspTree->mViewCellsManager->GetViewSpaceBox().GetVolume(); 
     2286                pvsEntries += entries; 
     2287        } 
     2288 
     2289        renderCost /= GetViewCellsManager()->GetViewSpaceBox().GetVolume(); 
    22772290        memory = pvsEntries * ObjectPvs::GetEntrySize(); 
    22782291 
     
    22972310                const string filename = string(statsPrefix) + string(str); 
    22982311 
    2299                 mVspTree->mViewCellsManager->EvalViewCellHistogramForPvsSize(filename, viewCells); 
     2312                GetViewCellsManager()->EvalViewCellHistogramForPvsSize(filename, viewCells); 
    23002313 
    23012314                histoUsed = true; 
     
    23222335 
    23232336 
    2324 void HierarchyManager::ExportStats(ofstream &stats,  
    2325                                                                    SplitQueue &tQueue,  
    2326                                                                    const ObjectContainer &objects) 
    2327 { 
    2328         HierarchySubdivisionStats subStats; 
    2329         subStats.Reset(); 
    2330  
    2331         ///////////// 
    2332         //-- initial situation 
    2333  
    2334         subStats.mNumSplits = 0; 
    2335         subStats.mTotalRenderCost = (float)objects.size(); 
    2336         subStats.mEntriesInPvs = 1; 
    2337         subStats.mMemoryCost = (float)ObjectPvs::GetEntrySize(); 
    2338         subStats.mFullMemory = subStats.mMemoryCost; 
    2339         subStats.mViewSpaceSplits = 0; 
    2340         subStats.mObjectSpaceSplits = 0; 
    2341         subStats.mRenderCostDecrease = 0; 
    2342         subStats.Print(stats); 
    2343  
    2344         cout << "exporting vsposp stats ... " << endl; 
    2345  
    2346         //-- go through tree in the order of render cost decrease 
    2347         //-- which is the same order as the view cells were merged 
    2348         //-- or the reverse order of subdivision for subdivision-only  
    2349         //-- view cell hierarchies. 
    2350  
    2351         while (!tQueue.Empty()) 
    2352         { 
    2353                 SubdivisionCandidate *nextCandidate = NextSubdivisionCandidate(tQueue); 
    2354                 bool isLeaf; 
    2355                 int timeStamp; 
    2356                 //float rcDecr;  
    2357                 //int entriesIncr;  
    2358  
    2359                 if (nextCandidate->Type() == SubdivisionCandidate::VIEW_SPACE) 
    2360                 { 
    2361                         timeStamp = (int)-nextCandidate->GetPriority(); 
    2362  
    2363                         VspNode *newNode = mVspTree->SubdivideAndCopy(tQueue, nextCandidate); 
    2364                         VspNode *oldNode = (VspNode *)nextCandidate->mEvaluationHack; 
    2365  
    2366                         isLeaf = newNode->IsLeaf(); 
    2367                         //subStats.mRenderCostDecrease = oldNode->mRenderCostDecr; 
    2368                         //entriesIncr = oldNode->mPvsEntriesIncr; 
    2369                 } 
    2370                 else 
    2371                 { 
    2372                         timeStamp = (int)-nextCandidate->GetPriority(); 
    2373  
    2374                         BvhNode *newNode = mBvHierarchy->SubdivideAndCopy(tQueue, nextCandidate); 
    2375                         BvhNode *oldNode = (BvhNode *)nextCandidate->mEvaluationHack; 
    2376  
    2377                         isLeaf = newNode->IsLeaf(); 
    2378                         //subStats.mRenderCostDecrease = oldNode->mRenderCostDecr; 
    2379                         //entriesIncr = oldNode->mPvsEntriesIncr; 
    2380                 }                
    2381  
    2382                 if (!isLeaf) 
    2383                 { 
    2384                         subStats.mTotalRenderCost -= subStats.mRenderCostDecrease; 
    2385                         //subStats.mEntriesInPvs += entriesIncr; 
    2386  
    2387                         if (nextCandidate->Type() == SubdivisionCandidate::VIEW_SPACE) 
    2388                         { 
    2389                                 ++ subStats.mViewSpaceSplits; 
    2390                                 //cout << "v"; 
    2391                                 //cout << "vsp t: " << timeStamp << " rc: " << rcDecr << " pvs: " << entriesIncr << endl; 
    2392                         } 
    2393                         else 
    2394                         { 
    2395                                 ++ subStats.mObjectSpaceSplits; 
    2396                                 //cout << "o"; 
    2397                                 //"osp t: " << timeStamp << " rc: " << rcDecr << " pvs: " << entriesIncr << endl; 
    2398                         } 
    2399  
    2400                         ++ subStats.mNumSplits; 
    2401  
    2402                         if ((subStats.mNumSplits % 500) == 499) 
    2403                                 cout << subStats.mNumSplits << " steps taken" << endl; 
    2404  
    2405                         subStats.mMemoryCost = (float)subStats.mEntriesInPvs * (float)ObjectPvs::GetEntrySize(); 
    2406                         subStats.mFullMemory = subStats.mMemoryCost; 
    2407  
    2408                         subStats.Print(stats); 
    2409  
    2410                 } 
    2411  
    2412                 DEL_PTR(nextCandidate); 
    2413         } 
    2414  
    2415         stats.close(); 
    2416 } 
    2417  
    2418  
    2419 void HierarchyManager::EvaluateSubdivision(const VssRayContainer &sampleRays, 
    2420                                                                                    const ObjectContainer &objects, 
    2421                                                                                    const string &filename) 
    2422 { 
    2423 #if 0 
    2424         VspTree *oldVspTree = mVspTree; 
    2425         ViewCellsManager *vm = mVspTree->mViewCellsManager; 
    2426         BvHierarchy *oldHierarchy = mBvHierarchy; 
    2427  
    2428         mBvHierarchy = new BvHierarchy(); 
    2429         mBvHierarchy->mHierarchyManager = this; 
    2430         mBvHierarchy->mViewCellsManager = vm; 
    2431  
    2432         mVspTree = new VspTree(); 
    2433         mVspTree->mHierarchyManager = this; 
    2434         mVspTree->mViewCellsManager = vm; 
    2435  
    2436         // create first nodes 
    2437         mVspTree->Initialise(sampleRays, &oldVspTree->mBoundingBox); 
    2438         InitialiseObjectSpaceSubdivision(objects); 
    2439  
    2440         const long startTime = GetTime(); 
    2441         cout << "Constructing evaluation hierarchies ... \n"; 
    2442          
    2443         ofstream stats; 
    2444         stats.open(filename.c_str()); 
    2445         SplitQueue tQueue; 
    2446  
    2447         BvhNode *oldBvhRoot = oldHierarchy->GetRoot(); 
    2448         VspNode *oldVspRoot = oldVspTree->GetRoot(); 
    2449  
    2450         RayInfoContainer *viewSpaceRays = new RayInfoContainer(); 
    2451          
    2452         SubdivisionCandidate *firstVsp = mVspTree->PrepareConstruction(sampleRays, *viewSpaceRays); 
    2453         tQueue.Push(firstVsp); 
    2454  
    2455         mBvHierarchy->PrepareConstruction(tQueue, sampleRays, objects); 
    2456  
    2457     firstVsp->mEvaluationHack = oldVspRoot; 
    2458         firstBvh->mEvaluationHack = oldBvhRoot; 
    2459  
    2460         firstVsp->SetPriority((float)-oldVspRoot->mTimeStamp); 
    2461         firstBvh->SetPriority((float)-oldBvhRoot->GetTimeStamp()); 
    2462          
    2463         ExportStats(stats, tQueue, objects); 
    2464  
    2465         cout << "\nfinished in " << TimeDiff(startTime, GetTime()) * 1e-3 << " secs" << endl; 
    2466         RemoveRayRefs(objects); 
    2467  
    2468         // view cells needed only for evaluation 
    2469         ViewCellContainer viewCells; 
    2470         mVspTree->CollectViewCells(viewCells, false); 
    2471          
    2472         // helper trees can be destroyed 
    2473         DEL_PTR(mVspTree); 
    2474         DEL_PTR(mBvHierarchy); 
    2475  
    2476         CLEAR_CONTAINER(viewCells); 
    2477  
    2478         // reset hierarchies 
    2479         mVspTree = oldVspTree; 
    2480         mBvHierarchy = oldHierarchy; 
    2481  
    2482         // reinstall old bv refs 
    2483         vector<BvhLeaf *> leaves; 
    2484         mBvHierarchy->CollectLeaves(mBvHierarchy->GetRoot(), leaves); 
    2485         vector<BvhLeaf *>::const_iterator bit, bit_end = leaves.end(); 
    2486  
    2487         for (bit = leaves.begin(); bit != bit_end; ++ bit) 
    2488         { 
    2489                 mBvHierarchy->AssociateObjectsWithLeaf(*bit); 
    2490         } 
    2491 #endif 
    2492 } 
    2493  
    2494  
    2495 void HierarchyManager::EvaluateSubdivision2(ofstream &splitsStats, 
    2496                                                                                         const int splitsStepSize, 
    2497                                                                                         const bool useFilter, 
    2498                                                                                         const bool useHisto, 
    2499                                                                                         const int histoMem, 
    2500                                                                                         const int pass) 
     2337 
     2338void HierarchyManager::EvaluateSubdivision(ofstream &splitsStats, 
     2339                                                                                   const int splitsStepSize, 
     2340                                                                                   const bool useFilter, 
     2341                                                                                   const bool useHisto, 
     2342                                                                                   const int histoMem, 
     2343                                                                                   const int pass) 
    25012344{ 
    25022345        vector<HierarchySubdivisionStats> subStatsContainer; 
     
    26452488        if (!mTraversalTree) 
    26462489        { 
    2647                 return mVspTree->CastLineSegment(origin,termination, viewcells, useMailboxing); 
     2490                return mVspTree->CastLineSegment(origin, termination, viewcells, useMailboxing); 
    26482491        } 
    26492492        else 
    26502493        { 
    2651                 return mTraversalTree->CastLineSegment(origin,termination, viewcells, useMailboxing); 
    2652         } 
    2653 } 
    2654  
    2655  
    2656 } 
     2494                return mTraversalTree->CastLineSegment(origin, termination, viewcells, useMailboxing); 
     2495        } 
     2496} 
     2497 
     2498 
     2499ViewCellsManager *HierarchyManager::GetViewCellsManager()  
     2500{ 
     2501        return mVspTree->mViewCellsManager; 
     2502} 
     2503 
     2504 
     2505} 
  • GTP/trunk/Lib/Vis/Preprocessing/src/HierarchyManager.h

    r2237 r2332  
    294294        inline bool ConsiderMemory() const { return mConsiderMemory; } 
    295295         
    296         void EvaluateSubdivision(const VssRayContainer &sampleRays,                                                                                       
    297                                                          const ObjectContainer &objects, 
    298                                                          const std::string &filename); 
    299  
    300         void EvaluateSubdivision2(std::ofstream &splitsStats, 
     296        void EvaluateSubdivision(std::ofstream &splitsStats, 
    301297                                                          const int splitsStepSize, 
    302298                                                          const bool useFilter, 
     
    409405                                                                SubdivisionCandidateContainer &dirtyList); 
    410406 
    411         /** Evaluate subdivision stats for log. 
    412         */ 
    413         void EvalSubdivisionStats(); 
     407        /** Print subdivision stats for log. 
     408        */ 
     409        void PrintSubdivisionStats(); 
    414410 
    415411        void AddSubdivisionStats(const int splits, 
     
    563559                                                  bool &histoUsed); 
    564560 
    565         void ComputePvs(const ObjectPvs &pvs, float &rc, int &pvsEntries); 
     561        void ComputePvs(const ObjectPvs &pvs, float &triangles, int &pvsEntries); 
    566562        void GetPvsIncrementially(ViewCell *vc, ObjectPvs &pvs) const; 
    567563        void PullUpPvsIncrementally(ViewCell *viewCell) const; 
     
    571567        float EvalFullMem() const; 
    572568 
     569        ViewCellsManager *GetViewCellsManager(); 
    573570 
    574571protected: 
  • GTP/trunk/Lib/Vis/Preprocessing/src/KdTree.cpp

    r2176 r2332  
    1515// $$JB HACK 
    1616#define KD_PVS_AREA (1e-5f) 
     17 
     18#define TYPE_INTERIOR -2 
     19#define TYPE_LEAF -3 
     20 
    1721 
    1822namespace GtpVisibilityPreprocessor { 
     
    10981102} 
    10991103 
    1100 int 
    1101 KdTree::CollectLeafPvs() 
    1102 { 
    1103  
    1104         // matt: no more kd pvs 
    1105     int totalPvsSize = 0; 
    1106         /* 
    1107   stack<KdNode *> nodeStack; 
    1108    
    1109   nodeStack.push(mRoot); 
    1110    
    1111   while (!nodeStack.empty()) { 
    1112     KdNode *node = nodeStack.top(); 
    1113     nodeStack.pop(); 
    1114     if (node->IsLeaf()) { 
    1115       KdLeaf *leaf = (KdLeaf *)node; 
    1116       for (int j=0; j < leaf->mObjects.size(); j++) { 
    1117         Intersectable *object = leaf->mObjects[j]; 
    1118         if (!object->Mailed()) { 
    1119           object->Mail(); 
    1120           // add this node to pvs of all nodes it can see 
    1121           KdPvsMap::iterator ni = object->mKdPvs.mEntries.begin(); 
    1122           for (; ni != object->mKdPvs.mEntries.end(); ni++) { 
    1123             KdNode *node = (*ni).first; 
    1124             // $$ JB TEMPORARY solution -> should add object PVS or explictly computed 
    1125             // kd tree PVS 
    1126                 float contribution; 
    1127                 if (leaf->mKdPvs.AddSample(node, 1.0f, contribution)) 
    1128               totalPvsSize++; 
    1129           } 
    1130         } 
    1131       } 
    1132     } else { 
    1133       KdInterior *interior = (KdInterior *)node; 
    1134       nodeStack.push(interior->mFront); 
    1135       nodeStack.push(interior->mBack); 
    1136     } 
    1137   } 
    1138 */ 
    1139   return totalPvsSize; 
    1140 } 
    1141  
    11421104 
    11431105KdNode * 
     
    12231185 
    12241186 
    1225 #define TYPE_INTERIOR -2 
    1226 #define TYPE_LEAF -3 
    1227  
    1228  
    12291187void KdTree::ExportBinLeaf(OUT_STREAM &stream, KdLeaf *leaf) 
    12301188{ 
     
    13191277        OUT_STREAM stream(filename.c_str(), OUT_BIN_MODE); 
    13201278         
    1321         //if (!stream.is_open()) return false; 
     1279        if (!stream.is_open()) return false; 
    13221280 
    13231281        // export binary version of mesh 
     
    14001358        DEL_PTR(mRoot); 
    14011359   
    1402         KdNode *node = LoadNextNode(stream, NULL, objects); 
    1403         mRoot = node; 
    1404  
    1405         tStack.push(TraversalData(node, mBox, 0)); 
     1360        mRoot = LoadNextNode(stream, NULL, objects); 
     1361 
     1362        tStack.push(TraversalData(mRoot, mBox, 0)); 
    14061363        mStat.Reset(); 
    14071364        mStat.nodes = 1; 
  • GTP/trunk/Lib/Vis/Preprocessing/src/KdTree.h

    r2176 r2332  
    422422                                ); 
    423423 
    424   int 
    425   CollectLeafPvs(); 
    426  
    427424  bool ExportBinTree(const std::string &filename); 
     425 
     426  /// loads kd tree from disk. note: sorts objects by id 
    428427  bool LoadBinTree(const std::string &filename, ObjectContainer &object); 
    429428 
  • GTP/trunk/Lib/Vis/Preprocessing/src/ObjectPvs.cpp

    r2176 r2332  
    9191 
    9292                leaf->Mail(); 
    93                 return BvHierarchy::EvalAbsCost(leaf->mObjects); 
     93                return (float)leaf->mObjects.size(); 
    9494        }                         
    9595 
     
    114114 
    115115                                // add #objects exclusivly in this node 
    116                                 pvs += BvHierarchy::EvalAbsCost(leaf->mObjects); 
     116                                pvs += (float)leaf->mObjects.size(); 
    117117                        } 
    118118                        else // traverse tree 
  • GTP/trunk/Lib/Vis/Preprocessing/src/Preprocessor.icproj

    r2255 r2332  
    943943                        RelativePath=".\sparsehash\src\google\sparsehash\densehashtable.h"/> 
    944944                <File  
     945                        RelativePath=".\sparsehash\src\windows\hash_fun.h"/> 
     946                <File  
    945947                        RelativePath=".\sparsehash\src\google\sparsehash\hash_fun.h"/> 
    946                 <File  
    947                         RelativePath=".\sparsehash\src\windows\hash_fun.h"/> 
    948948                <File  
    949949                        RelativePath=".\sparsehash\src\windows\hash_map.h"/> 
  • GTP/trunk/Lib/Vis/Preprocessing/src/Preprocessor.vcproj

    r2288 r2332  
    106106                                Name="VCAuxiliaryManagedWrapperGeneratorTool"/> 
    107107                </Configuration> 
    108                 <Configuration 
    109                         Name="mlrt|Win32" 
    110                         OutputDirectory="$(ConfigurationName)" 
    111                         IntermediateDirectory="$(ConfigurationName)" 
    112                         ConfigurationType="4" 
    113                         CharacterSet="2"> 
    114                         <Tool 
    115                                 Name="VCCLCompilerTool" 
    116                                 Optimization="2" 
    117                                 GlobalOptimizations="FALSE" 
    118                                 InlineFunctionExpansion="0" 
    119                                 EnableIntrinsicFunctions="FALSE" 
    120                                 FavorSizeOrSpeed="1" 
    121                                 OmitFramePointers="FALSE" 
    122                                 EnableFiberSafeOptimizations="FALSE" 
    123                                 OptimizeForProcessor="3" 
    124                                 OptimizeForWindowsApplication="TRUE" 
    125                                 AdditionalIncludeDirectories="..\include;&quot;$(QTDIR)\include\QtCore&quot;;&quot;$(QTDIR)\include\QtGui&quot;;&quot;$(QTDIR)\include&quot;;&quot;$(QTDIR)\include\QtOpenGl&quot;;..\src;..\..\..\..\..\..\NonGTP\Devil\include;..\..\..\..\..\..\NonGTP\Zlib\include;..\..\..\..\..\..\NonGTP\Xerces;..\..\..\..\..\..\NonGTP\Boost;..\..\Preprocessing\MultiLevelRayTracing" 
    126                                 PreprocessorDefinitions="WIN32;NDEBUG;_LIB;GTP_INTERNAL" 
    127                                 MinimalRebuild="TRUE" 
    128                                 ExceptionHandling="TRUE" 
    129                                 RuntimeLibrary="2" 
    130                                 DisableLanguageExtensions="FALSE" 
    131                                 ForceConformanceInForLoopScope="FALSE" 
    132                                 RuntimeTypeInfo="TRUE" 
    133                                 UsePrecompiledHeader="0" 
    134                                 WarningLevel="2" 
    135                                 Detect64BitPortabilityProblems="TRUE" 
    136                                 DebugInformationFormat="3"/> 
    137                         <Tool 
    138                                 Name="VCCustomBuildTool"/> 
    139                         <Tool 
    140                                 Name="VCLibrarianTool"/> 
    141                         <Tool 
    142                                 Name="VCMIDLTool"/> 
    143                         <Tool 
    144                                 Name="VCPostBuildEventTool"/> 
    145                         <Tool 
    146                                 Name="VCPreBuildEventTool"/> 
    147                         <Tool 
    148                                 Name="VCPreLinkEventTool"/> 
    149                         <Tool 
    150                                 Name="VCResourceCompilerTool"/> 
    151                         <Tool 
    152                                 Name="VCWebServiceProxyGeneratorTool"/> 
    153                         <Tool 
    154                                 Name="VCXMLDataGeneratorTool"/> 
    155                         <Tool 
    156                                 Name="VCManagedWrapperGeneratorTool"/> 
    157                         <Tool 
    158                                 Name="VCAuxiliaryManagedWrapperGeneratorTool"/> 
    159                 </Configuration> 
     108         
    160109                <Configuration 
    161110                        Name="Release_Internal|Win32" 
     
    224173                                OptimizeForWindowsApplication="TRUE" 
    225174                                AdditionalIncludeDirectories="..\src;..\..\..\..\..\..\NonGTP\Devil\include;..\..\..\..\..\..\NonGTP\Zlib\include;..\..\..\..\..\..\NonGTP\Xerces;..\..\..\..\..\..\NonGTP\Boost;..\MultiLevelRayTracing;&quot;$(QTDIR)\include\QtCore&quot;;&quot;$(QTDIR)\include\QtGui&quot;;&quot;$(QTDIR)\include&quot;;&quot;$(QTDIR)\include\QtOpenGl&quot;;&quot;$(CG_INC_PATH)&quot;;Timer;..\src\sparsehash\src\google\sparsehash;..\src\sparsehash\src\windows;..\src\sparsehash\src\google;..\src\sparsehash\src;..\src\ootl\;..\src\ootl\src\;..\src\ootl\src\cpp;..\src\ootl\src\cpp\include\;..\src\ootl\src\include\ootl;..\src\ootl\src\include\ootl\sandbox;..\src\ootl\src\cpp\include\ootl\mswin" 
    226                                 PreprocessorDefinitions="WIN32;NDEBUG;_LIB;GTP_INTERNAL;USE_QT;USE_HASH_PV;USE_SSE" 
     175                                PreprocessorDefinitions="WIN32;NDEBUG;_LIB;GTP_INTERNAL;USE_QT;USE_HASH_PV" 
    227176                                StringPooling="TRUE" 
    228177                                MinimalRebuild="TRUE" 
     
    268217                        ConfigurationType="4" 
    269218                        CharacterSet="2" 
    270                         WholeProgramOptimization="FALSE"> 
     219                        WholeProgramOptimization="TRUE"> 
    271220                        <Tool 
    272221                                Name="VCCLCompilerTool" 
     
    282231                                OptimizeForProcessor="1" 
    283232                                OptimizeForWindowsApplication="TRUE" 
    284                                 AdditionalIncludeDirectories="..\src;..\..\..\..\..\..\NonGTP\Devil\include;..\..\..\..\..\..\NonGTP\Zlib\include;..\..\..\..\..\..\NonGTP\Xerces;..\..\..\..\..\..\NonGTP\Boost;..\MultiLevelRayTracing;&quot;$(QTDIR)\include\QtCore&quot;;&quot;$(QTDIR)\include\QtGui&quot;;&quot;$(QTDIR)\include&quot;" 
    285                                 PreprocessorDefinitions="WIN32;NDEBUG;_LIB;GTP_INTERNAL;NO_QT" 
     233                                AdditionalIncludeDirectories="..\src;..\..\..\..\..\..\NonGTP\Devil\include;..\..\..\..\..\..\NonGTP\Zlib\include;..\..\..\..\..\..\NonGTP\Xerces;..\..\..\..\..\..\NonGTP\Boost;..\MultiLevelRayTracing" 
     234                                PreprocessorDefinitions="WIN32;NDEBUG;_LIB;GTP_INTERNAL;NO_QT;USE_SSE" 
    286235                                StringPooling="TRUE" 
    287236                                MinimalRebuild="TRUE" 
     
    688637                                                Outputs=""/> 
    689638                                </FileConfiguration> 
    690                                 <FileConfiguration 
    691                                         Name="mlrt|Win32"> 
    692                                         <Tool 
    693                                                 Name="VCCustomBuildTool" 
    694                                                 Description="" 
    695                                                 CommandLine="" 
    696                                                 Outputs=""/> 
    697                                 </FileConfiguration> 
     639                         
    698640                                <FileConfiguration 
    699641                                        Name="Release_Internal|Win32"> 
     
    748690                                                Outputs=""/> 
    749691                                </FileConfiguration> 
    750                                 <FileConfiguration 
    751                                         Name="mlrt|Win32"> 
    752                                         <Tool 
    753                                                 Name="VCCustomBuildTool" 
    754                                                 Description="" 
    755                                                 CommandLine="" 
    756                                                 Outputs=""/> 
    757                                 </FileConfiguration> 
     692                                 
    758693                                <FileConfiguration 
    759694                                        Name="Release_Internal|Win32"> 
     
    11741109                        </File> 
    11751110                        <File 
     1111                                RelativePath=".\sparsehash\src\google\sparsehash\hash_fun.h"> 
     1112                        </File> 
     1113                        <File 
    11761114                                RelativePath=".\sparsehash\src\windows\hash_fun.h"> 
    1177                         </File> 
    1178                         <File 
    1179                                 RelativePath=".\sparsehash\src\google\sparsehash\hash_fun.h"> 
    11801115                        </File> 
    11811116                        <File 
  • GTP/trunk/Lib/Vis/Preprocessing/src/RayInfo.cpp

    r2239 r2332  
    109109 
    110110 
     111 
     112 
    111113void GetRayInfoSets(const RayInfoContainer &sourceRays, 
    112114                    const int maxSize, 
  • GTP/trunk/Lib/Vis/Preprocessing/src/RayInfo.h

    r2239 r2332  
    120120} 
    121121 
    122  
    123  
    124122#if USE_FIXEDPOINT_T 
    125123        float RayInfo::GetMinT () const  
     
    166164        } 
    167165#endif  
     166 
     167 
     168 
    168169} 
    169170#endif  
  • GTP/trunk/Lib/Vis/Preprocessing/src/TestPreprocessor.vcproj

    r2288 r2332  
    3838                                LinkIncremental="2" 
    3939                                AdditionalLibraryDirectories="..\include;..\src\GL;&quot;..\lib\$(ConfigurationName)&quot;;..\..\..\..\..\..\NonGTP\Boost\lib;..\..\..\..\..\..\NonGTP\Xerces\xercesc\lib;..\..\..\..\..\..\NonGTP\Zlib\lib;..\..\..\..\..\..\NonGTP\Devil\lib" 
    40                                 GenerateDebugInformation="TRUE" 
     40                                GenerateDebugInformation="FALSE" 
    4141                                ProgramDatabaseFile="$(OutDir)/TestPreprocessor.pdb" 
    4242                                SubSystem="1" 
     
    126126                </Configuration> 
    127127                <Configuration 
    128                         Name="mlrt|Win32" 
    129                         OutputDirectory="$(ConfigurationName)" 
    130                         IntermediateDirectory="$(ConfigurationName)" 
    131                         ConfigurationType="1" 
    132                         CharacterSet="2"> 
    133                         <Tool 
    134                                 Name="VCCLCompilerTool" 
    135                                 Optimization="2" 
    136                                 GlobalOptimizations="FALSE" 
    137                                 FavorSizeOrSpeed="1" 
    138                                 OptimizeForProcessor="3" 
    139                                 AdditionalIncludeDirectories="..\include;..\..\..\..\..\..\NonGTP\Boost;&quot;$(QTDIR)\include\QtOpenGl&quot;;..\src;..\..\..\..\..\..\NonGTP\Devil\include;..\..\..\..\..\..\NonGTP\Zlib\include;..\..\..\..\..\..\NonGTP\Xerces;..\..\MultiLevelRayTracing" 
    140                                 PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;GTP_INTERNAL" 
    141                                 MinimalRebuild="TRUE" 
    142                                 RuntimeLibrary="2" 
    143                                 RuntimeTypeInfo="TRUE" 
    144                                 UsePrecompiledHeader="0" 
    145                                 WarningLevel="3" 
    146                                 Detect64BitPortabilityProblems="TRUE" 
    147                                 DebugInformationFormat="3"/> 
    148                         <Tool 
    149                                 Name="VCCustomBuildTool"/> 
    150                         <Tool 
    151                                 Name="VCLinkerTool" 
    152                                 AdditionalDependencies="xerces-c_2.lib glew32.lib zdll.lib zziplib.lib devil.lib glut32.lib OpenGL32.Lib glu32.lib cg.lib cgGL.lib Preprocessor.lib RTWorld.lib RTScene.lib" 
    153                                 OutputFile="$(OutDir)/Preprocessor.exe" 
    154                                 LinkIncremental="1" 
    155                                 AdditionalLibraryDirectories="..\src\mlrt;&quot;$(CG_LIB_PATH)&quot;;..\src\GL;..\..\..\..\..\..\NonGTP\Boost\lib;..\..\..\..\..\..\NonGTP\Xerces\xercesc\lib;..\..\..\..\..\..\NonGTP\Zlib\lib;..\..\..\..\..\..\NonGTP\Devil\lib;..\..\Preprocessing\MultiLevelRayTracing\RTScene\Release;..\..\Preprocessing\MultiLevelRayTracing\RTWorld\Release" 
    156                                 GenerateDebugInformation="FALSE" 
    157                                 SubSystem="1" 
    158                                 OptimizeReferences="2" 
    159                                 EnableCOMDATFolding="2" 
    160                                 TargetMachine="1" 
    161                                 FixedBaseAddress="1"/> 
    162                         <Tool 
    163                                 Name="VCMIDLTool"/> 
    164                         <Tool 
    165                                 Name="VCPostBuildEventTool"/> 
    166                         <Tool 
    167                                 Name="VCPreBuildEventTool"/> 
    168                         <Tool 
    169                                 Name="VCPreLinkEventTool"/> 
    170                         <Tool 
    171                                 Name="VCResourceCompilerTool"/> 
    172                         <Tool 
    173                                 Name="VCWebServiceProxyGeneratorTool"/> 
    174                         <Tool 
    175                                 Name="VCXMLDataGeneratorTool"/> 
    176                         <Tool 
    177                                 Name="VCWebDeploymentTool"/> 
    178                         <Tool 
    179                                 Name="VCManagedWrapperGeneratorTool"/> 
    180                         <Tool 
    181                                 Name="VCAuxiliaryManagedWrapperGeneratorTool"/> 
    182                 </Configuration> 
    183                 <Configuration 
    184128                        Name="Release Internal|Win32" 
    185129                        OutputDirectory="..\bin\Release" 
     
    201145                                OptimizeForWindowsApplication="TRUE" 
    202146                                AdditionalIncludeDirectories="..\include;..\..\..\..\..\..\NonGTP\Boost;..\src;..\..\..\..\..\..\NonGTP\Devil\include;..\..\..\..\..\..\NonGTP\Zlib\include;..\..\..\..\..\..\NonGTP\Xerces;&quot;$(QTDIR)\include\QtOpenGl&quot;;&quot;$(QTDIR)\include\Qt&quot;;&quot;$(QTDIR)\include\QtCore&quot;;&quot;$(QTDIR)\include&quot;;QtInterface;..\src\sparsehash\src\;..\src\ootl\src\include\ootl;..\src\ootl\src\include\ootl\sandbox;$(NOINHERIT)" 
    203                                 PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;GTP_INTERNAL;USE_QT;USE_CG;USE_HASH_PV;USE_SSE" 
     147                                PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;GTP_INTERNAL;USE_QT;USE_CG;USE_HASH_PV" 
    204148                                StringPooling="TRUE" 
    205149                                MinimalRebuild="TRUE" 
     
    269213                                OptimizeForWindowsApplication="TRUE" 
    270214                                AdditionalIncludeDirectories="..\include;..\..\..\..\..\..\NonGTP\Boost;..\src;..\..\..\..\..\..\NonGTP\Devil\include;..\..\..\..\..\..\NonGTP\Zlib\include;..\..\..\..\..\..\NonGTP\Xerces;&quot;$(QTDIR)\include\QtOpenGl&quot;;&quot;$(QTDIR)\include\Qt&quot;;&quot;$(QTDIR)\include\QtCore&quot;;&quot;$(QTDIR)\include&quot;" 
    271                                 PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;GTP_INTERNAL;NO_QT" 
     215                                PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;GTP_INTERNAL;NO_QT;USE_SSE" 
    272216                                RuntimeLibrary="2" 
    273217                                EnableEnhancedInstructionSet="2" 
     
    285229                                LinkIncremental="1" 
    286230                                AdditionalLibraryDirectories="..\src\GL;..\lib\release;..\..\Preprocessing\lib\release;..\..\..\..\..\..\NonGTP\Boost\lib;..\..\..\..\..\..\NonGTP\Xerces\xercesc\lib;..\..\..\..\..\..\NonGTP\Zlib\lib;..\..\..\..\..\..\NonGTP\Devil\lib;..\MultiLevelRayTracing\RTScene\Release;..\MultiLevelRayTracing\RTWorld\Release" 
    287                                 GenerateDebugInformation="FALSE" 
     231                                GenerateDebugInformation="TRUE" 
    288232                                SubSystem="1" 
    289233                                OptimizeReferences="2" 
  • GTP/trunk/Lib/Vis/Preprocessing/src/Trackball.cpp

    r1743 r2332  
    193193     * Avoid problems with out-of-control values... 
    194194     */ 
    195     if (t > 1.0) t = 1.0; 
    196     if (t < -1.0) t = -1.0; 
    197     phi = 2.0 * asin(t); 
     195    if (t > 1.0f) t = 1.0f; 
     196    if (t < -1.0f) t = -1.0f; 
     197    phi = 2.0f * asin(t); 
    198198 
    199199    axis_to_quat(a,phi,q); 
  • GTP/trunk/Lib/Vis/Preprocessing/src/ViewCell.cpp

    r2227 r2332  
    824824 
    825825                obj->Mail(); 
    826                 renderCost += mViewCellsManager->EvalRenderCost(obj); 
     826                renderCost ++; 
    827827        } 
    828828 
     
    836836                if (!obj->Mailed()) 
    837837                { 
    838                         renderCost += ViewCellsManager::EvalRenderCost(obj); 
     838                        renderCost ++; 
    839839                } 
    840840        } 
  • GTP/trunk/Lib/Vis/Preprocessing/src/ViewCell.h

    r2199 r2332  
    291291        } 
    292292 
     293        void SetEntriesInPvs(const int e) { 
     294                mEntriesInPvs = e; 
     295        } 
     296 
    293297        float GetPvsCost() const { 
    294298                return mPvsCost; 
     299        } 
     300 
     301        int GetEntriesInPvs() const { 
     302                return mEntriesInPvs; 
    295303        } 
    296304 
     
    324332        /// store pvs size, used for evaluation purpose when pvss are stored only in the leaves 
    325333        float mPvsCost; 
    326         /** stores number of entries in pvs 
    327             this variable has the same value as mPvsSize for object pvs,  
    328                 but usually not for kd cell based pvs 
    329         */ 
     334        /// stores number of entries in pvs 
    330335        int mEntriesInPvs; 
    331336        /** if the pvs size scalar (+ entries into pvs) 
  • GTP/trunk/Lib/Vis/Preprocessing/src/ViewCellsManager.cpp

    r2280 r2332  
    166166        Environment::GetSingleton()->GetStringValue("ViewCells.samplingType", buf); 
    167167 
     168        Environment::GetSingleton()->GetFloatValue("ViewCells.triangleWeight", mTriangleWeight); 
     169        Environment::GetSingleton()->GetFloatValue("ViewCells.objectWeight", mObjectWeight); 
     170 
    168171        // mix of sampling strategies 
    169172        if (1) 
     
    306309        Debug << "export pvs for view cells: " << mExportPvs << endl; 
    307310        Debug << "use kd pvs " << mUseKdPvs << endl; 
     311 
     312        Debug << "triangle weight: " << mTriangleWeight << endl; 
     313        Debug << "object weight: " << mObjectWeight << endl; 
    308314 
    309315        Debug << endl; 
     
    17021708 
    17031709 
    1704 float ViewCellsManager::EvalRenderCost(Intersectable *obj) //const 
    1705 { 
    1706         switch (sRenderCostEvaluationType) 
    1707         { 
    1708         case PER_OBJECT: 
    1709                 return 1.0f; 
    1710          
    1711         case PER_TRIANGLE: 
    1712                 { 
    1713                         return (float)obj->NumberOfFaces(); 
    1714                 } 
    1715         default: 
    1716                 cout << "default" << endl; 
    1717                 return 1.0f; 
    1718         } 
    1719  
    1720         // should not come here 
    1721         return 0.0f; 
     1710 
     1711float ViewCellsManager::ComputeRenderCost(const int tri, const int obj) //const 
     1712{ 
     1713        return max((float)tri * mTriangleWeight, (float)obj * mObjectWeight); 
    17221714} 
    17231715 
     
    20952087                        sum += ComputeSampleContribution(*(*it), addContributions, storeViewCells, useHitObjects); 
    20962088                } 
     2089 
    20972090        } 
    20982091 
     
    27922785 
    27932786        ++ mSamplesStat.mRays; 
    2794          
     2787 
    27952788        if (!ray.mTerminationObject) 
    2796           return 0.0f; 
    2797          
     2789                return 0.0f; 
     2790 
    27982791        static Ray hray; 
    27992792        hray.Init(ray); 
     
    28012794        float tmin = 0, tmax = 1.0; 
    28022795 
    2803         if (!GetViewSpaceBox().GetRaySegment(hray, tmin, tmax) || (tmin > tmax)) { 
    2804           // cerr<<"ray outside view space box\n"; 
    2805           return 0; 
     2796        if (!GetViewSpaceBox().GetRaySegment(hray, tmin, tmax) || (tmin > tmax))  
     2797        { 
     2798                // cerr<<"ray outside view space box\n"; 
     2799                return 0; 
    28062800        } 
    28072801 
    28082802        Vector3 origin = hray.Extrap(tmin); 
    28092803        Vector3 termination = hray.Extrap(tmax); 
    2810          
     2804 
    28112805        ViewCell::NewMail(); 
    2812          
     2806 
    28132807        viewCellCastTimer.Entry(); 
    28142808 
    28152809        static ViewCellContainer viewCells; 
    28162810        static VssRay *lastVssRay = NULL; 
    2817          
     2811 
    28182812        // check if last ray was not same ray with reverse direction 
    28192813        if (1)  
     
    28242818        { 
    28252819                viewCells.clear(); 
    2826                  
     2820 
    28272821                // traverse the view space subdivision 
    28282822                CastLineSegment(origin, termination, viewCells); 
    28292823 
    2830         lastVssRay = &ray; 
    2831         } 
    2832          
     2824                lastVssRay = &ray; 
     2825        } 
     2826 
    28332827        viewCellCastTimer.Exit(); 
    28342828 
     
    28372831        if (storeViewCells) 
    28382832        {        
    2839           // cerr << "Store viewcells should not be used in the test!" << endl; 
    2840           // copy viewcells memory efficiently 
     2833                // cerr << "Store viewcells should not be used in the test!" << endl; 
     2834                // copy viewcells memory efficiently 
    28412835#if VSS_STORE_VIEWCELLS 
    2842           ray.mViewCells.reserve(viewCells.size()); 
    2843           ray.mViewCells = viewCells; 
     2836                ray.mViewCells.reserve(viewCells.size()); 
     2837                ray.mViewCells = viewCells; 
    28442838#else 
    2845           cerr << "Vss store viewcells not supported." << endl; 
    2846           exit(1); 
     2839                cerr << "Vss store viewcells not supported." << endl; 
     2840                exit(1); 
    28472841#endif 
    28482842        } 
    2849          
     2843 
    28502844        Intersectable *terminationObj; 
    2851          
     2845 
    28522846        objTimer.Entry(); 
    28532847 
    28542848        // obtain pvs entry (can be different from hit object) 
    28552849        terminationObj = ray.mTerminationObject; 
    2856          
     2850 
    28572851        objTimer.Exit(); 
    2858          
     2852 
    28592853        pvsTimer.Entry(); 
    28602854 
     
    28642858        { 
    28652859                ComputeViewCellContribution(*it,  
    2866                                                                         ray,  
     2860                                                ray,  
    28672861                                                                        terminationObj,  
    28682862                                                                        ray.mTermination,  
     
    28752869        if (ray.mPvsContribution) 
    28762870                ++ mSamplesStat.mContributingRays; 
    2877          
     2871 
    28782872#if AVG_RAY_CONTRIBUTIONS 
    28792873        ray.mRelativePvsContribution /= (float)viewCells.size(); 
    28802874#endif 
    2881    
     2875 
    28822876#if USE_RAY_LENGTH_AS_CONTRIBUTION 
    28832877        float c = 0.0f; 
    28842878        if (terminationObj)  
    2885           c = ray.Length(); 
     2879                c = ray.Length(); 
    28862880        ray.mRelativePvsContribution = ray.mPvsContribution = c; 
    28872881        return c; 
    28882882#else 
    28892883        return ABS_CONTRIBUTION_WEIGHT*ray.mPvsContribution + 
    2890           (1.0f - ABS_CONTRIBUTION_WEIGHT)*ray.mRelativePvsContribution; 
     2884                (1.0f - ABS_CONTRIBUTION_WEIGHT)*ray.mRelativePvsContribution; 
    28912885#endif 
    28922886} 
     
    68986892 
    68996893                        ofstream ofstr(filename.c_str()); 
    6900                         mHierarchyManager->EvaluateSubdivision2(ofstr, splitsStepSize, false, useHisto, histoMem, pass); 
     6894                        mHierarchyManager->EvaluateSubdivision(ofstr, splitsStepSize, false, useHisto, histoMem, pass); 
    69016895 
    69026896                        timeDiff = TimeDiff(startTime, GetTime()); 
     
    70006994 
    70016995 
    7002 } 
     6996#if TEST_PACKETS 
     6997#ifdef USE_SSE 
     6998 
     6999float ViewCellsManager::ComputeSampleContributions(const VssRayContainer &rays, 
     7000                                                                                                   const bool addContributions, 
     7001                                                                                                   const bool storeViewCells, 
     7002                                                                                                   const bool useHitObjects) 
     7003{ 
     7004        float sum = 0.0f; 
     7005 
     7006        VssRayContainer::const_iterator it, it_end = rays.end(); 
     7007 
     7008        VssRayContainer tmpRays;         
     7009        RayPacket packet; 
     7010 
     7011        for (it = rays.begin(); it != it_end; ++ it)  
     7012        { 
     7013                if (!ViewCellsConstructed())  
     7014                { 
     7015                        // view cells not yet constructed 
     7016                        // just take the lenghts of the rays as contributions 
     7017                        if ((*it)->mTerminationObject) 
     7018                        { 
     7019                                sum += (*it)->Length(); 
     7020                        } 
     7021                }  
     7022                else  
     7023                { 
     7024                        sum += ComputeSampleContribution(*(*it), addContributions, storeViewCells, useHitObjects); 
     7025 
     7026                        tmpRays.push_back(new VssRay(*it)); 
     7027                         
     7028                        if (tmpRays.size() == 4) 
     7029                        { 
     7030                                RayPacket packet(tmpRays); 
     7031 
     7032                                mHierarchyManager->CastLineSegment(packet); 
     7033 
     7034                                for (int i = 0; i < 4; ++ i) 
     7035                                { 
     7036                                        ComputeSampleContribution(tmpRays[i], addContributions, true, useHitObjects); 
     7037                                } 
     7038 
     7039                                // compare results 
     7040                                ////////// 
     7041 
     7042                                CLEAR_CONTAINER(tmpRays); 
     7043                        } 
     7044                } 
     7045        } 
     7046 
     7047        cout << "view cell cast time: " << viewCellCastTimer.TotalTime() << " s" << endl; 
     7048        Debug << "view cell cast time: " << viewCellCastTimer.TotalTime() << " s" << endl; 
     7049 
     7050        cout << "pvs time: " << pvsTimer.TotalTime() << " s" << endl; 
     7051        Debug << "pvs time: " << pvsTimer.TotalTime() << " s" << endl; 
     7052         
     7053        return sum; 
     7054} 
     7055 
     7056#endif 
     7057#endif 
     7058 
     7059} 
  • GTP/trunk/Lib/Vis/Preprocessing/src/ViewCellsManager.h

    r2232 r2332  
    88#include "ViewCell.h" 
    99 
     10#define TEST_PACKETS 0 
    1011 
    1112namespace GtpVisibilityPreprocessor { 
     
    162163                @param storeViewCells true if view cells should be stored in the ray 
    163164        */ 
    164         float ComputeSampleContributions(const VssRayContainer &rays, 
    165                                                                         const bool addContributions, 
    166                                                                         const bool storeViewCells, 
    167                                                                         const bool useHitObject = false); 
     165        virtual float ComputeSampleContributions(const VssRayContainer &rays, 
     166                                                    const bool addContributions, 
     167                                                                                        const bool storeViewCells, 
     168                                                                                        const bool useHitObject = false); 
    168169 
    169170        /** Computes sample contribution of a simgle ray to the view cells PVS. 
     
    495496                                                                                 ViewCellContainer &viewCells); 
    496497 
    497         /** Evaluates the render cost of a view cell. 
    498         */ 
    499         static float EvalRenderCost(Intersectable *obj); 
    500     
     498        float ComputeRenderCost(const int tri, const int obj); //const 
     499 
    501500        /** Sets pvs size of view cell as a scalar. Used when storing pvs only in the leaves 
    502501                of the hierarchy. 
     
    906905        bool mUsePredefinedViewCells; 
    907906 
    908    
    909   vector<PerViewCellStat> mPerViewCellStat; 
    910   SamplesStatistics mSamplesStat; 
     907        float mTriangleWeight; 
     908        float mObjectWeight; 
     909 
     910        vector<PerViewCellStat> mPerViewCellStat; 
     911        SamplesStatistics mSamplesStat; 
    911912}; 
    912913 
     
    12991300        virtual void FinalizeViewCells(const bool createMesh); 
    13001301 
     1302#if TEST_PACKETS 
     1303#ifdef USE_SSE 
     1304 
     1305        float ViewCellsManager::ComputeSampleContributions(const VssRayContainer &rays, 
     1306                                                               const bool addContributions, 
     1307                                                                                                           const bool storeViewCells, 
     1308                                                                                                           const bool useHitObjects); 
     1309 
     1310#endif 
     1311#endif 
     1312 
    13011313protected: 
    13021314 
  • GTP/trunk/Lib/Vis/Preprocessing/src/ViewCellsParser.cpp

    r2176 r2332  
    963963                        DEL_PTR(vc); 
    964964 
    965 //                      (*vit).second = bspVc; 
     965                        //(*vit).second = bspVc; 
    966966                        (*vit) = bspVc; 
    967967                } 
  • GTP/trunk/Lib/Vis/Preprocessing/src/VspTree.cpp

    r2288 r2332  
    5959} 
    6060 
    61 #if WORK_WITH_VIEWCELLS 
    62 static bool ViewCellHasMultipleReferences(Intersectable *obj,  
    63                                                                                   ViewCell *vc,  
    64                                                                                   bool checkOnlyMailed) 
    65 { 
    66         MailablePvsData *vdata = obj->mViewCellPvs.Find(vc); 
    67  
    68         if (vdata) 
    69         { 
    70                 // more than one view cell sees this object inside different kd cells 
    71                 if (!checkOnlyMailed || !vdata->Mailed()) 
    72                 { 
    73                         if (checkOnlyMailed) 
    74                                 vdata->Mail(); 
    75                         //Debug << "sumpdf: " << vdata->mSumPdf << endl; 
    76                         if (vdata->mSumPdf > 1.5f)  
    77                                 return true; 
    78                 } 
    79         } 
    80          
    81         return false; 
    82 } 
    83  
    84  
    85 void VspTree::RemoveParentViewCellReferences(ViewCell *parent) const 
    86 { 
    87         KdLeaf::NewMail(); 
    88  
    89         // remove the parents from the object pvss 
    90         ObjectPvsEntries::const_iterator oit, oit_end = parent->GetPvs().mEntries.end(); 
    91  
    92         for (oit = parent->GetPvs().mEntries.begin(); oit != oit_end; ++ oit) 
    93         { 
    94                 Intersectable *object = (*oit).first; 
    95                 // HACK: make sure that the view cell is removed from the pvs 
    96                 const float high_contri = 9999999; 
    97  
    98                 // remove reference count of view cells 
    99                 object->mViewCellPvs.RemoveSample(parent, high_contri); 
    100         } 
    101 } 
    102  
    103  
    104 void VspTree::AddViewCellReferences(ViewCell *vc) const 
    105 { 
    106         KdLeaf::NewMail(); 
    107  
    108         // Add front view cell to the object pvsss 
    109         ObjectPvsEntries::const_iterator oit, oit_end = vc->GetPvs().mEntries.end(); 
    110  
    111         for (oit = vc->GetPvs().mEntries.begin(); oit != oit_end; ++ oit) 
    112         { 
    113                 Intersectable *object = (*oit).first; 
    114  
    115                 // increase reference count of view cells 
    116                 object->mViewCellPvs.AddSample(vc, 1); 
    117         } 
    118 } 
    119  
    120 #endif 
    12161 
    12262void VspTreeStatistics::Print(ostream &app) const 
     
    185125mTreeValid(true),  
    186126mTimeStamp(0) 
    187 //,mRenderCostDecr(0) 
    188 //,mMemoryIncr(0) 
    189 //,mPvsEntriesIncr(0) 
    190127{} 
    191128 
     
    194131mParent(parent),  
    195132mTreeValid(true),  
    196 //,mMemoryIncr(0) 
    197 //,mRenderCostDecr(0) 
    198 //,mPvsEntriesIncr(0) 
    199133mTimeStamp(0) 
    200134{} 
     
    602536 
    603537 
    604 void VspTree::CreateViewCell(VspTraversalData &tData, const bool updatePvs) 
     538void VspTree::CreateViewCell(VspTraversalData &tData,  
     539                                                         const bool updatePvs,  
     540                                                         const float renderCost, 
     541                                                         const int pvs) 
    605542{ 
    606543        /////////////// 
     
    628565                mVspStats.contributingSamples += conSamp; 
    629566                mVspStats.sampleContributions += (int)sampCon; 
     567        } 
     568        else 
     569        { 
     570                // todo: set correct scalars 
     571                viewCell->SetPvsCost(renderCost); 
     572                viewCell->SetEntriesInPvs(pvs); 
     573                //cout << "create view cell with tri=" << (int)renderCost << " pvs=" << pvs << endl;  
    630574        } 
    631575 
     
    802746        VspLeaf *leaf = static_cast<VspLeaf *>(splitCandidate.mParentData.mNode); 
    803747 
    804                 ////////////// 
     748        ////////////// 
    805749        //-- compute global decrease in render cost 
    806750 
     
    810754 
    811755        float frontRenderCost = 0, backRenderCost = 0, totalRenderCost = 0; 
    812         int  frontSize = 0, backSize = 0, totalSize = 0; 
     756        float frontTriangles = 0, backTriangles = 0, totalTriangles = 0; 
     757        int  frontObjects = 0, backObjects = 0, totalObjects = 0; 
    813758 
    814759        Intersectable::NewMail(3); 
     
    827772 
    828773                VssRay *ray = rayInf.mRay; 
     774 
    829775#if HACK_PERFORMANCE 
    830776                Intersectable *obj = (*ray).mTerminationObject; 
     
    835781                // and back pvs with respect to the classification 
    836782                UpdateContributionsToPvs(leaf, cf,  
    837                                                                  frontRenderCost, backRenderCost, totalRenderCost, 
    838                                                                  frontSize, backSize, totalSize); 
     783                                                                 frontTriangles, backTriangles, totalTriangles, 
     784                                                                 frontObjects, backObjects, totalObjects); 
    839785 
    840786#if COUNT_ORIGIN_OBJECTS 
     
    847793 
    848794                        UpdateContributionsToPvs(leaf, cf,  
    849                                                                          frontRenderCost, backRenderCost, totalRenderCost, 
    850                                                                          frontSize, backSize, totalSize); 
     795                                                                         frontTriangles, backTriangles, totalTriangles, 
     796                                                                         frontObjects, backObjects, totalObjects); 
    851797                } 
    852798#endif 
     
    857803        } 
    858804 
     805        totalRenderCost = mViewCellsManager->ComputeRenderCost((int)totalTriangles, totalObjects); 
     806        backRenderCost = mViewCellsManager->ComputeRenderCost((int)backTriangles, backObjects); 
     807        frontRenderCost = mViewCellsManager->ComputeRenderCost((int)frontTriangles, frontObjects); 
     808 
     809         
    859810        ///////////// 
    860811        // avg ray contri 
    861812 
    862         const float avgRayContri = (float)totalSize /  
     813        const float avgRayContri = (float)totalObjects /  
    863814                ((float)splitCandidate.mParentData.mRays->size() + Limits::Small); 
    864815 
     
    866817 
    867818        const float avgRaysPerObject =  
    868                 (float)splitCandidate.mParentData.mRays->size() / ((float)totalSize + Limits::Small); 
     819                (float)splitCandidate.mParentData.mRays->size() / ((float)totalTriangles + Limits::Small); 
    869820 
    870821        splitCandidate.SetAvgRayContribution(avgRayContri); 
     
    872823 
    873824 
     825        // todo: compute old render cost in the function 
     826        // using michi's render cost evaluation 
    874827        float oldRenderCost; 
    875         const float renderCostDecr = EvalRenderCostDecrease(splitCandidate, oldRenderCost, 
    876                                                                                                                  totalRenderCost, frontRenderCost, backRenderCost); 
     828        const float renderCostDecr = EvalRenderCostDecrease(splitCandidate,  
     829                                                                                                                oldRenderCost, 
     830                                                                                                                totalRenderCost,  
     831                                                                                                                frontRenderCost,  
     832                                                                                                                backRenderCost); 
     833 
    877834        splitCandidate.SetRenderCostDecrease(renderCostDecr); 
    878835 
    879836        // the increase in pvs entries num induced by this split 
    880         const int pvsEntriesIncr = EvalPvsEntriesIncr(splitCandidate, totalSize, frontSize, backSize); 
     837        const int pvsEntriesIncr = EvalPvsEntriesIncr(splitCandidate, totalObjects, frontObjects, backObjects); 
    881838        splitCandidate.SetPvsEntriesIncr(pvsEntriesIncr); 
    882839 
     840        splitCandidate.mFrontTriangles = frontTriangles; 
     841        splitCandidate.mBackTriangles = backTriangles; 
     842         
    883843        // take render cost of node into account  
    884844        // otherwise danger of being stuck in a local minimum! 
     
    894854        splitCandidate.SetPriority(priority); 
    895855 
     856        //cout << "vsp render cost decrease=" << renderCostDecr<<endl; 
    896857        mEvalTimer.Exit(); 
    897858} 
     
    958919 
    959920        //-- compute pvs 
    960         frontData.mPvs = sc.mFrontPvs;//(float)EvalPvsEntriesSize(*frontData.mRays); 
    961         backData.mPvs = sc.mBackPvs;//(float)EvalPvsEntriesSize(*backData.mRays); 
     921        frontData.mPvs = sc.mFrontPvs; 
     922        backData.mPvs = sc.mBackPvs; 
    962923         
    963924        //-- compute pvs correction for coping with undersampling 
     
    975936 
    976937        //-- compute render cost 
    977         frontData.mRenderCost = sc.mFrontRenderCost;//(float)EvalPvsCost(*frontData.mRays); 
    978         backData.mRenderCost = sc.mBackRenderCost;//(float)EvalPvsCost(*backData.mRays); 
     938        frontData.mRenderCost = sc.mFrontRenderCost; 
     939        backData.mRenderCost = sc.mBackRenderCost; 
    979940         
    980941        frontData.mCorrectedRenderCost = sc.mCorrectedFrontRenderCost; 
     
    1006967                parent->ReplaceChildLink(leaf, interior); 
    1007968                interior->SetParent(parent); 
    1008  
    1009 #if WORK_WITH_VIEWCELLS 
    1010                 // remove "parent" view cell from pvs of all objects (traverse through rays) 
    1011                 RemoveParentViewCellReferences(tData.mNode->GetViewCell()); 
    1012 #endif 
    1013969        } 
    1014970        else // new root 
     
    1031987 
    1032988        // create front and back view cell for the new leaves 
    1033         CreateViewCell(frontData, false); 
    1034         CreateViewCell(backData, false); 
     989        CreateViewCell(frontData, false, sc.mFrontTriangles, (int)sc.mFrontPvs); 
     990        CreateViewCell(backData, false, sc.mBackTriangles, (int)sc.mBackPvs); 
    1035991 
    1036992        // set the time stamp so the order of traversal can be reconstructed 
     
    14441400         
    14451401        const int leaves = mVspStats.Leaves(); 
    1446         const bool showViz = (leaves % 30 == 0); 
     1402        const bool showViz = (leaves >= 3000) && (leaves % 497 == 0); 
    14471403 
    14481404        if (showViz) 
     
    16851641         
    16861642        const AxisAlignedPlane &candidatePlane = sc.mSplitPlane; 
    1687         //const float avgRayContri = sc.GetAvgRayContribution(); 
    16881643        const float avgRaysPerObject = sc.GetAvgRaysPerObject(); 
    16891644 
    1690         ////////////////////////////////////////////// 
     1645        ///////////////////////// 
    16911646        // mark objects in the front / back / both using mailboxing 
    16921647        // then count pvs sizes 
     
    17131668 
    17141669        const float oldRenderCostRatio = (tData.mRenderCost > 0)? (totalPvs / tData.mRenderCost) : 1; 
    1715  
    17161670        const float penaltyOld = tData.mCorrectedRenderCost * oldRenderCostRatio; 
    17171671 
     
    17311685        // the render cost decrase for this split 
    17321686        const float renderCostDecrease = (oldRenderCost - newRenderCost) / viewSpaceVol; 
    1733  
    1734         if (0) 
    1735         cout << "vsp render cost" 
    1736                  << " avg rays per object: " << avgRaysPerObject << " ratio: " << oldRenderCostRatio 
    1737                  << " parent: " << penaltyOld << " " << " old vol: " << totalPvs  
    1738                  << " front cost: " << sc.mCorrectedFrontRenderCost << " corr. " << sc.mCorrectedFrontRenderCost 
    1739                  << " back cost: " << sc.mCorrectedBackRenderCost << " corr. " << sc.mCorrectedBackRenderCost << endl; 
    1740  
    1741 #ifdef GTP_DEBUG 
    1742         Debug << "\nvsp render cost decrease" << endl 
    1743                   << "back pvs: " << pvsBack << " front pvs " << pvsFront << " total pvs: " << totalPvs << endl  
    1744                   << "back p: " << pBack / viewSpaceVol << " front p " << pFront / viewSpaceVol << " p: " << pOverall / viewSpaceVol << endl 
    1745                   << "old rc: " << normalizedOldRenderCost << " new rc: " << newRenderCost / viewSpaceVol << endl 
    1746                   << "render cost decrease: " << renderCostDecrease << endl; 
    1747 #endif 
    17481687 
    17491688        return renderCostDecrease; 
     
    18091748        if (!obj) return; 
    18101749 
    1811         const float renderCost = ViewCellsManager::EvalRenderCost(obj); 
    1812  
    18131750        // object in none of the pvss => new object 
    18141751        if (!obj->Mailed() && !obj->Mailed(1) && !obj->Mailed(2)) 
    18151752        { 
    1816                 totalPvs += renderCost; 
     1753                totalPvs += 1.0f; 
    18171754        } 
    18181755 
     
    18241761                if (!obj->Mailed() && !obj->Mailed(2)) 
    18251762                { 
    1826                         frontPvs += renderCost; 
     1763                        frontPvs += 1.0f; 
    18271764                 
    18281765                        // already in back pvs => in both pvss 
     
    18381775                if (!obj->Mailed(1) && !obj->Mailed(2)) 
    18391776                { 
    1840                         backPvs += renderCost; 
     1777                        backPvs += 1.0f; 
    18411778                 
    18421779                        // already in front pvs => in both pvss 
     
    18601797 
    18611798        const float renderCost = countEntries ? 1 :  
    1862                 mBvHierarchy->EvalAbsCost(leaf->mObjects); 
     1799                (float)leaf->mObjects.size(); 
    18631800         
    18641801        // leaf in no pvs => new 
     
    19071844                                                                           int &totalSize) const 
    19081845{ 
    1909         const float renderCost = mBvHierarchy->EvalAbsCost(leaf->mObjects); 
    1910          
    1911         // leaf in no pvs => new 
     1846        const float triSize = (float)leaf->mObjects.size(); 
     1847         
     1848        // object in no pvs => count as new 
    19121849        if (!leaf->Mailed() && !leaf->Mailed(1) && !leaf->Mailed(2)) 
    19131850        { 
    1914                 totalPvs += renderCost; 
     1851                totalPvs += triSize; 
    19151852                ++ totalSize; 
    19161853        } 
     
    19201857                if (!leaf->Mailed() && !leaf->Mailed(2)) 
    19211858                { 
    1922                         frontPvs += renderCost; 
     1859                        frontPvs += triSize; 
    19231860                        ++ frontSize; 
    19241861 
     
    19351872                if (!leaf->Mailed(1) && !leaf->Mailed(2)) 
    19361873                { 
    1937                         backPvs += renderCost; 
     1874                        backPvs += triSize; 
    19381875                        ++ backSize; 
    19391876 
     
    25692506                                        // cases N1,N2,N3,P5,Z2,Z3 
    25702507                                        continue; 
    2571                                 } else 
     2508                                }  
     2509                                else 
    25722510                                { 
    25732511                                        // case N4 
     
    26392577        return hits; 
    26402578} 
     2579 
     2580 
     2581#ifdef USE_SSE 
     2582int VspTree::TraverseRayPacket(RayPacket &rp, 
     2583                                                           const bool useMailboxing) 
     2584{ 
     2585        int hits = 0; 
     2586 
     2587        // reciprocal of ray directions 
     2588        float one = 1.0f; 
     2589        float zero = 0.0f; 
     2590 
     2591        __m128 one4 = _mm_load_ps(&one); 
     2592        __m128 zero4 = _mm_load_ps(&zero); 
     2593 
     2594        __m128 *entp4; 
     2595        __m128 *extp4; 
     2596 
     2597        union { float mask[4]; __m128 mask4; }; 
     2598        mask4 = one4; 
     2599 
     2600        __m128 entpX4 = rp.mOriginX4; 
     2601        __m128 entpY4 = rp.mOriginY4; 
     2602        __m128 entpZ4 = rp.mOriginZ4; 
     2603         
     2604        __m128 extpX4 = rp.mTerminationX4; 
     2605        __m128 extpY4 = rp.mTerminationY4; 
     2606        __m128 extpZ4 = rp.mTerminationZ4; 
     2607 
     2608        __m128 *origin = &rp.mOriginX4; 
     2609        __m128 *termination = &rp.mTerminationX4; 
     2610 
     2611        // ray directions 
     2612        __m128 dirX4 = _mm_sub_ps(rp.mTerminationX4, rp.mOriginX4); 
     2613        __m128 dirY4 = _mm_sub_ps(rp.mTerminationY4, rp.mOriginY4);; 
     2614        __m128 dirZ4 = _mm_sub_ps(rp.mTerminationZ4, rp.mOriginZ4);; 
     2615         
     2616        __m128 rdx4 = _mm_div_ps(one4, dirX4); 
     2617        __m128 rdy4 = _mm_div_ps(one4, dirY4); 
     2618        __m128 rdz4 = _mm_div_ps(one4, dirZ4); 
     2619 
     2620        __m128 maxT4 = one4; 
     2621        __m128 minT4 = zero4; 
     2622 
     2623        stack<PacketTraversalData *> tStack; 
     2624 
     2625 
     2626        VspNode *node = mRoot; 
     2627        VspNode *farChild; 
     2628 
     2629        float position; 
     2630        int axis; 
     2631 
     2632        __m128 position4; 
     2633 
     2634        while (1) 
     2635        { 
     2636                if (!node->IsLeaf()) 
     2637                { 
     2638                        VspInterior *in = static_cast<VspInterior *>(node); 
     2639                         
     2640                        entp4 = &entpX4; 
     2641                        extp4 = &extpX4; 
     2642 
     2643                        position = in->GetPosition(); 
     2644                        axis = in->GetAxis(); 
     2645 
     2646                        position4 = _mm_load_ps(&position); 
     2647 
     2648                        // are the entry points all in near leaf? 
     2649                        if (_mm_movemask_ps(_mm_and_ps(_mm_cmple_ps(entp4[axis], position4), mask4))) 
     2650                        { 
     2651                                // are the exit points all in near leaf? 
     2652                                if (_mm_movemask_ps(_mm_and_ps(_mm_cmpgt_ps(extp4[axis], position4), mask4))) 
     2653                                { 
     2654                                        node = in->GetBack(); 
     2655                                        // cases N1,N2,N3,P5,Z2,Z3 
     2656                                        continue; 
     2657                                }  
     2658                                else // traverse both children 
     2659                                { 
     2660                                        // case N4 
     2661                                        node = in->GetBack(); 
     2662                                        farChild = in->GetFront(); 
     2663                                } 
     2664                        } 
     2665                        else 
     2666                        { 
     2667                                if (_mm_movemask_ps(_mm_and_ps(_mm_cmpgt_ps(position4, extp4[axis]), mask4))) 
     2668                                { 
     2669                                        node = in->GetFront(); 
     2670                                        // cases P1,P2,P3,N5,Z1 
     2671                                        continue; 
     2672                                } 
     2673                                else // traverse both children 
     2674                                { 
     2675                                        node = in->GetFront(); 
     2676                                        farChild = in->GetBack(); 
     2677                                        // case P4 
     2678                                } 
     2679                        } 
     2680 
     2681                        // $$ modification 3.5.2004 - hints from Kamil Ghais 
     2682                        // case N4 or P4 
     2683                        const __m128 tDist4 = _mm_mul_ps(_mm_sub_ps(position4, origin[axis]), termination[axis]); 
     2684                         
     2685                        // push far child for further processing 
     2686                        tStack.push(new PacketTraversalData(farChild, extpX4, extpY4, extpZ4, maxT4, mask4)); 
     2687 
     2688                        // compute new exit point 
     2689                        extpX4 = _mm_add_ps(_mm_mul_ps(dirX4, tDist4), rp.mOriginX4); 
     2690                        extpY4 = _mm_add_ps(_mm_mul_ps(dirY4, tDist4), rp.mOriginY4); 
     2691                        extpZ4 = _mm_add_ps(_mm_mul_ps(dirZ4, tDist4), rp.mOriginZ4); 
     2692 
     2693                        maxT4 = tDist4; 
     2694 
     2695                        mask4 = _mm_cmplt_ps( maxT4, minT4); 
     2696                } 
     2697                else 
     2698                { 
     2699                        // compute intersection with all objects in this leaf 
     2700                        VspLeaf *leaf = static_cast<VspLeaf *>(node); 
     2701                        ViewCell *viewCell; 
     2702 
     2703                        viewCell = leaf->GetViewCell(); 
     2704 
     2705                        // note: don't have to mail if each view  
     2706                        // cell belongs to exactly one leaf 
     2707                        if (!useMailboxing || !viewCell->Mailed()) 
     2708                        { 
     2709                                if (useMailboxing) 
     2710                                        viewCell->Mail(); 
     2711 
     2712                                for (int i = 0; i < 4; ++i) 
     2713                                { 
     2714                                        if (mask[i])  
     2715                                                rp.mViewCells[i].push_back(viewCell); 
     2716                                } 
     2717 
     2718                                ++ hits; 
     2719                        } 
     2720 
     2721                        // get the next node from the stack 
     2722                        if (tStack.empty()) 
     2723                                break; 
     2724 
     2725                        entpX4 = extpX4; 
     2726                        entpY4 = extpY4; 
     2727                        entpZ4 = extpZ4; 
     2728 
     2729                        minT4 = maxT4; 
     2730                         
     2731                        PacketTraversalData *s  = tStack.top(); 
     2732                        node = s->mNode; 
     2733                         
     2734                        extpX4 = s->mExitPointX4; 
     2735                        extpY4 = s->mExitPointY4; 
     2736                        extpZ4 = s->mExitPointZ4; 
     2737 
     2738                        maxT4 = s->mMaxT4; 
     2739 
     2740                        mask4 = s->mMask4; 
     2741 
     2742                        tStack.pop(); 
     2743                        delete s; 
     2744                } 
     2745        } 
     2746 
     2747        return hits; 
     2748 
     2749/* 
     2750        const int offs[4] = {(rp.dx[0] >= 0) ? 1 : 0,  (rp.dy[0] >= 0)? 1 : 0,  (rp.dz[0] >= 0)? 1 : 0, 0}; 
     2751 
     2752        while (!node->IsLeaf()) 
     2753        { 
     2754                PacketTraversalData *tData = tStack.top(); 
     2755                tStack.pop(); 
     2756 
     2757                node = tData->node; 
     2758                VspInterior *interior = static_cast<VspInterior *>(node); 
     2759                tn4 = tData->tn4; 
     2760                tf4 = tData->tf4; 
     2761                mask = tData->mask4; 
     2762 
     2763                position = interior->GetPosition(); 
     2764                const __m128 position4 = _mm_load_ps(&pos); 
     2765 
     2766                const int axis = interior->GetAxis(); 
     2767                const __m128 d4 = _mm_mul_ps(_mm_sub_ps(splitPos, origin[axis]), termination[axis]); 
     2768 
     2769                VspNode* ln = offs[axis] ? interior->GetFront() : interior->GetBack(); 
     2770 
     2771                if (!_mm_movemask_ps(_mm_and_ps(_mm_cmpgt_ps(d4, tn4), mask))) 
     2772                {  
     2773                        node = ln;  
     2774                        continue;  
     2775                } 
     2776 
     2777                node = offs[axis]^1 ? interior->GetFront() : interior->GetBack();// + (offs[aidx]^1); 
     2778 
     2779                if (_mm_movemask_ps( _mm_and_ps( _mm_cmplt_ps(d4, tf4), mask))) 
     2780                { 
     2781                        const __m128 mask2 = _mm_cmpgt_ps(d4, tn4); 
     2782                        const __m128 mask3 = _mm_cmplt_ps(d4, tf4); 
     2783 
     2784 
     2785                        tData->tf4 = tf4 = _mm_or_ps(_mm_and_ps(mask3, d4), _mm_andnot_ps( mask3, tf4)); 
     2786                        tData->node = (VspNode *)ln; 
     2787                        tData->mask4 = mask; 
     2788                        tData->tn4 = _mm_or_ps( _mm_and_ps( mask2, d4 ), _mm_andnot_ps( mask2, tn4 ) ); 
     2789                        mask = _mm_cmplt_ps( tn4, tf4 ); 
     2790                } 
     2791        }*/ 
     2792} 
     2793#endif 
    26412794 
    26422795 
     
    30573210                else 
    30583211                { 
    3059                         //cout << "o"; 
     3212                        //cout << "r"; 
    30603213                        // store object only for one ray 
    30613214                        //lastVssRay->mOriginObject = ray->mTerminationObject; 
     
    30913244 
    30923245void VspTree::Initialise(const VssRayContainer &rays, 
    3093                                                  AxisAlignedBox3 *forcedBoundingBox) 
     3246                                                 AxisAlignedBox3 *forcedBoundingBox, 
     3247                                                 const ObjectContainer &objects) 
    30943248{ 
    30953249        ComputeBoundingBox(rays, forcedBoundingBox); 
     
    31003254        VspViewCell *viewCell = new VspViewCell(); 
    31013255    leaf->SetViewCell(viewCell); 
     3256 
     3257        viewCell->SetPvsCost((float)objects.size()); 
     3258        viewCell->SetEntriesInPvs(1); 
    31023259 
    31033260        // set view cell values 
     
    32763433        // simple render cost evaluation 
    32773434        if (-- leaf->mCounter == 0) 
    3278                 return BvHierarchy::EvalAbsCost(leaf->mObjects); 
     3435                return (float)leaf->mObjects.size(); 
    32793436        else 
    32803437                return 0.0f; 
     
    33413498                leaf->Mail(); 
    33423499                leaf->mCounter = 1; 
    3343                 return BvHierarchy::EvalAbsCost(leaf->mObjects); 
     3500                return (float)leaf->mObjects.size(); 
    33443501        } 
    33453502        else 
     
    34183575        { 
    34193576                leaf->Mail(); 
    3420                 return BvHierarchy::EvalAbsCost(leaf->mObjects); 
     3577                return (float)leaf->mObjects.size(); 
    34213578        } 
    34223579        else 
     
    35763733        { 
    35773734                leaf->Mail(); 
    3578                 return BvHierarchy::EvalAbsCost(leaf->mObjects); 
     3735                return (float)leaf->mObjects.size(); 
    35793736        } 
    35803737        else 
     
    36553812 
    36563813        return pvs; 
    3657 } 
    3658  
    3659  
    3660 VspNode *VspTree::SubdivideAndCopy(SplitQueue &tQueue, 
    3661                                                                    SubdivisionCandidate *splitCandidate) 
    3662 { 
    3663         // todo remove dynamic cast 
    3664         VspSubdivisionCandidate *sc = static_cast<VspSubdivisionCandidate *>(splitCandidate); 
    3665  
    3666         VspTraversalData &tData = sc->mParentData; 
    3667         VspNode *newNode = tData.mNode; 
    3668         VspNode *oldNode = (VspNode *)splitCandidate->mEvaluationHack; 
    3669  
    3670         if (!oldNode->IsLeaf()) 
    3671         {        
    3672                 /////////// 
    3673                 //-- continue subdivision 
    3674  
    3675                 VspTraversalData tFrontData; 
    3676                 VspTraversalData tBackData; 
    3677                  
    3678                 VspInterior *oldInterior = static_cast<VspInterior *>(oldNode); 
    3679  
    3680                 // create new interior node and two leaf node 
    3681                 const AxisAlignedPlane splitPlane = oldInterior->GetPlane(); 
    3682                 sc->mSplitPlane = splitPlane; 
    3683          
    3684                 // evaluate the changes in render cost and pvs entries 
    3685                 EvalSubdivisionCandidate(*sc, false); 
    3686  
    3687                 newNode = SubdivideNode(*sc, tFrontData, tBackData); 
    3688          
    3689                 //oldNode->mRenderCostDecr += sc->GetRenderCostDecrease(); 
    3690                 //oldNode->mPvsEntriesIncr += sc->GetPvsEntriesIncr(); 
    3691  
    3692                 //oldNode->mRenderCostDecr = sc->GetRenderCostDecrease(); 
    3693                 //oldNode->mPvsEntriesIncr = sc->GetPvsEntriesIncr(); 
    3694  
    3695                 ///////////// 
    3696                 //-- evaluate new split candidates for global greedy cost heuristics 
    3697  
    3698                 VspSubdivisionCandidate *frontCandidate = new VspSubdivisionCandidate(tFrontData); 
    3699                 VspSubdivisionCandidate *backCandidate = new VspSubdivisionCandidate(tBackData); 
    3700  
    3701                 frontCandidate->SetPriority((float)-oldInterior->GetFront()->mTimeStamp); 
    3702                 backCandidate->SetPriority((float)-oldInterior->GetBack()->mTimeStamp); 
    3703  
    3704                 frontCandidate->mEvaluationHack = oldInterior->GetFront(); 
    3705                 backCandidate->mEvaluationHack = oldInterior->GetBack(); 
    3706  
    3707                 // cross reference 
    3708                 tFrontData.mNode->SetSubdivisionCandidate(frontCandidate);  
    3709                 tBackData.mNode->SetSubdivisionCandidate(backCandidate); 
    3710  
    3711                 tQueue.Push(frontCandidate); 
    3712                 tQueue.Push(backCandidate); 
    3713  
    3714                 // note: leaf is not destroyed because it is needed to collect  
    3715                 // dirty candidates in hierarchy manager 
    3716         } 
    3717  
    3718         if (newNode->IsLeaf()) // subdivision terminated 
    3719         { 
    3720                 // detach subdivision candidate: this leaf is no candidate for splitting anymore 
    3721                 tData.mNode->SetSubdivisionCandidate(NULL);  
    3722                 // detach node so it won't get deleted 
    3723                 tData.mNode = NULL; 
    3724         } 
    3725  
    3726         return newNode; 
    37273814} 
    37283815 
     
    38573944} 
    38583945 
    3859 #if 0 
    3860 void VspTree::TraverseRayPacket(RayBundle &rays); 
    3861 { 
    3862         float splitPos [3]; 
    3863         float dist[3]; 
    3864  
    3865         const int allValid = 1xf; 
    3866         int mask = all_valid; 
    3867  
    3868         int comparisonResult = 0; 
    3869  
    3870         while (!node->IsLeaf()) 
    3871         { 
    3872                 comparisonResult = 0; 
    3873  
    3874                 for (int i = 0; i < 4; ++ i) 
    3875                 { 
    3876                         splitPos[i] = node->splitPos; 
    3877                         dist[i] = (splitpos[i] – rp.origin[i][axis]) / (rp.dir[i][axis]); 
    3878  
    3879                         comparisonresult |= ((dist[i] <= tnear[i]) << i); 
    3880                 } 
    3881                  
    3882                 comparisonresult &= mask; 
    3883  
    3884                 if (comparisonresult == allValid) 
    3885                 {  
    3886                         node = node->far; 
    3887                         continue 
    3888                 } 
    3889  
    3890                 comparisonresult = 0; 
    3891  
    3892                 for (int i = 0; i < 4; ++ i){ 
    3893              
    3894                         comparisonresult |= (dist[i] >= tfar[i]); 
    3895                 } 
    3896          
    3897                 comparisonresult &= mask; 
    3898          
    3899                 if (comparisonresult == allValid) 
    3900                 { 
    3901                         node = node->near; 
    3902                         continue; 
    3903                 } 
    3904                  
    3905                 if (comparisonresult)    
    3906                 { 
    3907                  
    3908                         Push( node->far, dist[0...3], tfar[0...3] ) 
    3909                  
    3910                         node = node->near; 
    3911  
    3912                         mask = 0; 
    3913  
    3914                         for (int i = 0; i < 4; ++ i) 
    3915                         { 
    3916                                 bool b = (tnear[i] < tfar[i]); 
    3917                                 mask |= b; 
    3918                  
    3919                                 if (b) 
    3920                                 { 
    3921                                         tfar[i] = dist[i]; 
    3922                                 } 
    3923  
    3924                         } 
    3925  
    3926                 } 
    3927 } 
    3928 #endif 
    3929  
    3930  
    3931  
    3932 void VspTree::TraverseRayPacket()//RayBundle &rays) 
    3933 { 
    3934 #ifdef USE_SSE 
    3935         VspNode *node; 
    3936  
    3937         RayPacket rp; 
    3938  
    3939         __m128 mask; 
    3940         __m128 tf4; 
    3941         __m128 tn4; 
    3942         //const int offs[4] = { (RP->dcell[0] >= 0)?1:0,  (RP->dcell[4] >= 0)?1:0,  (RP->dcell[8] >= 0)?1:0, 0 }; 
    3943          
    3944         const int offs[4] = { 0, 0, 0, 0 }; 
    3945  
    3946         while (!node->IsLeaf()) 
    3947         { 
    3948                 VspInterior *interior = static_cast<VspInterior *>(node); 
    3949  
    3950                 float pos = interior->GetPosition(); 
    3951                 const __m128 spos = _mm_load_ps(&pos); 
    3952                  
    3953                 const int aidx = interior->GetAxis(); 
    3954                 const __m128 d4;// = _mm_mul_ps( _mm_sub_ps( spos, RP->oc4[aidx] ), RP->rdc4[aidx] ); 
    3955                  
    3956                 VspNode* ln = interior->GetBack();// + offs[aidx]; 
    3957                  
    3958                 if (!_mm_movemask_ps( _mm_and_ps( _mm_cmpgt_ps( d4, tn4 ), mask ) ))  
    3959                 {  
    3960                         node = ln;  
    3961                         continue;  
    3962                 } 
    3963                  
    3964                 node = interior->GetBack();// + (offs[aidx]^1); 
    3965                  
    3966                 if (_mm_movemask_ps( _mm_and_ps( _mm_cmplt_ps( d4, tf4 ), mask ) )) 
    3967                 { 
    3968                         const __m128 mask2 = _mm_cmpgt_ps( d4, tn4 ); 
    3969                         const __m128 mask3 = _mm_cmplt_ps( d4, tf4 ); 
    3970                          
    3971                         //m_Stack[stackptr].tf4 = tf4; 
    3972  
    3973                         tf4 = _mm_or_ps( _mm_and_ps( mask3, d4 ), _mm_andnot_ps( mask3, tf4 ) ); 
    3974  
    3975                         //m_Stack[stackptr].node = (KdTreeNode*)ln; 
    3976                         //m_Stack[stackptr].mask = mask; 
    3977                         //m_Stack[stackptr++].tn4 = _mm_or_ps( _mm_and_ps( mask2, d4 ), _mm_andnot_ps( mask2, tn4 ) ); 
    3978                         mask = _mm_cmplt_ps( tn4, tf4 ); 
    3979                 } 
    3980         } 
    3981 #endif 
    3982  
    3983 } 
    3984  
    3985 } 
     3946 
     3947 
     3948 
     3949} 
  • GTP/trunk/Lib/Vis/Preprocessing/src/VspTree.h

    r2288 r2332  
    4545 
    4646 
    47 #define WORK_WITH_VIEWCELLS 0 
    4847 
    4948/** View space partition statistics. 
     
    573572                float mBackPvs; 
    574573 
     574                float mFrontTriangles; 
     575                float mBackTriangles; 
     576                 
    575577                float mCorrectedFrontRenderCost; 
    576578                float mCorrectedBackRenderCost; 
     
    733735        void SetViewCellsTree(ViewCellsTree *vt) { mViewCellsTree = vt; } 
    734736 
    735 #if WORK_WITH_VIEWCELLS 
    736         /** Remove the references of the parent view cell from the kd nodes associated with 
    737                 the objects. 
    738         */ 
    739         void RemoveParentViewCellReferences(ViewCell *parent) const; 
    740  
    741         /** Adds references to the view cell to the kd nodes associated with the objects. 
    742         */ 
    743         void AddViewCellReferences(ViewCell *vc) const; 
    744 #endif 
    745  
    746         VspNode *SubdivideAndCopy(SplitQueue &tQueue, SubdivisionCandidate *splitCandidate); 
    747737 
    748738        PerfTimer mSortTimer; 
     
    10751065                                                                ViewCell *back) const; 
    10761066 
    1077         void CreateViewCell(VspTraversalData &tData, const bool updatePvs); 
     1067        void CreateViewCell(VspTraversalData &tData,  
     1068                                                const bool updatePvs, 
     1069                                                const float renderCost, 
     1070                                                const int pvs); 
    10781071 
    10791072        /** Collect split candidates which are affected by the last split 
     
    11131106        */ 
    11141107        void Initialise(const VssRayContainer &rays, 
    1115                                         AxisAlignedBox3 *forcedBoundingBox); 
     1108                                        AxisAlignedBox3 *forcedBoundingBox, 
     1109                                        const ObjectContainer &objects); 
    11161110 
    11171111        int CompressObjects(); 
    11181112 
    11191113        int CompressObjects(VspLeaf *leaf); 
    1120  
    1121         void TraverseRayPacket(); 
    11221114 
    11231115#ifdef USE_SSE 
     
    11251117        struct RayPacket 
    11261118        { 
    1127                 union { float ox[4]; __m128 ox4; }; 
    1128                 union { float oy[4]; __m128 oy4; }; 
    1129                 union { float oz[4]; __m128 oz4; }; 
    1130                 union { float dx[4]; __m128 dx4; }; 
    1131                 union { float dy[4]; __m128 dy4; }; 
    1132                 union { float dz[4]; __m128 dz4; }; 
     1119                union { float mOriginX[4]; __m128 mOriginX4; }; 
     1120                union { float mOriginY[4]; __m128 mOriginY4; }; 
     1121                union { float mOriginZ[4]; __m128 mOriginZ4; }; 
     1122 
     1123                union { float mTerminationX[4]; __m128 mTerminationX4; }; 
     1124                union { float mTerminationY[4]; __m128 mTerminationY4; }; 
     1125                union { float mTerminationZ[4]; __m128 mTerminationZ4; }; 
     1126 
     1127                ViewCellContainer mViewCells[4]; 
    11331128        }; 
     1129 
     1130        struct PacketTraversalData 
     1131        { 
     1132                VspNode *mNode; 
     1133 
     1134                union { float mExitPointX[4]; __m128 mExitPointX4; }; 
     1135                union { float mExitPointY[4]; __m128 mExitPointY4; }; 
     1136                union { float mExitPointZ[4]; __m128 mExitPointZ4; }; 
     1137 
     1138                union { float mMaxT[4]; __m128 mMaxT4; }; 
     1139                union { float mMask[4]; __m128 mMask4; }; 
     1140 
     1141                PacketTraversalData () {} 
     1142                PacketTraversalData (VspNode *n,  
     1143                                                         const __m128 &px, const __m128 &py, const __m128 &pz,  
     1144                                                         const __m128 &maxt, 
     1145                                                         const __m128 &mask): 
     1146                mNode(n),  
     1147                mExitPointX4(px), mExitPointY4(py), mExitPointZ4(pz), 
     1148                mMaxT4(maxt), 
     1149                mMask4(mask) 
     1150                {} 
     1151        }; 
     1152 
     1153         
     1154        int TraverseRayPacket(RayPacket &rp, 
     1155                                                  const bool useMailboxing); 
     1156 
    11341157#endif 
    11351158 
     
    11411164        HierarchyManager *mHierarchyManager; 
    11421165        BvHierarchy *mBvHierarchy; 
    1143  
    1144         //OspTree *mOspTree; 
    1145         //bool mUseKdPvsForHeuristics; 
    11461166         
    11471167        ViewCellsManager *mViewCellsManager; 
  • GTP/trunk/Lib/Vis/Preprocessing/src/VssPreprocessor.cpp

    r2283 r2332  
    463463                                "#AvgRayContrib\n" << avgRayContrib << endl; 
    464464                } 
    465  
    466                 cout << "#totalPvsSize=" << mKdTree->CollectLeafPvs() << endl; 
    467  
    468  
    469  
    470465        } 
    471466 
Note: See TracChangeset for help on using the changeset viewer.