Made physics let you move stuff
This commit is contained in:
@@ -5,7 +5,7 @@
|
||||
#include <windows.h>
|
||||
#include <commctrl.h>
|
||||
#include <richedit.h>
|
||||
#include "resource.h"
|
||||
#include "src/include/resource.h"
|
||||
|
||||
|
||||
|
||||
|
||||
10
resource.h
10
resource.h
@@ -1,10 +0,0 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Visual C++ generated include file.
|
||||
// Used by dialogs.rc
|
||||
//
|
||||
#define IDI_ICON1 101
|
||||
#define IDB_BITMAP1 102
|
||||
#define IDD_DIALOG1 103
|
||||
#define IDC_EDIT1 1001
|
||||
#define IDC_PROPERTYGRID 2000
|
||||
|
||||
@@ -49,6 +49,7 @@ public:
|
||||
void setVelocity(Vector3);
|
||||
void setRotVelocity(Vector3);
|
||||
void setCFrame(CoordinateFrame);
|
||||
void setCFrameNoSync(CoordinateFrame);
|
||||
void setSize(Vector3);
|
||||
void setShape(Enum::Shape::Value shape);
|
||||
void setChanged();
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#include "DatamodelV2/Instance.h"
|
||||
#include "DatamodelV2/PartInstance.h"
|
||||
|
||||
class XplicitNgine : Instance
|
||||
class XplicitNgine : public Instance
|
||||
{
|
||||
public:
|
||||
XplicitNgine();
|
||||
@@ -13,4 +13,6 @@ public:
|
||||
dJointGroupID contactgroup;
|
||||
|
||||
void createBody(PartInstance* partInstance);
|
||||
void deleteBody(PartInstance* partInstance);
|
||||
void updateBody(PartInstance* partInstance, CoordinateFrame * cFrame);
|
||||
};
|
||||
@@ -1,7 +1,7 @@
|
||||
#define IDC_PROPERTYGRID 2000
|
||||
#define IDC_STATIC 2
|
||||
|
||||
#define IDE_EDIT 105
|
||||
#define IDC_EDIT1 105
|
||||
#define IDI_ICON1 102
|
||||
#define IDB_BITMAP1 103
|
||||
#define IDD_DIALOG1 104
|
||||
|
||||
@@ -43,6 +43,11 @@ void DataModelInstance::resetEngine()
|
||||
delete xplicitNgine;
|
||||
xplicitNgine = new XplicitNgine();
|
||||
g_xplicitNgine = xplicitNgine;
|
||||
for(size_t i = 0; i < getWorkspace()->partObjects.size(); i++)
|
||||
{
|
||||
PartInstance* partInstance = getWorkspace()->partObjects[i];
|
||||
partInstance->physBody = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
XplicitNgine * DataModelInstance::getEngine()
|
||||
@@ -53,6 +58,8 @@ XplicitNgine * DataModelInstance::getEngine()
|
||||
void DataModelInstance::toggleRun()
|
||||
{
|
||||
running = !running;
|
||||
//if(!running)
|
||||
//resetEngine();
|
||||
}
|
||||
bool DataModelInstance::isRunning()
|
||||
{
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
PartInstance::PartInstance(void)
|
||||
{
|
||||
PVInstance::PVInstance();
|
||||
physBody = NULL;
|
||||
glList = glGenLists(1);
|
||||
name = "Unnamed PVItem";
|
||||
className = "Part";
|
||||
@@ -25,7 +26,6 @@ PartInstance::PartInstance(void)
|
||||
left = Enum::SurfaceType::Smooth;
|
||||
bottom = Enum::SurfaceType::Smooth;
|
||||
shape = Enum::Shape::Block;
|
||||
physBody = NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -110,6 +110,7 @@ void PartInstance::setSurface(int face, Enum::SurfaceType::Value surface)
|
||||
|
||||
void PartInstance::setParent(Instance* prnt)
|
||||
{
|
||||
g_dataModel->getEngine()->deleteBody(this);
|
||||
Instance * cparent = getParent();
|
||||
while(cparent != NULL)
|
||||
{
|
||||
@@ -144,7 +145,7 @@ PartInstance::PartInstance(const PartInstance &oinst)
|
||||
setParent(oinst.parent);
|
||||
anchored = oinst.anchored;
|
||||
size = oinst.size;
|
||||
setCFrame(oinst.cFrame);
|
||||
setCFrameNoSync(oinst.cFrame);
|
||||
color = oinst.color;
|
||||
velocity = oinst.velocity;
|
||||
rotVelocity = oinst.rotVelocity;
|
||||
@@ -156,7 +157,6 @@ PartInstance::PartInstance(const PartInstance &oinst)
|
||||
bottom = oinst.bottom;
|
||||
shape = oinst.shape;
|
||||
changed = true;
|
||||
physBody = NULL;
|
||||
}
|
||||
|
||||
void PartInstance::setSize(Vector3 newSize)
|
||||
@@ -222,7 +222,7 @@ void PartInstance::setShape(Enum::Shape::Value shape)
|
||||
void PartInstance::setPosition(Vector3 pos)
|
||||
{
|
||||
position = pos;
|
||||
cFrame = CoordinateFrame(cFrame.rotation, pos);
|
||||
setCFrame(CoordinateFrame(cFrame.rotation, pos));
|
||||
changed = true;
|
||||
}
|
||||
|
||||
@@ -231,6 +231,12 @@ CoordinateFrame PartInstance::getCFrame()
|
||||
return cFrame;
|
||||
}
|
||||
void PartInstance::setCFrame(CoordinateFrame coordinateFrame)
|
||||
{
|
||||
g_dataModel->getEngine()->updateBody(this, &coordinateFrame);
|
||||
setCFrameNoSync(coordinateFrame);
|
||||
}
|
||||
|
||||
void PartInstance::setCFrameNoSync(CoordinateFrame coordinateFrame)
|
||||
{
|
||||
cFrame = coordinateFrame;
|
||||
position = coordinateFrame.translation;
|
||||
|
||||
@@ -66,6 +66,20 @@ void collisionCallback(void *data, dGeomID o1, dGeomID o2)
|
||||
}
|
||||
}
|
||||
|
||||
void XplicitNgine::deleteBody(PartInstance* partInstance)
|
||||
{
|
||||
if(partInstance->physBody != NULL)
|
||||
{
|
||||
while(dBodyGetNumJoints(partInstance->physBody) > 0) {
|
||||
dJointDestroy(dBodyGetJoint(partInstance->physBody, 0));
|
||||
}
|
||||
dBodyDestroy(partInstance->physBody);
|
||||
dGeomDestroy(partInstance->physGeom[0]);
|
||||
printf("Body should be destroyed");
|
||||
partInstance->physBody = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void XplicitNgine::createBody(PartInstance* partInstance)
|
||||
{
|
||||
// calculate collisions
|
||||
@@ -131,7 +145,7 @@ void XplicitNgine::createBody(PartInstance* partInstance)
|
||||
// Probably should be done AFTER we get physics KINDA working!!!
|
||||
const dReal* physRotation = dGeomGetRotation(partInstance->physGeom[0]);
|
||||
//partInstance->setPosition(Vector3(physPosition[0], physPosition[1], physPosition[2]));
|
||||
partInstance->setCFrame(CoordinateFrame(
|
||||
partInstance->setCFrameNoSync(CoordinateFrame(
|
||||
Matrix3(physRotation[0],physRotation[1],physRotation[2],
|
||||
physRotation[4],physRotation[5],physRotation[6],
|
||||
physRotation[8],physRotation[9],physRotation[10]),
|
||||
@@ -141,4 +155,31 @@ void XplicitNgine::createBody(PartInstance* partInstance)
|
||||
|
||||
dWorldQuickStep(physWorld,0.05F);
|
||||
dJointGroupEmpty(contactgroup);
|
||||
}
|
||||
|
||||
void XplicitNgine::updateBody(PartInstance *partInstance, CoordinateFrame * cFrame)
|
||||
{
|
||||
if(partInstance->physBody != NULL)
|
||||
{
|
||||
|
||||
printf("Position is supposed to be set\n");
|
||||
Vector3 position = cFrame->translation;
|
||||
|
||||
dBodySetPosition(partInstance->physBody,
|
||||
position[0],
|
||||
position[1],
|
||||
position[2]
|
||||
);
|
||||
|
||||
Matrix3 g3dRot = cFrame->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};
|
||||
|
||||
dBodySetRotation(partInstance->physBody, rotation);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Null???\n");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user