From f92f01be8809902a96debe94c014be36d8240113 Mon Sep 17 00:00:00 2001 From: andreja6 Date: Fri, 6 Mar 2020 23:28:49 -0800 Subject: [PATCH] Added bare bones physics --- Application.cpp | 75 +++++++++++++++++++++++++++++------ MenuButtonListener.cpp | 2 +- PartInstance.cpp | 6 +-- ToggleImageButtonInstance.cpp | 30 +++++++++++++- WorkspaceInstance.h | 3 +- 5 files changed, 96 insertions(+), 20 deletions(-) diff --git a/Application.cpp b/Application.cpp index fd7b90f..74d6d95 100644 --- a/Application.cpp +++ b/Application.cpp @@ -285,23 +285,71 @@ void Application::onCleanup() { -double grav = 0.32666666666666666666666666666667; -void Application::onLogic() { - //PhysicsStart +/* - for(size_t i = 0; i < this->_dataModel->getWorkspace()->physicalObjects.size(); i++) +Class HyperSnapSolver + +function getCollisionDepth(Part colliding, part collider); +function getFaceCollision(Part colliding, part collider); + +function eject(Part colliding, Part collider) +{ + if(!colliding.canCollide || !collider.canCollide) + return; + if(getCollisionDepth(colliding, collider) != 0) { + int ejectMultiplier, ejectMultipliery = 1-(collider.Friction+colliding.Friction), ejectMultiplierz = 1-(collider.Friction/2+colliding.Friction/2); + if(colliding.Anchored) + ejectMultiplier = collider.elasticity; + int faceCollided = getFaceCollision(colliding, collider); + if(faceCollided % 3 == 1) + { + ejectMultipliery = ejectMultiplier; + ejectMultiplier = 1-(collider.Friction+colliding.Friction/2); + } + else if(faceCollided % 3 == 2) + { + ejectMultiplierz = ejectMultiplier; + ejectMultiplier = 1-(collider.Friction+colliding.Friction/2); + } + + collider.Velocity *= Vector3.new(colliding.Velocity.x*ejectMultiplier,colliding.Velocity.y*ejectMultipliery,colliding.Velocity.z) + } +} + +*/ + +double grav = 0.32666666666666666666666666666667; +void simGrav(PartInstance * collider) +{ + if(!collider->anchored) { - if(PartInstance* collider = dynamic_cast(this->_dataModel->getWorkspace()->physicalObjects.at(i))) - { - if(!collider->anchored) - { - collider->setPosition(collider->getPosition()+collider->getVelocity()); - collider->setVelocity(Vector3(collider->getVelocity().x,collider->getVelocity().y-grav,collider->getVelocity().z)); - } - } + collider->setPosition(collider->getPosition()+collider->getVelocity()); + collider->setVelocity(collider->getVelocity()-Vector3(0,grav,0)); } } +void eject(PartInstance * colliding, PartInstance * collider) +{ + if(colliding == collider || !colliding->canCollide || !collider->canCollide) + return; + +} + + + +void Application::onLogic() { + //PhysicsStart + for_each (_dataModel->getWorkspace()->partObjects.begin(), _dataModel->getWorkspace()->partObjects.end(), simGrav); + for(size_t i = 0; i < _dataModel->getWorkspace()->partObjects.size(); i++) + { + for(size_t j = 0; j < _dataModel->getWorkspace()->partObjects.size(); j++) + { + eject(_dataModel->getWorkspace()->partObjects[i], _dataModel->getWorkspace()->partObjects[j]); + } + } +} + + void Application::onNetwork() { // Poll net messages here @@ -319,7 +367,8 @@ std::vector Application::getSelection() } void Application::onSimulation(RealTime rdt, SimTime sdt, SimTime idt) { - onLogic(); + if(_dataModel->isRunning()) + onLogic(); _dataModel->getGuiRoot()->update(); diff --git a/MenuButtonListener.cpp b/MenuButtonListener.cpp index 72c4a41..e3aab7b 100644 --- a/MenuButtonListener.cpp +++ b/MenuButtonListener.cpp @@ -1,7 +1,7 @@ #include "MenuButtonListener.h" #include "toggleimagebuttoninstance.h" #include "Globals.h" -void onButton1MouseClick(BaseButtonInstance* button) +void MenuButtonListener::onButton1MouseClick(BaseButtonInstance* button) { if(button->name == "go") { diff --git a/PartInstance.cpp b/PartInstance.cpp index 58a4f70..4c257d7 100644 --- a/PartInstance.cpp +++ b/PartInstance.cpp @@ -83,7 +83,7 @@ void PartInstance::setParent(Instance* parent) { if(WorkspaceInstance* workspace = dynamic_cast(parent)) { - workspace->physicalObjects.erase(std::remove(workspace->physicalObjects.begin(), workspace->physicalObjects.end(), this), workspace->physicalObjects.end()); + workspace->partObjects.erase(std::remove(workspace->partObjects.begin(), workspace->partObjects.end(), this), workspace->partObjects.end()); break; } cparent = cparent->getParent(); @@ -93,7 +93,7 @@ void PartInstance::setParent(Instance* parent) { if(WorkspaceInstance* workspace = dynamic_cast(parent)) { - workspace->physicalObjects.push_back(this); + workspace->partObjects.push_back(this); break; } parent = parent->getParent(); @@ -188,7 +188,7 @@ void PartInstance::setShape(Enum::Shape::Value shape) void PartInstance::setPosition(Vector3 pos) { position = pos; - cFrame = CoordinateFrame(pos); + cFrame = CoordinateFrame(cFrame.rotation, pos); changed = true; } diff --git a/ToggleImageButtonInstance.cpp b/ToggleImageButtonInstance.cpp index 390e5e1..f59fdac 100644 --- a/ToggleImageButtonInstance.cpp +++ b/ToggleImageButtonInstance.cpp @@ -13,7 +13,7 @@ ToggleImageButtonInstance::ToggleImageButtonInstance(G3D::TextureRef newImage, openGLID2 = image2->getOpenGLID(); image_ovr2 = overImage2; if(!image_ovr2.isNull()) - openGLID2_ovr = image_ovr2->getOpenGLID(); + openGLID2_ovr = image_ovr2->getOpenGLID(); image_dn2 = downImage2; if(!image_dn2.isNull()) openGLID2_dn = image_dn2->getOpenGLID(); @@ -62,7 +62,33 @@ void ToggleImageButtonInstance::drawObj(RenderDevice* rd, Vector2 mousePos, bool positionRelative = Vector2(rd->getWidth() + position.x, position.y); } int renderimage = openGLID; - + if(checked) + { + renderimage = openGLID2; + if(selected == true && !image_dn2.isNull() && !disabled) + { + renderimage = openGLID2_dn; + } + else if(disabled) + { + if(!image_ds2.isNull()) + renderimage = openGLID2_ds; + else + drawDisabledBox = true; + } + else if(mouseInArea(positionRelative.x, positionRelative.y, positionRelative.x + size.x, positionRelative.y + size.y, mousePos.x, mousePos.y)) + { + if(mouseDown && !image_dn2.isNull()) + { + renderimage = openGLID2_dn; + } + else if(!image_ovr2.isNull()) + { + renderimage = openGLID2_ovr; + } + } + } + else { if(selected == true && !image_dn.isNull() && !disabled) { diff --git a/WorkspaceInstance.h b/WorkspaceInstance.h index ee5409d..c854d6d 100644 --- a/WorkspaceInstance.h +++ b/WorkspaceInstance.h @@ -1,5 +1,6 @@ #pragma once #include "GroupInstance.h" +#include "PartInstance.h" class WorkspaceInstance : public GroupInstance @@ -7,5 +8,5 @@ class WorkspaceInstance : public: WorkspaceInstance(void); ~WorkspaceInstance(void); - std::vector physicalObjects; + std::vector partObjects; };