Compare commits
6 Commits
feature/pr
...
JointsServ
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e365f3ed6c | ||
|
|
998a22a43f | ||
|
|
abb1f76c71 | ||
|
|
85e84bfdf3 | ||
|
|
f7a76511a8 | ||
|
|
9cee74baf4 |
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="8.00"
|
||||
Version="8,00"
|
||||
Name="Blocks3D"
|
||||
ProjectGUID="{6C4D6EEF-B1D1-456A-B850-92CAB17124BE}"
|
||||
RootNamespace="Blocks3D"
|
||||
@@ -439,6 +439,10 @@
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\src\source\DataModelV2\JointsService.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\src\source\DataModelV2\LevelInstance.cpp"
|
||||
>
|
||||
@@ -513,6 +517,10 @@
|
||||
RelativePath=".\src\source\DataModelV2\SelectionService.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\src\source\DataModelV2\SnapInstance.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\src\source\DataModelV2\SoundInstance.cpp"
|
||||
>
|
||||
@@ -886,6 +894,10 @@
|
||||
RelativePath=".\src\include\DataModelV2\Instance.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\src\include\DataModelV2\JointsService.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\src\include\DataModelV2\LevelInstance.h"
|
||||
>
|
||||
@@ -906,6 +918,10 @@
|
||||
RelativePath=".\src\include\DataModelV2\SelectionService.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\src\include\DataModelV2\SnapInstance.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\src\include\DataModelV2\SoundInstance.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;
|
||||
|
||||
};
|
||||
|
||||
@@ -16,6 +16,7 @@ public:
|
||||
virtual void update();
|
||||
std::vector<Instance*> children; // All children.
|
||||
std::string getClassName();
|
||||
bool Instance::isA(std::string name);
|
||||
Instance* findFirstChild(std::string);
|
||||
std::vector<Instance* > getChildren();
|
||||
std::vector<Instance* > getAllChildren();
|
||||
@@ -25,6 +26,7 @@ public:
|
||||
void removeChild(Instance*);
|
||||
void clearChildren();
|
||||
Instance* getParent();
|
||||
void remove();
|
||||
virtual Instance* clone() const { return new Instance(*this); }
|
||||
virtual std::vector<PROPGRIDITEM> getProperties();
|
||||
virtual void PropUpdate(LPPROPGRIDITEM &pItem);
|
||||
|
||||
15
src/include/DataModelV2/JointsService.h
Normal file
15
src/include/DataModelV2/JointsService.h
Normal file
@@ -0,0 +1,15 @@
|
||||
#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);
|
||||
void JointsService::solvePartSnap(PartInstance* Part, PartInstance* Part2);
|
||||
void JointsService::solveWorkspaceSnaps();
|
||||
};
|
||||
14
src/include/DataModelV2/SnapInstance.h
Normal file
14
src/include/DataModelV2/SnapInstance.h
Normal file
@@ -0,0 +1,14 @@
|
||||
#pragma once
|
||||
#include "Instance.h"
|
||||
#include "PartInstance.h"
|
||||
|
||||
class SnapInstance:
|
||||
public Instance
|
||||
{
|
||||
public:
|
||||
SnapInstance(PartInstance* Part1, PartInstance* Part2);
|
||||
~SnapInstance(void);
|
||||
PartInstance* jPart1;
|
||||
PartInstance* jPart2;
|
||||
dJointID JointID;
|
||||
};
|
||||
@@ -17,4 +17,6 @@ public:
|
||||
void deleteBody(PartInstance* partInstance);
|
||||
void updateBody(PartInstance* partInstance);
|
||||
void resetBody(PartInstance* partInstance);
|
||||
dJointID createJoint(PartInstance *part1, PartInstance *part2);
|
||||
void destroyJoints(PartInstance *part);
|
||||
};
|
||||
@@ -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,11 +201,16 @@ 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));
|
||||
test->setPosition(Vector3(0,0,0));
|
||||
test->setPosition(Vector3(0,-10,0));
|
||||
test->setCFrame(test->getCFrame() * Matrix3::fromEulerAnglesXYZ(0,toRadians(0),toRadians(0)));
|
||||
test->setSurface(TOP, Enum::SurfaceType::Bumps);
|
||||
test->setAnchored(true);
|
||||
@@ -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,12 @@ 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);
|
||||
//JointsSvc->solvePartSnap(test3, test);
|
||||
|
||||
test = makePart();
|
||||
test->setParent(_dataModel->getWorkspace());
|
||||
@@ -285,6 +295,8 @@ void Application::onInit() {
|
||||
test->setSize(Vector3(4,1,2));
|
||||
test->setPosition(Vector3(2,7,0));
|
||||
test->setSurface(TOP, Enum::SurfaceType::Bumps);
|
||||
|
||||
JointsSvc->solveWorkspaceSnaps();
|
||||
#else
|
||||
_dataModel->debugGetOpen();
|
||||
#endif
|
||||
@@ -338,7 +350,6 @@ void Application::onSimulation(RealTime rdt, SimTime sdt, SimTime idt) {
|
||||
_dataModel->getEngine()->step(0.03F);
|
||||
}
|
||||
onLogic();
|
||||
|
||||
}
|
||||
|
||||
_dataModel->getGuiRoot()->update();
|
||||
|
||||
@@ -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;
|
||||
@@ -502,8 +504,12 @@ bool DataModelInstance::load(const char* filename, bool clearObjects)
|
||||
std::string tname = hname.substr(0, hname.length() - 5);
|
||||
name = tname;
|
||||
resetEngine();
|
||||
//HACK: we need to reset JointsService but there is no good way to do it in XplicitNgine code
|
||||
jointsService = new JointsService();
|
||||
jointsService->setParent(this);
|
||||
selectionService->clearSelection();
|
||||
selectionService->addSelected(this);
|
||||
jointsService->solveWorkspaceSnaps();
|
||||
return true;
|
||||
}
|
||||
else
|
||||
@@ -672,6 +678,11 @@ SoundService* DataModelInstance::getSoundService()
|
||||
return soundService;
|
||||
}
|
||||
|
||||
JointsService* DataModelInstance::getJointsService()
|
||||
{
|
||||
return jointsService;
|
||||
}
|
||||
|
||||
LightingInstance* DataModelInstance::getLighting()
|
||||
{
|
||||
return lightingInstance;
|
||||
|
||||
@@ -87,6 +87,7 @@ Instance::~Instance(void)
|
||||
{
|
||||
delete children.at(i);
|
||||
}
|
||||
setParent(NULL);
|
||||
}
|
||||
|
||||
void Instance::setName(std::string newName)
|
||||
@@ -99,6 +100,13 @@ std::string Instance::getClassName()
|
||||
return className;
|
||||
}
|
||||
|
||||
bool Instance::isA(std::string name)
|
||||
{
|
||||
if (className == name)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
std::vector<Instance* > Instance::getChildren()
|
||||
{
|
||||
return children;
|
||||
@@ -174,5 +182,7 @@ Instance* Instance::findFirstChild(std::string name)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Instance::remove()
|
||||
{
|
||||
delete this;
|
||||
}
|
||||
69
src/source/DataModelV2/JointsService.cpp
Normal file
69
src/source/DataModelV2/JointsService.cpp
Normal file
@@ -0,0 +1,69 @@
|
||||
#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);
|
||||
}
|
||||
|
||||
void JointsService::destroyPartSnap(PartInstance* Part)
|
||||
{
|
||||
std::vector<Instance* > children = getChildren();
|
||||
for(size_t i = 0; i < children.size(); i++)
|
||||
{
|
||||
SnapInstance* Snap = (SnapInstance*)children.at(i);
|
||||
if((Snap->jPart1 == Part) || (Snap->jPart2 == Part))
|
||||
{
|
||||
Snap->remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void JointsService::solvePartSnap(PartInstance* Part1, PartInstance* Part2)
|
||||
{
|
||||
XplicitNgine* Phys = g_dataModel->getEngine();
|
||||
float TopSurface = (Part1->getPosition().y + Part1->getSize().y / 2);
|
||||
float BottomSurface2 = (Part2->getPosition().y - Part2->getSize().y / 2);
|
||||
const int N = 4;
|
||||
if (TopSurface == BottomSurface2)
|
||||
{
|
||||
Phys->createBody(Part1);
|
||||
Phys->createBody(Part2);
|
||||
dContact contact[N];
|
||||
int n = dCollide (Part1->physGeom[0],Part2->physGeom[0],N,&contact[0].geom,sizeof(dContact));
|
||||
if (n > 0)
|
||||
createSnap(Part1, Part2);
|
||||
}
|
||||
}
|
||||
|
||||
void JointsService::solveWorkspaceSnaps()
|
||||
{
|
||||
std::vector<Instance* > children = g_dataModel->getWorkspace()->getAllChildren();
|
||||
for(size_t i = 0; i < children.size(); i++)
|
||||
{
|
||||
PartInstance* Part1 = (PartInstance*)children.at(i);
|
||||
if (Part1->isA("Part"))
|
||||
{
|
||||
for(size_t c = 0; c < children.size(); c++) //horrible
|
||||
{
|
||||
PartInstance* Part2 = (PartInstance*)children.at(c);
|
||||
if (Part1 != Part2)
|
||||
solvePartSnap(Part1, Part2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
29
src/source/DataModelV2/SnapInstance.cpp
Normal file
29
src/source/DataModelV2/SnapInstance.cpp
Normal file
@@ -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";
|
||||
jPart1 = Part1;
|
||||
jPart2 = Part2;
|
||||
|
||||
if (Part1->physBody == NULL)
|
||||
Phys->createBody(Part1);
|
||||
|
||||
if (Part2->physBody == NULL)
|
||||
Phys->createBody(Part2);
|
||||
|
||||
JointID = Phys->createJoint(Part1, Part2);
|
||||
}
|
||||
|
||||
SnapInstance::~SnapInstance(void)
|
||||
{
|
||||
//XplicitNgine* Phys = g_xplicitNgine;
|
||||
printf("SnapInstance destroyed...");
|
||||
if (JointID != NULL)
|
||||
dJointDestroy(JointID);
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
#include "XplicitNgine/XplicitNgine.h"
|
||||
#include "DataModelV2/JointsService.h"
|
||||
#include "Globals.h"
|
||||
|
||||
XplicitNgine::XplicitNgine()
|
||||
{
|
||||
|
||||
physWorld = dWorldCreate();
|
||||
physSpace = dHashSpaceCreate(0);
|
||||
contactgroup = dJointGroupCreate(0);
|
||||
@@ -19,10 +19,11 @@ XplicitNgine::XplicitNgine()
|
||||
|
||||
XplicitNgine::~XplicitNgine()
|
||||
{
|
||||
dJointGroupDestroy (contactgroup);
|
||||
dSpaceDestroy (physSpace);
|
||||
dWorldDestroy (physWorld);
|
||||
dCloseODE();
|
||||
g_dataModel->getJointsService()->remove();
|
||||
dJointGroupDestroy (contactgroup);
|
||||
dSpaceDestroy (physSpace);
|
||||
dWorldDestroy (physWorld);
|
||||
dCloseODE();
|
||||
}
|
||||
|
||||
void XplicitNgine::resetBody(PartInstance* partInstance)
|
||||
@@ -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);
|
||||
@@ -156,7 +158,8 @@ void XplicitNgine::createBody(PartInstance* partInstance)
|
||||
dGeomSetData(partInstance->physGeom[0], partInstance);
|
||||
|
||||
dMass mass;
|
||||
mass.setBox(sqrt(partSize.x*2), sqrt(partSize.y*2), sqrt(partSize.z*2), 0.7F);
|
||||
mass.setBox(sqrt(partSize.x*20), sqrt(partSize.y*20), sqrt(partSize.z*20), 0.01F);
|
||||
//mass.setBox(sqrt(partSize.x*2), sqrt(partSize.y*2), sqrt(partSize.z*2), 0.7F);
|
||||
dBodySetMass(partInstance->physBody, &mass);
|
||||
|
||||
// Create rigid body
|
||||
@@ -234,3 +237,23 @@ void XplicitNgine::updateBody(PartInstance *partInstance)
|
||||
dBodySetRotation(partInstance->physBody, rotation);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
dJointID 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);
|
||||
return c;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void XplicitNgine::destroyJoints(PartInstance *part)
|
||||
{
|
||||
for(int i = 0; i < dBodyGetNumJoints(part->physBody); i++)
|
||||
dJointDestroy(dBodyGetJoint(part->physBody, i));
|
||||
}
|
||||
Reference in New Issue
Block a user