Ignore:
Timestamp:
08/15/05 20:50:00 (19 years ago)
Author:
mattausch
Message:

bsp viewcell stuff
fixed some bugs
left debug messages
added heuristics
added bsp options

File:
1 edited

Legend:

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

    r237 r238  
    11#include "Polygon3.h" 
    22#include "Mesh.h" 
     3 
     4#define SIDE_TOLERANCE 0.002 
    35 
    46Polygon3::Polygon3() 
     
    2123} 
    2224 
    23 Plane3 Polygon3::GetSupportingPlane() 
     25Plane3 Polygon3::GetSupportingPlane() const 
    2426{ 
     27        Debug << "creating plane using vertices: " << mVertices[0] << mVertices[1] << mVertices[2] << endl; 
     28        Vector3 v1 = mVertices[0] - mVertices[1]; 
     29                Vector3 v2 = mVertices[2] - mVertices[1]; 
     30        Debug << "plane has vectors " <<  v1 << v2  << endl; 
    2531        return Plane3(mVertices[0], mVertices[1], mVertices[2]); 
    2632} 
    2733 
    28 void Polygon3::DeletePolygons(PolygonQueue *polys) 
     34void Polygon3::DeletePolygons(PolygonContainer *polys) 
    2935{ 
    30         // don't need to store polygon information = delete polygons 
     36        // don't need to store polygon information => delete polygons 
    3137        while(!polys->empty()) 
    3238        { 
    33                 Polygon3 *poly = polys->front(); 
    34                 polys->pop(); 
     39                Polygon3 *poly = polys->back(); 
     40                polys->pop_back(); 
    3541                DEL_PTR(poly); 
    3642        } 
     
    4248        Vector3 ptA = mVertices[mVertices.size() - 1]; 
    4349         
    44         int sideA = partition->Side(ptA); 
     50        int sideA = partition->Side(ptA, SIDE_TOLERANCE); 
    4551         
    4652        VertexContainer::const_iterator it; 
     53 
     54        Debug << "\n\nvertex A: " << ptA << ", side A: " << sideA << " (" << partition->Distance(ptA) << ")"; 
    4755 
    4856        // find line - plane intersections 
     
    5058        { 
    5159                Vector3 ptB = (*it); 
    52                 int sideB = partition->Side(ptB); 
     60                int sideB = partition->Side(ptB, SIDE_TOLERANCE); 
     61                Debug << " <=> vertex B: " << ptB << ", side B: " << sideB << " (" << partition->Distance(ptB) << ")\n\n"; 
    5362 
    5463                // vertices on different sides => split 
     
    6271                                // add vertex to both polygons 
    6372                                front->mVertices.push_back(splitPt); 
    64                                 back->mVertices.push_back(splitPt); 
     73                                back->mVertices.push_back(splitPt); Debug << "front and back polygon + " << splitPt << endl; 
    6574                         
    6675                                ++ splits; 
    6776                        } 
    68                         front->mVertices.push_back(ptB); 
     77                        front->mVertices.push_back(ptB); Debug << "front polygon + " << ptB << endl; 
    6978                } 
    7079                else if (sideB < 0) 
     
    7786                                // add vertex to both polygons 
    7887                                front->mVertices.push_back(splitPt); 
    79                                 back->mVertices.push_back(splitPt); 
     88                                back->mVertices.push_back(splitPt); Debug << "front and back polygon + " << splitPt << endl; 
    8089 
    8190                                ++ splits; 
    8291                        } 
    83                         back->mVertices.push_back(ptB); 
     92                        back->mVertices.push_back(ptB); Debug << "back polygon + " << ptB << endl; 
    8493                } 
    8594                else 
     
    8796                        // vertex on plane => add vertex to both polygons 
    8897                        front->mVertices.push_back(ptB); 
    89                         back->mVertices.push_back(ptB); 
     98                        back->mVertices.push_back(ptB); Debug << "front and back polygon + " << ptB << endl; 
    9099                } 
    91100         
    92101                ptA = ptB; 
    93102                sideA = sideB; 
     103                Debug << "vertex A: " << ptA << ", side A: " << sideA << " (" << partition->Distance(ptA) << ")"; 
    94104        } 
     105        Debug << "\n*********************\n"; 
    95106} 
    96107 
    97 int Polygon3::Side(Plane3 *plane) 
     108int Polygon3::Side(const Plane3 &plane) const 
     109{ 
     110        int classification = ClassifyPlane(plane); 
     111         
     112        if (classification == BACK_SIDE) 
     113                return -1; 
     114        else if (classification == FRONT_SIDE) 
     115                return 1; 
     116 
     117        return 0; 
     118} 
     119 
     120int Polygon3::ClassifyPlane(const Plane3 &plane) const 
    98121{ 
    99122        VertexContainer::const_iterator it; 
     
    102125        bool onBackSide = false; 
    103126 
    104         // find line - plane intersections 
     127        // find possible line-plane intersections 
    105128        for (it = mVertices.begin(); it != mVertices.end(); ++ it) 
    106129        { 
    107                 int side = plane->Side(*it); 
     130                int side = plane.Side(*it, SIDE_TOLERANCE); 
    108131                 
    109132                if (side > 0) 
     
    116139                } 
    117140 
    118                 if (onFrontSide && onBackSide) // split 
     141                if (onFrontSide && onBackSide) // split //TODO: check if through vvertex 
    119142                { 
    120143                        return SPLIT; 
     
    131154        } 
    132155 
     156        // plane and polygon are coincident 
    133157        return COINCIDENT; 
    134158} 
Note: See TracChangeset for help on using the changeset viewer.