Пример #1
0
bool CoverageRegion::mergeItemsInArray(OctreeProjectedPolygon* seed, bool seedInArray) {
    for (int i = 0; i < _polygonCount; i++) {
        OctreeProjectedPolygon* otherPolygon = _polygons[i];
        if (otherPolygon->canMerge(*seed)) {
            otherPolygon->merge(*seed);

            if (seedInArray) {
                int* IGNORED_ADDRESS = NULL;
                // remove this otherOtherPolygon for our polygon array
                _polygonCount = removeFromSortedArrays((void*)seed,
                                                       (void**)_polygons, _polygonDistances, IGNORED_ADDRESS,
                                                       _polygonCount, _polygonArraySize);
                _totalPolygons--;
            }
        
            // clean up
            if (_managePolygons) {
                delete seed;
            }
            
            // Now run again using our newly merged polygon as the seed
            mergeItemsInArray(otherPolygon, true);
            
            return true;
        }
    }
    return false;
}
Пример #2
0
// just handles storage in the array, doesn't test for occlusion or
// determining if this is the correct map to store in!
void CoverageRegion::storeInArray(OctreeProjectedPolygon* polygon) {

    _currentCoveredBounds.explandToInclude(polygon->getBoundingBox());
    
    
    // Before we actually store this polygon in the array, check to see if this polygon can be merged to any of the existing
    // polygons already in our array.
    if (mergeItemsInArray(polygon, false)) {
        return; // exit early
    }
    
    // only after we attempt to merge!
    _totalPolygons++;

    if (_polygonArraySize < _polygonCount + 1) {
        growPolygonArray();
    }

    // As an experiment we're going to see if we get an improvement by storing the polygons in coverage area sorted order
    // this means the bigger polygons are earlier in the array. We should have a higher probability of being occluded earlier
    // in the list. We still check to see if the polygon is "in front" of the target polygon before we test occlusion. Since
    // sometimes things come out of order.
    const bool SORT_BY_SIZE = false;
    const int  IGNORED = 0;
    int* IGNORED_ADDRESS = NULL;
    if (SORT_BY_SIZE) {
        // This old code assumes that polygons will always be added in z-buffer order, but that doesn't seem to
        // be a good assumption. So instead, we will need to sort this by distance. Use a binary search to find the
        // insertion point in this array, and shift the array accordingly
        float area = polygon->getBoundingBox().area();
        float reverseArea = 4.0f - area;
        //qDebug("store by size area=%f reverse area=%f\n", area, reverseArea);
        _polygonCount = insertIntoSortedArrays((void*)polygon, reverseArea, IGNORED,
                                               (void**)_polygons, _polygonSizes, IGNORED_ADDRESS,
                                               _polygonCount, _polygonArraySize);
    } else {
        _polygonCount = insertIntoSortedArrays((void*)polygon, polygon->getDistance(), IGNORED,
                                               (void**)_polygons, _polygonDistances, IGNORED_ADDRESS,
                                               _polygonCount, _polygonArraySize);
    }
                                           
    // Debugging and Optimization Tuning code.
    if (_polygonCount > _maxPolygonsUsed) {
        _maxPolygonsUsed = _polygonCount;
        //qDebug("CoverageRegion new _maxPolygonsUsed reached=%d region=%s\n",_maxPolygonsUsed, getRegionName());
        //_myBoundingBox.printDebugDetails("map._myBoundingBox");
    } else {
        //qDebug("CoverageRegion::storeInArray() _polygonCount=%d region=%s\n",_polygonCount, getRegionName());
    }
}