mirror of
				https://github.com/TES3MP/openmw-tes3mp.git
				synced 2025-10-31 17:56:47 +00:00 
			
		
		
		
	Add enums for area type and flags
This commit is contained in:
		
							parent
							
								
									fa23b590a4
								
							
						
					
					
						commit
						72f211ef28
					
				
					 23 changed files with 218 additions and 148 deletions
				
			
		|  | @ -40,7 +40,7 @@ namespace | |||
|         const auto recastMesh = builder.create(); | ||||
|         EXPECT_EQ(recastMesh->getVertices(), std::vector<float>()); | ||||
|         EXPECT_EQ(recastMesh->getIndices(), std::vector<int>()); | ||||
|         EXPECT_EQ(recastMesh->getFlags(), std::vector<unsigned char>()); | ||||
|         EXPECT_EQ(recastMesh->getAreaTypes(), std::vector<AreaType>()); | ||||
|     } | ||||
| 
 | ||||
|     TEST_F(DetourNavigatorRecastMeshBuilderTest, add_bhv_triangle_mesh_shape) | ||||
|  | @ -49,7 +49,7 @@ namespace | |||
|         mesh.addTriangle(btVector3(-1, -1, 0), btVector3(-1, 1, 0), btVector3(1, -1, 0)); | ||||
|         btBvhTriangleMeshShape shape(&mesh, true); | ||||
|         RecastMeshBuilder builder(mSettings, mBounds); | ||||
|         builder.addObject(static_cast<const btCollisionShape&>(shape), btTransform::getIdentity(), 1); | ||||
|         builder.addObject(static_cast<const btCollisionShape&>(shape), btTransform::getIdentity(), AreaType_ground); | ||||
|         const auto recastMesh = builder.create(); | ||||
|         EXPECT_EQ(recastMesh->getVertices(), std::vector<float>({ | ||||
|             1, 0, -1, | ||||
|  | @ -57,7 +57,7 @@ namespace | |||
|             -1, 0, -1, | ||||
|         })); | ||||
|         EXPECT_EQ(recastMesh->getIndices(), std::vector<int>({0, 1, 2})); | ||||
|         EXPECT_EQ(recastMesh->getFlags(), std::vector<unsigned char>({1})); | ||||
|         EXPECT_EQ(recastMesh->getAreaTypes(), std::vector<AreaType>({AreaType_ground})); | ||||
|     } | ||||
| 
 | ||||
|     TEST_F(DetourNavigatorRecastMeshBuilderTest, add_transformed_bhv_triangle_mesh_shape) | ||||
|  | @ -69,7 +69,7 @@ namespace | |||
|         builder.addObject( | ||||
|             static_cast<const btCollisionShape&>(shape), | ||||
|             btTransform(btMatrix3x3::getIdentity().scaled(btVector3(1, 2, 3)), btVector3(1, 2, 3)), | ||||
|             1 | ||||
|             AreaType_ground | ||||
|         ); | ||||
|         const auto recastMesh = builder.create(); | ||||
|         EXPECT_EQ(recastMesh->getVertices(), std::vector<float>({ | ||||
|  | @ -78,7 +78,7 @@ namespace | |||
|             0, 3, 0, | ||||
|         })); | ||||
|         EXPECT_EQ(recastMesh->getIndices(), std::vector<int>({0, 1, 2})); | ||||
|         EXPECT_EQ(recastMesh->getFlags(), std::vector<unsigned char>({1})); | ||||
|         EXPECT_EQ(recastMesh->getAreaTypes(), std::vector<AreaType>({AreaType_ground})); | ||||
|     } | ||||
| 
 | ||||
|     TEST_F(DetourNavigatorRecastMeshBuilderTest, add_heightfield_terrian_shape) | ||||
|  | @ -86,7 +86,7 @@ namespace | |||
|         const std::array<btScalar, 4> heightfieldData {{0, 0, 0, 0}}; | ||||
|         btHeightfieldTerrainShape shape(2, 2, heightfieldData.data(), 1, 0, 0, 2, PHY_FLOAT, false); | ||||
|         RecastMeshBuilder builder(mSettings, mBounds); | ||||
|         builder.addObject(static_cast<const btCollisionShape&>(shape), btTransform::getIdentity(), 1); | ||||
|         builder.addObject(static_cast<const btCollisionShape&>(shape), btTransform::getIdentity(), AreaType_ground); | ||||
|         const auto recastMesh = builder.create(); | ||||
|         EXPECT_EQ(recastMesh->getVertices(), std::vector<float>({ | ||||
|             -0.5, 0, -0.5, | ||||
|  | @ -97,14 +97,14 @@ namespace | |||
|             0.5, 0, 0.5, | ||||
|         })); | ||||
|         EXPECT_EQ(recastMesh->getIndices(), std::vector<int>({0, 1, 2, 3, 4, 5})); | ||||
|         EXPECT_EQ(recastMesh->getFlags(), std::vector<unsigned char>({1, 1})); | ||||
|         EXPECT_EQ(recastMesh->getAreaTypes(), std::vector<AreaType>({AreaType_ground, AreaType_ground})); | ||||
|     } | ||||
| 
 | ||||
|     TEST_F(DetourNavigatorRecastMeshBuilderTest, add_box_shape_should_produce_12_triangles) | ||||
|     { | ||||
|         btBoxShape shape(btVector3(1, 1, 2)); | ||||
|         RecastMeshBuilder builder(mSettings, mBounds); | ||||
|         builder.addObject(static_cast<const btCollisionShape&>(shape), btTransform::getIdentity(), 1); | ||||
|         builder.addObject(static_cast<const btCollisionShape&>(shape), btTransform::getIdentity(), AreaType_ground); | ||||
|         const auto recastMesh = builder.create(); | ||||
|         EXPECT_EQ(recastMesh->getVertices(), std::vector<float>({ | ||||
|             1, 2, 1, | ||||
|  | @ -130,7 +130,7 @@ namespace | |||
|             7, 6, 4, | ||||
|             4, 5, 7, | ||||
|         })); | ||||
|         EXPECT_EQ(recastMesh->getFlags(), std::vector<unsigned char>({1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1})); | ||||
|         EXPECT_EQ(recastMesh->getAreaTypes(), std::vector<AreaType>(12, AreaType_ground)); | ||||
|     } | ||||
| 
 | ||||
|     TEST_F(DetourNavigatorRecastMeshBuilderTest, add_compound_shape) | ||||
|  | @ -147,7 +147,11 @@ namespace | |||
|         shape.addChildShape(btTransform::getIdentity(), &box); | ||||
|         shape.addChildShape(btTransform::getIdentity(), &triangle2); | ||||
|         RecastMeshBuilder builder(mSettings, mBounds); | ||||
|         builder.addObject(static_cast<const btCollisionShape&>(shape), btTransform::getIdentity(), 1); | ||||
|         builder.addObject( | ||||
|             static_cast<const btCollisionShape&>(shape), | ||||
|             btTransform::getIdentity(), | ||||
|             AreaType_ground | ||||
|         ); | ||||
|         const auto recastMesh = builder.create(); | ||||
|         EXPECT_EQ(recastMesh->getVertices(), std::vector<float>({ | ||||
|             1, 0, -1, | ||||
|  | @ -181,7 +185,7 @@ namespace | |||
|             7, 8, 10, | ||||
|             11, 12, 13, | ||||
|         })); | ||||
|         EXPECT_EQ(recastMesh->getFlags(), std::vector<unsigned char>({1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1})); | ||||
|         EXPECT_EQ(recastMesh->getAreaTypes(), std::vector<AreaType>(14, AreaType_ground)); | ||||
|     } | ||||
| 
 | ||||
