mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-04 08:33:12 +02:00
added support for clipping polygons to screen bounds, not yet enabled since it doesn't help performance, will use in future
This commit is contained in:
parent
758fadd6a9
commit
4590bdc69d
8 changed files with 295 additions and 44 deletions
|
@ -1283,7 +1283,8 @@ void VoxelSystem::falseColorizeOccluded() {
|
|||
|
||||
_tree->recurseTreeWithOperationDistanceSorted(falseColorizeOccludedOperation, position, (void*)&args);
|
||||
|
||||
printLog("falseColorizeOccluded()\n total=%ld\n colored=%ld\n occluded=%ld\n notOccluded=%ld\n outOfView=%ld\n subtreeVoxelsSkipped=%ld\n stagedForDeletion=%ld\n nonLeaves=%ld\n nonLeavesOutOfView=%ld\n nonLeavesOccluded=%ld\n",
|
||||
printLog("falseColorizeOccluded()\n position=(%f,%f)\n total=%ld\n colored=%ld\n occluded=%ld\n notOccluded=%ld\n outOfView=%ld\n subtreeVoxelsSkipped=%ld\n stagedForDeletion=%ld\n nonLeaves=%ld\n nonLeavesOutOfView=%ld\n nonLeavesOccluded=%ld\n",
|
||||
position.x, position.y,
|
||||
args.totalVoxels, args.coloredVoxels, args.occludedVoxels,
|
||||
args.notOccludedVoxels, args.outOfView, args.subtreeVoxelsSkipped,
|
||||
args.stagedForDeletion,
|
||||
|
|
|
@ -16,7 +16,7 @@ int CoverageMap::_checkMapRootCalls = 0;
|
|||
int CoverageMap::_notAllInView = 0;
|
||||
bool CoverageMap::wantDebugging = false;
|
||||
|
||||
const BoundingBox CoverageMap::ROOT_BOUNDING_BOX = BoundingBox(glm::vec2(-2.f,-2.f), glm::vec2(4.f,4.f));
|
||||
const BoundingBox CoverageMap::ROOT_BOUNDING_BOX = BoundingBox(glm::vec2(-1.f,-1.f), glm::vec2(2.f,2.f));
|
||||
|
||||
// Coverage Map's polygon coordinates are from -1 to 1 in the following mapping to screen space.
|
||||
//
|
||||
|
@ -92,12 +92,15 @@ void CoverageMap::erase() {
|
|||
printLog("_regionSkips=%d\n",CoverageRegion::_regionSkips);
|
||||
printLog("_tooSmallSkips=%d\n",CoverageRegion::_tooSmallSkips);
|
||||
printLog("_outOfOrderPolygon=%d\n",CoverageRegion::_outOfOrderPolygon);
|
||||
printLog("_clippedPolygons=%d\n",CoverageRegion::_clippedPolygons);
|
||||
|
||||
CoverageRegion::_maxPolygonsUsed = 0;
|
||||
CoverageRegion::_totalPolygons = 0;
|
||||
CoverageRegion::_occlusionTests = 0;
|
||||
CoverageRegion::_regionSkips = 0;
|
||||
CoverageRegion::_tooSmallSkips = 0;
|
||||
CoverageRegion::_outOfOrderPolygon = 0;
|
||||
CoverageRegion::_clippedPolygons = 0;
|
||||
_mapCount = 0;
|
||||
_checkMapRootCalls = 0;
|
||||
_notAllInView = 0;
|
||||
|
@ -237,7 +240,7 @@ void CoverageRegion::init() {
|
|||
|
||||
void CoverageRegion::erase() {
|
||||
|
||||
/*
|
||||
/**/
|
||||
if (_polygonCount) {
|
||||
printLog("CoverageRegion::erase()...\n");
|
||||
printLog("_polygonCount=%d\n",_polygonCount);
|
||||
|
@ -247,7 +250,7 @@ void CoverageRegion::erase() {
|
|||
// _polygons[i]->getBoundingBox().printDebugDetails();
|
||||
//}
|
||||
}
|
||||
*/
|
||||
/**/
|
||||
// If we're in charge of managing the polygons, then clean them up first
|
||||
if (_managePolygons) {
|
||||
for (int i = 0; i < _polygonCount; i++) {
|
||||
|
@ -309,6 +312,7 @@ int CoverageRegion::_occlusionTests = 0;
|
|||
int CoverageRegion::_regionSkips = 0;
|
||||
int CoverageRegion::_tooSmallSkips = 0;
|
||||
int CoverageRegion::_outOfOrderPolygon = 0;
|
||||
int CoverageRegion::_clippedPolygons = 0;
|
||||
|
||||
// just handles storage in the array, doesn't test for occlusion or
|
||||
// determining if this is the correct map to store in!
|
||||
|
|
|
@ -34,6 +34,7 @@ public:
|
|||
static int _regionSkips;
|
||||
static int _tooSmallSkips;
|
||||
static int _outOfOrderPolygon;
|
||||
static int _clippedPolygons;
|
||||
|
||||
|
||||
const char* getRegionName() const;
|
||||
|
|
|
@ -5,6 +5,9 @@
|
|||
// Created by Andrzej Kapolka on 5/21/13.
|
||||
// Copyright (c) 2013 High Fidelity, Inc. All rights reserved.
|
||||
|
||||
#include <cstring>
|
||||
|
||||
#include <Log.h>
|
||||
#include <SharedUtil.h>
|
||||
|
||||
#include "GeometryUtil.h"
|
||||
|
@ -117,6 +120,7 @@ glm::vec3 addPenetrations(const glm::vec3& currentPenetration, const glm::vec3&
|
|||
}
|
||||
|
||||
// Do line segments (r1p1.x, r1p1.y)--(r1p2.x, r1p2.y) and (r2p1.x, r2p1.y)--(r2p2.x, r2p2.y) intersect?
|
||||
// from: http://ptspts.blogspot.com/2010/06/how-to-determine-if-two-line-segments.html
|
||||
bool doLineSegmentsIntersect(glm::vec2 r1p1, glm::vec2 r1p2, glm::vec2 r2p1, glm::vec2 r2p2) {
|
||||
int d1 = computeDirection(r2p1.x, r2p1.y, r2p2.x, r2p2.y, r1p1.x, r1p1.y);
|
||||
int d2 = computeDirection(r2p1.x, r2p1.y, r2p2.x, r2p2.y, r1p2.x, r1p2.y);
|
||||
|
@ -140,3 +144,193 @@ int computeDirection(float xi, float yi, float xj, float yj, float xk, float yk)
|
|||
float b = (xj - xi) * (yk - yi);
|
||||
return a < b ? -1 : a > b ? 1 : 0;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Polygon Clipping routines inspired by, pseudo code found here: http://www.cs.rit.edu/~icss571/clipTrans/PolyClipBack.html
|
||||
//
|
||||
// Coverage Map's polygon coordinates are from -1 to 1 in the following mapping to screen space.
|
||||
//
|
||||
// (0,0) (windowWidth, 0)
|
||||
// -1,1 1,1
|
||||
// +-----------------------+
|
||||
// | | |
|
||||
// | | |
|
||||
// | -1,0 | |
|
||||
// |-----------+-----------|
|
||||
// | 0,0 |
|
||||
// | | |
|
||||
// | | |
|
||||
// | | |
|
||||
// +-----------------------+
|
||||
// -1,-1 1,-1
|
||||
// (0,windowHeight) (windowWidth,windowHeight)
|
||||
//
|
||||
|
||||
const float PolygonClip::TOP_OF_CLIPPING_WINDOW = 1.0f;
|
||||
const float PolygonClip::BOTTOM_OF_CLIPPING_WINDOW = -1.0f;
|
||||
const float PolygonClip::LEFT_OF_CLIPPING_WINDOW = -1.0f;
|
||||
const float PolygonClip::RIGHT_OF_CLIPPING_WINDOW = 1.0f;
|
||||
|
||||
const glm::vec2 PolygonClip::TOP_LEFT_CLIPPING_WINDOW ( LEFT_OF_CLIPPING_WINDOW , TOP_OF_CLIPPING_WINDOW );
|
||||
const glm::vec2 PolygonClip::TOP_RIGHT_CLIPPING_WINDOW ( RIGHT_OF_CLIPPING_WINDOW, TOP_OF_CLIPPING_WINDOW );
|
||||
const glm::vec2 PolygonClip::BOTTOM_LEFT_CLIPPING_WINDOW ( LEFT_OF_CLIPPING_WINDOW , BOTTOM_OF_CLIPPING_WINDOW );
|
||||
const glm::vec2 PolygonClip::BOTTOM_RIGHT_CLIPPING_WINDOW ( RIGHT_OF_CLIPPING_WINDOW, BOTTOM_OF_CLIPPING_WINDOW );
|
||||
|
||||
void PolygonClip::clipToScreen(const glm::vec2* inputVertexArray, int inLength, glm::vec2*& outputVertexArray, int& outLength) {
|
||||
int tempLengthA = inLength;
|
||||
int tempLengthB;
|
||||
int maxLength = inLength * 2;
|
||||
glm::vec2* tempVertexArrayA = new glm::vec2[maxLength];
|
||||
glm::vec2* tempVertexArrayB = new glm::vec2[maxLength];
|
||||
|
||||
// set up our temporary arrays
|
||||
memcpy(tempVertexArrayA, inputVertexArray, sizeof(glm::vec2) * inLength);
|
||||
|
||||
// Left edge
|
||||
LineSegment2 edge;
|
||||
edge[0] = TOP_LEFT_CLIPPING_WINDOW;
|
||||
edge[1] = BOTTOM_LEFT_CLIPPING_WINDOW;
|
||||
// clip the array from tempVertexArrayA and copy end result to tempVertexArrayB
|
||||
sutherlandHodgmanPolygonClip(tempVertexArrayA, tempVertexArrayB, tempLengthA, tempLengthB, edge);
|
||||
// clean the array from tempVertexArrayA and copy cleaned result to tempVertexArrayA
|
||||
copyCleanArray(tempLengthA, tempVertexArrayA, tempLengthB, tempVertexArrayB);
|
||||
|
||||
// Bottom Edge
|
||||
edge[0] = BOTTOM_LEFT_CLIPPING_WINDOW;
|
||||
edge[1] = BOTTOM_RIGHT_CLIPPING_WINDOW;
|
||||
// clip the array from tempVertexArrayA and copy end result to tempVertexArrayB
|
||||
sutherlandHodgmanPolygonClip(tempVertexArrayA, tempVertexArrayB, tempLengthA, tempLengthB, edge);
|
||||
// clean the array from tempVertexArrayA and copy cleaned result to tempVertexArrayA
|
||||
copyCleanArray(tempLengthA, tempVertexArrayA, tempLengthB, tempVertexArrayB);
|
||||
|
||||
// Right Edge
|
||||
edge[0] = BOTTOM_RIGHT_CLIPPING_WINDOW;
|
||||
edge[1] = TOP_RIGHT_CLIPPING_WINDOW;
|
||||
// clip the array from tempVertexArrayA and copy end result to tempVertexArrayB
|
||||
sutherlandHodgmanPolygonClip(tempVertexArrayA, tempVertexArrayB, tempLengthA, tempLengthB, edge);
|
||||
// clean the array from tempVertexArrayA and copy cleaned result to tempVertexArrayA
|
||||
copyCleanArray(tempLengthA, tempVertexArrayA, tempLengthB, tempVertexArrayB);
|
||||
|
||||
// Top Edge
|
||||
edge[0] = TOP_RIGHT_CLIPPING_WINDOW;
|
||||
edge[1] = TOP_LEFT_CLIPPING_WINDOW;
|
||||
// clip the array from tempVertexArrayA and copy end result to tempVertexArrayB
|
||||
sutherlandHodgmanPolygonClip(tempVertexArrayA, tempVertexArrayB, tempLengthA, tempLengthB, edge);
|
||||
// clean the array from tempVertexArrayA and copy cleaned result to tempVertexArrayA
|
||||
copyCleanArray(tempLengthA, tempVertexArrayA, tempLengthB, tempVertexArrayB);
|
||||
|
||||
// copy final output to outputVertexArray
|
||||
outputVertexArray = tempVertexArrayA;
|
||||
outLength = tempLengthA;
|
||||
|
||||
// cleanup our unused temporary buffer...
|
||||
delete[] tempVertexArrayB;
|
||||
|
||||
// Note: we don't delete tempVertexArrayA, because that's the caller's responsibility
|
||||
}
|
||||
|
||||
void PolygonClip::sutherlandHodgmanPolygonClip(glm::vec2* inVertexArray, glm::vec2* outVertexArray,
|
||||
int inLength, int& outLength, const LineSegment2& clipBoundary) {
|
||||
glm::vec2 start, end; // Start, end point of current polygon edge
|
||||
glm::vec2 intersection; // Intersection point with a clip boundary
|
||||
|
||||
outLength = 0;
|
||||
start = inVertexArray[inLength - 1]; // Start with the last vertex in inVertexArray
|
||||
for (int j = 0; j < inLength; j++) {
|
||||
end = inVertexArray[j]; // Now start and end correspond to the vertices
|
||||
|
||||
// Cases 1 and 4 - the endpoint is inside the boundary
|
||||
if (pointInsideBoundary(end,clipBoundary)) {
|
||||
// Case 1 - Both inside
|
||||
if (pointInsideBoundary(start, clipBoundary)) {
|
||||
appendPoint(end, outLength, outVertexArray);
|
||||
} else { // Case 4 - end is inside, but start is outside
|
||||
segmentIntersectsBoundary(start, end, clipBoundary, intersection);
|
||||
appendPoint(intersection, outLength, outVertexArray);
|
||||
appendPoint(end, outLength, outVertexArray);
|
||||
}
|
||||
} else { // Cases 2 and 3 - end is outside
|
||||
if (pointInsideBoundary(start, clipBoundary)) {
|
||||
// Cases 2 - start is inside, end is outside
|
||||
segmentIntersectsBoundary(start, end, clipBoundary, intersection);
|
||||
appendPoint(intersection, outLength, outVertexArray);
|
||||
} else {
|
||||
// Case 3 - both are outside, No action
|
||||
}
|
||||
}
|
||||
start = end; // Advance to next pair of vertices
|
||||
}
|
||||
}
|
||||
|
||||
bool PolygonClip::pointInsideBoundary(const glm::vec2& testVertex, const LineSegment2& clipBoundary) {
|
||||
// bottom edge
|
||||
if (clipBoundary[1].x > clipBoundary[0].x) {
|
||||
if (testVertex.y >= clipBoundary[0].y) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
// top edge
|
||||
if (clipBoundary[1].x < clipBoundary[0].x) {
|
||||
if (testVertex.y <= clipBoundary[0].y) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
// right edge
|
||||
if (clipBoundary[1].y > clipBoundary[0].y) {
|
||||
if (testVertex.x <= clipBoundary[1].x) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
// left edge
|
||||
if (clipBoundary[1].y < clipBoundary[0].y) {
|
||||
if (testVertex.x >= clipBoundary[1].x) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void PolygonClip::segmentIntersectsBoundary(const glm::vec2& first, const glm::vec2& second,
|
||||
const LineSegment2& clipBoundary, glm::vec2& intersection) {
|
||||
// horizontal
|
||||
if (clipBoundary[0].y==clipBoundary[1].y) {
|
||||
intersection.y = clipBoundary[0].y;
|
||||
intersection.x = first.x + (clipBoundary[0].y - first.y) * (second.x - first.x) / (second.y - first.y);
|
||||
} else { // Vertical
|
||||
intersection.x = clipBoundary[0].x;
|
||||
intersection.y = first.y + (clipBoundary[0].x - first.x) * (second.y - first.y) / (second.x - first.x);
|
||||
}
|
||||
}
|
||||
|
||||
void PolygonClip::appendPoint(glm::vec2 newVertex, int& outLength, glm::vec2* outVertexArray) {
|
||||
outVertexArray[outLength].x = newVertex.x;
|
||||
outVertexArray[outLength].y = newVertex.y;
|
||||
outLength++;
|
||||
}
|
||||
|
||||
// The copyCleanArray() function sets the resulting polygon of the previous step up to be the input polygon for next step of the
|
||||
// clipping algorithm. As the Sutherland-Hodgman algorithm is a polygon clipping algorithm, it does not handle line
|
||||
// clipping very well. The modification so that lines may be clipped as well as polygons is included in this function.
|
||||
// when completed vertexArrayA will be ready for output and/or next step of clipping
|
||||
void PolygonClip::copyCleanArray(int& lengthA, glm::vec2* vertexArrayA, int& lengthB, glm::vec2* vertexArrayB) {
|
||||
// Fix lines: they will come back with a length of 3, from an original of length of 2
|
||||
if ((lengthA == 2) && (lengthB == 3)) {
|
||||
// The first vertex should be copied as is.
|
||||
vertexArrayA[0] = vertexArrayB[0];
|
||||
// If the first two vertices of the "B" array are same, then collapse them down to be the 2nd vertex
|
||||
if (vertexArrayB[0].x == vertexArrayB[1].x) {
|
||||
vertexArrayA[1] = vertexArrayB[2];
|
||||
} else {
|
||||
// Otherwise the first vertex should be the same as third vertex
|
||||
vertexArrayA[1] = vertexArrayB[1];
|
||||
}
|
||||
lengthA=2;
|
||||
} else {
|
||||
// for all other polygons, then just copy the vertexArrayB to vertextArrayA for next step
|
||||
lengthA = lengthB;
|
||||
for (int i = 0; i < lengthB; i++) {
|
||||
vertexArrayA[i] = vertexArrayB[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -43,4 +43,39 @@ bool doLineSegmentsIntersect(glm::vec2 r1p1, glm::vec2 r1p2, glm::vec2 r2p1, glm
|
|||
bool isOnSegment(float xi, float yi, float xj, float yj, float xk, float yk);
|
||||
int computeDirection(float xi, float yi, float xj, float yj, float xk, float yk);
|
||||
|
||||
|
||||
typedef glm::vec2 LineSegment2[2];
|
||||
|
||||
// Polygon Clipping routines inspired by, pseudo code found here: http://www.cs.rit.edu/~icss571/clipTrans/PolyClipBack.html
|
||||
class PolygonClip {
|
||||
|
||||
public:
|
||||
static void clipToScreen(const glm::vec2* inputVertexArray, int length, glm::vec2*& outputVertexArray, int& outLength);
|
||||
|
||||
static const float TOP_OF_CLIPPING_WINDOW;
|
||||
static const float BOTTOM_OF_CLIPPING_WINDOW;
|
||||
static const float LEFT_OF_CLIPPING_WINDOW;
|
||||
static const float RIGHT_OF_CLIPPING_WINDOW;
|
||||
|
||||
static const glm::vec2 TOP_LEFT_CLIPPING_WINDOW;
|
||||
static const glm::vec2 TOP_RIGHT_CLIPPING_WINDOW;
|
||||
static const glm::vec2 BOTTOM_LEFT_CLIPPING_WINDOW;
|
||||
static const glm::vec2 BOTTOM_RIGHT_CLIPPING_WINDOW;
|
||||
|
||||
private:
|
||||
|
||||
static void sutherlandHodgmanPolygonClip(glm::vec2* inVertexArray, glm::vec2* outVertexArray,
|
||||
int inLength, int& outLength, const LineSegment2& clipBoundary);
|
||||
|
||||
static bool pointInsideBoundary(const glm::vec2& testVertex, const LineSegment2& clipBoundary);
|
||||
|
||||
static void segmentIntersectsBoundary(const glm::vec2& first, const glm::vec2& second,
|
||||
const LineSegment2& clipBoundary, glm::vec2& intersection);
|
||||
|
||||
static void appendPoint(glm::vec2 newVertex, int& outLength, glm::vec2* outVertexArray);
|
||||
|
||||
static void copyCleanArray(int& lengthA, glm::vec2* vertexArrayA, int& lengthB, glm::vec2* vertexArrayB);
|
||||
};
|
||||
|
||||
|
||||
#endif /* defined(__interface__GeometryUtil__) */
|
||||
|
|
|
@ -12,11 +12,15 @@
|
|||
|
||||
#include <glm/gtx/transform.hpp>
|
||||
|
||||
#include "ViewFrustum.h"
|
||||
#include "VoxelConstants.h"
|
||||
#include "SharedUtil.h"
|
||||
#include "Log.h"
|
||||
|
||||
#include "CoverageMap.h"
|
||||
#include "GeometryUtil.h"
|
||||
#include "ViewFrustum.h"
|
||||
#include "VoxelConstants.h"
|
||||
|
||||
|
||||
using namespace std;
|
||||
|
||||
ViewFrustum::ViewFrustum() :
|
||||
|
@ -451,7 +455,7 @@ glm::vec2 ViewFrustum::projectPoint(glm::vec3 point, bool& pointInView) const {
|
|||
|
||||
const int MAX_POSSIBLE_COMBINATIONS = 43;
|
||||
|
||||
const int hullVertexLookup[MAX_POSSIBLE_COMBINATIONS][MAX_SHADOW_VERTEX_COUNT+1] = {
|
||||
const int hullVertexLookup[MAX_POSSIBLE_COMBINATIONS][MAX_PROJECTED_POLYGON_VERTEX_COUNT+1] = {
|
||||
// Number of vertices in shadow polygon for the visible faces, then a list of the index of each vertice from the AABox
|
||||
{0}, // inside
|
||||
{4, BOTTOM_RIGHT_NEAR, BOTTOM_RIGHT_FAR, TOP_RIGHT_FAR, TOP_RIGHT_NEAR}, // right
|
||||
|
@ -510,7 +514,7 @@ VoxelProjectedPolygon ViewFrustum::getProjectedPolygon(const AABox& box) const {
|
|||
|
||||
int vertexCount = hullVertexLookup[lookUp][0]; //look up number of vertices
|
||||
|
||||
VoxelProjectedPolygon shadow(vertexCount);
|
||||
VoxelProjectedPolygon projectedPolygon(vertexCount);
|
||||
|
||||
bool pointInView = true;
|
||||
bool allPointsInView = false; // assume the best, but wait till we know we have a vertex
|
||||
|
@ -523,13 +527,37 @@ VoxelProjectedPolygon ViewFrustum::getProjectedPolygon(const AABox& box) const {
|
|||
glm::vec2 projectedPoint = projectPoint(point, pointInView);
|
||||
allPointsInView = allPointsInView && pointInView;
|
||||
anyPointsInView = anyPointsInView || pointInView;
|
||||
shadow.setVertex(i, projectedPoint);
|
||||
projectedPolygon.setVertex(i, projectedPoint);
|
||||
}
|
||||
|
||||
/***
|
||||
// Now that we've got the polygon, if it extends beyond the clipping window, then let's clip it
|
||||
// NOTE: This clipping does not improve our overall performance. It basically causes more polygons to
|
||||
// end up in the same quad/half and so the polygon lists get longer, and that's more calls to polygon.occludes()
|
||||
if ( (projectedPolygon.getMaxX() > PolygonClip::RIGHT_OF_CLIPPING_WINDOW ) ||
|
||||
(projectedPolygon.getMaxY() > PolygonClip::TOP_OF_CLIPPING_WINDOW ) ||
|
||||
(projectedPolygon.getMaxX() < PolygonClip::LEFT_OF_CLIPPING_WINDOW ) ||
|
||||
(projectedPolygon.getMaxY() < PolygonClip::BOTTOM_OF_CLIPPING_WINDOW) ) {
|
||||
|
||||
CoverageRegion::_clippedPolygons++;
|
||||
|
||||
glm::vec2* clippedVertices;
|
||||
int clippedVertexCount;
|
||||
PolygonClip::clipToScreen(projectedPolygon.getVertices(), vertexCount, clippedVertices, clippedVertexCount);
|
||||
|
||||
// Now reset the vertices of our projectedPolygon object
|
||||
projectedPolygon.setVertexCount(clippedVertexCount);
|
||||
for(int i = 0; i < clippedVertexCount; i++) {
|
||||
projectedPolygon.setVertex(i, clippedVertices[i]);
|
||||
}
|
||||
delete[] clippedVertices;
|
||||
}
|
||||
***/
|
||||
}
|
||||
// set the distance from our camera position, to the closest vertex
|
||||
float distance = glm::distance(getPosition(), box.getCenter());
|
||||
shadow.setDistance(distance);
|
||||
shadow.setAnyInView(anyPointsInView);
|
||||
shadow.setAllInView(allPointsInView);
|
||||
return shadow;
|
||||
projectedPolygon.setDistance(distance);
|
||||
projectedPolygon.setAnyInView(anyPointsInView);
|
||||
projectedPolygon.setAllInView(allPointsInView);
|
||||
return projectedPolygon;
|
||||
}
|
||||
|
|
|
@ -5,9 +5,11 @@
|
|||
// Added by Brad Hefta-Gaub on 06/11/13.
|
||||
//
|
||||
|
||||
#include <algorithm>
|
||||
#include "VoxelProjectedPolygon.h"
|
||||
#include "GeometryUtil.h"
|
||||
#include "Log.h"
|
||||
#include "SharedUtil.h"
|
||||
|
||||
|
||||
BoundingBox BoundingBox::topHalf() const {
|
||||
|
@ -35,7 +37,7 @@ BoundingBox BoundingBox::rightHalf() const {
|
|||
}
|
||||
|
||||
bool BoundingBox::contains(const BoundingBox& box) const {
|
||||
return ( _set &&
|
||||
return ( _set &&
|
||||
(box.corner.x >= corner.x) &&
|
||||
(box.corner.y >= corner.y) &&
|
||||
(box.corner.x + box.size.x <= corner.x + size.x) &&
|
||||
|
@ -49,30 +51,14 @@ void BoundingBox::explandToInclude(const BoundingBox& box) {
|
|||
size = box.size;
|
||||
_set = true;
|
||||
} else {
|
||||
// example:
|
||||
// original bounding [c:1,1 s:1,1] => [1,1]->[2,2]
|
||||
// expand to include [c:0.5,0.5 s:2,2] => [0.5,0.5]->[2.5,2.5]
|
||||
// new bounding [0.5,0.5]->[2.5,2.5] or [c:0.5,0.5 s:2,2]
|
||||
|
||||
|
||||
if (box.corner.x < corner.x) {
|
||||
corner.x = box.corner.x;
|
||||
size.x += (corner.x - box.corner.x);
|
||||
}
|
||||
// new state... [c:0.5,1 s:1.5,1]
|
||||
if (box.corner.y < corner.y) {
|
||||
corner.y = box.corner.y;
|
||||
size.y += (corner.y - box.corner.y);
|
||||
}
|
||||
// new state... [c:0.5,0.5 s:1.5,1.5]
|
||||
if ((box.corner.x + box.size.x) > (corner.x + size.x)) {
|
||||
size.x += ((box.corner.x + box.size.x) - (corner.x + size.x));
|
||||
}
|
||||
// new state... [c:0.5,0.5 s:2,1.5]
|
||||
if ((box.corner.y + box.size.y) > (corner.y + size.y)) {
|
||||
size.y += ((box.corner.y + box.size.y) - (corner.y + size.y));
|
||||
}
|
||||
// new state... [c:0.5,0.5 s:2,2]
|
||||
float minX = std::min(box.corner.x, corner.x);
|
||||
float minY = std::min(box.corner.y, corner.y);
|
||||
float maxX = std::max(box.corner.x + box.size.x, corner.x + size.x);
|
||||
float maxY = std::max(box.corner.y + box.size.y, corner.y + size.y);
|
||||
corner.x = minX;
|
||||
corner.y = minY;
|
||||
size.x = maxX - minX;
|
||||
size.y = maxY - minY;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -83,7 +69,8 @@ void BoundingBox::printDebugDetails(const char* label) const {
|
|||
} else {
|
||||
printLog("BoundingBox");
|
||||
}
|
||||
printLog("\n corner=%f,%f size=%f,%f\n", corner.x, corner.y, size.x, size.y);
|
||||
printLog("\n _set=%s\n corner=%f,%f size=%f,%f\n bounds=[(%f,%f) to (%f,%f)]\n",
|
||||
debug::valueOf(_set), corner.x, corner.y, size.x, size.y, corner.x, corner.y, corner.x+size.x, corner.y+size.y);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -10,9 +10,10 @@
|
|||
|
||||
#include <glm/glm.hpp>
|
||||
|
||||
const int MAX_SHADOW_VERTEX_COUNT = 6;
|
||||
|
||||
typedef glm::vec2 ShadowVertices[MAX_SHADOW_VERTEX_COUNT];
|
||||
// there's a max of 6 vertices of a project polygon, and a max of twice that when clipped to the screen
|
||||
const int MAX_PROJECTED_POLYGON_VERTEX_COUNT = 6;
|
||||
const int MAX_CLIPPED_PROJECTED_POLYGON_VERTEX_COUNT = MAX_PROJECTED_POLYGON_VERTEX_COUNT * 2;
|
||||
typedef glm::vec2 ProjectedVertices[MAX_CLIPPED_PROJECTED_POLYGON_VERTEX_COUNT];
|
||||
|
||||
class BoundingBox {
|
||||
public:
|
||||
|
@ -45,7 +46,7 @@ public:
|
|||
{ };
|
||||
|
||||
~VoxelProjectedPolygon() { };
|
||||
const ShadowVertices& getVerices() const { return _vertices; };
|
||||
const ProjectedVertices& getVertices() const { return _vertices; };
|
||||
const glm::vec2& getVertex(int i) const { return _vertices[i]; };
|
||||
void setVertex(int vertex, const glm::vec2& point);
|
||||
int getVertexCount() const { return _vertexCount; };
|
||||
|
@ -75,7 +76,7 @@ public:
|
|||
|
||||
private:
|
||||
int _vertexCount;
|
||||
ShadowVertices _vertices;
|
||||
ProjectedVertices _vertices;
|
||||
float _maxX;
|
||||
float _maxY;
|
||||
float _minX;
|
||||
|
|
Loading…
Reference in a new issue