Ignore:
Timestamp:
01/05/06 20:41:52 (19 years ago)
Author:
mattausch
Message:

added mesh creation function

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/VUT/GtpVisibilityPreprocessor/src/ViewCellsManager.cpp

    r502 r503  
    3737void ViewCellsManager::ParseEnvironment() 
    3838{ 
    39         // post processing stuff 
    40         environment->GetIntValue("ViewCells.PostProcess.minPvsDif", mMinPvsDif); 
    41         environment->GetIntValue("ViewCells.PostProcess.minPvs", mMinPvs); 
    42         environment->GetIntValue("ViewCells.PostProcess.maxPvs", mMaxPvs); 
    43  
     39        // visualization stuff 
    4440        environment->GetBoolValue("ViewCells.Visualization.exportRays", mExportRays); 
    4541        environment->GetBoolValue("ViewCells.Visualization.exportGeometry", mExportGeometry); 
    4642 
    4743        char buf[50]; 
    48          
     44 
    4945        environment->GetStringValue("ViewCells.Visualization.colorCode", buf); 
    50          
     46 
    5147        if (strcmp(buf, "PVS") == 0) 
    5248                mColorCode = 1; 
     
    6561{ 
    6662        DEL_PTR(mRenderer); 
    67  
    6863        CLEAR_CONTAINER(mViewCells); 
     64        CLEAR_CONTAINER(mMeshContainer); 
    6965} 
    7066 
     
    7369{ 
    7470        X3dParser parser; 
    75          
     71 
    7672        environment->GetFloatValue("ViewCells.height", parser.mViewCellHeight); 
    77          
     73 
    7874        bool success = parser.ParseFile(filename, *this); 
    7975        Debug << (int)mViewCells.size() << " view cells loaded" << endl; 
     
    10298        if (!ViewCellsConstructed()) 
    10399                return; 
    104    
     100 
    105101        VssRayContainer::const_iterator it, it_end = rays.end(); 
    106102 
    107         for (it = rays.begin(); it != it_end; ++ it)  
    108         {        
     103        for (it = rays.begin(); it != it_end; ++ it) 
     104        { 
    109105                ComputeSampleContributions(*(*it)); 
    110106        } 
     
    143139 
    144140 
    145 void ViewCellsManager::DeriveViewCells(const ObjectContainer &objects,  
    146                                                                            ViewCellContainer &viewCells,  
     141void ViewCellsManager::DeriveViewCells(const ObjectContainer &objects, 
     142                                                                           ViewCellContainer &viewCells, 
    147143                                                                           const int maxViewCells) const 
    148144{ 
    149145        // maximal max viewcells 
    150         int limit = maxViewCells > 0 ?  
     146        int limit = maxViewCells > 0 ? 
    151147                Min((int)objects.size(), maxViewCells) : (int)objects.size(); 
    152148 
     
    154150        { 
    155151                Intersectable *object = objects[i]; 
    156                  
     152 
    157153                // extract the mesh instances 
    158154                if (object->Type() == Intersectable::MESH_INSTANCE) 
     
    168164 
    169165 
    170 ViewCell *ViewCellsManager::ExtrudeViewCell(const Triangle3 &baseTri,  
     166ViewCell *ViewCellsManager::ExtrudeViewCell(const Triangle3 &baseTri, 
    171167                                                                                        const float height) const 
    172168{ 
    173169        // one mesh per view cell 
    174170        Mesh *mesh = new Mesh(); 
    175          
     171 
    176172        //-- construct prism 
    177173 
    178         // bottom  
     174        // bottom 
    179175        mesh->mFaces.push_back(new Face(2,1,0)); 
    180176        // top 
     
    188184        Vector3 triNorm = baseTri.GetNormal(); 
    189185 
    190         Triangle3 topTri;        
     186        Triangle3 topTri; 
    191187 
    192188        // add base vertices and calculate top vertices 
    193189        for (int i = 0; i < 3; ++ i) 
    194190                mesh->mVertices.push_back(baseTri.mVertices[i]); 
    195          
    196         // add top vertices      
     191 
     192        // add top vertices 
    197193        for (int i = 0; i < 3; ++ i) 
    198194                mesh->mVertices.push_back(baseTri.mVertices[i] + height * triNorm); 
    199          
     195 
    200196        mesh->Preprocess(); 
    201197 
     
    217213 
    218214        std::merge(front.mPiercingRays.begin(), front.mPiercingRays.end(), 
    219                            back.mPiercingRays.begin(), back.mPiercingRays.end(),  
     215                           back.mPiercingRays.begin(), back.mPiercingRays.end(), 
    220216                           vc->mPiercingRays.begin()); 
    221217 
     
    321317{ 
    322318        mViewCells.clear(); 
    323          
     319 
    324320        CollectViewCells(); 
    325321        mViewCellsStats.Reset(); 
     
    336332 
    337333  ViewCellContainer viewcells; 
    338                  
     334 
    339335  ray.mPvsContribution = 0; 
    340336  ray.mRelativePvsContribution = 0.0f; 
     
    343339  Ray hray(ray); 
    344340  float tmin = 0, tmax = 1.0; 
    345    
     341 
    346342  //hray.Init(ray.GetOrigin(), ray.GetDir(), Ray::LINE_SEGMENT); 
    347343  if (!GetSceneBbox().GetRaySegment(hray, tmin, tmax) || (tmin > tmax)) 
    348344        return; 
    349    
     345 
    350346  Vector3 origin = hray.Extrap(tmin); 
    351347  Vector3 termination = hray.Extrap(tmax); 
    352    
     348 
    353349  CastLineSegment(origin, 
    354350                                  termination, 
    355351                                  viewcells); 
    356    
     352 
    357353  // copy viewcells memory efficiently 
    358354  const bool storeViewcells = false; 
     
    361357        ray.mViewCells = viewcells; 
    362358  } 
    363    
     359 
    364360  ViewCellContainer::const_iterator it = viewcells.begin(); 
    365361 
     
    367363 
    368364  if (addInPlace) { 
    369         for (; it != viewcells.end(); ++it) {    
     365        for (; it != viewcells.end(); ++it) { 
    370366          ViewCell *viewcell = *it; 
    371            
     367 
    372368          // if ray not outside of view space 
    373369          float contribution; 
    374           bool added =  
     370          bool added = 
    375371                viewcell->GetPvs().AddSample(ray.mTerminationObject, 
    376372                                                                         contribution 
     
    378374          if (added) 
    379375                ray.mPvsContribution++; 
    380            
     376 
    381377          ray.mRelativePvsContribution += contribution; 
    382378        } 
    383379  } else { 
    384     for (; it != viewcells.end(); ++it) {        
     380    for (; it != viewcells.end(); ++it) { 
    385381          ViewCell *viewcell = *it; 
    386382          // if ray not outside of view space 
     
    390386                                                                                                   )) 
    391387                ray.mPvsContribution++; 
    392            
     388 
    393389          ray.mRelativePvsContribution += contribution; 
    394390        } 
    395391 
    396         for (it = viewcells.begin(); it != viewcells.end(); ++it) {      
     392        for (it = viewcells.begin(); it != viewcells.end(); ++it) { 
    397393          ViewCell *viewcell = *it; 
    398394          // if ray not outside of view space 
     
    405401void ViewCellsManager::GetRaySets(const VssRayContainer &sourceRays, 
    406402                                                                  const int maxSize, 
    407                                                                   VssRayContainer &usedRays,  
     403                                                                  VssRayContainer &usedRays, 
    408404                                                                  VssRayContainer *savedRays) const 
    409405{ 
     
    461457 
    462458 
     459 
     460void ViewCellsManager::CreateViewCellsMeshes() 
     461{ 
     462        // convert to meshes 
     463        ViewCellContainer::const_iterator it, it_end = mViewCells.end(); 
     464 
     465        for (it = mViewCells.begin(); it != it_end; ++ it) 
     466        { 
     467                CreateMesh(*it); 
     468        } 
     469} 
     470 
    463471/**********************************************************************/ 
    464472/*                   BspViewCellsManager implementation               */ 
     
    466474 
    467475 
    468 BspViewCellsManager::BspViewCellsManager(BspTree *bspTree,  
     476BspViewCellsManager::BspViewCellsManager(BspTree *bspTree, 
    469477                                                                                 int constructionSamples): 
    470 ViewCellsManager(constructionSamples),  
     478ViewCellsManager(constructionSamples), 
    471479mBspTree(bspTree) 
    472480{ 
     
    486494 
    487495 
    488 int BspViewCellsManager::Construct(const ObjectContainer &objects,  
     496int BspViewCellsManager::Construct(const ObjectContainer &objects, 
    489497                                                                   const VssRayContainer &rays) 
    490498{ 
     
    494502 
    495503        int sampleContributions = 0; 
    496          
     504 
    497505        // construct view cells using the collected samples 
    498506        RayContainer constructionRays; 
     
    513521        } 
    514522 
    515     if (mViewCells.empty())  
    516         {  
    517                 // no view cells loaded  
     523    if (mViewCells.empty()) 
     524        { 
     525                // no view cells loaded 
    518526                mBspTree->Construct(objects, constructionRays); 
    519527                // collect final view cells 
    520528                mBspTree->CollectViewCells(mViewCells); 
    521         }  
     529        } 
    522530        else 
    523531        { 
     
    529537 
    530538        Debug << mBspTree->GetStatistics() << endl; 
    531          
    532         EvaluateViewCellsStats(); 
     539 
     540        //EvaluateViewCellsStats(); 
    533541        Debug << "\nView cells after construction:\n" << mViewCellsStats << endl; 
    534542 
     
    536544        ComputeSampleContributions(savedRays); 
    537545 
     546 
    538547        return sampleContributions; 
    539548} 
    540549 
     550 
    541551void BspViewCellsManager::CollectViewCells() 
    542552{ 
    543553        mBspTree->CollectViewCells(mViewCells); 
    544554} 
     555 
    545556 
    546557float BspViewCellsManager::GetProbability(ViewCell *viewCell) 
     
    553564#endif 
    554565} 
    555    
     566 
    556567 
    557568float BspViewCellsManager::GetRendercost(ViewCell *viewCell, float objRendercost) const 
     
    575586 
    576587 
    577 int BspViewCellsManager::PostProcess(const ObjectContainer &objects,  
     588int BspViewCellsManager::PostProcess(const ObjectContainer &objects, 
    578589                                                                         const VssRayContainer &rays) 
    579590{ 
     
    601612                cout << "exporting initial view cells (=leaves) ... "; 
    602613                Exporter *exporter = Exporter::GetExporter("view_cells.x3d"); 
    603          
     614 
    604615                if (exporter) 
    605616                { 
     
    607618                        exporter->SetFilled(); 
    608619                        ExportViewCells(exporter); 
    609                                  
     620 
    610621                        if (mExportGeometry) 
    611622                        { 
     
    624635 
    625636        cout << "starting post processing using " << mPostProcessSamples << " samples ... "; 
    626                  
     637 
    627638        long startTime = GetTime(); 
    628639 
     
    637648        CLEAR_CONTAINER(mBspRays); 
    638649        ConstructBspRays(rays, mPostProcessSamples); 
    639          
     650 
    640651        for (int i = 0; i < (int)mBspRays.size(); ++ i) 
    641         {   
     652        { 
    642653                BspRay *ray = mBspRays[i]; 
    643            
     654 
    644655                // traverse leaves stored in the rays and compare and merge consecutive 
    645656                // leaves (i.e., the neighbors in the tree) 
    646657                if (ray->intersections.size() < 2) 
    647658                        continue; 
    648            
     659 
    649660                iit = ray->intersections.begin(); 
    650661 
    651662                BspLeaf *previousLeaf = (*iit).mLeaf; 
    652663                ++ iit; 
    653                  
     664 
    654665                for (; iit != ray->intersections.end(); ++ iit) 
    655666                { 
     
    657668 
    658669                        if (ShouldMerge(leaf, previousLeaf)) 
    659                         {                        
     670                        { 
    660671                                MergeBspLeafViewCells(leaf, previousLeaf); 
    661672 
    662673                                ++ merged; 
    663674                        } 
    664                  
     675 
    665676                        previousLeaf = leaf; 
    666677                } 
     
    673684 
    674685        Debug << "Postprocessing: Merged " << merged << " view cells in " 
    675                   << TimeDiff(startTime, GetTime()) *1e-3 << " secs"  
     686                  << TimeDiff(startTime, GetTime()) *1e-3 << " secs" 
    676687                  << "using " << (int)mBspRays.size() << " samples" << endl << endl; 
    677          
     688 
    678689        CLEAR_CONTAINER(mBspRays); 
    679690 
     
    704715        CLEAR_CONTAINER(mBspRays); 
    705716        ConstructBspRays(sampleRays, mVisualizationSamples); 
    706          
     717 
    707718        if (1) // export view cells 
    708719        { 
     
    715726                        delete exporter; 
    716727                } 
    717                  
     728 
    718729                cout << "finished" << endl; 
    719         }        
     730        } 
    720731 
    721732        //-- visualization of the BSP splits 
    722733        bool exportSplits = false; 
    723734        environment->GetBoolValue("BspTree.Visualization.exportSplits", exportSplits); 
    724          
     735 
    725736        if (exportSplits) 
    726737        { 
     
    734745 
    735746 
    736 inline bool vc_gt(ViewCell *a, ViewCell *b)  
    737 {  
     747inline bool vc_gt(ViewCell *a, ViewCell *b) 
     748{ 
    738749        return a->GetPvs().GetSize() > b->GetPvs().GetSize(); 
    739750} 
     
    744755        Exporter *exporter = Exporter::GetExporter("bsp_splits.x3d"); 
    745756 
    746         if (exporter)  
    747         {        
    748                 Material m;  
     757        if (exporter) 
     758        { 
     759                Material m; 
    749760                m.mDiffuseColor = RgbColor(1, 0, 0); 
    750761                exporter->SetForcedMaterial(m); 
    751762                exporter->SetWireframe(); 
    752                  
     763 
    753764                exporter->ExportBspSplits(*mBspTree, true); 
    754765 
     
    759770 
    760771                exporter->SetFilled(); 
    761                                  
     772 
    762773                // export rays 
    763774                if (0) 
    764775                { 
    765776                        VssRayContainer outRays; 
    766                  
     777 
    767778                        int raysSize = min((int)mBspRays.size(), mVisualizationSamples); 
    768779 
     
    770781                                // only rays piercing geometry 
    771782                                outRays.push_back(mBspRays[i]->vssRay); 
    772                                                  
    773                         // export rays  
     783 
     784                        // export rays 
    774785                        exporter->ExportRays(outRays, RgbColor(1, 1, 0)); 
    775786                } 
     
    786797{ 
    787798        const int leafOut = 10; 
    788          
     799 
    789800        ViewCell::NewMail(); 
    790801 
    791802        //-- some rays for output 
    792803        const int raysOut = min((int)mBspRays.size(), mVisualizationSamples); 
    793          
     804 
    794805        cout << "visualization using " << mVisualizationSamples << " samples" << endl; 
    795806        Debug << "\nOutput view cells: " << endl; 
    796          
     807 
    797808        // sort view cells to get largest view cells 
    798809#if 0 
    799810        stable_sort(mViewCells.begin(), mViewCells.end(), vc_gt); 
    800811#endif 
    801         int limit = min(leafOut, (int)mViewCells.size());  
    802                  
     812        int limit = min(leafOut, (int)mViewCells.size()); 
     813 
    803814        for (int i = 0; i < limit; ++ i) 
    804815        { 
     
    815826#if 0 
    816827                // check whether we can add the current ray to the output rays 
    817                 for (int k = 0; k < raysOut; ++ k)  
     828                for (int k = 0; k < raysOut; ++ k) 
    818829                { 
    819830                        BspRay *ray = mBspRays[k]; 
     
    821832                        { 
    822833                                BspLeaf *leaf = ray->intersections[j].mLeaf; 
    823                                 if (vc == leaf->GetViewCell())  
     834                                if (vc == leaf->GetViewCell()) 
    824835                                        vcRays.push_back(ray->vssRay); 
    825836                        } 
     
    830841 
    831842                Exporter *exporter = Exporter::GetExporter(s); 
    832                          
     843 
    833844                exporter->SetWireframe(); 
    834845 
     
    841852                else 
    842853                { 
    843                         PolygonContainer vcGeom; 
    844                          
     854                        BspNodeGeometry vcGeom; 
     855 
    845856                        //-- export view cell 
    846857                        mBspTree->ConstructGeometry(vc, vcGeom); 
    847                         exporter->ExportPolygons(vcGeom); 
    848                         CLEAR_CONTAINER(vcGeom); 
    849                 } 
    850                          
    851                 Debug << i << ": pvs size=" << (int)vc->GetPvs().GetSize()  
     858                        exporter->ExportPolygons(vcGeom.mPolys); 
     859                } 
     860 
     861                Debug << i << ": pvs size=" << (int)vc->GetPvs().GetSize() 
    852862                          << ", piercing rays=" << (int)vcRays.size() 
    853863                          << ", leaves=" << (int)vc->mLeaves.size() << endl; 
    854864 
    855                          
     865 
    856866                // export rays piercing this view cell 
    857867#if 0 
     
    871881 
    872882                // output PVS of view cell 
    873                 for (it = vc->GetPvs().mEntries.begin(); it != it_end; ++ it)  
     883                for (it = vc->GetPvs().mEntries.begin(); it != it_end; ++ it) 
    874884                { 
    875885                        Intersectable *intersect = (*it).first; 
     
    882892                                exporter->ExportIntersectable(intersect); 
    883893                                intersect->Mail(); 
    884                         }                        
    885                 } 
    886                                  
     894                        } 
     895                } 
     896 
    887897                DEL_PTR(exporter); 
    888898                cout << "finished" << endl; 
     
    895905bool BspViewCellsManager::MergeBspLeafViewCells(BspLeaf *front, BspLeaf *back) const 
    896906{ 
    897         BspViewCell *viewCell =  
    898                 dynamic_cast<BspViewCell *>(MergeViewCells(*front->GetViewCell(),  
     907        BspViewCell *viewCell = 
     908                dynamic_cast<BspViewCell *>(MergeViewCells(*front->GetViewCell(), 
    899909                                                                                                   *back->GetViewCell())); 
    900          
     910 
    901911        if (!viewCell) 
    902912                return false; 
     
    910920 
    911921        vector<BspLeaf *>::const_iterator it; 
    912          
     922 
    913923        for (it = fLeaves.begin(); it != fLeaves.end(); ++ it) 
    914924        { 
     
    921931                viewCell->mLeaves.push_back(*it); 
    922932        } 
    923          
     933 
    924934        DEL_PTR(fVc); 
    925935        DEL_PTR(bVc); 
     
    940950        if (fvc->GetPvs().GetSize() + fdiff < mMaxPvs) 
    941951        { 
    942                 if ((fvc->GetPvs().GetSize() < mMinPvs) ||       
     952                if ((fvc->GetPvs().GetSize() < mMinPvs) || 
    943953                        (bvc->GetPvs().GetSize() < mMinPvs) || 
    944954                        ((fdiff < mMinPvsDif) && (bvc->GetPvs().Diff(fvc->GetPvs()) < mMinPvsDif))) 
     
    947957                } 
    948958        } 
    949          
     959 
    950960        return false; 
    951961} 
     
    979989 
    980990 
    981 void BspViewCellsManager::ExportColor(Exporter *exporter,  
     991void BspViewCellsManager::ExportColor(Exporter *exporter, 
    982992                                                                          ViewCell *vc) const 
    983993{ 
     
    9941004        case 1: // pvs 
    9951005                { 
    996                         importance = (float)vc->GetPvs().GetSize() /  
     1006                        importance = (float)vc->GetPvs().GetSize() / 
    9971007                                (float)mViewCellsStats.maxPvs; 
    9981008                } 
     
    10021012                        BspViewCell *bspVc = dynamic_cast<BspViewCell *>(vc); 
    10031013 
    1004                         importance = (float)bspVc->mLeaves.size() /  
     1014                        importance = (float)bspVc->mLeaves.size() / 
    10051015                                (float)mViewCellsStats.maxLeaves; 
    10061016                } 
     
    10191029        m.mDiffuseColor.r = importance; 
    10201030        m.mDiffuseColor.g = 1.0f - m.mDiffuseColor.r; 
    1021          
     1031 
    10221032        exporter->SetForcedMaterial(m); 
    10231033} 
    10241034 
    1025 void BspViewCellsManager::ExportVcGeometry(Exporter *exporter,  
     1035void BspViewCellsManager::ExportVcGeometry(Exporter *exporter, 
    10261036                                                                                 ViewCell *vc) const 
    10271037{ 
     
    10301040        else 
    10311041        { 
    1032                 PolygonContainer cell; 
     1042                BspNodeGeometry geom; 
    10331043                mBspTree->ConstructGeometry( 
    1034                         dynamic_cast<BspViewCell *>(vc), cell); 
    1035                 exporter->ExportPolygons(cell); 
    1036         } 
     1044                        dynamic_cast<BspViewCell *>(vc), geom); 
     1045                exporter->ExportPolygons(geom.mPolys); 
     1046        } 
     1047} 
     1048 
     1049 
     1050void BspViewCellsManager::CreateMesh(ViewCell *vc) 
     1051{ 
    10371052} 
    10381053 
     
    10481063/*                   KdViewCellsManager implementation               */ 
    10491064/**********************************************************************/ 
     1065 
     1066 
    10501067 
    10511068KdViewCellsManager::KdViewCellsManager(KdTree *kdTree): 
     
    10851102} 
    10861103 
    1087 int KdViewCellsManager::Construct(const ObjectContainer &objects,  
     1104int KdViewCellsManager::Construct(const ObjectContainer &objects, 
    10881105                                                                  const VssRayContainer &rays) 
    10891106{ 
     
    10971114        // create the view cells 
    10981115        mKdTree->CreateAndCollectViewCells(mViewCells); 
    1099          
     1116 
    11001117        // cast rays 
    11011118        ComputeSampleContributions(rays); 
     
    11121129} 
    11131130 
    1114 int KdViewCellsManager::PostProcess(const ObjectContainer &objects,  
     1131int KdViewCellsManager::PostProcess(const ObjectContainer &objects, 
    11151132                                                                        const VssRayContainer &rays) 
    11161133{ 
     
    11351152        { 
    11361153                const int leafOut = 10; 
    1137                  
     1154 
    11381155                ViewCell::NewMail(); 
    1139    
     1156 
    11401157                //-- some rays for output 
    11411158                const int raysOut = min((int)sampleRays.size(), mVisualizationSamples); 
     
    11441161                //-- some random view cells and rays for output 
    11451162                vector<KdLeaf *> kdLeaves; 
    1146                  
     1163 
    11471164                for (int i = 0; i < leafOut; ++ i) 
    11481165                        kdLeaves.push_back(dynamic_cast<KdLeaf *>(mKdTree->GetRandomLeaf())); 
    1149                  
     1166 
    11501167                for (int i = 0; i < kdLeaves.size(); ++ i) 
    11511168                { 
    11521169                        KdLeaf *leaf = kdLeaves[i]; 
    11531170                        RayContainer vcRays; 
    1154                          
     1171 
    11551172                        cout << "creating output for view cell " << i << " ... "; 
    1156 #if 0                    
     1173#if 0 
    11571174                        // check whether we can add the current ray to the output rays 
    1158                         for (int k = 0; k < raysOut; ++ k)  
     1175                        for (int k = 0; k < raysOut; ++ k) 
    11591176                        { 
    11601177                                Ray *ray = sampleRays[k]; 
    1161                                  
     1178 
    11621179                                for (int j = 0; j < (int)ray->bspIntersections.size(); ++ j) 
    11631180                                { 
    11641181                                        BspLeaf *leaf2 = ray->bspIntersections[j].mLeaf; 
    1165                                          
    1166                                         if (leaf->GetViewCell() == leaf2->GetViewCell())  
     1182 
     1183                                        if (leaf->GetViewCell() == leaf2->GetViewCell()) 
    11671184                                        { 
    11681185                                                vcRays.push_back(ray); 
     
    11701187                                } 
    11711188                        } 
    1172 #endif                   
     1189#endif 
    11731190                        Intersectable::NewMail(); 
    1174                          
     1191 
    11751192                        ViewCell *vc = leaf->mViewCell; 
    1176                          
     1193 
    11771194                        //bspLeaves[j]->Mail(); 
    11781195                        char s[64]; sprintf(s, "kd-pvs%04d.x3d", i); 
    1179                          
     1196 
    11801197                        Exporter *exporter = Exporter::GetExporter(s); 
    11811198                        exporter->SetFilled(); 
     
    11831200                        exporter->SetWireframe(); 
    11841201                        //exporter->SetFilled(); 
    1185                          
     1202 
    11861203                        Material m;//= RandomMaterial(); 
    11871204                        m.mDiffuseColor = RgbColor(1, 1, 0); 
    11881205                        exporter->SetForcedMaterial(m); 
    1189                          
     1206 
    11901207                        AxisAlignedBox3 box = mKdTree->GetBox(leaf); 
    11911208                        exporter->ExportBox(box); 
    11921209 
    1193                         Debug << i << ": pvs size=" << (int)vc->GetPvs().GetSize()  
     1210                        Debug << i << ": pvs size=" << (int)vc->GetPvs().GetSize() 
    11941211                                << ", piercing rays=" << (int)vcRays.size() << endl; 
    1195                          
     1212 
    11961213                        // export rays piercing this view cell 
    1197                         exporter->ExportRays(vcRays, 1000, RgbColor(0, 1, 0));   
    1198                          
     1214                        exporter->ExportRays(vcRays, 1000, RgbColor(0, 1, 0)); 
     1215 
    11991216                        m.mDiffuseColor = RgbColor(1, 0, 0); 
    12001217                        exporter->SetForcedMaterial(m); 
    1201                          
     1218 
    12021219                        // exporter->SetWireframe(); 
    12031220                        exporter->SetFilled(); 
    1204                          
     1221 
    12051222                        ObjectPvsMap::iterator it, it_end = vc->GetPvs().mEntries.end(); 
    12061223                        // output PVS of view cell 
    1207                         for (it = vc->GetPvs().mEntries.begin(); it !=  it_end; ++ it)  
     1224                        for (it = vc->GetPvs().mEntries.begin(); it !=  it_end; ++ it) 
    12081225                        { 
    12091226                                Intersectable *intersect = (*it).first; 
     
    12121229                                        exporter->ExportIntersectable(intersect); 
    12131230                                        intersect->Mail(); 
    1214                                 }                        
     1231                                } 
    12151232                        } 
    1216                          
     1233 
    12171234                        DEL_PTR(exporter); 
    12181235                        cout << "finished" << endl; 
     
    12261243                { 
    12271244                        VssRay *ray = sampleRays[i]; 
    1228                  
     1245 
    12291246                        // check whether we can add this to the rays 
    1230                         for (int j = 0; j < pvsOut; j++)  
     1247                        for (int j = 0; j < pvsOut; j++) 
    12311248                        { 
    12321249                                if (objects[j] == ray->mTerminationObject) 
     
    12371254                } 
    12381255 
    1239                 if (exportRays)  
     1256                if (exportRays) 
    12401257                { 
    12411258                        Exporter *exporter = NULL; 
     
    12431260                        exporter->SetWireframe(); 
    12441261                        exporter->ExportKdTree(*mKdTree); 
    1245                  
    1246                         for (i=0; i < pvsOut; i++)  
     1262 
     1263                        for (i=0; i < pvsOut; i++) 
    12471264                                exporter->ExportRays(rays[i], RgbColor(1, 0, 0)); 
    12481265 
    12491266                        exporter->SetFilled(); 
    1250                  
     1267 
    12511268                        delete exporter; 
    12521269                } 
    12531270 
    1254                 for (int k=0; k < pvsOut; k++)  
     1271                for (int k=0; k < pvsOut; k++) 
    12551272                { 
    12561273                        Intersectable *object = objects[k]; 
    1257                         char s[64];      
     1274                        char s[64]; 
    12581275                        sprintf(s, "sample-pvs%04d.x3d", k); 
    12591276 
    12601277                        Exporter *exporter = Exporter::GetExporter(s); 
    12611278                        exporter->SetWireframe(); 
    1262                  
     1279 
    12631280                        KdPvsMap::iterator i = object->mKdPvs.mEntries.begin(); 
    12641281                        Intersectable::NewMail(); 
    1265                          
     1282 
    12661283                        // avoid adding the object to the list 
    12671284                        object->Mail(); 
    12681285                        ObjectContainer visibleObjects; 
    1269              
    1270                         for (; i != object->mKdPvs.mEntries.end(); i++)  
     1286 
     1287                        for (; i != object->mKdPvs.mEntries.end(); i++) 
    12711288                        { 
    12721289                                KdNode *node = (*i).first; 
    12731290                                exporter->ExportBox(mKdTree->GetBox(node)); 
    1274                  
     1291 
    12751292                                mKdTree->CollectObjects(node, visibleObjects); 
    12761293                        } 
    1277                  
     1294 
    12781295                        exporter->ExportRays(rays[k],  RgbColor(0, 1, 0)); 
    12791296                        exporter->SetFilled(); 
    1280                          
     1297 
    12811298                        for (int j = 0; j < visibleObjects.size(); j++) 
    12821299                                exporter->ExportIntersectable(visibleObjects[j]); 
    1283                          
     1300 
    12841301                        Material m; 
    12851302                        m.mDiffuseColor = RgbColor(1, 0, 0); 
    12861303                        exporter->SetForcedMaterial(m); 
    12871304                        exporter->ExportIntersectable(object); 
    1288                  
     1305 
    12891306                        delete exporter; 
    12901307                } 
    1291         }                
     1308        } 
    12921309} 
    12931310 
     
    13001317 
    13011318 
    1302 void KdViewCellsManager::ExportVcGeometry(Exporter *exporter,  
     1319void KdViewCellsManager::ExportVcGeometry(Exporter *exporter, 
    13031320                                                                                  ViewCell *vc) const 
    13041321{ 
     
    13351352 
    13361353 
     1354void KdViewCellsManager::CreateMesh(ViewCell *vc) 
     1355{ 
     1356} 
     1357 
    13371358/**********************************************************************/ 
    13381359/*                   VspKdViewCellsManager implementation             */ 
     
    13401361 
    13411362 
    1342 VspKdViewCellsManager::VspKdViewCellsManager(VspKdTree *vspKdTree,  
     1363VspKdViewCellsManager::VspKdViewCellsManager(VspKdTree *vspKdTree, 
    13431364                                                                                         int constructionSamples): 
    1344 ViewCellsManager(constructionSamples),  
     1365ViewCellsManager(constructionSamples), 
    13451366mVspKdTree(vspKdTree) 
    13461367{ 
     
    13641385} 
    13651386 
     1387 
    13661388void VspKdViewCellsManager::CollectViewCells() 
    13671389{ 
     
    13691391} 
    13701392 
    1371 int VspKdViewCellsManager::Construct(const ObjectContainer &objects,  
     1393int VspKdViewCellsManager::Construct(const ObjectContainer &objects, 
    13721394                                                                         const VssRayContainer &rays) 
    13731395{ 
     
    13751397        if (ViewCellsConstructed()) 
    13761398                return 0; 
    1377                  
     1399 
    13781400        VssRayContainer constructionRays; 
    13791401        VssRayContainer savedRays; 
    13801402 
    1381         GetRaySets(rays,  
    1382                            mConstructionSamples,  
    1383                            constructionRays,  
     1403        GetRaySets(rays, 
     1404                           mConstructionSamples, 
     1405                           constructionRays, 
    13841406                           &savedRays); 
    1385          
    1386         Debug << "constructing vsp kd tree using "  
     1407 
     1408        Debug << "constructing vsp kd tree using " 
    13871409                  << (int)constructionRays.size() << " samples" << endl; 
    13881410 
     
    13971419 
    13981420        // collapse siblings belonging to the same view cell 
     1421        mVspKdTree->RefineViewCells(rays); 
     1422 
     1423                // collapse siblings belonging to the same view cell 
    13991424        mVspKdTree->CollapseTree(); 
    1400  
    1401         // collapse siblings belonging to the same view cell 
    1402         mVspKdTree->RefineViewCells(rays); 
    14031425 
    14041426        // evaluale view cell stats 
     
    14101432        // recast rest of rays 
    14111433        ComputeSampleContributions(savedRays); 
    1412          
    1413         Debug << "Computed remaining ray contribution in " << TimeDiff(startTime, GetTime()) * 1e-3  
     1434 
     1435        Debug << "Computed remaining ray contribution in " << TimeDiff(startTime, GetTime()) * 1e-3 
    14141436                  << " secs" << endl; 
    14151437 
     
    14281450} 
    14291451 
    1430 int VspKdViewCellsManager::PostProcess(const ObjectContainer &objects,  
     1452int VspKdViewCellsManager::PostProcess(const ObjectContainer &objects, 
    14311453                                                                           const VssRayContainer &rays) 
    14321454{ 
     
    14541476 
    14551477        //-- export leaf building blocks 
    1456         Exporter *exporter = Exporter::GetExporter("vspkdtree.x3d");  
     1478        Exporter *exporter = Exporter::GetExporter("vspkdtree.x3d"); 
    14571479        if (!exporter) 
    14581480                return; 
     
    14621484        exporter->ExportVspKdTree(*mVspKdTree); 
    14631485 
    1464         if (mExportGeometry)  
     1486        if (mExportGeometry) 
    14651487                exporter->ExportGeometry(objects); 
    14661488 
    1467         if (mExportRays)  
    1468         { 
    1469                 const float prob = (float)mVisualizationSamples  
     1489        if (mExportRays) 
     1490        { 
     1491                const float prob = (float)mVisualizationSamples 
    14701492                        / ((float)sampleRays.size() + Limits::Small); 
    14711493 
     
    14911513        if (!ViewCellsConstructed()) 
    14921514                return; 
    1493          
     1515 
    14941516        //-- export single view cells 
    14951517        for (int i = 0; i < 10; ++ i) 
     
    14981520                sprintf(s, "vsp_viewcell%04d.x3d", i); 
    14991521                Exporter *exporter = Exporter::GetExporter(s); 
    1500                 const int idx =  
     1522                const int idx = 
    15011523                        (int)RandomValue(0.0, (Real)((int)mViewCells.size() - 1)); 
    15021524 
    1503                 VspKdViewCell *vc = dynamic_cast<VspKdViewCell *>(mViewCells[idx]);  
     1525                VspKdViewCell *vc = dynamic_cast<VspKdViewCell *>(mViewCells[idx]); 
    15041526 
    15051527                cout << "Output view cell " << i << " with pvs size " << vc->GetPvs().GetSize() << endl; 
     
    15081530                Material m; 
    15091531                m.mDiffuseColor = RgbColor(0, 1, 1); 
    1510                                  
     1532 
    15111533                exporter->SetForcedMaterial(m); 
    15121534                exporter->SetWireframe(); 
     
    15171539                if (mExportRays) 
    15181540                { 
    1519                         vector<VspKdLeaf *>::const_iterator it,  
     1541                        vector<VspKdLeaf *>::const_iterator it, 
    15201542                                it_end = vc->mLeaves.end(); 
    15211543 
     
    15401562                                                if ((*it)->mTerminationObject == NULL) 
    15411563                                                        castRays.push_back(*it); 
    1542                                                 else  
     1564                                                else 
    15431565                                                        initRays.push_back(*it); 
    15441566                                } 
     
    15601582                exporter->SetFilled(); 
    15611583 
    1562                 for (it = vc->GetPvs().mEntries.begin(); it != it_end; ++ it)  
     1584                for (it = vc->GetPvs().mEntries.begin(); it != it_end; ++ it) 
    15631585                { 
    15641586                        Intersectable *intersect = (*it).first; 
     
    15711593                                exporter->ExportIntersectable(intersect); 
    15721594                                intersect->Mail(); 
    1573                         }                        
     1595                        } 
    15741596                } 
    15751597 
     
    15781600 
    15791601        //-- export final view cells 
    1580         Exporter *exporter = Exporter::GetExporter("vspkdtree_merged.x3d");  
    1581          
     1602        Exporter *exporter = Exporter::GetExporter("vspkdtree_merged.x3d"); 
     1603 
    15821604        //if (exportGeometry) exporter->SetWireframe(); 
    15831605        //else exporter->SetFilled(); 
     
    15851607        ExportViewCells(exporter); 
    15861608 
    1587         if (mExportGeometry)  
     1609        if (mExportGeometry) 
    15881610        { 
    15891611                exporter->SetFilled(); 
     
    15911613        } 
    15921614 
    1593         if (mExportRays)  
    1594         { 
    1595                 const float prob = (float)mVisualizationSamples  
     1615        if (mExportRays) 
     1616        { 
     1617                const float prob = (float)mVisualizationSamples 
    15961618                        / ((float)sampleRays.size() + Limits::Small); 
    1597                  
     1619 
    15981620                exporter->SetWireframe(); 
    1599                          
     1621 
    16001622                VssRayContainer rays; 
    1601                  
     1623 
    16021624                for (int i = 0; i < sampleRays.size(); ++ i) 
    16031625                { 
     
    16051627                        rays.push_back(sampleRays[i]); 
    16061628                } 
    1607                 exporter->ExportRays(rays, RgbColor(1, 0, 0));   
     1629                exporter->ExportRays(rays, RgbColor(1, 0, 0)); 
    16081630        } 
    16091631 
     
    16301652        if (mColorCode == 0) // Random color 
    16311653                return; 
    1632          
     1654 
    16331655        float importance = 0; 
    16341656 
     
    16371659        case 1: // pvs 
    16381660                { 
    1639                         importance = (float)vc->GetPvs().GetSize() /  
     1661                        importance = (float)vc->GetPvs().GetSize() / 
    16401662                                (float)mViewCellsStats.maxPvs; 
    16411663                } 
     
    16451667            VspKdViewCell *vspKdVc = dynamic_cast<VspKdViewCell *>(vc); 
    16461668 
    1647                         importance = (float)vspKdVc->mLeaves.size() /  
     1669                        importance = (float)vspKdVc->mLeaves.size() / 
    16481670                                (float)mViewCellsStats.maxLeaves; 
    16491671                } 
     
    16511673        case 3: // merged tree depth difference 
    16521674                { 
    1653                         //importance = (float)GetMaxTreeDiff(vc) /  
     1675                        //importance = (float)GetMaxTreeDiff(vc) / 
    16541676                        //      (float)(mVspBspTree->GetStatistics().maxDepth * 2); 
    16551677                } 
     
    16681690 
    16691691 
    1670 void VspKdViewCellsManager::ExportVcGeometry(Exporter *exporter,  
     1692void VspKdViewCellsManager::ExportVcGeometry(Exporter *exporter, 
    16711693                                                                                   ViewCell *vc) const 
    16721694{ 
     
    16841706 
    16851707 
    1686 /************************************************************************/ 
    1687 /*                 VspBspViewCellsManager implementation                */ 
    1688 /************************************************************************/ 
    1689  
    1690  
    1691 VspBspViewCellsManager::VspBspViewCellsManager(VspBspTree *vspBspTree,  
     1708void VspKdViewCellsManager::CreateMesh(ViewCell *vc) 
     1709{ 
     1710} 
     1711 
     1712/**************************************************************************/ 
     1713/*                   VspBspViewCellsManager implementation                */ 
     1714/**************************************************************************/ 
     1715 
     1716 
     1717VspBspViewCellsManager::VspBspViewCellsManager(VspBspTree *vspBspTree, 
    16921718                                                                                           int constructionSamples): 
    1693 ViewCellsManager(constructionSamples),  
     1719ViewCellsManager(constructionSamples), 
    16941720mVspBspTree(vspBspTree) 
    16951721{ 
     
    17191745 
    17201746 
    1721 float VspBspViewCellsManager::GetRendercost(ViewCell *viewCell,  
     1747float VspBspViewCellsManager::GetRendercost(ViewCell *viewCell, 
    17221748                                                                                        float objRendercost) const 
    17231749{ 
     
    17431769} 
    17441770 
    1745 int VspBspViewCellsManager::Construct(const ObjectContainer &objects,  
     1771int VspBspViewCellsManager::Construct(const ObjectContainer &objects, 
    17461772                                                                          const VssRayContainer &rays) 
    17471773{ 
    1748   // if view cells were already constructed 
    1749   if (ViewCellsConstructed()) 
    1750         return 0; 
    1751    
    1752   Debug << "Constructing bsp view cells" << endl; 
    1753    
    1754   int sampleContributions = 0; 
    1755    
    1756   VssRayContainer sampleRays; 
    1757    
    1758   int limit = min (mConstructionSamples, (int)rays.size()); 
    1759  
    1760          
     1774        // if view cells were already constructed 
     1775        if (ViewCellsConstructed()) 
     1776                return 0; 
     1777 
     1778        Debug << "Constructing bsp view cells" << endl; 
     1779 
     1780        int sampleContributions = 0; 
     1781 
     1782        VssRayContainer sampleRays; 
     1783 
     1784        int limit = min (mConstructionSamples, (int)rays.size()); 
     1785 
    17611786        VssRayContainer constructionRays; 
    17621787        VssRayContainer savedRays; 
     
    17681793 
    17691794        mVspBspTree->Construct(constructionRays, &mSceneBox); 
    1770          
     1795 
    17711796        Debug << mVspBspTree->GetStatistics() << endl; 
    17721797 
     
    17741799        cout << "collapsing invalid tree regions ... "; 
    17751800        long startTime = GetTime(); 
    1776         int collapsedLeaves = mVspBspTree->CollapseTree();  
     1801        int collapsedLeaves = mVspBspTree->CollapseTree(); 
    17771802        Debug << "collapsed in " << TimeDiff(startTime, GetTime()) * 1e-3 << " seconds" << endl; 
    17781803    cout << "finished" << endl; 
    1779          
     1804 
    17801805        cout << "reseting view cell stats ... "; 
    17811806        ResetViewCells(); 
    17821807        cout << "finished" << endl; 
    1783          
     1808 
    17841809        Debug << "\nView cells after construction:\n" << mViewCellsStats << endl; 
    17851810 
     
    17881813                cout << "exporting initial view cells (=leaves) ... "; 
    17891814                Exporter *exporter = Exporter::GetExporter("view_cells.x3d"); 
    1790          
     1815 
    17911816                if (exporter) 
    17921817                { 
     
    17971822                        if (0 && mExportRays) 
    17981823                                exporter->ExportRays(rays, RgbColor(1, 1, 1)); 
    1799                          
     1824 
    18001825                        if (mExportGeometry) 
    18011826                                exporter->ExportGeometry(objects); 
    1802                          
     1827 
    18031828                        delete exporter; 
    18041829                } 
     
    18071832 
    18081833        startTime = GetTime(); 
     1834 
     1835        //-- merge the individual view cells: Should be done here because it makes 
     1836        MergeViewCells(rays, objects); 
     1837        //-- refines the merged view cells 
     1838        RefineViewCells(rays); 
     1839        // collapse sibling leaves that share the same view cell 
     1840        mVspBspTree->CollapseTree(); 
     1841 
     1842        // reset view cells and stats 
     1843        ResetViewCells(); 
     1844 
    18091845        cout << "Computing remaining ray contributions ... "; 
    18101846        // recast rest of rays 
     
    18121848        cout << "finished" << endl; 
    18131849 
    1814         Debug << "Computed remaining ray contribution in " << TimeDiff(startTime, GetTime()) * 1e-3  
     1850        Debug << "Computed remaining ray contribution in " << TimeDiff(startTime, GetTime()) * 1e-3 
    18151851                  << " secs" << endl; 
    18161852 
    18171853        cout << "construction finished" << endl; 
     1854 
    18181855        return sampleContributions; 
    18191856} 
    18201857 
    18211858 
    1822 // matt TODO: remove 
    1823 int VspBspViewCellsManager::MergeViewCells(const VssRayContainer &rays) const 
    1824 { 
    1825         vector<BspIntersection>::const_iterator iit; 
    1826         vector<BspRay *>bspRays; 
    1827         int merged = 0; 
    1828  
    1829         mVspBspTree->ConstructBspRays(bspRays, rays); 
    1830  
    1831         for (int i = 0; i < (int)bspRays.size(); ++ i) 
    1832         { 
    1833                 BspRay *ray = bspRays[i]; 
    1834            
    1835                 // traverse leaves stored in the rays and compare and merge consecutive 
    1836                 // leaves (i.e., the neighbors in the tree) 
    1837                 if (ray->intersections.size() < 2) 
    1838                         continue; 
    1839            
    1840                 iit = ray->intersections.begin(); 
    1841  
    1842                 BspLeaf *previousLeaf = (*iit).mLeaf; 
    1843                 ++ iit; 
    1844                  
    1845                 for (; iit != ray->intersections.end(); ++ iit) 
    1846                 { 
    1847                         BspLeaf *leaf = (*iit).mLeaf; 
    1848  
    1849                         if (ShouldMerge(leaf, previousLeaf)) 
    1850                         {                        
    1851                                 mVspBspTree->MergeViewCells(leaf, previousLeaf); 
    1852                                 ++ merged; 
    1853                         } 
    1854                         previousLeaf = leaf; 
    1855                 } 
    1856         } 
    1857         CLEAR_CONTAINER(bspRays); 
    1858  
    1859         return merged; 
    1860 } 
    1861          
    1862  
    1863 int VspBspViewCellsManager::PostProcess(const ObjectContainer &objects,  
    1864                                                                                 const VssRayContainer &rays) 
    1865 { 
    1866         if (!ViewCellsConstructed()) 
    1867         { 
    1868                 Debug << "view cells not constructed" << endl; 
    1869                 return 0; 
    1870         } 
    1871  
     1859void VspBspViewCellsManager::MergeViewCells(const VssRayContainer &rays, 
     1860                                                                                        const ObjectContainer &objects) 
     1861{ 
    18721862        //-- post processing of bsp view cells 
    18731863    int vcSize = 0; 
     
    18881878        //-- merge or subdivide view cells 
    18891879        int merged = 0; 
    1890          
     1880 
    18911881        cout << "starting merge using " << mPostProcessSamples << " samples ... "; 
    18921882        long startTime = GetTime(); 
    18931883 
     1884        // TODO: should be done BEFORE the ray casting 
    18941885        merged = mVspBspTree->MergeViewCells(postProcessRays); 
    18951886 
     
    19011892        Debug << "Postprocessing: Merged " << merged << " view cells in " 
    19021893                  << TimeDiff(startTime, GetTime()) *1e-3 << " secs" << endl << endl; 
    1903          
     1894 
    19041895        cout << "reseting view cell stats ... "; 
    19051896        ResetViewCells(); 
     
    19341925                cout << "finished" << endl; 
    19351926        } 
    1936  
     1927} 
     1928 
     1929 
     1930void VspBspViewCellsManager::RefineViewCells(const VssRayContainer &rays) 
     1931{ 
    19371932        Debug << "render time before refine:" << endl; 
    19381933        mRenderer->RenderScene(); 
     1934        SimulationStatistics ss; 
    19391935        dynamic_cast<RenderSimulator *>(mRenderer)->GetStatistics(ss); 
    19401936    Debug << ss << endl; 
    19411937 
    19421938        cout << "Refining the merged view cells ... "; 
    1943         startTime = GetTime(); 
     1939        long startTime = GetTime(); 
    19441940 
    19451941        // refining the merged view cells 
     
    19531949        Debug << "Postprocessing: refined " << refined << " view cells in " 
    19541950                  << TimeDiff(startTime, GetTime()) *1e-3 << " secs" << endl << endl; 
    1955          
    1956         // collapse sibling leaves that share the same view cell 
    1957         mVspBspTree->CollapseTree(); 
    1958  
    1959         // reset view cells and stats 
    1960         ResetViewCells(); 
    1961  
    1962         return merged; 
     1951} 
     1952 
     1953int VspBspViewCellsManager::PostProcess(const ObjectContainer &objects, 
     1954                                                                                const VssRayContainer &rays) 
     1955{ 
     1956        if (!ViewCellsConstructed()) 
     1957        { 
     1958                Debug << "view cells not constructed" << endl; 
     1959                return 0; 
     1960        } 
     1961 
     1962        CreateViewCellsMeshes(); 
     1963 
     1964        return 0; 
    19631965} 
    19641966 
     
    19931995bool VspBspViewCellsManager::ViewPointValid(const Vector3 &viewPoint) const 
    19941996{ 
    1995         return mSceneBox.IsInside(viewPoint) &&  
     1997        return mSceneBox.IsInside(viewPoint) && 
    19961998                   mVspBspTree->ViewPointValid(viewPoint); 
    19971999} 
     
    20262028                        delete exporter; 
    20272029                } 
    2028                  
     2030 
    20292031                cout << "finished" << endl; 
    2030         }        
     2032        } 
    20312033 
    20322034        //-- visualization of the BSP splits 
    20332035        bool exportSplits = false; 
    20342036        environment->GetBoolValue("VspBspTree.Visualization.exportSplits", exportSplits); 
    2035          
     2037 
    20362038        if (exportSplits) 
    20372039        { 
     
    20442046        ExportBspPvs(objects, visRays); 
    20452047} 
    2046          
     2048 
    20472049 
    20482050void VspBspViewCellsManager::ExportSplits(const ObjectContainer &objects, 
     
    20512053        Exporter *exporter = Exporter::GetExporter("bsp_splits.x3d"); 
    20522054 
    2053         if (exporter)  
    2054         {        
    2055                 Material m;  
     2055        if (exporter) 
     2056        { 
     2057                Material m; 
    20562058                m.mDiffuseColor = RgbColor(1, 0, 0); 
    20572059                exporter->SetForcedMaterial(m); 
    20582060                exporter->SetWireframe(); 
    2059                  
     2061 
    20602062                exporter->ExportBspSplits(*mVspBspTree, true); 
    20612063 
     
    20662068 
    20672069                exporter->ResetForcedMaterial(); 
    2068                  
     2070 
    20692071                // export rays 
    20702072                if (mExportRays) 
    20712073                        exporter->ExportRays(rays, RgbColor(1, 1, 0)); 
    2072          
     2074 
    20732075                if (mExportGeometry) 
    20742076                        exporter->ExportGeometry(objects); 
     
    20782080} 
    20792081 
     2082 
    20802083void VspBspViewCellsManager::ExportBspPvs(const ObjectContainer &objects, 
    20812084                                                                                  const VssRayContainer &rays) 
    20822085{ 
    20832086        const int leafOut = 10; 
    2084          
     2087 
    20852088        ViewCell::NewMail(); 
    2086          
     2089 
    20872090        cout << "visualization using " << mVisualizationSamples << " samples" << endl; 
    20882091        Debug << "\nOutput view cells: " << endl; 
    2089          
     2092 
    20902093        // sort view cells to visualize the largest view cells 
    20912094#if 0 
    20922095        stable_sort(mViewCells.begin(), mViewCells.end(), vc_gt); 
    20932096#endif 
    2094         int limit = min(leafOut, (int)mViewCells.size());  
     2097        int limit = min(leafOut, (int)mViewCells.size()); 
    20952098 
    20962099#if 1 
     
    21052108        { 
    21062109                cout << "creating output for view cell " << i << " ... "; 
    2107                  
     2110 
    21082111                VssRayContainer vcRays; 
    21092112                Intersectable::NewMail(); 
     
    21172120#if 1 
    21182121                // check whether we can add the current ray to the output rays 
    2119                 for (int k = 0; k < raysOut; ++ k)  
     2122                for (int k = 0; k < raysOut; ++ k) 
    21202123                { 
    21212124                        BspRay *ray = bspRays[k]; 
     
    21232126                        { 
    21242127                                BspLeaf *leaf = ray->intersections[j].mLeaf; 
    2125                                 if (vc == leaf->GetViewCell())  
     2128                                if (vc == leaf->GetViewCell()) 
    21262129                                        vcRays.push_back(ray->vssRay); 
    21272130                        } 
     
    21372140                exporter->SetForcedMaterial(m); 
    21382141 
    2139                 ExportVcGeometry(exporter, vc);  
    2140                          
    2141                                  
    2142                 Debug << i << ": pvs size=" << (int)vc->GetPvs().GetSize()  
     2142                ExportVcGeometry(exporter, vc); 
     2143 
     2144 
     2145                Debug << i << ": pvs size=" << (int)vc->GetPvs().GetSize() 
    21432146                          << ", piercing rays=" << (int)vcRays.size() 
    21442147                          << ", leaves=" << (int)vc->mLeaves.size() << endl; 
    2145                  
     2148 
    21462149                //-- export rays piercing this view cell 
    21472150#if 1 
     
    21632166 
    21642167                // output PVS of view cell 
    2165                 for (it = vc->GetPvs().mEntries.begin(); it != it_end; ++ it)  
     2168                for (it = vc->GetPvs().mEntries.begin(); it != it_end; ++ it) 
    21662169                { 
    21672170                        Intersectable *intersect = (*it).first; 
     
    21742177                                exporter->ExportIntersectable(intersect); 
    21752178                                intersect->Mail(); 
    2176                         }                        
    2177                 } 
    2178                                  
     2179                        } 
     2180                } 
     2181 
    21792182                DEL_PTR(exporter); 
    21802183                cout << "finished" << endl; 
     
    21882191 
    21892192 
    2190 bool VspBspViewCellsManager::ShouldMerge(BspLeaf *front, BspLeaf *back) const 
    2191 { 
    2192         ViewCell *fvc = front->GetViewCell(); 
    2193         ViewCell *bvc = back->GetViewCell(); 
    2194  
    2195         if (fvc == bvc) 
    2196                 return false; 
    2197  
    2198         const int fdiff = fvc->GetPvs().Diff(bvc->GetPvs()); 
    2199  
    2200         if (fvc->GetPvs().GetSize() + fdiff < mMaxPvs) 
    2201         { 
    2202                 if ((fvc->GetPvs().GetSize() < mMinPvs) ||       
    2203                         (bvc->GetPvs().GetSize() < mMinPvs) || 
    2204                         ((fdiff < mMinPvsDif) &&  
    2205                          (bvc->GetPvs().Diff(fvc->GetPvs()) < mMinPvsDif))) 
    2206                 { 
    2207                         return true; 
    2208                 } 
    2209         } 
    2210          
    2211         return false; 
    2212 } 
    2213  
    2214  
    22152193int VspBspViewCellsManager::CastLineSegment(const Vector3 &origin, 
    22162194                                                                                        const Vector3 &termination, 
     
    22212199 
    22222200 
    2223 void VspBspViewCellsManager::ExportColor(Exporter *exporter,  
     2201void VspBspViewCellsManager::ExportColor(Exporter *exporter, 
    22242202                                                                                 ViewCell *vc) const 
    22252203{ 
    22262204        if (mColorCode == 0) // Random color 
    22272205                return; 
    2228          
     2206 
    22292207        float importance = 0; 
    22302208 
     
    22332211        case 1: // pvs 
    22342212                { 
    2235                         importance = (float)vc->GetPvs().GetSize() /  
     2213                        importance = (float)vc->GetPvs().GetSize() / 
    22362214                                (float)mViewCellsStats.maxPvs; 
    22372215                } 
     
    22412219            BspViewCell *bspVc = dynamic_cast<BspViewCell *>(vc); 
    22422220 
    2243                         importance = (float)bspVc->mLeaves.size() /  
     2221                        importance = (float)bspVc->mLeaves.size() / 
    22442222                                (float)mViewCellsStats.maxLeaves; 
    22452223                } 
     
    22472225        case 3: // merge tree differene 
    22482226                { 
    2249                         importance = (float)GetMaxTreeDiff(vc) /  
     2227                        importance = (float)GetMaxTreeDiff(vc) / 
    22502228                                (float)(mVspBspTree->GetStatistics().maxDepth * 2); 
    22512229                } 
     
    22642242 
    22652243 
    2266 void VspBspViewCellsManager::ExportVcGeometry(Exporter *exporter,  
     2244void VspBspViewCellsManager::ExportVcGeometry(Exporter *exporter, 
    22672245                                                                                          ViewCell *vc) const 
    22682246{ 
    22692247#if 1 
     2248    if (vc->GetMesh()) 
     2249        { 
     2250                exporter->ExportMesh(vc->GetMesh()); 
     2251                return; 
     2252        } 
     2253 
    22702254        BspNodeGeometry geom; 
    22712255        mVspBspTree-> 
    2272                 ConstructGeometry(dynamic_cast<BspViewCell *>(vc), geom.mPolys); 
     2256                ConstructGeometry(dynamic_cast<BspViewCell *>(vc), geom); 
    22732257        exporter->ExportPolygons(geom.mPolys); 
    22742258#else 
    2275          
     2259 
    22762260        Material m2; 
    22772261        m2.mDiffuseColor.b = 0.3f + Random(0.7f); 
     
    23242308 
    23252309 
    2326  
    2327  
    2328 ViewCell * 
    2329 VspBspViewCellsManager::GetViewCell(const Vector3 &point) 
     2310ViewCell *VspBspViewCellsManager::GetViewCell(const Vector3 &point) 
    23302311{ 
    23312312  if (!mVspBspTree) 
     
    23332314  return mVspBspTree->GetViewCell(point); 
    23342315} 
     2316 
     2317 
     2318void VspBspViewCellsManager::CreateMesh(ViewCell *vc) 
     2319{ 
     2320        BspNodeGeometry geom; 
     2321        BspViewCell *bspVc = dynamic_cast<BspViewCell *>(vc); 
     2322        mVspBspTree->ConstructGeometry(bspVc, geom); 
     2323 
     2324        Mesh *mesh = new Mesh(); 
     2325        geom.AddToMesh(*mesh); 
     2326        vc->SetMesh(mesh); 
     2327        mMeshContainer.push_back(mesh); 
     2328} 
Note: See TracChangeset for help on using the changeset viewer.