|     TEST_F(DetourNavigatorRecastMeshBuilderTest, add_transformed_compound_shape) | ||||
|  | @ -192,9 +196,11 @@ namespace | |||
|         btCompoundShape shape; | ||||
|         shape.addChildShape(btTransform::getIdentity(), &triangle); | ||||
|         RecastMeshBuilder builder(mSettings, mBounds); | ||||
|         builder.addObject(static_cast<const btCollisionShape&>(shape), | ||||
|                           btTransform(btMatrix3x3::getIdentity().scaled(btVector3(1, 2, 3)), btVector3(1, 2, 3)), | ||||
|                           1); | ||||
|         builder.addObject( | ||||
|             static_cast<const btCollisionShape&>(shape), | ||||
|             btTransform(btMatrix3x3::getIdentity().scaled(btVector3(1, 2, 3)), btVector3(1, 2, 3)), | ||||
|             AreaType_ground | ||||
|         ); | ||||
|         const auto recastMesh = builder.create(); | ||||
|         EXPECT_EQ(recastMesh->getVertices(), std::vector<float>({ | ||||
|             2, 3, 0, | ||||
|  | @ -202,7 +208,7 @@ namespace | |||
|             0, 3, 0, | ||||
|         })); | ||||
|         EXPECT_EQ(recastMesh->getIndices(), std::vector<int>({0, 1, 2})); | ||||
|         EXPECT_EQ(recastMesh->getFlags(), std::vector<unsigned char>({1})); | ||||
|         EXPECT_EQ(recastMesh->getAreaTypes(), std::vector<AreaType>({AreaType_ground})); | ||||
|     } | ||||
| 
 | ||||
|     TEST_F(DetourNavigatorRecastMeshBuilderTest, add_transformed_compound_shape_with_transformed_bhv_triangle_shape) | ||||
|  | @ -217,7 +223,7 @@ namespace | |||
|         builder.addObject( | ||||
|             static_cast<const btCollisionShape&>(shape), | ||||
|             btTransform(btMatrix3x3::getIdentity().scaled(btVector3(1, 2, 3)), btVector3(1, 2, 3)), | ||||
|             1 | ||||
|             AreaType_ground | ||||
|         ); | ||||
|         const auto recastMesh = builder.create(); | ||||
|         EXPECT_EQ(recastMesh->getVertices(), std::vector<float>({ | ||||
|  | @ -226,7 +232,7 @@ namespace | |||
|             1, 12, 2, | ||||
|         })); | ||||
|         EXPECT_EQ(recastMesh->getIndices(), std::vector<int>({0, 1, 2})); | ||||
|         EXPECT_EQ(recastMesh->getFlags(), std::vector<unsigned char>({1})); | ||||
|         EXPECT_EQ(recastMesh->getAreaTypes(), std::vector<AreaType>({AreaType_ground})); | ||||
|     } | ||||
| 
 | ||||
|     TEST_F(DetourNavigatorRecastMeshBuilderTest, without_bounds_add_bhv_triangle_shape_should_not_filter_by_bounds) | ||||
|  | @ -236,7 +242,11 @@ namespace | |||
|         mesh.addTriangle(btVector3(-3, -3, 0), btVector3(-3, -2, 0), btVector3(-2, -3, 0)); | ||||
|         btBvhTriangleMeshShape shape(&mesh, true); | ||||
|         RecastMeshBuilder builder(mSettings, mBounds); | ||||
|         builder.addObject(static_cast<const btCollisionShape&>(shape), btTransform::getIdentity(), 1); | ||||
|         builder.addObject( | ||||
|             static_cast<const btCollisionShape&>(shape), | ||||
|             btTransform::getIdentity(), | ||||
|             AreaType_ground | ||||
|         ); | ||||
|         const auto recastMesh = builder.create(); | ||||
|         EXPECT_EQ(recastMesh->getVertices(), std::vector<float>({ | ||||
|             1, 0, -1, | ||||
|  | @ -247,7 +257,7 @@ namespace | |||
|             -3, 0, -3, | ||||
|         })); | ||||
|         EXPECT_EQ(recastMesh->getIndices(), std::vector<int>({0, 1, 2, 3, 4, 5})); | ||||
|         EXPECT_EQ(recastMesh->getFlags(), std::vector<unsigned char>({1, 1})); | ||||
|         EXPECT_EQ(recastMesh->getAreaTypes(), std::vector<AreaType>(2, AreaType_ground)); | ||||
|     } | ||||
| 
 | ||||
|     TEST_F(DetourNavigatorRecastMeshBuilderTest, with_bounds_add_bhv_triangle_shape_should_filter_by_bounds) | ||||
|  | @ -260,7 +270,11 @@ namespace | |||
|         mesh.addTriangle(btVector3(-3, -3, 0), btVector3(-3, -2, 0), btVector3(-2, -3, 0)); | ||||
|         btBvhTriangleMeshShape shape(&mesh, true); | ||||
|         RecastMeshBuilder builder(mSettings, mBounds); | ||||
|         builder.addObject(static_cast<const btCollisionShape&>(shape), btTransform::getIdentity(), 1); | ||||
|         builder.addObject( | ||||
|             static_cast<const btCollisionShape&>(shape), | ||||
|             btTransform::getIdentity(), | ||||
|             AreaType_ground | ||||
|         ); | ||||
|         const auto recastMesh = builder.create(); | ||||
|         EXPECT_EQ(recastMesh->getVertices(), std::vector<float>({ | ||||
|             -0.2f, 0, -0.3f, | ||||
|  | @ -268,7 +282,7 @@ namespace | |||
|             -0.3f, 0, -0.3f, | ||||
|         })); | ||||
|         EXPECT_EQ(recastMesh->getIndices(), std::vector<int>({0, 1, 2})); | ||||
|         EXPECT_EQ(recastMesh->getFlags(), std::vector<unsigned char>({1})); | ||||
|         EXPECT_EQ(recastMesh->getAreaTypes(), std::vector<AreaType>({AreaType_ground})); | ||||
|     } | ||||
| 
 | ||||
|     TEST_F(DetourNavigatorRecastMeshBuilderTest, with_bounds_add_rotated_by_x_bhv_triangle_shape_should_filter_by_bounds) | ||||
|  | @ -280,8 +294,12 @@ namespace | |||
|         mesh.addTriangle(btVector3(0, -3, -3), btVector3(0, -3, -2), btVector3(0, -2, -3)); | ||||
|         btBvhTriangleMeshShape shape(&mesh, true); | ||||
|         RecastMeshBuilder builder(mSettings, mBounds); | ||||
|         builder.addObject(static_cast<const btCollisionShape&>(shape), | ||||
|                           btTransform(btQuaternion(btVector3(1, 0, 0), static_cast<btScalar>(-osg::PI_4))), 1); | ||||
|         builder.addObject( | ||||
|             static_cast<const btCollisionShape&>(shape), | ||||
|             btTransform(btQuaternion(btVector3(1, 0, 0), | ||||
|             static_cast<btScalar>(-osg::PI_4))), | ||||
|             AreaType_ground | ||||
|         ); | ||||
|         const auto recastMesh = builder.create(); | ||||
|         EXPECT_EQ(recastMesh->getVertices(), std::vector<float>({ | ||||
|             0, -0.70710659027099609375, -3.535533905029296875, | ||||
|  | @ -289,7 +307,7 @@ namespace | |||
|             0, 2.384185791015625e-07, -4.24264049530029296875, | ||||
|         })); | ||||
|         EXPECT_EQ(recastMesh->getIndices(), std::vector<int>({0, 1, 2})); | ||||
|         EXPECT_EQ(recastMesh->getFlags(), std::vector<unsigned char>({1})); | ||||
|         EXPECT_EQ(recastMesh->getAreaTypes(), std::vector<AreaType>({AreaType_ground})); | ||||
|     } | ||||
| 
 | ||||
|     TEST_F(DetourNavigatorRecastMeshBuilderTest, with_bounds_add_rotated_by_y_bhv_triangle_shape_should_filter_by_bounds) | ||||
|  | @ -301,8 +319,12 @@ namespace | |||
|         mesh.addTriangle(btVector3(-3, 0, -3), btVector3(-3, 0, -2), btVector3(-2, 0, -3)); | ||||
|         btBvhTriangleMeshShape shape(&mesh, true); | ||||
|         RecastMeshBuilder builder(mSettings, mBounds); | ||||
|         builder.addObject(static_cast<const btCollisionShape&>(shape), | ||||
|                           btTransform(btQuaternion(btVector3(0, 1, 0), static_cast<btScalar>(osg::PI_4))), 1); | ||||
|         builder.addObject( | ||||
|             static_cast<const btCollisionShape&>(shape), | ||||
|             btTransform(btQuaternion(btVector3(0, 1, 0), | ||||
|             static_cast<btScalar>(osg::PI_4))), | ||||
|             AreaType_ground | ||||
|         ); | ||||
|         const auto recastMesh = builder.create(); | ||||
|         EXPECT_EQ(recastMesh->getVertices(), std::vector<float>({ | ||||
|             -3.535533905029296875, -0.70710659027099609375, 0, | ||||
|  | @ -310,7 +332,7 @@ namespace | |||
|             -4.24264049530029296875, 2.384185791015625e-07, 0, | ||||
|         })); | ||||
|         EXPECT_EQ(recastMesh->getIndices(), std::vector<int>({0, 1, 2})); | ||||
|         EXPECT_EQ(recastMesh->getFlags(), std::vector<unsigned char>({1})); | ||||
|         EXPECT_EQ(recastMesh->getAreaTypes(), std::vector<AreaType>({AreaType_ground})); | ||||
|     } | ||||
| 
 | ||||
