diff --git a/GameLogic/GameLogic.vcxproj b/GameLogic/GameLogic.vcxproj index d65db31d..900f0834 100644 --- a/GameLogic/GameLogic.vcxproj +++ b/GameLogic/GameLogic.vcxproj @@ -90,7 +90,7 @@ Level3 Disabled true - %(AdditionalIncludeDirectories) + $(SolutionDir)Misc;$(SolutionDir)OysterMath;$(SolutionDir)OysterPhysics3D;$(SolutionDir)GamePhysics;%(AdditionalIncludeDirectories) true @@ -101,7 +101,7 @@ Level3 Disabled true - %(AdditionalIncludeDirectories) + $(SolutionDir)Misc;$(SolutionDir)OysterMath;$(SolutionDir)OysterPhysics3D;$(SolutionDir)GamePhysics;%(AdditionalIncludeDirectories) true @@ -114,7 +114,7 @@ true true true - %(AdditionalIncludeDirectories) + $(SolutionDir)Misc;$(SolutionDir)OysterMath;$(SolutionDir)OysterPhysics3D;$(SolutionDir)GamePhysics;%(AdditionalIncludeDirectories) true @@ -129,7 +129,7 @@ true true true - %(AdditionalIncludeDirectories) + $(SolutionDir)Misc;$(SolutionDir)OysterMath;$(SolutionDir)OysterPhysics3D;$(SolutionDir)GamePhysics;%(AdditionalIncludeDirectories) true @@ -141,6 +141,15 @@ {104fa3e9-94d9-4e1d-a941-28a03bc8a095} + + {2ec4dded-8f75-4c86-a10b-e1e8eb29f3ee} + + + {f10cbc03-9809-4cba-95d8-327c287b18ee} + + + {4285bd3f-3c6c-4670-b7af-a29afef5f6a8} + diff --git a/GamePhysics/Include/GamePhysics.h b/GamePhysics/Include/GamePhysics.h deleted file mode 100644 index e69de29b..00000000 diff --git a/GamePhysics/Include/PhysicsAPI.h b/GamePhysics/Include/PhysicsAPI.h new file mode 100644 index 00000000..3b40e705 --- /dev/null +++ b/GamePhysics/Include/PhysicsAPI.h @@ -0,0 +1,36 @@ +#ifndef PHYSICS_API_H +#define PHYSICS_API_H + +#include "OysterMath.h" + +namespace Oyster +{ + namespace Physics + { + class API; + class IRigidBody; + class IParticle; + + class API + { + public: + static API & Instance(); + }; + + class IRigidBody + { + public: + + }; + + class IParticle + { + public: + + }; + } + + namespace Collision + {} +} +#endif \ No newline at end of file diff --git a/Misc/Misc.vcxproj b/Misc/Misc.vcxproj index 76714140..58c71f07 100644 --- a/Misc/Misc.vcxproj +++ b/Misc/Misc.vcxproj @@ -142,6 +142,7 @@ + diff --git a/Misc/Misc.vcxproj.filters b/Misc/Misc.vcxproj.filters index 9f5237ac..6f633e1d 100644 --- a/Misc/Misc.vcxproj.filters +++ b/Misc/Misc.vcxproj.filters @@ -29,5 +29,8 @@ Header Files + + Header Files + \ No newline at end of file diff --git a/Misc/Utilities-InlineImpl.h b/Misc/Utilities-InlineImpl.h new file mode 100644 index 00000000..dc047153 --- /dev/null +++ b/Misc/Utilities-InlineImpl.h @@ -0,0 +1,168 @@ +///////////////////////////////////////////////////////////////////// +// Inline and template implementations for +// the Utility Collection of Miscellanious Handy Functions +// © Dan Andersson 2013 +///////////////////////////////////////////////////////////////////// + +#ifndef UTILITIES_INLINE_IMPL_H +#define UTILITIES_INLINE_IMPL_H + +#include "Utilities.h" + +namespace Utility +{ + namespace DynamicMemory + { + template + inline void SafeDeleteInstance( Type *dynamicInstance ) + { + if( dynamicInstance ) + { + delete dynamicInstance; + } + } + + template + void SafeDeleteArray( Type dynamicArray[] ) + { + if( dynamicArray ) + { + delete [] dynamicArray; + } + } + + template + UniquePointer::UniquePointer( Type *assignedInstance ) + { + this->ownedInstance = assignedInstance; + } + + template + UniquePointer::~UniquePointer() + { + SafeDeleteInstance( this->ownedInstance ); + } + + template + UniquePointer & UniquePointer::operator = ( Type *assignedInstance ) + { + SafeDeleteInstance( this->ownedInstance ); + this->ownedInstance = assignedInstance; + return *this; + } + + template + UniquePointer & UniquePointer::operator = ( const UniquePointer &donor ) + { + SafeDeleteInstance( this->ownedInstance ); + this->ownedInstance = donor.ownedInstance; + donor.ownedInstance = NULL; + return *this; + } + + template + UniquePointer::operator Type* () + { + return this->ownedInstance; + } + + template + UniquePointer::operator const Type* () const + { + return this->ownedInstance; + } + + template + Type * UniquePointer::operator -> () + { + return this->ownedInstance; + } + + template + const Type * UniquePointer::operator -> () const + { + return this->ownedInstance; + } + + template + UniquePointer::operator bool() const + { + return this->ownedInstance != NULL; + } + + template + Type* UniquePointer::Release() + { + Type *copy = this->ownedInstance; + this->ownedInstance = NULL; + return copy; + } + + template + inline bool UniquePointer::HaveOwnership() const + { + return this->operator bool(); + } + + template + UniqueArray::UniqueArray( Type assignedArray[] ) + { + this->ownedArray = assignedArray; + } + + template + UniqueArray::~UniqueArray() + { + SafeDeleteArray( this->ownedArray ); + } + + template + UniqueArray & UniqueArray::operator = ( Type assignedArray[] ) + { + SafeDeleteArray( this->ownedArray ); + this->ownedArray = assignedArray; + } + + template + UniqueArray & UniqueArray::operator = ( const UniqueArray &donor ) + { + SafeDeleteArray( this->ownedArray ); + this->ownedArray = donor.ownedInstance; + donor.owned = NULL; + } + + template template + Type & UniqueArray::operator [] ( Index i ) + { + return this->ownedArray[i]; + } + + template template + const Type & UniqueArray::operator [] ( Index i ) const + { + return this->ownedArray[i]; + } + + template + UniqueArray::operator bool () const + { + return this->ownedArray != NULL; + } + + template + Type* UniqueArray::Release() + { + Type *copy = this->ownedArray; + this->ownedArray = NULL; + return copy; + } + + template + inline bool UniqueArray::HaveOwnership() const + { + return this->operator bool(); + } + } +} + +#endif \ No newline at end of file diff --git a/Misc/Utilities.h b/Misc/Utilities.h index ba6e0c3a..950c3933 100644 --- a/Misc/Utilities.h +++ b/Misc/Utilities.h @@ -3,7 +3,6 @@ // © Dan Andersson 2013 ///////////////////////////////////////////////////////////////////// -#pragma once #ifndef UTILITIES_H #define UTILITIES_H @@ -15,100 +14,97 @@ namespace Utility { - namespace Memory + namespace DynamicMemory { + /// If dynamicInstance is not NULL, then delete + template void SafeDeleteInstance( Type *dynamicInstance ); + + /// If dynamicArray is not NULL, then delete [] + template void SafeDeleteArray( Type dynamicArray[] ); + template struct UniquePointer - { + { /// Wrapper to safely transfer dynamic ownership/responsibility public: - UniquePointer( Type *assignedMemory = NULL ); + /// Assigns assignedInstance ownership to this UniquePonter, old owned instance will be deleted. + /// If NULL is assigned is equavalent with clearing all responsibilities from this UniquePointer. + UniquePointer( Type *assignedInstance = NULL ); + + /// Will auto delete assigned dynamic instance. ~UniquePointer(); - UniquePointer & operator = ( Type *assignedMemory ); + /// Assigns assignedInstance ownership to this UniquePonter, old owned instance will be deleted. + /// If NULL is assigned is equavalent with clearing all responsibilities from this UniquePointer. + UniquePointer & operator = ( Type *assignedInstance ); + + /// Transfers assignedInstance ownership from donor to this UniquePonter, old owned instance will be deleted. + /// If donor had nothing, is equavalent with clearing all responsibilities from this UniquePointer. UniquePointer & operator = ( const UniquePointer &donor ); + /// Access the assigned dynamic instance. Will crash if nothing there operator Type* (); - operator const Type* () const; - Type * operator -> (); - const Type * operator -> () const; - template Type & operator [] ( Index i ); - template const Type & operator [] ( Index i ) const; + /// Access the assigned dynamic instance. Will crash if nothing there + operator const Type* () const; + + /// Access members of the assigned dynamic instance. Will crash if nothing there + Type * operator -> (); + + /// Access members of the assigned dynamic instance. Will crash if nothing there + const Type * operator -> () const; + + /// If true, this UniquePointer have a current ownership/responsibility of a dynamic instance. operator bool () const; + /// This UniquePointer drops all claims of ownership/responsibility and returns the dynamic instance. Now it is your responsibility to delete. Type* Release(); - bool haveOwnership() const; - + + /// (inline) If true, this UniquePointer have a current ownership/responsibility of a dynamic instance. + bool HaveOwnership() const; + private: - mutable Type *ownedMemory; + mutable Type *ownedInstance; }; - // IMPLEMENTATIONS //////////////////////////////////////////////// - template - UniquePointer::UniquePointer( Type *assignedMemory ) - { this->ownedMemory = assignedMemory; } + struct UniqueArray + { /// Wrapper to safely transfer dynamic ownership/responsibility + public: + /// Assigns assignedInstance ownership to this UniquePonter, old owned array will be deleted. + /// If NULL is assigned is equavalent with clearing all responsibilities from this UniqueArray. + UniqueArray( Type assignedArray[] = NULL ); + + /// Will auto delete assigned dynamic array. + ~UniqueArray(); - template - UniquePointer::~UniquePointer() - { if( this->ownedMemory ) delete this->ownedMemory; } + /// Assigns assignedInstance ownership to this UniquePonter, old owned array will be deleted. + /// If NULL is assigned is equavalent with clearing all responsibilities from this UniqueArray. + UniqueArray & operator = ( Type assignedArray[] ); + + /// Transfers assignedInstance ownership from donor to this UniquePonter, old owned array will be deleted. + /// If donor had nothing, is equavalent with clearing all responsibilities from this UniqueArray. + UniqueArray & operator = ( const UniqueArray &donor ); - template - UniquePointer & UniquePointer::operator = ( Type *assignedMemory ) - { - if( this->ownedPointer ) delete this->ownedMemory; - this->ownedMemory = assignedMemory; - return *this; - } + /// Accesses the instance at index i of this UniqeArray's owned dynamic array. + /// Will crash if out-of-bound or there is no assigned array. + template Type & operator [] ( Index i ); + + /// Accesses the instance at index i of this UniqeArray's owned dynamic array. + /// Will crash if out-of-bound or there is no assigned array. + template const Type & operator [] ( Index i ) const; - template - UniquePointer & UniquePointer::operator = ( const UniquePointer &donor ) - { - if( this->ownedMemory ) delete this->ownedMemory; - this->ownedMemory = donor.ownedMemory; - donor.ownedMemory = NULL; - return *this; - } + /// If true, this UniqueArray have a current ownership/responsibility of a dynamic instance. + operator bool () const; - template - UniquePointer::operator Type* () - { return this->ownedMemory; } + /// This UniqueArray drops all claims of ownership/responsibility and returns the dynamic array. Now it is your responsibility to delete. + Type* Release(); - template - UniquePointer::operator const Type* () const - { return this->ownedMemory; } + /// (inline) If true, this UniqueArray have a current ownership/responsibility of a dynamic array. + bool HaveOwnership() const; - template - Type * UniquePointer::operator -> () - { return this->ownedMemory; } - - template - const Type * UniquePointer::operator -> () const - { return this->ownedMemory; } - - template template - Type & UniquePointer::operator [] ( Index i ) - { return this->ownedMemory[i]; } - - template template - const Type & UniquePointer::operator [] ( Index i ) const - { return this->ownedMemory[i]; } - - template - UniquePointer::operator bool() const - { return this->ownedMemory != NULL; } - - template - Type* UniquePointer::Release() - { - Type *copy = this->ownedMemory; - this->ownedMemory = NULL; - return copy; - } - - template - inline bool UniquePointer::haveOwnership() const - { return this->operator bool(); } + private: + mutable Type *ownedArray; + }; } namespace String @@ -249,4 +245,6 @@ namespace Utility } } +#include "Utilities-InlineImpl.h" + #endif \ No newline at end of file diff --git a/OysterMath/LinearMath.h b/OysterMath/LinearMath.h index a0dba20e..4a036e99 100644 --- a/OysterMath/LinearMath.h +++ b/OysterMath/LinearMath.h @@ -336,6 +336,19 @@ namespace LinearAlgebra3D 0, 0, 0, 1 ); } + // O0 = T0 * R0 + // O1 = T1 * T0 * R1 * R0 + template + ::LinearAlgebra::Matrix4x4 & UpdateOrientationMatrix( const ::LinearAlgebra::Vector3 &deltaPosition, const ::LinearAlgebra::Matrix4x4 &deltaRotationMatrix, ::LinearAlgebra::Matrix4x4 &orientationMatrix ) + { + ::LinearAlgebra::Vector3 position = deltaPosition + orientationMatrix.v[3].xyz; + orientationMatrix.v[3].xyz = ::LinearAlgebra::Vector3::null; + + orientationMatrix = deltaRotationMatrix * orientationMatrix; + orientationMatrix.v[3].xyz = position; + return orientationMatrix; + } + /* Creates an orthographic projection matrix designed for DirectX enviroment. width; of the projection sample volume. height; of the projection sample volume. diff --git a/OysterMath/OysterMath.cpp b/OysterMath/OysterMath.cpp index 24266a37..84b46b7b 100644 --- a/OysterMath/OysterMath.cpp +++ b/OysterMath/OysterMath.cpp @@ -75,6 +75,9 @@ namespace Oyster { namespace Math3D Float4x4 & InverseOrientationMatrix( const Float4x4 &orientationMatrix, Float4x4 &targetMem ) { return ::LinearAlgebra3D::InverseOrientationMatrix( orientationMatrix, targetMem ); } + Float4x4 & UpdateOrientationMatrix( const Float3 &deltaPosition, const Float4x4 &deltaRotationMatrix, Float4x4 &orientationMatrix ) + { return ::LinearAlgebra3D::UpdateOrientationMatrix( deltaPosition, deltaRotationMatrix, orientationMatrix ); } + Float4x4 & ProjectionMatrix_Orthographic( const Float &width, const Float &height, const Float &nearClip, const Float &farClip, Float4x4 &targetMem ) { return ::LinearAlgebra3D::ProjectionMatrix_Orthographic( width, height, nearClip, farClip, targetMem ); } diff --git a/OysterMath/OysterMath.h b/OysterMath/OysterMath.h index c66f44cc..07ae50d3 100644 --- a/OysterMath/OysterMath.h +++ b/OysterMath/OysterMath.h @@ -183,6 +183,10 @@ namespace Oyster { namespace Math3D /// Oyster's native math library specialized /// If orientationMatrix is assumed to be by all definitions a rigid orientation matrix aka rigid body matrix. Then this is a much faster inverse method. Float4x4 & InverseOrientationMatrix( const Float4x4 &orientationMatrix, Float4x4 &targetMem = Float4x4() ); + // O0 = T0 * R0 + // O1 = T1 * T0 * R1 * R0 + Float4x4 & UpdateOrientationMatrix( const Float3 &deltaPosition, const Float4x4 &deltaRotationMatrix, Float4x4 &orientationMatrix ); + /******************************************************************* * Creates an orthographic projection matrix designed for DirectX enviroment. * @param width; of the projection sample volume. diff --git a/OysterPhysics3D/Box.cpp b/OysterPhysics3D/Box.cpp index 9ba1bb28..a20b8195 100644 --- a/OysterPhysics3D/Box.cpp +++ b/OysterPhysics3D/Box.cpp @@ -19,8 +19,8 @@ Box & Box::operator = ( const Box &box ) return *this; } -::Utility::Memory::UniquePointer Box::Clone( ) const -{ return ::Utility::Memory::UniquePointer( new Box(*this) ); } +::Utility::DynamicMemory::UniquePointer Box::Clone( ) const +{ return ::Utility::DynamicMemory::UniquePointer( new Box(*this) ); } bool Box::Intersects( const ICollideable *target ) const { diff --git a/OysterPhysics3D/Box.h b/OysterPhysics3D/Box.h index be7b29ad..034639d0 100644 --- a/OysterPhysics3D/Box.h +++ b/OysterPhysics3D/Box.h @@ -33,7 +33,7 @@ namespace Oyster { namespace Collision3D Box & operator = ( const Box &box ); - virtual ::Utility::Memory::UniquePointer Clone( ) const; + virtual ::Utility::DynamicMemory::UniquePointer Clone( ) const; bool Intersects( const ICollideable *target ) const; bool Contains( const ICollideable *target ) const; }; diff --git a/OysterPhysics3D/BoxAxisAligned.cpp b/OysterPhysics3D/BoxAxisAligned.cpp index b745646f..c782ed25 100644 --- a/OysterPhysics3D/BoxAxisAligned.cpp +++ b/OysterPhysics3D/BoxAxisAligned.cpp @@ -21,8 +21,8 @@ BoxAxisAligned & BoxAxisAligned::operator = ( const BoxAxisAligned &box ) return *this; } -::Utility::Memory::UniquePointer BoxAxisAligned::Clone( ) const -{ return ::Utility::Memory::UniquePointer( new BoxAxisAligned(*this) ); } +::Utility::DynamicMemory::UniquePointer BoxAxisAligned::Clone( ) const +{ return ::Utility::DynamicMemory::UniquePointer( new BoxAxisAligned(*this) ); } bool BoxAxisAligned::Intersects( const ICollideable *target ) const { diff --git a/OysterPhysics3D/BoxAxisAligned.h b/OysterPhysics3D/BoxAxisAligned.h index e3c91722..9810c39a 100644 --- a/OysterPhysics3D/BoxAxisAligned.h +++ b/OysterPhysics3D/BoxAxisAligned.h @@ -27,7 +27,7 @@ namespace Oyster { namespace Collision3D BoxAxisAligned & operator = ( const BoxAxisAligned &box ); - virtual ::Utility::Memory::UniquePointer Clone( ) const; + virtual ::Utility::DynamicMemory::UniquePointer Clone( ) const; bool Intersects( const ICollideable *target ) const; bool Contains( const ICollideable *target ) const; }; diff --git a/OysterPhysics3D/Frustrum.cpp b/OysterPhysics3D/Frustrum.cpp index 837ba579..e4da0ce9 100644 --- a/OysterPhysics3D/Frustrum.cpp +++ b/OysterPhysics3D/Frustrum.cpp @@ -188,8 +188,8 @@ void Frustrum::WriteToByte( unsigned int &nextIndex, unsigned char targetMem[] ) nextIndex += 6 * ::Utility::StaticArray::NumElementsOf( this->plane[0].byte ); } -::Utility::Memory::UniquePointer Frustrum::Clone( ) const -{ return ::Utility::Memory::UniquePointer( new Frustrum(*this) ); } +::Utility::DynamicMemory::UniquePointer Frustrum::Clone( ) const +{ return ::Utility::DynamicMemory::UniquePointer( new Frustrum(*this) ); } bool Frustrum::Intersects( const ICollideable *target ) const { diff --git a/OysterPhysics3D/Frustrum.h b/OysterPhysics3D/Frustrum.h index a27a8f4a..c711c9af 100644 --- a/OysterPhysics3D/Frustrum.h +++ b/OysterPhysics3D/Frustrum.h @@ -37,7 +37,7 @@ namespace Oyster { namespace Collision3D void Split( Frustrum targetList[], unsigned int numX, unsigned int numY = 1U, unsigned int numZ = 1u ) const; /// DEPRECATED void WriteToByte( unsigned char targetMem[], unsigned int &nextIndex ) const; /// DEPRECATED - virtual ::Utility::Memory::UniquePointer Clone( ) const; + virtual ::Utility::DynamicMemory::UniquePointer Clone( ) const; bool Intersects( const ICollideable *target ) const; bool Contains( const ICollideable *target ) const; }; diff --git a/OysterPhysics3D/ICollideable.h b/OysterPhysics3D/ICollideable.h index b2a74aed..aa6c7891 100644 --- a/OysterPhysics3D/ICollideable.h +++ b/OysterPhysics3D/ICollideable.h @@ -33,7 +33,7 @@ namespace Oyster { namespace Collision3D /// Contains a collection of 3D shapes ICollideable( Type type = Type_undefined ); virtual ~ICollideable(); - virtual ::Utility::Memory::UniquePointer Clone( ) const = 0; + virtual ::Utility::DynamicMemory::UniquePointer Clone( ) const = 0; virtual bool Intersects( const ICollideable *target ) const = 0; virtual bool Contains( const ICollideable *target ) const = 0; }; diff --git a/OysterPhysics3D/Line.cpp b/OysterPhysics3D/Line.cpp index 2afa69d8..7093f6b2 100644 --- a/OysterPhysics3D/Line.cpp +++ b/OysterPhysics3D/Line.cpp @@ -20,8 +20,8 @@ Line & Line::operator = ( const Line &line ) return *this; } -::Utility::Memory::UniquePointer Line::Clone( ) const -{ return ::Utility::Memory::UniquePointer( new Line(*this) ); } +::Utility::DynamicMemory::UniquePointer Line::Clone( ) const +{ return ::Utility::DynamicMemory::UniquePointer( new Line(*this) ); } bool Line::Intersects( const ICollideable *target ) const { diff --git a/OysterPhysics3D/Line.h b/OysterPhysics3D/Line.h index b23ff58f..fecc0bd2 100644 --- a/OysterPhysics3D/Line.h +++ b/OysterPhysics3D/Line.h @@ -28,7 +28,7 @@ namespace Oyster { namespace Collision3D Line & operator = ( const Line &line ); - virtual ::Utility::Memory::UniquePointer Clone( ) const; + virtual ::Utility::DynamicMemory::UniquePointer Clone( ) const; bool Intersects( const ICollideable *target ) const; bool Contains( const ICollideable *target ) const; }; diff --git a/OysterPhysics3D/OysterPhysics3D.h b/OysterPhysics3D/OysterPhysics3D.h index e31aa17b..a5d58c0b 100644 --- a/OysterPhysics3D/OysterPhysics3D.h +++ b/OysterPhysics3D/OysterPhysics3D.h @@ -57,6 +57,15 @@ namespace Oyster { namespace Physics3D return ( momentOfInertia * ::Oyster::Math::Float4(angularVelocity, 0.0f) ).xyz; } + /****************************************************************** + * Returns the local angular momentum of a mass in rotation. + * @todo TODO: improve doc + ******************************************************************/ + inline ::Oyster::Math::Float3 AngularMomentum( const ::Oyster::Math::Float3 linearMomentum, const ::Oyster::Math::Float3 &offset ) + { + return offset.Cross( linearMomentum ); + } + /****************************************************************** * Returns the local tangential momentum at localPos, of a mass in rotation. * @todo TODO: improve doc @@ -160,7 +169,7 @@ namespace Oyster { namespace Physics3D * * @todo TODO: improve doc ******************************************************************/ - inline ::Oyster::Math::Float3 ImpulseTorque( const ::Oyster::Math::Float3 & offset, const ::Oyster::Math::Float3 &impulseForce ) + inline ::Oyster::Math::Float3 ImpulseTorque( const ::Oyster::Math::Float3 & impulseForce, const ::Oyster::Math::Float3 &offset ) { return offset.Cross( impulseForce ); } diff --git a/OysterPhysics3D/Plane.cpp b/OysterPhysics3D/Plane.cpp index 3c89975b..c999324b 100644 --- a/OysterPhysics3D/Plane.cpp +++ b/OysterPhysics3D/Plane.cpp @@ -19,8 +19,8 @@ Plane & Plane::operator = ( const Plane &plane ) return *this; } -::Utility::Memory::UniquePointer Plane::Clone( ) const -{ return ::Utility::Memory::UniquePointer( new Plane(*this) ); } +::Utility::DynamicMemory::UniquePointer Plane::Clone( ) const +{ return ::Utility::DynamicMemory::UniquePointer( new Plane(*this) ); } bool Plane::Intersects( const ICollideable *target ) const { diff --git a/OysterPhysics3D/Plane.h b/OysterPhysics3D/Plane.h index 570161fb..d44c92bd 100644 --- a/OysterPhysics3D/Plane.h +++ b/OysterPhysics3D/Plane.h @@ -27,7 +27,7 @@ namespace Oyster { namespace Collision3D Plane & operator = ( const Plane &plane ); - virtual ::Utility::Memory::UniquePointer Clone( ) const; + virtual ::Utility::DynamicMemory::UniquePointer Clone( ) const; bool Intersects( const ICollideable *target ) const; bool Contains( const ICollideable *target ) const; }; diff --git a/OysterPhysics3D/Point.cpp b/OysterPhysics3D/Point.cpp index 562e7e98..39cc93af 100644 --- a/OysterPhysics3D/Point.cpp +++ b/OysterPhysics3D/Point.cpp @@ -18,8 +18,8 @@ Point & Point::operator = ( const Point &point ) return *this; } -::Utility::Memory::UniquePointer Point::Clone( ) const -{ return ::Utility::Memory::UniquePointer( new Point(*this) ); } +::Utility::DynamicMemory::UniquePointer Point::Clone( ) const +{ return ::Utility::DynamicMemory::UniquePointer( new Point(*this) ); } bool Point::Intersects( const ICollideable *target ) const { diff --git a/OysterPhysics3D/Point.h b/OysterPhysics3D/Point.h index d4ff655b..2529ae0c 100644 --- a/OysterPhysics3D/Point.h +++ b/OysterPhysics3D/Point.h @@ -26,7 +26,7 @@ namespace Oyster { namespace Collision3D Point & operator = ( const Point &point ); - virtual ::Utility::Memory::UniquePointer Clone( ) const; + virtual ::Utility::DynamicMemory::UniquePointer Clone( ) const; bool Intersects( const ICollideable *target ) const; bool Contains( const ICollideable *target ) const; }; diff --git a/OysterPhysics3D/Ray.cpp b/OysterPhysics3D/Ray.cpp index 7675fad7..f7873437 100644 --- a/OysterPhysics3D/Ray.cpp +++ b/OysterPhysics3D/Ray.cpp @@ -19,8 +19,8 @@ Ray & Ray::operator = ( const Ray &ray ) return *this; } -::Utility::Memory::UniquePointer Ray::Clone( ) const -{ return ::Utility::Memory::UniquePointer( new Ray(*this) ); } +::Utility::DynamicMemory::UniquePointer Ray::Clone( ) const +{ return ::Utility::DynamicMemory::UniquePointer( new Ray(*this) ); } bool Ray::Intersects( const ICollideable *target ) const { diff --git a/OysterPhysics3D/Ray.h b/OysterPhysics3D/Ray.h index a5dced1c..4132c0b8 100644 --- a/OysterPhysics3D/Ray.h +++ b/OysterPhysics3D/Ray.h @@ -35,7 +35,7 @@ namespace Oyster { namespace Collision3D Ray & operator = ( const Ray &ray ); - virtual ::Utility::Memory::UniquePointer Clone( ) const; + virtual ::Utility::DynamicMemory::UniquePointer Clone( ) const; bool Intersects( const ICollideable *target ) const; bool Contains( const ICollideable *target ) const; }; diff --git a/OysterPhysics3D/RigidBody.cpp b/OysterPhysics3D/RigidBody.cpp index 306a0bf6..fff6b994 100644 --- a/OysterPhysics3D/RigidBody.cpp +++ b/OysterPhysics3D/RigidBody.cpp @@ -60,8 +60,10 @@ void RigidBody::Update_LeapFrog( Float deltaTime ) deltaRadian = ::std::sqrt( deltaRadian ); rotationAxis /= deltaRadian; - // using rotationAxis, deltaRadian and deltaPos to create a matrix to transform the orientation matrix - this->box.orientation = OrientationMatrix( rotationAxis, deltaRadian, deltaPos ) * this->box.orientation; + // using rotationAxis, deltaRadian and deltaPos to create a matrix to update the orientation matrix + UpdateOrientationMatrix( deltaPos, RotationMatrix(deltaRadian, rotationAxis), this->box.orientation ); + + /** @todo TODO: ISSUE! how is momentOfInertiaTensor related to the orientation of the RigidBody? */ } else { // no rotation, only use deltaPos to translate the RigidBody @@ -85,7 +87,7 @@ void RigidBody::ApplyImpulseForceAt_Local( const Float3 &localForce, const Float if( localOffset != Float3::null ) { this->impulseForceSum += VectorProjection( localForce, localOffset ); - this->impulseTorqueSum += Formula::ImpulseTorque( localOffset, localForce ); + this->impulseTorqueSum += Formula::ImpulseTorque( localForce, localOffset ); } else { @@ -284,138 +286,175 @@ Float3 RigidBody::GetTangentialLinearVelocityAt_World( const Float3 &worldPos ) return this->GetTangentialLinearVelocityAt_Local( (this->GetView() * Float4(worldPos, 1.0f)).xyz ); // should not be any disform thus result.w = 1.0f } -Float3 RigidBody::GetImpulseForceAt_Local( const Float3 &pos ) const -{ // by - return Float3::null; +Float3 RigidBody::GetImpulseForceAt_Local( const Float3 &localPos ) const +{ // by Dan Andersson + return this->impulseForceSum + Formula::TangentialImpulseForce( this->impulseForceSum, localPos ); } -Float3 RigidBody::GetImpulseForceAt_World( const Float3 &pos ) const -{ // by - return Float3::null; +Float3 RigidBody::GetImpulseForceAt_World( const Float3 &worldPos ) const +{ // by Dan Andersson + Float4 localForce = Float4( this->GetImpulseForceAt_Local((this->GetView() * Float4(worldPos, 1.0f)).xyz), 0.0f ); // should not be any disform thus result.w = 1.0f + return (this->box.orientation * localForce).xyz; // should not be any disform thus result.w = 0.0f } -Float3 RigidBody::GetLinearMomentumAt_Local( const Float3 &pos ) const -{ // by - return Float3::null; +Float3 RigidBody::GetLinearMomentumAt_Local( const Float3 &localPos ) const +{ // by Dan Andersson + // Reminder! Momentum is a world value. + return Float3::null; // TODO: } -Float3 RigidBody::GetLinearMomentumAt_World( const Float3 &pos ) const -{ // by - return Float3::null; +Float3 RigidBody::GetLinearMomentumAt_World( const Float3 &worldPos ) const +{ // by Dan Andersson + // Reminder! Momentum is a world value. + Float4 localMomentum = Float4( this->GetLinearMomentumAt_Local((this->GetView() * Float4(worldPos, 1.0f)).xyz), 0.0f ); // should not be any disform thus result.w = 1.0f + return (this->box.orientation * localMomentum).xyz; // should not be any disform thus result.w = 0.0f + + // TODO: angularMomentum is a local value!! + return this->linearMomentum + Formula::TangentialLinearMomentum( this->angularMomentum, worldPos ); } -Float3 RigidBody::GetImpulseAccelerationAt_Local( const Float3 &pos ) const -{ // by - return Float3::null; +Float3 RigidBody::GetImpulseAccelerationAt_Local( const Float3 &localPos ) const +{ // by Dan Andersson + // Reminder! Acceleration is a world value. + Float4 worldAccel = Float4( this->GetImpulseAccelerationAt_Local((this->box.orientation * Float4(localPos, 1.0f)).xyz), 0.0f ); // should not be any disform thus result.w = 1.0f + return (this->GetView() * worldAccel).xyz; // should not be any disform thus result.w = 0.0f } -Float3 RigidBody::GetImpulseAccelerationAt_World( const Float3 &pos ) const -{ // by - return Float3::null; +Float3 RigidBody::GetImpulseAccelerationAt_World( const Float3 &worldPos ) const +{ // by Dan Andersson + // Reminder! Acceleration is a world value. + return Formula::LinearImpulseAcceleration( this->mass, this->impulseForceSum ) + + Formula::TangentialImpulseAcceleration( this->momentOfInertiaTensor.GetInverse(), this->impulseTorqueSum, worldPos ); } -Float3 RigidBody::GetLinearVelocityAt_Local( const Float3 &pos ) const -{ // by - return Float3::null; +Float3 RigidBody::GetLinearVelocityAt_Local( const Float3 &localPos ) const +{ // by Dan Andersson + // Reminder! Velocity is a world value. + Float4 worldV = Float4( this->GetLinearVelocityAt_Local((this->box.orientation * Float4(localPos, 1.0f)).xyz), 0.0f ); // should not be any disform thus result.w = 1.0f + return (this->GetView() * worldV).xyz; // should not be any disform thus result.w = 0.0f } -Float3 RigidBody::GetLinearVelocityAt_World( const Float3 &pos ) const -{ // by - return Float3::null; +Float3 RigidBody::GetLinearVelocityAt_World( const Float3 &worldPos ) const +{ // by Dan Andersson + // Reminder! Velocity is a world value. + return Formula::LinearVelocity( this->mass, this->linearMomentum ) + + Formula::TangentialLinearVelocity( this->momentOfInertiaTensor.GetInverse(), this->angularMomentum, worldPos ); } void RigidBody::SetMomentOfInertia( const Float4x4 &i ) -{ // by - +{ // by Dan Andersson + if( i.GetDeterminant() != 0.0f ) // insanitycheck! momentOfInertiaTensor must be invertable + { + this->momentOfInertiaTensor = i; + } } void RigidBody::SetMass_KeepVelocity( const Float &m ) -{ // by - +{ // by Dan Andersson + if( m != 0.0f ) // insanitycheck! mass must be invertable + { + Float3 velocity = Formula::LinearVelocity( this->mass, this->linearMomentum ); + this->mass = m; + this->linearMomentum = Formula::LinearMomentum( this->mass, velocity ); + } } void RigidBody::SetMass_KeepMomentum( const Float &m ) -{ // by - +{ // by Dan Anderson + if( m != 0.0f ) // insanitycheck! mass must be invertable + { + this->mass = m; + } } void RigidBody::SetOrientation( const Float4x4 &o ) -{ // by - +{ // by Dan Andersson + this->box.orientation = o; } void RigidBody::SetSize( const Float3 &widthHeight ) -{ // by - +{ // by Dan Andersson + this->box.boundingOffset = 0.5f * widthHeight; } void RigidBody::SetCenter( const Float3 &p ) -{ // by - +{ // by Dan Andersson + this->box.center = p; } -void RigidBody::SetImpulsTorque( const Float3 &t ) -{ // by - +void RigidBody::SetImpulseTorque( const Float3 &t ) +{ // by Dan Andersson + this->impulseTorqueSum = t; } void RigidBody::SetAngularMomentum( const Float3 &h ) -{ // by - +{ // by Dan Andersson + this->angularMomentum = h; } void RigidBody::SetAngularImpulseAcceleration( const Float3 &a ) -{ // by - +{ // by Dan Andersson + this->impulseTorqueSum = Formula::ImpulseTorque( this->momentOfInertiaTensor, a ); } void RigidBody::SetAngularVelocity( const Float3 &w ) -{ // by - +{ // by Dan Andersson + this->angularMomentum = Formula::AngularMomentum( this->momentOfInertiaTensor, w ); } void RigidBody::SetImpulseForce( const Float3 &f ) -{ // by - +{ // by Dan Andersson + this->impulseForceSum = f; } void RigidBody::SetLinearMomentum( const Float3 &g ) -{ // by - +{ // by Dan Andersson + this->linearMomentum = g; } void RigidBody::SetLinearImpulseAcceleration( const Float3 &a ) -{ // by - +{ // by Dan Andersson + this->impulseForceSum = Formula::ImpulseForce( this->mass, a ); } void RigidBody::SetLinearVelocity( const Float3 &v ) -{ // by - +{ // by Dan Andersson + this->linearMomentum = Formula::LinearMomentum( this->mass, v ); } void RigidBody::SetImpulseForceAt_Local( const Float3 &localForce, const Float3 &localPos ) -{ // by +{ // by Dan Andersson + // Reminder! Impulse force and torque is world values. + Float3 worldForce = ( this->box.orientation * Float4(localForce, 0.0f) ).xyz, + worldPos = ( this->box.orientation * Float4(localPos, 1.0f) ).xyz; + this->SetImpulseForceAt_World( worldForce, worldPos ); } void RigidBody::SetImpulseForceAt_World( const Float3 &worldForce, const Float3 &worldPos ) -{ // by - +{ // by Dan Andersson + // Reminder! Impulse force and torque is world values. + this->impulseForceSum = VectorProjection( worldForce, worldPos ); + this->impulseTorqueSum = Formula::ImpulseTorque( worldForce, worldPos ); } -void RigidBody::SetLinearMomentumAt_Local( const Float3 &g, const Float3 &pos ) -{ // by - +void RigidBody::SetLinearMomentumAt_Local( const Float3 &localG, const Float3 &localPos ) +{ // by Dan Andersson + // Reminder! Linear and angular momentum is world values. + Float3 worldG = ( this->box.orientation * Float4(localG, 0.0f) ).xyz, + worldPos = ( this->box.orientation * Float4(localPos, 1.0f) ).xyz; + this->SetLinearMomentumAt_World( worldG, worldPos ); } -void RigidBody::SetLinearMomentumAt_World( const Float3 &g, const Float3 &pos ) -{ // by - +void RigidBody::SetLinearMomentumAt_World( const Float3 &worldG, const Float3 &worldPos ) +{ // by Dan Andersson + // Reminder! Linear and angular momentum is world values. + this->linearMomentum = VectorProjection( worldG, worldPos ); + this->angularMomentum = Formula::AngularMomentum( worldG, worldPos ); } void RigidBody::SetImpulseAccelerationAt_Local( const Float3 &a, const Float3 &pos ) -{ // by +{ // by Dan Andersson } diff --git a/OysterPhysics3D/RigidBody.h b/OysterPhysics3D/RigidBody.h index bb0dcc7d..a2d32f95 100644 --- a/OysterPhysics3D/RigidBody.h +++ b/OysterPhysics3D/RigidBody.h @@ -96,7 +96,7 @@ namespace Oyster { namespace Physics3D void SetSize( const ::Oyster::Math::Float3 &widthHeight ); void SetCenter( const ::Oyster::Math::Float3 &p ); - void SetImpulsTorque( const ::Oyster::Math::Float3 &t ); + void SetImpulseTorque( const ::Oyster::Math::Float3 &t ); void SetAngularMomentum( const ::Oyster::Math::Float3 &h ); void SetAngularImpulseAcceleration( const ::Oyster::Math::Float3 &a ); void SetAngularVelocity( const ::Oyster::Math::Float3 &w ); diff --git a/OysterPhysics3D/Sphere.cpp b/OysterPhysics3D/Sphere.cpp index b0f14cf3..f138208c 100644 --- a/OysterPhysics3D/Sphere.cpp +++ b/OysterPhysics3D/Sphere.cpp @@ -15,8 +15,8 @@ Sphere & Sphere::operator = ( const Sphere &sphere ) return *this; } -::Utility::Memory::UniquePointer Sphere::Clone( ) const -{ return ::Utility::Memory::UniquePointer( new Sphere(*this) ); } +::Utility::DynamicMemory::UniquePointer Sphere::Clone( ) const +{ return ::Utility::DynamicMemory::UniquePointer( new Sphere(*this) ); } bool Sphere::Intersects( const ICollideable *target ) const { diff --git a/OysterPhysics3D/Sphere.h b/OysterPhysics3D/Sphere.h index 9d8c4c8f..881c8928 100644 --- a/OysterPhysics3D/Sphere.h +++ b/OysterPhysics3D/Sphere.h @@ -26,7 +26,7 @@ namespace Oyster { namespace Collision3D Sphere & operator = ( const Sphere &sphere ); - virtual ::Utility::Memory::UniquePointer Clone( ) const; + virtual ::Utility::DynamicMemory::UniquePointer Clone( ) const; bool Intersects( const ICollideable *target ) const; bool Contains( const ICollideable *target ) const; }; diff --git a/OysterPhysics3D/Universe.cpp b/OysterPhysics3D/Universe.cpp index ee02144b..f473ff2c 100644 --- a/OysterPhysics3D/Universe.cpp +++ b/OysterPhysics3D/Universe.cpp @@ -2,7 +2,7 @@ #include "OysterCollision3D.h" using namespace ::Oyster::Collision3D; -using namespace ::Utility::Memory; +using namespace ::Utility::DynamicMemory; Universe::Universe() : ICollideable(Type_universe) {} Universe::~Universe() {} diff --git a/OysterPhysics3D/Universe.h b/OysterPhysics3D/Universe.h index 74b93108..fd06a454 100644 --- a/OysterPhysics3D/Universe.h +++ b/OysterPhysics3D/Universe.h @@ -18,7 +18,7 @@ namespace Oyster { namespace Collision3D Universe & operator = ( const Universe &universe ); - virtual ::Utility::Memory::UniquePointer Clone( ) const; + virtual ::Utility::DynamicMemory::UniquePointer Clone( ) const; bool Intersects( const ICollideable *target ) const; bool Contains( const ICollideable *target ) const; };