diff --git a/src/include/DataModelV2/PartInstance.h b/src/include/DataModelV2/PartInstance.h index 7a0d346..06cf62d 100644 --- a/src/include/DataModelV2/PartInstance.h +++ b/src/include/DataModelV2/PartInstance.h @@ -54,6 +54,7 @@ public: void setShape(Enum::Shape::Value shape); void setChanged(); void setSurface(int face, Enum::SurfaceType::Value surface); + float getMass(); //Collision bool collides(PartInstance * part); @@ -70,4 +71,4 @@ private: bool changed; Box itemBox; GLuint glList; -}; +}; \ No newline at end of file diff --git a/src/include/XplicitNgine/XplicitNgine.h b/src/include/XplicitNgine/XplicitNgine.h index ac92f66..842254e 100644 --- a/src/include/XplicitNgine/XplicitNgine.h +++ b/src/include/XplicitNgine/XplicitNgine.h @@ -12,7 +12,7 @@ public: dSpaceID physSpace; dJointGroupID contactgroup; - void createBody(PartInstance* partInstance); + void createBody(PartInstance* partInstance, float stepSize); void deleteBody(PartInstance* partInstance); void updateBody(PartInstance* partInstance, CoordinateFrame * cFrame); }; \ No newline at end of file diff --git a/src/source/Application.cpp b/src/source/Application.cpp index a3e5341..7591a36 100644 --- a/src/source/Application.cpp +++ b/src/source/Application.cpp @@ -298,12 +298,7 @@ void Application::onCleanup() { } void Application::onLogic() { - // XplicitNgine Start - for(size_t i = 0; i < _dataModel->getWorkspace()->partObjects.size(); i++) - { - PartInstance* partInstance = _dataModel->getWorkspace()->partObjects[i]; - _dataModel->getEngine()->createBody(partInstance); - } + } void Application::onNetwork() { @@ -323,8 +318,18 @@ std::vector Application::getSelection() void Application::onSimulation(RealTime rdt, SimTime sdt, SimTime idt) { if(_dataModel->isRunning()) + { + // XplicitNgine Start + for(size_t i = 0; i < _dataModel->getWorkspace()->partObjects.size(); i++) + { + PartInstance* partInstance = _dataModel->getWorkspace()->partObjects[i]; + _dataModel->getEngine()->createBody(partInstance, sdt*15/_dataModel->getWorkspace()->partObjects.size()); + } + onLogic(); + } + _dataModel->getGuiRoot()->update(); if(_dataModel->name != _title) diff --git a/src/source/DataModelV2/DataModelInstance.cpp b/src/source/DataModelV2/DataModelInstance.cpp index e19c8a4..9be2659 100644 --- a/src/source/DataModelV2/DataModelInstance.cpp +++ b/src/source/DataModelV2/DataModelInstance.cpp @@ -292,6 +292,7 @@ bool DataModelInstance::scanXMLObject(xml_node<> * scanNode) xml_node<> *propNode = node->first_node(); xml_node<> *cFrameNode=0; xml_node<> *sizeNode=0; + xml_node<> *anchoredNode=0; xml_node<> *shapeNode=0; xml_node<> *colorNode=0; xml_node<> *brickColorNode=0; @@ -307,6 +308,10 @@ bool DataModelInstance::scanXMLObject(xml_node<> * scanNode) if (xmlValue=="CFrame" | xmlValue=="CoordinateFrame") { cFrameNode = partPropNode; + } + if (xmlValue=="Anchored") + { + anchoredNode = partPropNode; } if (xmlValue=="Name") { @@ -418,6 +423,11 @@ bool DataModelInstance::scanXMLObject(xml_node<> * scanNode) { test->color = bcToRGB(atoi(brickColorNode->value())); } + if(anchoredNode) + { + printf("AAAAAAAAAAAAAAAAAAAA %s\n", anchoredNode->value()); + test->anchored = stricmp(anchoredNode->value(), "true") == 0; + } test->setSize(Vector3(sizeX,sizeY+_modY,sizeZ)); test->setName(newName); CoordinateFrame cf; diff --git a/src/source/DataModelV2/PartInstance.cpp b/src/source/DataModelV2/PartInstance.cpp index 9026210..1d0a36e 100644 --- a/src/source/DataModelV2/PartInstance.cpp +++ b/src/source/DataModelV2/PartInstance.cpp @@ -28,6 +28,13 @@ PartInstance::PartInstance(void) shape = Enum::Shape::Block; } +float PartInstance::getMass() +{ + if(shape == Enum::Shape::Block) + return size.x*size.y*size.z*0.7F; + else + return 1.3333333333333333333333333333333F*(size.x/2)*(size.y/2)*(size.z/2)*0.7F; +} Vector3 PartInstance::getVelocity() { diff --git a/src/source/PropertyWindow.cpp b/src/source/PropertyWindow.cpp index c9c7399..39e67a8 100644 --- a/src/source/PropertyWindow.cpp +++ b/src/source/PropertyWindow.cpp @@ -1,7 +1,7 @@ #define _WINSOCKAPI_ #include #include "WindowFunctions.h" -#include "../../resource.h" +#include "resource.h" #include "PropertyWindow.h" #include "Globals.h" #include "strsafe.h" diff --git a/src/source/XplicitNgine/XplicitNgine.cpp b/src/source/XplicitNgine/XplicitNgine.cpp index dc504ca..1121d7b 100644 --- a/src/source/XplicitNgine/XplicitNgine.cpp +++ b/src/source/XplicitNgine/XplicitNgine.cpp @@ -75,12 +75,11 @@ void XplicitNgine::deleteBody(PartInstance* partInstance) } dBodyDestroy(partInstance->physBody); dGeomDestroy(partInstance->physGeom[0]); - printf("Body should be destroyed"); partInstance->physBody = NULL; } } -void XplicitNgine::createBody(PartInstance* partInstance) +void XplicitNgine::createBody(PartInstance* partInstance, float stepSize) { // calculate collisions dSpaceCollide (physSpace,0,&collisionCallback); @@ -101,37 +100,46 @@ void XplicitNgine::createBody(PartInstance* partInstance) dVector3 result; dGeomBoxGetLengths(partInstance->physGeom[0], result); - printf("[XplicitNgine] Part Geom Size: %.1f, %.1f, %.1f\n", - result[0], - result[1], - result[2] - ); + //printf("[XplicitNgine] Part Geom Size: %.1f, %.1f, %.1f\n", + // result[0], + // result[1], + // result[2] + //); } else { partInstance->physGeom[0] = dCreateSphere(physSpace, partInstance->getSize()[0]/2); } + dMass mass; + mass.setBox(partInstance->getSize().x, partInstance->getSize().y, partInstance->getSize().z, 0.7F); + dBodySetMass(partInstance->physBody, &mass); // Debug output // Create rigid body - printf("[XplicitNgine] Created Geom for PartInstance\n"); + //printf("[XplicitNgine] Created Geom for PartInstance\n"); dBodySetPosition(partInstance->physBody, partInstance->getPosition()[0], partInstance->getPosition()[1], partInstance->getPosition()[2] ); + dGeomSetPosition(partInstance->physGeom[0], + partInstance->getPosition()[0], + partInstance->getPosition()[1], + partInstance->getPosition()[2]); + Matrix3 g3dRot = partInstance->getCFrame().rotation; float rotation [12] = { g3dRot[0][0], g3dRot[0][1], g3dRot[0][2], 0, g3dRot[1][0], g3dRot[1][1], g3dRot[1][2], 0, g3dRot[2][0], g3dRot[2][1], g3dRot[2][2], 0}; + dGeomSetRotation(partInstance->physGeom[0], rotation); dBodySetRotation(partInstance->physBody, rotation); - printf("[XplicitNgine] Created Body for PartInstance\n"); + //printf("[XplicitNgine] Created Body for PartInstance\n"); if(!partInstance->anchored) dGeomSetBody(partInstance->physGeom[0], partInstance->physBody); @@ -152,8 +160,8 @@ void XplicitNgine::createBody(PartInstance* partInstance) Vector3(physPosition[0], physPosition[1], physPosition[2]))); } } - - dWorldQuickStep(physWorld,0.05F); +//STEP SHOULD NOT BE HERE! + dWorldQuickStep(physWorld, stepSize); dJointGroupEmpty(contactgroup); } @@ -161,8 +169,6 @@ void XplicitNgine::updateBody(PartInstance *partInstance, CoordinateFrame * cFra { if(partInstance->physBody != NULL) { - - printf("Position is supposed to be set\n"); Vector3 position = cFrame->translation; dBodySetPosition(partInstance->physBody, @@ -178,8 +184,4 @@ void XplicitNgine::updateBody(PartInstance *partInstance, CoordinateFrame * cFra dBodySetRotation(partInstance->physBody, rotation); } - else - { - printf("Null???\n"); - } } \ No newline at end of file