|     TEST_F(DetourNavigatorRecastMeshBuilderTest, with_bounds_add_rotated_by_z_bhv_triangle_shape_should_filter_by_bounds) | ||||
|  | @ -322,8 +344,12 @@ namespace | |||
|         mesh.addTriangle(btVector3(-3, -3, 0), btVector3(-3, -2, 0), btVector3(-2, -3, 0)); | ||||
|         btBvhTriangleMeshShape shape(&mesh, true); | ||||
|         RecastMeshBuilder builder(mSettings, mBounds); | ||||
|         builder.addObject(static_cast<const btCollisionShape&>(shape), | ||||
|                           btTransform(btQuaternion(btVector3(0, 0, 1), static_cast<btScalar>(osg::PI_4))), 1); | ||||
|         builder.addObject( | ||||
|             static_cast<const btCollisionShape&>(shape), | ||||
|             btTransform(btQuaternion(btVector3(0, 0, 1), | ||||
|             static_cast<btScalar>(osg::PI_4))), | ||||
|             AreaType_ground | ||||
|         ); | ||||
|         const auto recastMesh = builder.create(); | ||||
|         EXPECT_EQ(recastMesh->getVertices(), std::vector<float>({ | ||||
|             0.707107067108154296875, 0, -3.535533905029296875, | ||||
|  | @ -331,7 +357,7 @@ namespace | |||
|             2.384185791015625e-07, 0, -4.24264049530029296875, | ||||
|         })); | ||||
|         EXPECT_EQ(recastMesh->getIndices(), std::vector<int>({0, 1, 2})); | ||||
|         EXPECT_EQ(recastMesh->getFlags(), std::vector<unsigned char>({1})); | ||||
|         EXPECT_EQ(recastMesh->getAreaTypes(), std::vector<AreaType>({AreaType_ground})); | ||||
|     } | ||||
| 
 | ||||
|     TEST_F(DetourNavigatorRecastMeshBuilderTest, flags_values_should_be_corresponding_to_added_objects) | ||||
|  | @ -343,8 +369,16 @@ namespace | |||
|         mesh2.addTriangle(btVector3(-3, -3, 0), btVector3(-3, -2, 0), btVector3(-2, -3, 0)); | ||||
|         btBvhTriangleMeshShape shape2(&mesh2, true); | ||||
|         RecastMeshBuilder builder(mSettings, mBounds); | ||||
|         builder.addObject(static_cast<const btCollisionShape&>(shape1), btTransform::getIdentity(), 1); | ||||
|         builder.addObject(static_cast<const btCollisionShape&>(shape2), btTransform::getIdentity(), 0); | ||||
|         builder.addObject( | ||||
|             static_cast<const btCollisionShape&>(shape1), | ||||
|             btTransform::getIdentity(), | ||||
|             AreaType_ground | ||||
|         ); | ||||
|         builder.addObject( | ||||
|             static_cast<const btCollisionShape&>(shape2), | ||||
|             btTransform::getIdentity(), | ||||
|             AreaType_null | ||||
|         ); | ||||
|         const auto recastMesh = builder.create(); | ||||
|         EXPECT_EQ(recastMesh->getVertices(), std::vector<float>({ | ||||
|             1, 0, -1, | ||||
|  | @ -355,6 +389,6 @@ namespace | |||
|             -3, 0, -3, | ||||
|         })); | ||||
|         EXPECT_EQ(recastMesh->getIndices(), std::vector<int>({0, 1, 2, 3, 4, 5})); | ||||
|         EXPECT_EQ(recastMesh->getFlags(), std::vector<unsigned char>({1, 0})); | ||||
|         EXPECT_EQ(recastMesh->getAreaTypes(), std::vector<AreaType>({AreaType_ground, AreaType_null})); | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -26,47 +26,47 @@ namespace | |||
| 
 | ||||
|     TEST_F(DetourNavigatorRecastMeshObjectTest, constructed_object_should_have_shape_and_transform) | ||||
|     { | ||||
|         const RecastMeshObject object(mBoxShape, mTransform, 1); | ||||
|         const RecastMeshObject object(mBoxShape, mTransform, AreaType_ground); | ||||
|         EXPECT_EQ(std::addressof(object.getShape()), std::addressof(mBoxShape)); | ||||
|         EXPECT_EQ(object.getTransform(), mTransform); | ||||
|     } | ||||
| 
 | ||||
|     TEST_F(DetourNavigatorRecastMeshObjectTest, update_with_same_transform_for_not_compound_shape_should_return_false) | ||||
|     { | ||||
|         RecastMeshObject object(mBoxShape, mTransform, 1); | ||||
|         EXPECT_FALSE(object.update(mTransform, 1)); | ||||
|         RecastMeshObject object(mBoxShape, mTransform, AreaType_ground); | ||||
|         EXPECT_FALSE(object.update(mTransform, AreaType_ground)); | ||||
|     } | ||||
| 
 | ||||
|     TEST_F(DetourNavigatorRecastMeshObjectTest, update_with_different_transform_should_return_true) | ||||
|     { | ||||
|         RecastMeshObject object(mBoxShape, mTransform, 1); | ||||
|         EXPECT_TRUE(object.update(btTransform::getIdentity(), 1)); | ||||
|         RecastMeshObject object(mBoxShape, mTransform, AreaType_ground); | ||||
|         EXPECT_TRUE(object.update(btTransform::getIdentity(), AreaType_ground)); | ||||
|     } | ||||
| 
 | ||||
|     TEST_F(DetourNavigatorRecastMeshObjectTest, update_with_different_flags_should_return_true) | ||||
|     { | ||||
|         RecastMeshObject object(mBoxShape, mTransform, 1); | ||||
|         EXPECT_TRUE(object.update(mTransform, 2)); | ||||
|         RecastMeshObject object(mBoxShape, mTransform, AreaType_ground); | ||||
|         EXPECT_TRUE(object.update(mTransform, AreaType_null)); | ||||
|     } | ||||
| 
 | ||||
|     TEST_F(DetourNavigatorRecastMeshObjectTest, update_for_compound_shape_with_same_transform_and_not_changed_child_transform_should_return_false) | ||||
|     { | ||||
|         RecastMeshObject object(mCompoundShape, mTransform, 1); | ||||
|         EXPECT_FALSE(object.update(mTransform, 1)); | ||||
|         RecastMeshObject object(mCompoundShape, mTransform, AreaType_ground); | ||||
|         EXPECT_FALSE(object.update(mTransform, AreaType_ground)); | ||||
|     } | ||||
| 
 | ||||
|     TEST_F(DetourNavigatorRecastMeshObjectTest, update_for_compound_shape_with_same_transform_and_changed_child_transform_should_return_true) | ||||
|     { | ||||
|         RecastMeshObject object(mCompoundShape, mTransform, 1); | ||||
|         RecastMeshObject object(mCompoundShape, mTransform, AreaType_ground); | ||||
|         mCompoundShape.updateChildTransform(0, btTransform::getIdentity()); | ||||
|         EXPECT_TRUE(object.update(mTransform, 1)); | ||||
|         EXPECT_TRUE(object.update(mTransform, AreaType_ground)); | ||||
|     } | ||||
| 
 | ||||
