Преглед на файлове

To be safe, store the navmesh data for later serialization before Recast patches it.

Lasse Öörni преди 12 години
родител
ревизия
49ec63e620
променени са 2 файла, в които са добавени 14 реда и са изтрити 25 реда
  1. 9 23
      Engine/Navigation/NavigationMesh.cpp
  2. 5 2
      Engine/Navigation/NavigationMesh.h

+ 9 - 23
Engine/Navigation/NavigationMesh.cpp

@@ -103,7 +103,7 @@ void NavigationMesh::RegisterObject(Context* context)
     ACCESSOR_ATTRIBUTE(NavigationMesh, VAR_FLOAT, "Edge Max Error", GetEdgeMaxError, SetEdgeMaxError, float, DEFAULT_EDGE_MAX_ERROR, AM_DEFAULT);
     ACCESSOR_ATTRIBUTE(NavigationMesh, VAR_FLOAT, "Detail Sample Distance", GetDetailSampleDistance, SetDetailSampleDistance, float, DEFAULT_DETAIL_SAMPLE_DISTANCE, AM_DEFAULT);
     ACCESSOR_ATTRIBUTE(NavigationMesh, VAR_FLOAT, "Detail Sample Max Error", GetDetailSampleMaxError, SetDetailSampleMaxError, float, DEFAULT_DETAIL_SAMPLE_MAX_ERROR, AM_DEFAULT);
-    ACCESSOR_ATTRIBUTE(NavigationMesh, VAR_BUFFER, "Navigation Data", GetNavigationDataAttr, SetNavigationDataAttr, PODVector<unsigned char>, Variant::emptyBuffer, AM_FILE | AM_NOEDIT);
+    REF_ACCESSOR_ATTRIBUTE(NavigationMesh, VAR_BUFFER, "Navigation Data", GetNavigationDataAttr, SetNavigationDataAttr, PODVector<unsigned char>, Variant::emptyBuffer, AM_FILE | AM_NOEDIT);
 }
 
 void NavigationMesh::SetCellSize(float size)
@@ -349,42 +349,28 @@ bool NavigationMesh::Build()
             return false;
         }
         
+        // Before creating the navmesh (which modifies the data) copy the data for serialization
+        navigationDataAttr_.Resize(navDataSize);
+        memcpy(&navigationDataAttr_[0], navData, navDataSize);
+        
         ReleaseBuildData();
         return CreateNavMesh(navData, navDataSize);
     }
 }
 
-void NavigationMesh::SetNavigationDataAttr(PODVector<unsigned char> data)
+void NavigationMesh::SetNavigationDataAttr(const PODVector<unsigned char>& data)
 {
+    navigationDataAttr_ = data;
     if (!data.Size())
         return;
     
-    /// \todo Would be preferable not to have to make a copy of the data
+    /// \todo Would be preferable not to have to make a copy of the data, however Recast modifies it when creating the navmesh
     unsigned char* navData = (unsigned char*)dtAlloc(data.Size(), DT_ALLOC_PERM);
-    memcpy(navData, &data[0], data.Size());
+    memcpy(navData, &navigationDataAttr_[0], navigationDataAttr_.Size());
     
     CreateNavMesh(navData, data.Size());
 }
 
-PODVector<unsigned char> NavigationMesh::GetNavigationDataAttr() const
-{
-    PODVector<unsigned char> ret;
-    
-    const dtNavMesh* navMesh = navMesh_;
-    
-    if (navMesh && navMesh->getMaxTiles() > 0)
-    {
-        const dtMeshTile* tile = navMesh->getTile(0);
-        if (tile)
-        {
-            ret.Resize(tile->dataSize);
-            memcpy(&ret[0], tile->data, tile->dataSize);
-        }
-    }
-    
-    return ret;
-}
-
 void NavigationMesh::CollectGeometries(Node* node, Node* baseNode)
 {
     // If find a navigable from a child node that's not the current base node, abort so we're not going to add the geometry twice

+ 5 - 2
Engine/Navigation/NavigationMesh.h

@@ -108,9 +108,9 @@ public:
     bool IsInitialized() const { return navMesh_ != 0; }
     
     /// Set navigation data attribute.
-    void SetNavigationDataAttr(PODVector<unsigned char> data);
+    void SetNavigationDataAttr(const PODVector<unsigned char>& data);
     /// Get navigation data attribute.
-    PODVector<unsigned char> GetNavigationDataAttr() const;
+    const PODVector<unsigned char>& GetNavigationDataAttr() const { return navigationDataAttr_; }
     
 private:
     /// Visit nodes and collect navigable geometry.
@@ -168,6 +168,9 @@ private:
     rcPolyMeshDetail* polyMeshDetail_;
     /// Detour navmesh.
     dtNavMesh* navMesh_;
+    
+    /// Navigation data attribute. Contains the unmodified Recast data.
+    PODVector<unsigned char> navigationDataAttr_;
 };
 
 }