diff --git a/Simulations/Demo_2022.vcxproj b/Simulations/Demo_2022.vcxproj
index c00be70..29ed9f5 100644
--- a/Simulations/Demo_2022.vcxproj
+++ b/Simulations/Demo_2022.vcxproj
@@ -224,12 +224,14 @@
+
+
diff --git a/Simulations/Demo_2022.vcxproj.filters b/Simulations/Demo_2022.vcxproj.filters
new file mode 100644
index 0000000..f0b4caa
--- /dev/null
+++ b/Simulations/Demo_2022.vcxproj.filters
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Simulations/MassPoint.h b/Simulations/MassPoint.h
new file mode 100644
index 0000000..eefdc30
--- /dev/null
+++ b/Simulations/MassPoint.h
@@ -0,0 +1,8 @@
+#pragma once
+#include "util/vectorbase.h"
+
+struct MassPoint {
+ GamePhysics::Vec3 position;
+ GamePhysics::Vec3 velocity;
+ bool isFixed;
+};
diff --git a/Simulations/MassSpringSystemSimulator.cpp b/Simulations/MassSpringSystemSimulator.cpp
new file mode 100644
index 0000000..93103fe
--- /dev/null
+++ b/Simulations/MassSpringSystemSimulator.cpp
@@ -0,0 +1,127 @@
+#include "MassSpringSystemSimulator.h"
+
+MassSpringSystemSimulator::MassSpringSystemSimulator()
+{
+ //Test only
+ //auto first = addMassPoint(Vec3(0, 0, 1), Vec3(0, 0, 0), true);
+ //auto second = addMassPoint(Vec3(0, 0, 0), Vec3(0, 0, 0), true);
+ //addSpring(first, second, 2.0);
+}
+
+const char* MassSpringSystemSimulator::getTestCasesStr()
+{
+ return nullptr;
+}
+
+void MassSpringSystemSimulator::initUI(DrawingUtilitiesClass* DUC)
+{
+ this->DUC = DUC;
+}
+
+void MassSpringSystemSimulator::reset()
+{
+}
+
+void MassSpringSystemSimulator::drawFrame(ID3D11DeviceContext* pd3dImmediateContext)
+{
+ for (size_t i = 0; i < springs.size(); i++) {
+ auto sp = springs.at(i);
+ if (!sp.isValid())
+ {
+ springs.erase(springs.begin() + i);
+ continue;
+ }
+ auto mp1 = sp.mp1.lock();
+ auto mp2 = sp.mp2.lock();
+ DUC->setUpLighting(Vec3(), 0.4 * Vec3(1, 1, 1), 100, 0.6 * Vec3(0.97, 0.86, 1));
+
+ DUC->drawSphere(mp1->position, Vec3(0.01));
+ DUC->drawSphere(mp2->position, Vec3(0.01));
+
+ DUC->beginLine();
+ DUC->drawLine(mp1->position, Vec3(1,0,0), mp2->position, Vec3(0,1,0));
+ DUC->endLine();
+ }
+}
+
+void MassSpringSystemSimulator::notifyCaseChanged(int testCase)
+{
+}
+
+void MassSpringSystemSimulator::externalForcesCalculations(float timeElapsed)
+{
+}
+
+void MassSpringSystemSimulator::simulateTimestep(float timeStep)
+{
+}
+
+void MassSpringSystemSimulator::onClick(int x, int y)
+{
+}
+
+void MassSpringSystemSimulator::onMouse(int x, int y)
+{
+}
+
+void MassSpringSystemSimulator::setMass(float mass)
+{
+}
+
+void MassSpringSystemSimulator::setStiffness(float stiffness)
+{
+}
+
+void MassSpringSystemSimulator::setDampingFactor(float damping)
+{
+}
+
+int MassSpringSystemSimulator::addMassPoint(Vec3 position, Vec3 Velocity, bool isFixed)
+{
+ MassPoint masspoint;
+ masspoint.position = position;
+ masspoint.velocity = Velocity;
+ masspoint.isFixed = isFixed;
+ masspoints.push_back(std::make_shared(masspoint));
+
+ return masspoints.size() - 1;
+}
+
+void MassSpringSystemSimulator::addSpring(int masspoint1, int masspoint2, float initialLength)
+{
+ auto mp1 = masspoints.at(masspoint1);
+ auto mp2 = masspoints.at(masspoint2);
+
+ Spring spring;
+ spring.mp1 = mp1;
+ spring.mp2 = mp2;
+ spring.initialLength = initialLength;
+
+ springs.push_back(spring);
+}
+
+int MassSpringSystemSimulator::getNumberOfMassPoints()
+{
+ return masspoints.size();
+}
+
+int MassSpringSystemSimulator::getNumberOfSprings()
+{
+ return springs.size();
+}
+
+Vec3 MassSpringSystemSimulator::getPositionOfMassPoint(int index)
+{
+ auto mp = masspoints.at(index);
+ return mp->position;
+}
+
+Vec3 MassSpringSystemSimulator::getVelocityOfMassPoint(int index)
+{
+ auto mp = masspoints.at(index);
+ return mp->velocity;
+}
+
+void MassSpringSystemSimulator::applyExternalForce(Vec3 force)
+{
+}
diff --git a/Simulations/MassSpringSystemSimulator.h b/Simulations/MassSpringSystemSimulator.h
index 82891b3..4e8642c 100644
--- a/Simulations/MassSpringSystemSimulator.h
+++ b/Simulations/MassSpringSystemSimulator.h
@@ -1,6 +1,8 @@
#ifndef MASSSPRINGSYSTEMSIMULATOR_h
#define MASSSPRINGSYSTEMSIMULATOR_h
#include "Simulator.h"
+#include "MassPoint.h"
+#include "Spring.h"
// Do Not Change
#define EULER 0
@@ -54,5 +56,9 @@ private:
Point2D m_mouse;
Point2D m_trackmouse;
Point2D m_oldtrackmouse;
+
+ //Mass points and springs
+ std::vector> masspoints;
+ std::vector springs;
};
#endif
\ No newline at end of file
diff --git a/Simulations/Spring.cpp b/Simulations/Spring.cpp
new file mode 100644
index 0000000..e69de29
diff --git a/Simulations/Spring.h b/Simulations/Spring.h
new file mode 100644
index 0000000..27447f1
--- /dev/null
+++ b/Simulations/Spring.h
@@ -0,0 +1,11 @@
+#pragma once
+
+struct Spring
+{
+ std::weak_ptr mp1;
+ std::weak_ptr mp2;
+ float initialLength;
+
+ bool isValid() { return !mp1.expired() && !mp2.expired(); }
+};
+
diff --git a/Simulations/main.cpp b/Simulations/main.cpp
index 017be58..dc2d07a 100644
--- a/Simulations/main.cpp
+++ b/Simulations/main.cpp
@@ -20,8 +20,8 @@ using namespace GamePhysics;
//#define ADAPTIVESTEP
-#define TEMPLATE_DEMO
-//#define MASS_SPRING_SYSTEM
+//#define TEMPLATE_DEMO
+#define MASS_SPRING_SYSTEM
//#define RIGID_BODY_SYSTEM
//#define SPH_SYSTEM
diff --git a/SimulatorTester/SimulatorTester_2022.vcxproj b/SimulatorTester/SimulatorTester_2022.vcxproj
index 050724a..140dc0a 100644
--- a/SimulatorTester/SimulatorTester_2022.vcxproj
+++ b/SimulatorTester/SimulatorTester_2022.vcxproj
@@ -172,9 +172,6 @@
{e0b52ae7-e160-4d32-bf3f-910b785e5a8e}
-
- {7329b02d-c504-482a-a156-181d48ce493c}
-
{85344b7f-5aa0-4e12-a065-d1333d11f6ca}
diff --git a/Template_2022.sln b/Template_2022.sln
index 592f272..6a43592 100644
--- a/Template_2022.sln
+++ b/Template_2022.sln
@@ -13,8 +13,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DXUT", "DXUT11\Core\DXUT_Di
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DXUTOpt", "DXUT11\Optional\DXUTOpt_DirectXTK_2022.vcxproj", "{61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MakeSpriteFont22", "DirectXTK\MakeSpriteFont\MakeSpriteFont22.csproj", "{7329B02D-C504-482A-A156-181D48CE493C}"
-EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AntTweakBar", "AntTweakBar\src\AntTweakBar_2022.vcxproj", "{B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTK_Desktop_2022", "DirectXTK\DirectXTK_Desktop_2022.vcxproj", "{E0B52AE7-E160-4D32-BF3F-910B785E5A8E}"
@@ -29,6 +27,22 @@ Global
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {0B7BAA5B-0753-4015-A8F3-8FA540FC8660}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0B7BAA5B-0753-4015-A8F3-8FA540FC8660}.Debug|Win32.Build.0 = Debug|Win32
+ {0B7BAA5B-0753-4015-A8F3-8FA540FC8660}.Debug|x64.ActiveCfg = Debug|x64
+ {0B7BAA5B-0753-4015-A8F3-8FA540FC8660}.Debug|x64.Build.0 = Debug|x64
+ {0B7BAA5B-0753-4015-A8F3-8FA540FC8660}.Release|Win32.ActiveCfg = Release|Win32
+ {0B7BAA5B-0753-4015-A8F3-8FA540FC8660}.Release|Win32.Build.0 = Release|Win32
+ {0B7BAA5B-0753-4015-A8F3-8FA540FC8660}.Release|x64.ActiveCfg = Release|x64
+ {0B7BAA5B-0753-4015-A8F3-8FA540FC8660}.Release|x64.Build.0 = Release|x64
+ {3CABED2C-12F1-4408-AAAE-E2185A426F35}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3CABED2C-12F1-4408-AAAE-E2185A426F35}.Debug|Win32.Build.0 = Debug|Win32
+ {3CABED2C-12F1-4408-AAAE-E2185A426F35}.Debug|x64.ActiveCfg = Debug|x64
+ {3CABED2C-12F1-4408-AAAE-E2185A426F35}.Debug|x64.Build.0 = Debug|x64
+ {3CABED2C-12F1-4408-AAAE-E2185A426F35}.Release|Win32.ActiveCfg = Release|Win32
+ {3CABED2C-12F1-4408-AAAE-E2185A426F35}.Release|Win32.Build.0 = Release|Win32
+ {3CABED2C-12F1-4408-AAAE-E2185A426F35}.Release|x64.ActiveCfg = Release|x64
+ {3CABED2C-12F1-4408-AAAE-E2185A426F35}.Release|x64.Build.0 = Release|x64
{DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|Win32.ActiveCfg = Debug|Win32
{DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|Win32.Build.0 = Debug|Win32
{DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|x64.ActiveCfg = Debug|x64
@@ -61,22 +75,6 @@ Global
{B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Release|Win32.Build.0 = Release|Win32
{B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Release|x64.ActiveCfg = Release|x64
{B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Release|x64.Build.0 = Release|x64
- {3CABED2C-12F1-4408-AAAE-E2185A426F35}.Debug|Win32.ActiveCfg = Debug|Win32
- {3CABED2C-12F1-4408-AAAE-E2185A426F35}.Debug|Win32.Build.0 = Debug|Win32
- {3CABED2C-12F1-4408-AAAE-E2185A426F35}.Debug|x64.ActiveCfg = Debug|x64
- {3CABED2C-12F1-4408-AAAE-E2185A426F35}.Debug|x64.Build.0 = Debug|x64
- {3CABED2C-12F1-4408-AAAE-E2185A426F35}.Release|Win32.ActiveCfg = Release|Win32
- {3CABED2C-12F1-4408-AAAE-E2185A426F35}.Release|Win32.Build.0 = Release|Win32
- {3CABED2C-12F1-4408-AAAE-E2185A426F35}.Release|x64.ActiveCfg = Release|x64
- {3CABED2C-12F1-4408-AAAE-E2185A426F35}.Release|x64.Build.0 = Release|x64
- {0B7BAA5B-0753-4015-A8F3-8FA540FC8660}.Debug|Win32.ActiveCfg = Debug|Win32
- {0B7BAA5B-0753-4015-A8F3-8FA540FC8660}.Debug|Win32.Build.0 = Debug|Win32
- {0B7BAA5B-0753-4015-A8F3-8FA540FC8660}.Debug|x64.ActiveCfg = Debug|x64
- {0B7BAA5B-0753-4015-A8F3-8FA540FC8660}.Debug|x64.Build.0 = Debug|x64
- {0B7BAA5B-0753-4015-A8F3-8FA540FC8660}.Release|Win32.ActiveCfg = Release|Win32
- {0B7BAA5B-0753-4015-A8F3-8FA540FC8660}.Release|Win32.Build.0 = Release|Win32
- {0B7BAA5B-0753-4015-A8F3-8FA540FC8660}.Release|x64.ActiveCfg = Release|x64
- {0B7BAA5B-0753-4015-A8F3-8FA540FC8660}.Release|x64.Build.0 = Release|x64
{E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.ActiveCfg = Debug|Win32
{E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.Build.0 = Debug|Win32
{E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.ActiveCfg = Debug|x64