Browse Source

Added conversion of Plane to Vector4.

Lasse Öörni 12 years ago
parent
commit
6d38f23467

+ 2 - 6
Source/Engine/Graphics/Camera.cpp

@@ -551,16 +551,12 @@ const Matrix3x4& Camera::GetView() const
 
 
 void Camera::SetReflectionPlaneAttr(Vector4 value)
 void Camera::SetReflectionPlaneAttr(Vector4 value)
 {
 {
-    Plane plane;
-    plane.normal_ = Vector3(value.x_, value.y_, value.z_).Normalized();
-    plane.absNormal_ = plane.normal_.Abs();
-    plane.intercept_ = value.w_;
-    SetReflectionPlane(plane);
+    SetReflectionPlane(Plane(value));
 }
 }
 
 
 Vector4 Camera::GetReflectionPlaneAttr() const
 Vector4 Camera::GetReflectionPlaneAttr() const
 {
 {
-    return Vector4(reflectionPlane_.normal_, reflectionPlane_.intercept_);
+    return reflectionPlane_.ToVector4();
 }
 }
 
 
 void Camera::OnNodeSet(Node* node)
 void Camera::OnNodeSet(Node* node)

+ 3 - 0
Source/Engine/LuaScript/pkgs/Math/Plane.pkg

@@ -7,14 +7,17 @@ class Plane
     Plane(const Plane& plane);
     Plane(const Plane& plane);
     Plane(const Vector3& v0, const Vector3& v1, const Vector3& v2);
     Plane(const Vector3& v0, const Vector3& v1, const Vector3& v2);
     Plane(const Vector3& normal, const Vector3& point);
     Plane(const Vector3& normal, const Vector3& point);
+    Plane(const Vector4& plane);
     ~Plane();
     ~Plane();
     
     
     void Define(const Vector3& v0, const Vector3& v1, const Vector3& v2);
     void Define(const Vector3& v0, const Vector3& v1, const Vector3& v2);
     void Define(const Vector3& normal, const Vector3& point);
     void Define(const Vector3& normal, const Vector3& point);
+    void Define(const Vector4& plane);
 
 
     float Distance(const Vector3& point) const;
     float Distance(const Vector3& point) const;
     Vector3 Reflect(const Vector3& direction) const;
     Vector3 Reflect(const Vector3& direction) const;
     Matrix3x4 ReflectionMatrix() const;
     Matrix3x4 ReflectionMatrix() const;
+    Vector4 ToVector4() const;
 
 
     Vector3 normal_ @ normal;
     Vector3 normal_ @ normal;
     Vector3 absNormal_ @ absNormal;
     Vector3 absNormal_ @ absNormal;

+ 16 - 0
Source/Engine/Math/Plane.h

@@ -56,6 +56,12 @@ public:
         Define(normal, point);
         Define(normal, point);
     }
     }
     
     
+    /// Construct from a 4-dimensional vector, where the w coordinate is the plane parameter.
+    Plane(const Vector4& plane)
+    {
+        Define(plane);
+    }
+    
     /// Define from 3 vertices.
     /// Define from 3 vertices.
     void Define(const Vector3& v0, const Vector3& v1, const Vector3& v2)
     void Define(const Vector3& v0, const Vector3& v1, const Vector3& v2)
     {
     {
@@ -73,12 +79,22 @@ public:
         intercept_ = normal_.DotProduct(point);
         intercept_ = normal_.DotProduct(point);
     }
     }
     
     
+    /// Define from a 4-dimensional vector, where the w coordinate is the plane parameter.
+    void Define(const Vector4& plane)
+    {
+        normal_ = Vector3(plane.x_, plane.y_, plane.z_);
+        absNormal_ = normal_.Abs();
+        intercept_ = plane.w_;
+    }
+    
     /// Return signed distance to a point.
     /// Return signed distance to a point.
     float Distance(const Vector3& point) const { return normal_.DotProduct(point) - intercept_; }
     float Distance(const Vector3& point) const { return normal_.DotProduct(point) - intercept_; }
     /// Reflect a normalized direction vector.
     /// Reflect a normalized direction vector.
     Vector3 Reflect(const Vector3& direction) const { return direction - (2.0f * normal_.DotProduct(direction) * normal_); }
     Vector3 Reflect(const Vector3& direction) const { return direction - (2.0f * normal_.DotProduct(direction) * normal_); }
     /// Return a reflection matrix.
     /// Return a reflection matrix.
     Matrix3x4 ReflectionMatrix() const;
     Matrix3x4 ReflectionMatrix() const;
+    /// Return as a vector.
+    Vector4 ToVector4() const { return Vector4(normal_, intercept_); }
 
 
     /// Plane normal.
     /// Plane normal.
     Vector3 normal_;
     Vector3 normal_;

+ 10 - 2
Source/Engine/Script/MathAPI.cpp

@@ -657,16 +657,21 @@ static void ConstructPlaneCopy(const Plane& plane, Plane* ptr)
     new(ptr) Plane(plane);
     new(ptr) Plane(plane);
 }
 }
 
 
