diff --git a/Code/GamePhysics/GamePhysics.vcxproj b/Code/GamePhysics/GamePhysics.vcxproj
index 797fdb2c..f3a87a2a 100644
--- a/Code/GamePhysics/GamePhysics.vcxproj
+++ b/Code/GamePhysics/GamePhysics.vcxproj
@@ -145,7 +145,11 @@
-
+
+
+
+
+
diff --git a/Code/GamePhysics/GamePhysics.vcxproj.filters b/Code/GamePhysics/GamePhysics.vcxproj.filters
index b8f7f1a0..07661556 100644
--- a/Code/GamePhysics/GamePhysics.vcxproj.filters
+++ b/Code/GamePhysics/GamePhysics.vcxproj.filters
@@ -16,16 +16,21 @@
{f2cb55b8-47a0-45c7-8dce-5b93f945a57b}
-
- {cac9a78f-f09b-4850-b1aa-ea87e8368678}
-
{792daa4b-b2f7-4664-9529-71a929365274}
-
+
Header Files\Include
+
+ Header Files\Implementation
+
+
+
+
+ Source Files
+
\ No newline at end of file
diff --git a/Code/GamePhysics/Implementation/PhysicsAPI_Impl.cpp b/Code/GamePhysics/Implementation/PhysicsAPI_Impl.cpp
new file mode 100644
index 00000000..09d0b1b5
--- /dev/null
+++ b/Code/GamePhysics/Implementation/PhysicsAPI_Impl.cpp
@@ -0,0 +1,63 @@
+#include "PhysicsAPI_Impl.h"
+
+using namespace Oyster;
+using namespace Physics;
+
+API_Impl instance;
+
+API & Instance()
+{
+ return instance;
+}
+
+API_Impl::API_Impl()
+{
+ /** @todo TODO: Fix this constructor.*/
+}
+
+API_Impl::~API_Impl()
+{
+ /** @todo TODO: Fix this destructor.*/
+}
+
+void API_Impl::SetDeltaTime( float deltaTime )
+{
+ /** @todo TODO: Fix this function.*/
+}
+void API_Impl::SetGravityConstant( float g )
+{
+ /** @todo TODO: Fix this function.*/
+}
+void API_Impl::SetAction( EventAction_Collision functionPointer )
+{
+ /** @todo TODO: Fix this function.*/
+}
+void API_Impl::SetAction( EventAction_Destruction functionPointer )
+{
+ /** @todo TODO: Fix this function.*/
+}
+
+void API_Impl::Update()
+{
+ /** @todo TODO: Fix this function.*/
+}
+
+void API_Impl::MoveToLimbo( unsigned int objRef )
+{
+ /** @todo TODO: Fix this function.*/
+}
+void API_Impl::ReleaseFromLimbo( unsigned int objRef )
+{
+ /** @todo TODO: Fix this function.*/
+}
+
+unsigned int API_Impl::AddObject( ::Utility::DynamicMemory::UniquePointer handle )
+{
+ /** @todo TODO: Fix this function.*/
+
+ return 0;
+}
+void API_Impl::DestroyObject( unsigned int objRef )
+{
+ /** @todo TODO: Fix this function.*/
+}
\ No newline at end of file
diff --git a/Code/GamePhysics/Implementation/PhysicsAPI_Impl.h b/Code/GamePhysics/Implementation/PhysicsAPI_Impl.h
new file mode 100644
index 00000000..445080b5
--- /dev/null
+++ b/Code/GamePhysics/Implementation/PhysicsAPI_Impl.h
@@ -0,0 +1,34 @@
+#ifndef PHYSICS_API_IMPL_H
+#define PHYSICS_API_IMPL_H
+
+#include "../PhysicsAPI.h"
+
+namespace Oyster
+{
+ namespace Physics
+ {
+ class API_Impl : public API
+ {
+ public:
+ API_Impl();
+ virtual ~API_Impl();
+
+ void SetDeltaTime( float deltaTime );
+ void SetGravityConstant( float g );
+ void SetAction( EventAction_Collision functionPointer );
+ void SetAction( EventAction_Destruction functionPointer );
+
+ void Update();
+
+ void MoveToLimbo( unsigned int objRef );
+ void ReleaseFromLimbo( unsigned int objRef );
+
+ unsigned int AddObject( ::Utility::DynamicMemory::UniquePointer handle );
+ void DestroyObject( unsigned int objRef );
+ };
+
+ }
+
+}
+
+#endif
\ No newline at end of file
diff --git a/Code/GamePhysics/PhysicsAPI.h b/Code/GamePhysics/PhysicsAPI.h
new file mode 100644
index 00000000..d9ae0a59
--- /dev/null
+++ b/Code/GamePhysics/PhysicsAPI.h
@@ -0,0 +1,76 @@
+#ifndef PHYSICS_API_H
+#define PHYSICS_API_H
+
+#include "OysterCollision3D.h"
+#include "OysterMath.h"
+#include "Utilities.h"
+
+namespace Oyster
+{
+ namespace Physics
+ {
+ class API;
+ class IRigidBody;
+ class IParticle;
+
+ enum UpdateState
+ {
+ resting,
+ altered
+ };
+
+ namespace Constant
+ {
+ const float gravity_constant = (const float)6.67284e-11; // The _big_G_! ( N(m/kg)^2 ) Used in real gravityforcefields.
+ }
+
+ class API
+ {
+ public:
+ typedef void (*EventAction_Collision)( unsigned int, unsigned int );
+ typedef void (*EventAction_Destruction)( unsigned int, ::Utility::DynamicMemory::UniquePointer );
+
+ static API & Instance();
+
+ virtual void SetDeltaTime( float deltaTime ) = 0;
+ virtual void SetGravityConstant( float g ) = 0;
+ virtual void SetAction( EventAction_Collision functionPointer ) = 0;
+ virtual void SetAction( EventAction_Destruction functionPointer ) = 0;
+
+ virtual void Update() = 0;
+
+ virtual bool IsInLimbo( unsigned int objRef ) = 0;
+ virtual void MoveToLimbo( unsigned int objRef ) = 0;
+ virtual void ReleaseFromLimbo( unsigned int objRef ) = 0;
+
+ virtual unsigned int AddObject( ::Utility::DynamicMemory::UniquePointer handle ) = 0;
+ virtual ::Utility::DynamicMemory::UniquePointer ExtractObject( unsigned int objRef ) = 0;
+ virtual void DestroyObject( unsigned int objRef ) = 0;
+ };
+
+ class IRigidBody
+ {
+ public:
+ virtual ~IRigidBody() {};
+
+ virtual UpdateState Update( ::Oyster::Math::Float timeStepLength ) = 0;
+
+ virtual bool IsSubscribingCollisions() const = 0;
+ virtual bool IsIntersecting( const IRigidBody &object, ::Oyster::Math::Float &deltaWhen, ::Oyster::Math::Float3 &worldPointOfContact ) = 0;
+
+ virtual unsigned int GetReference() const = 0;
+ virtual ::Oyster::Collision3D::Sphere & GetBoundingSphere( ::Oyster::Collision3D::Sphere &targetMem = ::Oyster::Collision3D::Sphere() ) const = 0;
+ virtual ::Oyster::Math::Float3 & GetNormalAt( const ::Oyster::Math::Float3 &worldPos, ::Oyster::Math::Float3 &targetMem = ::Oyster::Math::Float3() ) const = 0;
+ };
+
+ class IParticle
+ {
+ public:
+
+ };
+ }
+
+ namespace Collision
+ {}
+}
+#endif
\ No newline at end of file
diff --git a/Code/Misc/Misc.vcxproj b/Code/Misc/Misc.vcxproj
index 58c71f07..ca39cada 100644
--- a/Code/Misc/Misc.vcxproj
+++ b/Code/Misc/Misc.vcxproj
@@ -69,21 +69,29 @@
$(SolutionDir)..\External\Lib\$(ProjectName)\
$(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\
$(ProjectName)_$(PlatformShortName)D
+ C:\Program Files %28x86%29\Visual Leak Detector\include;$(IncludePath)
+ C:\Program Files %28x86%29\Visual Leak Detector\lib\Win32;$(LibraryPath)
$(SolutionDir)..\External\Lib\$(ProjectName)\
$(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\
$(ProjectName)_$(PlatformShortName)
+ C:\Program Files %28x86%29\Visual Leak Detector\include;$(IncludePath)
+ C:\Program Files %28x86%29\Visual Leak Detector\lib\Win32;$(LibraryPath)
$(SolutionDir)..\External\Lib\$(ProjectName)\
$(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\
$(ProjectName)_$(PlatformShortName)D
+ C:\Program Files %28x86%29\Visual Leak Detector\include;$(IncludePath)
+ C:\Program Files %28x86%29\Visual Leak Detector\lib\Win64;$(LibraryPath)
$(SolutionDir)..\External\Lib\$(ProjectName)\
$(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\
$(ProjectName)_$(PlatformShortName)
+ C:\Program Files %28x86%29\Visual Leak Detector\include;$(IncludePath)
+ C:\Program Files %28x86%29\Visual Leak Detector\lib\Win64;$(LibraryPath)
@@ -138,10 +146,21 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Misc/Misc.vcxproj.filters b/Code/Misc/Misc.vcxproj.filters
index 6f633e1d..abee7ddd 100644
--- a/Code/Misc/Misc.vcxproj.filters
+++ b/Code/Misc/Misc.vcxproj.filters
@@ -21,6 +21,24 @@
Source Files
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
@@ -32,5 +50,20 @@
Header Files
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
\ No newline at end of file
diff --git a/Code/Misc/Resource/Loaders/ByteLoader.cpp b/Code/Misc/Resource/Loaders/ByteLoader.cpp
new file mode 100644
index 00000000..622d3a71
--- /dev/null
+++ b/Code/Misc/Resource/Loaders/ByteLoader.cpp
@@ -0,0 +1,176 @@
+/////////////////////////////////////////////////////////////////////
+// Created by [Dennis Andersen] [2013]
+/////////////////////////////////////////////////////////////////////
+
+#include "..\OResource.h"
+#include "..\..\Utilities.h"
+
+#include
+
+using namespace Oyster::Resource;
+bool readANSI = false;
+
+
+
+bool ReadFromFile(const wchar_t fileName[], const wchar_t openFlag[], std::wstring& outData, size_t elemSize)
+{
+ size_t bytesTotal = 0;
+ size_t bytesRead = 0;
+ FILE *stream;
+
+ if( _wfopen_s( &stream, fileName, openFlag ) == 0 )
+ {
+ //Get size of the file
+ fseek(stream, 0L, SEEK_END);
+ bytesTotal = ftell(stream);
+ fseek(stream, 0L, SEEK_SET);
+
+ //Sanity check
+ if(bytesTotal == 0) return false;
+
+ //Create the new byte buffer
+ wchar_t *buff = new wchar_t[bytesTotal + 1];
+
+ //Read the bytes to the end
+ bytesRead = fread_s( buff, bytesTotal, elemSize, bytesTotal ,stream );
+ fclose( stream );
+
+ //Did we read enough bytes
+ if(!readANSI && bytesRead != bytesTotal) return false;
+
+ //Add delimiter
+ buff[bytesRead] = L'\0';
+
+ outData.resize(bytesTotal);
+ outData = buff;
+
+ delete [] buff;
+ }
+ else
+ {
+ std::wstring msg = L"Failed to open file: \n";
+ msg.append(fileName);
+
+ return false;
+ }
+
+ return true;
+}
+bool ReadFromFile(const wchar_t fileName[], const char openFlag[], std::string& outData, size_t elemSize)
+{
+ std::string sFilename;
+ std::wstring wsFile = fileName;
+ ::Utility::String::WStringToString(wsFile, sFilename);
+ size_t bytesTotal = 0;
+ size_t bytesRead = 0;
+ FILE *stream;
+
+ if( fopen_s( &stream, sFilename.c_str(), openFlag ) == 0 )
+ {
+ //Get size of the file
+ fseek(stream, 0L, SEEK_END);
+ bytesTotal = ftell(stream);
+ fseek(stream, 0L, SEEK_SET);
+ fflush(stream);
+
+ //Sanity check
+ if(bytesTotal == 0) return false;
+
+ //Create the new byte buffer
+ char *buff = new char[bytesTotal + 1];
+
+ //Read the bytes to the end
+ bytesRead = fread_s( buff, bytesTotal, elemSize, bytesTotal ,stream );
+ fclose( stream );
+
+ //Did we read enough bytes (Get the bytes if we read with ANSI since the hidden characters is ignored)
+ if(!readANSI && bytesRead != bytesTotal) return false;
+
+ buff[bytesRead + 1];
+
+ outData.clear();
+ outData.resize(bytesRead);
+ memcpy(&outData[0], &buff[0], bytesRead);
+
+ delete [] buff;
+ }
+ else
+ {
+ std::string msg = "Failed to open file: \n";
+ msg.append(sFilename.c_str());
+
+ return false;
+ }
+
+ return true;
+}
+
+
+OResource* OResource::ByteLoader(const wchar_t filename[], ResourceType type, OResource* old)
+{
+ OResource *resource = old;
+ std::wstring wOut;
+ std::string sOut;
+ bool success = false;
+
+ switch (type)
+ {
+ case Oyster::Resource::ResourceType_Byte_Raw:
+ success = ReadFromFile(filename, "rb", sOut, sizeof(char));
+ break;
+
+ case Oyster::Resource::ResourceType_Byte_ANSI:
+ readANSI = true;
+ success = ReadFromFile(filename, "r", sOut, sizeof(char));
+ readANSI = false;
+ break;
+
+ case Oyster::Resource::ResourceType_Byte_UTF8:
+ success = ReadFromFile(filename, "r, ccs=UTF-8", sOut, sizeof(char));
+ break;
+
+ case Oyster::Resource::ResourceType_Byte_UNICODE:
+ success = ReadFromFile(filename, "r, ccs=UNICODE", sOut, sizeof(char));
+ break;
+
+ case Oyster::Resource::ResourceType_Byte_UTF16LE:
+ success = ReadFromFile(filename, "r, ccs=UTF-16LE", sOut, sizeof(char));
+ break;
+ }
+
+ if(!success) return 0;
+ if(wOut.size())
+ {
+ //const wchar_t *data = new wchar_t[wOut.size()];
+ //resource = new OResource((void*)data, type, (sizeof(wchar_t) * wOut.size()), sizeof(wchar_t), filename);
+ }
+ else if(sOut.size())
+ {
+ char *data = new char[sOut.size()+1];
+ data[sOut.size()] = '\0';
+ memcpy(&data[0], &sOut[0], sOut.size());
+
+ if(!old)
+ {
+ resource = new OResource((OHRESOURCE)data, type, (sizeof(char) * sOut.size()), sizeof(char), filename);
+ }
+ else
+ {
+ old->resourceData = (OHRESOURCE)data;
+ }
+ }
+ return resource;
+}
+
+void OResource::ByteUnloader()
+{
+ delete [] ((char*)this->resourceData);
+ this->resourceData = 0;
+}
+
+OResource* OResource::ByteReloader()
+{
+ ByteUnloader();
+ return ByteLoader(this->resourceFilename.c_str(), this->resourceType, this);
+}
+
diff --git a/Code/Misc/Resource/Loaders/CustomLoader.cpp b/Code/Misc/Resource/Loaders/CustomLoader.cpp
new file mode 100644
index 00000000..312c4c53
--- /dev/null
+++ b/Code/Misc/Resource/Loaders/CustomLoader.cpp
@@ -0,0 +1,45 @@
+/////////////////////////////////////////////////////////////////////
+// Created by [Dennis Andersen] [2013]
+/////////////////////////////////////////////////////////////////////
+
+#include "..\OResource.h"
+#include "..\..\Utilities.h"
+
+#include
+
+using namespace Oyster::Resource;
+
+
+OResource* OResource::CustomLoader(const wchar_t filename[], CustomLoadFunction fnc)
+{
+ const CustomData &data = fnc(filename);
+
+ if(!data.loadedData) return 0;
+ if(!data.resourceUnloadFnc) return 0;
+
+ OResource *resource = new OResource((OHRESOURCE)data.loadedData, ResourceType_UNKNOWN, 0, 0, filename);
+
+ resource->customData = new CustomResourceData();
+ resource->customData->unloadingFunction = data.resourceUnloadFnc;
+ resource->resourceData = (OHRESOURCE)data.loadedData;
+ resource->customData->loadingFunction = fnc;
+
+ return resource;
+}
+void OResource::CustomUnloader()
+{
+ this->customData->unloadingFunction((void*)this->resourceData);
+}
+OResource* OResource::CustomReloader()
+{
+ CustomUnloader();
+
+ const CustomData &data = this->customData->loadingFunction(this->resourceFilename.c_str());
+ this->resourceData = (OHRESOURCE)data.loadedData;
+
+ if(data.resourceUnloadFnc)
+ this->customData->unloadingFunction = data.resourceUnloadFnc;
+
+ return this;
+}
+
diff --git a/Code/Misc/Resource/OResource.cpp b/Code/Misc/Resource/OResource.cpp
new file mode 100644
index 00000000..4311669f
--- /dev/null
+++ b/Code/Misc/Resource/OResource.cpp
@@ -0,0 +1,86 @@
+/////////////////////////////////////////////////////////////////////
+// Created by [Dennis Andersen] [2013]
+/////////////////////////////////////////////////////////////////////
+
+#include "OResource.h"
+
+using namespace Oyster::Resource;
+
+OResource::OResource(OHRESOURCE handle, ResourceType type, size_t resourceSize, size_t elementSize, ::std::wstring filename)
+ : resourceData (handle)
+ , resourceFilename (filename)
+ , resourceSize (resourceSize)
+ , resourceElementSize (elementSize)
+ , resourceType (type)
+ , customData (0)
+{
+
+}
+OResource::~OResource()
+{}
+
+
+OResource* OResource::Load (const wchar_t filename[], ResourceType type)
+{
+ switch (type)
+ {
+ case Oyster::Resource::ResourceType_Byte_Raw:
+ case Oyster::Resource::ResourceType_Byte_ANSI:
+ case Oyster::Resource::ResourceType_Byte_UTF8:
+ case Oyster::Resource::ResourceType_Byte_UNICODE:
+ case Oyster::Resource::ResourceType_Byte_UTF16LE:
+ return OResource::ByteLoader(filename, type);
+ break;
+ }
+
+ return 0;
+}
+OResource* OResource::Load (const wchar_t filename[], CustomLoadFunction loadFnc)
+{
+ return OResource::CustomLoader(filename, loadFnc);
+}
+OResource* OResource::Reload (OResource* resource)
+{
+ if(!resource) return 0;
+
+ switch (resource->resourceType)
+ {
+ case Oyster::Resource::ResourceType_Byte_Raw:
+ case Oyster::Resource::ResourceType_Byte_ANSI:
+ case Oyster::Resource::ResourceType_Byte_UTF8:
+ case Oyster::Resource::ResourceType_Byte_UNICODE:
+ case Oyster::Resource::ResourceType_Byte_UTF16LE:
+ resource->ByteReloader();
+ break;
+
+ case Oyster::Resource::ResourceType_UNKNOWN:
+ resource->CustomReloader();
+ break;
+ }
+
+ return resource;
+}
+bool OResource::Release (OResource* resource)
+{
+ if(resource->resourceRef.Decref() == 0)
+ {
+ switch (resource->resourceType)
+ {
+ case Oyster::Resource::ResourceType_Byte_Raw:
+ case Oyster::Resource::ResourceType_Byte_ANSI:
+ case Oyster::Resource::ResourceType_Byte_UTF8:
+ case Oyster::Resource::ResourceType_Byte_UNICODE:
+ case Oyster::Resource::ResourceType_Byte_UTF16LE:
+ resource->ByteUnloader();
+ break;
+
+ case Oyster::Resource::ResourceType_UNKNOWN:
+ resource->CustomUnloader();
+ break;
+ }
+ return true;
+ }
+ return false;
+}
+
+
diff --git a/Code/Misc/Resource/OResource.h b/Code/Misc/Resource/OResource.h
new file mode 100644
index 00000000..c0e32ba5
--- /dev/null
+++ b/Code/Misc/Resource/OResource.h
@@ -0,0 +1,73 @@
+/////////////////////////////////////////////////////////////////////
+// Created by [Dennis Andersen] [2013]
+/////////////////////////////////////////////////////////////////////
+
+#ifndef MISC_O_RESOURCE_H
+#define MISC_O_RESOURCE_H
+
+#include "..\Utilities.h"
+#include "OysterResource.h"
+#include
+
+namespace Oyster
+{
+ namespace Resource
+ {
+ class OResource
+ {
+ public:
+ struct CustomResourceData
+ {
+ CustomLoadFunction loadingFunction;
+ CustomUnloadFunction unloadingFunction;
+ };
+
+ public:
+ OResource(OHRESOURCE handle, ResourceType type, size_t size, size_t elementSize, ::std::wstring resourceFilename);
+ virtual~ OResource();
+
+ inline ResourceType GetResourceType() const
+ { return this->resourceType; }
+ inline const wchar_t* GetResourceFilename() const
+ { return this->resourceFilename.c_str(); }
+ inline OHRESOURCE GetResourceHandle() const
+ { return this->resourceData; }
+ inline unsigned long long GetResourceSize() const
+ { return this->resourceSize; }
+ inline unsigned long long GetResourceElementSize() const
+ { return this->resourceElementSize; }
+ inline unsigned int GetResourceID() const
+ { return this->resourceID; }
+ inline void SetResourceID(unsigned int id)
+ { this->resourceID = id; }
+
+ public:
+ static OResource* Load (const wchar_t filename[], ResourceType type);
+ static OResource* Load (const wchar_t filename[], CustomLoadFunction loadFnc);
+ static OResource* Reload (OResource* resource);
+ static bool Release (OResource* resource);
+
+ Utility::DynamicMemory::ReferenceCount resourceRef;
+
+ private:
+ static OResource* ByteLoader (const wchar_t filename[], ResourceType type, OResource* old = 0);
+ void ByteUnloader ();
+ OResource* ByteReloader ();
+
+ static OResource* CustomLoader (const wchar_t filename[], CustomLoadFunction loadFnc);
+ void CustomUnloader ();
+ OResource* CustomReloader ();
+
+ OHRESOURCE resourceData;
+ ResourceType resourceType;
+ size_t resourceSize;
+ size_t resourceElementSize;
+ ::std::wstring resourceFilename;
+ unsigned int resourceID;
+
+ CustomResourceData *customData;
+ };
+ }
+}
+
+#endif
\ No newline at end of file
diff --git a/Code/Misc/Resource/OResourceHandler.cpp b/Code/Misc/Resource/OResourceHandler.cpp
new file mode 100644
index 00000000..9d911875
--- /dev/null
+++ b/Code/Misc/Resource/OResourceHandler.cpp
@@ -0,0 +1,180 @@
+/////////////////////////////////////////////////////////////////////
+// Created by [Dennis Andersen] [2013]
+/////////////////////////////////////////////////////////////////////
+
+
+#include "OysterResource.h"
+#include "OResource.h"
+#include
+#include