|     TEST_F(DetourNavigatorRecastMeshObjectTest, repeated_update_for_compound_shape_without_changes_should_return_false) | ||||
|     { | ||||
|         RecastMeshObject object(mCompoundShape, mTransform, 1); | ||||
|         RecastMeshObject object(mCompoundShape, mTransform, AreaType_ground); | ||||
|         mCompoundShape.updateChildTransform(0, btTransform::getIdentity()); | ||||
|         object.update(mTransform, 1); | ||||
|         EXPECT_FALSE(object.update(mTransform, 1)); | ||||
|         object.update(mTransform, AreaType_ground); | ||||
|         EXPECT_FALSE(object.update(mTransform, AreaType_ground)); | ||||
|     } | ||||
| } | ||||
|  |  | |||
							
								
								
									
										15
									
								
								components/detournavigator/areatype.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								components/detournavigator/areatype.hpp
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | |||
| #ifndef OPENMW_COMPONENTS_DETOURNAVIGATOR_AREATYPE_H | ||||
| #define OPENMW_COMPONENTS_DETOURNAVIGATOR_AREATYPE_H | ||||
| 
 | ||||
| #include <Recast.h> | ||||
| 
 | ||||
| namespace DetourNavigator | ||||
| { | ||||
|     enum AreaType : unsigned char | ||||
|     { | ||||
|         AreaType_null = RC_NULL_AREA, | ||||
|         AreaType_ground = RC_WALKABLE_AREA, | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
|  | @ -8,17 +8,17 @@ namespace DetourNavigator | |||
|     {} | ||||
| 
 | ||||
|     bool CachedRecastMeshManager::addObject(std::size_t id, const btCollisionShape& shape, | ||||
|                                             const btTransform& transform, const unsigned char flags) | ||||
|                                             const btTransform& transform, const AreaType areaType) | ||||
|     { | ||||
|         if (!mImpl.addObject(id, shape, transform, flags)) | ||||
|         if (!mImpl.addObject(id, shape, transform, areaType)) | ||||
|             return false; | ||||
|         mCached.reset(); | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     bool CachedRecastMeshManager::updateObject(std::size_t id, const btTransform& transform, const unsigned char flags) | ||||
|     bool CachedRecastMeshManager::updateObject(std::size_t id, const btTransform& transform, const AreaType areaType) | ||||
|     { | ||||
|         if (!mImpl.updateObject(id, transform, flags)) | ||||
|         if (!mImpl.updateObject(id, transform, areaType)) | ||||
|             return false; | ||||
|         mCached.reset(); | ||||
|         return true; | ||||
|  |  | |||
|  | @ -13,9 +13,9 @@ namespace DetourNavigator | |||
|         CachedRecastMeshManager(const Settings& settings, const TileBounds& bounds); | ||||
| 
 | ||||
|         bool addObject(std::size_t id, const btCollisionShape& shape, const btTransform& transform, | ||||
|                        const unsigned char flags); | ||||
|                        const AreaType areaType); | ||||
| 
 | ||||
|         bool updateObject(std::size_t id, const btTransform& transform, const unsigned char flags); | ||||
|         bool updateObject(std::size_t id, const btTransform& transform, const AreaType areaType); | ||||
| 
 | ||||
|         boost::optional<RemovedRecastMeshObject> removeObject(std::size_t id); | ||||
| 
 | ||||
|  |  | |||
|  | @ -13,7 +13,7 @@ namespace DetourNavigator | |||
|         { | ||||
|             Rect mBounds; | ||||
|             std::ptrdiff_t mOffset; | ||||
|             unsigned char mFlags; | ||||
|             unsigned char mAreaTypes; | ||||
|         }; | ||||
| 
 | ||||
|         template <std::size_t axis> | ||||
|  | @ -44,9 +44,9 @@ namespace DetourNavigator | |||
|         } | ||||
| 
 | ||||
|         void subdivide(std::vector<BoundsItem>& items, const std::size_t imin, const std::size_t imax, | ||||
|             const std::size_t trisPerChunk, const std::vector<int>& inIndices, const std::vector<unsigned char>& inFlags, | ||||
|             const std::size_t trisPerChunk, const std::vector<int>& inIndices, const std::vector<AreaType>& inAreaTypes, | ||||
|             std::size_t& curNode, std::vector<ChunkyTriMeshNode>& nodes, std::size_t& curTri, | ||||
|             std::vector<int>& outIndices, std::vector<unsigned char>& outFlags) | ||||
|             std::vector<int>& outIndices, std::vector<AreaType>& outAreaTypes) | ||||
|         { | ||||
|             const auto inum = imax - imin; | ||||
|             const auto icur = curNode; | ||||
|  | @ -72,7 +72,7 @@ namespace DetourNavigator | |||
|                         inIndices.begin() + items[i].mOffset * 3 + 3, | ||||
|                         outIndices.begin() + static_cast<std::ptrdiff_t>(curTri) * 3 | ||||
|                     ); | ||||
|                     outFlags[curTri] = inFlags[static_cast<std::size_t>(items[i].mOffset)]; | ||||
|                     outAreaTypes[curTri] = inAreaTypes[static_cast<std::size_t>(items[i].mOffset)]; | ||||
|                     curTri++; | ||||
|                 } | ||||
|             } | ||||
|  | @ -104,9 +104,9 @@ namespace DetourNavigator | |||
|                 const auto isplit = imin + inum / 2; | ||||
| 
 | ||||
|                 // Left
 | ||||
|                 subdivide(items, imin, isplit, trisPerChunk, inIndices, inFlags, curNode, nodes, curTri, outIndices, outFlags); | ||||
|                 subdivide(items, imin, isplit, trisPerChunk, inIndices, inAreaTypes, curNode, nodes, curTri, outIndices, outAreaTypes); | ||||
|                 // Right
 | ||||
|                 subdivide(items, isplit, imax, trisPerChunk, inIndices, inFlags, curNode, nodes, curTri, outIndices, outFlags); | ||||
|                 subdivide(items, isplit, imax, trisPerChunk, inIndices, inAreaTypes, curNode, nodes, curTri, outIndices, outAreaTypes); | ||||
| 
 | ||||
|                 const auto iescape = static_cast<std::ptrdiff_t>(curNode) - static_cast<std::ptrdiff_t>(icur); | ||||
|                 // Negative index means escape.
 | ||||
|  | @ -116,7 +116,7 @@ namespace DetourNavigator | |||
|     } | ||||
| 
 | ||||
