diff --git a/Engine/source/navigation/navPath.cpp b/Engine/source/navigation/navPath.cpp index 5e4978afc..93c1a7a28 100644 --- a/Engine/source/navigation/navPath.cpp +++ b/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(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(); 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); diff --git a/Engine/source/navigation/navPath.h b/Engine/source/navigation/navPath.h index 123a625d3..d7ba3d917 100644 --- a/Engine/source/navigation/navPath.h +++ b/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);