Przeglądaj źródła

Added OffMeshConnection component. Not yet used in the navigation mesh.

Lasse Öörni 12 lat temu
rodzic
commit
464335c726

+ 4 - 0
Bin/Data/UI/EditorIcons.xml

@@ -119,6 +119,10 @@
         <attribute name="Texture" value="Texture2D;Textures/EditorIcons.png" />
         <attribute name="Image Rect" value="80 16 94 30" />
     </element>
+    <element type="OffMeshConnection">
+        <attribute name="Texture" value="Texture2D;Textures/EditorIcons.png" />
+        <attribute name="Image Rect" value="96 16 110 30" />
+    </element>
     <element type="RootUIElement">
         <attribute name="Texture" value="Texture2D;Textures/EditorIcons.png" />
         <attribute name="Image Rect" value="0 32 14 46" />

+ 13 - 0
Engine/Engine/NavigationAPI.cpp

@@ -24,6 +24,7 @@
 #include "APITemplates.h"
 #include "Navigable.h"
 #include "NavigationMesh.h"
+#include "OffMeshConnection.h"
 
 namespace Urho3D
 {
@@ -84,10 +85,22 @@ void RegisterNavigationMesh(asIScriptEngine* engine)
     engine->RegisterObjectMethod("NavigationMesh", "IntVector2 get_numTiles() const", asMETHOD(NavigationMesh, GetNumTiles), asCALL_THISCALL);
 }
 
+void RegisterOffMeshConnection(asIScriptEngine* engine)
+{
+    RegisterComponent<OffMeshConnection>(engine, "OffMeshConnection");
+    engine->RegisterObjectMethod("OffMeshConnection", "void set_endPoint(Node@+)", asMETHOD(OffMeshConnection, SetEndPoint), asCALL_THISCALL);
+    engine->RegisterObjectMethod("OffMeshConnection", "Node@+ get_endPoint() const", asMETHOD(OffMeshConnection, GetEndPoint), asCALL_THISCALL);
+    engine->RegisterObjectMethod("OffMeshConnection", "void set_radius(float)", asMETHOD(OffMeshConnection, SetRadius), asCALL_THISCALL);
+    engine->RegisterObjectMethod("OffMeshConnection", "float get_radius() const", asMETHOD(OffMeshConnection, GetRadius), asCALL_THISCALL);
+    engine->RegisterObjectMethod("OffMeshConnection", "void set_bidirectional(bool)", asMETHOD(OffMeshConnection, SetBidirectional), asCALL_THISCALL);
+    engine->RegisterObjectMethod("OffMeshConnection", "bool get_bidirectional() const", asMETHOD(OffMeshConnection, IsBidirectional), asCALL_THISCALL);
+}
+
 void RegisterNavigationAPI(asIScriptEngine* engine)
 {
     RegisterNavigable(engine);
     RegisterNavigationMesh(engine);
+    RegisterOffMeshConnection(engine);
 }
 
 }

+ 2 - 0
Engine/Navigation/Navigation.cpp

@@ -23,6 +23,7 @@
 #include "Precompiled.h"
 #include "Navigable.h"
 #include "NavigationMesh.h"
+#include "OffMeshConnection.h"
 
 #include "DebugNew.h"
 
@@ -33,6 +34,7 @@ void RegisterNavigationLibrary(Context* context)
 {
     Navigable::RegisterObject(context);
     NavigationMesh::RegisterObject(context);
+    OffMeshConnection::RegisterObject(context);
 }
 
 }

+ 117 - 0
Engine/Navigation/OffMeshConnection.cpp