|     ChunkyTriMesh::ChunkyTriMesh(const std::vector<float>& verts, const std::vector<int>& indices, | ||||
|                                  const std::vector<unsigned char>& flags, const std::size_t trisPerChunk) | ||||
|                                  const std::vector<AreaType>& flags, const std::size_t trisPerChunk) | ||||
|         : mMaxTrisPerChunk(0) | ||||
|     { | ||||
|         const auto trianglesCount = indices.size() / 3; | ||||
|  | @ -128,7 +128,7 @@ namespace DetourNavigator | |||
| 
 | ||||
|         mNodes.resize(nchunks * 4); | ||||
|         mIndices.resize(trianglesCount * 3); | ||||
|         mFlags.resize(trianglesCount); | ||||
|         mAreaTypes.resize(trianglesCount); | ||||
| 
 | ||||
|         // Build tree
 | ||||
|         std::vector<BoundsItem> items(trianglesCount); | ||||
|  | @ -138,7 +138,7 @@ namespace DetourNavigator | |||
|             auto& item = items[i]; | ||||
| 
 | ||||
|             item.mOffset = static_cast<std::ptrdiff_t>(i); | ||||
|             item.mFlags = flags[i]; | ||||
|             item.mAreaTypes = flags[i]; | ||||
| 
 | ||||
|             // Calc triangle XZ bounds.
 | ||||
|             const auto baseIndex = static_cast<std::size_t>(indices[i * 3]) * 3; | ||||
|  | @ -160,7 +160,7 @@ namespace DetourNavigator | |||
| 
 | ||||
|         std::size_t curTri = 0; | ||||
|         std::size_t curNode = 0; | ||||
|         subdivide(items, 0, trianglesCount, trisPerChunk, indices, flags, curNode, mNodes, curTri, mIndices, mFlags); | ||||
|         subdivide(items, 0, trianglesCount, trisPerChunk, indices, flags, curNode, mNodes, curTri, mIndices, mAreaTypes); | ||||
| 
 | ||||
|         items.clear(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,6 +1,8 @@ | |||
| #ifndef OPENMW_COMPONENTS_DETOURNAVIGATOR_CHUNKYTRIMESH_H | ||||
| #define OPENMW_COMPONENTS_DETOURNAVIGATOR_CHUNKYTRIMESH_H | ||||
| 
 | ||||
| #include "areatype.hpp" | ||||
| 
 | ||||
| #include <osg/Vec2f> | ||||
| 
 | ||||
| #include <array> | ||||
|  | @ -24,7 +26,7 @@ namespace DetourNavigator | |||
|     struct Chunk | ||||
|     { | ||||
|         const int* const mIndices; | ||||
|         const unsigned char* const mFlags; | ||||
|         const AreaType* const mAreaTypes; | ||||
|         const std::size_t mSize; | ||||
|     }; | ||||
| 
 | ||||
|  | @ -42,7 +44,7 @@ namespace DetourNavigator | |||
|         /// Creates partitioned triangle mesh (AABB tree),
 | ||||
|         /// where each node contains at max trisPerChunk triangles.
 | ||||
|         ChunkyTriMesh(const std::vector<float>& verts, const std::vector<int>& tris, | ||||
|                       const std::vector<unsigned char>& flags, const std::size_t trisPerChunk); | ||||
|                       const std::vector<AreaType>& flags, const std::size_t trisPerChunk); | ||||
| 
 | ||||
|         ChunkyTriMesh(const ChunkyTriMesh&) = delete; | ||||
|         ChunkyTriMesh& operator=(const ChunkyTriMesh&) = delete; | ||||
|  | @ -76,7 +78,7 @@ namespace DetourNavigator | |||
|             const auto& node = mNodes[chunkId]; | ||||
|             return Chunk { | ||||
|                 mIndices.data() + node.mOffset * 3, | ||||
|                 mFlags.data() + node.mOffset, | ||||
|                 mAreaTypes.data() + node.mOffset, | ||||
|                 node.mSize | ||||
|             }; | ||||
|         } | ||||
|  | @ -89,7 +91,7 @@ namespace DetourNavigator | |||
|     private: | ||||
|         std::vector<ChunkyTriMeshNode> mNodes; | ||||
|         std::vector<int> mIndices; | ||||
|         std::vector<unsigned char> mFlags; | ||||
|         std::vector<AreaType> mAreaTypes; | ||||
|         std::size_t mMaxTrisPerChunk; | ||||
|     }; | ||||
| } | ||||
|  |  | |||
							
								
								
									
										15
									
								
								components/detournavigator/flags.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								components/detournavigator/flags.hpp
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | |||
| #ifndef OPENMW_COMPONENTS_DETOURNAVIGATOR_FLAGS_H | ||||
| #define OPENMW_COMPONENTS_DETOURNAVIGATOR_FLAGS_H | ||||
| 
 | ||||