-static void ConstructPlaneInitVertices(const Vector3& v0, const Vector3& v1, const Vector3& v2, Ray* ptr)
+static void ConstructPlaneInitVertices(const Vector3& v0, const Vector3& v1, const Vector3& v2, Plane* ptr)
 {
 {
     new(ptr) Plane(v0, v1, v2);
     new(ptr) Plane(v0, v1, v2);
 }
 }
 
 
-static void ConstructPlaneInitNormalPoint(const Vector3& normal, const Vector3& point, Ray* ptr)
+static void ConstructPlaneInitNormalPoint(const Vector3& normal, const Vector3& point, Plane* ptr)
 {
 {
     new(ptr) Plane(normal, point);
     new(ptr) Plane(normal, point);
 }
 }
 
 
+static void ConstructPlaneInitVector4(const Vector4& plane, Plane* ptr)
+{
+    new(ptr) Plane(plane);
+}
+
 static void RegisterPlane(asIScriptEngine* engine)
 static void RegisterPlane(asIScriptEngine* engine)
 {
 {
     engine->RegisterObjectType("Plane", sizeof(Plane), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_CAK);
     engine->RegisterObjectType("Plane", sizeof(Plane), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_CAK);
@@ -674,10 +679,13 @@ static void RegisterPlane(asIScriptEngine* engine)
     engine->RegisterObjectBehaviour("Plane", asBEHAVE_CONSTRUCT, "void f(const Plane&in)", asFUNCTION(ConstructPlaneCopy), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Plane", asBEHAVE_CONSTRUCT, "void f(const Plane&in)", asFUNCTION(ConstructPlaneCopy), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Plane", asBEHAVE_CONSTRUCT, "void f(const Vector3&in, const Vector3&in, const Vector3&in)", asFUNCTION(ConstructPlaneInitVertices), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Plane", asBEHAVE_CONSTRUCT, "void f(const Vector3&in, const Vector3&in, const Vector3&in)", asFUNCTION(ConstructPlaneInitVertices), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Plane", asBEHAVE_CONSTRUCT, "void f(const Vector3&in, const Vector3&in)", asFUNCTION(ConstructPlaneInitNormalPoint), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Plane", asBEHAVE_CONSTRUCT, "void f(const Vector3&in, const Vector3&in)", asFUNCTION(ConstructPlaneInitNormalPoint), asCALL_CDECL_OBJLAST);
+    engine->RegisterObjectBehaviour("Plane", asBEHAVE_CONSTRUCT, "void f(const Vector4&in)", asFUNCTION(ConstructPlaneInitVector4), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("Plane", "void Define(const Vector3&in, const Vector3&in, const Vector3&in)", asMETHODPR(Plane, Define, (const Vector3&, const Vector3&, const Vector3&), void), asCALL_THISCALL);
     engine->RegisterObjectMethod("Plane", "void Define(const Vector3&in, const Vector3&in, const Vector3&in)", asMETHODPR(Plane, Define, (const Vector3&, const Vector3&, const Vector3&), void), asCALL_THISCALL);
     engine->RegisterObjectMethod("Plane", "void Define(const Vector3&in, const Vector3&in)", asMETHODPR(Plane, Define, (const Vector3&, const Vector3&), void), asCALL_THISCALL);
     engine->RegisterObjectMethod("Plane", "void Define(const Vector3&in, const Vector3&in)", asMETHODPR(Plane, Define, (const Vector3&, const Vector3&), void), asCALL_THISCALL);
+    engine->RegisterObjectMethod("Plane", "void Define(const Vector4&in)", asMETHODPR(Plane, Define, (const Vector4&), void), asCALL_THISCALL);
     engine->RegisterObjectMethod("Plane", "float Distance(const Vector3&in) const", asMETHOD(Plane, Distance), asCALL_THISCALL);
     engine->RegisterObjectMethod("Plane", "float Distance(const Vector3&in) const", asMETHOD(Plane, Distance), asCALL_THISCALL);
     engine->RegisterObjectMethod("Plane", "Vector3 Reflect(const Vector3&in) const", asMETHOD(Plane, Reflect), asCALL_THISCALL);
     engine->RegisterObjectMethod("Plane", "Vector3 Reflect(const Vector3&in) const", asMETHOD(Plane, Reflect), asCALL_THISCALL);
+    engine->RegisterObjectMethod("Plane", "Vector4 ToVector4() const", asMETHOD(Plane, ToVector4), asCALL_THISCALL);
     engine->RegisterObjectMethod("Plane", "Matrix3x4 get_reflectionMatrix() const", asMETHOD(Plane, ReflectionMatrix), asCALL_THISCALL);
     engine->RegisterObjectMethod("Plane", "Matrix3x4 get_reflectionMatrix() const", asMETHOD(Plane, ReflectionMatrix), asCALL_THISCALL);
     engine->RegisterObjectProperty("Plane", "Vector3 normal", offsetof(Plane, normal_));
     engine->RegisterObjectProperty("Plane", "Vector3 normal", offsetof(Plane, normal_));
     engine->RegisterObjectProperty("Plane", "Vector3 absNormal", offsetof(Plane, absNormal_));
     engine->RegisterObjectProperty("Plane", "Vector3 absNormal", offsetof(Plane, absNormal_));