@@ -0,0 +1,117 @@
+//
+// Copyright (c) 2008-2013 the Urho3D project.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+#include "Precompiled.h"
+#include "Context.h"
+#include "DebugRenderer.h"
+#include "OffMeshConnection.h"
+#include "Scene.h"
+
+#include "DebugNew.h"
+
+namespace Urho3D
+{
+
+OBJECTTYPESTATIC(OffMeshConnection);
+
+static const float DEFAULT_RADIUS = 1.0f;
+
+OffMeshConnection::OffMeshConnection(Context* context) :
+    Component(context),
+    endPointID_(0),
+    radius_(DEFAULT_RADIUS),
+    bidirectional_(true),
+    endPointDirty_(false)
+{
+}
+
+OffMeshConnection::~OffMeshConnection()
+{
+}
+
+void OffMeshConnection::RegisterObject(Context* context)
+{
+    context->RegisterFactory<OffMeshConnection>();
+    
+    ACCESSOR_ATTRIBUTE(OffMeshConnection, VAR_BOOL, "Is Enabled", IsEnabled, SetEnabled, bool, true, AM_DEFAULT);
+    ATTRIBUTE(OffMeshConnection, VAR_INT, "Endpoint NodeID", endPointID_, 0, AM_DEFAULT | AM_NODEID);
+    ATTRIBUTE(OffMeshConnection, VAR_FLOAT, "Radius", radius_, DEFAULT_RADIUS, AM_DEFAULT);
+    ATTRIBUTE(OffMeshConnection, VAR_BOOL, "Bidirectional", bidirectional_, true, AM_DEFAULT);
+}
+
+void OffMeshConnection::OnSetAttribute(const AttributeInfo& attr, const Variant& src)
+{
+    Component::OnSetAttribute(attr, src);
+    
+    if (attr.offset_ == offsetof(OffMeshConnection, endPointID_))
+        endPointDirty_ = true;
+}
+
+void OffMeshConnection::ApplyAttributes()
+{
+    if (endPointDirty_)
+    {
+        Scene* scene = GetScene();
+        endPoint_ = scene ? scene->GetNode(endPointID_) : (Node*)0;
+        endPointDirty_ = false;
+    }
+}
+
+void OffMeshConnection::DrawDebugGeometry(DebugRenderer* debug, bool depthTest)
+{
+    if (!node_ || !endPoint_)
+        return;
+    
+    Vector3 start = node_->GetWorldPosition();
+    Vector3 end = endPoint_->GetWorldPosition();
+    Vector3 halfWay = (start + end) * 0.5f;
+    halfWay.y_ += 1.0f;
+    
+    debug->AddLine(start, halfWay, Color::WHITE, depthTest);
+    debug->AddLine(halfWay, end, Color::WHITE, depthTest);
+}
+
+void OffMeshConnection::SetRadius(float radius)
+{
+    radius_ = radius;
+    MarkNetworkUpdate();
+}
+
+void OffMeshConnection::SetBidirectional(bool enabled)
+{
+    bidirectional_ = enabled;
+    MarkNetworkUpdate();
+}
+
+void OffMeshConnection::SetEndPoint(Node* node)
+{
+    endPoint_ = node;
+    endPointID_ = node ? node->GetID() : 0;
+    MarkNetworkUpdate();
+}
+
+Node* OffMeshConnection::GetEndPoint() const
+{
+    return endPoint_;
+}
+
+}

+ 77 - 0
Engine/Navigation/OffMeshConnection.h

@@ -0,0 +1,77 @@
+//
+// Copyright (c) 2008-2013 the Urho3D project.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+#pragma once
+
+#include "Component.h"
+
+namespace Urho3D
+{
+
+/// A link between otherwise unconnected regions of the navigation mesh.
+class OffMeshConnection : public Component
+{
+    OBJECT(OffMeshConnection);
+    
+public:
+    /// Construct.
+    OffMeshConnection(Context* context);
+    /// Destruct.
+    virtual ~OffMeshConnection();
+    /// Register object factory.
+    static void RegisterObject(Context* context);
+    
+    /// Handle attribute write access.
+    virtual void OnSetAttribute(const AttributeInfo& attr, const Variant& src);
+    /// Apply attribute changes that can not be applied immediately. Called after scene load or a network update.
+    virtual void ApplyAttributes();
+    /// Visualize the component as debug geometry.
+    virtual void DrawDebugGeometry(DebugRenderer* debug, bool depthTest);
+    
+    /// Set endpoint node.
+    void SetEndPoint(Node* node);
+    /// Set radius.
+    void SetRadius(float radius);
+    /// Set bidirectional flag. Default true.
+    void SetBidirectional(bool enabled);
+    
+    /// Return endpoint node.
+    Node* GetEndPoint() const;
+    /// Return radius.
+    float GetRadius() const { return radius_; }
+    /// Return whether is bidirectional.
+    bool IsBidirectional() const { return bidirectional_; }
+    
+private:
+    /// Endpoint node.
+    WeakPtr<Node> endPoint_;
+    /// Endpoint node ID.
+    unsigned endPointID_;
+    /// Radius.
+    float radius_;
+    /// Bidirectional flag.
+    bool bidirectional_;
+    /// Endpoint changed flag.
+    bool endPointDirty_;
+};
+
+}