| namespace DetourNavigator | ||||
| { | ||||
|     using Flags = unsigned short; | ||||
| 
 | ||||
|     enum Flag : Flags | ||||
|     { | ||||
|         Flag_none = 0, | ||||
|         Flag_walk = 1 << 0, | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
|  | @ -8,6 +8,7 @@ | |||
| #include "settingsutils.hpp" | ||||
| #include "sharednavmesh.hpp" | ||||
| #include "settingsutils.hpp" | ||||
| #include "flags.hpp" | ||||
| 
 | ||||
| #include <DetourNavMesh.h> | ||||
| #include <DetourNavMeshBuilder.h> | ||||
|  | @ -99,7 +100,7 @@ namespace | |||
| 
 | ||||
|         { | ||||
|             const auto& chunkyMesh = recastMesh.getChunkyTriMesh(); | ||||
|             std::vector<unsigned char> areas(chunkyMesh.getMaxTrisPerChunk(), RC_NULL_AREA); | ||||
|             std::vector<unsigned char> areas(chunkyMesh.getMaxTrisPerChunk(), AreaType_null); | ||||
|             const osg::Vec2f tileBoundsMin(config.bmin[0], config.bmin[2]); | ||||
|             const osg::Vec2f tileBoundsMax(config.bmax[0], config.bmax[2]); | ||||
|             std::vector<std::size_t> cids; | ||||
|  | @ -116,7 +117,7 @@ namespace | |||
|                     areas.begin(), | ||||
|                     std::min(areas.begin() + static_cast<std::ptrdiff_t>(chunk.mSize), | ||||
|                     areas.end()), | ||||
|                     RC_NULL_AREA | ||||
|                     AreaType_null | ||||
|                 ); | ||||
| 
 | ||||
|                 rcMarkWalkableTriangles( | ||||
|  | @ -130,7 +131,7 @@ namespace | |||
|                 ); | ||||
| 
 | ||||
|                 for (std::size_t i = 0; i < chunk.mSize; ++i) | ||||
|                     areas[i] &= chunk.mFlags[i]; | ||||
|                     areas[i] = chunk.mAreaTypes[i]; | ||||
| 
 | ||||
|                 rcClearUnwalkableTriangles( | ||||
|                     &context, | ||||
|  | @ -186,8 +187,8 @@ namespace | |||
|         } | ||||
| 
 | ||||
|         for (int i = 0; i < polyMesh.npolys; ++i) | ||||
|             if (polyMesh.areas[i] == RC_WALKABLE_AREA) | ||||
|                 polyMesh.flags[i] = 1; | ||||
|             if (polyMesh.areas[i] == AreaType_ground) | ||||
|                 polyMesh.flags[i] = Flag_walk; | ||||
| 
 | ||||
|         dtNavMeshCreateParams params; | ||||
|         params.verts = polyMesh.verts; | ||||
|  |  | |||
|  | @ -29,7 +29,7 @@ namespace DetourNavigator | |||
| 
 | ||||
|     bool Navigator::addObject(std::size_t id, const btCollisionShape& shape, const btTransform& transform) | ||||
|     { | ||||
|         return mNavMeshManager.addObject(id, shape, transform, RC_WALKABLE_AREA); | ||||
|         return mNavMeshManager.addObject(id, shape, transform, AreaType_ground); | ||||
|     } | ||||
| 
 | ||||
|     bool Navigator::addObject(std::size_t id, const ObjectShapes& shapes, const btTransform& transform) | ||||
|  | @ -38,7 +38,7 @@ namespace DetourNavigator | |||
|         if (shapes.mAvoid) | ||||
|         { | ||||
|             const auto avoidId = reinterpret_cast<std::size_t>(shapes.mAvoid); | ||||
|             if (mNavMeshManager.addObject(avoidId, *shapes.mAvoid, transform, RC_NULL_AREA)) | ||||
|             if (mNavMeshManager.addObject(avoidId, *shapes.mAvoid, transform, AreaType_null)) | ||||
|             { | ||||
|                 updateAvoidShapeId(id, avoidId); | ||||
|                 result = true; | ||||
|  | @ -49,7 +49,7 @@ namespace DetourNavigator | |||
| 
 | ||||
|     bool Navigator::updateObject(std::size_t id, const btCollisionShape& shape, const btTransform& transform) | ||||
|     { | ||||
|         return mNavMeshManager.updateObject(id, shape, transform, RC_WALKABLE_AREA); | ||||
|         return mNavMeshManager.updateObject(id, shape, transform, AreaType_ground); | ||||
|     } | ||||
| 
 | ||||
|     bool Navigator::updateObject(std::size_t id, const ObjectShapes& shapes, const btTransform& transform) | ||||
|  | @ -58,7 +58,7 @@ namespace DetourNavigator | |||
|         if (shapes.mAvoid) | ||||
|         { | ||||
|             const auto avoidId = reinterpret_cast<std::size_t>(shapes.mAvoid); | ||||
|             if (mNavMeshManager.updateObject(avoidId, *shapes.mAvoid, transform, RC_NULL_AREA)) | ||||
|             if (mNavMeshManager.updateObject(avoidId, *shapes.mAvoid, transform, AreaType_null)) | ||||
|             { | ||||
|                 updateAvoidShapeId(id, avoidId); | ||||
|                 result = true; | ||||
|  |  | |||
|  | @ -15,8 +15,7 @@ namespace DetourNavigator | |||
| 
 | ||||
|         ObjectShapes(const btCollisionShape& shape, const btCollisionShape* avoid) | ||||
|             : mShape(shape), mAvoid(avoid) | ||||
|         { | ||||
|         } | ||||
|         {} | ||||
|     }; | ||||
| 
 | ||||
|     class Navigator | ||||
|  |  | |||
|  | @ -32,18 +32,18 @@ namespace DetourNavigator | |||
|     {} | ||||
| 
 | ||||
|     bool NavMeshManager::addObject(std::size_t id, const btCollisionShape& shape, const btTransform& transform, | ||||
|                                    const unsigned char flags) | ||||
|                                    const AreaType areaType) | ||||
|     { | ||||
|         if (!mRecastMeshManager.addObject(id, shape, transform, flags)) | ||||
|         if (!mRecastMeshManager.addObject(id, shape, transform, areaType)) | ||||
|             return false; | ||||
|         addChangedTiles(shape, transform, ChangeType::add); | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     bool NavMeshManager::updateObject(std::size_t id, const btCollisionShape& shape, const btTransform& transform, | ||||
|                                       const unsigned char flags) | ||||
|                                       const AreaType areaType) | ||||
|     { | ||||
|         if (!mRecastMeshManager.updateObject(id, transform, flags)) | ||||
|         if (!mRecastMeshManager.updateObject(id, transform, areaType)) | ||||
|             return false; | ||||
|         addChangedTiles(shape, transform, ChangeType::mixed); | ||||
|         return true; | ||||
|  |  | |||
|  | @ -24,10 +24,10 @@ namespace DetourNavigator | |||
|         NavMeshManager(const Settings& settings); | ||||
| 
 | ||||
|         bool addObject(std::size_t id, const btCollisionShape& shape, const btTransform& transform, | ||||
|                        const unsigned char flags); | ||||
|                        const AreaType areaType); | ||||
| 
 | ||||
|         bool updateObject(std::size_t id, const btCollisionShape& shape, const btTransform& transform, | ||||
|                           const unsigned char flags); | ||||
|                           const AreaType areaType); | ||||
| 
 | ||||
|         bool removeObject(std::size_t id); | ||||
| 
 | ||||
|  |  | |||
|  | @ -7,15 +7,15 @@ | |||
| namespace DetourNavigator | ||||
| { | ||||
|     RecastMesh::RecastMesh(std::vector<int> indices, std::vector<float> vertices, | ||||
|                            std::vector<unsigned char> flags, const Settings& settings) | ||||
|                            std::vector<AreaType> areaTypes, const Settings& settings) | ||||
|         : mIndices(std::move(indices)) | ||||
|         , mVertices(std::move(vertices)) | ||||
|         , mFlags(std::move(flags)) | ||||
|         , mChunkyTriMesh(mVertices, mIndices, mFlags, settings.mTrianglesPerChunk) | ||||
|         , mAreaTypes(std::move(areaTypes)) | ||||
|         , mChunkyTriMesh(mVertices, mIndices, mAreaTypes, settings.mTrianglesPerChunk) | ||||
|     { | ||||
|         if (getTrianglesCount() != mFlags.size()) | ||||
|         if (getTrianglesCount() != mAreaTypes.size()) | ||||
|             throw InvalidArgument("number of flags doesn't match number of triangles: triangles=" | ||||
|                 + std::to_string(getTrianglesCount()) + ", flags=" + std::to_string(mFlags.size())); | ||||
|                 + std::to_string(getTrianglesCount()) + ", areaTypes=" + std::to_string(mAreaTypes.size())); | ||||
|         if (getVerticesCount()) | ||||
|             rcCalcBounds(mVertices.data(), static_cast<int>(getVerticesCount()), mBoundsMin.ptr(), mBoundsMax.ptr()); | ||||
|     } | ||||
|  |  | |||
|  | @ -1,6 +1,7 @@ | |||
| #ifndef OPENMW_COMPONENTS_DETOURNAVIGATOR_RECASTMESH_H | ||||
| #define OPENMW_COMPONENTS_DETOURNAVIGATOR_RECASTMESH_H | ||||
| 
 | ||||
| #include "areatype.hpp" | ||||
| #include "chunkytrimesh.hpp" | ||||
| 
 | ||||
| #include <memory> | ||||
|  | @ -16,7 +17,7 @@ namespace DetourNavigator | |||
|     { | ||||
|     public: | ||||
|         RecastMesh(std::vector<int> indices, std::vector<float> vertices, | ||||
|                    std::vector<unsigned char> flags, const Settings& settings); | ||||
|                    std::vector<AreaType> areaTypes, const Settings& settings); | ||||
| 
 | ||||
|         const std::vector<int>& getIndices() const | ||||
|         { | ||||
|  | @ -28,9 +29,9 @@ namespace DetourNavigator | |||
|             return mVertices; | ||||
|         } | ||||
| 
 | ||||
|         const std::vector<unsigned char>& getFlags() const | ||||
|         const std::vector<AreaType>& getAreaTypes() const | ||||
|         { | ||||
|             return mFlags; | ||||
|             return mAreaTypes; | ||||
|         } | ||||
| 
 | ||||
|         std::size_t getVerticesCount() const | ||||
|  | @ -61,7 +62,7 @@ namespace DetourNavigator | |||
|     private: | ||||
|         std::vector<int> mIndices; | ||||
|         std::vector<float> mVertices; | ||||
|         std::vector<unsigned char> mFlags; | ||||
|         std::vector<AreaType> mAreaTypes; | ||||
|         ChunkyTriMesh mChunkyTriMesh; | ||||
|         osg::Vec3f mBoundsMin; | ||||
|         osg::Vec3f mBoundsMax; | ||||
|  |  | |||
|  | @ -36,51 +36,51 @@ namespace DetourNavigator | |||
|     } | ||||
| 
 | ||||
|     void RecastMeshBuilder::addObject(const btCollisionShape& shape, const btTransform& transform, | ||||
|                                       const unsigned char flags) | ||||
|                                       const AreaType areaType) | ||||
|     { | ||||
|         if (shape.isCompound()) | ||||
|             return addObject(static_cast<const btCompoundShape&>(shape), transform, flags); | ||||
|             return addObject(static_cast<const btCompoundShape&>(shape), transform, areaType); | ||||
|         else if (shape.getShapeType() == TERRAIN_SHAPE_PROXYTYPE) | ||||
|             return addObject(static_cast<const btHeightfieldTerrainShape&>(shape), transform, flags); | ||||
|             return addObject(static_cast<const btHeightfieldTerrainShape&>(shape), transform, areaType); | ||||
|         else if (shape.isConcave()) | ||||
|             return addObject(static_cast<const btConcaveShape&>(shape), transform, flags); | ||||
|             return addObject(static_cast<const btConcaveShape&>(shape), transform, areaType); | ||||
|         else if (shape.getShapeType() == BOX_SHAPE_PROXYTYPE) | ||||
|             return addObject(static_cast<const btBoxShape&>(shape), transform, flags); | ||||
|             return addObject(static_cast<const btBoxShape&>(shape), transform, areaType); | ||||
|         std::ostringstream message; | ||||
|         message << "Unsupported shape type: " << BroadphaseNativeTypes(shape.getShapeType()); | ||||
|         throw InvalidArgument(message.str()); | ||||
|     } | ||||
| 
 | ||||
|     void RecastMeshBuilder::addObject(const btCompoundShape& shape, const btTransform& transform, | ||||
|                                       const unsigned char flags) | ||||
|                                       const AreaType areaType) | ||||
|     { | ||||
|         for (int i = 0, num = shape.getNumChildShapes(); i < num; ++i) | ||||
|             addObject(*shape.getChildShape(i), transform * shape.getChildTransform(i), flags); | ||||
|             addObject(*shape.getChildShape(i), transform * shape.getChildTransform(i), areaType); | ||||
|     } | ||||
| 
 | ||||
|     void RecastMeshBuilder::addObject(const btConcaveShape& shape, const btTransform& transform, | ||||
|                                       const unsigned char flags) | ||||
|                                       const AreaType areaType) | ||||
|     { | ||||
|         return addObject(shape, transform, makeProcessTriangleCallback([&] (btVector3* triangle, int, int) | ||||
|         { | ||||
|             for (std::size_t i = 3; i > 0; --i) | ||||
|                 addTriangleVertex(transform(triangle[i - 1])); | ||||
|             mFlags.push_back(flags); | ||||
|             mAreaTypes.push_back(areaType); | ||||
|         })); | ||||
|     } | ||||
| 
 | ||||
