diff --git a/Blocks3D.vcproj b/Blocks3D.vcproj
index e7315b6..77ce8d3 100644
--- a/Blocks3D.vcproj
+++ b/Blocks3D.vcproj
@@ -1,7 +1,7 @@
+
+
@@ -513,6 +517,10 @@
RelativePath=".\src\source\DataModelV2\SelectionService.cpp"
>
+
+
@@ -886,6 +894,10 @@
RelativePath=".\src\include\DataModelV2\Instance.h"
>
+
+
@@ -906,6 +918,10 @@
RelativePath=".\src\include\DataModelV2\SelectionService.h"
>
+
+
diff --git a/src/include/DataModelV2/DataModelInstance.h b/src/include/DataModelV2/DataModelInstance.h
index aceaf86..a7c412b 100644
--- a/src/include/DataModelV2/DataModelInstance.h
+++ b/src/include/DataModelV2/DataModelInstance.h
@@ -10,6 +10,7 @@
#include "XplicitNgine/XplicitNgine.h"
#include "SoundService.h"
#include "LightingInstance.h"
+#include "JointsService.h"
// Libraries
#include "rapidxml/rapidxml.hpp"
@@ -37,6 +38,7 @@ public:
XplicitNgine* getEngine();
ThumbnailGeneratorInstance* getThumbnailGenerator();
SoundService* getSoundService();
+ JointsService* getJointsService();
LightingInstance* getLighting();
std::string message;
@@ -72,6 +74,7 @@ private:
XplicitNgine* xplicitNgine;
SoundService* soundService;
LightingInstance* lightingInstance;
+ JointsService* jointsService;
bool running;
};
diff --git a/src/include/DataModelV2/JointsService.h b/src/include/DataModelV2/JointsService.h
new file mode 100644
index 0000000..9957bf8
--- /dev/null
+++ b/src/include/DataModelV2/JointsService.h
@@ -0,0 +1,13 @@
+#pragma once
+#include "Instance.h"
+#include "PartInstance.h"
+
+class JointsService:
+ public Instance
+{
+public:
+ JointsService(void);
+ ~JointsService(void);
+ void createSnap(PartInstance* Part1, PartInstance* Part2);
+ void destroyPartSnap(PartInstance* Part);
+};
diff --git a/src/include/DataModelV2/SnapInstance.h b/src/include/DataModelV2/SnapInstance.h
new file mode 100644
index 0000000..7a912d9
--- /dev/null
+++ b/src/include/DataModelV2/SnapInstance.h
@@ -0,0 +1,13 @@
+#pragma once
+#include "Instance.h"
+#include "PartInstance.h"
+
+class SnapInstance:
+ public Instance
+{
+public:
+ SnapInstance(PartInstance* Part1, PartInstance* Part2);
+ ~SnapInstance(void);
+ PartInstance* Joint1;
+ PartInstance* Joint2;
+};
diff --git a/src/include/XplicitNgine/XplicitNgine.h b/src/include/XplicitNgine/XplicitNgine.h
index 8dfef4b..57237e0 100644
--- a/src/include/XplicitNgine/XplicitNgine.h
+++ b/src/include/XplicitNgine/XplicitNgine.h
@@ -17,4 +17,6 @@ public:
void deleteBody(PartInstance* partInstance);
void updateBody(PartInstance* partInstance);
void resetBody(PartInstance* partInstance);
+ void createJoint(PartInstance *part1, PartInstance *part2);
+ void destroyJoint(PartInstance *part);
};
\ No newline at end of file
diff --git a/src/source/Application.cpp b/src/source/Application.cpp
index 2d92505..57e6824 100644
--- a/src/source/Application.cpp
+++ b/src/source/Application.cpp
@@ -9,6 +9,7 @@
#include "DataModelV2/DataModelInstance.h"
#include "DataModelV2/GuiRootInstance.h"
#include "XplicitNgine/XplicitNgine.h"
+#include "DataModelV2/JointsService.h"
#include "CameraController.h"
#include "AudioPlayer.h"
#include "Globals.h"
@@ -200,7 +201,12 @@ void Application::onInit() {
#ifdef LEGACY_LOAD_G3DFUN_LEVEL
// Anchored this baseplate for XplicitNgine tests
+ //XplicitNgine ngine;
PartInstance* test = makePart();
+ PartInstance* test2;
+ PartInstance* test3;
+ JointsService* JointsSvc = g_dataModel->getJointsService();
+
test->setParent(_dataModel->getWorkspace());
test->color = Color3(0.2F,0.3F,1);
test->setSize(Vector3(24,1,24));
@@ -223,12 +229,12 @@ void Application::onInit() {
test->setPosition(Vector3(10,1,0));
test->setSurface(TOP, Enum::SurfaceType::Bumps);
- test = makePart();
- test->setParent(_dataModel->getWorkspace());
- test->color = Color3::gray();
- test->setSize(Vector3(4,1,2));
- test->setPosition(Vector3(7,2,0));
- test->setSurface(TOP, Enum::SurfaceType::Bumps);
+ test2 = makePart();
+ test2->setParent(_dataModel->getWorkspace());
+ test2->color = Color3::red();
+ test2->setSize(Vector3(4,1,2));
+ test2->setPosition(Vector3(7,2,0));
+ test2->setSurface(TOP, Enum::SurfaceType::Bumps);
test = makePart();
test->setParent(_dataModel->getWorkspace());
@@ -237,12 +243,14 @@ void Application::onInit() {
test->setPosition(Vector3(-7,2,0));
test->setSurface(TOP, Enum::SurfaceType::Bumps);
- test = makePart();
- test->setParent(_dataModel->getWorkspace());
- test->color = Color3::gray();
- test->setSize(Vector3(4,1,2));
- test->setPosition(Vector3(4,3,0));
- test->setSurface(TOP, Enum::SurfaceType::Bumps);
+ test3 = makePart();
+ test3->setParent(_dataModel->getWorkspace());
+ test3->color = Color3::red();
+ test3->setSize(Vector3(4,1,2));
+ test3->setPosition(Vector3(4,3,0));
+ test3->setSurface(TOP, Enum::SurfaceType::Bumps);
+ JointsSvc->createSnap(test2, test3);
+
test = makePart();
test->setParent(_dataModel->getWorkspace());
@@ -253,10 +261,11 @@ void Application::onInit() {
test = makePart();
test->setParent(_dataModel->getWorkspace());
- test->color = Color3::gray();
+ test->color = Color3::red();
test->setSize(Vector3(4,1,2));
test->setPosition(Vector3(1,4,0));
test->setSurface(TOP, Enum::SurfaceType::Bumps);
+ JointsSvc->createSnap(test, test3);
test = makePart();
test->setParent(_dataModel->getWorkspace());
@@ -338,7 +347,6 @@ void Application::onSimulation(RealTime rdt, SimTime sdt, SimTime idt) {
_dataModel->getEngine()->step(0.03F);
}
onLogic();
-
}
_dataModel->getGuiRoot()->update();
diff --git a/src/source/DataModelV2/DataModelInstance.cpp b/src/source/DataModelV2/DataModelInstance.cpp
index 79f0c84..79111de 100644
--- a/src/source/DataModelV2/DataModelInstance.cpp
+++ b/src/source/DataModelV2/DataModelInstance.cpp
@@ -28,6 +28,7 @@ DataModelInstance::DataModelInstance(void)
thumbnailGenerator = new ThumbnailGeneratorInstance();
soundService = new SoundService();
lightingInstance = new LightingInstance();
+ jointsService = new JointsService();
selectionService = new SelectionService();
selectionService->setPropertyWindow(g_usableApp->_propWindow);
@@ -41,6 +42,7 @@ DataModelInstance::DataModelInstance(void)
level->setParent(this);
soundService->setParent(this);
lightingInstance->setParent(this);
+ jointsService->setParent(this);
_loadedFileName="..//skooter.rbxm";
listicon = 5;
@@ -672,6 +674,11 @@ SoundService* DataModelInstance::getSoundService()
return soundService;
}
+JointsService* DataModelInstance::getJointsService()
+{
+ return jointsService;
+}
+
LightingInstance* DataModelInstance::getLighting()
{
return lightingInstance;
diff --git a/src/source/DataModelV2/JointsService.cpp b/src/source/DataModelV2/JointsService.cpp
new file mode 100644
index 0000000..cd9e89a
--- /dev/null
+++ b/src/source/DataModelV2/JointsService.cpp
@@ -0,0 +1,35 @@
+#include "DataModelV2/JointsService.h"
+#include "DataModelV2/SnapInstance.h"
+#include "StringFunctions.h"
+#include "Globals.h"
+
+JointsService::JointsService()
+{
+ name = "JointsService";
+ className = "JointsService";
+ canDelete = false;
+}
+
+JointsService::~JointsService(void)
+{
+}
+
+void JointsService::createSnap(PartInstance* Part1, PartInstance* Part2)
+{
+ SnapInstance* Snap = new SnapInstance(Part1, Part2);
+ Snap->setParent(this);
+}
+
+//This is only for removing the Snap instance not for removing the joint
+void JointsService::destroyPartSnap(PartInstance* Part)
+{
+ std::vector children = getChildren();
+ for(size_t i = 0; i < children.size(); i++)
+ {
+ SnapInstance* Snap = (SnapInstance*)children.at(i);
+ if((Snap->Joint1 == Part) || (Snap->Joint2 == Part))
+ {
+ removeChild(Snap);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/source/DataModelV2/PartInstance.cpp b/src/source/DataModelV2/PartInstance.cpp
index 8463f2b..72d2e7c 100644
--- a/src/source/DataModelV2/PartInstance.cpp
+++ b/src/source/DataModelV2/PartInstance.cpp
@@ -398,6 +398,7 @@ void PartInstance::render(RenderDevice* rd) {
PartInstance::~PartInstance(void)
{
glDeleteLists(glList, 1);
+
/*
// Causes some weird ODE error
// Someone, please look into this
diff --git a/src/source/DataModelV2/SnapInstance.cpp b/src/source/DataModelV2/SnapInstance.cpp
new file mode 100644
index 0000000..63edfdb
--- /dev/null
+++ b/src/source/DataModelV2/SnapInstance.cpp
@@ -0,0 +1,29 @@
+#include "DataModelV2/SnapInstance.h"
+#include "XplicitNgine/XplicitNgine.h"
+#include "StringFunctions.h"
+#include "Globals.h"
+
+SnapInstance::SnapInstance(PartInstance* Part1, PartInstance* Part2)
+{
+ XplicitNgine* Phys = g_xplicitNgine;
+ name = "Snap";
+ className = "Snap";
+ Joint1 = Part1;
+ Joint2 = Part2;
+
+ if (Part1->physBody == NULL)
+ Phys->createBody(Part1);
+
+ if (Part2->physBody == NULL)
+ Phys->createBody(Part2);
+
+ Phys->createJoint(Part1, Part2);
+}
+
+SnapInstance::~SnapInstance(void)
+{
+ XplicitNgine* Phys = g_xplicitNgine;
+ printf("SnapInstance destroyed...");
+ Phys->destroyJoint(Joint1);
+ Phys->destroyJoint(Joint2);
+}
diff --git a/src/source/XplicitNgine/XplicitNgine.cpp b/src/source/XplicitNgine/XplicitNgine.cpp
index 8373c8f..449b7b0 100644
--- a/src/source/XplicitNgine/XplicitNgine.cpp
+++ b/src/source/XplicitNgine/XplicitNgine.cpp
@@ -1,4 +1,5 @@
#include "XplicitNgine/XplicitNgine.h"
+#include "DataModelV2/JointsService.h"
#include "Globals.h"
XplicitNgine::XplicitNgine()
@@ -81,6 +82,7 @@ void collisionCallback(void *data, dGeomID o1, dGeomID o2)
void XplicitNgine::deleteBody(PartInstance* partInstance)
{
+ g_dataModel->getJointsService()->destroyPartSnap(partInstance);
if(partInstance->physBody != NULL)
{
dBodyEnable(partInstance->physBody);
@@ -233,4 +235,22 @@ void XplicitNgine::updateBody(PartInstance *partInstance)
dBodySetRotation(partInstance->physBody, rotation);
}
+}
+
+
+void XplicitNgine::createJoint(PartInstance *part1, PartInstance *part2)
+{
+ printf("XplicitNgine::createJoint called\n");
+ if((part1->physBody != NULL) & (part2->physBody != NULL)){
+ printf("creating a fixed joint\n");
+ dJointID c = dJointCreateFixed(physWorld, 0);
+ dJointAttach(c, part1->physBody, part2->physBody);
+ dJointSetFixed(c);
+ }
+}
+
+void XplicitNgine::destroyJoint(PartInstance *part)
+{
+ for(int i = 0; i < dBodyGetNumJoints(part->physBody); i++)
+ dJointDestroy(dBodyGetJoint(part->physBody, i));
}
\ No newline at end of file