test_nav_mesh_bam.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. from panda3d import navigation
  2. from panda3d import navmeshgen
  3. from panda3d import core
  4. def reconstruct(object):
  5. # Create a temporary buffer, which we first write the object into, and
  6. # subsequently read it from again.
  7. buffer = core.DatagramBuffer()
  8. writer = core.BamWriter(buffer)
  9. writer.init()
  10. writer.write_object(object)
  11. reader = core.BamReader(buffer)
  12. reader.init()
  13. object = reader.read_object()
  14. reader.resolve()
  15. return object
  16. def test_nav_mesh_bam():
  17. data = core.GeomVertexData("", core.GeomVertexFormat.get_v3(), core.Geom.UH_static)
  18. vertex = core.GeomVertexWriter(data, "vertex")
  19. vertex.add_data3((0, 0, 0))
  20. vertex.add_data3((100, 0, 3))
  21. vertex.add_data3((100, 200, 1))
  22. vertex.add_data3((50, 50, 4))
  23. prim = core.GeomTriangles(core.Geom.UH_static)
  24. prim.add_vertices(0, 1, 2)
  25. prim.close_primitive()
  26. geom = core.Geom(data)
  27. geom.add_primitive(prim)
  28. prim.add_vertices(3, 1, 2)
  29. prim.close_primitive()
  30. node = core.GeomNode('gnode')
  31. node.add_geom(geom)
  32. scene = core.NodePath(node)
  33. # Defining navmesh as object of NavMehsBuilder class.
  34. builder = navmeshgen.NavMeshBuilder()
  35. # Extracting geoms from 'scene' and calculating vertices and triangles.
  36. builder.from_node_path(scene)
  37. navmesh = builder.build()
  38. vertCount = navmesh.get_vert_count()
  39. polyCount = navmesh.get_poly_count()
  40. detailVertsCount = navmesh.get_detail_vert_count()
  41. detailTriCount = navmesh.get_detail_tri_count()
  42. navmeshBam = reconstruct(navmesh)
  43. assert type(navmesh) == type(navmeshBam)
  44. assert vertCount == navmeshBam.get_vert_count()
  45. assert polyCount == navmeshBam.get_poly_count()
  46. assert detailVertsCount == navmeshBam.get_detail_vert_count()
  47. assert detailTriCount == navmeshBam.get_detail_tri_count()
  48. def test_nav_mesh_node_bam():
  49. data = core.GeomVertexData("", core.GeomVertexFormat.get_v3(), core.Geom.UH_static)
  50. vertex = core.GeomVertexWriter(data, "vertex")
  51. vertex.add_data3((0, 0, 0))
  52. vertex.add_data3((100, 0, 3))
  53. vertex.add_data3((100, 200, 1))
  54. vertex.add_data3((50, 50, 4))
  55. prim = core.GeomTriangles(core.Geom.UH_static)
  56. prim.add_vertices(0, 1, 2)
  57. prim.close_primitive()
  58. geom = core.Geom(data)
  59. geom.add_primitive(prim)
  60. prim.add_vertices(3, 1, 2)
  61. prim.close_primitive()
  62. node = core.GeomNode('gnode')
  63. node.add_geom(geom)
  64. scene = core.NodePath(node)
  65. # Defining navmesh as object of NavMehsBuilder class.
  66. builder = navmeshgen.NavMeshBuilder()
  67. # Extracting geoms from 'scene' and calculating vertices and triangles.
  68. builder.from_node_path(scene)
  69. navmesh = builder.build()
  70. navmeshnode = navigation.NavMeshNode("navmeshnode",navmesh)
  71. vertCount = navmeshnode.get_nav_mesh().get_vert_count()
  72. polyCount = navmeshnode.get_nav_mesh().get_poly_count()
  73. detailVertsCount = navmeshnode.get_nav_mesh().get_detail_vert_count()
  74. detailTriCount = navmeshnode.get_nav_mesh().get_detail_tri_count()
  75. navmeshNodeBam = reconstruct(navmeshnode)
  76. assert type(navmeshnode) == type(navmeshNodeBam)
  77. assert vertCount == navmeshNodeBam.get_nav_mesh().get_vert_count()
  78. assert polyCount == navmeshNodeBam.get_nav_mesh().get_poly_count()
  79. assert detailVertsCount == navmeshNodeBam.get_nav_mesh().get_detail_vert_count()
  80. assert detailTriCount == navmeshNodeBam.get_nav_mesh().get_detail_tri_count()
  81. def test_nav_query_bam():
  82. data = core.GeomVertexData("", core.GeomVertexFormat.get_v3(), core.Geom.UH_static)
  83. vertex = core.GeomVertexWriter(data, "vertex")
  84. vertex.add_data3((0, 0, 0))
  85. vertex.add_data3((100, 0, 3))
  86. vertex.add_data3((100, 200, 1))
  87. vertex.add_data3((50, 50, 4))
  88. prim = core.GeomTriangles(core.Geom.UH_static)
  89. prim.add_vertices(0, 1, 2)
  90. prim.close_primitive()
  91. geom = core.Geom(data)
  92. geom.add_primitive(prim)
  93. prim.add_vertices(3, 1, 2)
  94. prim.close_primitive()
  95. node = core.GeomNode('gnode')
  96. node.add_geom(geom)
  97. scene = core.NodePath(node)
  98. # Defining navmesh as object of NavMehsBuilder class.
  99. builder = navmeshgen.NavMeshBuilder()
  100. # Extracting geoms from 'scene' and calculating vertices and triangles.
  101. builder.from_node_path(scene)
  102. navmesh = builder.build()
  103. query = navigation.NavMeshQuery(navmesh)
  104. pos = core.LPoint3(50,55,3);
  105. query.nearest_point(pos)
  106. path = query.find_path(pos, core.LPoint3(100,0,3))
  107. navmeshBam = reconstruct(navmesh)
  108. queryBam = navigation.NavMeshQuery(navmeshBam)
  109. posBam = core.LPoint3(50,55,3);
  110. queryBam.nearest_point(posBam)
  111. pathBam = query.find_path(posBam, core.LPoint3(100,0,3))
  112. assert pos == posBam
  113. assert len(path) == len(pathBam)