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

Merge pull request #717 from eightyeight/navpath-always-render

Make NavPath::alwaysRender work the same as NavMesh::alwaysRender
Daniel Buckmaster преди 11 години
родител
ревизия
40cefe1002
променени са 2 файла, в които са добавени 44 реда и са изтрити 13 реда
  1. 42 13
      Engine/source/navigation/navPath.cpp
  2. 2 0
      Engine/source/navigation/navPath.h

+ 42 - 13
Engine/source/navigation/navPath.cpp

@@ -44,7 +44,8 @@ NavPath::NavPath() :
    mFrom(0.0f, 0.0f, 0.0f),
    mTo(0.0f, 0.0f, 0.0f)
 {
-   mTypeMask |= MarkerObjectType;
+   mTypeMask |= StaticShapeObjectType | MarkerObjectType;
+   mNetFlags.clear(Ghostable);
 
    mMesh = NULL;
    mWaypoints = NULL;
@@ -162,6 +163,25 @@ const char *NavPath::getProtectedTo(void *obj, const char *data)
       return "";
 }
 
+bool NavPath::setProtectedAlwaysRender(void *obj, const char *index, const char *data)
+{
+   NavPath *path = static_cast<NavPath*>(obj);
+   bool always = dAtob(data);
+   if(always)
+   {
+      if(!gEditingMission)
+         path->mNetFlags.set(Ghostable);
+   }
+   else
+   {
+      if(!gEditingMission)
+         path->mNetFlags.clear(Ghostable);
+   }
+   path->mAlwaysRender = always;
+   path->setMaskBits(PathMask);
+   return true;
+}
+
 static IRangeValidator NaturalNumber(1, S32_MAX);
 
 void NavPath::initPersistFields()
@@ -188,9 +208,10 @@ void NavPath::initPersistFields()
    endGroup("NavPath");
 
    addGroup("NavPath Render");
-
-   addField("alwaysRender", TypeBool, Offset(mAlwaysRender, NavPath),
-      "Render this NavPath even when not selected.");
+   
+   addProtectedField("alwaysRender", TypeBool, Offset(mAlwaysRender, NavMesh),
+      &setProtectedAlwaysRender, &defaultProtectedGetFn,
+      "Display this NavPath even outside the editor.");
    addField("xray", TypeBool, Offset(mXray, NavPath),
       "Render this NavPath through other objects.");
 
@@ -204,8 +225,10 @@ bool NavPath::onAdd()
    if(!Parent::onAdd())
       return false;
 
+   addToScene();
+
    // Ghost immediately if the editor's already open.
-   if(gEditingMission)
+   if(gEditingMission || mAlwaysRender)
       mNetFlags.set(Ghostable);
 
    // Automatically find a path if we can.
@@ -215,18 +238,15 @@ bool NavPath::onAdd()
    // Set initial world bounds and stuff.
    resize();
 
-   // Finally, add us to the simulation.
-   addToScene();
-
    return true;
 }
 
 void NavPath::onRemove()
 {
-   Parent::onRemove();
-
    // Remove from simulation.
    removeFromScene();
+
+   Parent::onRemove();
 }
 
 bool NavPath::init()
@@ -324,7 +344,9 @@ bool NavPath::plan()
    if(!init())
       return false;
 
-   visitNext();
+   if(!visitNext())
+      return false;
+
    while(update());
 
    if(!finalise())
@@ -476,11 +498,18 @@ S32 NavPath::getCount()
 void NavPath::onEditorEnable()
 {
    mNetFlags.set(Ghostable);
+   if(isClientObject() && !mAlwaysRender)
+      addToScene();
 }
 
 void NavPath::onEditorDisable()
 {
-   mNetFlags.clear(Ghostable);
+   if(!mAlwaysRender)
+   {
+      mNetFlags.clear(Ghostable);
+      if(isClientObject())
+         removeFromScene();
+   }
 }
 
 void NavPath::inspectPostApply()
@@ -501,7 +530,7 @@ void NavPath::prepRenderImage(SceneRenderState *state)
 {
    ObjectRenderInst *ri = state->getRenderPass()->allocInst<ObjectRenderInst>();
    ri->renderDelegate.bind(this, &NavPath::renderSimple);
-   ri->type = RenderPassManager::RIT_Editor;      
+   ri->type = RenderPassManager::RIT_Object;
    ri->translucentSort = true;
    ri->defaultKey = 1;
    state->getRenderPass()->addInst(ri);

+ 2 - 0
Engine/source/navigation/navPath.h

@@ -155,6 +155,8 @@ private:
    static const char *getProtectedMesh(void *obj, const char *data);
    static bool setProtectedWaypoints(void *obj, const char *index, const char *data);
 
+   static bool setProtectedAlwaysRender(void *obj, const char *index, const char *data);
+
    static bool setProtectedFrom(void *obj, const char *index, const char *data);
    static const char *getProtectedFrom(void *obj, const char *data);