Ejemplo n.º 1
0
	//-------------------------------------------------------------------------
	public static void CalculateUnreducedOutlineForAllColliderRegions(ref ColliderRegionData[] colliderRegions, ref PolygonOutlineFromImageFrontend outlineAlgorithm,
																	  RegionIndependentParameters regionIndependentParameters,
																	  ColliderRegionParameters[] colliderRegionParameters, bool [,] binaryImage,
																	  bool ccwVertexOrder) {
		
		for (int count = 0; count < colliderRegions.Length; ++count) {
        
			if (colliderRegionParameters[count].EnableRegion) {
				// Calculate polygon bounds
	            outlineAlgorithm.VertexReductionDistanceTolerance = regionIndependentParameters.VertexReductionDistanceTolerance;
			    outlineAlgorithm.MaxPointCount = colliderRegionParameters[count].MaxPointCount;
				
				bool allRegionsConvex = regionIndependentParameters.Convex;
				outlineAlgorithm.Convex = allRegionsConvex ? true : colliderRegionParameters[count].Convex;
			    //outlineAlgorithm.Convex = colliderRegionParameters[count].Convex;
			    
				outlineAlgorithm.XOffsetNormalized = -0.5f;//-this.transform.localScale.x / 2.0f;
			    outlineAlgorithm.YOffsetNormalized = -0.5f;//-this.transform.localScale.y / 2.0f;
			    bool outputInNormalizedSpace = true;
				
				bool regionVertexOrder = ccwVertexOrder;
				if (!colliderRegions[count].mRegionIsIsland) {
					regionVertexOrder = !regionVertexOrder;
				}
	
				colliderRegions[count].mOutlineVertexOrderIsCCW = regionVertexOrder;
	            outlineAlgorithm.UnreducedOutlineFromBinaryImage(out colliderRegions[count].mIntermediateOutlineVertices, binaryImage, colliderRegions[count].mDetectedRegion.mPointAtBorder, colliderRegions[count].mRegionIsIsland, outputInNormalizedSpace, regionVertexOrder);
			}
			else {
				colliderRegions[count].mIntermediateOutlineVertices = null;
				colliderRegions[count].mResultVertices = null;
				colliderRegions[count].mResultTriangleIndices = null;
			}
        }
	}
Ejemplo n.º 2
0
	//-------------------------------------------------------------------------
	public static void SetupColliderRegionParameters(ref ColliderRegionParameters[] colliderRegionParameters, int defaultMaxPointCount,
													 IslandDetector.Region[] islands, IslandDetector.Region[] seaRegions) {
		
		int numColliderRegions = islands.Length + seaRegions.Length;
		
		bool shallResetRegionParameters = (colliderRegionParameters == null || numColliderRegions != colliderRegionParameters.Length); // TODO!! check when to throw parameters away!
		if (shallResetRegionParameters) {
			
			colliderRegionParameters = new ColliderRegionParameters[numColliderRegions];
			int colliderRegionIndex = 0;
			
			// Note: We enable the first island region only. All other island- and all sea-regions are initially disabled.
			for (int islandIndex = 0; islandIndex < islands.Length; ++islandIndex) {
				
				ColliderRegionParameters newParameters = new ColliderRegionParameters();
				if (islandIndex == 0) {
					newParameters.EnableRegion = true;
				}
				else {
					newParameters.EnableRegion = false;
				}
				newParameters.MaxPointCount = defaultMaxPointCount;
				colliderRegionParameters[colliderRegionIndex++] = newParameters;
			}
			for (int seaRegionIndex = 0; seaRegionIndex < seaRegions.Length; ++seaRegionIndex) {

				ColliderRegionParameters newParameters = new ColliderRegionParameters();
				newParameters.EnableRegion = false;
				newParameters.MaxPointCount = defaultMaxPointCount;
				colliderRegionParameters[colliderRegionIndex++] = newParameters;
			}
		}
		else {
			for (int count = 0; count < colliderRegionParameters.Length; ++count) {
				colliderRegionParameters[count].RegionUpdateCalculationNeeded = true;
			}
		}
	}
Ejemplo n.º 3
0
	//-------------------------------------------------------------------------
	// Compatibility glue-code: to read the old mMaxPointCount value and sets the first island's newParameters.MaxPointCount value.
	public static void CopyOldPointCountParameterToFirstIslandForBackwardsCompatibility(ref ColliderRegionParameters[] colliderRegionParameters,
																						ref int deprecatedOldPointCountParameter) {
		
		if (deprecatedOldPointCountParameter != PARAMETER_NOT_USED_ANYMORE) {
			colliderRegionParameters[0].MaxPointCount = deprecatedOldPointCountParameter;
			deprecatedOldPointCountParameter = PARAMETER_NOT_USED_ANYMORE;
		}
	}
Ejemplo n.º 4
0
	//-------------------------------------------------------------------------
	public static void SetupColliderRegionParameters(ref ColliderRegionParameters[] islandRegionParameters, ref ColliderRegionParameters[] seaRegionParameters,
	                                                 int defaultMaxPointCount,
													 IslandDetector.Region[] islands, IslandDetector.Region[] seaRegions) {

		// Islands
		int oldIslandRegionParametersLength = 0;
		if (islandRegionParameters == null) {			
			islandRegionParameters = new ColliderRegionParameters[islands.Length];
		}
		else {
			oldIslandRegionParametersLength = islandRegionParameters.Length;
			if (islands.Length > oldIslandRegionParametersLength) {
				System.Array.Resize(ref islandRegionParameters, islands.Length);
			}
		}

		// set RegionUpdateCalculationNeeded at old entries
		for (int existingIndex = 0; existingIndex < oldIslandRegionParametersLength; ++existingIndex) {
			islandRegionParameters[existingIndex].RegionUpdateCalculationNeeded = true;
		}
		// add new ColliderRegionParameters at new ones
		for (int newIndex = oldIslandRegionParametersLength; newIndex < islands.Length; ++newIndex) {
		
			// Note: We enable the first island region only. All other island- and all sea-regions are initially disabled.
			ColliderRegionParameters newParameters = new ColliderRegionParameters();
			if (newIndex == 0) {
				newParameters.EnableRegion = true;
			}
			else {
				newParameters.EnableRegion = false;
			}
			newParameters.MaxPointCount = defaultMaxPointCount;
			islandRegionParameters[newIndex] = newParameters;
		}

		// Sea regions
		int oldSeaRegionParametersLength = 0;
		if (seaRegionParameters == null) {			
			seaRegionParameters = new ColliderRegionParameters[seaRegions.Length];
		}
		else {
			oldSeaRegionParametersLength = seaRegionParameters.Length;
			if (seaRegions.Length > oldSeaRegionParametersLength) {
				System.Array.Resize(ref seaRegionParameters, seaRegions.Length);
			}
		}
		// set RegionUpdateCalculationNeeded at old entries
		for (int existingIndex = 0; existingIndex < oldSeaRegionParametersLength; ++existingIndex) {
			seaRegionParameters[existingIndex].RegionUpdateCalculationNeeded = true;
		}
		// add new ColliderRegionParameters at new ones
		for (int seaRegionIndex = oldSeaRegionParametersLength; seaRegionIndex < seaRegions.Length; ++seaRegionIndex) {
			
			ColliderRegionParameters newParameters = new ColliderRegionParameters();
			newParameters.EnableRegion = false;
			newParameters.MaxPointCount = defaultMaxPointCount;
			seaRegionParameters[seaRegionIndex] = newParameters;
		}
	}