// // Copyright (c) 2009-2010 Mikko Mononen [email protected] // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would be // appreciated but is not required. // 2. Altered source versions must be plainly marked as such, and must not be // misrepresented as being the original software. // 3. This notice may not be removed or altered from any source distribution. // #include <math.h> #include <stdio.h> #include "Recast.h" #include "RecastAlloc.h" #include "RecastAssert.h" /// Check whether two bounding boxes overlap /// /// @param[in] aMin Min axis extents of bounding box A /// @param[in] aMax Max axis extents of bounding box A /// @param[in] bMin Min axis extents of bounding box B /// @param[in] bMax Max axis extents of bounding box B /// @returns true if the two bounding boxes overlap. False otherwise. static bool overlapBounds(const float* aMin, const float* aMax, const float* bMin, const float* bMax) { … } /// Allocates a new span in the heightfield. /// Use a memory pool and free list to minimize actual allocations. /// /// @param[in] hf The heightfield /// @returns A pointer to the allocated or re-used span memory. static rcSpan* allocSpan(rcHeightfield& hf) { … } /// Releases the memory used by the span back to the heightfield, so it can be re-used for new spans. /// @param[in] hf The heightfield. /// @param[in] span A pointer to the span to free static void freeSpan(rcHeightfield& hf, rcSpan* span) { … } /// Adds a span to the heightfield. If the new span overlaps existing spans, /// it will merge the new span with the existing ones. /// /// @param[in] hf Heightfield to add spans to /// @param[in] x The new span's column cell x index /// @param[in] z The new span's column cell z index /// @param[in] min The new span's minimum cell index /// @param[in] max The new span's maximum cell index /// @param[in] areaID The new span's area type ID /// @param[in] flagMergeThreshold How close two spans maximum extents need to be to merge area type IDs static bool addSpan(rcHeightfield& hf, const int x, const int z, const unsigned short min, const unsigned short max, const unsigned char areaID, const int flagMergeThreshold) { … } bool rcAddSpan(rcContext* context, rcHeightfield& heightfield, const int x, const int z, const unsigned short spanMin, const unsigned short spanMax, const unsigned char areaID, const int flagMergeThreshold) { … } enum rcAxis { … }; /// Divides a convex polygon of max 12 vertices into two convex polygons /// across a separating axis. /// /// @param[in] inVerts The input polygon vertices /// @param[in] inVertsCount The number of input polygon vertices /// @param[out] outVerts1 Resulting polygon 1's vertices /// @param[out] outVerts1Count The number of resulting polygon 1 vertices /// @param[out] outVerts2 Resulting polygon 2's vertices /// @param[out] outVerts2Count The number of resulting polygon 2 vertices /// @param[in] axisOffset THe offset along the specified axis /// @param[in] axis The separating axis static void dividePoly(const float* inVerts, int inVertsCount, float* outVerts1, int* outVerts1Count, float* outVerts2, int* outVerts2Count, float axisOffset, rcAxis axis) { … } /// Rasterize a single triangle to the heightfield. /// /// This code is extremely hot, so much care should be given to maintaining maximum perf here. /// /// @param[in] v0 Triangle vertex 0 /// @param[in] v1 Triangle vertex 1 /// @param[in] v2 Triangle vertex 2 /// @param[in] areaID The area ID to assign to the rasterized spans /// @param[in] hf Heightfield to rasterize into /// @param[in] hfBBMin The min extents of the heightfield bounding box /// @param[in] hfBBMax The max extents of the heightfield bounding box /// @param[in] cellSize The x and z axis size of a voxel in the heightfield /// @param[in] inverseCellSize 1 / cellSize /// @param[in] inverseCellHeight 1 / cellHeight /// @param[in] flagMergeThreshold The threshold in which area flags will be merged /// @returns true if the operation completes successfully. false if there was an error adding spans to the heightfield. static bool rasterizeTri(const float* v0, const float* v1, const float* v2, const unsigned char areaID, rcHeightfield& hf, const float* hfBBMin, const float* hfBBMax, const float cellSize, const float inverseCellSize, const float inverseCellHeight, const int flagMergeThreshold) { … } bool rcRasterizeTriangle(rcContext* context, const float* v0, const float* v1, const float* v2, const unsigned char areaID, rcHeightfield& heightfield, const int flagMergeThreshold) { … } bool rcRasterizeTriangles(rcContext* context, const float* verts, const int /*nv*/, const int* tris, const unsigned char* triAreaIDs, const int numTris, rcHeightfield& heightfield, const int flagMergeThreshold) { … } bool rcRasterizeTriangles(rcContext* context, const float* verts, const int /*nv*/, const unsigned short* tris, const unsigned char* triAreaIDs, const int numTris, rcHeightfield& heightfield, const int flagMergeThreshold) { … } bool rcRasterizeTriangles(rcContext* context, const float* verts, const unsigned char* triAreaIDs, const int numTris, rcHeightfield& heightfield, const int flagMergeThreshold) { … }