diff --git a/Detour/Source/DetourObstacleAvoidance.cpp b/Detour/Source/DetourObstacleAvoidance.cpp index ea48a89b..a255c9b3 100644 --- a/Detour/Source/DetourObstacleAvoidance.cpp +++ b/Detour/Source/DetourObstacleAvoidance.cpp @@ -465,7 +465,6 @@ void dtObstacleAvoidanceQuery::sampleVelocityAdaptive(const float* pos, const fl if (debug) debug->reset(); - // Build sampling pattern aligned to desired velocity. static const int MAX_PATTERN_DIVS = 32; static const int MAX_PATTERN_RINGS = 4; diff --git a/RecastDemo/Bin/Recast.app/Contents/MacOS/Recast b/RecastDemo/Bin/Recast.app/Contents/MacOS/Recast index e4927bde..8ba7da16 100755 Binary files a/RecastDemo/Bin/Recast.app/Contents/MacOS/Recast and b/RecastDemo/Bin/Recast.app/Contents/MacOS/Recast differ diff --git a/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.pbxuser b/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.pbxuser index 8fb07e57..521a82cf 100644 --- a/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.pbxuser +++ b/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.pbxuser @@ -9,7 +9,7 @@ }; }; 29B97313FDCFA39411CA2CEA /* Project object */ = { - activeBuildConfigurationName = Debug; + activeBuildConfigurationName = Release; activeExecutable = 6B8632970F78114600E2684A /* Recast */; activeTarget = 8D1107260486CEB800E47090 /* Recast */; addToTargets = ( @@ -24,8 +24,8 @@ 6B920A121225B1C900D5B5AD /* DetourHashLookup.cpp:78 */, 6B920A141225B1CF00D5B5AD /* DetourHashLookup.cpp:131 */, 6BD66851124350F50021A7A4 /* NavMeshTesterTool.cpp:480 */, - 6BA8CF601255D4C500272A3B /* Sample.cpp:45 */, - 6BB9C251126F555D00B97C1C /* DetourObstacleAvoidance.cpp:465 */, + 6BB9C290126F61C100B97C1C /* CrowdManager.cpp:423 */, + 6BB9C296126F61DD00B97C1C /* CrowdManager.cpp:765 */, ); codeSenseManager = 6B8632AA0F78115100E2684A /* Code sense */; executables = ( @@ -245,6 +245,33 @@ 6BB9C256126F555F00B97C1C /* PBXTextBookmark */ = 6BB9C256126F555F00B97C1C /* PBXTextBookmark */; 6BB9C25C126F55D600B97C1C /* PBXTextBookmark */ = 6BB9C25C126F55D600B97C1C /* PBXTextBookmark */; 6BB9C262126F562C00B97C1C /* PBXTextBookmark */ = 6BB9C262126F562C00B97C1C /* PBXTextBookmark */; + 6BB9C280126F615D00B97C1C /* PBXTextBookmark */ = 6BB9C280126F615D00B97C1C /* PBXTextBookmark */; + 6BB9C281126F615D00B97C1C /* PBXTextBookmark */ = 6BB9C281126F615D00B97C1C /* PBXTextBookmark */; + 6BB9C282126F615D00B97C1C /* PBXTextBookmark */ = 6BB9C282126F615D00B97C1C /* PBXTextBookmark */; + 6BB9C283126F615D00B97C1C /* PBXTextBookmark */ = 6BB9C283126F615D00B97C1C /* PBXTextBookmark */; + 6BB9C286126F617300B97C1C /* PBXTextBookmark */ = 6BB9C286126F617300B97C1C /* PBXTextBookmark */; + 6BB9C287126F618200B97C1C /* PBXTextBookmark */ = 6BB9C287126F618200B97C1C /* PBXTextBookmark */; + 6BB9C288126F618200B97C1C /* PBXTextBookmark */ = 6BB9C288126F618200B97C1C /* PBXTextBookmark */; + 6BB9C28A126F618200B97C1C /* PBXTextBookmark */ = 6BB9C28A126F618200B97C1C /* PBXTextBookmark */; + 6BB9C28D126F61A900B97C1C /* PBXTextBookmark */ = 6BB9C28D126F61A900B97C1C /* PBXTextBookmark */; + 6BB9C292126F61C300B97C1C /* PBXTextBookmark */ = 6BB9C292126F61C300B97C1C /* PBXTextBookmark */; + 6BB9C293126F61C300B97C1C /* PBXTextBookmark */ = 6BB9C293126F61C300B97C1C /* PBXTextBookmark */; + 6BB9C29C126F620200B97C1C /* PBXTextBookmark */ = 6BB9C29C126F620200B97C1C /* PBXTextBookmark */; + 6BB9C29D126F620200B97C1C /* PBXTextBookmark */ = 6BB9C29D126F620200B97C1C /* PBXTextBookmark */; + 6BB9C29F126F620E00B97C1C /* PBXTextBookmark */ = 6BB9C29F126F620E00B97C1C /* PBXTextBookmark */; + 6BB9C2A0126F620E00B97C1C /* PBXTextBookmark */ = 6BB9C2A0126F620E00B97C1C /* PBXTextBookmark */; + 6BB9C2A1126F620E00B97C1C /* PBXTextBookmark */ = 6BB9C2A1126F620E00B97C1C /* PBXTextBookmark */; + 6BB9C2A2126F623D00B97C1C /* PBXTextBookmark */ = 6BB9C2A2126F623D00B97C1C /* PBXTextBookmark */; + 6BB9C2A3126F623D00B97C1C /* PBXTextBookmark */ = 6BB9C2A3126F623D00B97C1C /* PBXTextBookmark */; + 6BB9C2A4126F623D00B97C1C /* PBXTextBookmark */ = 6BB9C2A4126F623D00B97C1C /* PBXTextBookmark */; + 6BB9C2A5126F624E00B97C1C /* PBXTextBookmark */ = 6BB9C2A5126F624E00B97C1C /* PBXTextBookmark */; + 6BB9C2A6126F624E00B97C1C /* PBXTextBookmark */ = 6BB9C2A6126F624E00B97C1C /* PBXTextBookmark */; + 6BB9C2A7126F624E00B97C1C /* PBXTextBookmark */ = 6BB9C2A7126F624E00B97C1C /* PBXTextBookmark */; + 6BB9C2AA126F62C000B97C1C /* PBXTextBookmark */ = 6BB9C2AA126F62C000B97C1C /* PBXTextBookmark */; + 6BB9C2AB126F62C000B97C1C /* PBXTextBookmark */ = 6BB9C2AB126F62C000B97C1C /* PBXTextBookmark */; + 6BB9C2AC126F62C000B97C1C /* PBXTextBookmark */ = 6BB9C2AC126F62C000B97C1C /* PBXTextBookmark */; + 6BB9C2AD126F62C000B97C1C /* PBXTextBookmark */ = 6BB9C2AD126F62C000B97C1C /* PBXTextBookmark */; + 6BB9C2B2126F641400B97C1C /* PBXTextBookmark */ = 6BB9C2B2126F641400B97C1C /* PBXTextBookmark */; 6BBB0361124E242E00533229 = 6BBB0361124E242E00533229 /* PBXTextBookmark */; 6BBB0363124E242E00533229 = 6BBB0363124E242E00533229 /* PBXTextBookmark */; 6BBB4C34115B7A3D00CF791D = 6BBB4C34115B7A3D00CF791D /* PBXTextBookmark */; @@ -297,9 +324,9 @@ ignoreCount = 0; lineNumber = 1324; location = Recast; - modificationTime = 309286258.801484; + modificationTime = 309289472.910001; originalNumberOfMultipleMatches = 1; - state = 1; + state = 0; }; 6B1185F41006895B0018F96F /* DetourNode.cpp */ = { uiCtxt = { @@ -629,7 +656,7 @@ fRef = 6BD667D8123D27EC0021A7A4 /* CrowdManager.h */; name = "CrowdManager.h: 232"; rLen = 0; - rLoc = 6163; + rLoc = 6054; rType = 0; vrLen = 908; vrLoc = 5232; @@ -649,7 +676,7 @@ fRef = 6B9EFF0812281C3E00535FF1 /* DetourObstacleAvoidance.cpp */; name = "DetourObstacleAvoidance.cpp: 568"; rLen = 0; - rLoc = 12450; + rLoc = 12448; rType = 0; vrLen = 905; vrLoc = 13302; @@ -659,7 +686,7 @@ fRef = 6B9EFF0812281C3E00535FF1 /* DetourObstacleAvoidance.cpp */; name = "DetourObstacleAvoidance.cpp: 568"; rLen = 0; - rLoc = 12450; + rLoc = 12448; rType = 0; vrLen = 938; vrLoc = 13269; @@ -683,16 +710,16 @@ }; 6B25B6140FFA62BE004F1BC4 /* Sample.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {931, 2834}}"; - sepNavSelRange = "{2904, 0}"; - sepNavVisRange = "{2623, 730}"; + sepNavIntBoundsRect = "{{0, 0}, {931, 2600}}"; + sepNavSelRange = "{1438, 0}"; + sepNavVisRange = "{987, 785}"; }; }; 6B25B6180FFA62BE004F1BC4 /* main.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {931, 11869}}"; - sepNavSelRange = "{2461, 0}"; - sepNavVisRange = "{1585, 1213}"; + sepNavIntBoundsRect = "{{0, 0}, {1217, 12103}}"; + sepNavSelRange = "{21426, 0}"; + sepNavVisRange = "{2024, 437}"; sepNavWindowFrame = "{{15, 51}, {1214, 722}}"; }; }; @@ -750,7 +777,7 @@ ignoreCount = 0; lineNumber = 362; location = Recast; - modificationTime = 309286240.760318; + modificationTime = 309289473.184434; originalNumberOfMultipleMatches = 1; state = 1; }; @@ -888,7 +915,7 @@ argumentStrings = ( ); autoAttachOnCrash = 1; - breakpointsEnabled = 0; + breakpointsEnabled = 1; configStateDict = { }; customDataFormattersEnabled = 1; @@ -987,7 +1014,7 @@ ignoreCount = 0; lineNumber = 78; location = Recast; - modificationTime = 309286237.392774; + modificationTime = 309289472.910399; originalNumberOfMultipleMatches = 0; state = 2; }; @@ -1004,9 +1031,9 @@ hitCount = 0; ignoreCount = 0; lineNumber = 131; - modificationTime = 309286258.80118; + modificationTime = 309289472.910599; originalNumberOfMultipleMatches = 1; - state = 1; + state = 0; }; 6B920A521225C0AC00D5B5AD /* PBXTextBookmark */ = { isa = PBXTextBookmark; @@ -1100,9 +1127,9 @@ }; 6B9EFF0812281C3E00535FF1 /* DetourObstacleAvoidance.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {931, 7059}}"; - sepNavSelRange = "{12152, 0}"; - sepNavVisRange = "{11613, 838}"; + sepNavIntBoundsRect = "{{0, 0}, {931, 6968}}"; + sepNavSelRange = "{11554, 0}"; + sepNavVisRange = "{10959, 1291}"; }; }; 6BA1E88810C7BFC9008007F6 /* Sample_SoloMeshSimple.cpp */ = { @@ -1160,7 +1187,7 @@ ignoreCount = 0; lineNumber = 137; location = Recast; - modificationTime = 309286240.769202; + modificationTime = 309289473.211389; originalNumberOfMultipleMatches = 1; state = 1; }; @@ -1268,24 +1295,6 @@ vrLen = 797; vrLoc = 923; }; - 6BA8CF601255D4C500272A3B /* Sample.cpp:45 */ = { - isa = PBXFileBreakpoint; - actions = ( - ); - breakpointStyle = 0; - continueAfterActions = 0; - countType = 0; - delayBeforeContinue = 0; - fileReference = 6B25B6140FFA62BE004F1BC4 /* Sample.cpp */; - functionName = "Sample::Sample()"; - hitCount = 0; - ignoreCount = 0; - lineNumber = 45; - location = Recast; - modificationTime = 309286240.789448; - originalNumberOfMultipleMatches = 1; - state = 1; - }; 6BA8CF951255D97400272A3B /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 6BCF32351104CD05009445BF /* OffMeshConnectionTool.cpp */; @@ -1653,7 +1662,7 @@ fRef = 6B9EFF0812281C3E00535FF1 /* DetourObstacleAvoidance.cpp */; name = "DetourObstacleAvoidance.cpp: 568"; rLen = 0; - rLoc = 12450; + rLoc = 12448; rType = 0; vrLen = 940; vrLoc = 13267; @@ -1913,7 +1922,7 @@ fRef = 6BD667D8123D27EC0021A7A4 /* CrowdManager.h */; name = "CrowdManager.h: 140"; rLen = 0; - rLoc = 3459; + rLoc = 3209; rType = 0; vrLen = 1135; vrLoc = 3180; @@ -1923,7 +1932,7 @@ fRef = 6BD667D9123D28100021A7A4 /* CrowdManager.cpp */; name = "CrowdManager.cpp: 472"; rLen = 0; - rLoc = 10993; + rLoc = 11326; rType = 0; vrLen = 945; vrLoc = 10373; @@ -1963,7 +1972,7 @@ fRef = 6B9EFF0812281C3E00535FF1 /* DetourObstacleAvoidance.cpp */; name = "DetourObstacleAvoidance.cpp: 491"; rLen = 0; - rLoc = 12183; + rLoc = 12181; rType = 0; vrLen = 991; vrLoc = 11498; @@ -1984,7 +1993,7 @@ fRef = 6BD667D9123D28100021A7A4 /* CrowdManager.cpp */; fallbackIsa = XCBuildMessageTextBookmark; rLen = 1; - rLoc = 1229; + rLoc = 1234; rType = 1; }; 6BB9C240126F4DB200B97C1C /* PBXTextBookmark */ = { @@ -1992,7 +2001,7 @@ fRef = 6BD667D9123D28100021A7A4 /* CrowdManager.cpp */; name = "CrowdManager.cpp: 1225"; rLen = 0; - rLoc = 29474; + rLoc = 29311; rType = 0; vrLen = 824; vrLoc = 29149; @@ -2022,7 +2031,7 @@ fRef = 6BD667D9123D28100021A7A4 /* CrowdManager.cpp */; name = "CrowdManager.cpp: 1228"; rLen = 0; - rLoc = 29571; + rLoc = 29408; rType = 0; vrLen = 931; vrLoc = 29100; @@ -2042,29 +2051,11 @@ fRef = 6BD667D9123D28100021A7A4 /* CrowdManager.cpp */; name = "CrowdManager.cpp: 1226"; rLen = 0; - rLoc = 29558; + rLoc = 29395; rType = 0; vrLen = 898; vrLoc = 29100; }; - 6BB9C251126F555D00B97C1C /* DetourObstacleAvoidance.cpp:465 */ = { - isa = PBXFileBreakpoint; - actions = ( - ); - breakpointStyle = 0; - continueAfterActions = 0; - countType = 0; - delayBeforeContinue = 0; - fileReference = 6B9EFF0812281C3E00535FF1 /* DetourObstacleAvoidance.cpp */; - functionName = "dtObstacleAvoidanceQuery::sampleVelocityAdaptive(const float* pos, const float rad, const float vmax, const float* vel, const float* dvel, float* nvel, const int ndivs, const int nrings, const int depth, dtObstacleAvoidanceDebugData* debug)"; - hitCount = 1; - ignoreCount = 0; - lineNumber = 465; - location = Recast; - modificationTime = 309286240.829786; - originalNumberOfMultipleMatches = 1; - state = 1; - }; 6BB9C253126F555F00B97C1C /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 6B9EFF02122819E200535FF1 /* DetourObstacleAvoidance.h */; @@ -2080,7 +2071,7 @@ fRef = 6BD667D9123D28100021A7A4 /* CrowdManager.cpp */; name = "CrowdManager.cpp: 1224"; rLen = 0; - rLoc = 29429; + rLoc = 29266; rType = 0; vrLen = 931; vrLoc = 29100; @@ -2090,7 +2081,7 @@ fRef = 6B9EFF0812281C3E00535FF1 /* DetourObstacleAvoidance.cpp */; name = "DetourObstacleAvoidance.cpp: 480"; rLen = 0; - rLoc = 11817; + rLoc = 11815; rType = 0; vrLen = 1022; vrLoc = 11183; @@ -2110,7 +2101,7 @@ fRef = 6B9EFF0812281C3E00535FF1 /* DetourObstacleAvoidance.cpp */; name = "DetourObstacleAvoidance.cpp: 488"; rLen = 0; - rLoc = 12152; + rLoc = 12150; rType = 0; vrLen = 859; vrLoc = 11555; @@ -2120,11 +2111,313 @@ fRef = 6B9EFF0812281C3E00535FF1 /* DetourObstacleAvoidance.cpp */; name = "DetourObstacleAvoidance.cpp: 488"; rLen = 0; - rLoc = 12152; + rLoc = 12150; rType = 0; vrLen = 838; vrLoc = 11613; }; + 6BB9C280126F615D00B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9EFF0812281C3E00535FF1 /* DetourObstacleAvoidance.cpp */; + name = "DetourObstacleAvoidance.cpp: 11"; + rLen = 0; + rLoc = 595; + rType = 0; + vrLen = 1222; + vrLoc = 396; + }; + 6BB9C281126F615D00B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BD667D8123D27EC0021A7A4 /* CrowdManager.h */; + name = "CrowdManager.h: 183"; + rLen = 0; + rLoc = 4282; + rType = 0; + vrLen = 965; + vrLoc = 4383; + }; + 6BB9C282126F615D00B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BD667D9123D28100021A7A4 /* CrowdManager.cpp */; + name = "CrowdManager.cpp: 806"; + rLen = 0; + rLoc = 18530; + rType = 0; + vrLen = 1004; + vrLoc = 17945; + }; + 6BB9C283126F615D00B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BD667D9123D28100021A7A4 /* CrowdManager.cpp */; + name = "CrowdManager.cpp: 627"; + rLen = 0; + rLoc = 14253; + rType = 0; + vrLen = 752; + vrLoc = 13785; + }; + 6BB9C286126F617300B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BD667D9123D28100021A7A4 /* CrowdManager.cpp */; + name = "CrowdManager.cpp: 627"; + rLen = 0; + rLoc = 14253; + rType = 0; + vrLen = 752; + vrLoc = 13785; + }; + 6BB9C287126F618200B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */; + name = "main.cpp: 928"; + rLen = 0; + rLoc = 21426; + rType = 0; + vrLen = 437; + vrLoc = 2024; + }; + 6BB9C288126F618200B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BB9C289126F618200B97C1C /* asm __kill 0x94243eec */; + name = "asm __kill 0x94243eec: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 344; + vrLoc = 0; + }; + 6BB9C289126F618200B97C1C /* asm __kill 0x94243eec */ = { + isa = PBXFileReference; + path = "asm __kill 0x94243eec"; + sourceTree = ""; + }; + 6BB9C28A126F618200B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BD667D9123D28100021A7A4 /* CrowdManager.cpp */; + name = "CrowdManager.cpp: 628"; + rLen = 0; + rLoc = 14318; + rType = 0; + vrLen = 328; + vrLoc = 14125; + }; + 6BB9C28D126F61A900B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BD667D9123D28100021A7A4 /* CrowdManager.cpp */; + name = "CrowdManager.cpp: 628"; + rLen = 0; + rLoc = 14318; + rType = 0; + vrLen = 1025; + vrLoc = 12821; + }; + 6BB9C290126F61C100B97C1C /* CrowdManager.cpp:423 */ = { + isa = PBXFileBreakpoint; + actions = ( + ); + breakpointStyle = 0; + continueAfterActions = 0; + countType = 0; + delayBeforeContinue = 0; + fileReference = 6BD667D9123D28100021A7A4 /* CrowdManager.cpp */; + functionName = "PathCorridor::reset(dtPolyRef ref, const float* pos)"; + hitCount = 1; + ignoreCount = 0; + lineNumber = 423; + location = Recast; + modificationTime = 309289536.609455; + originalNumberOfMultipleMatches = 1; + state = 1; + }; + 6BB9C292126F61C300B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BD667D9123D28100021A7A4 /* CrowdManager.cpp */; + name = "CrowdManager.cpp: 423"; + rLen = 0; + rLoc = 9500; + rType = 0; + vrLen = 337; + vrLoc = 9246; + }; + 6BB9C293126F61C300B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BD667D9123D28100021A7A4 /* CrowdManager.cpp */; + name = "CrowdManager.cpp: 423"; + rLen = 0; + rLoc = 9500; + rType = 0; + vrLen = 339; + vrLoc = 9244; + }; + 6BB9C296126F61DD00B97C1C /* CrowdManager.cpp:765 */ = { + isa = PBXFileBreakpoint; + actions = ( + ); + breakpointStyle = 0; + continueAfterActions = 0; + countType = 0; + delayBeforeContinue = 0; + fileReference = 6BD667D9123D28100021A7A4 /* CrowdManager.cpp */; + functionName = "CrowdManager::reset()"; + hitCount = 1; + ignoreCount = 0; + lineNumber = 765; + location = Recast; + modificationTime = 309289522.186706; + originalNumberOfMultipleMatches = 1; + state = 1; + }; + 6BB9C29C126F620200B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BD667D9123D28100021A7A4 /* CrowdManager.cpp */; + name = "CrowdManager.cpp: 765"; + rLen = 0; + rLoc = 17749; + rType = 0; + vrLen = 1064; + vrLoc = 16995; + }; + 6BB9C29D126F620200B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BD667D9123D28100021A7A4 /* CrowdManager.cpp */; + name = "CrowdManager.cpp: 766"; + rLen = 0; + rLoc = 17774; + rType = 0; + vrLen = 852; + vrLoc = 17682; + }; + 6BB9C29F126F620E00B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BD667D9123D28100021A7A4 /* CrowdManager.cpp */; + name = "CrowdManager.cpp: 766"; + rLen = 0; + rLoc = 17774; + rType = 0; + vrLen = 852; + vrLoc = 17682; + }; + 6BB9C2A0126F620E00B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B6140FFA62BE004F1BC4 /* Sample.cpp */; + rLen = 0; + rLoc = 44; + rType = 1; + }; + 6BB9C2A1126F620E00B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B6140FFA62BE004F1BC4 /* Sample.cpp */; + name = "Sample.cpp: 45"; + rLen = 0; + rLoc = 1438; + rType = 0; + vrLen = 785; + vrLoc = 987; + }; + 6BB9C2A2126F623D00B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B6140FFA62BE004F1BC4 /* Sample.cpp */; + name = "Sample.cpp: 45"; + rLen = 0; + rLoc = 1438; + rType = 0; + vrLen = 785; + vrLoc = 987; + }; + 6BB9C2A3126F623D00B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BD667D9123D28100021A7A4 /* CrowdManager.cpp */; + rLen = 0; + rLoc = 411; + rType = 1; + }; + 6BB9C2A4126F623D00B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BD667D9123D28100021A7A4 /* CrowdManager.cpp */; + name = "CrowdManager.cpp: 412"; + rLen = 0; + rLoc = 9246; + rType = 0; + vrLen = 928; + vrLoc = 17245; + }; + 6BB9C2A5126F624E00B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BD667D9123D28100021A7A4 /* CrowdManager.cpp */; + name = "CrowdManager.cpp: 412"; + rLen = 0; + rLoc = 9246; + rType = 0; + vrLen = 1125; + vrLoc = 9146; + }; + 6BB9C2A6126F624E00B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9EFF0812281C3E00535FF1 /* DetourObstacleAvoidance.cpp */; + rLen = 0; + rLoc = 464; + rType = 1; + }; + 6BB9C2A7126F624E00B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9EFF0812281C3E00535FF1 /* DetourObstacleAvoidance.cpp */; + name = "DetourObstacleAvoidance.cpp: 465"; + rLen = 0; + rLoc = 11523; + rType = 0; + vrLen = 1225; + vrLoc = 10959; + }; + 6BB9C2AA126F62C000B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9EFF0812281C3E00535FF1 /* DetourObstacleAvoidance.cpp */; + name = "DetourObstacleAvoidance.cpp: 467"; + rLen = 0; + rLoc = 11554; + rType = 0; + vrLen = 1291; + vrLoc = 10959; + }; + 6BB9C2AB126F62C000B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BD667D9123D28100021A7A4 /* CrowdManager.cpp */; + name = "CrowdManager.cpp: 1119"; + rLen = 0; + rLoc = 26350; + rType = 0; + vrLen = 1591; + vrLoc = 25758; + }; + 6BB9C2AC126F62C000B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BD667D8123D27EC0021A7A4 /* CrowdManager.h */; + name = "CrowdManager.h: 218"; + rLen = 0; + rLoc = 5209; + rType = 0; + vrLen = 888; + vrLoc = 4741; + }; + 6BB9C2AD126F62C000B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BD667D8123D27EC0021A7A4 /* CrowdManager.h */; + name = "CrowdManager.h: 226"; + rLen = 0; + rLoc = 5327; + rType = 0; + vrLen = 871; + vrLoc = 4758; + }; + 6BB9C2B2126F641400B97C1C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BD667D8123D27EC0021A7A4 /* CrowdManager.h */; + name = "CrowdManager.h: 199"; + rLen = 0; + rLoc = 4799; + rType = 0; + vrLen = 961; + vrLoc = 4544; + }; 6BBB0361124E242E00533229 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 6BBB0362124E242E00533229 /* Matrix4.h */; @@ -2190,7 +2483,7 @@ ignoreCount = 0; lineNumber = 279; location = Recast; - modificationTime = 309286240.655807; + modificationTime = 309289473.17485; originalNumberOfMultipleMatches = 1; state = 1; }; @@ -2306,7 +2599,7 @@ ignoreCount = 0; lineNumber = 541; location = Recast; - modificationTime = 309286240.691116; + modificationTime = 309289473.220501; originalNumberOfMultipleMatches = 1; state = 1; }; @@ -2320,16 +2613,16 @@ }; 6BD667D8123D27EC0021A7A4 /* CrowdManager.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {931, 4147}}"; - sepNavSelRange = "{3459, 0}"; - sepNavVisRange = "{3180, 1135}"; + sepNavIntBoundsRect = "{{0, 0}, {931, 4186}}"; + sepNavSelRange = "{4799, 0}"; + sepNavVisRange = "{4544, 961}"; }; }; 6BD667D9123D28100021A7A4 /* CrowdManager.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {931, 16900}}"; - sepNavSelRange = "{29429, 0}"; - sepNavVisRange = "{29100, 931}"; + sepNavIntBoundsRect = "{{0, 0}, {931, 16991}}"; + sepNavSelRange = "{26350, 0}"; + sepNavVisRange = "{25758, 1591}"; sepNavWindowFrame = "{{15, 134}, {1120, 639}}"; }; }; @@ -2357,7 +2650,7 @@ ignoreCount = 0; lineNumber = 480; location = Recast; - modificationTime = 309286240.704872; + modificationTime = 309289473.234399; originalNumberOfMultipleMatches = 1; state = 1; }; diff --git a/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.perspectivev3 b/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.perspectivev3 index 370c415a..f368827c 100644 --- a/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.perspectivev3 +++ b/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.perspectivev3 @@ -284,14 +284,13 @@ PBXSmartGroupTreeModuleOutlineStateSelectionKey - 26 - 11 + 61 1 0 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey - {{0, 430}, {264, 660}} + {{0, 475}, {264, 660}} PBXTopSmartGroupGIDs @@ -326,7 +325,7 @@ PBXProjectModuleGUID 6B8632A30F78115100E2684A PBXProjectModuleLabel - DetourObstacleAvoidance.cpp + CrowdManager.h PBXSplitModuleInNavigatorKey Split0 @@ -334,11 +333,11 @@ PBXProjectModuleGUID 6B8632A40F78115100E2684A PBXProjectModuleLabel - DetourObstacleAvoidance.cpp + CrowdManager.h _historyCapacity 0 bookmark - 6BB9C262126F562C00B97C1C + 6BB9C2B2126F641400B97C1C history 6BBB4C34115B7A3D00CF791D @@ -404,7 +403,6 @@ 6BB2EE361261CEB800E350F8 6BB2EE3F1261D02000E350F8 6BB2EE661261D48100E350F8 - 6BB2EE671261D48100E350F8 6BB2EE691261D48100E350F8 6BB2EE731261DA0400E350F8 6BB2EE7B1264CD7900E350F8 @@ -426,11 +424,12 @@ 6B16360A126891A40083FC15 6BB9C228126F4A9100B97C1C 6BB9C229126F4A9100B97C1C - 6BB9C22A126F4A9100B97C1C 6BB9C22C126F4A9100B97C1C 6BB9C253126F555F00B97C1C - 6BB9C254126F555F00B97C1C - 6BB9C255126F555F00B97C1C + 6BB9C2A2126F623D00B97C1C + 6BB9C2AA126F62C000B97C1C + 6BB9C2AB126F62C000B97C1C + 6BB9C2AC126F62C000B97C1C SplitCount @@ -444,18 +443,18 @@ GeometryConfiguration Frame - {{0, 0}, {992, 530}} + {{0, 0}, {992, 673}} RubberWindowFrame 0 59 1278 719 0 0 1280 778 Module PBXNavigatorGroup Proportion - 530pt + 673pt Proportion - 143pt + 0pt Tabs @@ -523,7 +522,7 @@ GeometryConfiguration Frame - {{10, 27}, {992, 116}} + {{10, 27}, {992, -27}} RubberWindowFrame 0 59 1278 719 0 0 1280 778 @@ -744,7 +743,6 @@ 5 WindowOrderList - 6BB9C263126F562C00B97C1C 6BB9C1C9126B562300B97C1C 6BB9C1CA126B562300B97C1C /Users/memon/Code/recastnavigation/RecastDemo/Build/Xcode/Recast.xcodeproj diff --git a/RecastDemo/Include/CrowdManager.h b/RecastDemo/Include/CrowdManager.h index ed017904..57aac20a 100644 --- a/RecastDemo/Include/CrowdManager.h +++ b/RecastDemo/Include/CrowdManager.h @@ -68,10 +68,6 @@ public: -static const int AGENT_MAX_PATH = 256; -static const int AGENT_MAX_CORNERS = 4; -static const int AGENT_MAX_TRAIL = 64; -static const int AGENT_MAX_NEIS = 8; static const unsigned int PATHQ_INVALID = 0; @@ -86,13 +82,15 @@ typedef unsigned int PathQueueRef; class PathQueue { + static const int PQ_MAX_PATH = 256; + struct PathQuery { // Path find start and end location. float startPos[3], endPos[3]; dtPolyRef startRef, endRef; // Result. - dtPolyRef path[AGENT_MAX_PATH]; + dtPolyRef path[PQ_MAX_PATH]; bool ready; int npath; PathQueueRef ref; @@ -124,19 +122,18 @@ class PathCorridor float m_pos[3]; float m_target[3]; - dtPolyRef m_path[AGENT_MAX_PATH]; + dtPolyRef* m_path; int m_npath; + int m_maxPath; public: PathCorridor(); ~PathCorridor(); - void init(dtPolyRef ref, const float* pos); + bool init(const int maxPath); + + void reset(dtPolyRef ref, const float* pos); -/* void updateCorners(const float pathOptimizationRange, - dtNavMeshQuery* navquery, const dtQueryFilter* filter, - float* opts = 0, float* opte = 0);*/ - int findCorners(float* cornerVerts, unsigned char* cornerFlags, dtPolyRef* cornerPolys, const int maxCorners, dtNavMeshQuery* navquery, const dtQueryFilter* filter); @@ -178,7 +175,7 @@ public: LocalBoundary(); ~LocalBoundary(); - void init(); + void reset(); void update(dtPolyRef ref, const float* pos, const float collisionQueryRange, dtNavMeshQuery* navquery, const dtQueryFilter* filter); @@ -188,7 +185,10 @@ public: inline const float* getSegment(int i) const { return m_segs[i].s; } }; -static const int MAX_NEIGHBOURS = 6; + +static const int AGENT_MAX_NEIGHBOURS = 6; +static const int AGENT_MAX_CORNERS = 4; +static const int AGENT_MAX_TRAIL = 64; struct Neighbour { @@ -198,22 +198,24 @@ struct Neighbour struct Agent { - unsigned char active; - - PathCorridor corridor; - LocalBoundary boundary; - void integrate(const float maxAcc, const float dt); void calcSmoothSteerDirection(float* dir); void calcStraightSteerDirection(float* dir); float getDistanceToGoal(const float range) const; + unsigned char active; + + PathCorridor corridor; + LocalBoundary boundary; float maxspeed; float t; float var; - - Neighbour neis[MAX_NEIGHBOURS]; + + float collisionQueryRange; + float pathOptimizationRange; + + Neighbour neis[AGENT_MAX_NEIGHBOURS]; int nneis; float radius, height; @@ -222,8 +224,6 @@ struct Agent float dvel[3]; float nvel[3]; float vel[3]; - float collisionQueryRange; - float pathOptimizationRange; float cornerVerts[AGENT_MAX_CORNERS*3]; unsigned char cornerFlags[AGENT_MAX_CORNERS]; @@ -254,6 +254,9 @@ class CrowdManager PathQueue m_pathq; ProximityGrid m_grid; + dtPolyRef* m_pathResult; + int m_maxPathResult; + float m_ext[3]; dtQueryFilter m_filter; diff --git a/RecastDemo/Source/CrowdManager.cpp b/RecastDemo/Source/CrowdManager.cpp index ae094c06..d2624fd0 100644 --- a/RecastDemo/Source/CrowdManager.cpp +++ b/RecastDemo/Source/CrowdManager.cpp @@ -216,7 +216,8 @@ void PathQueue::update(dtNavMeshQuery* navquery) PathQuery& q = m_queue[i]; if (q.ref == PATHQ_INVALID) continue; - q.npath = navquery->findPath(q.startRef, q.endRef, q.startPos, q.endPos, q.filter, q.path, AGENT_MAX_PATH); + q.npath = navquery->findPath(q.startRef, q.endRef, q.startPos, q.endPos, + q.filter, q.path, PQ_MAX_PATH); q.ready = true; break; } @@ -394,17 +395,32 @@ static int mergeCorridor(dtPolyRef* path, const int npath, const int maxPath, } PathCorridor::PathCorridor() : - m_npath(0) + m_path(0), + m_npath(0), + m_maxPath(0) { } PathCorridor::~PathCorridor() { + dtFree(m_path); } -void PathCorridor::init(dtPolyRef ref, const float* pos) +bool PathCorridor::init(const int maxPath) { + dtAssert(!m_path); + m_path = (dtPolyRef*)dtAlloc(sizeof(dtPolyRef)*maxPath, DT_ALLOC_PERM); + if (!m_path) + return false; + m_npath = 0; + m_maxPath = maxPath; + return true; +} + +void PathCorridor::reset(dtPolyRef ref, const float* pos) +{ + dtAssert(m_path); dtVcopy(m_pos, pos); dtVcopy(m_target, pos); m_path[0] = ref; @@ -415,6 +431,7 @@ int PathCorridor::findCorners(float* cornerVerts, unsigned char* cornerFlags, dtPolyRef* cornerPolys, const int maxCorners, dtNavMeshQuery* navquery, const dtQueryFilter* filter) { + dtAssert(m_path); dtAssert(m_npath); static const float MIN_TARGET_DIST = 0.01f; @@ -453,6 +470,8 @@ int PathCorridor::findCorners(float* cornerVerts, unsigned char* cornerFlags, void PathCorridor::optimizePath(const float* next, const float pathOptimizationRange, dtNavMeshQuery* navquery, const dtQueryFilter* filter) { + dtAssert(m_path); + // Clamp the ray to max distance. float goal[3]; dtVcopy(goal, next); @@ -476,43 +495,13 @@ void PathCorridor::optimizePath(const float* next, const float pathOptimizationR const int nres = navquery->raycast(m_path[0], m_pos, goal, filter, t, norm, res, MAX_RES); if (nres > 1 && t > 0.99f) { - m_npath = mergeCorridor(m_path, m_npath, AGENT_MAX_PATH, res, nres); + m_npath = mergeCorridor(m_path, m_npath, m_maxPath, res, nres); } } -/*void PathCorridor::updateCorners(const float pathOptimizationRange, - dtNavMeshQuery* navquery, const dtQueryFilter* filter, - float* opts, float* opte) -{ - dtAssert(m_npath); - - m_ncorners = 0; - if (opts) - dtVset(opts, 0,0,0); - if (opte) - dtVset(opte, 0,0,0); - - // Find next couple of corners for steering. - m_ncorners = findCorners(m_pos, m_target, m_path, m_npath, - m_cornerVerts, m_cornerFlags, m_cornerPolys, - AGENT_MAX_CORNERS, navquery); - - // Check to see if the corner after the next corner is directly visible, - // and short cut to there. - if (m_ncorners > 1) - { - if (opts) - dtVcopy(opts, m_pos); - if (opte) - dtVcopy(opte, m_cornerVerts+3); - - m_npath = optimizePath(m_pos, m_cornerVerts+3, pathOptimizationRange, - m_path, m_npath, navquery, filter); - } -}*/ - void PathCorridor::updatePosition(const float* npos, dtNavMeshQuery* navquery, const dtQueryFilter* filter) { + dtAssert(m_path); dtAssert(m_npath); // Move along navmesh and update new position. @@ -521,7 +510,7 @@ void PathCorridor::updatePosition(const float* npos, dtNavMeshQuery* navquery, c dtPolyRef visited[MAX_VISITED]; int nvisited = navquery->moveAlongSurface(m_path[0], m_pos, npos, filter, result, visited, MAX_VISITED); - m_npath = fixupCorridor(m_path, m_npath, AGENT_MAX_PATH, visited, nvisited); + m_npath = fixupCorridor(m_path, m_npath, m_maxPath, visited, nvisited); // Adjust agent height to stay on top of the navmesh. float h = m_pos[1]; @@ -532,8 +521,10 @@ void PathCorridor::updatePosition(const float* npos, dtNavMeshQuery* navquery, c void PathCorridor::setCorridor(const float* target, const dtPolyRef* path, const int npath) { + dtAssert(m_path); dtAssert(npath > 0); - dtAssert(npath < AGENT_MAX_PATH); + dtAssert(npath < m_maxPath); + dtVcopy(m_target, target); memcpy(m_path, path, sizeof(dtPolyRef)*npath); m_npath = npath; @@ -628,7 +619,7 @@ LocalBoundary::~LocalBoundary() { } -void LocalBoundary::init() +void LocalBoundary::reset() { dtVset(m_center, FLT_MAX,FLT_MAX,FLT_MAX); m_nsegs = 0; @@ -715,6 +706,8 @@ void LocalBoundary::update(dtPolyRef ref, const float* pos, const float collisio CrowdManager::CrowdManager() : m_obstacleQuery(0), + m_pathResult(0), + m_maxPathResult(0), m_totalTime(0), m_rvoTime(0), m_sampleCount(0), @@ -741,6 +734,16 @@ CrowdManager::CrowdManager() : m_vodebug[i] = dtAllocObstacleAvoidanceDebugData(); m_vodebug[i]->init(sampleCount); } + + // Allocate temp buffer for merging paths. + m_maxPathResult = 256; + m_pathResult = (dtPolyRef*)dtAlloc(sizeof(dtPolyRef)*m_maxPathResult, DT_ALLOC_PERM); + + // Alloca corridors. + for (int i = 0; i < MAX_AGENTS; ++i) + { + m_agents[i].corridor.init(m_maxPathResult); + } // TODO: the radius should be related to the agent radius used to create the navmesh! m_grid.init(100, 1.0f); @@ -750,6 +753,8 @@ CrowdManager::CrowdManager() : CrowdManager::~CrowdManager() { + delete [] m_pathResult; + for (int i = 0; i < MAX_AGENTS; ++i) dtFreeObstacleAvoidanceDebugData(m_vodebug[i]); dtFreeObstacleAvoidanceQuery(m_obstacleQuery); @@ -758,7 +763,7 @@ CrowdManager::~CrowdManager() void CrowdManager::reset() { for (int i = 0; i < MAX_AGENTS; ++i) - memset(&m_agents[i], 0, sizeof(Agent)); + m_agents[i].active = 0; } const int CrowdManager::getAgentCount() const @@ -797,8 +802,8 @@ int CrowdManager::addAgent(const float* pos, const float radius, const float hei return -1; } - ag->corridor.init(ref, nearest); - ag->boundary.init(); + ag->corridor.reset(ref, nearest); + ag->boundary.reset(); ag->radius = radius; ag->height = height; @@ -1005,9 +1010,9 @@ void CrowdManager::updateMoveRequest(const float dt, dtNavMeshQuery* navquery) float targetPos[3]; dtVcopy(targetPos, req->pos); + dtPolyRef* res = m_pathResult; bool valid = true; - dtPolyRef res[AGENT_MAX_PATH]; - int nres = m_pathq.getPathResult(req->pathqRef, res, AGENT_MAX_PATH); + int nres = m_pathq.getPathResult(req->pathqRef, res, m_maxPathResult); if (!nres) valid = false; @@ -1028,8 +1033,8 @@ void CrowdManager::updateMoveRequest(const float dt, dtNavMeshQuery* navquery) if (npath > 1) { // Make space for the old path. - if ((npath-1)+nres > AGENT_MAX_PATH) - nres = AGENT_MAX_PATH - (npath-1); + if ((npath-1)+nres > m_maxPathResult) + nres = m_maxPathResult - (npath-1); memmove(res+npath-1, res, sizeof(dtPolyRef)*nres); // Copy old path in the beginning. memcpy(res, path, sizeof(dtPolyRef)*(npath-1)); @@ -1112,7 +1117,7 @@ void CrowdManager::update(const float dt, unsigned int flags, dtNavMeshQuery* na if (dtVdist2DSqr(ag->npos, ag->boundary.getCenter()) > dtSqr(ag->collisionQueryRange*0.25f)) ag->boundary.update(ag->corridor.getFirstPoly(), ag->npos, ag->collisionQueryRange, navquery, &m_filter); // Query neighbour agents - ag->nneis = getNeighbours(ag->npos, ag->height, ag->collisionQueryRange, ag, ag->neis, MAX_NEIGHBOURS); + ag->nneis = getNeighbours(ag->npos, ag->height, ag->collisionQueryRange, ag, ag->neis, AGENT_MAX_NEIGHBOURS); } // Find next corner to steer to. @@ -1126,9 +1131,9 @@ void CrowdManager::update(const float dt, unsigned int flags, dtNavMeshQuery* na // Check to see if the corner after the next corner is directly visible, // and short cut to there. - if (ag->ncorners > 1) + if (ag->ncorners > 0) { - const float* target = ag->cornerVerts+3; + const float* target = &ag->cornerVerts[dtMin(1,ag->ncorners-1)*3]; dtVcopy(ag->opts, ag->corridor.getPos()); dtVcopy(ag->opte, target); ag->corridor.optimizePath(target, ag->pathOptimizationRange, navquery, &m_filter); @@ -1139,7 +1144,7 @@ void CrowdManager::update(const float dt, unsigned int flags, dtNavMeshQuery* na dtVset(ag->opte, 0,0,0); } -// ag->corridor.updateCorners(ag->pathOptimizationRange, navquery, &m_filter, ag->opts, ag->opte); + // Copy data for debug purposes. } // Calculate steering.