|     void RecastMeshBuilder::addObject(const btHeightfieldTerrainShape& shape, const btTransform& transform, | ||||
|                                       const unsigned char flags) | ||||
|                                       const AreaType areaType) | ||||
|     { | ||||
|         return addObject(shape, transform, makeProcessTriangleCallback([&] (btVector3* triangle, int, int) | ||||
|         { | ||||
|             for (std::size_t i = 0; i < 3; ++i) | ||||
|                 addTriangleVertex(transform(triangle[i])); | ||||
|             mFlags.push_back(flags); | ||||
|             mAreaTypes.push_back(areaType); | ||||
|         })); | ||||
|     } | ||||
| 
 | ||||
|     void RecastMeshBuilder::addObject(const btBoxShape& shape, const btTransform& transform, const unsigned char flags) | ||||
|     void RecastMeshBuilder::addObject(const btBoxShape& shape, const btTransform& transform, const AreaType areaType) | ||||
|     { | ||||
|         const auto indexOffset = int(mVertices.size() / 3); | ||||
| 
 | ||||
|  | @ -92,7 +92,7 @@ namespace DetourNavigator | |||
|         } | ||||
| 
 | ||||
|         for (int vertex = 0; vertex < 12; ++vertex) | ||||
|             mFlags.push_back(flags); | ||||
|             mAreaTypes.push_back(areaType); | ||||
| 
 | ||||
|         static const std::array<int, 36> indices {{ | ||||
|             0, 2, 3, | ||||
|  | @ -115,14 +115,14 @@ namespace DetourNavigator | |||
| 
 | ||||
|     std::shared_ptr<RecastMesh> RecastMeshBuilder::create() const | ||||
|     { | ||||
|         return std::make_shared<RecastMesh>(mIndices, mVertices, mFlags, mSettings); | ||||
|         return std::make_shared<RecastMesh>(mIndices, mVertices, mAreaTypes, mSettings); | ||||
|     } | ||||
| 
 | ||||
|     void RecastMeshBuilder::reset() | ||||
|     { | ||||
|         mIndices.clear(); | ||||
|         mVertices.clear(); | ||||
|         mFlags.clear(); | ||||
|         mAreaTypes.clear(); | ||||
|     } | ||||
| 
 | ||||
|     void RecastMeshBuilder::addObject(const btConcaveShape& shape, const btTransform& transform, | ||||
|  |  | |||
|  | @ -20,15 +20,15 @@ namespace DetourNavigator | |||
|     public: | ||||
|         RecastMeshBuilder(const Settings& settings, const TileBounds& bounds); | ||||
| 
 | ||||
|         void addObject(const btCollisionShape& shape, const btTransform& transform, const unsigned char flags); | ||||
|         void addObject(const btCollisionShape& shape, const btTransform& transform, const AreaType areaType); | ||||
| 
 | ||||
|         void addObject(const btCompoundShape& shape, const btTransform& transform, const unsigned char flags); | ||||
|         void addObject(const btCompoundShape& shape, const btTransform& transform, const AreaType areaType); | ||||
| 
 | ||||
|         void addObject(const btConcaveShape& shape, const btTransform& transform, const unsigned char flags); | ||||
|         void addObject(const btConcaveShape& shape, const btTransform& transform, const AreaType areaType); | ||||
| 
 | ||||
|         void addObject(const btHeightfieldTerrainShape& shape, const btTransform& transform, const unsigned char flags); | ||||
|         void addObject(const btHeightfieldTerrainShape& shape, const btTransform& transform, const AreaType areaType); | ||||
| 
 | ||||
|         void addObject(const btBoxShape& shape, const btTransform& transform, const unsigned char flags); | ||||
|         void addObject(const btBoxShape& shape, const btTransform& transform, const AreaType areaType); | ||||
| 
 | ||||
|         std::shared_ptr<RecastMesh> create() const; | ||||
| 
 | ||||
|  | @ -39,7 +39,7 @@ namespace DetourNavigator | |||
|         TileBounds mBounds; | ||||
|         std::vector<int> mIndices; | ||||
|         std::vector<float> mVertices; | ||||
|         std::vector<unsigned char> mFlags; | ||||
|         std::vector<AreaType> mAreaTypes; | ||||
| 
 | ||||
|         void addObject(const btConcaveShape& shape, const btTransform& transform, btTriangleCallback&& callback); | ||||
| 
 | ||||
|  |  | |||
|  | @ -12,20 +12,20 @@ namespace DetourNavigator | |||
|     } | ||||
| 
 | ||||
|     bool RecastMeshManager::addObject(std::size_t id, const btCollisionShape& shape, const btTransform& transform, | ||||
|                                       const unsigned char flags) | ||||
|                                       const AreaType areaType) | ||||
|     { | ||||
|         if (!mObjects.emplace(id, RecastMeshObject(shape, transform, flags)).second) | ||||
|         if (!mObjects.emplace(id, RecastMeshObject(shape, transform, areaType)).second) | ||||
|             return false; | ||||
|         mShouldRebuild = true; | ||||
|         return mShouldRebuild; | ||||
|     } | ||||
| 
 | ||||
|     bool RecastMeshManager::updateObject(std::size_t id, const btTransform& transform, const unsigned char flags) | ||||
|     bool RecastMeshManager::updateObject(std::size_t id, const btTransform& transform, const AreaType areaType) | ||||
|     { | ||||
|         const auto object = mObjects.find(id); | ||||
|         if (object == mObjects.end()) | ||||
|             return false; | ||||
|         if (!object->second.update(transform, flags)) | ||||
|         if (!object->second.update(transform, areaType)) | ||||
|             return false; | ||||
|         mShouldRebuild = true; | ||||
|         return mShouldRebuild; | ||||
|  | @ -59,7 +59,7 @@ namespace DetourNavigator | |||
|             return; | ||||
|         mMeshBuilder.reset(); | ||||
|         for (const auto& v : mObjects) | ||||
|             mMeshBuilder.addObject(v.second.getShape(), v.second.getTransform(), v.second.getFlags()); | ||||
|             mMeshBuilder.addObject(v.second.getShape(), v.second.getTransform(), v.second.getAreaType()); | ||||
|         mShouldRebuild = false; | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -26,9 +26,9 @@ namespace DetourNavigator | |||
|         RecastMeshManager(const Settings& settings, const TileBounds& bounds); | ||||
| 
 | ||||
|         bool addObject(std::size_t id, const btCollisionShape& shape, const btTransform& transform, | ||||
|                        const unsigned char flags); | ||||
|                        const AreaType areaType); | ||||
| 
 | ||||
|         bool updateObject(std::size_t id, const btTransform& transform, const unsigned char flags); | ||||
|         bool updateObject(std::size_t id, const btTransform& transform, const AreaType areaType); | ||||
| 
 | ||||
|         boost::optional<RemovedRecastMeshObject> removeObject(std::size_t id); | ||||
| 
 | ||||
|  |  | |||
|  | @ -9,15 +9,15 @@ | |||
| namespace DetourNavigator | ||||
| { | ||||
|     RecastMeshObject::RecastMeshObject(const btCollisionShape& shape, const btTransform& transform, | ||||
|             const unsigned char flags) | ||||
|             const AreaType areaType) | ||||
|         : mShape(shape) | ||||
|         , mTransform(transform) | ||||
|         , mFlags(flags) | ||||
|         , mChildren(makeChildrenObjects(shape, mFlags)) | ||||
|         , mAreaType(areaType) | ||||
|         , mChildren(makeChildrenObjects(shape, mAreaType)) | ||||
|     { | ||||
|     } | ||||
| 
 | ||||
|     bool RecastMeshObject::update(const btTransform& transform, const unsigned char flags) | ||||
|     bool RecastMeshObject::update(const btTransform& transform, const AreaType areaType) | ||||
|     { | ||||
|         bool result = false; | ||||
|         if (!(mTransform == transform)) | ||||
|  | @ -25,42 +25,43 @@ namespace DetourNavigator | |||
|             mTransform = transform; | ||||
|             result = true; | ||||
|         } | ||||
|         if (mFlags != flags) | ||||
|         if (mAreaType != areaType) | ||||
|         { | ||||
|             mFlags = flags; | ||||
|             mAreaType = areaType; | ||||
|             result = true; | ||||
|         } | ||||
|         if (mShape.get().isCompound()) | ||||
|             result = updateCompoundObject(static_cast<const btCompoundShape&>(mShape.get()), mFlags, mChildren) || result; | ||||
|             result = updateCompoundObject(static_cast<const btCompoundShape&>(mShape.get()), mAreaType, mChildren) | ||||
|                     || result; | ||||
|         return result; | ||||
|     } | ||||
| 
 | ||||
