diff --git a/Recast/Include/RecastDebugDraw.h b/Recast/Include/RecastDebugDraw.h index 21353a3..b90d0ec 100644 --- a/Recast/Include/RecastDebugDraw.h +++ b/Recast/Include/RecastDebugDraw.h @@ -37,8 +37,8 @@ inline void intToCol(int i, float* col) void rcDebugDrawHeightfieldSolid(const struct rcHeightfield& hf); void rcDebugDrawHeightfieldWalkable(const struct rcHeightfield& hf); -void rcDebugDrawMesh(const class rcMeshLoaderObj& mesh, const unsigned char* flags); -void rcDebugDrawMeshSlope(const class rcMeshLoaderObj& mesh, const float walkableSlopeAngle); +void rcDebugDrawMesh(const float* verts, int nverts, const int* tris, const float* normals, int ntris, const unsigned char* flags); +void rcDebugDrawMeshSlope(const float* verts, int nverts, const int* tris, const float* normals, int ntris, const float walkableSlopeAngle); void rcDebugDrawCompactHeightfieldSolid(const struct rcCompactHeightfield& chf); void rcDebugDrawCompactHeightfieldRegions(const struct rcCompactHeightfield& chf); diff --git a/Recast/Source/RecastDebugDraw.cpp b/Recast/Source/RecastDebugDraw.cpp index 57e7f8f..bbc69ea 100644 --- a/Recast/Source/RecastDebugDraw.cpp +++ b/Recast/Source/RecastDebugDraw.cpp @@ -24,15 +24,12 @@ #include "MeshLoaderObj.h" #include "Recast.h" -void rcDebugDrawMesh(const rcMeshLoaderObj& mesh, const unsigned char* flags) -{ - int nt = mesh.getTriCount(); - const float* verts = mesh.getVerts(); - const float* normals = mesh.getNormals(); - const int* tris = mesh.getTris(); - +void rcDebugDrawMesh(const float* verts, int nverts, + const int* tris, const float* normals, int ntris, + const unsigned char* flags) +{ glBegin(GL_TRIANGLES); - for (int i = 0; i < nt*3; i += 3) + for (int i = 0; i < ntris*3; i += 3) { float a = (2+normals[i+0]+normals[i+1])/4; if (flags && !flags[i/3]) @@ -46,17 +43,14 @@ void rcDebugDrawMesh(const rcMeshLoaderObj& mesh, const unsigned char* flags) glEnd(); } -void rcDebugDrawMeshSlope(const rcMeshLoaderObj& mesh, const float walkableSlopeAngle) +void rcDebugDrawMeshSlope(const float* verts, int nverts, + const int* tris, const float* normals, int ntris, + const float walkableSlopeAngle) { const float walkableThr = cosf(walkableSlopeAngle/180.0f*(float)M_PI); - const int nt = mesh.getTriCount(); - const float* verts = mesh.getVerts(); - const float* normals = mesh.getNormals(); - const int* tris = mesh.getTris(); - glBegin(GL_TRIANGLES); - for (int i = 0; i < nt*3; i += 3) + for (int i = 0; i < ntris*3; i += 3) { const float* norm = &normals[i]; float a = (2+norm[0]+norm[1])/4; diff --git a/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.pbxuser b/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.pbxuser index 56a1f3f..783e036 100644 --- a/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.pbxuser +++ b/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.pbxuser @@ -1,7 +1,7 @@ // !$*UTF8*$! { 29B97313FDCFA39411CA2CEA /* Project object */ = { - activeBuildConfigurationName = Release; + activeBuildConfigurationName = Debug; activeExecutable = 6B8632970F78114600E2684A /* Recast */; activeTarget = 8D1107260486CEB800E47090 /* Recast */; addToTargets = ( @@ -99,81 +99,489 @@ PBXFileDataSource_Target_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 266835565; - PBXWorkspaceStateSaveDate = 266835565; + PBXPerProjectTemplateStateSaveDate = 268039919; + PBXWorkspaceStateSaveDate = 268039919; }; perUserProjectItems = { - 6B09CDFF0FD5563E005637D5 = 6B09CDFF0FD5563E005637D5 /* PBXTextBookmark */; - 6B09CE1E0FD55805005637D5 = 6B09CE1E0FD55805005637D5 /* PBXTextBookmark */; - 6B09CE2D0FD55B4D005637D5 = 6B09CE2D0FD55B4D005637D5 /* PBXTextBookmark */; 6B09CE5C0FD5BDE6005637D5 = 6B09CE5C0FD5BDE6005637D5 /* PBXTextBookmark */; 6B09CE5F0FD5BDE6005637D5 = 6B09CE5F0FD5BDE6005637D5 /* PBXTextBookmark */; 6B09CE730FD5BEC3005637D5 = 6B09CE730FD5BEC3005637D5 /* PBXTextBookmark */; - 6B164B240FD678A500D2F919 = 6B164B240FD678A500D2F919 /* PBXTextBookmark */; - 6B164B250FD678A500D2F919 = 6B164B250FD678A500D2F919 /* PBXTextBookmark */; - 6B164B260FD678A500D2F919 = 6B164B260FD678A500D2F919 /* PBXTextBookmark */; - 6B164B320FD678A500D2F919 = 6B164B320FD678A500D2F919 /* PBXTextBookmark */; - 6B164B330FD678A500D2F919 = 6B164B330FD678A500D2F919 /* PBXTextBookmark */; - 6B164B3C0FD678A500D2F919 = 6B164B3C0FD678A500D2F919 /* PBXTextBookmark */; 6B1E02680F924A8500CC0038 = 6B1E02680F924A8500CC0038 /* PBXTextBookmark */; 6B1E02750F924A8500CC0038 = 6B1E02750F924A8500CC0038 /* PBXTextBookmark */; 6B1E028F0F924D5A00CC0038 = 6B1E028F0F924D5A00CC0038 /* PBXTextBookmark */; 6B1E029B0F924D8B00CC0038 = 6B1E029B0F924D8B00CC0038 /* PBXTextBookmark */; 6B1E02FC0F92563500CC0038 = 6B1E02FC0F92563500CC0038 /* PBXTextBookmark */; 6B1E032E0F925D9100CC0038 = 6B1E032E0F925D9100CC0038 /* PBXTextBookmark */; + 6B25B3A60FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3A60FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3A70FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3A70FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3A80FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3A80FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3A90FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3A90FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3AA0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3AA0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3AB0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3AB0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3AC0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3AC0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3AD0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3AD0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3AE0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3AE0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3AF0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3AF0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3B00FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3B00FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3B10FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3B10FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3B20FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3B20FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3B30FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3B30FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3B40FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3B40FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3B60FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3B60FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3B70FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3B70FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3B80FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3B80FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3B90FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3B90FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3BA0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3BA0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3BB0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3BB0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3BC0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3BC0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3BD0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3BD0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3BE0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3BE0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3BF0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3BF0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3C00FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3C00FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3C10FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3C10FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3C20FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3C20FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3C30FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3C30FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3C40FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3C40FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3C50FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3C50FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3C60FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3C60FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3C70FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3C70FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3C80FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3C80FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3C90FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3C90FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3CA0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3CA0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3CB0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3CB0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3CC0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3CC0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3CD0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3CD0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3CE0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3CE0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3CF0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3CF0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3D00FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3D00FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3D10FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3D10FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3D20FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3D20FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3D30FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3D30FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3D40FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3D40FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3D50FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3D50FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3D60FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3D60FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3D70FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3D70FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3D80FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3D80FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3D90FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3D90FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3DA0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3DA0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3DB0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3DB0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3DC0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3DC0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3DD0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3DD0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3DE0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3DE0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3DF0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3DF0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3E00FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3E00FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3E10FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3E10FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3E20FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3E20FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3E30FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3E30FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3E40FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3E40FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3E50FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3E50FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3E60FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3E60FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3E70FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3E70FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3E80FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3E80FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3E90FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3E90FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3EA0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3EA0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3EB0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3EB0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3EC0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3EC0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3ED0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3ED0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3EE0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3EE0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3EF0FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3EF0FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3F00FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3F00FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3F10FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3F10FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3F20FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3F20FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3F30FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3F30FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3F40FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3F40FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3F50FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3F50FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3F70FFA124D004F1BC4 /* PBXTextBookmark */ = 6B25B3F70FFA124D004F1BC4 /* PBXTextBookmark */; + 6B25B3F80FFA1250004F1BC4 /* PBXTextBookmark */ = 6B25B3F80FFA1250004F1BC4 /* PBXTextBookmark */; + 6B25B4020FFA126F004F1BC4 /* PBXTextBookmark */ = 6B25B4020FFA126F004F1BC4 /* PBXTextBookmark */; + 6B25B4050FFA137B004F1BC4 /* PBXTextBookmark */ = 6B25B4050FFA137B004F1BC4 /* PBXTextBookmark */; + 6B25B4060FFA13E9004F1BC4 /* PBXTextBookmark */ = 6B25B4060FFA13E9004F1BC4 /* PBXTextBookmark */; + 6B25B4070FFA13E9004F1BC4 /* PBXTextBookmark */ = 6B25B4070FFA13E9004F1BC4 /* PBXTextBookmark */; + 6B25B4080FFA13E9004F1BC4 /* PBXTextBookmark */ = 6B25B4080FFA13E9004F1BC4 /* PBXTextBookmark */; + 6B25B4090FFA13E9004F1BC4 /* PBXTextBookmark */ = 6B25B4090FFA13E9004F1BC4 /* PBXTextBookmark */; + 6B25B40D0FFA1545004F1BC4 /* PBXTextBookmark */ = 6B25B40D0FFA1545004F1BC4 /* PBXTextBookmark */; + 6B25B40E0FFA1545004F1BC4 /* PBXTextBookmark */ = 6B25B40E0FFA1545004F1BC4 /* PBXTextBookmark */; + 6B25B40F0FFA1545004F1BC4 /* PBXTextBookmark */ = 6B25B40F0FFA1545004F1BC4 /* PBXTextBookmark */; + 6B25B4100FFA1545004F1BC4 /* PBXTextBookmark */ = 6B25B4100FFA1545004F1BC4 /* PBXTextBookmark */; + 6B25B4110FFA1545004F1BC4 /* PBXTextBookmark */ = 6B25B4110FFA1545004F1BC4 /* PBXTextBookmark */; + 6B25B4120FFA1545004F1BC4 /* PBXTextBookmark */ = 6B25B4120FFA1545004F1BC4 /* PBXTextBookmark */; + 6B25B4130FFA1545004F1BC4 /* PBXTextBookmark */ = 6B25B4130FFA1545004F1BC4 /* PBXTextBookmark */; + 6B25B4140FFA1545004F1BC4 /* PBXTextBookmark */ = 6B25B4140FFA1545004F1BC4 /* PBXTextBookmark */; + 6B25B4150FFA1545004F1BC4 /* PBXTextBookmark */ = 6B25B4150FFA1545004F1BC4 /* PBXTextBookmark */; + 6B25B4160FFA1545004F1BC4 /* PBXTextBookmark */ = 6B25B4160FFA1545004F1BC4 /* PBXTextBookmark */; + 6B25B4170FFA1548004F1BC4 /* PBXTextBookmark */ = 6B25B4170FFA1548004F1BC4 /* PBXTextBookmark */; + 6B25B4180FFA1548004F1BC4 /* PBXTextBookmark */ = 6B25B4180FFA1548004F1BC4 /* PBXTextBookmark */; + 6B25B41A0FFA156D004F1BC4 /* PBXTextBookmark */ = 6B25B41A0FFA156D004F1BC4 /* PBXTextBookmark */; + 6B25B41C0FFA1579004F1BC4 /* PBXTextBookmark */ = 6B25B41C0FFA1579004F1BC4 /* PBXTextBookmark */; + 6B25B41E0FFA1596004F1BC4 /* PBXTextBookmark */ = 6B25B41E0FFA1596004F1BC4 /* PBXTextBookmark */; + 6B25B41F0FFA16A6004F1BC4 /* PBXTextBookmark */ = 6B25B41F0FFA16A6004F1BC4 /* PBXTextBookmark */; + 6B25B4200FFA16A6004F1BC4 /* PBXTextBookmark */ = 6B25B4200FFA16A6004F1BC4 /* PBXTextBookmark */; + 6B25B4210FFA16A6004F1BC4 /* PBXTextBookmark */ = 6B25B4210FFA16A6004F1BC4 /* PBXTextBookmark */; + 6B25B4220FFA16A6004F1BC4 /* PBXTextBookmark */ = 6B25B4220FFA16A6004F1BC4 /* PBXTextBookmark */; + 6B25B4230FFA16A6004F1BC4 /* PBXTextBookmark */ = 6B25B4230FFA16A6004F1BC4 /* PBXTextBookmark */; + 6B25B4260FFA16C0004F1BC4 /* PBXTextBookmark */ = 6B25B4260FFA16C0004F1BC4 /* PBXTextBookmark */; + 6B25B4270FFA16C0004F1BC4 /* PBXTextBookmark */ = 6B25B4270FFA16C0004F1BC4 /* PBXTextBookmark */; + 6B25B4280FFA16C0004F1BC4 /* PBXTextBookmark */ = 6B25B4280FFA16C0004F1BC4 /* PBXTextBookmark */; + 6B25B4290FFA16C0004F1BC4 /* PBXTextBookmark */ = 6B25B4290FFA16C0004F1BC4 /* PBXTextBookmark */; + 6B25B42A0FFA16C2004F1BC4 /* PBXTextBookmark */ = 6B25B42A0FFA16C2004F1BC4 /* PBXTextBookmark */; + 6B25B42B0FFA16C5004F1BC4 /* PBXTextBookmark */ = 6B25B42B0FFA16C5004F1BC4 /* PBXTextBookmark */; + 6B25B42D0FFA16D4004F1BC4 /* PBXTextBookmark */ = 6B25B42D0FFA16D4004F1BC4 /* PBXTextBookmark */; + 6B25B42F0FFA16DF004F1BC4 /* PBXTextBookmark */ = 6B25B42F0FFA16DF004F1BC4 /* PBXTextBookmark */; + 6B25B4300FFA16EB004F1BC4 /* PBXTextBookmark */ = 6B25B4300FFA16EB004F1BC4 /* PBXTextBookmark */; + 6B25B4310FFA16EB004F1BC4 /* PBXTextBookmark */ = 6B25B4310FFA16EB004F1BC4 /* PBXTextBookmark */; + 6B25B4320FFA16FD004F1BC4 /* PBXTextBookmark */ = 6B25B4320FFA16FD004F1BC4 /* PBXTextBookmark */; + 6B25B4340FFA174A004F1BC4 /* PBXTextBookmark */ = 6B25B4340FFA174A004F1BC4 /* PBXTextBookmark */; + 6B25B4350FFA174A004F1BC4 /* PBXTextBookmark */ = 6B25B4350FFA174A004F1BC4 /* PBXTextBookmark */; + 6B25B4360FFA174A004F1BC4 /* PBXTextBookmark */ = 6B25B4360FFA174A004F1BC4 /* PBXTextBookmark */; + 6B25B4370FFA174A004F1BC4 /* PBXTextBookmark */ = 6B25B4370FFA174A004F1BC4 /* PBXTextBookmark */; + 6B25B4380FFA174A004F1BC4 /* PBXTextBookmark */ = 6B25B4380FFA174A004F1BC4 /* PBXTextBookmark */; + 6B25B4390FFA174C004F1BC4 /* PBXTextBookmark */ = 6B25B4390FFA174C004F1BC4 /* PBXTextBookmark */; + 6B25B43A0FFA174D004F1BC4 /* PBXTextBookmark */ = 6B25B43A0FFA174D004F1BC4 /* PBXTextBookmark */; + 6B25B43B0FFA1757004F1BC4 /* PBXTextBookmark */ = 6B25B43B0FFA1757004F1BC4 /* PBXTextBookmark */; + 6B25B43D0FFA1786004F1BC4 /* PBXTextBookmark */ = 6B25B43D0FFA1786004F1BC4 /* PBXTextBookmark */; + 6B25B43E0FFA1786004F1BC4 /* PBXTextBookmark */ = 6B25B43E0FFA1786004F1BC4 /* PBXTextBookmark */; + 6B25B43F0FFA1786004F1BC4 /* PBXTextBookmark */ = 6B25B43F0FFA1786004F1BC4 /* PBXTextBookmark */; + 6B25B4400FFA1786004F1BC4 /* PBXTextBookmark */ = 6B25B4400FFA1786004F1BC4 /* PBXTextBookmark */; + 6B25B4410FFA1786004F1BC4 /* PBXTextBookmark */ = 6B25B4410FFA1786004F1BC4 /* PBXTextBookmark */; + 6B25B4420FFA1786004F1BC4 /* PBXTextBookmark */ = 6B25B4420FFA1786004F1BC4 /* PBXTextBookmark */; + 6B25B4430FFA1786004F1BC4 /* PBXTextBookmark */ = 6B25B4430FFA1786004F1BC4 /* PBXTextBookmark */; + 6B25B4440FFA1789004F1BC4 /* PBXTextBookmark */ = 6B25B4440FFA1789004F1BC4 /* PBXTextBookmark */; + 6B25B4450FFA178A004F1BC4 /* PBXTextBookmark */ = 6B25B4450FFA178A004F1BC4 /* PBXTextBookmark */; + 6B25B4460FFA178F004F1BC4 /* PBXTextBookmark */ = 6B25B4460FFA178F004F1BC4 /* PBXTextBookmark */; + 6B25B4470FFA178F004F1BC4 /* PBXTextBookmark */ = 6B25B4470FFA178F004F1BC4 /* PBXTextBookmark */; + 6B25B44B0FFA1968004F1BC4 /* PBXTextBookmark */ = 6B25B44B0FFA1968004F1BC4 /* PBXTextBookmark */; + 6B25B44C0FFA1968004F1BC4 /* PBXTextBookmark */ = 6B25B44C0FFA1968004F1BC4 /* PBXTextBookmark */; + 6B25B44D0FFA1968004F1BC4 /* PBXTextBookmark */ = 6B25B44D0FFA1968004F1BC4 /* PBXTextBookmark */; + 6B25B44E0FFA1968004F1BC4 /* PBXTextBookmark */ = 6B25B44E0FFA1968004F1BC4 /* PBXTextBookmark */; + 6B25B44F0FFA1968004F1BC4 /* PBXTextBookmark */ = 6B25B44F0FFA1968004F1BC4 /* PBXTextBookmark */; + 6B25B4500FFA1968004F1BC4 /* PBXTextBookmark */ = 6B25B4500FFA1968004F1BC4 /* PBXTextBookmark */; + 6B25B4510FFA1968004F1BC4 /* PBXTextBookmark */ = 6B25B4510FFA1968004F1BC4 /* PBXTextBookmark */; + 6B25B4520FFA1968004F1BC4 /* PBXTextBookmark */ = 6B25B4520FFA1968004F1BC4 /* PBXTextBookmark */; + 6B25B4530FFA1968004F1BC4 /* PBXTextBookmark */ = 6B25B4530FFA1968004F1BC4 /* PBXTextBookmark */; + 6B25B4540FFA1968004F1BC4 /* PBXTextBookmark */ = 6B25B4540FFA1968004F1BC4 /* PBXTextBookmark */; + 6B25B4550FFA1968004F1BC4 /* PBXTextBookmark */ = 6B25B4550FFA1968004F1BC4 /* PBXTextBookmark */; + 6B25B4560FFA1968004F1BC4 /* PBXTextBookmark */ = 6B25B4560FFA1968004F1BC4 /* PBXTextBookmark */; + 6B25B4570FFA1968004F1BC4 /* PBXTextBookmark */ = 6B25B4570FFA1968004F1BC4 /* PBXTextBookmark */; + 6B25B4580FFA1968004F1BC4 /* PBXTextBookmark */ = 6B25B4580FFA1968004F1BC4 /* PBXTextBookmark */; + 6B25B4590FFA1968004F1BC4 /* PBXTextBookmark */ = 6B25B4590FFA1968004F1BC4 /* PBXTextBookmark */; + 6B25B45A0FFA1968004F1BC4 /* PBXTextBookmark */ = 6B25B45A0FFA1968004F1BC4 /* PBXTextBookmark */; + 6B25B45B0FFA1968004F1BC4 /* PBXTextBookmark */ = 6B25B45B0FFA1968004F1BC4 /* PBXTextBookmark */; + 6B25B45C0FFA196A004F1BC4 /* PBXTextBookmark */ = 6B25B45C0FFA196A004F1BC4 /* PBXTextBookmark */; + 6B25B45D0FFA196B004F1BC4 /* PBXTextBookmark */ = 6B25B45D0FFA196B004F1BC4 /* PBXTextBookmark */; + 6B25B4610FFA19A0004F1BC4 /* PBXTextBookmark */ = 6B25B4610FFA19A0004F1BC4 /* PBXTextBookmark */; + 6B25B4620FFA19BE004F1BC4 /* PBXTextBookmark */ = 6B25B4620FFA19BE004F1BC4 /* PBXTextBookmark */; + 6B25B4630FFA19BE004F1BC4 /* PBXTextBookmark */ = 6B25B4630FFA19BE004F1BC4 /* PBXTextBookmark */; + 6B25B4710FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B4710FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B4720FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B4720FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B4730FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B4730FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B4740FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B4740FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B4750FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B4750FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B4760FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B4760FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B4770FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B4770FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B4780FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B4780FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B4790FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B4790FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B47A0FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B47A0FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B47B0FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B47B0FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B47C0FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B47C0FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B47D0FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B47D0FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B47E0FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B47E0FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B47F0FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B47F0FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B4800FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B4800FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B4810FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B4810FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B4820FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B4820FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B4830FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B4830FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B4840FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B4840FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B4850FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B4850FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B4860FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B4860FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B4870FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B4870FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B4880FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B4880FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B4890FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B4890FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B48A0FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B48A0FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B48B0FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B48B0FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B48C0FFA1FE0004F1BC4 /* PBXTextBookmark */ = 6B25B48C0FFA1FE0004F1BC4 /* PBXTextBookmark */; + 6B25B48D0FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B48D0FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B48E0FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B48E0FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B48F0FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B48F0FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4900FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4900FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4910FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4910FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4920FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4920FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4930FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4930FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4940FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4940FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4950FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4950FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4960FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4960FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4970FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4970FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4980FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4980FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4990FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4990FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B49A0FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B49A0FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B49B0FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B49B0FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B49C0FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B49C0FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B49D0FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B49D0FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B49E0FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B49E0FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B49F0FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B49F0FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4A00FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4A00FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4A10FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4A10FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4A20FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4A20FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4A30FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4A30FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4A40FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4A40FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4A50FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4A50FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4A60FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4A60FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4A70FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4A70FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4A80FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4A80FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4A90FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4A90FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4AA0FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4AA0FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4AB0FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4AB0FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4AC0FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4AC0FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4AD0FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4AD0FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4AE0FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4AE0FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4AF0FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4AF0FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4B00FFA2432004F1BC4 /* PBXTextBookmark */ = 6B25B4B00FFA2432004F1BC4 /* PBXTextBookmark */; + 6B25B4B70FFA25E1004F1BC4 /* PBXTextBookmark */ = 6B25B4B70FFA25E1004F1BC4 /* PBXTextBookmark */; + 6B25B4B80FFA25E1004F1BC4 /* PBXTextBookmark */ = 6B25B4B80FFA25E1004F1BC4 /* PBXTextBookmark */; + 6B25B4B90FFA25E1004F1BC4 /* PBXTextBookmark */ = 6B25B4B90FFA25E1004F1BC4 /* PBXTextBookmark */; + 6B25B4BA0FFA25E1004F1BC4 /* PBXTextBookmark */ = 6B25B4BA0FFA25E1004F1BC4 /* PBXTextBookmark */; + 6B25B4BB0FFA25E1004F1BC4 /* PBXTextBookmark */ = 6B25B4BB0FFA25E1004F1BC4 /* PBXTextBookmark */; + 6B25B4BC0FFA25E1004F1BC4 /* PBXTextBookmark */ = 6B25B4BC0FFA25E1004F1BC4 /* PBXTextBookmark */; + 6B25B4BD0FFA25E1004F1BC4 /* PBXTextBookmark */ = 6B25B4BD0FFA25E1004F1BC4 /* PBXTextBookmark */; + 6B25B4BE0FFA25E1004F1BC4 /* PBXTextBookmark */ = 6B25B4BE0FFA25E1004F1BC4 /* PBXTextBookmark */; + 6B25B4BF0FFA25E1004F1BC4 /* PBXTextBookmark */ = 6B25B4BF0FFA25E1004F1BC4 /* PBXTextBookmark */; + 6B25B4C00FFA25E1004F1BC4 /* PBXTextBookmark */ = 6B25B4C00FFA25E1004F1BC4 /* PBXTextBookmark */; + 6B25B4C10FFA25E1004F1BC4 /* PBXTextBookmark */ = 6B25B4C10FFA25E1004F1BC4 /* PBXTextBookmark */; + 6B25B4C20FFA25E1004F1BC4 /* PBXTextBookmark */ = 6B25B4C20FFA25E1004F1BC4 /* PBXTextBookmark */; + 6B25B4C30FFA25E1004F1BC4 /* PBXTextBookmark */ = 6B25B4C30FFA25E1004F1BC4 /* PBXTextBookmark */; + 6B25B4C60FFA2627004F1BC4 /* PBXTextBookmark */ = 6B25B4C60FFA2627004F1BC4 /* PBXTextBookmark */; + 6B25B4C70FFA2627004F1BC4 /* PBXTextBookmark */ = 6B25B4C70FFA2627004F1BC4 /* PBXTextBookmark */; + 6B25B4C80FFA2627004F1BC4 /* PBXTextBookmark */ = 6B25B4C80FFA2627004F1BC4 /* PBXTextBookmark */; + 6B25B4C90FFA2627004F1BC4 /* PBXTextBookmark */ = 6B25B4C90FFA2627004F1BC4 /* PBXTextBookmark */; + 6B25B4CC0FFA2673004F1BC4 /* PBXTextBookmark */ = 6B25B4CC0FFA2673004F1BC4 /* PBXTextBookmark */; + 6B25B4E30FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4E30FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4E40FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4E40FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4E50FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4E50FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4E60FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4E60FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4E70FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4E70FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4E80FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4E80FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4E90FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4E90FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4EA0FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4EA0FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4EB0FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4EB0FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4EC0FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4EC0FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4ED0FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4ED0FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4EE0FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4EE0FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4EF0FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4EF0FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4F00FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4F00FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4F10FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4F10FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4F20FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4F20FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4F30FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4F30FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4F40FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4F40FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4F50FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4F50FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4F60FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4F60FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4F70FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4F70FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4F80FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4F80FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4F90FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4F90FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4FA0FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4FA0FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4FB0FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4FB0FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4FC0FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4FC0FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4FD0FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4FD0FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4FE0FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4FE0FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B4FF0FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B4FF0FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B5000FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B5000FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B5010FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B5010FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B5020FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B5020FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B5030FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B5030FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B5040FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B5040FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B5050FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B5050FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B5060FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B5060FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B5070FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B5070FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B5080FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B5080FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B5090FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B5090FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B50A0FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B50A0FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B50B0FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B50B0FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B50C0FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B50C0FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B50D0FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B50D0FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B50E0FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B50E0FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B50F0FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B50F0FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B5100FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B5100FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B5110FFA4CFD004F1BC4 /* PBXTextBookmark */ = 6B25B5110FFA4CFD004F1BC4 /* PBXTextBookmark */; + 6B25B5150FFA4E5B004F1BC4 /* PBXTextBookmark */ = 6B25B5150FFA4E5B004F1BC4 /* PBXTextBookmark */; + 6B25B5170FFA4E76004F1BC4 /* PBXTextBookmark */ = 6B25B5170FFA4E76004F1BC4 /* PBXTextBookmark */; + 6B25B5190FFA4E7C004F1BC4 /* PBXTextBookmark */ = 6B25B5190FFA4E7C004F1BC4 /* PBXTextBookmark */; + 6B25B51B0FFA4E90004F1BC4 /* PBXTextBookmark */ = 6B25B51B0FFA4E90004F1BC4 /* PBXTextBookmark */; + 6B25B51D0FFA4E96004F1BC4 /* PBXTextBookmark */ = 6B25B51D0FFA4E96004F1BC4 /* PBXTextBookmark */; + 6B25B51F0FFA4EB9004F1BC4 /* PBXTextBookmark */ = 6B25B51F0FFA4EB9004F1BC4 /* PBXTextBookmark */; + 6B25B5200FFA4EB9004F1BC4 /* PBXTextBookmark */ = 6B25B5200FFA4EB9004F1BC4 /* PBXTextBookmark */; + 6B25B5210FFA4EB9004F1BC4 /* PBXTextBookmark */ = 6B25B5210FFA4EB9004F1BC4 /* PBXTextBookmark */; + 6B25B5220FFA4EB9004F1BC4 /* PBXTextBookmark */ = 6B25B5220FFA4EB9004F1BC4 /* PBXTextBookmark */; + 6B25B5240FFA4ECC004F1BC4 /* PBXTextBookmark */ = 6B25B5240FFA4ECC004F1BC4 /* PBXTextBookmark */; + 6B25B5260FFA4F2D004F1BC4 /* PBXTextBookmark */ = 6B25B5260FFA4F2D004F1BC4 /* PBXTextBookmark */; + 6B25B5270FFA4F2D004F1BC4 /* PBXTextBookmark */ = 6B25B5270FFA4F2D004F1BC4 /* PBXTextBookmark */; + 6B25B5280FFA4F2D004F1BC4 /* PBXTextBookmark */ = 6B25B5280FFA4F2D004F1BC4 /* PBXTextBookmark */; + 6B25B5290FFA4F2D004F1BC4 /* PBXTextBookmark */ = 6B25B5290FFA4F2D004F1BC4 /* PBXTextBookmark */; + 6B25B54F0FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B54F0FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5500FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5500FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5510FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5510FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5520FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5520FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5530FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5530FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5540FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5540FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5550FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5550FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5560FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5560FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5570FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5570FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5580FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5580FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5590FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5590FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B55A0FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B55A0FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B55B0FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B55B0FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B55C0FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B55C0FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B55D0FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B55D0FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B55E0FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B55E0FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B55F0FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B55F0FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5600FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5600FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5610FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5610FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5620FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5620FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5630FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5630FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5640FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5640FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5650FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5650FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5660FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5660FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5670FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5670FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5680FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5680FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5690FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5690FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B56A0FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B56A0FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B56B0FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B56B0FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B56C0FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B56C0FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B56D0FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B56D0FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B56E0FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B56E0FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B56F0FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B56F0FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5700FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5700FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5710FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5710FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5720FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5720FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5730FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5730FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5740FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5740FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5750FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5750FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5760FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5760FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5770FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5770FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5780FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5780FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B5790FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B5790FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B57A0FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B57A0FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B57B0FFA5899004F1BC4 /* PBXTextBookmark */ = 6B25B57B0FFA5899004F1BC4 /* PBXTextBookmark */; + 6B25B57C0FFA58AC004F1BC4 /* PBXTextBookmark */ = 6B25B57C0FFA58AC004F1BC4 /* PBXTextBookmark */; + 6B25B57D0FFA58AC004F1BC4 /* PBXTextBookmark */ = 6B25B57D0FFA58AC004F1BC4 /* PBXTextBookmark */; + 6B25B57E0FFA58AC004F1BC4 /* PBXTextBookmark */ = 6B25B57E0FFA58AC004F1BC4 /* PBXTextBookmark */; + 6B25B57F0FFA58AC004F1BC4 /* PBXTextBookmark */ = 6B25B57F0FFA58AC004F1BC4 /* PBXTextBookmark */; + 6B25B5800FFA58AC004F1BC4 /* PBXTextBookmark */ = 6B25B5800FFA58AC004F1BC4 /* PBXTextBookmark */; + 6B25B5810FFA58AC004F1BC4 /* PBXTextBookmark */ = 6B25B5810FFA58AC004F1BC4 /* PBXTextBookmark */; + 6B25B5820FFA58AC004F1BC4 /* PBXTextBookmark */ = 6B25B5820FFA58AC004F1BC4 /* PBXTextBookmark */; + 6B25B5830FFA58AC004F1BC4 /* PBXTextBookmark */ = 6B25B5830FFA58AC004F1BC4 /* PBXTextBookmark */; + 6B25B5850FFA58F3004F1BC4 /* PBXTextBookmark */ = 6B25B5850FFA58F3004F1BC4 /* PBXTextBookmark */; + 6B25B5860FFA58F3004F1BC4 /* PBXTextBookmark */ = 6B25B5860FFA58F3004F1BC4 /* PBXTextBookmark */; + 6B25B5870FFA58F3004F1BC4 /* PBXTextBookmark */ = 6B25B5870FFA58F3004F1BC4 /* PBXTextBookmark */; + 6B25B5880FFA58F3004F1BC4 /* PBXTextBookmark */ = 6B25B5880FFA58F3004F1BC4 /* PBXTextBookmark */; + 6B25B5890FFA58F3004F1BC4 /* PBXTextBookmark */ = 6B25B5890FFA58F3004F1BC4 /* PBXTextBookmark */; + 6B25B58A0FFA58F3004F1BC4 /* PBXTextBookmark */ = 6B25B58A0FFA58F3004F1BC4 /* PBXTextBookmark */; + 6B25B58B0FFA58F3004F1BC4 /* PBXTextBookmark */ = 6B25B58B0FFA58F3004F1BC4 /* PBXTextBookmark */; + 6B25B58C0FFA58F3004F1BC4 /* PBXTextBookmark */ = 6B25B58C0FFA58F3004F1BC4 /* PBXTextBookmark */; + 6B25B58D0FFA58F3004F1BC4 /* PBXTextBookmark */ = 6B25B58D0FFA58F3004F1BC4 /* PBXTextBookmark */; + 6B25B58E0FFA58F3004F1BC4 /* PBXTextBookmark */ = 6B25B58E0FFA58F3004F1BC4 /* PBXTextBookmark */; + 6B25B58F0FFA58F3004F1BC4 /* PBXTextBookmark */ = 6B25B58F0FFA58F3004F1BC4 /* PBXTextBookmark */; + 6B25B5910FFA5914004F1BC4 /* PBXTextBookmark */ = 6B25B5910FFA5914004F1BC4 /* PBXTextBookmark */; + 6B25B5920FFA5914004F1BC4 /* PBXTextBookmark */ = 6B25B5920FFA5914004F1BC4 /* PBXTextBookmark */; + 6B25B5930FFA5914004F1BC4 /* PBXTextBookmark */ = 6B25B5930FFA5914004F1BC4 /* PBXTextBookmark */; + 6B25B5940FFA5914004F1BC4 /* PBXTextBookmark */ = 6B25B5940FFA5914004F1BC4 /* PBXTextBookmark */; + 6B25B5950FFA5914004F1BC4 /* PBXTextBookmark */ = 6B25B5950FFA5914004F1BC4 /* PBXTextBookmark */; + 6B25B5960FFA5914004F1BC4 /* PBXTextBookmark */ = 6B25B5960FFA5914004F1BC4 /* PBXTextBookmark */; + 6B25B5970FFA5914004F1BC4 /* PBXTextBookmark */ = 6B25B5970FFA5914004F1BC4 /* PBXTextBookmark */; + 6B25B5990FFA5934004F1BC4 /* PBXTextBookmark */ = 6B25B5990FFA5934004F1BC4 /* PBXTextBookmark */; + 6B25B59D0FFA5A03004F1BC4 /* PBXTextBookmark */ = 6B25B59D0FFA5A03004F1BC4 /* PBXTextBookmark */; + 6B25B59E0FFA5A03004F1BC4 /* PBXTextBookmark */ = 6B25B59E0FFA5A03004F1BC4 /* PBXTextBookmark */; + 6B25B59F0FFA5A03004F1BC4 /* PBXTextBookmark */ = 6B25B59F0FFA5A03004F1BC4 /* PBXTextBookmark */; + 6B25B5A00FFA5A03004F1BC4 /* PBXTextBookmark */ = 6B25B5A00FFA5A03004F1BC4 /* PBXTextBookmark */; + 6B25B5A10FFA5A03004F1BC4 /* PBXTextBookmark */ = 6B25B5A10FFA5A03004F1BC4 /* PBXTextBookmark */; + 6B25B5A40FFA5A14004F1BC4 /* PBXTextBookmark */ = 6B25B5A40FFA5A14004F1BC4 /* PBXTextBookmark */; + 6B25B5A50FFA5A14004F1BC4 /* PBXTextBookmark */ = 6B25B5A50FFA5A14004F1BC4 /* PBXTextBookmark */; + 6B25B5A60FFA5A14004F1BC4 /* PBXTextBookmark */ = 6B25B5A60FFA5A14004F1BC4 /* PBXTextBookmark */; + 6B25B5A70FFA5A14004F1BC4 /* PBXTextBookmark */ = 6B25B5A70FFA5A14004F1BC4 /* PBXTextBookmark */; + 6B25B5A90FFA5A4D004F1BC4 /* PBXTextBookmark */ = 6B25B5A90FFA5A4D004F1BC4 /* PBXTextBookmark */; + 6B25B5AA0FFA5A4D004F1BC4 /* PBXTextBookmark */ = 6B25B5AA0FFA5A4D004F1BC4 /* PBXTextBookmark */; + 6B25B5AB0FFA5A4D004F1BC4 /* PBXTextBookmark */ = 6B25B5AB0FFA5A4D004F1BC4 /* PBXTextBookmark */; + 6B25B5AC0FFA5A4D004F1BC4 /* PBXTextBookmark */ = 6B25B5AC0FFA5A4D004F1BC4 /* PBXTextBookmark */; + 6B25B5AF0FFA5A5A004F1BC4 /* PBXTextBookmark */ = 6B25B5AF0FFA5A5A004F1BC4 /* PBXTextBookmark */; + 6B25B5B00FFA5A5A004F1BC4 /* PBXTextBookmark */ = 6B25B5B00FFA5A5A004F1BC4 /* PBXTextBookmark */; + 6B25B5B10FFA5A5A004F1BC4 /* PBXTextBookmark */ = 6B25B5B10FFA5A5A004F1BC4 /* PBXTextBookmark */; + 6B25B5B20FFA5AA9004F1BC4 /* PBXTextBookmark */ = 6B25B5B20FFA5AA9004F1BC4 /* PBXTextBookmark */; + 6B25B5B30FFA5AA9004F1BC4 /* PBXTextBookmark */ = 6B25B5B30FFA5AA9004F1BC4 /* PBXTextBookmark */; + 6B25B5B40FFA5AA9004F1BC4 /* PBXTextBookmark */ = 6B25B5B40FFA5AA9004F1BC4 /* PBXTextBookmark */; + 6B25B5B50FFA5AA9004F1BC4 /* PBXTextBookmark */ = 6B25B5B50FFA5AA9004F1BC4 /* PBXTextBookmark */; + 6B25B5BD0FFA5B3B004F1BC4 /* PBXTextBookmark */ = 6B25B5BD0FFA5B3B004F1BC4 /* PBXTextBookmark */; + 6B25B5BE0FFA5B3B004F1BC4 /* PBXTextBookmark */ = 6B25B5BE0FFA5B3B004F1BC4 /* PBXTextBookmark */; + 6B25B5BF0FFA5B3B004F1BC4 /* PBXTextBookmark */ = 6B25B5BF0FFA5B3B004F1BC4 /* PBXTextBookmark */; + 6B25B5C00FFA5B3B004F1BC4 /* PBXTextBookmark */ = 6B25B5C00FFA5B3B004F1BC4 /* PBXTextBookmark */; + 6B25B5C10FFA5B3B004F1BC4 /* PBXTextBookmark */ = 6B25B5C10FFA5B3B004F1BC4 /* PBXTextBookmark */; + 6B25B5C20FFA5B3B004F1BC4 /* PBXTextBookmark */ = 6B25B5C20FFA5B3B004F1BC4 /* PBXTextBookmark */; + 6B25B5C70FFA5CCE004F1BC4 /* PBXTextBookmark */ = 6B25B5C70FFA5CCE004F1BC4 /* PBXTextBookmark */; + 6B25B5C80FFA5CCE004F1BC4 /* PBXTextBookmark */ = 6B25B5C80FFA5CCE004F1BC4 /* PBXTextBookmark */; + 6B25B5C90FFA5CCE004F1BC4 /* PBXTextBookmark */ = 6B25B5C90FFA5CCE004F1BC4 /* PBXTextBookmark */; + 6B25B5CA0FFA5CCE004F1BC4 /* PBXTextBookmark */ = 6B25B5CA0FFA5CCE004F1BC4 /* PBXTextBookmark */; + 6B25B5CB0FFA5CCE004F1BC4 /* PBXTextBookmark */ = 6B25B5CB0FFA5CCE004F1BC4 /* PBXTextBookmark */; + 6B25B5CC0FFA5CCE004F1BC4 /* PBXTextBookmark */ = 6B25B5CC0FFA5CCE004F1BC4 /* PBXTextBookmark */; + 6B25B5CD0FFA5CCE004F1BC4 /* PBXTextBookmark */ = 6B25B5CD0FFA5CCE004F1BC4 /* PBXTextBookmark */; + 6B25B5CE0FFA5CCE004F1BC4 /* PBXTextBookmark */ = 6B25B5CE0FFA5CCE004F1BC4 /* PBXTextBookmark */; + 6B25B5CF0FFA5CCE004F1BC4 /* PBXTextBookmark */ = 6B25B5CF0FFA5CCE004F1BC4 /* PBXTextBookmark */; + 6B25B5D00FFA5CCE004F1BC4 /* PBXTextBookmark */ = 6B25B5D00FFA5CCE004F1BC4 /* PBXTextBookmark */; + 6B25B5D10FFA5CCE004F1BC4 /* PBXTextBookmark */ = 6B25B5D10FFA5CCE004F1BC4 /* PBXTextBookmark */; + 6B25B5D20FFA5CCE004F1BC4 /* PBXTextBookmark */ = 6B25B5D20FFA5CCE004F1BC4 /* PBXTextBookmark */; + 6B25B5D30FFA5CCE004F1BC4 /* PBXTextBookmark */ = 6B25B5D30FFA5CCE004F1BC4 /* PBXTextBookmark */; + 6B25B5D40FFA5CCE004F1BC4 /* PBXTextBookmark */ = 6B25B5D40FFA5CCE004F1BC4 /* PBXTextBookmark */; + 6B25B5D50FFA5CCE004F1BC4 /* PBXTextBookmark */ = 6B25B5D50FFA5CCE004F1BC4 /* PBXTextBookmark */; + 6B25B5D60FFA5CCE004F1BC4 /* PBXTextBookmark */ = 6B25B5D60FFA5CCE004F1BC4 /* PBXTextBookmark */; + 6B25B5D70FFA5CCE004F1BC4 /* PBXTextBookmark */ = 6B25B5D70FFA5CCE004F1BC4 /* PBXTextBookmark */; + 6B25B5D80FFA5CCE004F1BC4 /* PBXTextBookmark */ = 6B25B5D80FFA5CCE004F1BC4 /* PBXTextBookmark */; + 6B25B5D90FFA5CCE004F1BC4 /* PBXTextBookmark */ = 6B25B5D90FFA5CCE004F1BC4 /* PBXTextBookmark */; + 6B25B5DA0FFA5CCE004F1BC4 /* PBXTextBookmark */ = 6B25B5DA0FFA5CCE004F1BC4 /* PBXTextBookmark */; + 6B25B5DB0FFA5CCE004F1BC4 /* PBXTextBookmark */ = 6B25B5DB0FFA5CCE004F1BC4 /* PBXTextBookmark */; + 6B25B5DD0FFA5CFC004F1BC4 /* PBXTextBookmark */ = 6B25B5DD0FFA5CFC004F1BC4 /* PBXTextBookmark */; + 6B25B5DE0FFA5CFC004F1BC4 /* PBXTextBookmark */ = 6B25B5DE0FFA5CFC004F1BC4 /* PBXTextBookmark */; + 6B25B5DF0FFA5CFC004F1BC4 /* PBXTextBookmark */ = 6B25B5DF0FFA5CFC004F1BC4 /* PBXTextBookmark */; + 6B25B5E00FFA5CFC004F1BC4 /* PBXTextBookmark */ = 6B25B5E00FFA5CFC004F1BC4 /* PBXTextBookmark */; + 6B25B5E10FFA5CFC004F1BC4 /* PBXTextBookmark */ = 6B25B5E10FFA5CFC004F1BC4 /* PBXTextBookmark */; + 6B25B5E20FFA5CFC004F1BC4 /* PBXTextBookmark */ = 6B25B5E20FFA5CFC004F1BC4 /* PBXTextBookmark */; + 6B25B5E40FFA5D19004F1BC4 /* PBXTextBookmark */ = 6B25B5E40FFA5D19004F1BC4 /* PBXTextBookmark */; + 6B25B5E60FFA5D59004F1BC4 /* PBXTextBookmark */ = 6B25B5E60FFA5D59004F1BC4 /* PBXTextBookmark */; + 6B25B5E70FFA5D59004F1BC4 /* PBXTextBookmark */ = 6B25B5E70FFA5D59004F1BC4 /* PBXTextBookmark */; + 6B25B5E80FFA5D59004F1BC4 /* PBXTextBookmark */ = 6B25B5E80FFA5D59004F1BC4 /* PBXTextBookmark */; + 6B25B5E90FFA5D59004F1BC4 /* PBXTextBookmark */ = 6B25B5E90FFA5D59004F1BC4 /* PBXTextBookmark */; + 6B25B5EB0FFA5E2E004F1BC4 /* PBXTextBookmark */ = 6B25B5EB0FFA5E2E004F1BC4 /* PBXTextBookmark */; + 6B25B5EC0FFA5E2E004F1BC4 /* PBXTextBookmark */ = 6B25B5EC0FFA5E2E004F1BC4 /* PBXTextBookmark */; + 6B25B5ED0FFA5E2E004F1BC4 /* PBXTextBookmark */ = 6B25B5ED0FFA5E2E004F1BC4 /* PBXTextBookmark */; + 6B25B5EE0FFA5E2E004F1BC4 /* PBXTextBookmark */ = 6B25B5EE0FFA5E2E004F1BC4 /* PBXTextBookmark */; + 6B25B5EF0FFA5E2E004F1BC4 /* PBXTextBookmark */ = 6B25B5EF0FFA5E2E004F1BC4 /* PBXTextBookmark */; + 6B25B5F00FFA5E2E004F1BC4 /* PBXTextBookmark */ = 6B25B5F00FFA5E2E004F1BC4 /* PBXTextBookmark */; + 6B25B5F10FFA5E2E004F1BC4 /* PBXTextBookmark */ = 6B25B5F10FFA5E2E004F1BC4 /* PBXTextBookmark */; + 6B25B5F30FFA5EB6004F1BC4 /* PBXTextBookmark */ = 6B25B5F30FFA5EB6004F1BC4 /* PBXTextBookmark */; + 6B25B5F40FFA5EB6004F1BC4 /* PBXTextBookmark */ = 6B25B5F40FFA5EB6004F1BC4 /* PBXTextBookmark */; + 6B25B5F50FFA5EB6004F1BC4 /* PBXTextBookmark */ = 6B25B5F50FFA5EB6004F1BC4 /* PBXTextBookmark */; + 6B25B5F60FFA5EB6004F1BC4 /* PBXTextBookmark */ = 6B25B5F60FFA5EB6004F1BC4 /* PBXTextBookmark */; + 6B25B5F70FFA5EB6004F1BC4 /* PBXTextBookmark */ = 6B25B5F70FFA5EB6004F1BC4 /* PBXTextBookmark */; + 6B25B5F80FFA5EB6004F1BC4 /* PBXTextBookmark */ = 6B25B5F80FFA5EB6004F1BC4 /* PBXTextBookmark */; + 6B25B5F90FFA5EB6004F1BC4 /* PBXTextBookmark */ = 6B25B5F90FFA5EB6004F1BC4 /* PBXTextBookmark */; + 6B25B5FA0FFA5EB6004F1BC4 /* PBXTextBookmark */ = 6B25B5FA0FFA5EB6004F1BC4 /* PBXTextBookmark */; + 6B25B5FD0FFA5FC9004F1BC4 /* PBXTextBookmark */ = 6B25B5FD0FFA5FC9004F1BC4 /* PBXTextBookmark */; + 6B25B5FE0FFA5FC9004F1BC4 /* PBXTextBookmark */ = 6B25B5FE0FFA5FC9004F1BC4 /* PBXTextBookmark */; + 6B25B6030FFA61D9004F1BC4 /* PBXTextBookmark */ = 6B25B6030FFA61D9004F1BC4 /* PBXTextBookmark */; + 6B25B6040FFA61D9004F1BC4 /* PBXTextBookmark */ = 6B25B6040FFA61D9004F1BC4 /* PBXTextBookmark */; + 6B25B6050FFA61D9004F1BC4 /* PBXTextBookmark */ = 6B25B6050FFA61D9004F1BC4 /* PBXTextBookmark */; + 6B25B6060FFA61D9004F1BC4 /* PBXTextBookmark */ = 6B25B6060FFA61D9004F1BC4 /* PBXTextBookmark */; + 6B25B6070FFA61D9004F1BC4 /* PBXTextBookmark */ = 6B25B6070FFA61D9004F1BC4 /* PBXTextBookmark */; + 6B25B6080FFA61D9004F1BC4 /* PBXTextBookmark */ = 6B25B6080FFA61D9004F1BC4 /* PBXTextBookmark */; + 6B25B6090FFA61D9004F1BC4 /* PBXTextBookmark */ = 6B25B6090FFA61D9004F1BC4 /* PBXTextBookmark */; + 6B25B60A0FFA61D9004F1BC4 /* PBXTextBookmark */ = 6B25B60A0FFA61D9004F1BC4 /* PBXTextBookmark */; + 6B25B60B0FFA61D9004F1BC4 /* PBXTextBookmark */ = 6B25B60B0FFA61D9004F1BC4 /* PBXTextBookmark */; + 6B25B60D0FFA61FC004F1BC4 /* PBXTextBookmark */ = 6B25B60D0FFA61FC004F1BC4 /* PBXTextBookmark */; + 6B25B60F0FFA622D004F1BC4 /* PBXTextBookmark */ = 6B25B60F0FFA622D004F1BC4 /* PBXTextBookmark */; + 6B25B6230FFA63C8004F1BC4 /* PBXTextBookmark */ = 6B25B6230FFA63C8004F1BC4 /* PBXTextBookmark */; + 6B25B6240FFA63C8004F1BC4 /* PBXTextBookmark */ = 6B25B6240FFA63C8004F1BC4 /* PBXTextBookmark */; + 6B25B6250FFA63C8004F1BC4 /* PBXTextBookmark */ = 6B25B6250FFA63C8004F1BC4 /* PBXTextBookmark */; + 6B25B6260FFA63C8004F1BC4 /* PBXTextBookmark */ = 6B25B6260FFA63C8004F1BC4 /* PBXTextBookmark */; 6B458EA80FB4540500044EA9 = 6B458EA80FB4540500044EA9 /* PBXTextBookmark */; - 6B6BC6C70FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6C70FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6C80FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6C80FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6C90FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6C90FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6CA0FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6CA0FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6CB0FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6CB0FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6CC0FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6CC0FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6CD0FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6CD0FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6CE0FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6CE0FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6CF0FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6CF0FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6D00FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6D00FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6D10FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6D10FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6D20FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6D20FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6D30FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6D30FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6D40FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6D40FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6D50FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6D50FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6D60FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6D60FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6D70FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6D70FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6D80FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6D80FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6D90FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6D90FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6DA0FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6DA0FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6DB0FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6DB0FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6DC0FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6DC0FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6DD0FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6DD0FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6DE0FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6DE0FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6DF0FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6DF0FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6E00FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6E00FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6E10FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6E10FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6E20FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6E20FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6E30FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6E30FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6E40FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6E40FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6E50FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6E50FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6E60FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6E60FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6E70FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6E70FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6E80FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6E80FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6E90FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6E90FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6EA0FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6EA0FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6EB0FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6EB0FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6EC0FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6EC0FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6ED0FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6ED0FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6EE0FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6EE0FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6EF0FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6EF0FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6F00FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6F00FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6F10FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6F10FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6F20FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6F20FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6F30FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6F30FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6F40FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6F40FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6F50FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6F50FE7A3A4009E3CB9 /* PBXTextBookmark */; - 6B6BC6F60FE7A3A4009E3CB9 /* PBXTextBookmark */ = 6B6BC6F60FE7A3A4009E3CB9 /* PBXTextBookmark */; + 6B6BC6C70FE7A3A4009E3CB9 = 6B6BC6C70FE7A3A4009E3CB9 /* PBXTextBookmark */; + 6B6BC6CA0FE7A3A4009E3CB9 = 6B6BC6CA0FE7A3A4009E3CB9 /* PBXTextBookmark */; 6B77072C0FBD540400D21BAE = 6B77072C0FBD540400D21BAE /* PBXTextBookmark */; 6B7707AF0FBD66CF00D21BAE = 6B7707AF0FBD66CF00D21BAE /* PBXTextBookmark */; 6B7707B90FBD66CF00D21BAE = 6B7707B90FBD66CF00D21BAE /* PBXTextBookmark */; - 6B7707EF0FBD90F100D21BAE = 6B7707EF0FBD90F100D21BAE /* PBXTextBookmark */; 6B7707F00FBD90F100D21BAE = 6B7707F00FBD90F100D21BAE /* PBXTextBookmark */; 6B7707F70FBD90F100D21BAE = 6B7707F70FBD90F100D21BAE /* PBXTextBookmark */; 6B7707F90FBD90F100D21BAE = 6B7707F90FBD90F100D21BAE /* PBXTextBookmark */; @@ -181,24 +589,84 @@ 6B8171D70FC327630022159F = 6B8171D70FC327630022159F /* PBXTextBookmark */; 6B8633370F7813A600E2684A = 6B8633370F7813A600E2684A /* PBXTextBookmark */; 6B86333B0F7813A600E2684A = 6B86333B0F7813A600E2684A /* PBXTextBookmark */; - 6B8A71D10FDAADCA00A0A6FB = 6B8A71D10FDAADCA00A0A6FB /* PBXTextBookmark */; 6B8A71F40FDAB52200A0A6FB = 6B8A71F40FDAB52200A0A6FB /* PBXTextBookmark */; - 6B8A71FC0FDABD0300A0A6FB = 6B8A71FC0FDABD0300A0A6FB /* PBXTextBookmark */; 6B8B580A0FD80DA20088BD0D = 6B8B580A0FD80DA20088BD0D /* PBXTextBookmark */; 6B8DB38F0F9798DE007FA9E1 = 6B8DB38F0F9798DE007FA9E1 /* PBXTextBookmark */; 6B8DB3900F9798DE007FA9E1 = 6B8DB3900F9798DE007FA9E1 /* PBXTextBookmark */; - 6B8FD18D0FD7C4D10059D643 = 6B8FD18D0FD7C4D10059D643 /* PBXTextBookmark */; - 6B8FD19B0FD7ED310059D643 = 6B8FD19B0FD7ED310059D643 /* PBXTextBookmark */; - 6B8FD19C0FD7ED310059D643 = 6B8FD19C0FD7ED310059D643 /* PBXTextBookmark */; - 6B8FD19E0FD7ED310059D643 = 6B8FD19E0FD7ED310059D643 /* PBXTextBookmark */; - 6B8FD1A20FD7ED310059D643 = 6B8FD1A20FD7ED310059D643 /* PBXTextBookmark */; - 6B8FD1A30FD7ED310059D643 = 6B8FD1A30FD7ED310059D643 /* PBXTextBookmark */; - 6B8FD1A40FD7ED310059D643 = 6B8FD1A40FD7ED310059D643 /* PBXTextBookmark */; 6B8FD1CF0FD7F56C0059D643 = 6B8FD1CF0FD7F56C0059D643 /* PBXTextBookmark */; - 6B901BFB0FE154A900CE8692 = 6B901BFB0FE154A900CE8692 /* PBXTextBookmark */; 6B995BDF0FE0D9B300D5C493 = 6B995BDF0FE0D9B300D5C493 /* PBXTextBookmark */; - 6B995BE00FE0D9B300D5C493 = 6B995BE00FE0D9B300D5C493 /* PBXTextBookmark */; - 6B995BE40FE0D9B300D5C493 = 6B995BE40FE0D9B300D5C493 /* PBXTextBookmark */; + 6B9B7D990FF91AC600A9090F = 6B9B7D990FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7D9A0FF91AC600A9090F = 6B9B7D9A0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7D9B0FF91AC600A9090F = 6B9B7D9B0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7D9D0FF91AC600A9090F = 6B9B7D9D0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7D9E0FF91AC600A9090F = 6B9B7D9E0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7D9F0FF91AC600A9090F = 6B9B7D9F0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DA00FF91AC600A9090F = 6B9B7DA00FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DA10FF91AC600A9090F = 6B9B7DA10FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DA20FF91AC600A9090F = 6B9B7DA20FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DA30FF91AC600A9090F = 6B9B7DA30FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DA40FF91AC600A9090F = 6B9B7DA40FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DA50FF91AC600A9090F = 6B9B7DA50FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DA70FF91AC600A9090F = 6B9B7DA70FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DA80FF91AC600A9090F = 6B9B7DA80FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DA90FF91AC600A9090F = 6B9B7DA90FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DAB0FF91AC600A9090F = 6B9B7DAB0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DAC0FF91AC600A9090F = 6B9B7DAC0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DAD0FF91AC600A9090F = 6B9B7DAD0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DAE0FF91AC600A9090F = 6B9B7DAE0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DAF0FF91AC600A9090F = 6B9B7DAF0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DB00FF91AC600A9090F = 6B9B7DB00FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DB10FF91AC600A9090F = 6B9B7DB10FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DB30FF91AC600A9090F = 6B9B7DB30FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DB40FF91AC600A9090F = 6B9B7DB40FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DB50FF91AC600A9090F = 6B9B7DB50FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DB60FF91AC600A9090F = 6B9B7DB60FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DB70FF91AC600A9090F = 6B9B7DB70FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DB80FF91AC600A9090F = 6B9B7DB80FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DB90FF91AC600A9090F = 6B9B7DB90FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DBA0FF91AC600A9090F = 6B9B7DBA0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DBB0FF91AC600A9090F = 6B9B7DBB0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DBC0FF91AC600A9090F = 6B9B7DBC0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DBD0FF91AC600A9090F = 6B9B7DBD0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DBE0FF91AC600A9090F = 6B9B7DBE0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DBF0FF91AC600A9090F = 6B9B7DBF0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DC00FF91AC600A9090F = 6B9B7DC00FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DC10FF91AC600A9090F = 6B9B7DC10FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DC20FF91AC600A9090F = 6B9B7DC20FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DC30FF91AC600A9090F = 6B9B7DC30FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DC40FF91AC600A9090F = 6B9B7DC40FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DC50FF91AC600A9090F = 6B9B7DC50FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DC60FF91AC600A9090F = 6B9B7DC60FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DC70FF91AC600A9090F = 6B9B7DC70FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DC80FF91AC600A9090F = 6B9B7DC80FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DC90FF91AC600A9090F = 6B9B7DC90FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DCA0FF91AC600A9090F = 6B9B7DCA0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DCB0FF91AC600A9090F = 6B9B7DCB0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DCC0FF91AC600A9090F = 6B9B7DCC0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DCD0FF91AC600A9090F = 6B9B7DCD0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DCE0FF91AC600A9090F = 6B9B7DCE0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DCF0FF91AC600A9090F = 6B9B7DCF0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DD00FF91AC600A9090F = 6B9B7DD00FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DD10FF91AC600A9090F = 6B9B7DD10FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DD20FF91AC600A9090F = 6B9B7DD20FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DD30FF91AC600A9090F = 6B9B7DD30FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DD40FF91AC600A9090F = 6B9B7DD40FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DD50FF91AC600A9090F = 6B9B7DD50FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DD60FF91AC600A9090F = 6B9B7DD60FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DD70FF91AC600A9090F = 6B9B7DD70FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DD80FF91AC600A9090F = 6B9B7DD80FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DD90FF91AC600A9090F = 6B9B7DD90FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DDA0FF91AC600A9090F = 6B9B7DDA0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DDB0FF91AC600A9090F = 6B9B7DDB0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DDC0FF91AC600A9090F = 6B9B7DDC0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DDD0FF91AC600A9090F = 6B9B7DDD0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DDE0FF91AC600A9090F = 6B9B7DDE0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DDF0FF91AC600A9090F = 6B9B7DDF0FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DE00FF91AC600A9090F = 6B9B7DE00FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DE10FF91AC600A9090F = 6B9B7DE10FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DE20FF91AC600A9090F = 6B9B7DE20FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DE30FF91AC600A9090F = 6B9B7DE30FF91AC600A9090F /* PBXTextBookmark */; + 6B9B7DE40FF91AC600A9090F = 6B9B7DE40FF91AC600A9090F /* PBXTextBookmark */; 6BAE920D0FD8014C002875DB = 6BAE920D0FD8014C002875DB /* PBXTextBookmark */; 6BB7876B0FC03EAD003C24DB = 6BB7876B0FC03EAD003C24DB /* PBXTextBookmark */; 6BB787710FC03EAD003C24DB = 6BB787710FC03EAD003C24DB /* PBXTextBookmark */; @@ -206,7 +674,6 @@ 6BB787D40FC03EAD003C24DB = 6BB787D40FC03EAD003C24DB /* PBXTextBookmark */; 6BB7881E0FC0593E003C24DB = 6BB7881E0FC0593E003C24DB /* PBXTextBookmark */; 6BB7881F0FC0593E003C24DB = 6BB7881F0FC0593E003C24DB /* PBXTextBookmark */; - 6BB788230FC0593E003C24DB = 6BB788230FC0593E003C24DB /* PBXTextBookmark */; 6BB788290FC0593E003C24DB = 6BB788290FC0593E003C24DB /* PBXTextBookmark */; 6BB7882A0FC0593E003C24DB = 6BB7882A0FC0593E003C24DB /* PBXTextBookmark */; 6BB7882B0FC0593E003C24DB = 6BB7882B0FC0593E003C24DB /* PBXTextBookmark */; @@ -214,8 +681,13 @@ 6BB85D3E0FCEAA6300758966 = 6BB85D3E0FCEAA6300758966 /* PBXTextBookmark */; 6BB87E0B0F9DE8A300E33F12 = 6BB87E0B0F9DE8A300E33F12 /* PBXTextBookmark */; 6BB87E0E0F9DE8A300E33F12 = 6BB87E0E0F9DE8A300E33F12 /* PBXTextBookmark */; - 6BC620900FD7C2380022CACF = 6BC620900FD7C2380022CACF /* PBXTextBookmark */; 6BC620920FD7C2380022CACF = 6BC620920FD7C2380022CACF /* PBXTextBookmark */; + 6BC745A60FF527E50083A694 = 6BC745A60FF527E50083A694 /* PBXTextBookmark */; + 6BC745A70FF527E50083A694 = 6BC745A70FF527E50083A694 /* PBXTextBookmark */; + 6BC745A80FF527E50083A694 = 6BC745A80FF527E50083A694 /* PBXTextBookmark */; + 6BC745AD0FF527E50083A694 = 6BC745AD0FF527E50083A694 /* PBXTextBookmark */; + 6BC745AE0FF527E50083A694 = 6BC745AE0FF527E50083A694 /* PBXTextBookmark */; + 6BC745AF0FF527E50083A694 = 6BC745AF0FF527E50083A694 /* PBXTextBookmark */; }; sourceControlManager = 6B8632A90F78115100E2684A /* Source Control */; userBuildSettings = { @@ -229,36 +701,6 @@ sepNavWindowFrame = "{{38, 57}, {1011, 695}}"; }; }; - 6B09CDFF0FD5563E005637D5 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6BB788180FC04753003C24DB /* ChunkyTriMesh.h */; - name = "ChunkyTriMesh.h: 32"; - rLen = 0; - rLoc = 1176; - rType = 0; - vrLen = 916; - vrLoc = 784; - }; - 6B09CE1E0FD55805005637D5 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; - name = "Recast.h: 388"; - rLen = 13; - rLoc = 12645; - rType = 0; - vrLen = 1417; - vrLoc = 11509; - }; - 6B09CE2D0FD55B4D005637D5 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; - name = "RecastContour.cpp: 797"; - rLen = 0; - rLoc = 20561; - rType = 0; - vrLen = 742; - vrLoc = 18804; - }; 6B09CE5C0FD5BDE6005637D5 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 6BDD9E060F91112200904EEF /* DetourStatNavMeshBuilder.h */; @@ -289,13 +731,6 @@ vrLen = 1003; vrLoc = 5933; }; - 6B137C6A0F7FCBBB00459200 /* demo.cpp */ = { - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1160, 29008}}"; - sepNavSelRange = "{21775, 0}"; - sepNavVisRange = "{21359, 942}"; - }; - }; 6B137C6B0F7FCBBB00459200 /* glfont.cpp */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {760, 4544}}"; @@ -303,6 +738,13 @@ sepNavVisRange = "{4122, 707}"; }; }; + 6B137C6C0F7FCBBB00459200 /* imgui.cpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1219, 14256}}"; + sepNavSelRange = "{16026, 0}"; + sepNavVisRange = "{15651, 583}"; + }; + }; 6B137C6D0F7FCBBB00459200 /* MeshLoaderObj.cpp */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {969, 3520}}"; @@ -310,39 +752,46 @@ sepNavVisRange = "{4033, 666}"; }; }; + 6B137C6E0F7FCBBB00459200 /* SDLMain.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 6224}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 894}"; + }; + }; 6B137C7A0F7FCBE400459200 /* imgui.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {969, 752}}"; - sepNavSelRange = "{0, 918}"; - sepNavVisRange = "{0, 1368}"; + sepNavIntBoundsRect = "{{0, 0}, {969, 864}}"; + sepNavSelRange = "{1161, 0}"; + sepNavVisRange = "{837, 898}"; }; }; 6B137C7B0F7FCBE400459200 /* MeshLoaderObj.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {969, 800}}"; - sepNavSelRange = "{1361, 0}"; - sepNavVisRange = "{837, 759}"; + sepNavSelRange = "{1134, 62}"; + sepNavVisRange = "{942, 654}"; }; }; 6B137C7E0F7FCBFE00459200 /* Recast.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {969, 6400}}"; - sepNavSelRange = "{8683, 0}"; - sepNavVisRange = "{8298, 1247}"; + sepNavIntBoundsRect = "{{0, 0}, {1219, 6800}}"; + sepNavSelRange = "{6104, 0}"; + sepNavVisRange = "{5858, 358}"; }; }; 6B137C7F0F7FCBFE00459200 /* RecastDebugDraw.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {969, 928}}"; - sepNavSelRange = "{1297, 27}"; - sepNavVisRange = "{1005, 1669}"; + sepNavIntBoundsRect = "{{0, 0}, {992, 928}}"; + sepNavSelRange = "{2487, 115}"; + sepNavVisRange = "{1079, 1689}"; }; }; 6B137C800F7FCBFE00459200 /* RecastLog.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {969, 1264}}"; - sepNavSelRange = "{2052, 13}"; - sepNavVisRange = "{1674, 522}"; + sepNavSelRange = "{1805, 0}"; + sepNavVisRange = "{1627, 592}"; }; }; 6B137C810F7FCBFE00459200 /* RecastTimer.h */ = { @@ -362,30 +811,30 @@ }; 6B137C830F7FCC1100459200 /* RecastContour.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {969, 13632}}"; - sepNavSelRange = "{20664, 0}"; - sepNavVisRange = "{20396, 793}"; + sepNavIntBoundsRect = "{{0, 0}, {969, 13312}}"; + sepNavSelRange = "{20761, 0}"; + sepNavVisRange = "{20354, 795}"; }; }; 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {969, 10240}}"; - sepNavSelRange = "{6147, 0}"; - sepNavVisRange = "{5839, 568}"; + sepNavIntBoundsRect = "{{0, 0}, {969, 10112}}"; + sepNavSelRange = "{11361, 112}"; + sepNavVisRange = "{11010, 686}"; }; }; 6B137C850F7FCC1100459200 /* RecastFilter.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {969, 3920}}"; - sepNavSelRange = "{1139, 0}"; - sepNavVisRange = "{982, 564}"; + sepNavIntBoundsRect = "{{0, 0}, {969, 4000}}"; + sepNavSelRange = "{7174, 0}"; + sepNavVisRange = "{5903, 1272}"; }; }; 6B137C860F7FCC1100459200 /* RecastLog.cpp */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {969, 1248}}"; sepNavSelRange = "{1703, 0}"; - sepNavVisRange = "{1314, 512}"; + sepNavVisRange = "{1158, 668}"; }; }; 6B137C870F7FCC1100459200 /* RecastMesh.cpp */ = { @@ -416,105 +865,6 @@ sepNavVisRange = "{0, 574}"; }; }; - 6B164AFD0FD6687600D2F919 /* glimage.cpp */ = { - isa = PBXFileReference; - fileEncoding = 4; - lastKnownFileType = sourcecode.cpp.cpp; - name = glimage.cpp; - path = /Users/memon/Code/recastnavigation/RecastDemo/Source/glimage.cpp; - sourceTree = ""; - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {969, 1440}}"; - sepNavSelRange = "{947, 0}"; - sepNavVisRange = "{554, 900}"; - }; - }; - 6B164AFF0FD6688000D2F919 /* glimage.h */ = { - isa = PBXFileReference; - fileEncoding = 4; - lastKnownFileType = sourcecode.c.h; - name = glimage.h; - path = /Users/memon/Code/recastnavigation/RecastDemo/Include/glimage.h; - sourceTree = ""; - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {969, 592}}"; - sepNavSelRange = "{110, 7}"; - sepNavVisRange = "{0, 494}"; - }; - }; - 6B164B000FD668B700D2F919 /* stb_image.c */ = { - isa = PBXFileReference; - fileEncoding = 4; - lastKnownFileType = sourcecode.c.c; - name = stb_image.c; - path = /Users/memon/Code/recastnavigation/RecastDemo/Source/stb_image.c; - sourceTree = ""; - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {969, 62620}}"; - sepNavSelRange = "{120397, 30}"; - sepNavVisRange = "{119874, 666}"; - }; - }; - 6B164B240FD678A500D2F919 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B164AFD0FD6687600D2F919 /* glimage.cpp */; - name = "glimage.cpp: 55"; - rLen = 0; - rLoc = 947; - rType = 0; - vrLen = 900; - vrLoc = 554; - }; - 6B164B250FD678A500D2F919 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B164AFF0FD6688000D2F919 /* glimage.h */; - name = "glimage.h: 12"; - rLen = 7; - rLoc = 110; - rType = 0; - vrLen = 494; - vrLoc = 0; - }; - 6B164B260FD678A500D2F919 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B164B000FD668B700D2F919 /* stb_image.c */; - name = "stb_image.c: 3612"; - rLen = 30; - rLoc = 120397; - rType = 0; - vrLen = 610; - vrLoc = 119874; - }; - 6B164B320FD678A500D2F919 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B164AFF0FD6688000D2F919 /* glimage.h */; - name = "glimage.h: 26"; - rLen = 0; - rLoc = 191; - rType = 0; - vrLen = 606; - vrLoc = 104; - }; - 6B164B330FD678A500D2F919 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B164AFD0FD6687600D2F919 /* glimage.cpp */; - name = "glimage.cpp: 74"; - rLen = 0; - rLoc = 1364; - rType = 0; - vrLen = 974; - vrLoc = 914; - }; - 6B164B3C0FD678A500D2F919 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B164B000FD668B700D2F919 /* stb_image.c */; - name = "stb_image.c: 3612"; - rLen = 30; - rLoc = 120397; - rType = 0; - vrLen = 610; - vrLoc = 119874; - }; 6B1E02680F924A8500CC0038 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; @@ -575,6 +925,4738 @@ vrLen = 918; vrLoc = 20892; }; + 6B25B36E0FF9F730004F1BC4 /* Builder.h */ = { + isa = PBXFileReference; + fileEncoding = 4; + lastKnownFileType = sourcecode.c.h; + name = Builder.h; + path = /Users/memon/Code/recastnavigation/RecastDemo/Build/Xcode/Builder.h; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 800}}"; + sepNavSelRange = "{456, 0}"; + sepNavVisRange = "{313, 701}"; + }; + }; + 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */ = { + isa = PBXFileReference; + fileEncoding = 4; + lastKnownFileType = sourcecode.c.h; + name = BuilderStatMeshSimple.h; + path = /Users/memon/Code/recastnavigation/RecastDemo/Build/Xcode/BuilderStatMeshSimple.h; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 1008}}"; + sepNavSelRange = "{856, 0}"; + sepNavVisRange = "{493, 641}"; + }; + }; + 6B25B3780FFA0075004F1BC4 /* Builder.cpp */ = { + isa = PBXFileReference; + fileEncoding = 4; + lastKnownFileType = sourcecode.cpp.cpp; + name = Builder.cpp; + path = /Users/memon/Code/recastnavigation/RecastDemo/Build/Xcode/Builder.cpp; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 1920}}"; + sepNavSelRange = "{1652, 0}"; + sepNavVisRange = "{0, 409}"; + }; + }; + 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */ = { + isa = PBXFileReference; + fileEncoding = 4; + lastKnownFileType = sourcecode.cpp.cpp; + name = BuilderStatMeshSimple.cpp; + path = /Users/memon/Code/recastnavigation/RecastDemo/Build/Xcode/BuilderStatMeshSimple.cpp; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1160, 8000}}"; + sepNavSelRange = "{17237, 15}"; + sepNavVisRange = "{14683, 2584}"; + }; + }; + 6B25B3A60FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7B0F7FCBE400459200 /* MeshLoaderObj.h */; + name = "MeshLoaderObj.h: 31"; + rLen = 62; + rLoc = 1134; + rType = 0; + vrLen = 654; + vrLoc = 942; + }; + 6B25B3A70FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; + name = "RecastDebugDraw.cpp: 53"; + rLen = 0; + rLoc = 1828; + rType = 0; + vrLen = 758; + vrLoc = 1494; + }; + 6B25B3A80FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7F0F7FCBFE00459200 /* RecastDebugDraw.h */; + name = "RecastDebugDraw.h: 53"; + rLen = 115; + rLoc = 2487; + rType = 0; + vrLen = 1689; + vrLoc = 1079; + }; + 6B25B3A90FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A50FF10F260083A694 /* tests.h */; + name = "tests.h: 51"; + rLen = 0; + rLoc = 986; + rType = 0; + vrLen = 579; + vrLoc = 440; + }; + 6B25B3AA0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 230"; + rLen = 0; + rLoc = 6215; + rType = 0; + vrLen = 569; + vrLoc = 5887; + }; + 6B25B3AB0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C800F7FCBFE00459200 /* RecastLog.h */; + name = "RecastLog.h: 58"; + rLen = 0; + rLoc = 1805; + rType = 0; + vrLen = 592; + vrLoc = 1627; + }; + 6B25B3AC0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A30FF10F0C0083A694 /* tests.cpp */; + name = "tests.cpp: 208"; + rLen = 0; + rLoc = 4107; + rType = 0; + vrLen = 455; + vrLoc = 5922; + }; + 6B25B3AD0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1678"; + rLen = 592; + rLoc = 48904; + rType = 0; + vrLen = 783; + vrLoc = 48717; + }; + 6B25B3AE0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3780FFA0075004F1BC4 /* Builder.cpp */; + name = "Builder.cpp: 34"; + rLen = 0; + rLoc = 445; + rType = 0; + vrLen = 461; + vrLoc = 287; + }; + 6B25B3AF0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 32"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 646; + vrLoc = 125; + }; + 6B25B3B00FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 81"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 735; + vrLoc = 1024; + }; + 6B25B3B10FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B36E0FF9F730004F1BC4 /* Builder.h */; + name = "Builder.h: 34"; + rLen = 33; + rLoc = 560; + rType = 0; + vrLen = 716; + vrLoc = 161; + }; + 6B25B3B20FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 333"; + rLen = 0; + rLoc = 9838; + rType = 0; + vrLen = 740; + vrLoc = 6866; + }; + 6B25B3B30FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7A0F7FCBE400459200 /* imgui.h */; + name = "imgui.h: 33"; + rLen = 0; + rLoc = 1540; + rType = 0; + vrLen = 1048; + vrLoc = 784; + }; + 6B25B3B40FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3B50FFA124D004F1BC4 /* SDL_mouse.h */; + name = "SDL_mouse.h: 119"; + rLen = 10; + rLoc = 4071; + rType = 0; + vrLen = 930; + vrLoc = 3733; + }; + 6B25B3B50FFA124D004F1BC4 /* SDL_mouse.h */ = { + isa = PBXFileReference; + name = SDL_mouse.h; + path = /Library/Frameworks/SDL.framework/Versions/A/Headers/SDL_mouse.h; + sourceTree = ""; + }; + 6B25B3B60FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 546"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 593; + vrLoc = 11768; + }; + 6B25B3B70FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7F0F7FCBFE00459200 /* RecastDebugDraw.h */; + name = "RecastDebugDraw.h: 40"; + rLen = 15; + rLoc = 1433; + rType = 0; + vrLen = 1637; + vrLoc = 1037; + }; + 6B25B3B80FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; + name = "RecastDebugDraw.cpp: 27"; + rLen = 0; + rLoc = 1081; + rType = 0; + vrLen = 744; + vrLoc = 918; + }; + 6B25B3B90FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7F0F7FCBFE00459200 /* RecastDebugDraw.h */; + name = "RecastDebugDraw.h: 40"; + rLen = 15; + rLoc = 1433; + rType = 0; + vrLen = 1608; + vrLoc = 1037; + }; + 6B25B3BA0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; + name = "RecastDebugDraw.cpp: 27"; + rLen = 143; + rLoc = 1081; + rType = 0; + vrLen = 760; + vrLoc = 918; + }; + 6B25B3BB0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7F0F7FCBFE00459200 /* RecastDebugDraw.h */; + name = "RecastDebugDraw.h: 39"; + rLen = 0; + rLoc = 1427; + rType = 0; + vrLen = 1637; + vrLoc = 1037; + }; + 6B25B3BC0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; + name = "RecastDebugDraw.cpp: 27"; + rLen = 86; + rLoc = 1102; + rType = 0; + vrLen = 760; + vrLoc = 918; + }; + 6B25B3BD0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7F0F7FCBFE00459200 /* RecastDebugDraw.h */; + name = "RecastDebugDraw.h: 42"; + rLen = 0; + rLoc = 1701; + rType = 0; + vrLen = 1702; + vrLoc = 1037; + }; + 6B25B3BE0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; + name = "RecastDebugDraw.cpp: 56"; + rLen = 0; + rLoc = 1912; + rType = 0; + vrLen = 805; + vrLoc = 1424; + }; + 6B25B3BF0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7B0F7FCBE400459200 /* MeshLoaderObj.h */; + name = "MeshLoaderObj.h: 31"; + rLen = 62; + rLoc = 1134; + rType = 0; + vrLen = 654; + vrLoc = 942; + }; + 6B25B3C00FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; + name = "RecastDebugDraw.cpp: 53"; + rLen = 0; + rLoc = 1828; + rType = 0; + vrLen = 758; + vrLoc = 1494; + }; + 6B25B3C10FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A50FF10F260083A694 /* tests.h */; + name = "tests.h: 21"; + rLen = 0; + rLoc = 377; + rType = 0; + vrLen = 673; + vrLoc = 149; + }; + 6B25B3C20FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7F0F7FCBFE00459200 /* RecastDebugDraw.h */; + name = "RecastDebugDraw.h: 53"; + rLen = 115; + rLoc = 2487; + rType = 0; + vrLen = 1689; + vrLoc = 1079; + }; + 6B25B3C30FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A30FF10F0C0083A694 /* tests.cpp */; + name = "tests.cpp: 197"; + rLen = 0; + rLoc = 3928; + rType = 0; + vrLen = 497; + vrLoc = 3660; + }; + 6B25B3C40FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A50FF10F260083A694 /* tests.h */; + name = "tests.h: 51"; + rLen = 0; + rLoc = 986; + rType = 0; + vrLen = 579; + vrLoc = 440; + }; + 6B25B3C50FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1439"; + rLen = 249; + rLoc = 41665; + rType = 0; + vrLen = 841; + vrLoc = 41394; + }; + 6B25B3C60FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 230"; + rLen = 0; + rLoc = 6215; + rType = 0; + vrLen = 569; + vrLoc = 5887; + }; + 6B25B3C70FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C800F7FCBFE00459200 /* RecastLog.h */; + name = "RecastLog.h: 58"; + rLen = 0; + rLoc = 1805; + rType = 0; + vrLen = 592; + vrLoc = 1627; + }; + 6B25B3C80FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A30FF10F0C0083A694 /* tests.cpp */; + name = "tests.cpp: 22"; + rLen = 48; + rLoc = 377; + rType = 0; + vrLen = 478; + vrLoc = 123; + }; + 6B25B3C90FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 390"; + rLen = 0; + rLoc = 11284; + rType = 0; + vrLen = 981; + vrLoc = 7735; + }; + 6B25B3CA0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A30FF10F0C0083A694 /* tests.cpp */; + name = "tests.cpp: 208"; + rLen = 0; + rLoc = 4107; + rType = 0; + vrLen = 455; + vrLoc = 5922; + }; + 6B25B3CB0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1553"; + rLen = 41; + rLoc = 44441; + rType = 0; + vrLen = 1003; + vrLoc = 43986; + }; + 6B25B3CC0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 382"; + rLen = 0; + rLoc = 11284; + rType = 0; + vrLen = 676; + vrLoc = 7885; + }; + 6B25B3CD0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3780FFA0075004F1BC4 /* Builder.cpp */; + name = "Builder.cpp: 73"; + rLen = 0; + rLoc = 1574; + rType = 0; + vrLen = 953; + vrLoc = 1284; + }; + 6B25B3CE0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 887"; + rLen = 0; + rLoc = 27220; + rType = 0; + vrLen = 969; + vrLoc = 26685; + }; + 6B25B3CF0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 23"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 443; + vrLoc = 204; + }; + 6B25B3D00FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 16"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 633; + vrLoc = 0; + }; + 6B25B3D10FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 18"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 443; + vrLoc = 204; + }; + 6B25B3D20FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 16"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 633; + vrLoc = 0; + }; + 6B25B3D30FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 213"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 880; + vrLoc = 5614; + }; + 6B25B3D40FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 16"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 633; + vrLoc = 0; + }; + 6B25B3D50FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 212"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 788; + vrLoc = 5614; + }; + 6B25B3D60FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 16"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 633; + vrLoc = 0; + }; + 6B25B3D70FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 293"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 1629; + vrLoc = 6861; + }; + 6B25B3D80FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 19"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 633; + vrLoc = 0; + }; + 6B25B3D90FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 30"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 348; + vrLoc = 287; + }; + 6B25B3DA0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 23"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 526; + vrLoc = 0; + }; + 6B25B3DB0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 67"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 604; + vrLoc = 848; + }; + 6B25B3DC0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 34"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 610; + vrLoc = 126; + }; + 6B25B3DD0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 263"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 1173; + vrLoc = 6860; + }; + 6B25B3DE0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 34"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 611; + vrLoc = 125; + }; + 6B25B3DF0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 67"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 761; + vrLoc = 869; + }; + 6B25B3E00FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3780FFA0075004F1BC4 /* Builder.cpp */; + name = "Builder.cpp: 113"; + rLen = 0; + rLoc = 2725; + rType = 0; + vrLen = 999; + vrLoc = 1874; + }; + 6B25B3E10FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 299"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 2706; + vrLoc = 7521; + }; + 6B25B3E20FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 470"; + rLen = 0; + rLoc = 14274; + rType = 0; + vrLen = 875; + vrLoc = 9391; + }; + 6B25B3E30FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 291"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 2574; + vrLoc = 7668; + }; + 6B25B3E40FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 465"; + rLen = 0; + rLoc = 14636; + rType = 0; + vrLen = 708; + vrLoc = 9473; + }; + 6B25B3E50FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1674"; + rLen = 771; + rLoc = 48754; + rType = 0; + vrLen = 731; + vrLoc = 49200; + }; + 6B25B3E60FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3780FFA0075004F1BC4 /* Builder.cpp */; + name = "Builder.cpp: 113"; + rLen = 0; + rLoc = 2725; + rType = 0; + vrLen = 999; + vrLoc = 1874; + }; + 6B25B3E70FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 474"; + rLen = 0; + rLoc = 14887; + rType = 0; + vrLen = 632; + vrLoc = 9955; + }; + 6B25B3E80FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3780FFA0075004F1BC4 /* Builder.cpp */; + name = "Builder.cpp: 113"; + rLen = 0; + rLoc = 2725; + rType = 0; + vrLen = 999; + vrLoc = 1874; + }; + 6B25B3E90FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1678"; + rLen = 592; + rLoc = 48904; + rType = 0; + vrLen = 783; + vrLoc = 48717; + }; + 6B25B3EA0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 75"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 749; + vrLoc = 803; + }; + 6B25B3EB0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3780FFA0075004F1BC4 /* Builder.cpp */; + name = "Builder.cpp: 29"; + rLen = 0; + rLoc = 405; + rType = 0; + vrLen = 596; + vrLoc = 287; + }; + 6B25B3EC0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 50"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 680; + vrLoc = 605; + }; + 6B25B3ED0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 30"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 643; + vrLoc = 125; + }; + 6B25B3EE0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 323"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 2570; + vrLoc = 8319; + }; + 6B25B3EF0FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B36E0FF9F730004F1BC4 /* Builder.h */; + name = "Builder.h: 34"; + rLen = 33; + rLoc = 560; + rType = 0; + vrLen = 716; + vrLoc = 161; + }; + 6B25B3F00FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 32"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 646; + vrLoc = 125; + }; + 6B25B3F10FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 81"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 735; + vrLoc = 1024; + }; + 6B25B3F20FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B36E0FF9F730004F1BC4 /* Builder.h */; + name = "Builder.h: 34"; + rLen = 33; + rLoc = 560; + rType = 0; + vrLen = 716; + vrLoc = 161; + }; + 6B25B3F30FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 333"; + rLen = 0; + rLoc = 9838; + rType = 0; + vrLen = 740; + vrLoc = 6866; + }; + 6B25B3F40FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7A0F7FCBE400459200 /* imgui.h */; + name = "imgui.h: 33"; + rLen = 0; + rLoc = 1540; + rType = 0; + vrLen = 1048; + vrLoc = 784; + }; + 6B25B3F50FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3F60FFA124D004F1BC4 /* SDL_mouse.h */; + name = "SDL_mouse.h: 119"; + rLen = 10; + rLoc = 4071; + rType = 0; + vrLen = 930; + vrLoc = 3733; + }; + 6B25B3F60FFA124D004F1BC4 /* SDL_mouse.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = SDL_mouse.h; + path = /Library/Frameworks/SDL.framework/Versions/A/Headers/SDL_mouse.h; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 2224}}"; + sepNavSelRange = "{1841, 65}"; + sepNavVisRange = "{1250, 1141}"; + }; + }; + 6B25B3F70FFA124D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 556"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 688; + vrLoc = 12114; + }; + 6B25B3F80FFA1250004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 556"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 688; + vrLoc = 12114; + }; + 6B25B4020FFA126F004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 559"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 681; + vrLoc = 12114; + }; + 6B25B4050FFA137B004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 556"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 675; + vrLoc = 12114; + }; + 6B25B4060FFA13E9004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 537"; + rLen = 0; + rLoc = 11993; + rType = 0; + vrLen = 508; + vrLoc = 11934; + }; + 6B25B4070FFA13E9004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3F60FFA124D004F1BC4 /* SDL_mouse.h */; + rLen = 1; + rLoc = 54; + rType = 1; + }; + 6B25B4080FFA13E9004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 537"; + rLen = 0; + rLoc = 11993; + rType = 0; + vrLen = 508; + vrLoc = 11934; + }; + 6B25B4090FFA13E9004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3F60FFA124D004F1BC4 /* SDL_mouse.h */; + name = "SDL_mouse.h: 58"; + rLen = 0; + rLoc = 1953; + rType = 0; + vrLen = 533; + vrLoc = 4156; + }; + 6B25B40D0FFA1545004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3F60FFA124D004F1BC4 /* SDL_mouse.h */; + name = "SDL_mouse.h: 124"; + rLen = 0; + rLoc = 4241; + rType = 0; + vrLen = 895; + vrLoc = 3794; + }; + 6B25B40E0FFA1545004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7A0F7FCBE400459200 /* imgui.h */; + name = "imgui.h: 25"; + rLen = 15; + rLoc = 1197; + rType = 0; + vrLen = 995; + vrLoc = 837; + }; + 6B25B40F0FFA1545004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 198"; + rLen = 1835; + rLoc = 5625; + rType = 0; + vrLen = 581; + vrLoc = 4535; + }; + 6B25B4100FFA1545004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B86333C0F7813A600E2684A /* SDL_events.h */; + name = "SDL_events.h: 90"; + rLen = 0; + rLoc = 3461; + rType = 0; + vrLen = 1238; + vrLoc = 9220; + }; + 6B25B4110FFA1545004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + comments = "error: 'event' was not declared in this scope"; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + rLen = 0; + rLoc = 544; + rType = 1; + }; + 6B25B4120FFA1545004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3F60FFA124D004F1BC4 /* SDL_mouse.h */; + name = "SDL_mouse.h: 124"; + rLen = 0; + rLoc = 4241; + rType = 0; + vrLen = 895; + vrLoc = 3794; + }; + 6B25B4130FFA1545004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7A0F7FCBE400459200 /* imgui.h */; + name = "imgui.h: 25"; + rLen = 15; + rLoc = 1197; + rType = 0; + vrLen = 995; + vrLoc = 837; + }; + 6B25B4140FFA1545004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 198"; + rLen = 1835; + rLoc = 5625; + rType = 0; + vrLen = 581; + vrLoc = 4535; + }; + 6B25B4150FFA1545004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B86333C0F7813A600E2684A /* SDL_events.h */; + name = "SDL_events.h: 90"; + rLen = 0; + rLoc = 3461; + rType = 0; + vrLen = 1238; + vrLoc = 9220; + }; + 6B25B4160FFA1545004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 553"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 720; + vrLoc = 12221; + }; + 6B25B4170FFA1548004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 553"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 720; + vrLoc = 12221; + }; + 6B25B4180FFA1548004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 553"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 721; + vrLoc = 12068; + }; + 6B25B41A0FFA156D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 553"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 772; + vrLoc = 12068; + }; + 6B25B41C0FFA1579004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 554"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 736; + vrLoc = 12068; + }; + 6B25B41E0FFA1596004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 554"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 738; + vrLoc = 12068; + }; + 6B25B41F0FFA16A6004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3F60FFA124D004F1BC4 /* SDL_mouse.h */; + name = "SDL_mouse.h: 58"; + rLen = 0; + rLoc = 1953; + rType = 0; + vrLen = 533; + vrLoc = 4156; + }; + 6B25B4200FFA16A6004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 550"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 565; + vrLoc = 12221; + }; + 6B25B4210FFA16A6004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B86333C0F7813A600E2684A /* SDL_events.h */; + rLen = 1; + rLoc = 234; + rType = 1; + }; + 6B25B4220FFA16A6004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 550"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 565; + vrLoc = 12221; + }; + 6B25B4230FFA16A6004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B86333C0F7813A600E2684A /* SDL_events.h */; + name = "SDL_events.h: 233"; + rLen = 0; + rLoc = 8577; + rType = 0; + vrLen = 878; + vrLoc = 1250; + }; + 6B25B4260FFA16C0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B86333C0F7813A600E2684A /* SDL_events.h */; + name = "SDL_events.h: 233"; + rLen = 0; + rLoc = 8577; + rType = 0; + vrLen = 1203; + vrLoc = 1103; + }; + 6B25B4270FFA16C0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 554"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 794; + vrLoc = 12068; + }; + 6B25B4280FFA16C0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B86333C0F7813A600E2684A /* SDL_events.h */; + name = "SDL_events.h: 233"; + rLen = 0; + rLoc = 8577; + rType = 0; + vrLen = 1203; + vrLoc = 1103; + }; + 6B25B4290FFA16C0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 557"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 764; + vrLoc = 12068; + }; + 6B25B42A0FFA16C2004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 557"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 764; + vrLoc = 12068; + }; + 6B25B42B0FFA16C5004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 557"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 773; + vrLoc = 12157; + }; + 6B25B42D0FFA16D4004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 557"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 771; + vrLoc = 12157; + }; + 6B25B42F0FFA16DF004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 557"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 774; + vrLoc = 12157; + }; + 6B25B4300FFA16EB004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B86333C0F7813A600E2684A /* SDL_events.h */; + name = "SDL_events.h: 233"; + rLen = 0; + rLoc = 8577; + rType = 0; + vrLen = 825; + vrLoc = 1250; + }; + 6B25B4310FFA16EB004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 553"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 536; + vrLoc = 12291; + }; + 6B25B4320FFA16FD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 560"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 643; + vrLoc = 11854; + }; + 6B25B4340FFA174A004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B86333C0F7813A600E2684A /* SDL_events.h */; + name = "SDL_events.h: 91"; + rLen = 18; + rLoc = 3520; + rType = 0; + vrLen = 1475; + vrLoc = 2806; + }; + 6B25B4350FFA174A004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 551"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 842; + vrLoc = 11965; + }; + 6B25B4360FFA174A004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 551"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 844; + vrLoc = 11963; + }; + 6B25B4370FFA174A004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B86333C0F7813A600E2684A /* SDL_events.h */; + name = "SDL_events.h: 91"; + rLen = 18; + rLoc = 3520; + rType = 0; + vrLen = 1475; + vrLoc = 2806; + }; + 6B25B4380FFA174A004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 551"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 833; + vrLoc = 11965; + }; + 6B25B4390FFA174C004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 551"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 833; + vrLoc = 11965; + }; + 6B25B43A0FFA174D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 551"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 824; + vrLoc = 11978; + }; + 6B25B43B0FFA1757004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 557"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 581; + vrLoc = 12221; + }; + 6B25B43D0FFA1786004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 552"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 840; + vrLoc = 11965; + }; + 6B25B43E0FFA1786004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B86333C0F7813A600E2684A /* SDL_events.h */; + name = "SDL_events.h: 244"; + rLen = 51; + rLoc = 8853; + rType = 0; + vrLen = 1342; + vrLoc = 10249; + }; + 6B25B43F0FFA1786004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 196"; + rLen = 0; + rLoc = 5625; + rType = 0; + vrLen = 539; + vrLoc = 3420; + }; + 6B25B4400FFA1786004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 552"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 840; + vrLoc = 11965; + }; + 6B25B4410FFA1786004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 196"; + rLen = 0; + rLoc = 5625; + rType = 0; + vrLen = 569; + vrLoc = 3420; + }; + 6B25B4420FFA1786004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B86333C0F7813A600E2684A /* SDL_events.h */; + name = "SDL_events.h: 244"; + rLen = 51; + rLoc = 8853; + rType = 0; + vrLen = 1342; + vrLoc = 10249; + }; + 6B25B4430FFA1786004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 196"; + rLen = 0; + rLoc = 5625; + rType = 0; + vrLen = 533; + vrLoc = 3420; + }; + 6B25B4440FFA1789004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 196"; + rLen = 0; + rLoc = 5625; + rType = 0; + vrLen = 533; + vrLoc = 3420; + }; + 6B25B4450FFA178A004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 196"; + rLen = 0; + rLoc = 5625; + rType = 0; + vrLen = 560; + vrLoc = 3374; + }; + 6B25B4460FFA178F004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 557"; + rLen = 0; + rLoc = 12274; + rType = 0; + vrLen = 532; + vrLoc = 12290; + }; + 6B25B4470FFA178F004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 196"; + rLen = 0; + rLoc = 5625; + rType = 0; + vrLen = 364; + vrLoc = 3439; + }; + 6B25B44B0FFA1968004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3F60FFA124D004F1BC4 /* SDL_mouse.h */; + name = "SDL_mouse.h: 55"; + rLen = 65; + rLoc = 1841; + rType = 0; + vrLen = 1141; + vrLoc = 1250; + }; + 6B25B44C0FFA1968004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 344"; + rLen = 0; + rLoc = 9839; + rType = 0; + vrLen = 789; + vrLoc = 7231; + }; + 6B25B44D0FFA1968004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7A0F7FCBE400459200 /* imgui.h */; + name = "imgui.h: 33"; + rLen = 18; + rLoc = 1229; + rType = 0; + vrLen = 800; + vrLoc = 837; + }; + 6B25B44E0FFA1968004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 554"; + rLen = 0; + rLoc = 12458; + rType = 0; + vrLen = 508; + vrLoc = 12251; + }; + 6B25B44F0FFA1968004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 334"; + rLen = 0; + rLoc = 9839; + rType = 0; + vrLen = 629; + vrLoc = 3349; + }; + 6B25B4500FFA1968004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7A0F7FCBE400459200 /* imgui.h */; + name = "imgui.h: 33"; + rLen = 0; + rLoc = 1192; + rType = 0; + vrLen = 800; + vrLoc = 837; + }; + 6B25B4510FFA1968004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 536"; + rLen = 0; + rLoc = 11993; + rType = 0; + vrLen = 658; + vrLoc = 11838; + }; + 6B25B4520FFA1968004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 264"; + rLen = 17; + rLoc = 7467; + rType = 0; + vrLen = 641; + vrLoc = 4875; + }; + 6B25B4530FFA1968004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3F60FFA124D004F1BC4 /* SDL_mouse.h */; + name = "SDL_mouse.h: 55"; + rLen = 65; + rLoc = 1841; + rType = 0; + vrLen = 1141; + vrLoc = 1250; + }; + 6B25B4540FFA1968004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 264"; + rLen = 17; + rLoc = 7467; + rType = 0; + vrLen = 618; + vrLoc = 4875; + }; + 6B25B4550FFA1968004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3F60FFA124D004F1BC4 /* SDL_mouse.h */; + name = "SDL_mouse.h: 55"; + rLen = 65; + rLoc = 1841; + rType = 0; + vrLen = 1141; + vrLoc = 1250; + }; + 6B25B4560FFA1968004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 538"; + rLen = 15; + rLoc = 12014; + rType = 0; + vrLen = 655; + vrLoc = 11838; + }; + 6B25B4570FFA1968004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 344"; + rLen = 0; + rLoc = 9839; + rType = 0; + vrLen = 789; + vrLoc = 7231; + }; + 6B25B4580FFA1968004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7A0F7FCBE400459200 /* imgui.h */; + name = "imgui.h: 33"; + rLen = 15; + rLoc = 1197; + rType = 0; + vrLen = 800; + vrLoc = 837; + }; + 6B25B4590FFA1968004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 554"; + rLen = 0; + rLoc = 12458; + rType = 0; + vrLen = 508; + vrLoc = 12251; + }; + 6B25B45A0FFA1968004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7A0F7FCBE400459200 /* imgui.h */; + name = "imgui.h: 33"; + rLen = 18; + rLoc = 1229; + rType = 0; + vrLen = 800; + vrLoc = 837; + }; + 6B25B45B0FFA1968004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 561"; + rLen = 0; + rLoc = 12572; + rType = 0; + vrLen = 539; + vrLoc = 12388; + }; + 6B25B45C0FFA196A004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 561"; + rLen = 0; + rLoc = 12572; + rType = 0; + vrLen = 539; + vrLoc = 12388; + }; + 6B25B45D0FFA196B004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 561"; + rLen = 0; + rLoc = 12572; + rType = 0; + vrLen = 483; + vrLoc = 12347; + }; + 6B25B4610FFA19A0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 558"; + rLen = 0; + rLoc = 12572; + rType = 0; + vrLen = 537; + vrLoc = 12314; + }; + 6B25B4620FFA19BE004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 196"; + rLen = 0; + rLoc = 5625; + rType = 0; + vrLen = 424; + vrLoc = 3472; + }; + 6B25B4630FFA19BE004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 690"; + rLen = 0; + rLoc = 16026; + rType = 0; + vrLen = 501; + vrLoc = 15741; + }; + 6B25B4710FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 690"; + rLen = 0; + rLoc = 16026; + rType = 0; + vrLen = 678; + vrLoc = 15565; + }; + 6B25B4720FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3780FFA0075004F1BC4 /* Builder.cpp */; + name = "Builder.cpp: 45"; + rLen = 0; + rLoc = 746; + rType = 0; + vrLen = 618; + vrLoc = 340; + }; + 6B25B4730FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1381"; + rLen = 11; + rLoc = 40361; + rType = 0; + vrLen = 825; + vrLoc = 39853; + }; + 6B25B4740FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; + name = "RecastDebugDraw.cpp: 467"; + rLen = 112; + rLoc = 11361; + rType = 0; + vrLen = 686; + vrLoc = 11010; + }; + 6B25B4750FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 20"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 559; + vrLoc = 102; + }; + 6B25B4760FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 10"; + rLen = 41; + rLoc = 128; + rType = 0; + vrLen = 557; + vrLoc = 0; + }; + 6B25B4770FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + comments = "error: 'cfg' was not declared in this scope"; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + rLen = 0; + rLoc = 8; + rType = 1; + }; + 6B25B4780FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 690"; + rLen = 0; + rLoc = 16026; + rType = 0; + vrLen = 678; + vrLoc = 15565; + }; + 6B25B4790FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 412"; + rLen = 0; + rLoc = 11572; + rType = 0; + vrLen = 617; + vrLoc = 8569; + }; + 6B25B47A0FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 202"; + rLen = 484; + rLoc = 4633; + rType = 0; + vrLen = 503; + vrLoc = 4632; + }; + 6B25B47B0FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 939"; + rLen = 69; + rLoc = 28339; + rType = 0; + vrLen = 757; + vrLoc = 27909; + }; + 6B25B47C0FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1635"; + rLen = 1698; + rLoc = 46989; + rType = 0; + vrLen = 1492; + vrLoc = 46469; + }; + 6B25B47D0FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1394"; + rLen = 0; + rLoc = 40657; + rType = 0; + vrLen = 522; + vrLoc = 40590; + }; + 6B25B47E0FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 234"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 740; + vrLoc = 6560; + }; + 6B25B47F0FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 246"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 820; + vrLoc = 6560; + }; + 6B25B4800FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 93"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 1419; + vrLoc = 1651; + }; + 6B25B4810FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 27"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 546; + vrLoc = 393; + }; + 6B25B4820FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 100"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 1138; + vrLoc = 1611; + }; + 6B25B4830FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1381"; + rLen = 11; + rLoc = 40361; + rType = 0; + vrLen = 825; + vrLoc = 39853; + }; + 6B25B4840FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 300"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 590; + vrLoc = 9052; + }; + 6B25B4850FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; + name = "RecastDebugDraw.cpp: 467"; + rLen = 112; + rLoc = 11361; + rType = 0; + vrLen = 686; + vrLoc = 11010; + }; + 6B25B4860FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 300"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 692; + vrLoc = 9052; + }; + 6B25B4870FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 42"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 546; + vrLoc = 393; + }; + 6B25B4880FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 385"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 1017; + vrLoc = 10942; + }; + 6B25B4890FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 20"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 559; + vrLoc = 102; + }; + 6B25B48A0FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 5"; + rLen = 0; + rLoc = 163; + rType = 0; + vrLen = 518; + vrLoc = 0; + }; + 6B25B48B0FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 10"; + rLen = 41; + rLoc = 128; + rType = 0; + vrLen = 557; + vrLoc = 0; + }; + 6B25B48C0FFA1FE0004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 355"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 946; + vrLoc = 10313; + }; + 6B25B48D0FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B36E0FF9F730004F1BC4 /* Builder.h */; + name = "Builder.h: 36"; + rLen = 94; + rLoc = 594; + rType = 0; + vrLen = 702; + vrLoc = 161; + }; + 6B25B48E0FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3780FFA0075004F1BC4 /* Builder.cpp */; + name = "Builder.cpp: 125"; + rLen = 0; + rLoc = 2680; + rType = 0; + vrLen = 949; + vrLoc = 2083; + }; + 6B25B48F0FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 314"; + rLen = 0; + rLoc = 6745; + rType = 0; + vrLen = 833; + vrLoc = 6052; + }; + 6B25B4900FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1702"; + rLen = 1644; + rLoc = 49530; + rType = 0; + vrLen = 872; + vrLoc = 50609; + }; + 6B25B4910FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 60"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 593; + vrLoc = 923; + }; + 6B25B4920FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 607"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 584; + vrLoc = 20361; + }; + 6B25B4930FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 151"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 1300; + vrLoc = 3858; + }; + 6B25B4940FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 5"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 515; + vrLoc = 0; + }; + 6B25B4950FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 13"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 608; + vrLoc = 0; + }; + 6B25B4960FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 21"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 552; + vrLoc = 0; + }; + 6B25B4970FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 198"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 908; + vrLoc = 5667; + }; + 6B25B4980FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 977"; + rLen = 124; + rLoc = 29320; + rType = 0; + vrLen = 886; + vrLoc = 28866; + }; + 6B25B4990FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 281"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 1042; + vrLoc = 8250; + }; + 6B25B49A0FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 57"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 518; + vrLoc = 595; + }; + 6B25B49B0FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 950"; + rLen = 815; + rLoc = 28629; + rType = 0; + vrLen = 753; + vrLoc = 29194; + }; + 6B25B49C0FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 86"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 769; + vrLoc = 1211; + }; + 6B25B49D0FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 282"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 1136; + vrLoc = 7152; + }; + 6B25B49E0FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 71"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 737; + vrLoc = 1211; + }; + 6B25B49F0FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 588"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 1551; + vrLoc = 18496; + }; + 6B25B4A00FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 85"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 756; + vrLoc = 1192; + }; + 6B25B4A10FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B36E0FF9F730004F1BC4 /* Builder.h */; + name = "Builder.h: 36"; + rLen = 94; + rLoc = 594; + rType = 0; + vrLen = 702; + vrLoc = 161; + }; + 6B25B4A20FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3780FFA0075004F1BC4 /* Builder.cpp */; + name = "Builder.cpp: 125"; + rLen = 0; + rLoc = 2680; + rType = 0; + vrLen = 949; + vrLoc = 2083; + }; + 6B25B4A30FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 16"; + rLen = 0; + rLoc = 257; + rType = 0; + vrLen = 557; + vrLoc = 0; + }; + 6B25B4A40FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 48"; + rLen = 1875; + rLoc = 1465; + rType = 0; + vrLen = 558; + vrLoc = 2799; + }; + 6B25B4A50FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 183"; + rLen = 0; + rLoc = 3774; + rType = 0; + vrLen = 682; + vrLoc = 2940; + }; + 6B25B4A60FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1026"; + rLen = 861; + rLoc = 30424; + rType = 0; + vrLen = 505; + vrLoc = 31437; + }; + 6B25B4A70FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 314"; + rLen = 0; + rLoc = 6745; + rType = 0; + vrLen = 833; + vrLoc = 6052; + }; + 6B25B4A80FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 585"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 917; + vrLoc = 19223; + }; + 6B25B4A90FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 65"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 623; + vrLoc = 923; + }; + 6B25B4AA0FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 598"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 544; + vrLoc = 19837; + }; + 6B25B4AB0FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1702"; + rLen = 1644; + rLoc = 49530; + rType = 0; + vrLen = 872; + vrLoc = 50609; + }; + 6B25B4AC0FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 607"; + rLen = 0; + rLoc = 17269; + rType = 0; + vrLen = 550; + vrLoc = 19950; + }; + 6B25B4AD0FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 59"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 591; + vrLoc = 923; + }; + 6B25B4AE0FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 607"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 584; + vrLoc = 20361; + }; + 6B25B4AF0FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 60"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 593; + vrLoc = 923; + }; + 6B25B4B00FFA2432004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 615"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 537; + vrLoc = 20263; + }; + 6B25B4B70FFA25E1004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 36"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 419; + vrLoc = 490; + }; + 6B25B4B80FFA25E1004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 543"; + rLen = 0; + rLoc = 13450; + rType = 0; + vrLen = 892; + vrLoc = 11817; + }; + 6B25B4B90FFA25E1004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + comments = "error: expected unqualified-id before 'enum'"; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + rLen = 1; + rLoc = 0; + rType = 1; + }; + 6B25B4BA0FFA25E1004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 615"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 614; + vrLoc = 20132; + }; + 6B25B4BB0FFA25E1004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 70"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 630; + vrLoc = 862; + }; + 6B25B4BC0FFA25E1004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 615"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 598; + vrLoc = 20148; + }; + 6B25B4BD0FFA25E1004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 73"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 542; + vrLoc = 864; + }; + 6B25B4BE0FFA25E1004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 608"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 513; + vrLoc = 20214; + }; + 6B25B4BF0FFA25E1004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 76"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 717; + vrLoc = 1115; + }; + 6B25B4C00FFA25E1004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 36"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 419; + vrLoc = 490; + }; + 6B25B4C10FFA25E1004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 77"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 642; + vrLoc = 1127; + }; + 6B25B4C20FFA25E1004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 543"; + rLen = 0; + rLoc = 13450; + rType = 0; + vrLen = 892; + vrLoc = 11817; + }; + 6B25B4C30FFA25E1004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 22"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 625; + vrLoc = 157; + }; + 6B25B4C60FFA2627004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 24"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 646; + vrLoc = 157; + }; + 6B25B4C70FFA2627004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 36"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 452; + vrLoc = 490; + }; + 6B25B4C80FFA2627004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 24"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 646; + vrLoc = 157; + }; + 6B25B4C90FFA2627004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 535"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 756; + vrLoc = 16360; + }; + 6B25B4CC0FFA2673004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 550"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 808; + vrLoc = 16377; + }; + 6B25B4CF0FFA47F2004F1BC4 /* BuilderStatMesh.h */ = { + isa = PBXFileReference; + fileEncoding = 4; + lastKnownFileType = sourcecode.c.h; + name = BuilderStatMesh.h; + path = /Users/memon/Code/recastnavigation/RecastDemo/Build/Xcode/BuilderStatMesh.h; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 1088}}"; + sepNavSelRange = "{939, 80}"; + sepNavVisRange = "{622, 584}"; + }; + }; + 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */ = { + isa = PBXFileReference; + fileEncoding = 4; + lastKnownFileType = sourcecode.cpp.cpp; + name = BuilderStatMesh.cpp; + path = /Users/memon/Code/recastnavigation/RecastDemo/Build/Xcode/BuilderStatMesh.cpp; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 4976}}"; + sepNavSelRange = "{1957, 0}"; + sepNavVisRange = "{1604, 765}"; + }; + }; + 6B25B4E30FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B36E0FF9F730004F1BC4 /* Builder.h */; + name = "Builder.h: 36"; + rLen = 94; + rLoc = 594; + rType = 0; + vrLen = 702; + vrLoc = 161; + }; + 6B25B4E40FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3780FFA0075004F1BC4 /* Builder.cpp */; + name = "Builder.cpp: 125"; + rLen = 0; + rLoc = 2680; + rType = 0; + vrLen = 949; + vrLoc = 2083; + }; + 6B25B4E50FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4CF0FFA47F2004F1BC4 /* BuilderStatMesh.h */; + name = "BuilderStatMesh.h: 8"; + rLen = 0; + rLoc = 160; + rType = 0; + vrLen = 519; + vrLoc = 0; + }; + 6B25B4E60FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 60"; + rLen = 0; + rLoc = 1311; + rType = 0; + vrLen = 579; + vrLoc = 63; + }; + 6B25B4E70FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 35"; + rLen = 0; + rLoc = 666; + rType = 0; + vrLen = 415; + vrLoc = 421; + }; + 6B25B4E80FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderStatMeshSimple.h: 42"; + rLen = 0; + rLoc = 856; + rType = 0; + vrLen = 609; + vrLoc = 76; + }; + 6B25B4E90FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 543"; + rLen = 0; + rLoc = 13450; + rType = 0; + vrLen = 892; + vrLoc = 11817; + }; + 6B25B4EA0FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 550"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 825; + vrLoc = 16377; + }; + 6B25B4EB0FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4CF0FFA47F2004F1BC4 /* BuilderStatMesh.h */; + name = "BuilderStatMesh.h: 3"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 28; + vrLoc = 0; + }; + 6B25B4EC0FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B36E0FF9F730004F1BC4 /* Builder.h */; + name = "Builder.h: 36"; + rLen = 94; + rLoc = 594; + rType = 0; + vrLen = 702; + vrLoc = 161; + }; + 6B25B4ED0FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderSimple.h: 1"; + rLen = 1319; + rLoc = 0; + rType = 0; + vrLen = 625; + vrLoc = 157; + }; + 6B25B4EE0FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4CF0FFA47F2004F1BC4 /* BuilderStatMesh.h */; + name = "BuilderStatMesh.h: 50"; + rLen = 0; + rLoc = 1079; + rType = 0; + vrLen = 683; + vrLoc = 622; + }; + 6B25B4EF0FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 1"; + rLen = 0; + rLoc = 7361; + rType = 0; + vrLen = 0; + vrLoc = 0; + }; + 6B25B4F00FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderSimple.cpp: 1"; + rLen = 17269; + rLoc = 0; + rType = 0; + vrLen = 811; + vrLoc = 16391; + }; + 6B25B4F10FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 24"; + rLen = 0; + rLoc = 182; + rType = 0; + vrLen = 591; + vrLoc = 143; + }; + 6B25B4F20FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4CF0FFA47F2004F1BC4 /* BuilderStatMesh.h */; + name = "BuilderStatMesh.h: 45"; + rLen = 0; + rLoc = 937; + rType = 0; + vrLen = 669; + vrLoc = 604; + }; + 6B25B4F30FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 31"; + rLen = 0; + rLoc = 537; + rType = 0; + vrLen = 574; + vrLoc = 143; + }; + 6B25B4F40FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4CF0FFA47F2004F1BC4 /* BuilderStatMesh.h */; + name = "BuilderStatMesh.h: 51"; + rLen = 11; + rLoc = 1093; + rType = 0; + vrLen = 553; + vrLoc = 519; + }; + 6B25B4F50FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 34"; + rLen = 0; + rLoc = 679; + rType = 0; + vrLen = 460; + vrLoc = 415; + }; + 6B25B4F60FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4CF0FFA47F2004F1BC4 /* BuilderStatMesh.h */; + name = "BuilderStatMesh.h: 43"; + rLen = 0; + rLoc = 848; + rType = 0; + vrLen = 574; + vrLoc = 519; + }; + 6B25B4F70FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 41"; + rLen = 0; + rLoc = 680; + rType = 0; + vrLen = 620; + vrLoc = 514; + }; + 6B25B4F80FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4CF0FFA47F2004F1BC4 /* BuilderStatMesh.h */; + name = "BuilderStatMesh.h: 46"; + rLen = 0; + rLoc = 934; + rType = 0; + vrLen = 561; + vrLoc = 519; + }; + 6B25B4F90FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 76"; + rLen = 0; + rLoc = 1269; + rType = 0; + vrLen = 639; + vrLoc = 1153; + }; + 6B25B4FA0FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4CF0FFA47F2004F1BC4 /* BuilderStatMesh.h */; + name = "BuilderStatMesh.h: 43"; + rLen = 89; + rLoc = 848; + rType = 0; + vrLen = 561; + vrLoc = 519; + }; + 6B25B4FB0FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 164"; + rLen = 0; + rLoc = 3742; + rType = 0; + vrLen = 879; + vrLoc = 3435; + }; + 6B25B4FC0FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4CF0FFA47F2004F1BC4 /* BuilderStatMesh.h */; + name = "BuilderStatMesh.h: 45"; + rLen = 0; + rLoc = 769; + rType = 0; + vrLen = 518; + vrLoc = 519; + }; + 6B25B4FD0FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 164"; + rLen = 0; + rLoc = 3742; + rType = 0; + vrLen = 819; + vrLoc = 3435; + }; + 6B25B4FE0FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4CF0FFA47F2004F1BC4 /* BuilderStatMesh.h */; + name = "BuilderStatMesh.h: 45"; + rLen = 0; + rLoc = 769; + rType = 0; + vrLen = 518; + vrLoc = 519; + }; + 6B25B4FF0FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 172"; + rLen = 0; + rLoc = 4125; + rType = 0; + vrLen = 781; + vrLoc = 3559; + }; + 6B25B5000FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4CF0FFA47F2004F1BC4 /* BuilderStatMesh.h */; + name = "BuilderStatMesh.h: 45"; + rLen = 0; + rLoc = 769; + rType = 0; + vrLen = 518; + vrLoc = 519; + }; + 6B25B5010FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 175"; + rLen = 0; + rLoc = 4018; + rType = 0; + vrLen = 671; + vrLoc = 3559; + }; + 6B25B5020FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4CF0FFA47F2004F1BC4 /* BuilderStatMesh.h */; + name = "BuilderStatMesh.h: 47"; + rLen = 0; + rLoc = 818; + rType = 0; + vrLen = 540; + vrLoc = 519; + }; + 6B25B5030FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 204"; + rLen = 1; + rLoc = 4803; + rType = 0; + vrLen = 933; + vrLoc = 4318; + }; + 6B25B5040FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4CF0FFA47F2004F1BC4 /* BuilderStatMesh.h */; + name = "BuilderStatMesh.h: 57"; + rLen = 0; + rLoc = 1058; + rType = 0; + vrLen = 541; + vrLoc = 519; + }; + 6B25B5050FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 12"; + rLen = 0; + rLoc = 266; + rType = 0; + vrLen = 586; + vrLoc = 0; + }; + 6B25B5060FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4CF0FFA47F2004F1BC4 /* BuilderStatMesh.h */; + name = "BuilderStatMesh.h: 8"; + rLen = 0; + rLoc = 160; + rType = 0; + vrLen = 519; + vrLoc = 0; + }; + 6B25B5070FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 1"; + rLen = 17269; + rLoc = 0; + rType = 0; + vrLen = 811; + vrLoc = 16391; + }; + 6B25B5080FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3780FFA0075004F1BC4 /* Builder.cpp */; + name = "Builder.cpp: 125"; + rLen = 0; + rLoc = 2680; + rType = 0; + vrLen = 949; + vrLoc = 2083; + }; + 6B25B5090FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4CF0FFA47F2004F1BC4 /* BuilderStatMesh.h */; + name = "BuilderStatMesh.h: 8"; + rLen = 0; + rLoc = 160; + rType = 0; + vrLen = 519; + vrLoc = 0; + }; + 6B25B50A0FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderStatMeshSimple.h: 12"; + rLen = 0; + rLoc = 247; + rType = 0; + vrLen = 618; + vrLoc = 38; + }; + 6B25B50B0FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 364"; + rLen = 0; + rLoc = 7977; + rType = 0; + vrLen = 1047; + vrLoc = 10961; + }; + 6B25B50C0FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 57"; + rLen = 0; + rLoc = 1264; + rType = 0; + vrLen = 710; + vrLoc = 802; + }; + 6B25B50D0FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 33"; + rLen = 0; + rLoc = 598; + rType = 0; + vrLen = 499; + vrLoc = 385; + }; + 6B25B50E0FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 60"; + rLen = 0; + rLoc = 1311; + rType = 0; + vrLen = 579; + vrLoc = 63; + }; + 6B25B50F0FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 35"; + rLen = 0; + rLoc = 666; + rType = 0; + vrLen = 415; + vrLoc = 421; + }; + 6B25B5100FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderStatMeshSimple.h: 42"; + rLen = 0; + rLoc = 856; + rType = 0; + vrLen = 609; + vrLoc = 76; + }; + 6B25B5110FFA4CFD004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 12"; + rLen = 0; + rLoc = 169; + rType = 0; + vrLen = 565; + vrLoc = 0; + }; + 6B25B5150FFA4E5B004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 439"; + rLen = 0; + rLoc = 10053; + rType = 0; + vrLen = 783; + vrLoc = 9570; + }; + 6B25B5170FFA4E76004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 439"; + rLen = 0; + rLoc = 10063; + rType = 0; + vrLen = 786; + vrLoc = 9570; + }; + 6B25B5190FFA4E7C004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 439"; + rLen = 0; + rLoc = 10062; + rType = 0; + vrLen = 786; + vrLoc = 9570; + }; + 6B25B51B0FFA4E90004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 495"; + rLen = 0; + rLoc = 11480; + rType = 0; + vrLen = 474; + vrLoc = 10825; + }; + 6B25B51D0FFA4E96004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 495"; + rLen = 0; + rLoc = 11479; + rType = 0; + vrLen = 474; + vrLoc = 10825; + }; + 6B25B51F0FFA4EB9004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 495"; + rLen = 0; + rLoc = 11479; + rType = 0; + vrLen = 509; + vrLoc = 10825; + }; + 6B25B5200FFA4EB9004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 35"; + rLen = 0; + rLoc = 666; + rType = 0; + vrLen = 470; + vrLoc = 421; + }; + 6B25B5210FFA4EB9004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 495"; + rLen = 0; + rLoc = 11479; + rType = 0; + vrLen = 509; + vrLoc = 10825; + }; + 6B25B5220FFA4EB9004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 126"; + rLen = 0; + rLoc = 4387; + rType = 0; + vrLen = 1601; + vrLoc = 3004; + }; + 6B25B5240FFA4ECC004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 96"; + rLen = 0; + rLoc = 2187; + rType = 0; + vrLen = 1278; + vrLoc = 1767; + }; + 6B25B5260FFA4F2D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 98"; + rLen = 0; + rLoc = 2207; + rType = 0; + vrLen = 1396; + vrLoc = 1767; + }; + 6B25B5270FFA4F2D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7A0F7FCBE400459200 /* imgui.h */; + name = "imgui.h: 33"; + rLen = 18; + rLoc = 1229; + rType = 0; + vrLen = 800; + vrLoc = 837; + }; + 6B25B5280FFA4F2D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 98"; + rLen = 0; + rLoc = 2207; + rType = 0; + vrLen = 1396; + vrLoc = 1767; + }; + 6B25B5290FFA4F2D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7A0F7FCBE400459200 /* imgui.h */; + name = "imgui.h: 23"; + rLen = 0; + rLoc = 1045; + rType = 0; + vrLen = 781; + vrLoc = 837; + }; + 6B25B52A0FFA4F70004F1BC4 /* BuilderStatMeshTiling.h */ = { + isa = PBXFileReference; + fileEncoding = 4; + lastKnownFileType = sourcecode.c.h; + name = BuilderStatMeshTiling.h; + path = /Users/memon/Code/recastnavigation/RecastDemo/Build/Xcode/BuilderStatMeshTiling.h; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 1344}}"; + sepNavSelRange = "{1327, 0}"; + sepNavVisRange = "{1085, 663}"; + }; + }; + 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */ = { + isa = PBXFileReference; + fileEncoding = 4; + lastKnownFileType = sourcecode.cpp.cpp; + name = BuilderStatMeshTiling.cpp; + path = /Users/memon/Code/recastnavigation/RecastDemo/Build/Xcode/BuilderStatMeshTiling.cpp; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1219, 12352}}"; + sepNavSelRange = "{12210, 0}"; + sepNavVisRange = "{11516, 660}"; + }; + }; + 6B25B54F0FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7A0F7FCBE400459200 /* imgui.h */; + name = "imgui.h: 29"; + rLen = 0; + rLoc = 1161; + rType = 0; + vrLen = 898; + vrLoc = 837; + }; + 6B25B5500FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderStatMeshSimple.h: 42"; + rLen = 0; + rLoc = 856; + rType = 0; + vrLen = 661; + vrLoc = 473; + }; + 6B25B5510FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B36E0FF9F730004F1BC4 /* Builder.h */; + name = "Builder.h: 45"; + rLen = 0; + rLoc = 980; + rType = 0; + vrLen = 677; + vrLoc = 337; + }; + 6B25B5520FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52A0FFA4F70004F1BC4 /* BuilderStatMeshTiling.h */; + name = "BuilderStatMeshTiled.h: 70"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 687; + vrLoc = 1015; + }; + 6B25B5530FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 402"; + rLen = 168; + rLoc = 12936; + rType = 0; + vrLen = 726; + vrLoc = 12468; + }; + 6B25B5540FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 25"; + rLen = 0; + rLoc = 538; + rType = 0; + vrLen = 889; + vrLoc = 4031; + }; + 6B25B5550FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3780FFA0075004F1BC4 /* Builder.cpp */; + name = "Builder.cpp: 81"; + rLen = 76; + rLoc = 1576; + rType = 0; + vrLen = 1097; + vrLoc = 1311; + }; + 6B25B5560FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1265"; + rLen = 128; + rLoc = 37314; + rType = 0; + vrLen = 731; + vrLoc = 37046; + }; + 6B25B5570FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 248"; + rLen = 0; + rLoc = 5277; + rType = 0; + vrLen = 622; + vrLoc = 4886; + }; + 6B25B5580FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 24"; + rLen = 0; + rLoc = 192; + rType = 0; + vrLen = 555; + vrLoc = 143; + }; + 6B25B5590FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + rLen = 0; + rLoc = 223; + rType = 1; + }; + 6B25B55A0FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7A0F7FCBE400459200 /* imgui.h */; + name = "imgui.h: 29"; + rLen = 0; + rLoc = 1161; + rType = 0; + vrLen = 898; + vrLoc = 837; + }; + 6B25B55B0FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 234"; + rLen = 0; + rLoc = 4939; + rType = 0; + vrLen = 696; + vrLoc = 4524; + }; + 6B25B55C0FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderStatMeshSimple.h: 42"; + rLen = 0; + rLoc = 856; + rType = 0; + vrLen = 608; + vrLoc = 77; + }; + 6B25B55D0FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52A0FFA4F70004F1BC4 /* BuilderStatMeshTiling.h */; + name = "BuilderStatMeshTiled.h: 1"; + rLen = 0; + rLoc = 1748; + rType = 0; + vrLen = 0; + vrLoc = 0; + }; + 6B25B55E0FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderStatMeshSimple.h: 1"; + rLen = 1320; + rLoc = 0; + rType = 0; + vrLen = 608; + vrLoc = 77; + }; + 6B25B55F0FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52A0FFA4F70004F1BC4 /* BuilderStatMeshTiling.h */; + name = "BuilderStatMeshTiled.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 631; + vrLoc = 0; + }; + 6B25B5600FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 1"; + rLen = 17269; + rLoc = 0; + rType = 0; + vrLen = 1278; + vrLoc = 1767; + }; + 6B25B5610FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52A0FFA4F70004F1BC4 /* BuilderStatMeshTiling.h */; + name = "BuilderStatMeshTiled.h: 49"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 630; + vrLoc = 684; + }; + 6B25B5620FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 96"; + rLen = 0; + rLoc = 2187; + rType = 0; + vrLen = 1278; + vrLoc = 1767; + }; + 6B25B5630FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderStatMeshSimple.h: 42"; + rLen = 0; + rLoc = 856; + rType = 0; + vrLen = 661; + vrLoc = 473; + }; + 6B25B5640FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52A0FFA4F70004F1BC4 /* BuilderStatMeshTiling.h */; + name = "BuilderStatMeshTiled.h: 17"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 639; + vrLoc = 75; + }; + 6B25B5650FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52A0FFA4F70004F1BC4 /* BuilderStatMeshTiling.h */; + name = "BuilderStatMeshTiled.h: 17"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 619; + vrLoc = 75; + }; + 6B25B5660FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B36E0FF9F730004F1BC4 /* Builder.h */; + name = "Builder.h: 45"; + rLen = 0; + rLoc = 980; + rType = 0; + vrLen = 677; + vrLoc = 337; + }; + 6B25B5670FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3780FFA0075004F1BC4 /* Builder.cpp */; + name = "Builder.cpp: 77"; + rLen = 37; + rLoc = 1401; + rType = 0; + vrLen = 833; + vrLoc = 1121; + }; + 6B25B5680FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52A0FFA4F70004F1BC4 /* BuilderStatMeshTiling.h */; + name = "BuilderStatMeshTiled.h: 24"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 610; + vrLoc = 75; + }; + 6B25B5690FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52A0FFA4F70004F1BC4 /* BuilderStatMeshTiling.h */; + name = "BuilderStatMeshTiled.h: 16"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 610; + vrLoc = 75; + }; + 6B25B56A0FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 257"; + rLen = 0; + rLoc = 7949; + rType = 0; + vrLen = 846; + vrLoc = 7280; + }; + 6B25B56B0FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52A0FFA4F70004F1BC4 /* BuilderStatMeshTiling.h */; + name = "BuilderStatMeshTiled.h: 24"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 610; + vrLoc = 75; + }; + 6B25B56C0FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52A0FFA4F70004F1BC4 /* BuilderStatMeshTiling.h */; + name = "BuilderStatMeshTiled.h: 42"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 561; + vrLoc = 501; + }; + 6B25B56D0FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1558"; + rLen = 0; + rLoc = 44520; + rType = 0; + vrLen = 959; + vrLoc = 44084; + }; + 6B25B56E0FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 646"; + rLen = 0; + rLoc = 25283; + rType = 0; + vrLen = 2565; + vrLoc = 18889; + }; + 6B25B56F0FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3780FFA0075004F1BC4 /* Builder.cpp */; + name = "Builder.cpp: 86"; + rLen = 0; + rLoc = 1742; + rType = 0; + vrLen = 999; + vrLoc = 1335; + }; + 6B25B5700FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 254"; + rLen = 0; + rLoc = 10445; + rType = 0; + vrLen = 675; + vrLoc = 7123; + }; + 6B25B5710FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52A0FFA4F70004F1BC4 /* BuilderStatMeshTiling.h */; + name = "BuilderStatMeshTiled.h: 70"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 687; + vrLoc = 1015; + }; + 6B25B5720FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 53"; + rLen = 0; + rLoc = 192; + rType = 0; + vrLen = 602; + vrLoc = 719; + }; + 6B25B5730FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 402"; + rLen = 168; + rLoc = 12936; + rType = 0; + vrLen = 726; + vrLoc = 12468; + }; + 6B25B5740FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 25"; + rLen = 0; + rLoc = 538; + rType = 0; + vrLen = 889; + vrLoc = 4031; + }; + 6B25B5750FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3780FFA0075004F1BC4 /* Builder.cpp */; + name = "Builder.cpp: 81"; + rLen = 76; + rLoc = 1576; + rType = 0; + vrLen = 1097; + vrLoc = 1311; + }; + 6B25B5760FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 193"; + rLen = 0; + rLoc = 192; + rType = 0; + vrLen = 753; + vrLoc = 5478; + }; + 6B25B5770FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1265"; + rLen = 128; + rLoc = 37314; + rType = 0; + vrLen = 731; + vrLoc = 37046; + }; + 6B25B5780FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 704"; + rLen = 0; + rLoc = 25152; + rType = 0; + vrLen = 2569; + vrLoc = 20567; + }; + 6B25B5790FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 248"; + rLen = 0; + rLoc = 5277; + rType = 0; + vrLen = 622; + vrLoc = 4886; + }; + 6B25B57A0FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 24"; + rLen = 0; + rLoc = 192; + rType = 0; + vrLen = 555; + vrLoc = 143; + }; + 6B25B57B0FFA5899004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 224"; + rLen = 0; + rLoc = 6104; + rType = 0; + vrLen = 557; + vrLoc = 5887; + }; + 6B25B57C0FFA58AC004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; + name = "imgui.cpp: 690"; + rLen = 0; + rLoc = 16026; + rType = 0; + vrLen = 583; + vrLoc = 15651; + }; + 6B25B57D0FFA58AC004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 480"; + rLen = 0; + rLoc = 11198; + rType = 0; + vrLen = 312; + vrLoc = 10683; + }; + 6B25B57E0FFA58AC004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + rLen = 0; + rLoc = 223; + rType = 1; + }; + 6B25B57F0FFA58AC004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 224"; + rLen = 0; + rLoc = 6104; + rType = 0; + vrLen = 356; + vrLoc = 5887; + }; + 6B25B5800FFA58AC004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 480"; + rLen = 0; + rLoc = 11198; + rType = 0; + vrLen = 312; + vrLoc = 10683; + }; + 6B25B5810FFA58AC004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 223"; + rLen = 0; + rLoc = 6103; + rType = 0; + vrLen = 356; + vrLoc = 5887; + }; + 6B25B5820FFA58AC004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 480"; + rLen = 0; + rLoc = 11198; + rType = 0; + vrLen = 312; + vrLoc = 10683; + }; + 6B25B5830FFA58AC004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 221"; + rLen = 0; + rLoc = 6054; + rType = 0; + vrLen = 356; + vrLoc = 5887; + }; + 6B25B5850FFA58F3004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 222"; + rLen = 0; + rLoc = 6091; + rType = 0; + vrLen = 605; + vrLoc = 5827; + }; + 6B25B5860FFA58F3004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 298"; + rLen = 0; + rLoc = 192; + rType = 0; + vrLen = 755; + vrLoc = 8358; + }; + 6B25B5870FFA58F3004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 158"; + rLen = 0; + rLoc = 4966; + rType = 0; + vrLen = 649; + vrLoc = 4520; + }; + 6B25B5880FFA58F3004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 248"; + rLen = 0; + rLoc = 5277; + rType = 0; + vrLen = 594; + vrLoc = 4914; + }; + 6B25B5890FFA58F3004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 222"; + rLen = 0; + rLoc = 6091; + rType = 0; + vrLen = 605; + vrLoc = 5827; + }; + 6B25B58A0FFA58F3004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 248"; + rLen = 0; + rLoc = 5277; + rType = 0; + vrLen = 594; + vrLoc = 4914; + }; + 6B25B58B0FFA58F3004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 28"; + rLen = 0; + rLoc = 192; + rType = 0; + vrLen = 488; + vrLoc = 341; + }; + 6B25B58C0FFA58F3004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 146"; + rLen = 0; + rLoc = 4680; + rType = 0; + vrLen = 667; + vrLoc = 4520; + }; + 6B25B58D0FFA58F3004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 298"; + rLen = 0; + rLoc = 192; + rType = 0; + vrLen = 755; + vrLoc = 8358; + }; + 6B25B58E0FFA58F3004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 158"; + rLen = 0; + rLoc = 4966; + rType = 0; + vrLen = 649; + vrLoc = 4520; + }; + 6B25B58F0FFA58F3004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 249"; + rLen = 0; + rLoc = 5277; + rType = 0; + vrLen = 615; + vrLoc = 4914; + }; + 6B25B5910FFA5914004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 248"; + rLen = 0; + rLoc = 5254; + rType = 0; + vrLen = 617; + vrLoc = 4914; + }; + 6B25B5920FFA5914004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52A0FFA4F70004F1BC4 /* BuilderStatMeshTiling.h */; + name = "BuilderStatMeshTiled.h: 69"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 631; + vrLoc = 1111; + }; + 6B25B5930FFA5914004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 296"; + rLen = 0; + rLoc = 192; + rType = 0; + vrLen = 753; + vrLoc = 8358; + }; + 6B25B5940FFA5914004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 248"; + rLen = 0; + rLoc = 5254; + rType = 0; + vrLen = 617; + vrLoc = 4914; + }; + 6B25B5950FFA5914004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 296"; + rLen = 0; + rLoc = 192; + rType = 0; + vrLen = 753; + vrLoc = 8358; + }; + 6B25B5960FFA5914004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52A0FFA4F70004F1BC4 /* BuilderStatMeshTiling.h */; + name = "BuilderStatMeshTiled.h: 69"; + rLen = 0; + rLoc = 15; + rType = 0; + vrLen = 631; + vrLoc = 1111; + }; + 6B25B5970FFA5914004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 296"; + rLen = 0; + rLoc = 192; + rType = 0; + vrLen = 712; + vrLoc = 8358; + }; + 6B25B5990FFA5934004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 196"; + rLen = 0; + rLoc = 192; + rType = 0; + vrLen = 660; + vrLoc = 5711; + }; + 6B25B59D0FFA5A03004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BB788160FC0472B003C24DB /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 147"; + rLen = 75; + rLoc = 3713; + rType = 0; + vrLen = 775; + vrLoc = 3379; + }; + 6B25B59E0FFA5A03004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 379"; + rLen = 21; + rLoc = 13071; + rType = 0; + vrLen = 1231; + vrLoc = 10713; + }; + 6B25B59F0FFA5A03004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 379"; + rLen = 21; + rLoc = 13071; + rType = 0; + vrLen = 1268; + vrLoc = 10676; + }; + 6B25B5A00FFA5A03004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BB788160FC0472B003C24DB /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 147"; + rLen = 75; + rLoc = 3713; + rType = 0; + vrLen = 775; + vrLoc = 3379; + }; + 6B25B5A10FFA5A03004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 690"; + rLen = 0; + rLoc = 22261; + rType = 0; + vrLen = 2321; + vrLoc = 20427; + }; + 6B25B5A40FFA5A14004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 690"; + rLen = 0; + rLoc = 22261; + rType = 0; + vrLen = 2321; + vrLoc = 20427; + }; + 6B25B5A50FFA5A14004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + rLen = 0; + rLoc = 223; + rType = 1; + }; + 6B25B5A60FFA5A14004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 690"; + rLen = 0; + rLoc = 22261; + rType = 0; + vrLen = 2321; + vrLoc = 20427; + }; + 6B25B5A70FFA5A14004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 224"; + rLen = 0; + rLoc = 6104; + rType = 0; + vrLen = 537; + vrLoc = 5827; + }; + 6B25B5A90FFA5A4D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 224"; + rLen = 0; + rLoc = 6104; + rType = 0; + vrLen = 385; + vrLoc = 5858; + }; + 6B25B5AA0FFA5A4D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + rLen = 0; + rLoc = 418; + rType = 1; + }; + 6B25B5AB0FFA5A4D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 224"; + rLen = 0; + rLoc = 6104; + rType = 0; + vrLen = 385; + vrLoc = 5858; + }; + 6B25B5AC0FFA5A4D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 360"; + rLen = 0; + rLoc = 12210; + rType = 0; + vrLen = 700; + vrLoc = 11190; + }; + 6B25B5AF0FFA5A5A004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 224"; + rLen = 0; + rLoc = 6104; + rType = 0; + vrLen = 605; + vrLoc = 5827; + }; + 6B25B5B00FFA5A5A004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + comments = "error: expected `)' before ';' token"; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + rLen = 1; + rLoc = 415; + rType = 1; + }; + 6B25B5B10FFA5A5A004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 360"; + rLen = 0; + rLoc = 12213; + rType = 0; + vrLen = 1081; + vrLoc = 10260; + }; + 6B25B5B20FFA5AA9004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 319"; + rLen = 0; + rLoc = 10600; + rType = 0; + vrLen = 932; + vrLoc = 9069; + }; + 6B25B5B30FFA5AA9004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 158"; + rLen = 0; + rLoc = 4966; + rType = 0; + vrLen = 649; + vrLoc = 4520; + }; + 6B25B5B40FFA5AA9004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 319"; + rLen = 0; + rLoc = 10600; + rType = 0; + vrLen = 932; + vrLoc = 9069; + }; + 6B25B5B50FFA5AA9004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 259"; + rLen = 0; + rLoc = 7949; + rType = 0; + vrLen = 760; + vrLoc = 7280; + }; + 6B25B5BD0FFA5B3B004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 263"; + rLen = 0; + rLoc = 7978; + rType = 0; + vrLen = 1277; + vrLoc = 9664; + }; + 6B25B5BE0FFA5B3B004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1439"; + rLen = 893; + rLoc = 41665; + rType = 0; + vrLen = 701; + vrLoc = 42079; + }; + 6B25B5BF0FFA5B3B004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 178"; + rLen = 0; + rLoc = 192; + rType = 0; + vrLen = 842; + vrLoc = 5132; + }; + 6B25B5C00FFA5B3B004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 263"; + rLen = 0; + rLoc = 7978; + rType = 0; + vrLen = 1277; + vrLoc = 9664; + }; + 6B25B5C10FFA5B3B004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1439"; + rLen = 893; + rLoc = 41665; + rType = 0; + vrLen = 701; + vrLoc = 42079; + }; + 6B25B5C20FFA5B3B004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 205"; + rLen = 0; + rLoc = 192; + rType = 0; + vrLen = 536; + vrLoc = 5940; + }; + 6B25B5C70FFA5CCE004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 85"; + rLen = 0; + rLoc = 192; + rType = 0; + vrLen = 896; + vrLoc = 1439; + }; + 6B25B5C80FFA5CCE004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3780FFA0075004F1BC4 /* Builder.cpp */; + name = "Builder.cpp: 83"; + rLen = 0; + rLoc = 1652; + rType = 0; + vrLen = 409; + vrLoc = 0; + }; + 6B25B5C90FFA5CCE004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B36E0FF9F730004F1BC4 /* Builder.h */; + name = "Builder.h: 27"; + rLen = 0; + rLoc = 456; + rType = 0; + vrLen = 701; + vrLoc = 313; + }; + 6B25B5CA0FFA5CCE004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4CF0FFA47F2004F1BC4 /* BuilderStatMesh.h */; + name = "BuilderStatMesh.h: 55"; + rLen = 80; + rLoc = 939; + rType = 0; + vrLen = 584; + vrLoc = 622; + }; + 6B25B5CB0FFA5CCE004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1424"; + rLen = 0; + rLoc = 41235; + rType = 0; + vrLen = 537; + vrLoc = 40500; + }; + 6B25B5CC0FFA5CCE004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 239"; + rLen = 0; + rLoc = 7370; + rType = 0; + vrLen = 1010; + vrLoc = 6629; + }; + 6B25B5CD0FFA5CCE004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + comments = "error: declaration of 'const float r' shadows a parameter"; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + rLen = 0; + rLoc = 269; + rType = 1; + }; + 6B25B5CE0FFA5CCE004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 85"; + rLen = 0; + rLoc = 192; + rType = 0; + vrLen = 896; + vrLoc = 1439; + }; + 6B25B5CF0FFA5CCE004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1397"; + rLen = 934; + rLoc = 40678; + rType = 0; + vrLen = 848; + vrLoc = 40940; + }; + 6B25B5D00FFA5CCE004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 332"; + rLen = 0; + rLoc = 10806; + rType = 0; + vrLen = 1276; + vrLoc = 9664; + }; + 6B25B5D10FFA5CCE004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B36E0FF9F730004F1BC4 /* Builder.h */; + name = "Builder.h: 27"; + rLen = 0; + rLoc = 456; + rType = 0; + vrLen = 706; + vrLoc = 337; + }; + 6B25B5D20FFA5CCE004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3780FFA0075004F1BC4 /* Builder.cpp */; + name = "Builder.cpp: 83"; + rLen = 0; + rLoc = 1652; + rType = 0; + vrLen = 409; + vrLoc = 0; + }; + 6B25B5D30FFA5CCE004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B36E0FF9F730004F1BC4 /* Builder.h */; + name = "Builder.h: 27"; + rLen = 0; + rLoc = 456; + rType = 0; + vrLen = 701; + vrLoc = 313; + }; + 6B25B5D40FFA5CCE004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 262"; + rLen = 0; + rLoc = 6825; + rType = 0; + vrLen = 454; + vrLoc = 6601; + }; + 6B25B5D50FFA5CCE004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 262"; + rLen = 95; + rLoc = 6731; + rType = 0; + vrLen = 722; + vrLoc = 6682; + }; + 6B25B5D60FFA5CCE004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4CF0FFA47F2004F1BC4 /* BuilderStatMesh.h */; + name = "BuilderStatMesh.h: 55"; + rLen = 80; + rLoc = 939; + rType = 0; + vrLen = 584; + vrLoc = 622; + }; + 6B25B5D70FFA5CCE004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 235"; + rLen = 0; + rLoc = 7276; + rType = 0; + vrLen = 848; + vrLoc = 6575; + }; + 6B25B5D80FFA5CCE004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1424"; + rLen = 0; + rLoc = 41235; + rType = 0; + vrLen = 537; + vrLoc = 40500; + }; + 6B25B5D90FFA5CCE004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 167"; + rLen = 124; + rLoc = 3755; + rType = 0; + vrLen = 766; + vrLoc = 3380; + }; + 6B25B5DA0FFA5CCE004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 239"; + rLen = 0; + rLoc = 7370; + rType = 0; + vrLen = 1010; + vrLoc = 6629; + }; + 6B25B5DB0FFA5CCE004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 266"; + rLen = 0; + rLoc = 6875; + rType = 0; + vrLen = 954; + vrLoc = 6363; + }; + 6B25B5DD0FFA5CFC004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 266"; + rLen = 0; + rLoc = 6875; + rType = 0; + vrLen = 955; + vrLoc = 6363; + }; + 6B25B5DE0FFA5CFC004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 234"; + rLen = 310; + rLoc = 7136; + rType = 0; + vrLen = 985; + vrLoc = 6654; + }; + 6B25B5DF0FFA5CFC004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 85"; + rLen = 0; + rLoc = 192; + rType = 0; + vrLen = 851; + vrLoc = 1439; + }; + 6B25B5E00FFA5CFC004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 266"; + rLen = 0; + rLoc = 6875; + rType = 0; + vrLen = 955; + vrLoc = 6363; + }; + 6B25B5E10FFA5CFC004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 234"; + rLen = 310; + rLoc = 7136; + rType = 0; + vrLen = 985; + vrLoc = 6654; + }; + 6B25B5E20FFA5CFC004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 351"; + rLen = 0; + rLoc = 192; + rType = 0; + vrLen = 863; + vrLoc = 9506; + }; + 6B25B5E40FFA5D19004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 344"; + rLen = 0; + rLoc = 192; + rType = 0; + vrLen = 849; + vrLoc = 9618; + }; + 6B25B5E60FFA5D59004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 396"; + rLen = 0; + rLoc = 11492; + rType = 0; + vrLen = 1114; + vrLoc = 10988; + }; + 6B25B5E70FFA5D59004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 234"; + rLen = 310; + rLoc = 7136; + rType = 0; + vrLen = 985; + vrLoc = 6654; + }; + 6B25B5E80FFA5D59004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 396"; + rLen = 0; + rLoc = 11492; + rType = 0; + vrLen = 1114; + vrLoc = 10988; + }; + 6B25B5E90FFA5D59004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 284"; + rLen = 0; + rLoc = 8719; + rType = 0; + vrLen = 1086; + vrLoc = 7949; + }; + 6B25B5EB0FFA5E2E004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 43"; + rLen = 0; + rLoc = 832; + rType = 0; + vrLen = 754; + vrLoc = 1685; + }; + 6B25B5EC0FFA5E2E004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 499"; + rLen = 15; + rLoc = 17237; + rType = 0; + vrLen = 2584; + vrLoc = 14683; + }; + 6B25B5ED0FFA5E2E004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 396"; + rLen = 0; + rLoc = 11492; + rType = 0; + vrLen = 1114; + vrLoc = 10988; + }; + 6B25B5EE0FFA5E2E004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 284"; + rLen = 0; + rLoc = 8719; + rType = 0; + vrLen = 1120; + vrLoc = 7949; + }; + 6B25B5EF0FFA5E2E004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 43"; + rLen = 0; + rLoc = 832; + rType = 0; + vrLen = 754; + vrLoc = 1685; + }; + 6B25B5F00FFA5E2E004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 499"; + rLen = 15; + rLoc = 17237; + rType = 0; + vrLen = 2584; + vrLoc = 14683; + }; + 6B25B5F10FFA5E2E004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 789"; + rLen = 0; + rLoc = 25301; + rType = 0; + vrLen = 2569; + vrLoc = 22721; + }; + 6B25B5F30FFA5EB6004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 781"; + rLen = 0; + rLoc = 25062; + rType = 0; + vrLen = 2583; + vrLoc = 22721; + }; + 6B25B5F40FFA5EB6004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderStatMeshSimple.h: 42"; + rLen = 0; + rLoc = 856; + rType = 0; + vrLen = 641; + vrLoc = 493; + }; + 6B25B5F50FFA5EB6004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 499"; + rLen = 15; + rLoc = 17237; + rType = 0; + vrLen = 2584; + vrLoc = 14683; + }; + 6B25B5F60FFA5EB6004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 43"; + rLen = 0; + rLoc = 832; + rType = 0; + vrLen = 750; + vrLoc = 1685; + }; + 6B25B5F70FFA5EB6004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiled.cpp: 781"; + rLen = 0; + rLoc = 25062; + rType = 0; + vrLen = 2583; + vrLoc = 22721; + }; + 6B25B5F80FFA5EB6004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B3770FF9FCFF004F1BC4 /* BuilderStatMeshSimple.h */; + name = "BuilderStatMeshSimple.h: 42"; + rLen = 0; + rLoc = 856; + rType = 0; + vrLen = 641; + vrLoc = 493; + }; + 6B25B5F90FFA5EB6004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B37A0FFA01B8004F1BC4 /* BuilderStatMeshSimple.cpp */; + name = "BuilderStatMeshSimple.cpp: 499"; + rLen = 15; + rLoc = 17237; + rType = 0; + vrLen = 2584; + vrLoc = 14683; + }; + 6B25B5FA0FFA5EB6004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 67"; + rLen = 0; + rLoc = 1379; + rType = 0; + vrLen = 490; + vrLoc = 1112; + }; + 6B25B5FD0FFA5FC9004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 264"; + rLen = 0; + rLoc = 6896; + rType = 0; + vrLen = 818; + vrLoc = 6462; + }; + 6B25B5FE0FFA5FC9004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 103"; + rLen = 0; + rLoc = 1957; + rType = 0; + vrLen = 652; + vrLoc = 1604; + }; + 6B25B6030FFA61D9004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 103"; + rLen = 0; + rLoc = 1957; + rType = 0; + vrLen = 765; + vrLoc = 1604; + }; + 6B25B6040FFA61D9004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52A0FFA4F70004F1BC4 /* BuilderStatMeshTiling.h */; + name = "BuilderStatMeshTiled.h: 69"; + rLen = 21; + rLoc = 1339; + rType = 0; + vrLen = 634; + vrLoc = 1114; + }; + 6B25B6050FFA61D9004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiling.cpp: 392"; + rLen = 0; + rLoc = 11407; + rType = 0; + vrLen = 1229; + vrLoc = 10767; + }; + 6B25B6060FFA61D9004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + comments = "error: expected type-specifier before 'BuilderStatMeshTiled'"; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + rLen = 1; + rLoc = 541; + rType = 1; + }; + 6B25B6070FFA61D9004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B4D00FFA484E004F1BC4 /* BuilderStatMesh.cpp */; + name = "BuilderStatMesh.cpp: 103"; + rLen = 0; + rLoc = 1957; + rType = 0; + vrLen = 765; + vrLoc = 1604; + }; + 6B25B6080FFA61D9004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 538"; + rLen = 21; + rLoc = 12096; + rType = 0; + vrLen = 760; + vrLoc = 11634; + }; + 6B25B6090FFA61D9004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52A0FFA4F70004F1BC4 /* BuilderStatMeshTiling.h */; + name = "BuilderStatMeshTiled.h: 69"; + rLen = 21; + rLoc = 1339; + rType = 0; + vrLen = 634; + vrLoc = 1114; + }; + 6B25B60A0FFA61D9004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B52B0FFA4F77004F1BC4 /* BuilderStatMeshTiling.cpp */; + name = "BuilderStatMeshTiling.cpp: 392"; + rLen = 0; + rLoc = 11407; + rType = 0; + vrLen = 1229; + vrLoc = 10767; + }; + 6B25B60B0FFA61D9004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 510"; + rLen = 0; + rLoc = 11315; + rType = 0; + vrLen = 479; + vrLoc = 11018; + }; + 6B25B60D0FFA61FC004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 554"; + rLen = 0; + rLoc = 12503; + rType = 0; + vrLen = 706; + vrLoc = 11904; + }; + 6B25B60F0FFA622D004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 543"; + rLen = 0; + rLoc = 12168; + rType = 0; + vrLen = 877; + vrLoc = 11602; + }; + 6B25B6230FFA63C8004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6E0F7FCBBB00459200 /* SDLMain.m */; + name = "SDLMain.m: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 894; + vrLoc = 0; + }; + 6B25B6240FFA63C8004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BB788160FC0472B003C24DB /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 147"; + rLen = 75; + rLoc = 3713; + rType = 0; + vrLen = 772; + vrLoc = 3382; + }; + 6B25B6250FFA63C8004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6E0F7FCBBB00459200 /* SDLMain.m */; + name = "SDLMain.m: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 894; + vrLoc = 0; + }; + 6B25B6260FFA63C8004F1BC4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BB788160FC0472B003C24DB /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 123"; + rLen = 0; + rLoc = 3198; + rType = 0; + vrLen = 819; + vrLoc = 3059; + }; 6B458EA80FB4540500044EA9 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 6B137C810F7FCBFE00459200 /* RecastTimer.h */; @@ -595,26 +5677,6 @@ vrLen = 1077; vrLoc = 6771; }; - 6B6BC6C80FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C7F0F7FCBFE00459200 /* RecastDebugDraw.h */; - name = "RecastDebugDraw.h: 37"; - rLen = 27; - rLoc = 1297; - rType = 0; - vrLen = 1669; - vrLoc = 1005; - }; - 6B6BC6C90FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; - name = "RecastDebugDraw.cpp: 231"; - rLen = 0; - rLoc = 6147; - rType = 0; - vrLen = 568; - vrLoc = 5839; - }; 6B6BC6CA0FE7A3A4009E3CB9 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; @@ -625,446 +5687,6 @@ vrLen = 755; vrLoc = 6829; }; - 6B6BC6CB0FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; - name = "demo.cpp: 755"; - rLen = 0; - rLoc = 21775; - rType = 0; - vrLen = 942; - vrLoc = 21359; - }; - 6B6BC6CC0FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C850F7FCC1100459200 /* RecastFilter.cpp */; - name = "RecastFilter.cpp: 29"; - rLen = 0; - rLoc = 1139; - rType = 0; - vrLen = 564; - vrLoc = 982; - }; - 6B6BC6CD0FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; - name = "Recast.h: 308"; - rLen = 0; - rLoc = 8683; - rType = 0; - vrLen = 1247; - vrLoc = 8298; - }; - 6B6BC6CE0FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; - name = "RecastContour.cpp: 388"; - rLen = 0; - rLoc = 9576; - rType = 0; - vrLen = 537; - vrLoc = 9329; - }; - 6B6BC6CF0FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; - name = "RecastDebugDraw.cpp: 23"; - rLen = 0; - rLoc = 1029; - rType = 0; - vrLen = 1340; - vrLoc = 202; - }; - 6B6BC6D00FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; - name = "demo.cpp: 1887"; - rLen = 0; - rLoc = 54500; - rType = 0; - vrLen = 850; - vrLoc = 54170; - }; - 6B6BC6D10FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; - name = "RecastDebugDraw.cpp: 27"; - rLen = 0; - rLoc = 1157; - rType = 0; - vrLen = 929; - vrLoc = 784; - }; - 6B6BC6D20FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C7F0F7FCBFE00459200 /* RecastDebugDraw.h */; - name = "RecastDebugDraw.h: 44"; - rLen = 0; - rLoc = 1513; - rType = 0; - vrLen = 1735; - vrLoc = 1036; - }; - 6B6BC6D30FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; - name = "RecastDebugDraw.cpp: 150"; - rLen = 0; - rLoc = 4118; - rType = 0; - vrLen = 877; - vrLoc = 3724; - }; - 6B6BC6D40FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C7F0F7FCBFE00459200 /* RecastDebugDraw.h */; - name = "RecastDebugDraw.h: 44"; - rLen = 0; - rLoc = 1597; - rType = 0; - vrLen = 1735; - vrLoc = 1036; - }; - 6B6BC6D50FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; - name = "demo.cpp: 264"; - rLen = 0; - rLoc = 5842; - rType = 0; - vrLen = 725; - vrLoc = 5362; - }; - 6B6BC6D60FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; - name = "Recast.h: 69"; - rLen = 0; - rLoc = 2474; - rType = 0; - vrLen = 567; - vrLoc = 2109; - }; - 6B6BC6D70FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; - name = "Recast.cpp: 63"; - rLen = 19; - rLoc = 1811; - rType = 0; - vrLen = 835; - vrLoc = 1593; - }; - 6B6BC6D80FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; - name = "Recast.h: 274"; - rLen = 63; - rLoc = 7503; - rType = 0; - vrLen = 1252; - vrLoc = 6785; - }; - 6B6BC6D90FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; - name = "Recast.cpp: 307"; - rLen = 0; - rLoc = 7583; - rType = 0; - vrLen = 1164; - vrLoc = 7790; - }; - 6B6BC6DA0FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C880F7FCC1100459200 /* RecastRasterization.cpp */; - name = "RecastRasterization.cpp: 280"; - rLen = 0; - rLoc = 7320; - rType = 0; - vrLen = 1077; - vrLoc = 6771; - }; - 6B6BC6DB0FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; - name = "RecastDebugDraw.cpp: 150"; - rLen = 0; - rLoc = 4118; - rType = 0; - vrLen = 877; - vrLoc = 3724; - }; - 6B6BC6DC0FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C7F0F7FCBFE00459200 /* RecastDebugDraw.h */; - name = "RecastDebugDraw.h: 37"; - rLen = 27; - rLoc = 1297; - rType = 0; - vrLen = 1669; - vrLoc = 1005; - }; - 6B6BC6DD0FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; - name = "RecastDebugDraw.cpp: 231"; - rLen = 0; - rLoc = 6147; - rType = 0; - vrLen = 568; - vrLoc = 5839; - }; - 6B6BC6DE0FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; - name = "Recast.h: 275"; - rLen = 0; - rLoc = 7568; - rType = 0; - vrLen = 1004; - vrLoc = 6970; - }; - 6B6BC6DF0FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; - name = "demo.cpp: 404"; - rLen = 52; - rLoc = 10038; - rType = 0; - vrLen = 807; - vrLoc = 9694; - }; - 6B6BC6E00FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; - name = "Recast.cpp: 300"; - rLen = 0; - rLoc = 7583; - rType = 0; - vrLen = 892; - vrLoc = 7874; - }; - 6B6BC6E10FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; - name = "demo.cpp: 421"; - rLen = 0; - rLoc = 10641; - rType = 0; - vrLen = 896; - vrLoc = 10243; - }; - 6B6BC6E20FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; - name = "Recast.h: 275"; - rLen = 28; - rLoc = 7541; - rType = 0; - vrLen = 1003; - vrLoc = 6970; - }; - 6B6BC6E30FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; - name = "demo.cpp: 1319"; - rLen = 0; - rLoc = 38607; - rType = 0; - vrLen = 744; - vrLoc = 38320; - }; - 6B6BC6E40FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; - name = "Recast.h: 339"; - rLen = 25; - rLoc = 10302; - rType = 0; - vrLen = 1200; - vrLoc = 9386; - }; - 6B6BC6E50FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; - name = "Recast.cpp: 169"; - rLen = 0; - rLoc = 4356; - rType = 0; - vrLen = 814; - vrLoc = 5534; - }; - 6B6BC6E60FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; - name = "demo.cpp: 731"; - rLen = 0; - rLoc = 20972; - rType = 0; - vrLen = 1194; - vrLoc = 20652; - }; - 6B6BC6E70FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; - name = "Recast.h: 409"; - rLen = 0; - rLoc = 13315; - rType = 0; - vrLen = 1160; - vrLoc = 12120; - }; - 6B6BC6E80FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; - name = "demo.cpp: 757"; - rLen = 0; - rLoc = 21408; - rType = 0; - vrLen = 1232; - vrLoc = 20982; - }; - 6B6BC6E90FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; - name = "Recast.cpp: 220"; - rLen = 0; - rLoc = 5661; - rType = 0; - vrLen = 1176; - vrLoc = 5367; - }; - 6B6BC6EA0FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; - name = "Recast.h: 409"; - rLen = 0; - rLoc = 13315; - rType = 0; - vrLen = 1233; - vrLoc = 12047; - }; - 6B6BC6EB0FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; - name = "Recast.cpp: 297"; - rLen = 0; - rLoc = 7583; - rType = 0; - vrLen = 1109; - vrLoc = 7799; - }; - 6B6BC6EC0FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; - name = "Recast.h: 408"; - rLen = 0; - rLoc = 13315; - rType = 0; - vrLen = 1234; - vrLoc = 11781; - }; - 6B6BC6ED0FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; - name = "Recast.cpp: 264"; - rLen = 0; - rLoc = 7006; - rType = 0; - vrLen = 755; - vrLoc = 6829; - }; - 6B6BC6EE0FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; - name = "Recast.h: 394"; - rLen = 0; - rLoc = 12830; - rType = 0; - vrLen = 1272; - vrLoc = 11743; - }; - 6B6BC6EF0FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; - name = "demo.cpp: 658"; - rLen = 0; - rLoc = 19012; - rType = 0; - vrLen = 924; - vrLoc = 19055; - }; - 6B6BC6F00FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; - name = "Recast.h: 307"; - rLen = 18; - rLoc = 9038; - rType = 0; - vrLen = 928; - vrLoc = 7853; - }; - 6B6BC6F10FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C850F7FCC1100459200 /* RecastFilter.cpp */; - name = "RecastFilter.cpp: 27"; - rLen = 0; - rLoc = 1052; - rType = 0; - vrLen = 752; - vrLoc = 982; - }; - 6B6BC6F20FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; - name = "Recast.h: 308"; - rLen = 18; - rLoc = 9038; - rType = 0; - vrLen = 907; - vrLoc = 7983; - }; - 6B6BC6F30FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; - name = "demo.cpp: 755"; - rLen = 0; - rLoc = 21775; - rType = 0; - vrLen = 942; - vrLoc = 21359; - }; - 6B6BC6F40FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C850F7FCC1100459200 /* RecastFilter.cpp */; - name = "RecastFilter.cpp: 29"; - rLen = 0; - rLoc = 1139; - rType = 0; - vrLen = 564; - vrLoc = 982; - }; - 6B6BC6F50FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; - name = "Recast.h: 308"; - rLen = 0; - rLoc = 8683; - rType = 0; - vrLen = 1247; - vrLoc = 8298; - }; - 6B6BC6F60FE7A3A4009E3CB9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; - name = "RecastContour.cpp: 826"; - rLen = 0; - rLoc = 20664; - rType = 0; - vrLen = 793; - vrLoc = 20396; - }; 6B77072C0FBD540400D21BAE /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 6BDD9E050F91112200904EEF /* DetourStatNavMesh.h */; @@ -1103,16 +5725,6 @@ path = /Users/memon/Code/recastnavigation/RecastDemo/Include/ChunkyTriMesh.cpp; sourceTree = ""; }; - 6B7707EF0FBD90F100D21BAE /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C7B0F7FCBE400459200 /* MeshLoaderObj.h */; - name = "MeshLoaderObj.h: 34"; - rLen = 0; - rLoc = 1361; - rType = 0; - vrLen = 759; - vrLoc = 837; - }; 6B7707F00FBD90F100D21BAE /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 6B7707F10FBD90F100D21BAE /* btBvhTriangleMeshShape.h */; @@ -1170,7 +5782,7 @@ hitCount = 0; ignoreCount = 0; lineNumber = 5; - modificationTime = 265812977.276666; + modificationTime = 268065292.38634; state = 0; }; 6B7708F70FBDA96300D21BAE /* PBXTextBookmark */ = { @@ -1265,16 +5877,11 @@ name = SDL_events.h; path = /Library/Frameworks/SDL.framework/Versions/A/Headers/SDL_events.h; sourceTree = ""; - }; - 6B8A71D10FDAADCA00A0A6FB /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C880F7FCC1100459200 /* RecastRasterization.cpp */; - name = "RecastRasterization.cpp: 278"; - rLen = 0; - rLoc = 7231; - rType = 0; - vrLen = 948; - vrLoc = 6948; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 5344}}"; + sepNavSelRange = "{8853, 51}"; + sepNavVisRange = "{10249, 1342}"; + }; }; 6B8A71F40FDAB52200A0A6FB /* PBXTextBookmark */ = { isa = PBXTextBookmark; @@ -1286,16 +5893,6 @@ vrLen = 574; vrLoc = 0; }; - 6B8A71FC0FDABD0300A0A6FB /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C850F7FCC1100459200 /* RecastFilter.cpp */; - name = "RecastFilter.cpp: 79"; - rLen = 0; - rLoc = 2489; - rType = 0; - vrLen = 1095; - vrLoc = 2038; - }; 6B8B580A0FD80DA20088BD0D /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 6BDD9E080F91113800904EEF /* DetourStatNavMesh.cpp */; @@ -1326,76 +5923,6 @@ vrLen = 1243; vrLoc = 0; }; - 6B8FD18D0FD7C4D10059D643 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; - name = "RecastContour.cpp: 388"; - rLen = 0; - rLoc = 9576; - rType = 0; - vrLen = 937; - vrLoc = 8864; - }; - 6B8FD19B0FD7ED310059D643 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C7F0F7FCBFE00459200 /* RecastDebugDraw.h */; - name = "RecastDebugDraw.h: 50"; - rLen = 28; - rLoc = 1862; - rType = 0; - vrLen = 1807; - vrLoc = 1036; - }; - 6B8FD19C0FD7ED310059D643 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C860F7FCC1100459200 /* RecastLog.cpp */; - name = "RecastLog.cpp: 68"; - rLen = 0; - rLoc = 1703; - rType = 0; - vrLen = 512; - vrLoc = 1314; - }; - 6B8FD19E0FD7ED310059D643 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; - name = "Recast.h: 227"; - rLen = 8; - rLoc = 6171; - rType = 0; - vrLen = 638; - vrLoc = 6012; - }; - 6B8FD1A20FD7ED310059D643 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; - name = "RecastDebugDraw.cpp: 404"; - rLen = 0; - rLoc = 10077; - rType = 0; - vrLen = 697; - vrLoc = 9976; - }; - 6B8FD1A30FD7ED310059D643 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C860F7FCC1100459200 /* RecastLog.cpp */; - name = "RecastLog.cpp: 68"; - rLen = 0; - rLoc = 1703; - rType = 0; - vrLen = 512; - vrLoc = 1314; - }; - 6B8FD1A40FD7ED310059D643 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C850F7FCC1100459200 /* RecastFilter.cpp */; - name = "RecastFilter.cpp: 235"; - rLen = 0; - rLoc = 7174; - rType = 0; - vrLen = 1017; - vrLoc = 6018; - }; 6B8FD1CF0FD7F56C0059D643 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; @@ -1406,16 +5933,6 @@ vrLen = 723; vrLoc = 3786; }; - 6B901BFB0FE154A900CE8692 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; - name = "RecastDebugDraw.cpp: 23"; - rLen = 0; - rLoc = 1029; - rType = 0; - vrLen = 901; - vrLoc = 837; - }; 6B995BDF0FE0D9B300D5C493 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 6B137C890F7FCC1100459200 /* RecastRegion.cpp */; @@ -1426,25 +5943,771 @@ vrLen = 905; vrLoc = 2462; }; - 6B995BE00FE0D9B300D5C493 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; - name = "demo.cpp: 2024"; - rLen = 0; - rLoc = 54500; - rType = 0; - vrLen = 684; - vrLoc = 58091; + 6B9B7D7A0FF8D70E00A9090F /* main.cpp */ = { + isa = PBXFileReference; + fileEncoding = 4; + lastKnownFileType = sourcecode.cpp.cpp; + name = main.cpp; + path = /Users/memon/Code/recastnavigation/RecastDemo/Build/Xcode/main.cpp; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 10448}}"; + sepNavSelRange = "{12168, 0}"; + sepNavVisRange = "{11602, 902}"; + }; }; - 6B995BE40FE0D9B300D5C493 /* PBXTextBookmark */ = { + 6B9B7D990FF91AC600A9090F /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; - name = "RecastDebugDraw.cpp: 39"; - rLen = 1; - rLoc = 1385; + fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; + name = "RecastContour.cpp: 830"; + rLen = 0; + rLoc = 20761; rType = 0; - vrLen = 941; - vrLoc = 1009; + vrLen = 795; + vrLoc = 20354; + }; + 6B9B7D9A0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 235"; + rLen = 0; + rLoc = 6329; + rType = 0; + vrLen = 639; + vrLoc = 5887; + }; + 6B9B7D9B0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D9C0FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1840"; + rLen = 445; + rLoc = 53104; + rType = 0; + vrLen = 973; + vrLoc = 52596; + }; + 6B9B7D9C0FF91AC600A9090F /* demo.cpp */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = demo.cpp; + path = /Users/memon/Code/recastnavigation/RecastDemo/Source/demo.cpp; + sourceTree = ""; + }; + 6B9B7D9D0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BB788180FC04753003C24DB /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 33"; + rLen = 0; + rLoc = 1205; + rType = 0; + vrLen = 835; + vrLoc = 837; + }; + 6B9B7D9E0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7B0F7FCBE400459200 /* MeshLoaderObj.h */; + name = "MeshLoaderObj.h: 28"; + rLen = 0; + rLoc = 1074; + rType = 0; + vrLen = 654; + vrLoc = 942; + }; + 6B9B7D9F0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7F0F7FCBFE00459200 /* RecastDebugDraw.h */; + name = "RecastDebugDraw.h: 40"; + rLen = 132; + rLoc = 1428; + rType = 0; + vrLen = 1503; + vrLoc = 1005; + }; + 6B9B7DA00FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A30FF10F0C0083A694 /* tests.cpp */; + name = "tests.cpp: 227"; + rLen = 317; + rLoc = 4605; + rType = 0; + vrLen = 1229; + vrLoc = 4364; + }; + 6B9B7DA10FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A50FF10F260083A694 /* tests.h */; + name = "tests.h: 21"; + rLen = 87; + rLoc = 330; + rType = 0; + vrLen = 671; + vrLoc = 149; + }; + 6B9B7DA20FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 349"; + rLen = 0; + rLoc = 10871; + rType = 0; + vrLen = 1033; + vrLoc = 7532; + }; + 6B9B7DA30FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; + name = "RecastContour.cpp: 830"; + rLen = 0; + rLoc = 20761; + rType = 0; + vrLen = 795; + vrLoc = 20354; + }; + 6B9B7DA40FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 235"; + rLen = 0; + rLoc = 6329; + rType = 0; + vrLen = 639; + vrLoc = 5887; + }; + 6B9B7DA50FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DA60FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1151"; + rLen = 65; + rLoc = 33842; + rType = 0; + vrLen = 790; + vrLoc = 33743; + }; + 6B9B7DA60FF91AC600A9090F /* demo.cpp */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = demo.cpp; + path = /Users/memon/Code/recastnavigation/RecastDemo/Source/demo.cpp; + sourceTree = ""; + }; + 6B9B7DA70FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 210"; + rLen = 0; + rLoc = 9631; + rType = 0; + vrLen = 799; + vrLoc = 4705; + }; + 6B9B7DA80FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A50FF10F260083A694 /* tests.h */; + name = "tests.h: 24"; + rLen = 26; + rLoc = 513; + rType = 0; + vrLen = 695; + vrLoc = 76; + }; + 6B9B7DA90FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DAA0FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1151"; + rLen = 65; + rLoc = 33842; + rType = 0; + vrLen = 790; + vrLoc = 33743; + }; + 6B9B7DAA0FF91AC600A9090F /* demo.cpp */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = demo.cpp; + path = /Users/memon/Code/recastnavigation/RecastDemo/Source/demo.cpp; + sourceTree = ""; + }; + 6B9B7DAB0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 5"; + rLen = 0; + rLoc = 190; + rType = 0; + vrLen = 795; + vrLoc = 0; + }; + 6B9B7DAC0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A50FF10F260083A694 /* tests.h */; + name = "tests.h: 14"; + rLen = 0; + rLoc = 218; + rType = 0; + vrLen = 515; + vrLoc = 523; + }; + 6B9B7DAD0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 10"; + rLen = 0; + rLoc = 414; + rType = 0; + vrLen = 551; + vrLoc = 1128; + }; + 6B9B7DAE0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A50FF10F260083A694 /* tests.h */; + name = "tests.h: 13"; + rLen = 0; + rLoc = 194; + rType = 0; + vrLen = 583; + vrLoc = 32; + }; + 6B9B7DAF0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 65"; + rLen = 0; + rLoc = 4835; + rType = 0; + vrLen = 620; + vrLoc = 0; + }; + 6B9B7DB00FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 12"; + rLen = 0; + rLoc = 398; + rType = 0; + vrLen = 573; + vrLoc = 0; + }; + 6B9B7DB10FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7DB20FF91AC600A9090F /* demo.cpp */; + name = "demo.cpp: 1840"; + rLen = 445; + rLoc = 53104; + rType = 0; + vrLen = 973; + vrLoc = 52596; + }; + 6B9B7DB20FF91AC600A9090F /* demo.cpp */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = demo.cpp; + path = /Users/memon/Code/recastnavigation/RecastDemo/Source/demo.cpp; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1041, 30240}}"; + sepNavSelRange = "{41235, 0}"; + sepNavVisRange = "{40500, 537}"; + }; + }; + 6B9B7DB30FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 167"; + rLen = 0; + rLoc = 7986; + rType = 0; + vrLen = 874; + vrLoc = 3251; + }; + 6B9B7DB40FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A50FF10F260083A694 /* tests.h */; + name = "tests.h: 13"; + rLen = 0; + rLoc = 194; + rType = 0; + vrLen = 559; + vrLoc = 32; + }; + 6B9B7DB50FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 167"; + rLen = 0; + rLoc = 7986; + rType = 0; + vrLen = 822; + vrLoc = 3303; + }; + 6B9B7DB60FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A50FF10F260083A694 /* tests.h */; + name = "tests.h: 8"; + rLen = 0; + rLoc = 130; + rType = 0; + vrLen = 612; + vrLoc = 0; + }; + 6B9B7DB70FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A30FF10F0C0083A694 /* tests.cpp */; + name = "tests.cpp: 195"; + rLen = 0; + rLoc = 3857; + rType = 0; + vrLen = 533; + vrLoc = 3586; + }; + 6B9B7DB80FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A50FF10F260083A694 /* tests.h */; + name = "tests.h: 8"; + rLen = 0; + rLoc = 130; + rType = 0; + vrLen = 612; + vrLoc = 0; + }; + 6B9B7DB90FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A30FF10F0C0083A694 /* tests.cpp */; + name = "tests.cpp: 193"; + rLen = 0; + rLoc = 3855; + rType = 0; + vrLen = 533; + vrLoc = 3586; + }; + 6B9B7DBA0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A50FF10F260083A694 /* tests.h */; + name = "tests.h: 20"; + rLen = 0; + rLoc = 417; + rType = 0; + vrLen = 612; + vrLoc = 0; + }; + 6B9B7DBB0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 69"; + rLen = 0; + rLoc = 5253; + rType = 0; + vrLen = 611; + vrLoc = 1247; + }; + 6B9B7DBC0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A50FF10F260083A694 /* tests.h */; + name = "tests.h: 53"; + rLen = 0; + rLoc = 943; + rType = 0; + vrLen = 294; + vrLoc = 744; + }; + 6B9B7DBD0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 72"; + rLen = 0; + rLoc = 5252; + rType = 0; + vrLen = 649; + vrLoc = 1247; + }; + 6B9B7DBE0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BB788180FC04753003C24DB /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 33"; + rLen = 0; + rLoc = 1205; + rType = 0; + vrLen = 835; + vrLoc = 837; + }; + 6B9B7DBF0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A50FF10F260083A694 /* tests.h */; + name = "tests.h: 56"; + rLen = 0; + rLoc = 943; + rType = 0; + vrLen = 318; + vrLoc = 720; + }; + 6B9B7DC00FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 231"; + rLen = 0; + rLoc = 9958; + rType = 0; + vrLen = 650; + vrLoc = 5124; + }; + 6B9B7DC10FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A50FF10F260083A694 /* tests.h */; + name = "tests.h: 53"; + rLen = 0; + rLoc = 943; + rType = 0; + vrLen = 364; + vrLoc = 674; + }; + 6B9B7DC20FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A30FF10F0C0083A694 /* tests.cpp */; + name = "tests.cpp: 219"; + rLen = 0; + rLoc = 4190; + rType = 0; + vrLen = 549; + vrLoc = 4087; + }; + 6B9B7DC30FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A50FF10F260083A694 /* tests.h */; + name = "tests.h: 47"; + rLen = 0; + rLoc = 903; + rType = 0; + vrLen = 386; + vrLoc = 652; + }; + 6B9B7DC40FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A30FF10F0C0083A694 /* tests.cpp */; + name = "tests.cpp: 222"; + rLen = 0; + rLoc = 4190; + rType = 0; + vrLen = 1026; + vrLoc = 4150; + }; + 6B9B7DC50FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 231"; + rLen = 0; + rLoc = 9954; + rType = 0; + vrLen = 594; + vrLoc = 5458; + }; + 6B9B7DC60FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A50FF10F260083A694 /* tests.h */; + name = "tests.h: 43"; + rLen = 0; + rLoc = 841; + rType = 0; + vrLen = 426; + vrLoc = 612; + }; + 6B9B7DC70FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A30FF10F0C0083A694 /* tests.cpp */; + name = "tests.cpp: 215"; + rLen = 0; + rLoc = 4190; + rType = 0; + vrLen = 965; + vrLoc = 4078; + }; + 6B9B7DC80FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 254"; + rLen = 0; + rLoc = 14404; + rType = 0; + vrLen = 652; + vrLoc = 5389; + }; + 6B9B7DC90FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A50FF10F260083A694 /* tests.h */; + name = "tests.h: 45"; + rLen = 0; + rLoc = 902; + rType = 0; + vrLen = 459; + vrLoc = 579; + }; + 6B9B7DCA0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A30FF10F0C0083A694 /* tests.cpp */; + name = "tests.cpp: 215"; + rLen = 0; + rLoc = 4190; + rType = 0; + vrLen = 925; + vrLoc = 4012; + }; + 6B9B7DCB0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 284"; + rLen = 0; + rLoc = 11079; + rType = 0; + vrLen = 676; + vrLoc = 6448; + }; + 6B9B7DCC0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A30FF10F0C0083A694 /* tests.cpp */; + name = "tests.cpp: 253"; + rLen = 0; + rLoc = 5745; + rType = 0; + vrLen = 862; + vrLoc = 5170; + }; + 6B9B7DCD0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 310"; + rLen = 0; + rLoc = 14098; + rType = 0; + vrLen = 667; + vrLoc = 6871; + }; + 6B9B7DCE0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A30FF10F0C0083A694 /* tests.cpp */; + name = "tests.cpp: 269"; + rLen = 0; + rLoc = 5922; + rType = 0; + vrLen = 365; + vrLoc = 5740; + }; + 6B9B7DCF0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 309"; + rLen = 0; + rLoc = 12952; + rType = 0; + vrLen = 706; + vrLoc = 6837; + }; + 6B9B7DD00FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A30FF10F0C0083A694 /* tests.cpp */; + name = "tests.cpp: 179"; + rLen = 0; + rLoc = 3610; + rType = 0; + vrLen = 531; + vrLoc = 3254; + }; + 6B9B7DD10FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7B0F7FCBE400459200 /* MeshLoaderObj.h */; + name = "MeshLoaderObj.h: 28"; + rLen = 0; + rLoc = 1074; + rType = 0; + vrLen = 654; + vrLoc = 942; + }; + 6B9B7DD20FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 11"; + rLen = 0; + rLoc = 371; + rType = 0; + vrLen = 715; + vrLoc = 353; + }; + 6B9B7DD30FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A30FF10F0C0083A694 /* tests.cpp */; + name = "tests.cpp: 27"; + rLen = 1298; + rLoc = 427; + rType = 0; + vrLen = 889; + vrLoc = 1650; + }; + 6B9B7DD40FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 83"; + rLen = 0; + rLoc = 1630; + rType = 0; + vrLen = 545; + vrLoc = 0; + }; + 6B9B7DD50FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A30FF10F0C0083A694 /* tests.cpp */; + name = "tests.cpp: 8"; + rLen = 64; + rLoc = 123; + rType = 0; + vrLen = 512; + vrLoc = 0; + }; + 6B9B7DD60FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 415"; + rLen = 0; + rLoc = 13323; + rType = 0; + vrLen = 669; + vrLoc = 8637; + }; + 6B9B7DD70FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A50FF10F260083A694 /* tests.h */; + name = "tests.h: 25"; + rLen = 0; + rLoc = 539; + rType = 0; + vrLen = 638; + vrLoc = 149; + }; + 6B9B7DD80FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 326"; + rLen = 0; + rLoc = 10590; + rType = 0; + vrLen = 861; + vrLoc = 6832; + }; + 6B9B7DD90FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A30FF10F0C0083A694 /* tests.cpp */; + name = "tests.cpp: 191"; + rLen = 0; + rLoc = 3854; + rType = 0; + vrLen = 500; + vrLoc = 3610; + }; + 6B9B7DDA0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 7"; + rLen = 0; + rLoc = 190; + rType = 0; + vrLen = 576; + vrLoc = 0; + }; + 6B9B7DDB0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A30FF10F0C0083A694 /* tests.cpp */; + name = "tests.cpp: 20"; + rLen = 29; + rLoc = 347; + rType = 0; + vrLen = 512; + vrLoc = 0; + }; + 6B9B7DDC0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 12"; + rLen = 0; + rLoc = 169; + rType = 0; + vrLen = 520; + vrLoc = 0; + }; + 6B9B7DDD0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7F0F7FCBFE00459200 /* RecastDebugDraw.h */; + name = "RecastDebugDraw.h: 40"; + rLen = 132; + rLoc = 1428; + rType = 0; + vrLen = 1503; + vrLoc = 1005; + }; + 6B9B7DDE0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 299"; + rLen = 0; + rLoc = 9351; + rType = 0; + vrLen = 583; + vrLoc = 6605; + }; + 6B9B7DDF0FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A30FF10F0C0083A694 /* tests.cpp */; + name = "tests.cpp: 227"; + rLen = 317; + rLoc = 4605; + rType = 0; + vrLen = 1229; + vrLoc = 4364; + }; + 6B9B7DE00FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 349"; + rLen = 0; + rLoc = 10871; + rType = 0; + vrLen = 1038; + vrLoc = 7532; + }; + 6B9B7DE10FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A50FF10F260083A694 /* tests.h */; + name = "tests.h: 21"; + rLen = 0; + rLoc = 414; + rType = 0; + vrLen = 671; + vrLoc = 149; + }; + 6B9B7DE20FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 349"; + rLen = 0; + rLoc = 10871; + rType = 0; + vrLen = 1033; + vrLoc = 7532; + }; + 6B9B7DE30FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BC745A50FF10F260083A694 /* tests.h */; + name = "tests.h: 21"; + rLen = 87; + rLoc = 330; + rType = 0; + vrLen = 671; + vrLoc = 149; + }; + 6B9B7DE40FF91AC600A9090F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B9B7D7A0FF8D70E00A9090F /* main.cpp */; + name = "main.cpp: 494"; + rLen = 0; + rLoc = 14973; + rType = 0; + vrLen = 612; + vrLoc = 10682; }; 6BAE920D0FD8014C002875DB /* PBXTextBookmark */ = { isa = PBXTextBookmark; @@ -1498,16 +6761,16 @@ }; 6BB788160FC0472B003C24DB /* ChunkyTriMesh.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {969, 4032}}"; - sepNavSelRange = "{919, 0}"; - sepNavVisRange = "{0, 1243}"; + sepNavIntBoundsRect = "{{0, 0}, {969, 4064}}"; + sepNavSelRange = "{3198, 0}"; + sepNavVisRange = "{3059, 819}"; }; }; 6BB788180FC04753003C24DB /* ChunkyTriMesh.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {969, 800}}"; - sepNavSelRange = "{1176, 0}"; - sepNavVisRange = "{784, 916}"; + sepNavSelRange = "{1205, 0}"; + sepNavVisRange = "{837, 835}"; }; }; 6BB7881E0FC0593E003C24DB /* PBXTextBookmark */ = { @@ -1530,16 +6793,6 @@ vrLen = 1243; vrLoc = 0; }; - 6BB788230FC0593E003C24DB /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; - name = "Recast.cpp: 78"; - rLen = 177; - rLoc = 2359; - rType = 0; - vrLen = 818; - vrLoc = 1610; - }; 6BB788290FC0593E003C24DB /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 6BB788160FC0472B003C24DB /* ChunkyTriMesh.cpp */; @@ -1624,26 +6877,102 @@ vrLen = 707; vrLoc = 4122; }; - 6BC620900FD7C2380022CACF /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; - name = "demo.cpp: 1563"; - rLen = 0; - rLoc = 40053; - rType = 0; - vrLen = 898; - vrLoc = 42754; - }; 6BC620920FD7C2380022CACF /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 6B137C7F0F7FCBFE00459200 /* RecastDebugDraw.h */; name = "RecastDebugDraw.h: 51"; rLen = 22; - rLoc = 1995; + rLoc = 2089; rType = 0; - vrLen = 1807; + vrLen = 1638; vrLoc = 1036; }; + 6BC745A30FF10F0C0083A694 /* tests.cpp */ = { + isa = PBXFileReference; + fileEncoding = 4; + lastKnownFileType = sourcecode.cpp.cpp; + name = tests.cpp; + path = /Users/memon/Code/recastnavigation/RecastDemo/Source/tests.cpp; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 4880}}"; + sepNavSelRange = "{4107, 0}"; + sepNavVisRange = "{5920, 457}"; + }; + }; + 6BC745A50FF10F260083A694 /* tests.h */ = { + isa = PBXFileReference; + fileEncoding = 4; + lastKnownFileType = sourcecode.c.h; + name = tests.h; + path = /Users/memon/Code/recastnavigation/RecastDemo/Include/tests.h; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 944}}"; + sepNavSelRange = "{986, 0}"; + sepNavVisRange = "{440, 578}"; + }; + }; + 6BC745A60FF527E50083A694 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; + name = "RecastDebugDraw.cpp: 406"; + rLen = 0; + rLoc = 9915; + rType = 0; + vrLen = 952; + vrLoc = 9881; + }; + 6BC745A70FF527E50083A694 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C860F7FCC1100459200 /* RecastLog.cpp */; + name = "RecastLog.cpp: 68"; + rLen = 0; + rLoc = 1703; + rType = 0; + vrLen = 668; + vrLoc = 1158; + }; + 6BC745A80FF527E50083A694 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C850F7FCC1100459200 /* RecastFilter.cpp */; + name = "RecastFilter.cpp: 245"; + rLen = 0; + rLoc = 7174; + rType = 0; + vrLen = 1272; + vrLoc = 5903; + }; + 6BC745AD0FF527E50083A694 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; + name = "RecastDebugDraw.cpp: 406"; + rLen = 0; + rLoc = 9915; + rType = 0; + vrLen = 952; + vrLoc = 9881; + }; + 6BC745AE0FF527E50083A694 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C860F7FCC1100459200 /* RecastLog.cpp */; + name = "RecastLog.cpp: 68"; + rLen = 0; + rLoc = 1703; + rType = 0; + vrLen = 668; + vrLoc = 1158; + }; + 6BC745AF0FF527E50083A694 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C850F7FCC1100459200 /* RecastFilter.cpp */; + name = "RecastFilter.cpp: 245"; + rLen = 0; + rLoc = 7174; + rType = 0; + vrLen = 1272; + vrLoc = 5903; + }; 6BDD9E040F91112200904EEF /* DetourDebugDraw.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {969, 553}}"; diff --git a/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.perspectivev3 b/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.perspectivev3 index 1ec9d23..3d3a480 100644 --- a/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.perspectivev3 +++ b/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.perspectivev3 @@ -268,8 +268,6 @@ 29B97314FDCFA39411CA2CEA 080E96DDFE201D6D7F000001 - 6BDD9E030F91110C00904EEF - 6B137C7D0F7FCBE800459200 29B97315FDCFA39411CA2CEA 29B97317FDCFA39411CA2CEA 1C37FBAC04509CD000000102 @@ -278,8 +276,7 @@ PBXSmartGroupTreeModuleOutlineStateSelectionKey - 11 - 9 + 19 1 0 @@ -320,7 +317,7 @@ PBXProjectModuleGUID 6B8632A30F78115100E2684A PBXProjectModuleLabel - RecastContour.cpp + ChunkyTriMesh.cpp PBXSplitModuleInNavigatorKey Split0 @@ -328,46 +325,48 @@ PBXProjectModuleGUID 6B8632A40F78115100E2684A PBXProjectModuleLabel - RecastContour.cpp + ChunkyTriMesh.cpp _historyCapacity 0 bookmark - 6B6BC6F60FE7A3A4009E3CB9 + 6B25B6260FFA63C8004F1BC4 history - 6B8633370F7813A600E2684A 6BB87E0B0F9DE8A300E33F12 6B7707AF0FBD66CF00D21BAE - 6B7707EF0FBD90F100D21BAE 6B7707F00FBD90F100D21BAE 6BB7876B0FC03EAD003C24DB - 6BB787710FC03EAD003C24DB - 6BB7881E0FC0593E003C24DB - 6BB7881F0FC0593E003C24DB 6B8171D70FC327630022159F 6BB85D3A0FCEAA6300758966 - 6B09CDFF0FD5563E005637D5 6B09CE5C0FD5BDE6005637D5 6B09CE5F0FD5BDE6005637D5 6B09CE730FD5BEC3005637D5 - 6B8FD19C0FD7ED310059D643 6B8FD1CF0FD7F56C0059D643 6BAE920D0FD8014C002875DB 6B8B580A0FD80DA20088BD0D 6B8A71F40FDAB52200A0A6FB 6B995BDF0FE0D9B300D5C493 6B6BC6C70FE7A3A4009E3CB9 - 6B6BC6C80FE7A3A4009E3CB9 - 6B6BC6C90FE7A3A4009E3CB9 6B6BC6CA0FE7A3A4009E3CB9 - 6B6BC6CB0FE7A3A4009E3CB9 - 6B6BC6CC0FE7A3A4009E3CB9 - 6B6BC6CD0FE7A3A4009E3CB9 - 6B6BC6CE0FE7A3A4009E3CB9 + 6BC745A70FF527E50083A694 + 6BC745A80FF527E50083A694 + 6B9B7D990FF91AC600A9090F + 6B9B7D9D0FF91AC600A9090F + 6B25B3A60FFA124D004F1BC4 + 6B25B3A80FFA124D004F1BC4 + 6B25B3AB0FFA124D004F1BC4 + 6B25B43E0FFA1786004F1BC4 + 6B25B44B0FFA1968004F1BC4 + 6B25B4710FFA1FE0004F1BC4 + 6B25B4740FFA1FE0004F1BC4 + 6B25B54F0FFA5899004F1BC4 + 6B25B5AF0FFA5A5A004F1BC4 + 6B25B5CB0FFA5CCE004F1BC4 + 6B25B6230FFA63C8004F1BC4 + 6B25B6240FFA63C8004F1BC4 prevStack - 6B86333B0F7813A600E2684A 6B1E02680F924A8500CC0038 6B1E02750F924A8500CC0038 6B1E028F0F924D5A00CC0038 @@ -389,51 +388,53 @@ 6BB7882A0FC0593E003C24DB 6BB7882B0FC0593E003C24DB 6BB85D3E0FCEAA6300758966 - 6B09CE1E0FD55805005637D5 - 6B09CE2D0FD55B4D005637D5 6BC620920FD7C2380022CACF - 6B8FD1A20FD7ED310059D643 - 6B8FD1A30FD7ED310059D643 - 6B8FD1A40FD7ED310059D643 - 6B6BC6CF0FE7A3A4009E3CB9 - 6B6BC6D00FE7A3A4009E3CB9 - 6B6BC6D10FE7A3A4009E3CB9 - 6B6BC6D20FE7A3A4009E3CB9 - 6B6BC6D30FE7A3A4009E3CB9 - 6B6BC6D40FE7A3A4009E3CB9 - 6B6BC6D50FE7A3A4009E3CB9 - 6B6BC6D60FE7A3A4009E3CB9 - 6B6BC6D70FE7A3A4009E3CB9 - 6B6BC6D80FE7A3A4009E3CB9 - 6B6BC6D90FE7A3A4009E3CB9 - 6B6BC6DA0FE7A3A4009E3CB9 - 6B6BC6DB0FE7A3A4009E3CB9 - 6B6BC6DC0FE7A3A4009E3CB9 - 6B6BC6DD0FE7A3A4009E3CB9 - 6B6BC6DE0FE7A3A4009E3CB9 - 6B6BC6DF0FE7A3A4009E3CB9 - 6B6BC6E00FE7A3A4009E3CB9 - 6B6BC6E10FE7A3A4009E3CB9 - 6B6BC6E20FE7A3A4009E3CB9 - 6B6BC6E30FE7A3A4009E3CB9 - 6B6BC6E40FE7A3A4009E3CB9 - 6B6BC6E50FE7A3A4009E3CB9 - 6B6BC6E60FE7A3A4009E3CB9 - 6B6BC6E70FE7A3A4009E3CB9 - 6B6BC6E80FE7A3A4009E3CB9 - 6B6BC6E90FE7A3A4009E3CB9 - 6B6BC6EA0FE7A3A4009E3CB9 - 6B6BC6EB0FE7A3A4009E3CB9 - 6B6BC6EC0FE7A3A4009E3CB9 - 6B6BC6ED0FE7A3A4009E3CB9 - 6B6BC6EE0FE7A3A4009E3CB9 - 6B6BC6EF0FE7A3A4009E3CB9 - 6B6BC6F00FE7A3A4009E3CB9 - 6B6BC6F10FE7A3A4009E3CB9 - 6B6BC6F20FE7A3A4009E3CB9 - 6B6BC6F30FE7A3A4009E3CB9 - 6B6BC6F40FE7A3A4009E3CB9 - 6B6BC6F50FE7A3A4009E3CB9 + 6BC745AD0FF527E50083A694 + 6BC745AE0FF527E50083A694 + 6BC745AF0FF527E50083A694 + 6B9B7DA30FF91AC600A9090F + 6B9B7DA40FF91AC600A9090F + 6B25B3B70FFA124D004F1BC4 + 6B25B3B80FFA124D004F1BC4 + 6B25B3B90FFA124D004F1BC4 + 6B25B3BA0FFA124D004F1BC4 + 6B25B3BB0FFA124D004F1BC4 + 6B25B3BC0FFA124D004F1BC4 + 6B25B3BD0FFA124D004F1BC4 + 6B25B3BE0FFA124D004F1BC4 + 6B25B3BF0FFA124D004F1BC4 + 6B25B3C00FFA124D004F1BC4 + 6B25B3C20FFA124D004F1BC4 + 6B25B3C60FFA124D004F1BC4 + 6B25B3C70FFA124D004F1BC4 + 6B25B3F40FFA124D004F1BC4 + 6B25B4120FFA1545004F1BC4 + 6B25B4130FFA1545004F1BC4 + 6B86333B0F7813A600E2684A + 6B25B4080FFA13E9004F1BC4 + 6B25B4280FFA16C0004F1BC4 + 6B25B4360FFA174A004F1BC4 + 6B25B4370FFA174A004F1BC4 + 6B25B4400FFA1786004F1BC4 + 6B25B4420FFA1786004F1BC4 + 6B25B4500FFA1968004F1BC4 + 6B25B4510FFA1968004F1BC4 + 6B25B4530FFA1968004F1BC4 + 6B25B4550FFA1968004F1BC4 + 6B25B4560FFA1968004F1BC4 + 6B25B4580FFA1968004F1BC4 + 6B25B4590FFA1968004F1BC4 + 6B25B45A0FFA1968004F1BC4 + 6B25B4780FFA1FE0004F1BC4 + 6B25B4850FFA1FE0004F1BC4 + 6B25B55A0FFA5899004F1BC4 + 6B25B56D0FFA5899004F1BC4 + 6B25B5770FFA5899004F1BC4 + 6B25B5890FFA58F3004F1BC4 + 6B25B5A00FFA5A03004F1BC4 + 6B25B5CF0FFA5CCE004F1BC4 + 6B25B5D80FFA5CCE004F1BC4 + 6B25B6250FFA63C8004F1BC4 SplitCount @@ -447,18 +448,18 @@ GeometryConfiguration Frame - {{0, 0}, {1030, 673}} + {{0, 0}, {1030, 512}} RubberWindowFrame 0 59 1280 719 0 0 1280 778 Module PBXNavigatorGroup Proportion - 673pt + 512pt Proportion - 0pt + 161pt Tabs @@ -472,7 +473,7 @@ GeometryConfiguration Frame - {{10, 27}, {1030, 61}} + {{10, 27}, {1030, 134}} Module XCDetailModule @@ -489,8 +490,6 @@ Frame {{10, 27}, {1030, -27}} - RubberWindowFrame - 0 59 1280 719 0 0 1280 778 Module PBXProjectFindModule @@ -528,7 +527,9 @@ GeometryConfiguration Frame - {{10, 27}, {1030, 52}} + {{10, 27}, {1030, 134}} + RubberWindowFrame + 0 59 1280 719 0 0 1280 778 Module PBXBuildResultsModule @@ -556,11 +557,11 @@ TableOfContents - 6B6BC6F70FE7A3A4009E3CB9 + 6B25B3F90FFA1250004F1BC4 1CA23ED40692098700951B8B - 6B6BC6F80FE7A3A4009E3CB9 + 6B25B3FA0FFA1250004F1BC4 6B8632A30F78115100E2684A - 6B6BC6F90FE7A3A4009E3CB9 + 6B25B3FB0FFA1250004F1BC4 1CA23EDF0692099D00951B8B 1CA23EE00692099D00951B8B 1CA23EE10692099D00951B8B @@ -609,12 +610,12 @@ GeometryConfiguration Frame - {{0, 0}, {1280, 190}} + {{0, 0}, {1280, 199}} Module PBXDebugCLIModule Proportion - 190pt + 199pt ContentConfiguration @@ -633,8 +634,8 @@ yes sizes - {{0, 0}, {637, 124}} - {{637, 0}, {643, 124}} + {{0, 0}, {637, 130}} + {{637, 0}, {643, 130}} VerticalSplitView @@ -649,8 +650,8 @@ yes sizes - {{0, 0}, {1280, 124}} - {{0, 124}, {1280, 327}} + {{0, 0}, {1280, 130}} + {{0, 130}, {1280, 344}} @@ -670,7 +671,7 @@ DebugSTDIOWindowFrame {{200, 200}, {500, 300}} Frame - {{0, 195}, {1280, 451}} + {{0, 204}, {1280, 474}} PBXDebugSessionStackFrameViewKey DebugVariablesTableConfiguration @@ -683,13 +684,13 @@ 413 Frame - {{637, 0}, {643, 124}} + {{637, 0}, {643, 130}} Module PBXDebugSessionModule Proportion - 451pt + 474pt Name @@ -707,14 +708,14 @@ TableOfContents - 6B6BC6FA0FE7A3A4009E3CB9 + 6B25B3FC0FFA1250004F1BC4 1CCC7628064C1048000F2A68 1CCC7629064C1048000F2A68 - 6B6BC6FB0FE7A3A4009E3CB9 - 6B6BC6FC0FE7A3A4009E3CB9 - 6B6BC6FD0FE7A3A4009E3CB9 - 6B6BC6FE0FE7A3A4009E3CB9 - 6B6BC6FF0FE7A3A4009E3CB9 + 6B25B3FD0FFA1250004F1BC4 + 6B25B3FE0FFA1250004F1BC4 + 6B25B3FF0FFA1250004F1BC4 + 6B25B4000FFA1250004F1BC4 + 6B8632A30F78115100E2684A ToolbarConfiguration xcode.toolbar.config.debugV3 @@ -744,6 +745,8 @@ 5 WindowOrderList + 6B25B4CD0FFA2673004F1BC4 + 6B25B4CE0FFA2673004F1BC4 /Users/memon/Code/recastnavigation/RecastDemo/Build/Xcode/Recast.xcodeproj WindowString diff --git a/RecastDemo/Build/Xcode/Recast.xcodeproj/project.pbxproj b/RecastDemo/Build/Xcode/Recast.xcodeproj/project.pbxproj index 8ac178c..12397df 100644 --- a/RecastDemo/Build/Xcode/Recast.xcodeproj/project.pbxproj +++ b/RecastDemo/Build/Xcode/Recast.xcodeproj/project.pbxproj @@ -8,7 +8,6 @@ /* Begin PBXBuildFile section */ 1DDD58160DA1D0A300B32029 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1DDD58140DA1D0A300B32029 /* MainMenu.xib */; }; - 6B137C6F0F7FCBBB00459200 /* demo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; }; 6B137C700F7FCBBB00459200 /* glfont.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B137C6B0F7FCBBB00459200 /* glfont.cpp */; }; 6B137C710F7FCBBB00459200 /* imgui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B137C6C0F7FCBBB00459200 /* imgui.cpp */; }; 6B137C720F7FCBBB00459200 /* MeshLoaderObj.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B137C6D0F7FCBBB00459200 /* MeshLoaderObj.cpp */; }; @@ -22,6 +21,11 @@ 6B137C910F7FCC1100459200 /* RecastRasterization.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B137C880F7FCC1100459200 /* RecastRasterization.cpp */; }; 6B137C920F7FCC1100459200 /* RecastRegion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B137C890F7FCC1100459200 /* RecastRegion.cpp */; }; 6B137C930F7FCC1100459200 /* RecastTimer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B137C8A0F7FCC1100459200 /* RecastTimer.cpp */; }; + 6B25B6190FFA62BE004F1BC4 /* Builder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B25B6140FFA62BE004F1BC4 /* Builder.cpp */; }; + 6B25B61A0FFA62BE004F1BC4 /* BuilderStatMesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B25B6150FFA62BE004F1BC4 /* BuilderStatMesh.cpp */; }; + 6B25B61B0FFA62BE004F1BC4 /* BuilderStatMeshSimple.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B25B6160FFA62BE004F1BC4 /* BuilderStatMeshSimple.cpp */; }; + 6B25B61C0FFA62BE004F1BC4 /* BuilderStatMeshTiling.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B25B6170FFA62BE004F1BC4 /* BuilderStatMeshTiling.cpp */; }; + 6B25B61D0FFA62BE004F1BC4 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */; }; 6B8632DA0F78122C00E2684A /* SDL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6B8632D90F78122C00E2684A /* SDL.framework */; }; 6B8632DC0F78123E00E2684A /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6B8632DB0F78123E00E2684A /* OpenGL.framework */; }; 6BB788170FC0472B003C24DB /* ChunkyTriMesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6BB788160FC0472B003C24DB /* ChunkyTriMesh.cpp */; }; @@ -40,7 +44,6 @@ 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* Recast_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Recast_Prefix.pch; sourceTree = ""; }; - 6B137C6A0F7FCBBB00459200 /* demo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = demo.cpp; path = ../../Source/demo.cpp; sourceTree = SOURCE_ROOT; }; 6B137C6B0F7FCBBB00459200 /* glfont.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = glfont.cpp; path = ../../Source/glfont.cpp; sourceTree = SOURCE_ROOT; }; 6B137C6C0F7FCBBB00459200 /* imgui.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui.cpp; path = ../../Source/imgui.cpp; sourceTree = SOURCE_ROOT; }; 6B137C6D0F7FCBBB00459200 /* MeshLoaderObj.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MeshLoaderObj.cpp; path = ../../Source/MeshLoaderObj.cpp; sourceTree = SOURCE_ROOT; }; @@ -62,6 +65,15 @@ 6B137C880F7FCC1100459200 /* RecastRasterization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RecastRasterization.cpp; path = ../../../Recast/Source/RecastRasterization.cpp; sourceTree = SOURCE_ROOT; }; 6B137C890F7FCC1100459200 /* RecastRegion.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RecastRegion.cpp; path = ../../../Recast/Source/RecastRegion.cpp; sourceTree = SOURCE_ROOT; }; 6B137C8A0F7FCC1100459200 /* RecastTimer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RecastTimer.cpp; path = ../../../Recast/Source/RecastTimer.cpp; sourceTree = SOURCE_ROOT; }; + 6B25B6100FFA62AD004F1BC4 /* Builder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Builder.h; path = ../../Include/Builder.h; sourceTree = SOURCE_ROOT; }; + 6B25B6110FFA62AD004F1BC4 /* BuilderStatMesh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BuilderStatMesh.h; path = ../../Include/BuilderStatMesh.h; sourceTree = SOURCE_ROOT; }; + 6B25B6120FFA62AD004F1BC4 /* BuilderStatMeshSimple.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BuilderStatMeshSimple.h; path = ../../Include/BuilderStatMeshSimple.h; sourceTree = SOURCE_ROOT; }; + 6B25B6130FFA62AD004F1BC4 /* BuilderStatMeshTiling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BuilderStatMeshTiling.h; path = ../../Include/BuilderStatMeshTiling.h; sourceTree = SOURCE_ROOT; }; + 6B25B6140FFA62BE004F1BC4 /* Builder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Builder.cpp; path = ../../Source/Builder.cpp; sourceTree = SOURCE_ROOT; }; + 6B25B6150FFA62BE004F1BC4 /* BuilderStatMesh.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = BuilderStatMesh.cpp; path = ../../Source/BuilderStatMesh.cpp; sourceTree = SOURCE_ROOT; }; + 6B25B6160FFA62BE004F1BC4 /* BuilderStatMeshSimple.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = BuilderStatMeshSimple.cpp; path = ../../Source/BuilderStatMeshSimple.cpp; sourceTree = SOURCE_ROOT; }; + 6B25B6170FFA62BE004F1BC4 /* BuilderStatMeshTiling.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = BuilderStatMeshTiling.cpp; path = ../../Source/BuilderStatMeshTiling.cpp; sourceTree = SOURCE_ROOT; }; + 6B25B6180FFA62BE004F1BC4 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = main.cpp; path = ../../Source/main.cpp; sourceTree = SOURCE_ROOT; }; 6B8632D90F78122C00E2684A /* SDL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SDL.framework; path = Library/Frameworks/SDL.framework; sourceTree = SDKROOT; }; 6B8632DB0F78123E00E2684A /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; 6BB788160FC0472B003C24DB /* ChunkyTriMesh.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ChunkyTriMesh.cpp; path = ../../Source/ChunkyTriMesh.cpp; sourceTree = SOURCE_ROOT; }; @@ -93,6 +105,15 @@ 080E96DDFE201D6D7F000001 /* Classes */ = { isa = PBXGroup; children = ( + 6B25B6140FFA62BE004F1BC4 /* Builder.cpp */, + 6B25B6150FFA62BE004F1BC4 /* BuilderStatMesh.cpp */, + 6B25B6160FFA62BE004F1BC4 /* BuilderStatMeshSimple.cpp */, + 6B25B6170FFA62BE004F1BC4 /* BuilderStatMeshTiling.cpp */, + 6B25B6180FFA62BE004F1BC4 /* main.cpp */, + 6B25B6100FFA62AD004F1BC4 /* Builder.h */, + 6B25B6110FFA62AD004F1BC4 /* BuilderStatMesh.h */, + 6B25B6120FFA62AD004F1BC4 /* BuilderStatMeshSimple.h */, + 6B25B6130FFA62AD004F1BC4 /* BuilderStatMeshTiling.h */, 6BDD9E030F91110C00904EEF /* Detour */, 6B137C7D0F7FCBE800459200 /* Recast */, 6B137C790F7FCBE400459200 /* glfont.h */, @@ -103,7 +124,6 @@ 6B137C6D0F7FCBBB00459200 /* MeshLoaderObj.cpp */, 6BB788160FC0472B003C24DB /* ChunkyTriMesh.cpp */, 6BB788180FC04753003C24DB /* ChunkyTriMesh.h */, - 6B137C6A0F7FCBBB00459200 /* demo.cpp */, 6B137C7C0F7FCBE400459200 /* SDLMain.h */, 6B137C6E0F7FCBBB00459200 /* SDLMain.m */, ); @@ -265,7 +285,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6B137C6F0F7FCBBB00459200 /* demo.cpp in Sources */, 6B137C700F7FCBBB00459200 /* glfont.cpp in Sources */, 6B137C710F7FCBBB00459200 /* imgui.cpp in Sources */, 6B137C720F7FCBBB00459200 /* MeshLoaderObj.cpp in Sources */, @@ -283,6 +302,11 @@ 6BDD9E0B0F91113800904EEF /* DetourStatNavMesh.cpp in Sources */, 6BDD9E0C0F91113800904EEF /* DetourStatNavMeshBuilder.cpp in Sources */, 6BB788170FC0472B003C24DB /* ChunkyTriMesh.cpp in Sources */, + 6B25B6190FFA62BE004F1BC4 /* Builder.cpp in Sources */, + 6B25B61A0FFA62BE004F1BC4 /* BuilderStatMesh.cpp in Sources */, + 6B25B61B0FFA62BE004F1BC4 /* BuilderStatMeshSimple.cpp in Sources */, + 6B25B61C0FFA62BE004F1BC4 /* BuilderStatMeshTiling.cpp in Sources */, + 6B25B61D0FFA62BE004F1BC4 /* main.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/RecastDemo/Include/Builder.h b/RecastDemo/Include/Builder.h new file mode 100644 index 0000000..776d2f5 --- /dev/null +++ b/RecastDemo/Include/Builder.h @@ -0,0 +1,49 @@ +#ifndef RECASTBUILDER_H +#define RECASTBUILDER_H + + +class Builder +{ +protected: + const float* m_verts; + int m_nverts; + const int* m_tris; + const float* m_trinorms; + int m_ntris; + float m_bmin[3], m_bmax[3]; + + float m_cellSize; + float m_cellHeight; + float m_agentHeight; + float m_agentRadius; + float m_agentMaxClimb; + float m_agentMaxSlope; + float m_regionMinSize; + float m_regionMergeSize; + float m_edgeMaxLen; + float m_edgeMaxError; + float m_vertsPerPoly; + +public: + Builder(); + virtual ~Builder(); + + virtual void handleSettings(); + virtual void handleTools(); + virtual void handleDebugMode(); + + virtual void setToolStartPos(const float* p); + virtual void setToolEndPos(const float* p); + + virtual void handleRender(); + virtual void handleMeshChanged(const float* verts, int nverts, + const int* tris, const float* trinorms, int ntris, + const float* bmin, const float* bmax); + virtual bool handleBuild(); + + void resetCommonSettings(); + void handleCommonSettings(); +}; + + +#endif // RECASTBUILDER_H diff --git a/RecastDemo/Include/BuilderStatMesh.h b/RecastDemo/Include/BuilderStatMesh.h new file mode 100644 index 0000000..f41e1de --- /dev/null +++ b/RecastDemo/Include/BuilderStatMesh.h @@ -0,0 +1,67 @@ +#ifndef RECASTBUILDERSTATMESH_H +#define RECASTBUILDERSTATMESH_H + +#include "Builder.h" +#include "DetourStatNavMesh.h" +#include "Recast.h" +#include "RecastLog.h" + +class BuilderStatMesh : public Builder +{ +protected: + + dtStatNavMesh* m_navMesh; + + enum ToolMode + { + TOOLMODE_PATHFIND, + TOOLMODE_RAYCAST, + TOOLMODE_DISTANCE_TO_WALL, + TOOLMODE_FIND_POLYS_AROUND, + }; + + ToolMode m_toolMode; + + static const int MAX_POLYS = 256; + + dtPolyRef m_startRef; + dtPolyRef m_endRef; + dtPolyRef m_polys[MAX_POLYS]; + int m_npolys; + float m_straightPath[MAX_POLYS*3]; + int m_nstraightPath; + float m_polyPickExt[3]; + + float m_spos[3]; + float m_epos[3]; + float m_hitPos[3]; + float m_hitNormal[3]; + float m_distanceToWall; + bool m_sposSet; + bool m_eposSet; + + enum ToolRenderFlags + { + NAVMESH_POLYS = 0x01, + NAVMESH_BVTREE = 0x02, + NAVMESH_TOOLS = 0x04, + }; + + void toolCleanup(); + void toolReset(); + void toolRecalc(); + void toolRender(int flags); + + void drawAgent(const float* pos, float r, float h, float c, const float* col); + +public: + BuilderStatMesh(); + virtual ~BuilderStatMesh(); + + virtual void handleTools(); + virtual void setToolStartPos(const float* p); + virtual void setToolEndPos(const float* p); +}; + + +#endif // RECASTBUILDERSTATMESH_H diff --git a/RecastDemo/Include/BuilderStatMeshSimple.h b/RecastDemo/Include/BuilderStatMeshSimple.h new file mode 100644 index 0000000..de6af84 --- /dev/null +++ b/RecastDemo/Include/BuilderStatMeshSimple.h @@ -0,0 +1,62 @@ +#ifndef RECASTBUILDERSTATMESHSIMPLE_H +#define RECASTBUILDERSTATMESHSIMPLE_H + +#include "BuilderStatMesh.h" +#include "DetourStatNavMesh.h" +#include "Recast.h" +#include "RecastLog.h" + +class BuilderStatMeshSimple : public BuilderStatMesh +{ +protected: + + bool m_keepInterResults; + rcBuildTimes m_buildTimes; + + unsigned char* m_triflags; + rcHeightfield* m_solid; + rcCompactHeightfield* m_chf; + rcContourSet* m_cset; + rcPolyMesh* m_polyMesh; + rcConfig m_cfg; + + enum DrawMode + { + DRAWMODE_NAVMESH, + DRAWMODE_NAVMESH_TRANS, + DRAWMODE_NAVMESH_BVTREE, + DRAWMODE_NAVMESH_INVIS, + DRAWMODE_MESH, + DRAWMODE_VOXELS, + DRAWMODE_VOXELS_WALKABLE, + DRAWMODE_COMPACT, + DRAWMODE_COMPACT_DISTANCE, + DRAWMODE_COMPACT_REGIONS, + DRAWMODE_REGION_CONNECTIONS, + DRAWMODE_RAW_CONTOURS, + DRAWMODE_BOTH_CONTOURS, + DRAWMODE_CONTOURS, + DRAWMODE_POLYMESH, + MAX_DRAWMODE + }; + + DrawMode m_drawMode; + + void cleanup(); + +public: + BuilderStatMeshSimple(); + virtual ~BuilderStatMeshSimple(); + + virtual void handleSettings(); + virtual void handleDebugMode(); + + virtual void handleRender(); + virtual void handleMeshChanged(const float* verts, int nverts, + const int* tris, const float* trinorms, int ntris, + const float* bmin, const float* bmax); + virtual bool handleBuild(); +}; + + +#endif // RECASTBUILDERSTATMESHSIMPLE_H diff --git a/RecastDemo/Include/BuilderStatMeshTiling.h b/RecastDemo/Include/BuilderStatMeshTiling.h new file mode 100644 index 0000000..7ad31a3 --- /dev/null +++ b/RecastDemo/Include/BuilderStatMeshTiling.h @@ -0,0 +1,83 @@ +#ifndef RECASTBUILDERSTATMESHTILING_H +#define RECASTBUILDERSTATMESHTILING_H + +#include "BuilderStatMesh.h" +#include "DetourStatNavMesh.h" +#include "Recast.h" +#include "RecastLog.h" +#include "ChunkyTriMesh.h" + +class BuilderStatMeshTiling : public BuilderStatMesh +{ +protected: + + struct Tile + { + inline Tile() : chf(0), cset(0), solid(0), buildTime(0) {} + inline ~Tile() { delete chf; delete cset; delete solid; } + rcCompactHeightfield* chf; + rcHeightfield* solid; + rcContourSet* cset; + int buildTime; + }; + + struct TileSet + { + inline TileSet() : width(0), height(0), tiles(0) {} + inline ~TileSet() { delete [] tiles; } + int width, height; + float bmin[3], bmax[3]; + float cs, ch; + Tile* tiles; + }; + + bool m_keepInterResults; + float m_tileSize; + rcBuildTimes m_buildTimes; + + rcChunkyTriMesh* m_chunkyMesh; + rcPolyMesh* m_polyMesh; + rcConfig m_cfg; + TileSet* m_tileSet; + + + enum DrawMode + { + DRAWMODE_NAVMESH, + DRAWMODE_NAVMESH_TRANS, + DRAWMODE_NAVMESH_BVTREE, + DRAWMODE_NAVMESH_INVIS, + DRAWMODE_MESH, + DRAWMODE_VOXELS, + DRAWMODE_VOXELS_WALKABLE, + DRAWMODE_COMPACT, + DRAWMODE_COMPACT_DISTANCE, + DRAWMODE_COMPACT_REGIONS, + DRAWMODE_REGION_CONNECTIONS, + DRAWMODE_RAW_CONTOURS, + DRAWMODE_BOTH_CONTOURS, + DRAWMODE_CONTOURS, + DRAWMODE_POLYMESH, + MAX_DRAWMODE + }; + + DrawMode m_drawMode; + + void cleanup(); + +public: + BuilderStatMeshTiling(); + virtual ~BuilderStatMeshTiling(); + + virtual void handleSettings(); + virtual void handleDebugMode(); + + virtual void handleRender(); + virtual void handleMeshChanged(const float* verts, int nverts, + const int* tris, const float* trinorms, int ntris, + const float* bmin, const float* bmax); + virtual bool handleBuild(); +}; + + +#endif // RECASTBUILDERSTATMESHTILING_H diff --git a/RecastDemo/Include/imgui.h b/RecastDemo/Include/imgui.h index b80a58c..685faf1 100644 --- a/RecastDemo/Include/imgui.h +++ b/RecastDemo/Include/imgui.h @@ -19,10 +19,18 @@ #ifndef IMGUI_H #define IMGUI_H -#define GENID ((__LINE__) << 16) -#define GENID1(x) ((__LINE__) << 16 | (x)) +#define GENID ((__LINE__ ^ (int)__FILE__) << 16) +#define GENID1(x) ((__LINE__ ^ (int)__FILE__) << 16 | (x)) -void imguiBeginFrame(); +enum imguiMouseButton +{ + IMGUI_MBUT_LEFT = 0x01, + IMGUI_MBUT_RIGHT = 0x02, + IMGUI_MBUT_UP = 0x04, + IMGUI_MBUT_DOWN = 0x08, +}; + +void imguiBeginFrame(int mx, int my, unsigned char mbut); void imguiEndFrame(); void imguiRender(void (*drawText)(int x, int y, int dir, const char* text, unsigned int col)); diff --git a/RecastDemo/Source/Builder.cpp b/RecastDemo/Source/Builder.cpp new file mode 100644 index 0000000..381e4d6 --- /dev/null +++ b/RecastDemo/Source/Builder.cpp @@ -0,0 +1,119 @@ +#define _USE_MATH_DEFINES +#include +#include +#include "Builder.h" +#include "Recast.h" +#include "RecastDebugDraw.h" +#include "imgui.h" + +#ifdef WIN32 +# define snprintf _snprintf +#endif + + +Builder::Builder() : + m_verts(0), m_nverts(0), m_tris(0), m_trinorms(0), m_ntris(0) +{ + resetCommonSettings(); +} + +Builder::~Builder() +{ +} + +void Builder::handleSettings() +{ +} + +void Builder::handleTools() +{ +} + +void Builder::handleDebugMode() +{ +} + +void Builder::handleRender() +{ + if (!m_verts || !m_tris || !m_trinorms) + return; + // Draw mesh + rcDebugDrawMesh(m_verts, m_nverts, m_tris, m_trinorms, m_ntris, 0); + // Draw bounds + float col[4] = {1,1,1,0.5f}; + rcDebugDrawBoxWire(m_bmin[0],m_bmin[1],m_bmin[2], m_bmax[0],m_bmax[1],m_bmax[2], col); +} + +void Builder::handleMeshChanged(const float* verts, int nverts, + const int* tris, const float* trinorms, int ntris, + const float* bmin, const float* bmax) +{ + m_verts = verts; + m_nverts = nverts; + m_tris = tris; + m_trinorms = trinorms; + m_ntris = ntris; + vcopy(m_bmin, bmin); + vcopy(m_bmax, bmax); +} + +void Builder::resetCommonSettings() +{ + m_cellSize = 0.3f; + m_cellHeight = 0.2f; + m_agentHeight = 2.0f; + m_agentRadius = 0.6f; + m_agentMaxClimb = 0.9f; + m_agentMaxSlope = 45.0f; + m_regionMinSize = 50; + m_regionMergeSize = 20; + m_edgeMaxLen = 12.0f; + m_edgeMaxError = 1.3f; + m_vertsPerPoly = 6.0f; +} + +void Builder::handleCommonSettings() +{ + imguiLabel(GENID, "Rasterization"); + imguiSlider(GENID, "Cell Size", &m_cellSize, 0.1f, 1.0f, 0.01f); + imguiSlider(GENID, "Cell Height", &m_cellHeight, 0.1f, 1.0f, 0.01f); + + int gw = 0, gh = 0; + rcCalcGridSize(m_bmin, m_bmax, m_cellSize, &gw, &gh); + char text[64]; + snprintf(text, 64, "Voxels %d x %d", gw, gh); + imguiValue(GENID, text); + + imguiSeparator(); + imguiLabel(GENID, "Agent"); + imguiSlider(GENID, "Height", &m_agentHeight, 0.1f, 5.0f, 0.1f); + imguiSlider(GENID, "Radius", &m_agentRadius, 0.0f, 5.0f, 0.1f); + imguiSlider(GENID, "Max Climb", &m_agentMaxClimb, 0.1f, 5.0f, 0.1f); + imguiSlider(GENID, "Max Slope", &m_agentMaxSlope, 0.0f, 90.0f, 1.0f); + + imguiSeparator(); + imguiLabel(GENID, "Region"); + imguiSlider(GENID, "Min Region Size", &m_regionMinSize, 0.0f, 150.0f, 1.0f); + imguiSlider(GENID, "Merged Region Size", &m_regionMergeSize, 0.0f, 150.0f, 1.0f); + + imguiSeparator(); + imguiLabel(GENID, "Polygonization"); + imguiSlider(GENID, "Max Edge Length", &m_edgeMaxLen, 0.0f, 50.0f, 1.0f); + imguiSlider(GENID, "Max Edge Error", &m_edgeMaxError, 0.1f, 3.0f, 0.1f); + imguiSlider(GENID, "Verts Per Poly", &m_vertsPerPoly, 3.0f, 12.0f, 1.0f); + + imguiSeparator(); +} + +void Builder::setToolStartPos(const float* p) +{ +} + +void Builder::setToolEndPos(const float* p) +{ +} + +bool Builder::handleBuild() +{ + return true; +} diff --git a/RecastDemo/Source/BuilderStatMesh.cpp b/RecastDemo/Source/BuilderStatMesh.cpp new file mode 100644 index 0000000..d01d829 --- /dev/null +++ b/RecastDemo/Source/BuilderStatMesh.cpp @@ -0,0 +1,286 @@ +#define _USE_MATH_DEFINES +#include +#include +#include +#include "SDL.h" +#include "SDL_Opengl.h" +#include "imgui.h" +#include "Builder.h" +#include "BuilderStatMesh.h" +#include "Recast.h" +#include "RecastTimer.h" +#include "RecastDebugDraw.h" +#include "DetourStatNavMesh.h" +#include "DetourStatNavMeshBuilder.h" +#include "DetourDebugDraw.h" + +#ifdef WIN32 +# define snprintf _snprintf +#endif + +BuilderStatMesh::BuilderStatMesh() : + m_navMesh(0), + m_toolMode(TOOLMODE_PATHFIND), + m_sposSet(false), + m_eposSet(false) +{ + toolReset(); + m_polyPickExt[0] = 2; + m_polyPickExt[1] = 4; + m_polyPickExt[2] = 2; +} + +BuilderStatMesh::~BuilderStatMesh() +{ + toolCleanup(); +} + +void BuilderStatMesh::handleTools() +{ + if (imguiCheck(GENID, "Pathfind", m_toolMode == TOOLMODE_PATHFIND)) + { + m_toolMode = TOOLMODE_PATHFIND; + toolRecalc(); + } + if (imguiCheck(GENID, "Distance to Wall", m_toolMode == TOOLMODE_DISTANCE_TO_WALL)) + { + m_toolMode = TOOLMODE_DISTANCE_TO_WALL; + toolRecalc(); + } + if (imguiCheck(GENID, "Raycast", m_toolMode == TOOLMODE_RAYCAST)) + { + m_toolMode = TOOLMODE_RAYCAST; + toolRecalc(); + } + if (imguiCheck(GENID, "Find Polys Around", m_toolMode == TOOLMODE_FIND_POLYS_AROUND)) + { + m_toolMode = TOOLMODE_FIND_POLYS_AROUND; + toolRecalc(); + } +} + +void BuilderStatMesh::setToolStartPos(const float* p) +{ + m_sposSet = true; + vcopy(m_spos, p); + toolRecalc(); +} + +void BuilderStatMesh::setToolEndPos(const float* p) +{ + m_eposSet = true; + vcopy(m_epos, p); + toolRecalc(); +} + +void BuilderStatMesh::toolCleanup() +{ + delete m_navMesh; + m_navMesh = 0; +} + +void BuilderStatMesh::toolReset() +{ + m_startRef = 0; + m_endRef = 0; + m_npolys = 0; + m_nstraightPath = 0; + memset(m_hitPos, 0, sizeof(m_hitPos)); + memset(m_hitNormal, 0, sizeof(m_hitNormal)); + m_distanceToWall = 0; +} + +void BuilderStatMesh::toolRecalc() +{ + if (!m_navMesh) + return; + + if (m_sposSet) + m_startRef = m_navMesh->findNearestPoly(m_spos, m_polyPickExt); + else + m_startRef = 0; + + if (m_eposSet) + m_endRef = m_navMesh->findNearestPoly(m_epos, m_polyPickExt); + else + m_endRef = 0; + + if (m_toolMode == TOOLMODE_PATHFIND) + { + if (m_sposSet && m_eposSet && m_startRef && m_endRef) + { + m_npolys = m_navMesh->findPath(m_startRef, m_endRef, m_polys, MAX_POLYS); + if (m_npolys) + m_nstraightPath = m_navMesh->findStraightPath(m_spos, m_epos, m_polys, m_npolys, m_straightPath, MAX_POLYS); + } + else + { + m_npolys = 0; + m_nstraightPath = 0; + } + } + else if (m_toolMode == TOOLMODE_RAYCAST) + { + m_nstraightPath = 0; + if (m_sposSet && m_eposSet && m_startRef) + { + float t = 0; + m_npolys = 0; + m_nstraightPath = 2; + m_straightPath[0] = m_spos[0]; + m_straightPath[1] = m_spos[1]; + m_straightPath[2] = m_spos[2]; + if (m_navMesh->raycast(m_startRef, m_spos, m_epos, t, m_polys[0])) + { + m_npolys = 1; + m_straightPath[3] = m_spos[0] + (m_epos[0] - m_spos[0]) * t; + m_straightPath[4] = m_spos[1] + (m_epos[1] - m_spos[1]) * t; + m_straightPath[5] = m_spos[2] + (m_epos[2] - m_spos[2]) * t; + } + else + { + m_straightPath[3] = m_epos[0]; + m_straightPath[4] = m_epos[1]; + m_straightPath[5] = m_epos[2]; + } + } + } + else if (m_toolMode == TOOLMODE_DISTANCE_TO_WALL) + { + m_distanceToWall = 0; + if (m_sposSet && m_startRef) + m_distanceToWall = m_navMesh->findDistanceToWall(m_startRef, m_spos, 100.0f, m_hitPos, m_hitNormal); + } + else if (m_toolMode == TOOLMODE_FIND_POLYS_AROUND) + { + if (m_sposSet && m_startRef && m_eposSet) + { + const float dx = m_epos[0] - m_spos[0]; + const float dz = m_epos[2] - m_spos[2]; + float dist = sqrtf(dx*dx + dz*dz); + m_npolys = m_navMesh->findPolysAround(m_startRef, m_spos, dist, m_polys, 0, 0, 0, MAX_POLYS); + } + } +} + +void BuilderStatMesh::toolRender(int flags) +{ + if (!m_navMesh) + return; + + static const float startCol[4] = { 0.5f, 0.1f, 0.0f, 0.75f }; + static const float endCol[4] = { 0.2f, 0.4f, 0.0f, 0.75f }; + static const float pathCol[4] = {0,0,0,0.25f}; + + glDepthMask(GL_FALSE); + + if (flags & NAVMESH_POLYS) + dtDebugDrawStatNavMesh(m_navMesh); + + if (flags & NAVMESH_BVTREE) + dtDebugDrawStatNavMeshBVTree(m_navMesh); + + if (flags & NAVMESH_TOOLS) + { + if (m_toolMode == TOOLMODE_PATHFIND) + { + dtDebugDrawStatNavMeshPoly(m_navMesh, m_startRef, startCol); + dtDebugDrawStatNavMeshPoly(m_navMesh, m_endRef, endCol); + + if (m_npolys) + { + for (int i = 1; i < m_npolys-1; ++i) + dtDebugDrawStatNavMeshPoly(m_navMesh, m_polys[i], pathCol); + } + if (m_nstraightPath) + { + glColor4ub(128,16,0,220); + glLineWidth(3.0f); + glBegin(GL_LINE_STRIP); + for (int i = 0; i < m_nstraightPath; ++i) + glVertex3f(m_straightPath[i*3], m_straightPath[i*3+1]+0.4f, m_straightPath[i*3+2]); + glEnd(); + glLineWidth(1.0f); + glPointSize(4.0f); + glBegin(GL_POINTS); + for (int i = 0; i < m_nstraightPath; ++i) + glVertex3f(m_straightPath[i*3], m_straightPath[i*3+1]+0.4f, m_straightPath[i*3+2]); + glEnd(); + glPointSize(1.0f); + } + } + else if (m_toolMode == TOOLMODE_RAYCAST) + { + dtDebugDrawStatNavMeshPoly(m_navMesh, m_startRef, startCol); + + if (m_nstraightPath) + { + dtDebugDrawStatNavMeshPoly(m_navMesh, m_polys[0], pathCol); + + glColor4ub(128,16,0,220); + glLineWidth(3.0f); + glBegin(GL_LINE_STRIP); + for (int i = 0; i < m_nstraightPath; ++i) + glVertex3f(m_straightPath[i*3], m_straightPath[i*3+1]+0.4f, m_straightPath[i*3+2]); + glEnd(); + glLineWidth(1.0f); + glPointSize(4.0f); + glBegin(GL_POINTS); + for (int i = 0; i < m_nstraightPath; ++i) + glVertex3f(m_straightPath[i*3], m_straightPath[i*3+1]+0.4f, m_straightPath[i*3+2]); + glEnd(); + glPointSize(1.0f); + } + } + else if (m_toolMode == TOOLMODE_DISTANCE_TO_WALL) + { + dtDebugDrawStatNavMeshPoly(m_navMesh, m_startRef, startCol); + const float col[4] = {1,1,1,0.5f}; + rcDebugDrawCylinderWire(m_spos[0]-m_distanceToWall, m_spos[1]+0.02f, m_spos[2]-m_distanceToWall, + m_spos[0]+m_distanceToWall, m_spos[1]+m_agentHeight, m_spos[2]+m_distanceToWall, col); + glLineWidth(3.0f); + glColor4fv(col); + glBegin(GL_LINES); + glVertex3f(m_hitPos[0], m_hitPos[1] + 0.02f, m_hitPos[2]); + glVertex3f(m_hitPos[0], m_hitPos[1] + m_agentHeight, m_hitPos[2]); + glEnd(); + glLineWidth(1.0f); + } + else if (m_toolMode == TOOLMODE_FIND_POLYS_AROUND) + { + for (int i = 0; i < m_npolys; ++i) + dtDebugDrawStatNavMeshPoly(m_navMesh, m_polys[i], pathCol); + + const float dx = m_epos[0] - m_spos[0]; + const float dz = m_epos[2] - m_spos[2]; + float dist = sqrtf(dx*dx + dz*dz); + const float col[4] = {1,1,1,0.5f}; + rcDebugDrawCylinderWire(m_spos[0]-dist, m_spos[1]+0.02f, m_spos[2]-dist, + m_spos[0]+dist, m_spos[1]+m_agentHeight, m_spos[2]+dist, col); + } + } + + glDepthMask(GL_TRUE); +} + +void BuilderStatMesh::drawAgent(const float* pos, float r, float h, float c, const float* col) +{ + glDepthMask(GL_FALSE); + + // Agent dimensions. + glLineWidth(2.0f); + rcDebugDrawCylinderWire(pos[0]-r, pos[1]+0.02f, pos[2]-r, pos[0]+r, pos[1]+h, pos[2]+r, col); + glLineWidth(1.0f); + + glColor4ub(0,0,0,196); + glBegin(GL_LINES); + glVertex3f(pos[0], pos[1]-c, pos[2]); + glVertex3f(pos[0], pos[1]+c, pos[2]); + glVertex3f(pos[0]-r/2, pos[1]+0.02f, pos[2]); + glVertex3f(pos[0]+r/2, pos[1]+0.02f, pos[2]); + glVertex3f(pos[0], pos[1]+0.02f, pos[2]-r/2); + glVertex3f(pos[0], pos[1]+0.02f, pos[2]+r/2); + glEnd(); + + glDepthMask(GL_TRUE); +} diff --git a/RecastDemo/Source/BuilderStatMeshSimple.cpp b/RecastDemo/Source/BuilderStatMeshSimple.cpp new file mode 100644 index 0000000..7fc87f7 --- /dev/null +++ b/RecastDemo/Source/BuilderStatMeshSimple.cpp @@ -0,0 +1,502 @@ +#define _USE_MATH_DEFINES +#include +#include +#include +#include "SDL.h" +#include "SDL_Opengl.h" +#include "imgui.h" +#include "Builder.h" +#include "BuilderStatMeshSimple.h" +#include "Recast.h" +#include "RecastTimer.h" +#include "RecastDebugDraw.h" +#include "DetourStatNavMesh.h" +#include "DetourStatNavMeshBuilder.h" +#include "DetourDebugDraw.h" + +#ifdef WIN32 +# define snprintf _snprintf +#endif + +BuilderStatMeshSimple::BuilderStatMeshSimple() : + m_keepInterResults(false), + m_triflags(0), + m_solid(0), + m_chf(0), + m_cset(0), + m_polyMesh(0), + m_drawMode(DRAWMODE_NAVMESH) +{ +} + +BuilderStatMeshSimple::~BuilderStatMeshSimple() +{ + cleanup(); +} + +void BuilderStatMeshSimple::cleanup() +{ + delete [] m_triflags; + m_triflags = 0; + delete m_solid; + m_solid = 0; + delete m_chf; + m_chf = 0; + delete m_cset; + m_cset = 0; + delete m_polyMesh; + m_polyMesh = 0; + toolCleanup(); +} + +void BuilderStatMeshSimple::handleSettings() +{ + Builder::handleCommonSettings(); + + if (imguiCheck(GENID, "Keep Itermediate Results", m_keepInterResults)) + m_keepInterResults = !m_keepInterResults; + + imguiSeparator(); +} + +void BuilderStatMeshSimple::handleDebugMode() +{ + // Check which modes are valid. + bool valid[MAX_DRAWMODE]; + for (int i = 0; i < MAX_DRAWMODE; ++i) + valid[i] = false; + + if (m_verts && m_tris) + { + valid[DRAWMODE_NAVMESH] = m_navMesh != 0; + valid[DRAWMODE_NAVMESH_TRANS] = m_navMesh != 0; + valid[DRAWMODE_NAVMESH_BVTREE] = m_navMesh != 0; + valid[DRAWMODE_NAVMESH_INVIS] = m_navMesh != 0; + valid[DRAWMODE_MESH] = true; + valid[DRAWMODE_VOXELS] = m_solid != 0; + valid[DRAWMODE_VOXELS_WALKABLE] = m_solid != 0; + valid[DRAWMODE_COMPACT] = m_chf != 0; + valid[DRAWMODE_COMPACT_DISTANCE] = m_chf != 0; + valid[DRAWMODE_COMPACT_REGIONS] = m_chf != 0; + valid[DRAWMODE_REGION_CONNECTIONS] = m_cset != 0; + valid[DRAWMODE_RAW_CONTOURS] = m_cset != 0; + valid[DRAWMODE_BOTH_CONTOURS] = m_cset != 0; + valid[DRAWMODE_CONTOURS] = m_cset != 0; + valid[DRAWMODE_POLYMESH] = m_polyMesh != 0; + } + + if (!valid[m_drawMode]) + m_drawMode = DRAWMODE_MESH; + + int unavail = 0; + for (int i = 0; i < MAX_DRAWMODE; ++i) + if (!valid[i]) unavail++; + + if (unavail == MAX_DRAWMODE) + return; + + imguiLabel(GENID, "Draw"); + if (valid[DRAWMODE_MESH] && imguiCheck(GENID, "Input Mesh", m_drawMode == DRAWMODE_MESH)) + m_drawMode = DRAWMODE_MESH; + if (valid[DRAWMODE_NAVMESH] && imguiCheck(GENID, "Navmesh", m_drawMode == DRAWMODE_NAVMESH)) + m_drawMode = DRAWMODE_NAVMESH; + if (valid[DRAWMODE_NAVMESH_INVIS] && imguiCheck(GENID, "Navmesh Invis", m_drawMode == DRAWMODE_NAVMESH_INVIS)) + m_drawMode = DRAWMODE_NAVMESH_INVIS; + if (valid[DRAWMODE_NAVMESH_TRANS] && imguiCheck(GENID, "Navmesh Trans", m_drawMode == DRAWMODE_NAVMESH_TRANS)) + m_drawMode = DRAWMODE_NAVMESH_TRANS; + if (valid[DRAWMODE_NAVMESH_BVTREE] && imguiCheck(GENID, "Navmesh BVTree", m_drawMode == DRAWMODE_NAVMESH_BVTREE)) + m_drawMode = DRAWMODE_NAVMESH_BVTREE; + if (valid[DRAWMODE_VOXELS] && imguiCheck(GENID, "Voxels", m_drawMode == DRAWMODE_VOXELS)) + m_drawMode = DRAWMODE_VOXELS; + if (valid[DRAWMODE_VOXELS_WALKABLE] && imguiCheck(GENID, "Walkable Voxels", m_drawMode == DRAWMODE_VOXELS_WALKABLE)) + m_drawMode = DRAWMODE_VOXELS_WALKABLE; + if (valid[DRAWMODE_COMPACT] && imguiCheck(GENID, "Compact", m_drawMode == DRAWMODE_COMPACT)) + m_drawMode = DRAWMODE_COMPACT; + if (valid[DRAWMODE_COMPACT_DISTANCE] && imguiCheck(GENID, "Compact Distance", m_drawMode == DRAWMODE_COMPACT_DISTANCE)) + m_drawMode = DRAWMODE_COMPACT_DISTANCE; + if (valid[DRAWMODE_COMPACT_REGIONS] && imguiCheck(GENID, "Compact Regions", m_drawMode == DRAWMODE_COMPACT_REGIONS)) + m_drawMode = DRAWMODE_COMPACT_REGIONS; + if (valid[DRAWMODE_REGION_CONNECTIONS] && imguiCheck(GENID, "Region Connections", m_drawMode == DRAWMODE_REGION_CONNECTIONS)) + m_drawMode = DRAWMODE_REGION_CONNECTIONS; + if (valid[DRAWMODE_RAW_CONTOURS] && imguiCheck(GENID, "Raw Contours", m_drawMode == DRAWMODE_RAW_CONTOURS)) + m_drawMode = DRAWMODE_RAW_CONTOURS; + if (valid[DRAWMODE_BOTH_CONTOURS] && imguiCheck(GENID, "Both Contours", m_drawMode == DRAWMODE_BOTH_CONTOURS)) + m_drawMode = DRAWMODE_BOTH_CONTOURS; + if (valid[DRAWMODE_CONTOURS] && imguiCheck(GENID, "Contours", m_drawMode == DRAWMODE_CONTOURS)) + m_drawMode = DRAWMODE_CONTOURS; + if (valid[DRAWMODE_POLYMESH] && imguiCheck(GENID, "Poly Mesh", m_drawMode == DRAWMODE_POLYMESH)) + m_drawMode = DRAWMODE_POLYMESH; + + if (unavail) + { + imguiValue(GENID, "Tick 'Keep Itermediate Results'"); + imguiValue(GENID, "to see more debug mode options."); + } +} + +void BuilderStatMeshSimple::handleRender() +{ + if (!m_verts || !m_tris || !m_trinorms) + return; + + float col[4]; + + glEnable(GL_FOG); + glDepthMask(GL_TRUE); + + if (m_drawMode == DRAWMODE_MESH) + { + // Draw mesh + rcDebugDrawMeshSlope(m_verts, m_nverts, m_tris, m_trinorms, m_ntris, m_agentMaxSlope); + } + else if (m_drawMode != DRAWMODE_NAVMESH_TRANS) + { + // Draw mesh + rcDebugDrawMesh(m_verts, m_nverts, m_tris, m_trinorms, m_ntris, 0); + } + + glDisable(GL_FOG); + glDepthMask(GL_FALSE); + + // Draw bounds + col[0] = 1; col[1] = 1; col[2] = 1; col[3] = 0.5f; + rcDebugDrawBoxWire(m_bmin[0],m_bmin[1],m_bmin[2], m_bmax[0],m_bmax[1],m_bmax[2], col); + + if (m_navMesh && + (m_drawMode == DRAWMODE_NAVMESH || + m_drawMode == DRAWMODE_NAVMESH_TRANS || + m_drawMode == DRAWMODE_NAVMESH_BVTREE || + m_drawMode == DRAWMODE_NAVMESH_INVIS)) + { + int flags = NAVMESH_TOOLS; + if (m_drawMode != DRAWMODE_NAVMESH_INVIS) + flags |= NAVMESH_POLYS; + if (m_drawMode == DRAWMODE_NAVMESH_BVTREE) + flags |= NAVMESH_BVTREE; + toolRender(flags); + } + + glDepthMask(GL_TRUE); + + if (m_chf && m_drawMode == DRAWMODE_COMPACT) + rcDebugDrawCompactHeightfieldSolid(*m_chf); + + if (m_chf && m_drawMode == DRAWMODE_COMPACT_DISTANCE) + rcDebugDrawCompactHeightfieldDistance(*m_chf); + if (m_chf && m_drawMode == DRAWMODE_COMPACT_REGIONS) + rcDebugDrawCompactHeightfieldRegions(*m_chf); + if (m_solid && m_drawMode == DRAWMODE_VOXELS) + { + glEnable(GL_FOG); + rcDebugDrawHeightfieldSolid(*m_solid); + glDisable(GL_FOG); + } + if (m_solid && m_drawMode == DRAWMODE_VOXELS_WALKABLE) + { + glEnable(GL_FOG); + rcDebugDrawHeightfieldWalkable(*m_solid); + glDisable(GL_FOG); + } + if (m_cset && m_drawMode == DRAWMODE_RAW_CONTOURS) + { + glDepthMask(GL_FALSE); + rcDebugDrawRawContours(*m_cset, m_cfg.bmin, m_cfg.cs, m_cfg.ch); + glDepthMask(GL_TRUE); + } + if (m_cset && m_drawMode == DRAWMODE_BOTH_CONTOURS) + { + glDepthMask(GL_FALSE); + rcDebugDrawRawContours(*m_cset, m_cfg.bmin, m_cfg.cs, m_cfg.ch, 0.5f); + rcDebugDrawContours(*m_cset, m_cfg.bmin, m_cfg.cs, m_cfg.ch); + glDepthMask(GL_TRUE); + } + if (m_cset && m_drawMode == DRAWMODE_CONTOURS) + { + glDepthMask(GL_FALSE); + rcDebugDrawContours(*m_cset, m_cfg.bmin, m_cfg.cs, m_cfg.ch); + glDepthMask(GL_TRUE); + } + if (m_chf && m_cset && m_drawMode == DRAWMODE_REGION_CONNECTIONS) + { + rcDebugDrawCompactHeightfieldRegions(*m_chf); + + glDepthMask(GL_FALSE); + rcDebugDrawRegionConnections(*m_cset, m_cfg.bmin, m_cfg.cs, m_cfg.ch); + glDepthMask(GL_TRUE); + } + if (m_polyMesh && m_drawMode == DRAWMODE_POLYMESH) + { + glDepthMask(GL_FALSE); + rcDebugDrawPolyMesh(*m_polyMesh); + glDepthMask(GL_TRUE); + } + + static const float startCol[4] = { 0.5f, 0.1f, 0.0f, 0.75f }; + static const float endCol[4] = { 0.2f, 0.4f, 0.0f, 0.75f }; + if (m_sposSet) + drawAgent(m_spos, m_agentRadius, m_agentHeight, m_agentMaxClimb, startCol); + if (m_eposSet) + drawAgent(m_epos, m_agentRadius, m_agentHeight, m_agentMaxClimb, endCol); + +} + +void BuilderStatMeshSimple::handleMeshChanged(const float* verts, int nverts, + const int* tris, const float* trinorms, int ntris, + const float* bmin, const float* bmax) +{ + Builder::handleMeshChanged(verts, nverts, tris, trinorms, ntris, bmin, bmax); + toolCleanup(); + toolReset(); +} + +bool BuilderStatMeshSimple::handleBuild() +{ + if (!m_verts || ! m_tris) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Input mesh is not specified."); + return false; + } + + cleanup(); + toolCleanup(); + + // Init build configuration from GUI + memset(&m_cfg, 0, sizeof(m_cfg)); + m_cfg.cs = m_cellSize; + m_cfg.ch = m_cellHeight; + m_cfg.walkableSlopeAngle = m_agentMaxSlope; + m_cfg.walkableHeight = (int)ceilf(m_agentHeight / m_cfg.ch); + m_cfg.walkableClimb = (int)ceilf(m_agentMaxClimb / m_cfg.ch); + m_cfg.walkableRadius = (int)ceilf(m_agentRadius / m_cfg.cs); + m_cfg.maxEdgeLen = (int)(m_edgeMaxLen / m_cellSize); + m_cfg.maxSimplificationError = m_edgeMaxError; + m_cfg.minRegionSize = (int)rcSqr(m_regionMinSize); + m_cfg.mergeRegionSize = (int)rcSqr(m_regionMergeSize); + m_cfg.maxVertsPerPoly = (int)m_vertsPerPoly; + + if (m_cfg.maxVertsPerPoly == DT_VERTS_PER_POLYGON) + m_drawMode = DRAWMODE_NAVMESH; + else + m_drawMode = DRAWMODE_POLYMESH; + + // Set the area where the navigation will be build. + // Here the bounds of the input mesh are used, but the + // area could be specified by an user defined box, etc. + vcopy(m_cfg.bmin, m_bmin); + vcopy(m_cfg.bmax, m_bmax); + rcCalcGridSize(m_cfg.bmin, m_cfg.bmax, m_cfg.cs, &m_cfg.width, &m_cfg.height); + + // Reset build times gathering. + memset(&m_buildTimes, 0, sizeof(m_buildTimes)); + rcSetBuildTimes(&m_buildTimes); + + // Start the build process. + rcTimeVal totStartTime = rcGetPerformanceTimer(); + + if (rcGetLog()) + { + rcGetLog()->log(RC_LOG_PROGRESS, "Building navigation:"); + rcGetLog()->log(RC_LOG_PROGRESS, " - %d x %d cells", m_cfg.width, m_cfg.height); + rcGetLog()->log(RC_LOG_PROGRESS, " - %.1fK verts, %.1fK tris", m_nverts/1000.0f, m_ntris/1000.0f); + } + + // Allocate voxel heighfield where we rasterize our input data to. + m_solid = new rcHeightfield; + if (!m_solid) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Out of memory 'solid'."); + return false; + } + if (!rcCreateHeightfield(*m_solid, m_cfg.width, m_cfg.height, m_cfg.bmin, m_cfg.bmax, m_cfg.cs, m_cfg.ch)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not create solid heightfield."); + return false; + } + + // Allocate array that can hold triangle flags. + // If you have multiple meshes you need to process, allocate + // and array which can hold the max number of triangles you need to process. + m_triflags = new unsigned char[m_ntris]; + if (!m_triflags) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Out of memory 'triangleFlags' (%d).", m_ntris); + return false; + } + + + // Find triangles which are walkable based on their slope and rasterize them. + // If your input data is multiple meshes, you can transform them here, calculate + // the flags for each of the meshes and rasterize them. + memset(m_triflags, 0, m_ntris*sizeof(unsigned char)); + rcMarkWalkableTriangles(m_cfg.walkableSlopeAngle, m_verts, m_nverts, m_tris, m_ntris, m_triflags); + rcRasterizeTriangles(m_verts, m_nverts, m_tris, m_triflags, m_ntris, *m_solid); + + if (!m_keepInterResults) + { + delete [] m_triflags; + m_triflags = 0; + } + + // Once all geoemtry is rasterized, we do initial pass of filtering to + // remove unwanted overhangs caused by the conservative rasterization + // as well as filter spans where the character cannot possibly stand. + rcFilterLedgeSpans(m_cfg.walkableHeight, m_cfg.walkableClimb, *m_solid); + rcFilterWalkableLowHeightSpans(m_cfg.walkableHeight, *m_solid); + + // Compact the heightfield so that it is faster to handle from now on. + // This will result more cache coherent data as well as the neighbours + // between walkable cells will be calculated. + m_chf = new rcCompactHeightfield; + if (!m_chf) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Out of memory 'chf'."); + return false; + } + if (!rcBuildCompactHeightfield(m_cfg.walkableHeight, m_cfg.walkableClimb, RC_WALKABLE, *m_solid, *m_chf)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not build compact data."); + return false; + } + + if (!m_keepInterResults) + { + delete m_solid; + m_solid = 0; + } + + // Prepare for region partitioning, by calculating distance field along the walkable surface. + if (!rcBuildDistanceField(*m_chf)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not build distance field."); + return false; + } + + // Partition the walkable surface into simple regions without holes. + if (!rcBuildRegions(*m_chf, m_cfg.walkableRadius, m_cfg.borderSize, m_cfg.minRegionSize, m_cfg.mergeRegionSize)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not build regions."); + } + + // Create contours. + m_cset = new rcContourSet; + if (!m_cset) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Out of memory 'cset'."); + return false; + } + if (!rcBuildContours(*m_chf, m_cfg.maxSimplificationError, m_cfg.maxEdgeLen, *m_cset)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not create contours."); + return false; + } + + if (!m_keepInterResults) + { + delete m_chf; + m_chf = 0; + } + + // Build polygon navmesh from the contours. + m_polyMesh = new rcPolyMesh; + if (!m_polyMesh) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Out of memory 'polyMesh'."); + return false; + } + if (!rcBuildPolyMesh(*m_cset, m_cfg.bmin, m_cfg.bmax, m_cfg.cs, m_cfg.ch, m_cfg.maxVertsPerPoly, *m_polyMesh)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not triangulate contours."); + return false; + } + + if (!m_keepInterResults) + { + delete m_cset; + m_cset = 0; + } + + if (m_cfg.maxVertsPerPoly == DT_VERTS_PER_POLYGON) + { + unsigned char* navData = 0; + int navDataSize = 0; + if (!dtCreateNavMeshData(m_polyMesh->verts, m_polyMesh->nverts, + m_polyMesh->polys, m_polyMesh->npolys, m_polyMesh->nvp, + m_cfg.bmin, m_cfg.bmax, m_cfg.cs, m_cfg.ch, &navData, &navDataSize)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "Could not build Detour navmesh."); + return false; + } + + m_navMesh = new dtStatNavMesh; + if (!m_navMesh) + { + delete [] navData; + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "Could not create Detour navmesh"); + return false; + } + + if (!m_navMesh->init(navData, navDataSize, true)) + { + delete [] navData; + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "Could not init Detour navmesh"); + return false; + } + } + + rcTimeVal totEndTime = rcGetPerformanceTimer(); + + // Show performance stats. + if (rcGetLog()) + { + const float pc = 100.0f / rcGetDeltaTimeUsec(totStartTime, totEndTime); + + rcGetLog()->log(RC_LOG_PROGRESS, "Rasterize: %.1fms (%.1f%%)", m_buildTimes.rasterizeTriangles/1000.0f, m_buildTimes.rasterizeTriangles*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Compact: %.1fms (%.1f%%)", m_buildTimes.buildCompact/1000.0f, m_buildTimes.buildCompact*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Filter Border: %.1fms (%.1f%%)", m_buildTimes.filterBorder/1000.0f, m_buildTimes.filterBorder*pc); + rcGetLog()->log(RC_LOG_PROGRESS, "Filter Walkable: %.1fms (%.1f%%)", m_buildTimes.filterWalkable/1000.0f, m_buildTimes.filterWalkable*pc); + rcGetLog()->log(RC_LOG_PROGRESS, "Filter Reachable: %.1fms (%.1f%%)", m_buildTimes.filterMarkReachable/1000.0f, m_buildTimes.filterMarkReachable*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Distancefield: %.1fms (%.1f%%)", m_buildTimes.buildDistanceField/1000.0f, m_buildTimes.buildDistanceField*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - distance: %.1fms (%.1f%%)", m_buildTimes.buildDistanceFieldDist/1000.0f, m_buildTimes.buildDistanceFieldDist*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - blur: %.1fms (%.1f%%)", m_buildTimes.buildDistanceFieldBlur/1000.0f, m_buildTimes.buildDistanceFieldBlur*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Regions: %.1fms (%.1f%%)", m_buildTimes.buildRegions/1000.0f, m_buildTimes.buildRegions*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - watershed: %.1fms (%.1f%%)", m_buildTimes.buildRegionsReg/1000.0f, m_buildTimes.buildRegionsReg*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - expand: %.1fms (%.1f%%)", m_buildTimes.buildRegionsExp/1000.0f, m_buildTimes.buildRegionsExp*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - find catchment basins: %.1fms (%.1f%%)", m_buildTimes.buildRegionsFlood/1000.0f, m_buildTimes.buildRegionsFlood*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - filter: %.1fms (%.1f%%)", m_buildTimes.buildRegionsFilter/1000.0f, m_buildTimes.buildRegionsFilter*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Contours: %.1fms (%.1f%%)", m_buildTimes.buildContours/1000.0f, m_buildTimes.buildContours*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - trace: %.1fms (%.1f%%)", m_buildTimes.buildContoursTrace/1000.0f, m_buildTimes.buildContoursTrace*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - simplify: %.1fms (%.1f%%)", m_buildTimes.buildContoursSimplify/1000.0f, m_buildTimes.buildContoursSimplify*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Fixup contours: %.1fms (%.1f%%)", m_buildTimes.fixupContours/1000.0f, m_buildTimes.fixupContours*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Polymesh: %.1fms (%.1f%%)", m_buildTimes.buildPolymesh/1000.0f, m_buildTimes.buildPolymesh*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Polymesh: Verts:%d Polys:%d", m_polyMesh->nverts, m_polyMesh->npolys); + + rcGetLog()->log(RC_LOG_PROGRESS, "TOTAL: %.1fms", rcGetDeltaTimeUsec(totStartTime, totEndTime)/1000.0f); + } + + toolRecalc(); + + return true; +} diff --git a/RecastDemo/Source/BuilderStatMeshTiling.cpp b/RecastDemo/Source/BuilderStatMeshTiling.cpp new file mode 100644 index 0000000..518b822 --- /dev/null +++ b/RecastDemo/Source/BuilderStatMeshTiling.cpp @@ -0,0 +1,790 @@ +#define _USE_MATH_DEFINES +#include +#include +#include +#include "SDL.h" +#include "SDL_Opengl.h" +#include "imgui.h" +#include "Builder.h" +#include "BuilderStatMeshTiling.h" +#include "Recast.h" +#include "RecastTimer.h" +#include "RecastDebugDraw.h" +#include "DetourStatNavMesh.h" +#include "DetourStatNavMeshBuilder.h" +#include "DetourDebugDraw.h" + +#ifdef WIN32 +# define snprintf _snprintf +#endif + +BuilderStatMeshTiling::BuilderStatMeshTiling() : + m_keepInterResults(false), + m_tileSize(64), + m_chunkyMesh(0), + m_tileSet(0), + m_polyMesh(0), + m_drawMode(DRAWMODE_NAVMESH) +{ +} + +BuilderStatMeshTiling::~BuilderStatMeshTiling() +{ + cleanup(); +} + +void BuilderStatMeshTiling::cleanup() +{ + delete m_chunkyMesh; + m_chunkyMesh = 0; + delete m_tileSet; + m_tileSet = 0; + delete m_polyMesh; + m_polyMesh = 0; + toolCleanup(); +} + +void BuilderStatMeshTiling::handleSettings() +{ + Builder::handleCommonSettings(); + + imguiLabel(GENID, "Tiling"); + imguiSlider(GENID, "TileSize", &m_tileSize, 16.0f, 1024.0f, 16.0f); + + char text[64]; + int gw = 0, gh = 0; + rcCalcGridSize(m_bmin, m_bmax, m_cellSize, &gw, &gh); + const int ts = (int)m_tileSize; + const int tw = (gw + ts-1) / ts; + const int th = (gh + ts-1) / ts; + snprintf(text, 64, "Tiles %d x %d", tw, th); + imguiValue(GENID, text); + + imguiSeparator(); + if (imguiCheck(GENID, "Keep Itermediate Results", m_keepInterResults)) + m_keepInterResults = !m_keepInterResults; + + imguiSeparator(); +} + +void BuilderStatMeshTiling::handleDebugMode() +{ + // Check which modes are valid. + bool valid[MAX_DRAWMODE]; + for (int i = 0; i < MAX_DRAWMODE; ++i) + valid[i] = false; + + bool hasChf = false; + bool hasSolid = false; + bool hasCset = false; + if (m_tileSet) + { + for (int i = 0; i < m_tileSet->width*m_tileSet->height; ++i) + { + if (m_tileSet->tiles[i].solid) hasSolid = true; + if (m_tileSet->tiles[i].chf) hasChf = true; + if (m_tileSet->tiles[i].cset) hasCset = true; + } + } + + if (m_verts && m_tris) + { + valid[DRAWMODE_NAVMESH] = m_navMesh != 0; + valid[DRAWMODE_NAVMESH_TRANS] = m_navMesh != 0; + valid[DRAWMODE_NAVMESH_BVTREE] = m_navMesh != 0; + valid[DRAWMODE_NAVMESH_INVIS] = m_navMesh != 0; + valid[DRAWMODE_MESH] = true; + valid[DRAWMODE_VOXELS] = hasSolid; + valid[DRAWMODE_VOXELS_WALKABLE] = hasSolid; + valid[DRAWMODE_COMPACT] = hasChf; + valid[DRAWMODE_COMPACT_DISTANCE] = hasChf; + valid[DRAWMODE_COMPACT_REGIONS] = hasChf; + valid[DRAWMODE_REGION_CONNECTIONS] = hasCset; + valid[DRAWMODE_RAW_CONTOURS] = hasCset; + valid[DRAWMODE_BOTH_CONTOURS] = hasCset; + valid[DRAWMODE_CONTOURS] = hasCset; + valid[DRAWMODE_POLYMESH] = m_polyMesh != 0; + } + + if (!valid[m_drawMode]) + m_drawMode = DRAWMODE_MESH; + + int unavail = 0; + for (int i = 0; i < MAX_DRAWMODE; ++i) + if (!valid[i]) unavail++; + + if (unavail == MAX_DRAWMODE) + return; + + imguiLabel(GENID, "Draw"); + if (valid[DRAWMODE_MESH] && imguiCheck(GENID, "Input Mesh", m_drawMode == DRAWMODE_MESH)) + m_drawMode = DRAWMODE_MESH; + if (valid[DRAWMODE_NAVMESH] && imguiCheck(GENID, "Navmesh", m_drawMode == DRAWMODE_NAVMESH)) + m_drawMode = DRAWMODE_NAVMESH; + if (valid[DRAWMODE_NAVMESH_INVIS] && imguiCheck(GENID, "Navmesh Invis", m_drawMode == DRAWMODE_NAVMESH_INVIS)) + m_drawMode = DRAWMODE_NAVMESH_INVIS; + if (valid[DRAWMODE_NAVMESH_TRANS] && imguiCheck(GENID, "Navmesh Trans", m_drawMode == DRAWMODE_NAVMESH_TRANS)) + m_drawMode = DRAWMODE_NAVMESH_TRANS; + if (valid[DRAWMODE_NAVMESH_BVTREE] && imguiCheck(GENID, "Navmesh BVTree", m_drawMode == DRAWMODE_NAVMESH_BVTREE)) + m_drawMode = DRAWMODE_NAVMESH_BVTREE; + if (valid[DRAWMODE_VOXELS] && imguiCheck(GENID, "Voxels", m_drawMode == DRAWMODE_VOXELS)) + m_drawMode = DRAWMODE_VOXELS; + if (valid[DRAWMODE_VOXELS_WALKABLE] && imguiCheck(GENID, "Walkable Voxels", m_drawMode == DRAWMODE_VOXELS_WALKABLE)) + m_drawMode = DRAWMODE_VOXELS_WALKABLE; + if (valid[DRAWMODE_COMPACT] && imguiCheck(GENID, "Compact", m_drawMode == DRAWMODE_COMPACT)) + m_drawMode = DRAWMODE_COMPACT; + if (valid[DRAWMODE_COMPACT_DISTANCE] && imguiCheck(GENID, "Compact Distance", m_drawMode == DRAWMODE_COMPACT_DISTANCE)) + m_drawMode = DRAWMODE_COMPACT_DISTANCE; + if (valid[DRAWMODE_COMPACT_REGIONS] && imguiCheck(GENID, "Compact Regions", m_drawMode == DRAWMODE_COMPACT_REGIONS)) + m_drawMode = DRAWMODE_COMPACT_REGIONS; + if (valid[DRAWMODE_REGION_CONNECTIONS] && imguiCheck(GENID, "Region Connections", m_drawMode == DRAWMODE_REGION_CONNECTIONS)) + m_drawMode = DRAWMODE_REGION_CONNECTIONS; + if (valid[DRAWMODE_RAW_CONTOURS] && imguiCheck(GENID, "Raw Contours", m_drawMode == DRAWMODE_RAW_CONTOURS)) + m_drawMode = DRAWMODE_RAW_CONTOURS; + if (valid[DRAWMODE_BOTH_CONTOURS] && imguiCheck(GENID, "Both Contours", m_drawMode == DRAWMODE_BOTH_CONTOURS)) + m_drawMode = DRAWMODE_BOTH_CONTOURS; + if (valid[DRAWMODE_CONTOURS] && imguiCheck(GENID, "Contours", m_drawMode == DRAWMODE_CONTOURS)) + m_drawMode = DRAWMODE_CONTOURS; + if (valid[DRAWMODE_POLYMESH] && imguiCheck(GENID, "Poly Mesh", m_drawMode == DRAWMODE_POLYMESH)) + m_drawMode = DRAWMODE_POLYMESH; + + if (unavail) + { + imguiValue(GENID, "Tick 'Keep Itermediate Results'"); + imguiValue(GENID, "to see more debug mode options."); + } +} + +void BuilderStatMeshTiling::handleRender() +{ + if (!m_verts || !m_tris || !m_trinorms) + return; + + float col[4]; + + glEnable(GL_FOG); + glDepthMask(GL_TRUE); + + if (m_drawMode == DRAWMODE_MESH) + { + // Draw mesh + rcDebugDrawMeshSlope(m_verts, m_nverts, m_tris, m_trinorms, m_ntris, m_agentMaxSlope); + } + else if (m_drawMode != DRAWMODE_NAVMESH_TRANS) + { + // Draw mesh + rcDebugDrawMesh(m_verts, m_nverts, m_tris, m_trinorms, m_ntris, 0); + } + + glDisable(GL_FOG); + glDepthMask(GL_FALSE); + + // Draw bounds + col[0] = 1; col[1] = 1; col[2] = 1; col[3] = 0.5f; + rcDebugDrawBoxWire(m_bmin[0],m_bmin[1],m_bmin[2], m_bmax[0],m_bmax[1],m_bmax[2], col); + + // Tiling grid. + const int ts = (int)m_tileSize; + int gw = 0, gh = 0; + rcCalcGridSize(m_bmin, m_bmax, m_cellSize, &gw, &gh); + int tw = (gw + ts-1) / ts; + int th = (gh + ts-1) / ts; + const float s = ts*m_cellSize; + glBegin(GL_LINES); + glColor4ub(0,0,0,64); + for (int y = 0; y < th; ++y) + { + for (int x = 0; x < tw; ++x) + { + float fx, fy, fz; + fx = m_bmin[0] + x*s; + fy = m_bmin[1]; + fz = m_bmin[2] + y*s; + + glVertex3f(fx,fy,fz); + glVertex3f(fx+s,fy,fz); + glVertex3f(fx,fy,fz); + glVertex3f(fx,fy,fz+s); + + if (x+1 >= tw) + { + glVertex3f(fx+s,fy,fz); + glVertex3f(fx+s,fy,fz+s); + } + if (y+1 >= th) + { + glVertex3f(fx,fy,fz+s); + glVertex3f(fx+s,fy,fz+s); + } + } + } + glEnd(); + + + if (m_navMesh && + (m_drawMode == DRAWMODE_NAVMESH || + m_drawMode == DRAWMODE_NAVMESH_TRANS || + m_drawMode == DRAWMODE_NAVMESH_BVTREE || + m_drawMode == DRAWMODE_NAVMESH_INVIS)) + { + int flags = NAVMESH_TOOLS; + if (m_drawMode != DRAWMODE_NAVMESH_INVIS) + flags |= NAVMESH_POLYS; + if (m_drawMode == DRAWMODE_NAVMESH_BVTREE) + flags |= NAVMESH_BVTREE; + toolRender(flags); + } + + glDepthMask(GL_TRUE); + + if (m_tileSet) + { + if (m_drawMode == DRAWMODE_COMPACT) + { + for (int i = 0; i < m_tileSet->width*m_tileSet->height; ++i) + { + if (m_tileSet->tiles[i].chf) + rcDebugDrawCompactHeightfieldSolid(*m_tileSet->tiles[i].chf); + } + } + + if (m_drawMode == DRAWMODE_COMPACT_DISTANCE) + { + for (int i = 0; i < m_tileSet->width*m_tileSet->height; ++i) + { + if (m_tileSet->tiles[i].chf) + rcDebugDrawCompactHeightfieldDistance(*m_tileSet->tiles[i].chf); + } + } + if (m_drawMode == DRAWMODE_COMPACT_REGIONS) + { + for (int i = 0; i < m_tileSet->width*m_tileSet->height; ++i) + { + if (m_tileSet->tiles[i].chf) + rcDebugDrawCompactHeightfieldRegions(*m_tileSet->tiles[i].chf); + } + } + + if (m_drawMode == DRAWMODE_VOXELS) + { + glEnable(GL_FOG); + for (int i = 0; i < m_tileSet->width*m_tileSet->height; ++i) + { + if (m_tileSet->tiles[i].solid) + rcDebugDrawHeightfieldSolid(*m_tileSet->tiles[i].solid); + } + glDisable(GL_FOG); + } + if (m_drawMode == DRAWMODE_VOXELS_WALKABLE) + { + glEnable(GL_FOG); + for (int i = 0; i < m_tileSet->width*m_tileSet->height; ++i) + { + if (m_tileSet->tiles[i].solid) + rcDebugDrawHeightfieldWalkable(*m_tileSet->tiles[i].solid); + } + glDisable(GL_FOG); + } + if (m_drawMode == DRAWMODE_RAW_CONTOURS) + { + glDepthMask(GL_FALSE); + for (int i = 0; i < m_tileSet->width*m_tileSet->height; ++i) + { + if (m_tileSet->tiles[i].cset) + rcDebugDrawRawContours(*m_tileSet->tiles[i].cset, m_cfg.bmin, m_cfg.cs, m_cfg.ch); + } + glDepthMask(GL_TRUE); + } + if (m_drawMode == DRAWMODE_BOTH_CONTOURS) + { + glDepthMask(GL_FALSE); + for (int i = 0; i < m_tileSet->width*m_tileSet->height; ++i) + { + if (m_tileSet->tiles[i].cset) + { + rcDebugDrawRawContours(*m_tileSet->tiles[i].cset, m_cfg.bmin, m_cfg.cs, m_cfg.ch, 0.5f); + rcDebugDrawContours(*m_tileSet->tiles[i].cset, m_cfg.bmin, m_cfg.cs, m_cfg.ch); + } + } + glDepthMask(GL_TRUE); + } + if (m_drawMode == DRAWMODE_CONTOURS) + { + glDepthMask(GL_FALSE); + for (int i = 0; i < m_tileSet->width*m_tileSet->height; ++i) + { + if (m_tileSet->tiles[i].cset) + rcDebugDrawContours(*m_tileSet->tiles[i].cset, m_cfg.bmin, m_cfg.cs, m_cfg.ch); + } + glDepthMask(GL_TRUE); + } + if (m_drawMode == DRAWMODE_REGION_CONNECTIONS) + { + for (int i = 0; i < m_tileSet->width*m_tileSet->height; ++i) + { + if (m_tileSet->tiles[i].chf) + rcDebugDrawCompactHeightfieldRegions(*m_tileSet->tiles[i].chf); + } + + glDepthMask(GL_FALSE); + for (int i = 0; i < m_tileSet->width*m_tileSet->height; ++i) + { + if (m_tileSet->tiles[i].cset) + rcDebugDrawRegionConnections(*m_tileSet->tiles[i].cset, m_cfg.bmin, m_cfg.cs, m_cfg.ch); + } + glDepthMask(GL_TRUE); + } + if (m_polyMesh && m_drawMode == DRAWMODE_POLYMESH) + { + glDepthMask(GL_FALSE); + rcDebugDrawPolyMesh(*m_polyMesh); + glDepthMask(GL_TRUE); + } + } + + static const float startCol[4] = { 0.5f, 0.1f, 0.0f, 0.75f }; + static const float endCol[4] = { 0.2f, 0.4f, 0.0f, 0.75f }; + if (m_sposSet) + drawAgent(m_spos, m_agentRadius, m_agentHeight, m_agentMaxClimb, startCol); + if (m_eposSet) + drawAgent(m_epos, m_agentRadius, m_agentHeight, m_agentMaxClimb, endCol); + +} + +void BuilderStatMeshTiling::handleMeshChanged(const float* verts, int nverts, + const int* tris, const float* trinorms, int ntris, + const float* bmin, const float* bmax) +{ + Builder::handleMeshChanged(verts, nverts, tris, trinorms, ntris, bmin, bmax); + toolCleanup(); + toolReset(); +} + +bool BuilderStatMeshTiling::handleBuild() +{ + if (!m_verts || ! m_tris) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Input mesh is not specified."); + return false; + } + + cleanup(); + toolCleanup(); + toolReset(); + + // Init build configuration from GUI + memset(&m_cfg, 0, sizeof(m_cfg)); + m_cfg.cs = m_cellSize; + m_cfg.ch = m_cellHeight; + m_cfg.walkableSlopeAngle = m_agentMaxSlope; + m_cfg.walkableHeight = (int)ceilf(m_agentHeight / m_cfg.ch); + m_cfg.walkableClimb = (int)ceilf(m_agentMaxClimb / m_cfg.ch); + m_cfg.walkableRadius = (int)ceilf(m_agentRadius / m_cfg.cs); + m_cfg.maxEdgeLen = (int)(m_edgeMaxLen / m_cellSize); + m_cfg.maxSimplificationError = m_edgeMaxError; + m_cfg.minRegionSize = (int)rcSqr(m_regionMinSize); + m_cfg.mergeRegionSize = (int)rcSqr(m_regionMergeSize); + m_cfg.maxVertsPerPoly = (int)m_vertsPerPoly; + m_cfg.tileSize = (int)m_tileSize; + m_cfg.borderSize = m_cfg.walkableRadius*2 + 2; // Reserve enough padding. + + if (m_cfg.maxVertsPerPoly == DT_VERTS_PER_POLYGON) + m_drawMode = DRAWMODE_NAVMESH; + else + m_drawMode = DRAWMODE_POLYMESH; + + // Set the area where the navigation will be build. + // Here the bounds of the input mesh are used, but the + // area could be specified by an user defined box, etc. + vcopy(m_cfg.bmin, m_bmin); + vcopy(m_cfg.bmax, m_bmax); + rcCalcGridSize(m_cfg.bmin, m_cfg.bmax, m_cfg.cs, &m_cfg.width, &m_cfg.height); + + // Reset build times gathering. + memset(&m_buildTimes, 0, sizeof(m_buildTimes)); + rcSetBuildTimes(&m_buildTimes); + + // Start the build process. + rcTimeVal totStartTime = rcGetPerformanceTimer(); + + // Calculate the number of tiles in the output and initialize tiles. + m_tileSet = new TileSet; + if (!m_tileSet) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Out of memory 'tileSet'."); + return false; + } + vcopy(m_tileSet->bmin, m_cfg.bmin); + vcopy(m_tileSet->bmax, m_cfg.bmax); + m_tileSet->cs = m_cfg.cs; + m_tileSet->ch = m_cfg.ch; + m_tileSet->width = (m_cfg.width + m_cfg.tileSize-1) / m_cfg.tileSize; + m_tileSet->height = (m_cfg.height + m_cfg.tileSize-1) / m_cfg.tileSize; + m_tileSet->tiles = new Tile[m_tileSet->height * m_tileSet->width]; + if (!m_tileSet->tiles) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Out of memory 'tileSet->tiles' (%d).", m_tileSet->height * m_tileSet->width); + return false; + } + + // Build chunky trimesh for local polygon queries. + rcTimeVal chunkyStartTime = rcGetPerformanceTimer(); + m_chunkyMesh = new rcChunkyTriMesh; + if (!m_chunkyMesh) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Out of memory 'm_chunkyMesh'."); + return false; + } + if (!rcCreateChunkyTriMesh(m_verts, m_tris, m_ntris, 256, m_chunkyMesh)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Could not build chunky mesh."); + return false; + } + rcTimeVal chunkyEndTime = rcGetPerformanceTimer(); + + if (rcGetLog()) + { + rcGetLog()->log(RC_LOG_PROGRESS, "Building navigation:"); + rcGetLog()->log(RC_LOG_PROGRESS, " - %d x %d cells", m_cfg.width, m_cfg.height); + rcGetLog()->log(RC_LOG_PROGRESS, " - %d x %d tiles", m_tileSet->width, m_tileSet->height); + rcGetLog()->log(RC_LOG_PROGRESS, " - %.1f verts, %.1f tris", m_nverts/1000.0f, m_ntris/1000.0f); + } + + // Initialize per tile config. + rcConfig tileCfg; + memcpy(&tileCfg, &m_cfg, sizeof(rcConfig)); + tileCfg.width = m_cfg.tileSize + m_cfg.borderSize*2; + tileCfg.height = m_cfg.tileSize + m_cfg.borderSize*2; + + // Allocate array that can hold triangle flags for all geom chunks. + unsigned char* triangleFlags = new unsigned char[m_chunkyMesh->maxTrisPerChunk]; + if (!triangleFlags) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Out of memory 'triangleFlags' (%d).", m_chunkyMesh->maxTrisPerChunk); + return false; + } + + rcHeightfield* solid = 0; + rcCompactHeightfield* chf = 0; + rcContourSet* cset = 0; + + for (int y = 0; y < m_tileSet->height; ++y) + { + for (int x = 0; x < m_tileSet->width; ++x) + { + rcTimeVal startTime = rcGetPerformanceTimer(); + + Tile& tile = m_tileSet->tiles[x + y*m_tileSet->width]; + + // Calculate the per tile bounding box. + tileCfg.bmin[0] = m_cfg.bmin[0] + (x*m_cfg.tileSize - m_cfg.borderSize)*m_cfg.cs; + tileCfg.bmin[2] = m_cfg.bmin[2] + (y*m_cfg.tileSize - m_cfg.borderSize)*m_cfg.cs; + tileCfg.bmax[0] = m_cfg.bmin[0] + ((x+1)*m_cfg.tileSize + m_cfg.borderSize)*m_cfg.cs; + tileCfg.bmax[2] = m_cfg.bmin[2] + ((y+1)*m_cfg.tileSize + m_cfg.borderSize)*m_cfg.cs; + + delete solid; + delete chf; + solid = 0; + chf = 0; + + float tbmin[2], tbmax[2]; + tbmin[0] = tileCfg.bmin[0]; + tbmin[1] = tileCfg.bmin[2]; + tbmax[0] = tileCfg.bmax[0]; + tbmax[1] = tileCfg.bmax[2]; + int cid[256];// TODO: Make grow when returning too many items. + const int ncid = rcGetChunksInRect(m_chunkyMesh, tbmin, tbmax, cid, 256); + if (!ncid) + continue; + + solid = new rcHeightfield; + if (!solid) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Out of memory 'solid'.", x, y); + continue; + } + if (!rcCreateHeightfield(*solid, tileCfg.width, tileCfg.height, tileCfg.bmin, tileCfg.bmax, tileCfg.cs, tileCfg.ch)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Could not create solid heightfield.", x, y); + continue; + } + + for (int i = 0; i < ncid; ++i) + { + const rcChunkyTriMeshNode& node = m_chunkyMesh->nodes[cid[i]]; + const int* tris = &m_chunkyMesh->tris[node.i*3]; + const int ntris = node.n; + + memset(triangleFlags, 0, ntris*sizeof(unsigned char)); + rcMarkWalkableTriangles(tileCfg.walkableSlopeAngle, + m_verts, m_nverts, tris, ntris, triangleFlags); + + rcRasterizeTriangles(m_verts, m_nverts, tris, triangleFlags, ntris, *solid); + } + + rcFilterLedgeSpans(tileCfg.walkableHeight, tileCfg.walkableClimb, *solid); + + rcFilterWalkableLowHeightSpans(tileCfg.walkableHeight, *solid); + + chf = new rcCompactHeightfield; + if (!chf) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Out of memory 'chf'.", x, y); + continue; + } + if (!rcBuildCompactHeightfield(tileCfg.walkableHeight, tileCfg.walkableClimb, + RC_WALKABLE, *solid, *chf)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Could not build compact data.", x, y); + continue; + } + + if (!rcBuildDistanceField(*chf)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Could not build distance fields.", x, y); + continue; + } + + if (!rcBuildRegions(*chf, tileCfg.walkableRadius, tileCfg.borderSize, tileCfg.minRegionSize, tileCfg.mergeRegionSize)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Could not build regions.", x, y); + continue; + } + + cset = new rcContourSet; + if (!cset) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Out of memory 'cset'.", x, y); + continue; + } + if (!rcBuildContours(*chf, tileCfg.maxSimplificationError, tileCfg.maxEdgeLen, *cset)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Could not create contours.", x, y); + continue; + } + + if (m_keepInterResults) + { + tile.solid = solid; + solid = 0; + tile.chf = chf; + chf = 0; + } + + if (!cset->nconts) + { + delete cset; + cset = 0; + continue; + } + + tile.cset = cset; + // Offset the vertices in the cset. + rcTranslateContours(tile.cset, x*tileCfg.tileSize - tileCfg.borderSize, 0, y*tileCfg.tileSize - tileCfg.borderSize); + + rcTimeVal endTime = rcGetPerformanceTimer(); + tile.buildTime += rcGetDeltaTimeUsec(startTime, endTime); + } + } + + delete [] triangleFlags; + delete solid; + delete chf; + + // Make sure that the vertices along the tile edges match, + // so that they can be later properly stitched together. + for (int y = 0; y < m_tileSet->height; ++y) + { + for (int x = 0; x < m_tileSet->width; ++x) + { + rcTimeVal startTime = rcGetPerformanceTimer(); + if ((x+1) < m_tileSet->width) + { + if (!rcFixupAdjacentContours(m_tileSet->tiles[x + y*m_tileSet->width].cset, + m_tileSet->tiles[x+1 + y*m_tileSet->width].cset, + m_cfg.walkableClimb, (x+1)*m_cfg.tileSize, -1)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Could not fixup x+1.", x, y); + return false; + } + } + + if ((y+1) < m_tileSet->height) + { + if (!rcFixupAdjacentContours(m_tileSet->tiles[x + y*m_tileSet->width].cset, + m_tileSet->tiles[x + (y+1)*m_tileSet->width].cset, + m_cfg.walkableClimb, -1, (y+1)*m_cfg.tileSize)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Could not fixup y+1.", x, y); + return false; + } + } + rcTimeVal endTime = rcGetPerformanceTimer(); + m_tileSet->tiles[x+y*m_tileSet->width].buildTime += rcGetDeltaTimeUsec(startTime, endTime); + } + } + + + // Combine contours. + rcContourSet combSet; + + combSet.nconts = 0; + for (int y = 0; y < m_tileSet->height; ++y) + { + for (int x = 0; x < m_tileSet->width; ++x) + { + Tile& tile = m_tileSet->tiles[x + y*m_tileSet->width]; + if (!tile.cset) continue; + combSet.nconts += tile.cset->nconts; + } + } + combSet.conts = new rcContour[combSet.nconts]; + if (!combSet.conts) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Out of memory 'combSet.conts' (%d).", combSet.nconts); + return false; + } + int n = 0; + for (int y = 0; y < m_tileSet->height; ++y) + { + for (int x = 0; x < m_tileSet->width; ++x) + { + Tile& tile = m_tileSet->tiles[x + y*m_tileSet->width]; + if (!tile.cset) continue; + for (int i = 0; i < tile.cset->nconts; ++i) + { + combSet.conts[n].verts = tile.cset->conts[i].verts; + combSet.conts[n].nverts = tile.cset->conts[i].nverts; + combSet.conts[n].reg = tile.cset->conts[i].reg; + n++; + } + } + } + + m_polyMesh = new rcPolyMesh; + if (!m_polyMesh) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Out of memory 'polyMesh'."); + return false; + } + + bool polyRes = rcBuildPolyMesh(combSet, m_cfg.bmin, m_cfg.bmax, m_cfg.cs, m_cfg.ch, m_cfg.maxVertsPerPoly, *m_polyMesh); + + // Remove vertex binding to avoid double deletion. + for (int i = 0; i < combSet.nconts; ++i) + { + combSet.conts[i].verts = 0; + combSet.conts[i].nverts = 0; + } + + if (!polyRes) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Could not triangulate contours."); + return false; + } + + if (!m_keepInterResults) + { + for (int y = 0; y < m_tileSet->height; ++y) + { + for (int x = 0; x < m_tileSet->width; ++x) + { + Tile& tile = m_tileSet->tiles[x + y*m_tileSet->width]; + delete tile.cset; + tile.cset = 0; + } + } + } + + if (m_cfg.maxVertsPerPoly == DT_VERTS_PER_POLYGON) + { + unsigned char* navData = 0; + int navDataSize = 0; + if (!dtCreateNavMeshData(m_polyMesh->verts, m_polyMesh->nverts, + m_polyMesh->polys, m_polyMesh->npolys, m_polyMesh->nvp, + m_cfg.bmin, m_cfg.bmax, m_cfg.cs, m_cfg.ch, &navData, &navDataSize)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "Could not build Detour navmesh."); + return false; + } + + m_navMesh = new dtStatNavMesh; + if (!m_navMesh) + { + delete [] navData; + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "Could not create Detour navmesh"); + return false; + } + + if (!m_navMesh->init(navData, navDataSize, true)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "Could not init Detour navmesh"); + return false; + } + } + + rcTimeVal totEndTime = rcGetPerformanceTimer(); + + if (rcGetLog()) + { + const float pc = 100.0f / rcGetDeltaTimeUsec(totStartTime, totEndTime); + + rcGetLog()->log(RC_LOG_PROGRESS, "Chunky Mesh: %.1fms (%.1f%%)", rcGetDeltaTimeUsec(chunkyStartTime, chunkyEndTime)/1000.0f, rcGetDeltaTimeUsec(chunkyStartTime, chunkyEndTime)*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Rasterize: %.1fms (%.1f%%)", m_buildTimes.rasterizeTriangles/1000.0f, m_buildTimes.rasterizeTriangles*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Compact: %.1fms (%.1f%%)", m_buildTimes.buildCompact/1000.0f, m_buildTimes.buildCompact*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Filter Border: %.1fms (%.1f%%)", m_buildTimes.filterBorder/1000.0f, m_buildTimes.filterBorder*pc); + rcGetLog()->log(RC_LOG_PROGRESS, "Filter Walkable: %.1fms (%.1f%%)", m_buildTimes.filterWalkable/1000.0f, m_buildTimes.filterWalkable*pc); + rcGetLog()->log(RC_LOG_PROGRESS, "Filter Reachable: %.1fms (%.1f%%)", m_buildTimes.filterMarkReachable/1000.0f, m_buildTimes.filterMarkReachable*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Distancefield: %.1fms (%.1f%%)", m_buildTimes.buildDistanceField/1000.0f, m_buildTimes.buildDistanceField*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - distance: %.1fms (%.1f%%)", m_buildTimes.buildDistanceFieldDist/1000.0f, m_buildTimes.buildDistanceFieldDist*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - blur: %.1fms (%.1f%%)", m_buildTimes.buildDistanceFieldBlur/1000.0f, m_buildTimes.buildDistanceFieldBlur*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Regions: %.1fms (%.1f%%)", m_buildTimes.buildRegions/1000.0f, m_buildTimes.buildRegions*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - watershed: %.1fms (%.1f%%)", m_buildTimes.buildRegionsReg/1000.0f, m_buildTimes.buildRegionsReg*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - expand: %.1fms (%.1f%%)", m_buildTimes.buildRegionsExp/1000.0f, m_buildTimes.buildRegionsExp*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - find catchment basins: %.1fms (%.1f%%)", m_buildTimes.buildRegionsFlood/1000.0f, m_buildTimes.buildRegionsFlood*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - filter: %.1fms (%.1f%%)", m_buildTimes.buildRegionsFilter/1000.0f, m_buildTimes.buildRegionsFilter*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Contours: %.1fms (%.1f%%)", m_buildTimes.buildContours/1000.0f, m_buildTimes.buildContours*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - trace: %.1fms (%.1f%%)", m_buildTimes.buildContoursTrace/1000.0f, m_buildTimes.buildContoursTrace*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - simplify: %.1fms (%.1f%%)", m_buildTimes.buildContoursSimplify/1000.0f, m_buildTimes.buildContoursSimplify*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Fixup contours: %.1fms (%.1f%%)", m_buildTimes.fixupContours/1000.0f, m_buildTimes.fixupContours*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Polymesh: %.1fms (%.1f%%)", m_buildTimes.buildPolymesh/1000.0f, m_buildTimes.buildPolymesh*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Polymesh: Verts:%d Polys:%d", m_polyMesh->nverts, m_polyMesh->npolys); + + rcGetLog()->log(RC_LOG_PROGRESS, "TOTAL: %.1fms", rcGetDeltaTimeUsec(totStartTime, totEndTime)/1000.0f); + } + + toolRecalc(); + + return true; +} diff --git a/RecastDemo/Source/demo.cpp b/RecastDemo/Source/demo.cpp deleted file mode 100644 index 947c02f..0000000 --- a/RecastDemo/Source/demo.cpp +++ /dev/null @@ -1,1902 +0,0 @@ -// -// Copyright (c) 2009 Mikko Mononen memon@inside.org -// -// 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 -#include -#define _USE_MATH_DEFINES -#include -#include -#ifdef WIN32 -# include -#else -# include -#endif -#include "SDL.h" -#include "SDL_Opengl.h" -#include "GLFont.h" -#include "RecastTimer.h" -#include "MeshLoaderObj.h" -#include "ChunkyTriMesh.h" -#include "Recast.h" -#include "RecastLog.h" -#include "RecastDebugDraw.h" -#include "imgui.h" -#include "DetourStatNavMesh.h" -#include "DetourStatNavMeshBuilder.h" -#include "DetourDebugDraw.h" - - -#ifdef WIN32 -# define snprintf _snprintf -#endif - -bool intersectSegmentTriangle(const float* sp, const float* sq, - const float* a, const float* b, const float* c, - float &t) -{ - float v, w; - float ab[3], ac[3], qp[3], ap[3], norm[3], e[3]; - vsub(ab, b, a); - vsub(ac, c, a); - vsub(qp, sp, sq); - - // Compute triangle normal. Can be precalculated or cached if - // intersecting multiple segments against the same triangle - vcross(norm, ab, ac); - - // Compute denominator d. If d <= 0, segment is parallel to or points - // away from triangle, so exit early - float d = vdot(qp, norm); - if (d <= 0.0f) return false; - - // Compute intersection t value of pq with plane of triangle. A ray - // intersects iff 0 <= t. Segment intersects iff 0 <= t <= 1. Delay - // dividing by d until intersection has been found to pierce triangle - vsub(ap, sp, a); - t = vdot(ap, norm); - if (t < 0.0f) return false; - if (t > d) return false; // For segment; exclude this code line for a ray test - - // Compute barycentric coordinate components and test if within bounds - vcross(e, qp, ap); - v = vdot(ac, e); - if (v < 0.0f || v > d) return false; - w = -vdot(ab, e); - if (w < 0.0f || v + w > d) return false; - - // Segment/ray intersects triangle. Perform delayed division - t /= d; - - return true; -} - -static bool raycast(rcMeshLoaderObj& mesh, float* src, float* dst, float& tmin) -{ - float dir[3]; - vsub(dir, dst, src); - - int nt = mesh.getTriCount(); - const float* verts = mesh.getVerts(); - const float* normals = mesh.getNormals(); - const int* tris = mesh.getTris(); - tmin = 1.0f; - bool hit = false; - - for (int i = 0; i < nt*3; i += 3) - { - const float* n = &normals[i]; - if (vdot(dir, n) > 0) - continue; - - float t = 1; - if (intersectSegmentTriangle(src, dst, - &verts[tris[i]*3], - &verts[tris[i+1]*3], - &verts[tris[i+2]*3], t)) - { - if (t < tmin) - tmin = t; - hit = true; - } - } - - return hit; -} - -struct FileList -{ - static const int MAX_FILES = 256; - inline FileList() : size(0) {} - inline ~FileList() - { - clear(); - } - - void clear() - { - for (int i = 0; i < size; ++i) - delete [] files[i]; - size = 0; - } - - void add(const char* path) - { - if (size >= MAX_FILES) - return; - int n = strlen(path); - files[size] = new char[n+1]; - strcpy(files[size], path); - size++; - } - - static int cmp(const void* a, const void* b) - { - return strcmp(*(const char**)a, *(const char**)b); - } - - void sort() - { - if (size > 1) - qsort(files, size, sizeof(char*), cmp); - } - - char* files[MAX_FILES]; - int size; -}; - -void scanDirectory(const char* path, const char* ext, FileList& list) -{ - list.clear(); - -#ifdef WIN32 - _finddata_t dir; - char pathWithExt[MAX_PATH]; - long fh; - strcpy(pathWithExt, path); - strcat(pathWithExt, "/*"); - strcat(pathWithExt, ext); - fh = _findfirst(pathWithExt, &dir); - if (fh == -1L) - return; - do - { - list.add(dir.name); - } - while (_findnext(fh, &dir) == 0); - _findclose(fh); -#else - dirent* current = 0; - DIR* dp = opendir(path); - if (!dp) - return; - - while ((current = readdir(dp)) != 0) - { - int len = strlen(current->d_name); - if (len > 4 && strncmp(current->d_name+len-4, ext, 4) == 0) - { - list.add(current->d_name); - } - } - closedir(dp); -#endif - list.sort(); -} - - -enum DrawMode -{ - DRAWMODE_NAVMESH, - DRAWMODE_NAVMESH_TRANS, - DRAWMODE_NAVMESH_BVTREE, - DRAWMODE_NAVMESH_INVIS, - DRAWMODE_MESH, - DRAWMODE_VOXELS, - DRAWMODE_VOXELS_WALKABLE, - DRAWMODE_COMPACT, - DRAWMODE_COMPACT_DISTANCE, - DRAWMODE_COMPACT_REGIONS, - DRAWMODE_REGION_CONNECTIONS, - DRAWMODE_RAW_CONTOURS, - DRAWMODE_BOTH_CONTOURS, - DRAWMODE_CONTOURS, - DRAWMODE_POLYMESH, -}; - -enum ToolMode -{ - TOOLMODE_PATHFIND, - TOOLMODE_RAYCAST, - TOOLMODE_DISTANCE_TO_WALL, - TOOLMODE_FIND_POLYS_AROUND, -}; - - -GLFont g_font; - -void drawText(int x, int y, int dir, const char* text, unsigned int col) -{ - if (dir < 0) - g_font.drawText((float)x - g_font.getTextLength(text), (float)y, text, col); - else - g_font.drawText((float)x, (float)y, text, col); -} - - - -struct Tile -{ - inline Tile() : chf(0), cset(0), solid(0), buildTime(0) {} - inline ~Tile() { delete chf; delete cset; delete solid; } - rcCompactHeightfield* chf; - rcHeightfield* solid; - rcContourSet* cset; - int buildTime; -}; - -struct TileSet -{ - inline TileSet() : width(0), height(0), tiles(0) {} - inline ~TileSet() { delete [] tiles; } - int width, height; - float bmin[3], bmax[3]; - float cs, ch; - Tile* tiles; -}; - - -rcMeshLoaderObj* g_mesh = 0; -float g_meshBMin[3], g_meshBMax[3]; -rcChunkyTriMesh* g_chunkyMesh = 0; -rcPolyMesh* g_polyMesh = 0; -dtStatNavMesh* g_navMesh = 0; -TileSet* g_tileSet = 0; -rcLog g_log; -rcBuildTimes g_buildTimes; - - -bool buildTiledNavigation(const rcConfig& cfg, - const rcMeshLoaderObj* mesh, - const rcChunkyTriMesh* chunkyMesh, - TileSet* tileSet, - rcPolyMesh* polyMesh, - dtStatNavMesh* navMesh, - bool keepInterResults) -{ - if (!mesh) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Input mesh is not valid."); - return false; - } - if (!chunkyMesh) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Input chunky mesh is not valid."); - return false; - } - - if (!tileSet) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Output tile set is not valid."); - return false; - } - if (!polyMesh) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Output polymesh is not valid."); - return false; - } - if (!navMesh) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Output navmesh is not valid."); - return false; - } - - memset(&g_buildTimes, 0, sizeof(g_buildTimes)); - rcSetBuildTimes(&g_buildTimes); - - rcTimeVal totStartTime = rcGetPerformanceTimer(); - - // Calculate the number of tiles in the output and initialize tiles. - int gw = 0, gh = 0; - rcCalcGridSize(cfg.bmin, cfg.bmax, cfg.cs, &gw, &gh); - vcopy(tileSet->bmin, cfg.bmin); - vcopy(tileSet->bmax, cfg.bmax); - tileSet->cs = cfg.cs; - tileSet->ch = cfg.ch; - tileSet->width = (gw + cfg.tileSize-1) / cfg.tileSize; - tileSet->height = (gh + cfg.tileSize-1) / cfg.tileSize; - tileSet->tiles = new Tile[tileSet->height * tileSet->width]; - if (!tileSet->tiles) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Out of memory 'tileSet->tiles' (%d).", tileSet->height * tileSet->width); - return false; - } - - if (rcGetLog()) - { - rcGetLog()->log(RC_LOG_PROGRESS, "Building navigation:"); - rcGetLog()->log(RC_LOG_PROGRESS, " - %d x %d cells", gw, gh); - rcGetLog()->log(RC_LOG_PROGRESS, " - %d x %d tiles", tileSet->width, tileSet->height); - rcGetLog()->log(RC_LOG_PROGRESS, " - %d verts, %d tris", mesh->getVertCount(), mesh->getTriCount()); - } - - // Initialize per tile config. - rcConfig tileCfg; - memcpy(&tileCfg, &cfg, sizeof(rcConfig)); - tileCfg.width = cfg.tileSize + cfg.borderSize*2; - tileCfg.height = cfg.tileSize + cfg.borderSize*2; - - // Allocate array that can hold triangle flags for all geom chunks. - unsigned char* triangleFlags = new unsigned char[chunkyMesh->maxTrisPerChunk]; - if (!triangleFlags) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Out of memory 'triangleFlags' (%d).", chunkyMesh->maxTrisPerChunk); - return false; - } - - rcHeightfield* solid = 0; - rcCompactHeightfield* chf = 0; - rcContourSet* cset = 0; - - const float* verts = mesh->getVerts(); - const int nverts = mesh->getVertCount(); - - for (int y = 0; y < tileSet->height; ++y) - { - for (int x = 0; x < tileSet->width; ++x) - { - rcTimeVal startTime = rcGetPerformanceTimer(); - - Tile& tile = tileSet->tiles[x + y*tileSet->width]; - - // Calculate the per tile bounding box. - tileCfg.bmin[0] = cfg.bmin[0] + (x*cfg.tileSize - cfg.borderSize)*cfg.cs; - tileCfg.bmin[2] = cfg.bmin[2] + (y*cfg.tileSize - cfg.borderSize)*cfg.cs; - tileCfg.bmax[0] = cfg.bmin[0] + ((x+1)*cfg.tileSize + cfg.borderSize)*cfg.cs; - tileCfg.bmax[2] = cfg.bmin[2] + ((y+1)*cfg.tileSize + cfg.borderSize)*cfg.cs; - - delete solid; - delete chf; - solid = 0; - chf = 0; - - float tbmin[2], tbmax[2]; - tbmin[0] = tileCfg.bmin[0]; - tbmin[1] = tileCfg.bmin[2]; - tbmax[0] = tileCfg.bmax[0]; - tbmax[1] = tileCfg.bmax[2]; - int cid[256];// TODO: Make grow when returning too many items. - const int ncid = rcGetChunksInRect(chunkyMesh, tbmin, tbmax, cid, 256); - if (!ncid) - { - printf("Skipping empty %d,%d\n", x, y); - continue; - } - - solid = new rcHeightfield; - if (!solid) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Out of memory 'solid'.", x, y); - continue; - } - if (!rcCreateHeightfield(*solid, tileCfg.width, tileCfg.height, tileCfg.bmin, tileCfg.bmax, tileCfg.cs, tileCfg.ch)) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Could not create solid heightfield.", x, y); - continue; - } - - for (int i = 0; i < ncid; ++i) - { - const rcChunkyTriMeshNode& node = chunkyMesh->nodes[cid[i]]; - const int* tris = &chunkyMesh->tris[node.i*3]; - const int ntris = node.n; - - memset(triangleFlags, 0, ntris*sizeof(unsigned char)); - rcMarkWalkableTriangles(tileCfg.walkableSlopeAngle, - verts, nverts, tris, ntris, triangleFlags); - - rcRasterizeTriangles(verts, nverts, tris, triangleFlags, ntris, *solid); - } - - rcFilterLedgeSpans(tileCfg.walkableHeight, tileCfg.walkableClimb, *solid); - - rcFilterWalkableLowHeightSpans(tileCfg.walkableHeight, *solid); - - chf = new rcCompactHeightfield; - if (!chf) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Out of memory 'chf'.", x, y); - continue; - } - if (!rcBuildCompactHeightfield(tileCfg.walkableHeight, tileCfg.walkableClimb, - RC_WALKABLE/*|RC_REACHABLE*/, *solid, *chf)) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Could not build compact data.", x, y); - continue; - } - - if (!rcBuildDistanceField(*chf)) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Could not build distance fields.", x, y); - continue; - } - - if (!rcBuildRegions(*chf, tileCfg.walkableRadius, tileCfg.borderSize, tileCfg.minRegionSize, tileCfg.mergeRegionSize)) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Could not build regions.", x, y); - continue; - } - - cset = new rcContourSet; - if (!cset) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Out of memory 'cset'.", x, y); - continue; - } - if (!rcBuildContours(*chf, tileCfg.maxSimplificationError, tileCfg.maxEdgeLen, *cset)) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Could not create contours.", x, y); - continue; - } - - if (keepInterResults) - { - tile.solid = solid; - solid = 0; - tile.chf = chf; - chf = 0; - } - - if (!cset->nconts) - { - delete cset; - cset = 0; - continue; - } - - tile.cset = cset; - // Offset the vertices in the cset. - rcTranslateContours(tile.cset, x*tileCfg.tileSize - tileCfg.borderSize, 0, y*tileCfg.tileSize - tileCfg.borderSize); - - rcTimeVal endTime = rcGetPerformanceTimer(); - tile.buildTime += rcGetDeltaTimeUsec(startTime, endTime); - } - } - - delete [] triangleFlags; - delete solid; - delete chf; - - - for (int y = 0; y < tileSet->height; ++y) - { - for (int x = 0; x < tileSet->width; ++x) - { - rcTimeVal startTime = rcGetPerformanceTimer(); - if ((x+1) < tileSet->width) - { - if (!rcFixupAdjacentContours(tileSet->tiles[x + y*tileSet->width].cset, - tileSet->tiles[x+1 + y*tileSet->width].cset, - cfg.walkableClimb, (x+1)*cfg.tileSize, -1)) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Could not fixup x+1.", x, y); - return false; - } - } - - if ((y+1) < tileSet->height) - { - if (!rcFixupAdjacentContours(tileSet->tiles[x + y*tileSet->width].cset, - tileSet->tiles[x + (y+1)*tileSet->width].cset, - cfg.walkableClimb, -1, (y+1)*cfg.tileSize)) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Could not fixup y+1.", x, y); - return false; - } - } - rcTimeVal endTime = rcGetPerformanceTimer(); - tileSet->tiles[x+y*tileSet->width].buildTime += rcGetDeltaTimeUsec(startTime, endTime); - } - } - - - // Combine contours. - rcContourSet combSet; - - combSet.nconts = 0; - for (int y = 0; y < tileSet->height; ++y) - { - for (int x = 0; x < tileSet->width; ++x) - { - Tile& tile = tileSet->tiles[x + y*tileSet->width]; - if (!tile.cset) continue; - combSet.nconts += tile.cset->nconts; - } - } - combSet.conts = new rcContour[combSet.nconts]; - if (!combSet.conts) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Out of memory 'combSet.conts' (%d).", combSet.nconts); - return false; - } - int n = 0; - for (int y = 0; y < tileSet->height; ++y) - { - for (int x = 0; x < tileSet->width; ++x) - { - Tile& tile = tileSet->tiles[x + y*tileSet->width]; - if (!tile.cset) continue; - for (int i = 0; i < tile.cset->nconts; ++i) - { - combSet.conts[n].verts = tile.cset->conts[i].verts; - combSet.conts[n].nverts = tile.cset->conts[i].nverts; - combSet.conts[n].reg = tile.cset->conts[i].reg; - n++; - } - } - } - - bool polyRes = rcBuildPolyMesh(combSet, cfg.bmin, cfg.bmax, cfg.cs, cfg.ch, cfg.maxVertsPerPoly, *polyMesh); - - // Remove vertex binding to avoid double deletion. - for (int i = 0; i < combSet.nconts; ++i) - { - combSet.conts[i].verts = 0; - combSet.conts[i].nverts = 0; - } - - if (!polyRes) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Could not triangulate contours."); - return false; - } - - - if (cfg.maxVertsPerPoly == DT_VERTS_PER_POLYGON) - { - unsigned char* navData = 0; - int navDataSize = 0; - if (!dtCreateNavMeshData(polyMesh->verts, polyMesh->nverts, - polyMesh->polys, polyMesh->npolys, polyMesh->nvp, - cfg.bmin, cfg.bmax, cfg.cs, cfg.ch, &navData, &navDataSize)) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "Could not build Detour navmesh."); - return false; - } - - if (!navMesh->init(navData, navDataSize, true)) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "Could not init Detour navmesh"); - return false; - } - } - - rcTimeVal totEndTime = rcGetPerformanceTimer(); - - if (rcGetLog()) - { - const float pc = 100.0f / rcGetDeltaTimeUsec(totStartTime, totEndTime); - - rcGetLog()->log(RC_LOG_PROGRESS, "Rasterize: %.1fms (%.1f%%)", g_buildTimes.rasterizeTriangles/1000.0f, g_buildTimes.rasterizeTriangles*pc); - - rcGetLog()->log(RC_LOG_PROGRESS, "Build Compact: %.1fms (%.1f%%)", g_buildTimes.buildCompact/1000.0f, g_buildTimes.buildCompact*pc); - - rcGetLog()->log(RC_LOG_PROGRESS, "Filter Border: %.1fms (%.1f%%)", g_buildTimes.filterBorder/1000.0f, g_buildTimes.filterBorder*pc); - rcGetLog()->log(RC_LOG_PROGRESS, "Filter Walkable: %.1fms (%.1f%%)", g_buildTimes.filterWalkable/1000.0f, g_buildTimes.filterWalkable*pc); - rcGetLog()->log(RC_LOG_PROGRESS, "Filter Reachable: %.1fms (%.1f%%)", g_buildTimes.filterMarkReachable/1000.0f, g_buildTimes.filterMarkReachable*pc); - - rcGetLog()->log(RC_LOG_PROGRESS, "Build Distancefield: %.1fms (%.1f%%)", g_buildTimes.buildDistanceField/1000.0f, g_buildTimes.buildDistanceField*pc); - rcGetLog()->log(RC_LOG_PROGRESS, " - distance: %.1fms (%.1f%%)", g_buildTimes.buildDistanceFieldDist/1000.0f, g_buildTimes.buildDistanceFieldDist*pc); - rcGetLog()->log(RC_LOG_PROGRESS, " - blur: %.1fms (%.1f%%)", g_buildTimes.buildDistanceFieldBlur/1000.0f, g_buildTimes.buildDistanceFieldBlur*pc); - - rcGetLog()->log(RC_LOG_PROGRESS, "Build Regions: %.1fms (%.1f%%)", g_buildTimes.buildRegions/1000.0f, g_buildTimes.buildRegions*pc); - rcGetLog()->log(RC_LOG_PROGRESS, " - watershed: %.1fms (%.1f%%)", g_buildTimes.buildRegionsReg/1000.0f, g_buildTimes.buildRegionsReg*pc); - rcGetLog()->log(RC_LOG_PROGRESS, " - expand: %.1fms (%.1f%%)", g_buildTimes.buildRegionsExp/1000.0f, g_buildTimes.buildRegionsExp*pc); - rcGetLog()->log(RC_LOG_PROGRESS, " - find catchment basins: %.1fms (%.1f%%)", g_buildTimes.buildRegionsFlood/1000.0f, g_buildTimes.buildRegionsFlood*pc); - rcGetLog()->log(RC_LOG_PROGRESS, " - filter: %.1fms (%.1f%%)", g_buildTimes.buildRegionsFilter/1000.0f, g_buildTimes.buildRegionsFilter*pc); - - rcGetLog()->log(RC_LOG_PROGRESS, "Build Contours: %.1fms (%.1f%%)", g_buildTimes.buildContours/1000.0f, g_buildTimes.buildContours*pc); - rcGetLog()->log(RC_LOG_PROGRESS, " - trace: %.1fms (%.1f%%)", g_buildTimes.buildContoursTrace/1000.0f, g_buildTimes.buildContoursTrace*pc); - rcGetLog()->log(RC_LOG_PROGRESS, " - simplify: %.1fms (%.1f%%)", g_buildTimes.buildContoursSimplify/1000.0f, g_buildTimes.buildContoursSimplify*pc); - - rcGetLog()->log(RC_LOG_PROGRESS, "Fixup contours: %.1fms (%.1f%%)", g_buildTimes.fixupContours/1000.0f, g_buildTimes.fixupContours*pc); - - rcGetLog()->log(RC_LOG_PROGRESS, "Build Polymesh: %.1fms (%.1f%%)", g_buildTimes.buildPolymesh/1000.0f, g_buildTimes.buildPolymesh*pc); - - if (polyMesh) - rcGetLog()->log(RC_LOG_PROGRESS, "Polymesh: Verts:%d Polys:%d", polyMesh->nverts, polyMesh->npolys); - - rcGetLog()->log(RC_LOG_PROGRESS, "TOTAL: %.1fms", rcGetDeltaTimeUsec(totStartTime, totEndTime)/1000.0f); - } - - return true; -} - - -bool buildNavigation(const rcConfig& cfg, - const rcMeshLoaderObj* mesh, - const rcChunkyTriMesh* chunkyMesh, - TileSet* tileSet, - rcPolyMesh* polyMesh, - dtStatNavMesh* navMesh, - bool keepInterResults) -{ - if (!mesh) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Input mesh is not valid."); - return false; - } - if (!chunkyMesh) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Input chunky mesh is not valid."); - return false; - } - - if (!tileSet) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Output tile set is not valid."); - return false; - } - if (!polyMesh) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Output polymesh is not valid."); - return false; - } - if (!navMesh) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Output navmesh is not valid."); - return false; - } - - memset(&g_buildTimes, 0, sizeof(g_buildTimes)); - rcSetBuildTimes(&g_buildTimes); - - rcTimeVal totStartTime = rcGetPerformanceTimer(); - - // Create one tile so that we can use the same debug output as with the tiled generation. - vcopy(tileSet->bmin, cfg.bmin); - vcopy(tileSet->bmax, cfg.bmax); - tileSet->cs = cfg.cs; - tileSet->ch = cfg.ch; - tileSet->width = 1; - tileSet->height = 1; - tileSet->tiles = new Tile[1]; - if (!tileSet->tiles) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Out of memory 'tileSet->tiles'."); - return false; - } - - if (rcGetLog()) - { - rcGetLog()->log(RC_LOG_PROGRESS, "Building navigation:"); - rcGetLog()->log(RC_LOG_PROGRESS, " - %d x %d cells", cfg.width, cfg.height); - rcGetLog()->log(RC_LOG_PROGRESS, " - %d verts, %d tris", mesh->getVertCount(), mesh->getTriCount()); - } - - // Initialize per tile config. - - // Allocate array that can hold triangle flags for all geom chunks. - unsigned char* triangleFlags = new unsigned char[mesh->getTriCount()]; - if (!triangleFlags) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Out of memory 'triangleFlags' (%d).", mesh->getTriCount()); - return false; - } - - rcHeightfield* solid = 0; - rcCompactHeightfield* chf = 0; - rcContourSet* cset = 0; - - solid = new rcHeightfield; - if (!solid) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Out of memory 'solid'."); - return false; - } - if (!rcCreateHeightfield(*solid, cfg.width, cfg.height, cfg.bmin, cfg.bmax, cfg.cs, cfg.ch)) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not create solid heightfield."); - return false; - } - - rcTimeVal startTime = rcGetPerformanceTimer(); - - memset(triangleFlags, 0, mesh->getTriCount()*sizeof(unsigned char)); - rcMarkWalkableTriangles(cfg.walkableSlopeAngle, - mesh->getVerts(), mesh->getVertCount(), mesh->getTris(), mesh->getTriCount(), triangleFlags); - - rcRasterizeTriangles(mesh->getVerts(), mesh->getVertCount(), mesh->getTris(), triangleFlags, mesh->getTriCount(), *solid); - - rcFilterLedgeSpans(cfg.walkableHeight, cfg.walkableClimb, *solid); - - rcFilterWalkableLowHeightSpans(cfg.walkableHeight, *solid); - - chf = new rcCompactHeightfield; - if (!chf) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Out of memory 'chf'."); - return false; - } - if (!rcBuildCompactHeightfield(cfg.walkableHeight, cfg.walkableClimb, - RC_WALKABLE/*|RC_REACHABLE*/, *solid, *chf)) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not build compact data."); - return false; - } - - if (!rcBuildDistanceField(*chf)) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not build distance fields."); - return false; - } - - if (!rcBuildRegions(*chf, cfg.walkableRadius, cfg.borderSize, cfg.minRegionSize, cfg.mergeRegionSize)) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not build regions."); - return false; - } - - cset = new rcContourSet; - if (!cset) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Out of memory 'cset'."); - return false; - } - if (!rcBuildContours(*chf, cfg.maxSimplificationError, cfg.maxEdgeLen, *cset)) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not create contours."); - return false; - } - - if (keepInterResults) - { - tileSet->tiles[0].solid = solid; - solid = 0; - tileSet->tiles[0].chf = chf; - chf = 0; - } - - tileSet->tiles[0].cset = cset; - - rcTimeVal endTime = rcGetPerformanceTimer(); - tileSet->tiles[0].buildTime += rcGetDeltaTimeUsec(startTime, endTime); - - delete [] triangleFlags; - delete solid; - delete chf; - - if (!rcBuildPolyMesh(*tileSet->tiles[0].cset, cfg.bmin, cfg.bmax, cfg.cs, cfg.ch, - cfg.maxVertsPerPoly, *polyMesh)) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not triangulate contours."); - return false; - } - - if (cfg.maxVertsPerPoly == DT_VERTS_PER_POLYGON) - { - unsigned char* navData = 0; - int navDataSize = 0; - if (!dtCreateNavMeshData(polyMesh->verts, polyMesh->nverts, - polyMesh->polys, polyMesh->npolys, polyMesh->nvp, - cfg.bmin, cfg.bmax, cfg.cs, cfg.ch, &navData, &navDataSize)) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "Could not build Detour navmesh."); - return false; - } - - if (!navMesh->init(navData, navDataSize, true)) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "Could not init Detour navmesh"); - return false; - } - } - - rcTimeVal totEndTime = rcGetPerformanceTimer(); - - if (rcGetLog()) - { - const float pc = 100.0f / rcGetDeltaTimeUsec(totStartTime, totEndTime); - - rcGetLog()->log(RC_LOG_PROGRESS, "Rasterize: %.1fms (%.1f%%)", g_buildTimes.rasterizeTriangles/1000.0f, g_buildTimes.rasterizeTriangles*pc); - - rcGetLog()->log(RC_LOG_PROGRESS, "Build Compact: %.1fms (%.1f%%)", g_buildTimes.buildCompact/1000.0f, g_buildTimes.buildCompact*pc); - - rcGetLog()->log(RC_LOG_PROGRESS, "Filter Border: %.1fms (%.1f%%)", g_buildTimes.filterBorder/1000.0f, g_buildTimes.filterBorder*pc); - rcGetLog()->log(RC_LOG_PROGRESS, "Filter Walkable: %.1fms (%.1f%%)", g_buildTimes.filterWalkable/1000.0f, g_buildTimes.filterWalkable*pc); - rcGetLog()->log(RC_LOG_PROGRESS, "Filter Reachable: %.1fms (%.1f%%)", g_buildTimes.filterMarkReachable/1000.0f, g_buildTimes.filterMarkReachable*pc); - - rcGetLog()->log(RC_LOG_PROGRESS, "Build Distancefield: %.1fms (%.1f%%)", g_buildTimes.buildDistanceField/1000.0f, g_buildTimes.buildDistanceField*pc); - rcGetLog()->log(RC_LOG_PROGRESS, " - distance: %.1fms (%.1f%%)", g_buildTimes.buildDistanceFieldDist/1000.0f, g_buildTimes.buildDistanceFieldDist*pc); - rcGetLog()->log(RC_LOG_PROGRESS, " - blur: %.1fms (%.1f%%)", g_buildTimes.buildDistanceFieldBlur/1000.0f, g_buildTimes.buildDistanceFieldBlur*pc); - - rcGetLog()->log(RC_LOG_PROGRESS, "Build Regions: %.1fms (%.1f%%)", g_buildTimes.buildRegions/1000.0f, g_buildTimes.buildRegions*pc); - rcGetLog()->log(RC_LOG_PROGRESS, " - watershed: %.1fms (%.1f%%)", g_buildTimes.buildRegionsReg/1000.0f, g_buildTimes.buildRegionsReg*pc); - rcGetLog()->log(RC_LOG_PROGRESS, " - expand: %.1fms (%.1f%%)", g_buildTimes.buildRegionsExp/1000.0f, g_buildTimes.buildRegionsExp*pc); - rcGetLog()->log(RC_LOG_PROGRESS, " - find catchment basins: %.1fms (%.1f%%)", g_buildTimes.buildRegionsFlood/1000.0f, g_buildTimes.buildRegionsFlood*pc); - rcGetLog()->log(RC_LOG_PROGRESS, " - filter: %.1fms (%.1f%%)", g_buildTimes.buildRegionsFilter/1000.0f, g_buildTimes.buildRegionsFilter*pc); - - rcGetLog()->log(RC_LOG_PROGRESS, "Build Contours: %.1fms (%.1f%%)", g_buildTimes.buildContours/1000.0f, g_buildTimes.buildContours*pc); - rcGetLog()->log(RC_LOG_PROGRESS, " - trace: %.1fms (%.1f%%)", g_buildTimes.buildContoursTrace/1000.0f, g_buildTimes.buildContoursTrace*pc); - rcGetLog()->log(RC_LOG_PROGRESS, " - simplify: %.1fms (%.1f%%)", g_buildTimes.buildContoursSimplify/1000.0f, g_buildTimes.buildContoursSimplify*pc); - - rcGetLog()->log(RC_LOG_PROGRESS, "Fixup contours: %.1fms (%.1f%%)", g_buildTimes.fixupContours/1000.0f, g_buildTimes.fixupContours*pc); - - rcGetLog()->log(RC_LOG_PROGRESS, "Build Polymesh: %.1fms (%.1f%%)", g_buildTimes.buildPolymesh/1000.0f, g_buildTimes.buildPolymesh*pc); - - if (polyMesh) - rcGetLog()->log(RC_LOG_PROGRESS, "Polymesh: Verts:%d Polys:%d", polyMesh->nverts, polyMesh->npolys); - - rcGetLog()->log(RC_LOG_PROGRESS, "TOTAL: %.1fms", rcGetDeltaTimeUsec(totStartTime, totEndTime)/1000.0f); - } - - return true; -} - - -int main(int argc, char *argv[]) -{ - // Init SDL - if (SDL_Init(SDL_INIT_EVERYTHING) != 0) - { - printf("Could not initialise SDL\n"); - return -1; - } - - // Init OpenGL - SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 32); - SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); - - int menuOffset = 0; - - int width = 1200; - int height = 700; - SDL_Surface* screen = SDL_SetVideoMode(width, height, 0, SDL_OPENGL); - if (!screen) - { - printf("Could not initialise SDL opengl\n"); - return -1; - } - - SDL_WM_SetCaption("Recast Demo", 0); - - if(!g_font.create("font.cfnt")) - { - printf("Could not load font.\n"); - SDL_Quit(); - return -1; - } - - float cellSize = 0.3f; - float cellHeight = 0.2f; - float agentHeight = 2.0f; - float agentRadius = 0.6f; - float agentMaxClimb = 0.9f; - float agentMaxSlope = 45.0f; - float regionMinSize = 50; - float regionMergeSize = 20; - float edgeMaxLen = 12.0f; - float edgeMaxError = 1.3f; - float vertsPerPoly = 6.0f; - float tileSize = 0.0f; - int drawMode = DRAWMODE_NAVMESH; - int toolMode = TOOLMODE_PATHFIND; - bool showMenu = true; - bool showLevels = false; - bool showLog = false; - bool showTools = true; - char curLevel[256] = "Choose Level..."; - bool mouseOverMenu = false; - bool keepInterResults = false; - FileList fileList; - - dtPolyRef startRef = 0, endRef = 0; - - const float polyPickExt[3] = {2,4,2}; - - static const int MAX_POLYS = 256; - dtPolyRef polys[MAX_POLYS]; - int npolys = 0; - float straightPath[MAX_POLYS*3]; - int nstraightPath = 0; - - float t = 0.0f; - Uint32 lastTime = SDL_GetTicks(); - int mx = 0, my = 0; - float rx = 45; - float ry = -45; - float moveW = 0, moveS = 0, moveA = 0, moveD = 0; - float camx = 0, camy = 0, camz = 0, camr=10; - float origrx, origry; - int origx, origy; - bool rotate = false; - float rays[3], raye[3]; - float spos[3] = {0,0,0}; - float epos[3] = {0,0,0}; - float hitPos[3] = {0,0,0}; - float hitNormal[3] = {0,0,0}; - float distanceToWall = 0; - bool sposSet = false, eposSet = false; - static const float startCol[4] = { 0.5f, 0.1f, 0.0f, 0.75f }; - static const float endCol[4] = { 0.2f, 0.4f, 0.0f, 0.75f }; - bool recalcTool = false; - - glEnable(GL_CULL_FACE); - -// float fogCol[4] = { 0.1f,0.12f,0.14f,1 }; - float fogCol[4] = { 0.32f,0.25f,0.25f,1 }; - glEnable(GL_FOG); - glFogi(GL_FOG_MODE, GL_LINEAR); - glFogf(GL_FOG_START, 0); - glFogf(GL_FOG_END, 10); - glFogfv(GL_FOG_COLOR, fogCol); - - glEnable(GL_POINT_SMOOTH); - glEnable(GL_LINE_SMOOTH); - - bool done = false; - while(!done) - { - // Handle input events. - SDL_Event event; - while(SDL_PollEvent(&event)) - { - switch(event.type) - { - case SDL_KEYDOWN: - // Handle any key presses here. - if (event.key.keysym.sym == SDLK_ESCAPE) - { - done = true; - } - break; - - case SDL_MOUSEBUTTONDOWN: - // Handle mouse clicks here. - if (!mouseOverMenu) - { - if (event.button.button == SDL_BUTTON_RIGHT) - { - // Rotate view - rotate = true; - origx = mx; - origy = my; - origrx = rx; - origry = ry; - } - else if (event.button.button == SDL_BUTTON_LEFT) - { - // Hit test mesh. - if (g_mesh) - { - float t; - if (raycast(*g_mesh, rays, raye, t)) - { - if (SDL_GetModState() & KMOD_SHIFT) - { - sposSet = true; - spos[0] = rays[0] + (raye[0] - rays[0])*t; - spos[1] = rays[1] + (raye[1] - rays[1])*t; - spos[2] = rays[2] + (raye[2] - rays[2])*t; - if (g_navMesh) - startRef = g_navMesh->findNearestPoly(spos, polyPickExt); - recalcTool = true; - } - else - { - eposSet = true; - epos[0] = rays[0] + (raye[0] - rays[0])*t; - epos[1] = rays[1] + (raye[1] - rays[1])*t; - epos[2] = rays[2] + (raye[2] - rays[2])*t; - if (g_navMesh) - endRef = g_navMesh->findNearestPoly(epos, polyPickExt); - recalcTool = true; - } - } - } - } - } - break; - - case SDL_MOUSEBUTTONUP: - // Handle mouse clicks here. - if(event.button.button == SDL_BUTTON_RIGHT) - { - rotate = false; - } - break; - - case SDL_MOUSEMOTION: - mx = event.motion.x; - my = height - 1 - event.motion.y; - if (rotate) - { - int dx = mx - origx; - int dy = my - origy; - rx = origrx - dy*0.25f; - ry = origry + dx*0.25f; - } - break; - - case SDL_QUIT: - done = true; - break; - - default: - break; - } - } - - Uint32 time = SDL_GetTicks(); - float dt = (time - lastTime) / 1000.0f; - lastTime = time; - - t += dt; - - // Update and render - glViewport(0, 0, width, height); - glClearColor(0.3f, 0.3f, 0.32f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glDisable(GL_TEXTURE_2D); - - // Render 3d - glEnable(GL_DEPTH_TEST); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - gluPerspective(50.0f, (float)width/(float)height, 1.0f, camr); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glRotatef(rx,1,0,0); - glRotatef(ry,0,1,0); - glTranslatef(-camx, -camy, -camz); - - // Get hit ray position and direction. - GLdouble proj[16]; - GLdouble model[16]; - GLint view[4]; - glGetDoublev(GL_PROJECTION_MATRIX, proj); - glGetDoublev(GL_MODELVIEW_MATRIX, model); - glGetIntegerv(GL_VIEWPORT, view); - GLdouble x, y, z; - gluUnProject(mx, my, 0.0f, model, proj, view, &x, &y, &z); - rays[0] = (float)x; rays[1] = (float)y; rays[2] = (float)z; - gluUnProject(mx, my, 1.0f, model, proj, view, &x, &y, &z); - raye[0] = (float)x; raye[1] = (float)y; raye[2] = (float)z; - - // Handle keyboard movement. - Uint8* keystate = SDL_GetKeyState(NULL); - moveW = rcClamp(moveW + dt * 4 * (keystate[SDLK_w] ? 1 : -1), 0.0f, 1.0f); - moveS = rcClamp(moveS + dt * 4 * (keystate[SDLK_s] ? 1 : -1), 0.0f, 1.0f); - moveA = rcClamp(moveA + dt * 4 * (keystate[SDLK_a] ? 1 : -1), 0.0f, 1.0f); - moveD = rcClamp(moveD + dt * 4 * (keystate[SDLK_d] ? 1 : -1), 0.0f, 1.0f); - - float keybSpeed = 22.0f; - if (SDL_GetModState() & KMOD_SHIFT) - keybSpeed *= 4.0f; - - float movex = (moveD - moveA) * keybSpeed * dt; - float movey = (moveS - moveW) * keybSpeed * dt; - - camx += movex * (float)model[0]; - camy += movex * (float)model[4]; - camz += movex * (float)model[8]; - - camx += movey * (float)model[2]; - camy += movey * (float)model[6]; - camz += movey * (float)model[10]; - - glEnable(GL_FOG); - - if (drawMode == DRAWMODE_MESH) - { - if (g_mesh) - rcDebugDrawMeshSlope(*g_mesh, agentMaxSlope); - } - else if (drawMode != DRAWMODE_NAVMESH_TRANS) - { - if (g_mesh) - rcDebugDrawMesh(*g_mesh, 0); - } - - glDisable(GL_FOG); - - glDepthMask(GL_FALSE); - - if (drawMode == DRAWMODE_NAVMESH || - drawMode == DRAWMODE_NAVMESH_TRANS || - drawMode == DRAWMODE_NAVMESH_BVTREE || - drawMode == DRAWMODE_NAVMESH_INVIS) - { - if (g_navMesh) - { - if (drawMode != DRAWMODE_NAVMESH_INVIS) - dtDebugDrawStatNavMesh(g_navMesh); - - if (toolMode == TOOLMODE_PATHFIND) - { - dtDebugDrawStatNavMeshPoly(g_navMesh, startRef, startCol); - dtDebugDrawStatNavMeshPoly(g_navMesh, endRef, endCol); - - if (npolys) - { - const float pathCol[4] = {0,0,0,0.25f}; //{1,0.75f,0,0.25f}; - for (int i = 1; i < npolys-1; ++i) - dtDebugDrawStatNavMeshPoly(g_navMesh, polys[i], pathCol); - } - if (nstraightPath) - { - glColor4ub(128,16,0,220); - glLineWidth(3.0f); - glBegin(GL_LINE_STRIP); - for (int i = 0; i < nstraightPath; ++i) - glVertex3f(straightPath[i*3], straightPath[i*3+1]+0.4f, straightPath[i*3+2]); - glEnd(); - glLineWidth(1.0f); - glPointSize(4.0f); - glBegin(GL_POINTS); - for (int i = 0; i < nstraightPath; ++i) - glVertex3f(straightPath[i*3], straightPath[i*3+1]+0.4f, straightPath[i*3+2]); - glEnd(); - glPointSize(1.0f); - } - } - else if (toolMode == TOOLMODE_RAYCAST) - { - dtDebugDrawStatNavMeshPoly(g_navMesh, startRef, startCol); - - if (nstraightPath) - { - const float pathCol[4] = {1,0.75f,0,0.25f}; - dtDebugDrawStatNavMeshPoly(g_navMesh, polys[0], pathCol); - - glColor4ub(128,16,0,220); - glLineWidth(3.0f); - glBegin(GL_LINE_STRIP); - for (int i = 0; i < nstraightPath; ++i) - glVertex3f(straightPath[i*3], straightPath[i*3+1]+0.4f, straightPath[i*3+2]); - glEnd(); - glLineWidth(1.0f); - glPointSize(4.0f); - glBegin(GL_POINTS); - for (int i = 0; i < nstraightPath; ++i) - glVertex3f(straightPath[i*3], straightPath[i*3+1]+0.4f, straightPath[i*3+2]); - glEnd(); - glPointSize(1.0f); - } - } - else if (toolMode == TOOLMODE_DISTANCE_TO_WALL) - { - dtDebugDrawStatNavMeshPoly(g_navMesh, startRef, startCol); - const float col[4] = {1,1,1,0.5f}; - rcDebugDrawCylinderWire(spos[0]-distanceToWall, spos[1]+0.02f, spos[2]-distanceToWall, - spos[0]+distanceToWall, spos[1]+agentHeight, spos[2]+distanceToWall, col); - glLineWidth(3.0f); - glColor4fv(col); - glBegin(GL_LINES); - glVertex3f(hitPos[0], hitPos[1] + 0.02f, hitPos[2]); - glVertex3f(hitPos[0], hitPos[1] + agentHeight, hitPos[2]); - glEnd(); - glLineWidth(1.0f); - } - else if (toolMode == TOOLMODE_FIND_POLYS_AROUND) - { - const float pathCol[4] = {0,0,0,0.25f}; //{1,0.75f,0,0.25f}; - for (int i = 0; i < npolys; ++i) - dtDebugDrawStatNavMeshPoly(g_navMesh, polys[i], pathCol); - - const float dx = epos[0] - spos[0]; - const float dz = epos[2] - spos[2]; - float dist = sqrtf(dx*dx + dz*dz); - const float col[4] = {1,1,1,0.5f}; - rcDebugDrawCylinderWire(spos[0]-dist, spos[1]+0.02f, spos[2]-dist, - spos[0]+dist, spos[1]+agentHeight, spos[2]+dist, col); - } - } - } - if (drawMode == DRAWMODE_NAVMESH_BVTREE) - { - if (g_navMesh) - dtDebugDrawStatNavMeshBVTree(g_navMesh); - } - - glDepthMask(GL_TRUE); - - if (drawMode == DRAWMODE_COMPACT) - { - if (g_tileSet) - { - for (int i = 0; i < g_tileSet->width*g_tileSet->height; ++i) - { - if (g_tileSet->tiles[i].chf) - rcDebugDrawCompactHeightfieldSolid(*(g_tileSet->tiles[i].chf)); - } - } - } - if (drawMode == DRAWMODE_COMPACT_DISTANCE) - { - if (g_tileSet) - { - for (int i = 0; i < g_tileSet->width*g_tileSet->height; ++i) - { - if (g_tileSet->tiles[i].chf) - rcDebugDrawCompactHeightfieldDistance(*(g_tileSet->tiles[i].chf)); - } - } - } - if (drawMode == DRAWMODE_COMPACT_REGIONS) - { - if (g_tileSet) - { - for (int i = 0; i < g_tileSet->width*g_tileSet->height; ++i) - { - if (g_tileSet->tiles[i].chf) - rcDebugDrawCompactHeightfieldRegions(*(g_tileSet->tiles[i].chf)); - } - } - } - if (drawMode == DRAWMODE_VOXELS) - { - glEnable(GL_FOG); - if (g_tileSet) - { - for (int i = 0; i < g_tileSet->width*g_tileSet->height; ++i) - { - if (g_tileSet->tiles[i].solid) - rcDebugDrawHeightfieldSolid(*g_tileSet->tiles[i].solid); - } - } - glDisable(GL_FOG); - } - if (drawMode == DRAWMODE_VOXELS_WALKABLE) - { - glEnable(GL_FOG); - if (g_tileSet) - { - for (int i = 0; i < g_tileSet->width*g_tileSet->height; ++i) - { - if (g_tileSet->tiles[i].solid) - rcDebugDrawHeightfieldWalkable(*g_tileSet->tiles[i].solid); - } - } - glDisable(GL_FOG); - } - if (drawMode == DRAWMODE_RAW_CONTOURS) - { - glDepthMask(GL_FALSE); - if (g_tileSet) - { - for (int i = 0; i < g_tileSet->width*g_tileSet->height; ++i) - { - if (g_tileSet->tiles[i].cset) - rcDebugDrawRawContours(*(g_tileSet->tiles[i].cset), g_tileSet->bmin, g_tileSet->cs, g_tileSet->ch); - } - } - glDepthMask(GL_TRUE); - } - if (drawMode == DRAWMODE_BOTH_CONTOURS) - { - glDepthMask(GL_FALSE); - if (g_tileSet) - { - for (int i = 0; i < g_tileSet->width*g_tileSet->height; ++i) - { - if (g_tileSet->tiles[i].cset) - { - rcDebugDrawRawContours(*(g_tileSet->tiles[i].cset), g_tileSet->bmin, g_tileSet->cs, g_tileSet->ch, 0.5f); - rcDebugDrawContours(*(g_tileSet->tiles[i].cset), g_tileSet->bmin, g_tileSet->cs, g_tileSet->ch); - } - } - } - glDepthMask(GL_TRUE); - } - if (drawMode == DRAWMODE_CONTOURS) - { - glDepthMask(GL_FALSE); - if (g_tileSet) - { - for (int i = 0; i < g_tileSet->width*g_tileSet->height; ++i) - { - if (g_tileSet->tiles[i].cset) - rcDebugDrawContours(*(g_tileSet->tiles[i].cset), g_tileSet->bmin, g_tileSet->cs, g_tileSet->ch); - } - } - glDepthMask(GL_TRUE); - } - if (drawMode == DRAWMODE_REGION_CONNECTIONS) - { - if (g_tileSet) - { - for (int i = 0; i < g_tileSet->width*g_tileSet->height; ++i) - { - if (g_tileSet->tiles[i].chf) - rcDebugDrawCompactHeightfieldRegions(*(g_tileSet->tiles[i].chf)); - } - glDepthMask(GL_TRUE); - - glDepthMask(GL_FALSE); - for (int i = 0; i < g_tileSet->width*g_tileSet->height; ++i) - { - if (g_tileSet->tiles[i].cset) - { - // rcDebugDrawRawContours(*(g_tileSet->tiles[i].cset), g_tileSet->bmin, g_tileSet->cs, g_tileSet->ch); - rcDebugDrawRegionConnections(*(g_tileSet->tiles[i].cset), g_tileSet->bmin, g_tileSet->cs, g_tileSet->ch); - } - } - glDepthMask(GL_TRUE); - } - } - if (drawMode == DRAWMODE_POLYMESH) - { - glDepthMask(GL_FALSE); - if (g_polyMesh) - rcDebugDrawPolyMesh(*g_polyMesh); - glDepthMask(GL_TRUE); - } - - if (g_mesh) - { - glDepthMask(GL_FALSE); - - // Agent dimensions. - const float r = agentRadius; - const float h = agentHeight; - - float col[4]; - - for (int i = 0; i < 2; ++i) - { - const float* pos = 0; - const float* c = 0; - if (i == 0 && sposSet) - { - pos = spos; - c = startCol; - } - else if (i == 1 && eposSet) - { - pos = epos; - c = endCol; - } - if (!pos) - continue; - glLineWidth(2.0f); - rcDebugDrawCylinderWire(pos[0]-r, pos[1]+0.02f, pos[2]-r, pos[0]+r, pos[1]+h, pos[2]+r, c); - glLineWidth(1.0f); - - glColor4ub(0,0,0,196); - glBegin(GL_LINES); - glVertex3f(pos[0], pos[1]-agentMaxClimb, pos[2]); - glVertex3f(pos[0], pos[1]+agentMaxClimb, pos[2]); - glVertex3f(pos[0]-r/2, pos[1]+0.02f, pos[2]); - glVertex3f(pos[0]+r/2, pos[1]+0.02f, pos[2]); - glVertex3f(pos[0], pos[1]+0.02f, pos[2]-r/2); - glVertex3f(pos[0], pos[1]+0.02f, pos[2]+r/2); - glEnd(); - } - - // Tile bboxes - if ((int)tileSize > 0) - { - const int ts = (int)tileSize; - col[0] = 0.5f; col[1] = 0.1f; col[2] = 0.1f; col[3] = 0.15f; - int gw = 0, gh = 0; - rcCalcGridSize(g_meshBMin, g_meshBMax, cellSize, &gw, &gh); - int tx = (gw + ts-1) / ts; - int ty = (gh + ts-1) / ts; - - const float s = ts*cellSize; - - glBegin(GL_LINES); - glColor4ub(0,0,0,64); - for (int y = 0; y < ty; ++y) - { - for (int x = 0; x < tx; ++x) - { - float fx, fy, fz; - fx = g_meshBMin[0] + x*s; - fy = g_meshBMin[1]; - fz = g_meshBMin[2] + y*s; - - glVertex3f(fx,fy,fz); - glVertex3f(fx+s,fy,fz); - glVertex3f(fx,fy,fz); - glVertex3f(fx,fy,fz+s); - - if (x+1 >= tx) - { - glVertex3f(fx+s,fy,fz); - glVertex3f(fx+s,fy,fz+s); - } - if (y+1 >= ty) - { - glVertex3f(fx,fy,fz+s); - glVertex3f(fx+s,fy,fz+s); - } - } - } - glEnd(); - } - - // Mesh bbox. - col[0] = 1.0f; col[1] = 1.0f; col[2] = 1.0f; col[3] = 0.25f; - rcDebugDrawBoxWire(g_meshBMin[0], g_meshBMin[1], g_meshBMin[2], - g_meshBMax[0], g_meshBMax[1], g_meshBMax[2], col); - - - glDepthMask(GL_TRUE); - } - - - // Render GUI - glDisable(GL_DEPTH_TEST); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - gluOrtho2D(0, width, 0, height); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - - imguiBeginFrame(); - - mouseOverMenu = false; - - if (showMenu) - { - - static int propScroll = 0; - if (imguiBeginScrollArea(GENID, "Properties", width - (250+menuOffset) - 10, 10, 250, height-20, &propScroll)) - mouseOverMenu = true; - - if (imguiButton(GENID, curLevel)) - { - if (showLevels) - { - showLevels = false; - } - else - { - showLevels = true; - scanDirectory("meshes", ".obj", fileList); - } - } - - - imguiSeparator(); - - if (g_mesh) - { - if (imguiButton(GENID, "Build")) - { - npolys = 0; - nstraightPath = 0; - sposSet = false; - eposSet = false; - startRef = 0; - endRef = 0; - distanceToWall = 0; - - rcConfig cfg; - memset(&cfg, 0, sizeof(cfg)); - cfg.cs = cellSize; - cfg.ch = cellHeight; - cfg.walkableSlopeAngle = agentMaxSlope; - cfg.walkableHeight = (int)ceilf(agentHeight / cfg.ch); - cfg.walkableClimb = (int)ceilf(agentMaxClimb / cfg.ch); - cfg.walkableRadius = (int)ceilf(agentRadius / cfg.cs); - cfg.maxEdgeLen = (int)(edgeMaxLen / cellSize); - cfg.maxSimplificationError = edgeMaxError; - cfg.minRegionSize = (int)rcSqr(regionMinSize); - cfg.mergeRegionSize = (int)rcSqr(regionMergeSize); - cfg.maxVertsPerPoly = /*DT_VERTS_PER_POLYGON; // TODO: Handle better.*/ (int)vertsPerPoly; - rcCalcBounds(g_mesh->getVerts(), g_mesh->getVertCount(), cfg.bmin, cfg.bmax); - rcCalcGridSize(cfg.bmin, cfg.bmax, cfg.cs, &cfg.width, &cfg.height); - - g_log.clear(); - rcSetLog(&g_log); - - if ((int)tileSize > 0) - { - cfg.borderSize = cfg.walkableRadius*2 + 2; - cfg.tileSize = (int)tileSize; - - delete g_tileSet; - g_tileSet = new TileSet; - delete g_polyMesh; - g_polyMesh = new rcPolyMesh; - delete g_navMesh; - g_navMesh = new dtStatNavMesh; - - buildTiledNavigation(cfg, g_mesh, g_chunkyMesh, g_tileSet, g_polyMesh, g_navMesh, keepInterResults); - } - else - { - cfg.borderSize = 0; - cfg.tileSize = 0; - - delete g_tileSet; - g_tileSet = new TileSet; - delete g_polyMesh; - g_polyMesh = new rcPolyMesh; - delete g_navMesh; - g_navMesh = new dtStatNavMesh; - - buildNavigation(cfg, g_mesh, g_chunkyMesh, g_tileSet, g_polyMesh, g_navMesh, keepInterResults); - } - - } - } - - imguiSeparator(); - - if (imguiCheck(GENID, "Show Log", showLog)) - showLog = !showLog; - - if (imguiCheck(GENID, "Show Tools", showTools)) - showTools = !showTools; - - if (imguiCheck(GENID, "Keep Itermediate Results", keepInterResults)) - keepInterResults = !keepInterResults; - - imguiSeparator(); - imguiLabel(GENID, "Rasterization"); - imguiSlider(GENID, "Cell Size", &cellSize, 0.1f, 1.0f, 0.01f); - imguiSlider(GENID, "Cell Height", &cellHeight, 0.1f, 1.0f, 0.01f); - imguiSlider(GENID, "TileSize", &tileSize, 0.0f, 1024.0f, 16.0f); - - if (g_mesh) - { - int gw = 0, gh = 0; - rcCalcGridSize(g_meshBMin, g_meshBMax, cellSize, &gw, &gh); - char text[64]; - snprintf(text, 64, "Verts: %.1fk Tris: %.1fk", g_mesh->getVertCount()/1000.0f, g_mesh->getTriCount()/1000.0f); - imguiValue(GENID, text); - snprintf(text, 64, "Grid %d x %d", gw, gh); - imguiValue(GENID, text); - } - - imguiSeparator(); - imguiLabel(GENID, "Agent"); - imguiSlider(GENID, "Height", &agentHeight, 0.1f, 5.0f, 0.1f); - imguiSlider(GENID, "Radius", &agentRadius, 0.0f, 5.0f, 0.1f); - imguiSlider(GENID, "Max Climb", &agentMaxClimb, 0.1f, 5.0f, 0.1f); - imguiSlider(GENID, "Max Slope", &agentMaxSlope, 0.0f, 90.0f, 1.0f); - - imguiSeparator(); - imguiLabel(GENID, "Region"); - imguiSlider(GENID, "Min Region Size", ®ionMinSize, 0.0f, 150.0f, 1.0f); - imguiSlider(GENID, "Merged Region Size", ®ionMergeSize, 0.0f, 150.0f, 1.0f); - - imguiSeparator(); - imguiLabel(GENID, "Polygonization"); - imguiSlider(GENID, "Max Edge Length", &edgeMaxLen, 0.0f, 50.0f, 1.0f); - imguiSlider(GENID, "Max Edge Error", &edgeMaxError, 0.1f, 3.0f, 0.1f); - imguiSlider(GENID, "Verts Per Poly", &vertsPerPoly, 3.0f, 12.0f, 1.0f); - - imguiSeparator(); - imguiLabel(GENID, "Draw"); - if (imguiCheck(GENID, "Input Mesh", drawMode == DRAWMODE_MESH)) - drawMode = DRAWMODE_MESH; - if (imguiCheck(GENID, "Navmesh", drawMode == DRAWMODE_NAVMESH)) - drawMode = DRAWMODE_NAVMESH; - if (imguiCheck(GENID, "Navmesh Invis", drawMode == DRAWMODE_NAVMESH_INVIS)) - drawMode = DRAWMODE_NAVMESH_INVIS; - if (imguiCheck(GENID, "Navmesh Trans", drawMode == DRAWMODE_NAVMESH_TRANS)) - drawMode = DRAWMODE_NAVMESH_TRANS; - if (imguiCheck(GENID, "Navmesh BVTree", drawMode == DRAWMODE_NAVMESH_BVTREE)) - drawMode = DRAWMODE_NAVMESH_BVTREE; - if (imguiCheck(GENID, "Voxels", drawMode == DRAWMODE_VOXELS)) - drawMode = DRAWMODE_VOXELS; - if (imguiCheck(GENID, "Walkable Voxels", drawMode == DRAWMODE_VOXELS_WALKABLE)) - drawMode = DRAWMODE_VOXELS_WALKABLE; - if (imguiCheck(GENID, "Compact", drawMode == DRAWMODE_COMPACT)) - drawMode = DRAWMODE_COMPACT; - if (imguiCheck(GENID, "Compact Distance", drawMode == DRAWMODE_COMPACT_DISTANCE)) - drawMode = DRAWMODE_COMPACT_DISTANCE; - if (imguiCheck(GENID, "Compact Regions", drawMode == DRAWMODE_COMPACT_REGIONS)) - drawMode = DRAWMODE_COMPACT_REGIONS; - if (imguiCheck(GENID, "Region Connections", drawMode == DRAWMODE_REGION_CONNECTIONS)) - drawMode = DRAWMODE_REGION_CONNECTIONS; - if (imguiCheck(GENID, "Raw Contours", drawMode == DRAWMODE_RAW_CONTOURS)) - drawMode = DRAWMODE_RAW_CONTOURS; - if (imguiCheck(GENID, "Both Contours", drawMode == DRAWMODE_BOTH_CONTOURS)) - drawMode = DRAWMODE_BOTH_CONTOURS; - if (imguiCheck(GENID, "Contours", drawMode == DRAWMODE_CONTOURS)) - drawMode = DRAWMODE_CONTOURS; - if (imguiCheck(GENID, "Poly Mesh", drawMode == DRAWMODE_POLYMESH)) - drawMode = DRAWMODE_POLYMESH; - - imguiEndScrollArea(); - - } - - // Tools - if (showTools) - { - static int toolsScroll = 0; - if (imguiBeginScrollArea(GENID, "Tools", 10, height - 10 - 200, 150, 200, &toolsScroll)) - mouseOverMenu = true; - - if (imguiCheck(GENID, "Pathfind", toolMode == TOOLMODE_PATHFIND)) - { - toolMode = TOOLMODE_PATHFIND; - recalcTool = true; - } - if (imguiCheck(GENID, "Distance to Wall", toolMode == TOOLMODE_DISTANCE_TO_WALL)) - { - toolMode = TOOLMODE_DISTANCE_TO_WALL; - recalcTool = true; - } - if (imguiCheck(GENID, "Raycast", toolMode == TOOLMODE_RAYCAST)) - { - toolMode = TOOLMODE_RAYCAST; - recalcTool = true; - } - if (imguiCheck(GENID, "Find Polys Around", toolMode == TOOLMODE_FIND_POLYS_AROUND)) - { - toolMode = TOOLMODE_FIND_POLYS_AROUND; - recalcTool = true; - } - - imguiEndScrollArea(); - } - - if (g_navMesh && recalcTool) - { - recalcTool = false; - if (toolMode == TOOLMODE_PATHFIND) - { - if (!startRef || !endRef) - { - npolys = 0; - nstraightPath = 0; - } - else - { - npolys = g_navMesh->findPath(startRef, endRef, polys, MAX_POLYS); - if (npolys) - nstraightPath = g_navMesh->findStraightPath(spos, epos, polys, npolys, straightPath, MAX_POLYS); - } - } - else if (toolMode == TOOLMODE_RAYCAST) - { - nstraightPath = 0; - if (sposSet && eposSet && startRef) - { - float t = 0; - npolys = 0; - nstraightPath = 2; - straightPath[0] = spos[0]; - straightPath[1] = spos[1]; - straightPath[2] = spos[2]; - if (g_navMesh->raycast(startRef, spos, epos, t, polys[0])) - { - npolys = 1; - straightPath[3] = spos[0] + (epos[0] - spos[0]) * t; - straightPath[4] = spos[1] + (epos[1] - spos[1]) * t; - straightPath[5] = spos[2] + (epos[2] - spos[2]) * t; - } - else - { - straightPath[3] = epos[0]; - straightPath[4] = epos[1]; - straightPath[5] = epos[2]; - } - } - } - else if (toolMode == TOOLMODE_DISTANCE_TO_WALL) - { - distanceToWall = 0; - if (sposSet && startRef) - distanceToWall = g_navMesh->findDistanceToWall(startRef, spos, 100.0f, hitPos, hitNormal); - } - else if (toolMode == TOOLMODE_FIND_POLYS_AROUND) - { - distanceToWall = 0; - if (sposSet && startRef && eposSet) - { - const float dx = epos[0] - spos[0]; - const float dz = epos[2] - spos[2]; - float dist = sqrtf(dx*dx + dz*dz); - npolys = g_navMesh->findPolysAround(startRef, spos, dist, polys, 0, 0, 0, MAX_POLYS); - } - } - } - - - // Log - if (showLog) - { - static int logScroll = 0; - if (imguiBeginScrollArea(GENID, "Log", 10, 10, width - 300, 200, &logScroll)) - mouseOverMenu = true; - for (int i = 0; i < g_log.getMessageCount(); ++i) - imguiLabel(GENID1(i), g_log.getMessageText(i)); - imguiEndScrollArea(); - } - - // Level selection dialog. - if (showLevels) - { - static int scroll = 0; - if (imguiBeginScrollArea(GENID, "Choose Level", width-10-250-10-200, height-10-250, 200, 250, &scroll)) - mouseOverMenu = true; - - int levelToLoad = -1; - for (int i = 0; i < fileList.size; ++i) - { - if (imguiItem(GENID1(i), fileList.files[i])) - levelToLoad = i; - } - - if (levelToLoad != -1) - { - strncpy(curLevel, fileList.files[levelToLoad], sizeof(curLevel)); - curLevel[sizeof(curLevel)-1] = '\0'; - showLevels = false; - - delete g_mesh; - delete g_chunkyMesh; - delete g_navMesh; - delete g_tileSet; - delete g_polyMesh; - g_mesh = 0; - g_chunkyMesh = 0; - g_navMesh = 0; - g_tileSet = 0; - g_polyMesh = 0; - - npolys = 0; - nstraightPath = 0; - sposSet = false; - eposSet = false; - startRef = 0; - endRef = 0; - distanceToWall = 0; - - char path[256]; - strcpy(path, "meshes/"); - strcat(path, curLevel); - - g_mesh = new rcMeshLoaderObj; - - if (!g_mesh || !g_mesh->load(path)) - { - printf("Could not load mesh\n"); - delete g_mesh; - g_mesh = 0; - } - - if (g_mesh) - { - rcCalcBounds(g_mesh->getVerts(), g_mesh->getVertCount(), g_meshBMin, g_meshBMax); - - g_chunkyMesh = new rcChunkyTriMesh; - -// rcTimeVal startTime = rcGetPerformanceTimer(); - rcCreateChunkyTriMesh(g_mesh->getVerts(), g_mesh->getTris(), g_mesh->getTriCount(), 256, g_chunkyMesh); -// rcTimeVal endTime = rcGetPerformanceTimer(); -// printf("%.3fms\n", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); - - // Reset camera. - camr = sqrtf(rcSqr(g_meshBMax[0]-g_meshBMin[0]) + - rcSqr(g_meshBMax[1]-g_meshBMin[1]) + - rcSqr(g_meshBMax[2]-g_meshBMin[2])) / 2; - camx = (g_meshBMax[0] + g_meshBMin[0]) / 2 + camr; - camy = (g_meshBMax[1] + g_meshBMin[1]) / 2 + camr; - camz = (g_meshBMax[2] + g_meshBMin[2]) / 2 + camr; - camr *= 3; - rx = 45; - ry = -45; - - glFogf(GL_FOG_START, camr*0.2f); - glFogf(GL_FOG_END, camr*1.25f); - } - - } - - imguiEndScrollArea(); - - } - - - { - const char msg[] = "W/S/A/D: Move RMB: Rotate LMB: Place Start LMB+SHIFT: Place End"; - const float len = g_font.getTextLength(msg); - g_font.drawText(width/2-len/2, (float)height-20.0f, msg, GLFont::RGBA(255,255,255,128)); - } - - // Draw start and end point labels - if (sposSet && gluProject((GLdouble)spos[0], (GLdouble)spos[1], (GLdouble)spos[2], - model, proj, view, &x, &y, &z)) - { - const float len = g_font.getTextLength("Start"); - g_font.drawText((float)x - len/2, (float)y-g_font.getLineHeight(), "Start", GLFont::RGBA(0,0,0,220)); - } - if (eposSet && gluProject((GLdouble)epos[0], (GLdouble)epos[1], (GLdouble)epos[2], - model, proj, view, &x, &y, &z)) - { - const float len = g_font.getTextLength("End"); - g_font.drawText((float)x-len/2, (float)y-g_font.getLineHeight(), "End", GLFont::RGBA(0,0,0,220)); - } - - glDisable(GL_TEXTURE_2D); - - - imguiEndFrame(); - imguiRender(&drawText); - - - glEnable(GL_DEPTH_TEST); - SDL_GL_SwapBuffers(); - } - - SDL_Quit(); - - delete g_mesh; - delete g_chunkyMesh; - delete g_navMesh; - delete g_tileSet; - delete g_polyMesh; - - - return 0; -} diff --git a/RecastDemo/Source/imgui.cpp b/RecastDemo/Source/imgui.cpp index 2869452..b31f251 100644 --- a/RecastDemo/Source/imgui.cpp +++ b/RecastDemo/Source/imgui.cpp @@ -425,7 +425,8 @@ void addGfxCmdText(int x, int y, int dir, const char* text, unsigned int color) struct GuiState { GuiState() : - mbutPressed(false), mbutReleased(false), mbut(false), mx(-1), my(-1), + leftPressed(false), leftReleased(false), left(false), mx(-1), my(-1), + upPressed(false), downPressed(false), up(false), down(false), isHot(false), isActive(false), wentActive(false), dragX(0), dragY(0), dragOrig(0), widgetX(0), widgetY(0), widgetW(100), @@ -433,8 +434,9 @@ struct GuiState { } - bool mbutPressed, mbutReleased; - bool mbut; + bool left, up, down; + bool upPressed, downPressed; + bool leftPressed, leftReleased; int mx,my; unsigned int active; unsigned int hot; @@ -471,8 +473,10 @@ inline bool inRect(int x, int y, int w, int h) void clearInput() { - g_state.mbutPressed = false; - g_state.mbutReleased = false; + g_state.leftPressed = false; + g_state.leftReleased = false; + g_state.upPressed = false; + g_state.downPressed = false; } void clearActive(void) @@ -502,7 +506,7 @@ bool buttonLogic(unsigned int id, bool over) { if (over) setHot(id); - if (isHot(id) && g_state.mbutPressed) + if (isHot(id) && g_state.leftPressed) setActive(id); } @@ -512,7 +516,7 @@ bool buttonLogic(unsigned int id, bool over) g_state.isActive = true; if (over) setHot(id); - if (g_state.mbutReleased) + if (g_state.leftReleased) { if (isHot(id)) res = true; @@ -526,24 +530,27 @@ bool buttonLogic(unsigned int id, bool over) return res; } -static void updateInput() +static void updateInput(int mx, int my, unsigned char mbut) { - int mx, my; - Uint8 state = SDL_GetMouseState(&mx, &my); - bool mbut = (state & SDL_BUTTON_LMASK) != 0; - SDL_Surface* screen = SDL_GetVideoSurface(); - my = screen->h-1 - my; + bool left = (mbut & IMGUI_MBUT_LEFT) != 0; + bool up = (mbut & IMGUI_MBUT_UP) != 0; + bool down = (mbut & IMGUI_MBUT_DOWN) != 0; g_state.mx = mx; g_state.my = my; - g_state.mbutPressed = !g_state.mbut && mbut; - g_state.mbutReleased = g_state.mbut && !mbut; - g_state.mbut = mbut; + g_state.leftPressed = !g_state.left && left; + g_state.leftReleased = g_state.left && !left; + g_state.left = left; + + g_state.upPressed = !g_state.up && up; + g_state.downPressed = !g_state.down && down; + g_state.up = up; + g_state.down = down; } -void imguiBeginFrame() +void imguiBeginFrame(int mx, int my, unsigned char mbut) { - updateInput(); + updateInput(mx,my,mbut); g_state.hot = g_state.hotToBe; g_state.hotToBe = 0; @@ -588,7 +595,8 @@ static int g_scrollAreaTop = 0; static int* g_scrollVal = 0; static int g_focusTop = 0; static int g_focusBottom = 0; -static unsigned int g_scrollId = 0; +static unsigned int g_scrollId = 0; +static bool g_insideScrollArea = false; bool imguiBeginScrollArea(unsigned int id, const char* name, int x, int y, int w, int h, int* scroll) { @@ -613,7 +621,9 @@ bool imguiBeginScrollArea(unsigned int id, const char* name, int x, int y, int w addGfxCmdScissor(x+SCROLL_AREA_PADDING, y+SCROLL_AREA_PADDING, w-SCROLL_AREA_PADDING*4, h-AREA_HEADER-SCROLL_AREA_PADDING); - return inRect(x, y, w, h); + g_insideScrollArea = inRect(x, y, w, h); + + return g_insideScrollArea; } void imguiEndScrollArea() @@ -673,6 +683,22 @@ void imguiEndScrollArea() addGfxCmdRoundedRect(hx, hy, hw, hh, w/2-1, RGBA(255,196,0,196)); else addGfxCmdRoundedRect(hx, hy, hw, hh, w/2-1, isHot(hid) ? RGBA(255,196,0,96) : RGBA(255,255,255,64)); + + // Handle mouse scrolling. + if (g_insideScrollArea) // && !anyActive()) + { + if (g_state.upPressed) + { + *g_scrollVal -= 20; + if (*g_scrollVal < 0) *g_scrollVal = 0; + } + else if (g_state.downPressed) + { + *g_scrollVal += 20; + if (*g_scrollVal > (sh - h)) *g_scrollVal = (sh - h); + } + } + } } diff --git a/RecastDemo/Source/main.cpp b/RecastDemo/Source/main.cpp new file mode 100644 index 0000000..9798088 --- /dev/null +++ b/RecastDemo/Source/main.cpp @@ -0,0 +1,665 @@ +#include +#define _USE_MATH_DEFINES +#include +#ifdef WIN32 +# include +#else +# include +#endif + +#include "SDL.h" +#include "SDL_Opengl.h" + +#include "GLFont.h" +#include "imgui.h" +#include "Recast.h" +#include "RecastDebugDraw.h" +#include "MeshLoaderObj.h" +#include "BuilderStatMeshSimple.h" +#include "BuilderStatMeshTiling.h" + +GLFont g_font; + +void drawText(int x, int y, int dir, const char* text, unsigned int col) +{ + if (dir < 0) + g_font.drawText((float)x - g_font.getTextLength(text), (float)y, text, col); + else + g_font.drawText((float)x, (float)y, text, col); +} + + +struct FileList +{ + static const int MAX_FILES = 256; + inline FileList() : size(0) {} + inline ~FileList() + { + clear(); + } + + void clear() + { + for (int i = 0; i < size; ++i) + delete [] files[i]; + size = 0; + } + + void add(const char* path) + { + if (size >= MAX_FILES) + return; + int n = strlen(path); + files[size] = new char[n+1]; + strcpy(files[size], path); + size++; + } + + static int cmp(const void* a, const void* b) + { + return strcmp(*(const char**)a, *(const char**)b); + } + + void sort() + { + if (size > 1) + qsort(files, size, sizeof(char*), cmp); + } + + char* files[MAX_FILES]; + int size; +}; + +static void scanDirectory(const char* path, const char* ext, FileList& list) +{ + list.clear(); + +#ifdef WIN32 + _finddata_t dir; + char pathWithExt[MAX_PATH]; + long fh; + strcpy(pathWithExt, path); + strcat(pathWithExt, "/*"); + strcat(pathWithExt, ext); + fh = _findfirst(pathWithExt, &dir); + if (fh == -1L) + return; + do + { + list.add(dir.name); + } + while (_findnext(fh, &dir) == 0); + _findclose(fh); +#else + dirent* current = 0; + DIR* dp = opendir(path); + if (!dp) + return; + + while ((current = readdir(dp)) != 0) + { + int len = strlen(current->d_name); + if (len > 4 && strncmp(current->d_name+len-4, ext, 4) == 0) + { + list.add(current->d_name); + } + } + closedir(dp); +#endif + list.sort(); +} + +bool intersectSegmentTriangle(const float* sp, const float* sq, + const float* a, const float* b, const float* c, + float &t) +{ + float v, w; + float ab[3], ac[3], qp[3], ap[3], norm[3], e[3]; + vsub(ab, b, a); + vsub(ac, c, a); + vsub(qp, sp, sq); + + // Compute triangle normal. Can be precalculated or cached if + // intersecting multiple segments against the same triangle + vcross(norm, ab, ac); + + // Compute denominator d. If d <= 0, segment is parallel to or points + // away from triangle, so exit early + float d = vdot(qp, norm); + if (d <= 0.0f) return false; + + // Compute intersection t value of pq with plane of triangle. A ray + // intersects iff 0 <= t. Segment intersects iff 0 <= t <= 1. Delay + // dividing by d until intersection has been found to pierce triangle + vsub(ap, sp, a); + t = vdot(ap, norm); + if (t < 0.0f) return false; + if (t > d) return false; // For segment; exclude this code line for a ray test + + // Compute barycentric coordinate components and test if within bounds + vcross(e, qp, ap); + v = vdot(ac, e); + if (v < 0.0f || v > d) return false; + w = -vdot(ab, e); + if (w < 0.0f || v + w > d) return false; + + // Segment/ray intersects triangle. Perform delayed division + t /= d; + + return true; +} + +static bool raycast(rcMeshLoaderObj& mesh, float* src, float* dst, float& tmin) +{ + float dir[3]; + vsub(dir, dst, src); + + int nt = mesh.getTriCount(); + const float* verts = mesh.getVerts(); + const float* normals = mesh.getNormals(); + const int* tris = mesh.getTris(); + tmin = 1.0f; + bool hit = false; + + for (int i = 0; i < nt*3; i += 3) + { + const float* n = &normals[i]; + if (vdot(dir, n) > 0) + continue; + + float t = 1; + if (intersectSegmentTriangle(src, dst, + &verts[tris[i]*3], + &verts[tris[i+1]*3], + &verts[tris[i+2]*3], t)) + { + if (t < tmin) + tmin = t; + hit = true; + } + } + + return hit; +} + +int main(int argc, char *argv[]) +{ + // Init SDL + if (SDL_Init(SDL_INIT_EVERYTHING) != 0) + { + printf("Could not initialise SDL\n"); + return -1; + } + + // Init OpenGL + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); + SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); + + int width = 1200; + int height = 700; + SDL_Surface* screen = SDL_SetVideoMode(width, height, 0, SDL_OPENGL); + if (!screen) + { + printf("Could not initialise SDL opengl\n"); + return -1; + } + + SDL_WM_SetCaption("Recast Demo", 0); + + if(!g_font.create("font.cfnt")) + { + printf("Could not load font.\n"); + SDL_Quit(); + return -1; + } + + float t = 0.0f; + Uint32 lastTime = SDL_GetTicks(); + int mx = 0, my = 0; + float rx = 45; + float ry = -45; + float moveW = 0, moveS = 0, moveA = 0, moveD = 0; + float camx = 0, camy = 0, camz = 0, camr=10; + float origrx, origry; + int origx, origy; + bool rotate = false; + float rays[3], raye[3]; + bool mouseOverMenu = false; + bool showLog = false; + bool showDebugMode = true; + bool showTools = true; + bool showLevels = false; + bool showBuilder = false; + + int propScroll = 0; + int logScroll = 0; + int toolsScroll = 0; + int debugScroll = 0; + + char builderName[64] = "Choose Builder..."; + + FileList meshFiles; + char meshName[128] = "Choose Mesh..."; + + rcMeshLoaderObj* mesh = 0; + float meshBMin[3], meshBMax[3]; + + Builder* builder = 0; + + rcLog log; + log.clear(); + rcSetLog(&log); + + glEnable(GL_CULL_FACE); + + float fogCol[4] = { 0.32f,0.25f,0.25f,1 }; + glEnable(GL_FOG); + glFogi(GL_FOG_MODE, GL_LINEAR); + glFogf(GL_FOG_START, 0); + glFogf(GL_FOG_END, 10); + glFogfv(GL_FOG_COLOR, fogCol); + + glEnable(GL_POINT_SMOOTH); + glEnable(GL_LINE_SMOOTH); + + bool done = false; + while(!done) + { + // Handle input events. + unsigned char mbut = 0; + SDL_Event event; + while(SDL_PollEvent(&event)) + { + switch(event.type) + { + case SDL_KEYDOWN: + // Handle any key presses here. + if (event.key.keysym.sym == SDLK_ESCAPE) + { + done = true; + } + break; + + case SDL_MOUSEBUTTONDOWN: + // Handle mouse clicks here. + if (!mouseOverMenu) + { + if (event.button.button == SDL_BUTTON_RIGHT) + { + // Rotate view + rotate = true; + origx = mx; + origy = my; + origrx = rx; + origry = ry; + } + else if (event.button.button == SDL_BUTTON_LEFT) + { + // Hit test mesh. + if (mesh && builder) + { + // Hit test mesh. + float t; + if (raycast(*mesh, rays, raye, t)) + { + float pos[3]; + pos[0] = rays[0] + (raye[0] - rays[0])*t; + pos[1] = rays[1] + (raye[1] - rays[1])*t; + pos[2] = rays[2] + (raye[2] - rays[2])*t; + if (SDL_GetModState() & KMOD_SHIFT) + builder->setToolStartPos(pos); + else + builder->setToolEndPos(pos); + } + } + } + } + if (event.button.button == SDL_BUTTON_WHEELUP) + mbut |= IMGUI_MBUT_UP; + if (event.button.button == SDL_BUTTON_WHEELDOWN) + mbut |= IMGUI_MBUT_DOWN; + break; + + case SDL_MOUSEBUTTONUP: + // Handle mouse clicks here. + if(event.button.button == SDL_BUTTON_RIGHT) + { + rotate = false; + } + break; + + case SDL_MOUSEMOTION: + mx = event.motion.x; + my = height-1 - event.motion.y; + if (rotate) + { + int dx = mx - origx; + int dy = my - origy; + rx = origrx - dy*0.25f; + ry = origry + dx*0.25f; + } + break; + + case SDL_QUIT: + done = true; + break; + + default: + break; + } + } + + if (SDL_GetMouseState(0,0) & SDL_BUTTON_LMASK) + mbut |= IMGUI_MBUT_LEFT; + if (SDL_GetMouseState(0,0) & SDL_BUTTON_RMASK) + mbut |= IMGUI_MBUT_RIGHT; + + Uint32 time = SDL_GetTicks(); + float dt = (time - lastTime) / 1000.0f; + lastTime = time; + + t += dt; + + // Update and render + glViewport(0, 0, width, height); + glClearColor(0.3f, 0.3f, 0.32f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDisable(GL_TEXTURE_2D); + + // Render 3d + glEnable(GL_DEPTH_TEST); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(50.0f, (float)width/(float)height, 1.0f, camr); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glRotatef(rx,1,0,0); + glRotatef(ry,0,1,0); + glTranslatef(-camx, -camy, -camz); + + // Get hit ray position and direction. + GLdouble proj[16]; + GLdouble model[16]; + GLint view[4]; + glGetDoublev(GL_PROJECTION_MATRIX, proj); + glGetDoublev(GL_MODELVIEW_MATRIX, model); + glGetIntegerv(GL_VIEWPORT, view); + GLdouble x, y, z; + gluUnProject(mx, my, 0.0f, model, proj, view, &x, &y, &z); + rays[0] = (float)x; rays[1] = (float)y; rays[2] = (float)z; + gluUnProject(mx, my, 1.0f, model, proj, view, &x, &y, &z); + raye[0] = (float)x; raye[1] = (float)y; raye[2] = (float)z; + + // Handle keyboard movement. + Uint8* keystate = SDL_GetKeyState(NULL); + moveW = rcClamp(moveW + dt * 4 * (keystate[SDLK_w] ? 1 : -1), 0.0f, 1.0f); + moveS = rcClamp(moveS + dt * 4 * (keystate[SDLK_s] ? 1 : -1), 0.0f, 1.0f); + moveA = rcClamp(moveA + dt * 4 * (keystate[SDLK_a] ? 1 : -1), 0.0f, 1.0f); + moveD = rcClamp(moveD + dt * 4 * (keystate[SDLK_d] ? 1 : -1), 0.0f, 1.0f); + + float keybSpeed = 22.0f; + if (SDL_GetModState() & KMOD_SHIFT) + keybSpeed *= 4.0f; + + float movex = (moveD - moveA) * keybSpeed * dt; + float movey = (moveS - moveW) * keybSpeed * dt; + + camx += movex * (float)model[0]; + camy += movex * (float)model[4]; + camz += movex * (float)model[8]; + + camx += movey * (float)model[2]; + camy += movey * (float)model[6]; + camz += movey * (float)model[10]; + + glEnable(GL_FOG); + + if (builder) + builder->handleRender(); + + glDisable(GL_FOG); + + // Render GUI + glDisable(GL_DEPTH_TEST); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluOrtho2D(0, width, 0, height); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + imguiBeginFrame(mx,my,mbut); + + mouseOverMenu = false; + + int propDiv = showDebugMode ? height*0.6f : height; + + if (imguiBeginScrollArea(GENID, "Properties", + width-250-10, 10+height-propDiv, 250, propDiv-20, &propScroll)) + mouseOverMenu = true; + + if (imguiCheck(GENID, "Show Log", showLog)) + showLog = !showLog; + if (imguiCheck(GENID, "Show Tools", showTools)) + showTools = !showTools; + if (imguiCheck(GENID, "Show Debug Mode", showDebugMode)) + showDebugMode = !showDebugMode; + + imguiSeparator(); + imguiLabel(GENID, "Builder"); + if (imguiButton(GENID, builderName)) + { + if (showBuilder) + { + showBuilder = false; + } + else + { + showBuilder = true; + showLevels = false; + } + } + + if (builder) + { + imguiSeparator(); + imguiLabel(GENID, "Input Mesh"); + if (imguiButton(GENID, meshName)) + { + if (showLevels) + { + showLevels = false; + } + else + { + showBuilder = false; + showLevels = true; + scanDirectory("meshes", ".obj", meshFiles); + } + } + if (mesh) + { + char text[64]; + snprintf(text, 64, "Verts: %.1fk Tris: %.1fk", mesh->getVertCount()/1000.0f, mesh->getTriCount()/1000.0f); + imguiValue(GENID, text); + } + imguiSeparator(); + } + + if (mesh && builder) + { + builder->handleSettings(); + + if (imguiButton(GENID, "Build")) + { + log.clear(); + if (!builder->handleBuild()) + { + showLog = true; + logScroll = 0; + } + } + + imguiSeparator(); + } + + + imguiEndScrollArea(); + + if (showDebugMode) + { + if (imguiBeginScrollArea(GENID, "Debug Mode", + width-250-10, 10, + 250, height-propDiv-10, &debugScroll)) + mouseOverMenu = true; + + if (builder) + builder->handleDebugMode(); + + imguiEndScrollArea(); + } + + // Builder selection dialog. + if (showBuilder) + { + static int levelScroll = 0; + if (imguiBeginScrollArea(GENID, "Choose Level", width-10-250-10-200, height-10-250, 200, 250, &levelScroll)) + mouseOverMenu = true; + + Builder* newBuilder = 0; + if (imguiItem(GENID, "Simple Static Mesh")) + { + newBuilder = new BuilderStatMeshSimple(); + if (newBuilder) strcpy(builderName, "Simple Static Mesh"); + } + if (imguiItem(GENID, "Tiling Static Mesh")) + { + newBuilder = new BuilderStatMeshTiling(); + if (newBuilder) strcpy(builderName, "Tiling Static Mesh"); + } + + if (newBuilder) + { + delete builder; + builder = newBuilder; + if (mesh && builder) + { + builder->handleMeshChanged(mesh->getVerts(), mesh->getVertCount(), + mesh->getTris(), mesh->getNormals(), mesh->getTriCount(), + meshBMin, meshBMax); + } + showBuilder = false; + } + + imguiEndScrollArea(); + } + + // Level selection dialog. + if (showLevels) + { + static int levelScroll = 0; + if (imguiBeginScrollArea(GENID, "Choose Level", width-10-250-10-200, height-10-250, 200, 250, &levelScroll)) + mouseOverMenu = true; + + int levelToLoad = -1; + for (int i = 0; i < meshFiles.size; ++i) + { + if (imguiItem(GENID1(i), meshFiles.files[i])) + levelToLoad = i; + } + + if (levelToLoad != -1) + { + strncpy(meshName, meshFiles.files[levelToLoad], sizeof(meshName)); + meshName[sizeof(meshName)-1] = '\0'; + showLevels = false; + + delete mesh; + mesh = 0; + + char path[256]; + strcpy(path, "meshes/"); + strcat(path, meshName); + + mesh = new rcMeshLoaderObj; + if (!mesh || !mesh->load(path)) + { + delete mesh; + mesh = 0; + } + + if (mesh) + rcCalcBounds(mesh->getVerts(), mesh->getVertCount(), meshBMin, meshBMax); + + if (builder) + { + builder->handleMeshChanged(mesh->getVerts(), mesh->getVertCount(), + mesh->getTris(), mesh->getNormals(), mesh->getTriCount(), + meshBMin, meshBMax); + } + + // Reset camera and fog to match the mesh bounds. + camr = sqrtf(rcSqr(meshBMax[0]-meshBMin[0]) + + rcSqr(meshBMax[1]-meshBMin[1]) + + rcSqr(meshBMax[2]-meshBMin[2])) / 2; + camx = (meshBMax[0] + meshBMin[0]) / 2 + camr; + camy = (meshBMax[1] + meshBMin[1]) / 2 + camr; + camz = (meshBMax[2] + meshBMin[2]) / 2 + camr; + camr *= 3; + rx = 45; + ry = -45; + glFogf(GL_FOG_START, camr*0.2f); + glFogf(GL_FOG_END, camr*1.25f); + } + + imguiEndScrollArea(); + + } + + // Log + if (showLog) + { + if (imguiBeginScrollArea(GENID, "Log", 10, 10, width - 300, 200, &logScroll)) + mouseOverMenu = true; + for (int i = 0; i < log.getMessageCount(); ++i) + imguiLabel(GENID1(i), log.getMessageText(i)); + imguiEndScrollArea(); + } + + // Tools + if (showTools && mesh && builder) + { + if (imguiBeginScrollArea(GENID, "Tools", 10, height - 10 - 200, 150, 200, &toolsScroll)) + mouseOverMenu = true; + + builder->handleTools(); + + imguiEndScrollArea(); + } + + // Help text. + const char msg[] = "W/S/A/D: Move RMB: Rotate LMB: Place Start LMB+SHIFT: Place End"; + const float len = g_font.getTextLength(msg); + g_font.drawText(width/2-len/2, (float)height-20.0f, msg, GLFont::RGBA(255,255,255,128)); + + glDisable(GL_TEXTURE_2D); + + imguiEndFrame(); + imguiRender(&drawText); + + glEnable(GL_DEPTH_TEST); + SDL_GL_SwapBuffers(); + } + + SDL_Quit(); + + delete builder; + delete mesh; + + return 0; +}