|     bool RecastMeshObject::updateCompoundObject(const btCompoundShape& shape, | ||||
|         const unsigned char flags, std::vector<RecastMeshObject>& children) | ||||
|         const AreaType areaType, std::vector<RecastMeshObject>& children) | ||||
|     { | ||||
|         assert(static_cast<std::size_t>(shape.getNumChildShapes()) == children.size()); | ||||
|         bool result = false; | ||||
|         for (int i = 0, num = shape.getNumChildShapes(); i < num; ++i) | ||||
|         { | ||||
|             assert(shape.getChildShape(i) == std::addressof(children[static_cast<std::size_t>(i)].mShape.get())); | ||||
|             result = children[static_cast<std::size_t>(i)].update(shape.getChildTransform(i), flags) || result; | ||||
|             result = children[static_cast<std::size_t>(i)].update(shape.getChildTransform(i), areaType) || result; | ||||
|         } | ||||
|         return result; | ||||
|     } | ||||
| 
 | ||||
|     std::vector<RecastMeshObject> makeChildrenObjects(const btCollisionShape& shape, const unsigned char flags) | ||||
|     std::vector<RecastMeshObject> makeChildrenObjects(const btCollisionShape& shape, const AreaType areaType) | ||||
|     { | ||||
|         if (shape.isCompound()) | ||||
|             return makeChildrenObjects(static_cast<const btCompoundShape&>(shape), flags); | ||||
|             return makeChildrenObjects(static_cast<const btCompoundShape&>(shape), areaType); | ||||
|         else | ||||
|             return std::vector<RecastMeshObject>(); | ||||
|     } | ||||
| 
 | ||||
|     std::vector<RecastMeshObject> makeChildrenObjects(const btCompoundShape& shape, const unsigned char flags) | ||||
|     std::vector<RecastMeshObject> makeChildrenObjects(const btCompoundShape& shape, const AreaType areaType) | ||||
|     { | ||||
|         std::vector<RecastMeshObject> result; | ||||
|         for (int i = 0, num = shape.getNumChildShapes(); i < num; ++i) | ||||
|             result.emplace_back(*shape.getChildShape(i), shape.getChildTransform(i), flags); | ||||
|             result.emplace_back(*shape.getChildShape(i), shape.getChildTransform(i), areaType); | ||||
|         return result; | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -1,6 +1,8 @@ | |||
| #ifndef OPENMW_COMPONENTS_DETOURNAVIGATOR_RECASTMESHOBJECT_H | ||||
| #define OPENMW_COMPONENTS_DETOURNAVIGATOR_RECASTMESHOBJECT_H | ||||
| 
 | ||||
| #include "areatype.hpp" | ||||
| 
 | ||||
| #include <LinearMath/btTransform.h> | ||||
| 
 | ||||
| #include <functional> | ||||
|  | @ -14,9 +16,9 @@ namespace DetourNavigator | |||
|     class RecastMeshObject | ||||
|     { | ||||
|         public: | ||||
|             RecastMeshObject(const btCollisionShape& shape, const btTransform& transform, const unsigned char flags); | ||||
|             RecastMeshObject(const btCollisionShape& shape, const btTransform& transform, const AreaType areaType); | ||||
| 
 | ||||
|             bool update(const btTransform& transform, const unsigned char flags); | ||||
|             bool update(const btTransform& transform, const AreaType areaType); | ||||
| 
 | ||||
|             const btCollisionShape& getShape() const | ||||
|             { | ||||
|  | @ -28,24 +30,24 @@ namespace DetourNavigator | |||
|                 return mTransform; | ||||
|             } | ||||
| 
 | ||||
|             unsigned char getFlags() const | ||||
|             AreaType getAreaType() const | ||||
|             { | ||||
|                 return mFlags; | ||||
|                 return mAreaType; | ||||
|             } | ||||
| 
 | ||||
|         private: | ||||
|             std::reference_wrapper<const btCollisionShape> mShape; | ||||
|             btTransform mTransform; | ||||
|             unsigned char mFlags; | ||||
|             AreaType mAreaType; | ||||
|             std::vector<RecastMeshObject> mChildren; | ||||
| 
 | ||||
|             static bool updateCompoundObject(const btCompoundShape& shape, const unsigned char flags, | ||||
|             static bool updateCompoundObject(const btCompoundShape& shape, const AreaType areaType, | ||||
|                 std::vector<RecastMeshObject>& children); | ||||
|     }; | ||||
| 
 | ||||
|     std::vector<RecastMeshObject> makeChildrenObjects(const btCollisionShape& shape, const unsigned char flags); | ||||
|     std::vector<RecastMeshObject> makeChildrenObjects(const btCollisionShape& shape, const AreaType areaType); | ||||
| 
 | ||||
|     std::vector<RecastMeshObject> makeChildrenObjects(const btCompoundShape& shape, const unsigned char flags); | ||||
|     std::vector<RecastMeshObject> makeChildrenObjects(const btCompoundShape& shape, const AreaType areaType); | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -10,7 +10,7 @@ namespace DetourNavigator | |||
|     {} | ||||
| 
 | ||||
|     bool TileCachedRecastMeshManager::addObject(std::size_t id, const btCollisionShape& shape, | ||||
|                                                 const btTransform& transform, const unsigned char flags) | ||||
|                                                 const btTransform& transform, const AreaType areaType) | ||||
|     { | ||||
|         bool result = false; | ||||
|         auto& tilesPositions = mObjectsTilesPositions[id]; | ||||
|  | @ -27,7 +27,7 @@ namespace DetourNavigator | |||
|                     tile = mTiles.insert(std::make_pair(tilePosition, | ||||
|                             CachedRecastMeshManager(mSettings, tileBounds))).first; | ||||
|                 } | ||||
|                 if (tile->second.addObject(id, shape, transform, flags)) | ||||
|                 if (tile->second.addObject(id, shape, transform, areaType)) | ||||
|                 { | ||||
|                     lock.unlock(); | ||||
|                     tilesPositions.push_back(tilePosition); | ||||
|  | @ -40,7 +40,7 @@ namespace DetourNavigator | |||
|     } | ||||
| 
 | ||||
|     bool TileCachedRecastMeshManager::updateObject(std::size_t id, const btTransform& transform, | ||||
|         const unsigned char flags) | ||||
|         const AreaType areaType) | ||||
|     { | ||||
|         const auto object = mObjectsTilesPositions.find(id); | ||||
|         if (object == mObjectsTilesPositions.end()) | ||||
|  | @ -51,7 +51,7 @@ namespace DetourNavigator | |||
|         { | ||||
|             const auto tile = mTiles.find(tilePosition); | ||||
|             if (tile != mTiles.end()) | ||||
|                 result = tile->second.updateObject(id, transform, flags) || result; | ||||
|                 result = tile->second.updateObject(id, transform, areaType) || result; | ||||
|         } | ||||
|         lock.unlock(); | ||||
|         if (result) | ||||
|  |  | |||
|  | @ -15,9 +15,9 @@ namespace DetourNavigator | |||
|         TileCachedRecastMeshManager(const Settings& settings); | ||||
| 
 | ||||
|         bool addObject(std::size_t id, const btCollisionShape& shape, const btTransform& transform, | ||||
|                        const unsigned char flags); | ||||
|                        const AreaType areaType); | ||||
| 
 | ||||
|         bool updateObject(std::size_t id, const btTransform& transform, const unsigned char flags); | ||||
|         bool updateObject(std::size_t id, const btTransform& transform, const AreaType areaType); | ||||
| 
 | ||||
|         boost::optional<RemovedRecastMeshObject> removeObject(std::size_t id); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue