From bfcb3f83ab8eeeaa66f75efc49b9dbfcde3e4a75 Mon Sep 17 00:00:00 2001 From: Vulpovile Date: Mon, 15 Mar 2021 10:12:45 -0700 Subject: [PATCH] Added surface selector, made faces reflect G3D faces --- src/include/DataModelV2/PartInstance.h | 1 + src/include/Faces.h | 12 +++--- src/include/Mouse.h | 2 + src/include/Tool/SurfaceTool.h | 4 +- src/source/Application.cpp | 2 + src/source/DataModelV2/PartInstance.cpp | 35 ++++++++++++++--- src/source/IEBrowser.cpp | 4 +- src/source/Mouse.cpp | 10 +++++ src/source/Renderer.cpp | 1 - src/source/Tool/SurfaceTool.cpp | 50 +++++++++++++++++++++++-- 10 files changed, 102 insertions(+), 19 deletions(-) diff --git a/src/include/DataModelV2/PartInstance.h b/src/include/DataModelV2/PartInstance.h index 321b2c2..40a345f 100644 --- a/src/include/DataModelV2/PartInstance.h +++ b/src/include/DataModelV2/PartInstance.h @@ -50,6 +50,7 @@ public: void setSize(Vector3); void setShape(Enum::Shape::Value shape); void setChanged(); + void setSurface(int face, Enum::SurfaceType::Value surface); //Collision bool collides(PartInstance * part); diff --git a/src/include/Faces.h b/src/include/Faces.h index 9b5413d..9ce51b6 100644 --- a/src/include/Faces.h +++ b/src/include/Faces.h @@ -1,9 +1,9 @@ #ifndef FACES_H #define FACES_H -#define TOP 0 -#define BOTTOM 1 -#define LEFT 2 -#define RIGHT 3 -#define FRONT 4 -#define BACK 5 +#define TOP 3 +#define BOTTOM 5 +#define LEFT 1 +#define RIGHT 4 +#define FRONT 0 +#define BACK 2 #endif \ No newline at end of file diff --git a/src/include/Mouse.h b/src/include/Mouse.h index 70a348b..8a6b862 100644 --- a/src/include/Mouse.h +++ b/src/include/Mouse.h @@ -27,6 +27,8 @@ public: bool isMouseOnScreen(); bool isMouseDown(); void setMouseDown(bool mouseDown); + G3D::Ray * getRay(); + G3D::Ray getLastRay(); private: bool mouseDown; }; diff --git a/src/include/Tool/SurfaceTool.h b/src/include/Tool/SurfaceTool.h index cbb53d6..917cc70 100644 --- a/src/include/Tool/SurfaceTool.h +++ b/src/include/Tool/SurfaceTool.h @@ -6,7 +6,7 @@ class SurfaceTool : public Tool { public: - SurfaceTool(Enum::SurfaceType::Value surface, int extraParam); //OnSelect? + SurfaceTool(int surface, int extraParam); //OnSelect? ~SurfaceTool(void); //OnDeselect? void onButton1MouseDown(Mouse); void onButton1MouseUp(Mouse); @@ -15,6 +15,6 @@ public: void onKeyDown(int key); void onKeyUp(int key); private: - Enum::SurfaceType::Value surface; + int surface; int param; }; diff --git a/src/source/Application.cpp b/src/source/Application.cpp index a9f6d49..cd5e1ce 100644 --- a/src/source/Application.cpp +++ b/src/source/Application.cpp @@ -618,6 +618,8 @@ void Application::exitApplication() } + + void Application::onGraphics(RenderDevice* rd) { G3D::uint8 num = 0; diff --git a/src/source/DataModelV2/PartInstance.cpp b/src/source/DataModelV2/PartInstance.cpp index 55c2ace..9feeb04 100644 --- a/src/source/DataModelV2/PartInstance.cpp +++ b/src/source/DataModelV2/PartInstance.cpp @@ -18,12 +18,12 @@ PartInstance::PartInstance(void) color = Color3::gray(); velocity = Vector3(0,0,0); rotVelocity = Vector3(0,0,0); - top = Enum::SurfaceType::Bumps; + top = Enum::SurfaceType::Smooth; front = Enum::SurfaceType::Bumps; - right = Enum::SurfaceType::Bumps; - back = Enum::SurfaceType::Bumps; - left = Enum::SurfaceType::Bumps; - bottom = Enum::SurfaceType::Bumps; + right = Enum::SurfaceType::Smooth; + back = Enum::SurfaceType::Smooth; + left = Enum::SurfaceType::Smooth; + bottom = Enum::SurfaceType::Smooth; shape = Enum::Shape::Block; } @@ -82,6 +82,31 @@ void PartInstance::setChanged() changed = true; } +void PartInstance::setSurface(int face, Enum::SurfaceType::Value surface) +{ + switch(face) + { + case TOP: + top = surface; + break; + case BOTTOM: + bottom = surface; + break; + case LEFT: + left = surface; + break; + case RIGHT: + right = surface; + break; + case FRONT: + front = surface; + break; + default: + back = surface; + } + changed = true; +} + void PartInstance::setParent(Instance* prnt) { Instance * cparent = getParent(); diff --git a/src/source/IEBrowser.cpp b/src/source/IEBrowser.cpp index 57655c9..848c50b 100644 --- a/src/source/IEBrowser.cpp +++ b/src/source/IEBrowser.cpp @@ -61,10 +61,10 @@ HRESULT IEBrowser::doExternal(std::wstring funcName, return E_NOTIMPL; int j = pDispParams->rgvarg->intVal; int i = (pDispParams->rgvarg+1)->intVal; - printf("Got values %d and %d", i, j); + //printf("Got values %d and %d", i, j); if(i > 5 || i < 0) return E_NOTIMPL; - g_usableApp->changeTool(new SurfaceTool((Enum::SurfaceType::Value)i, j)); + g_usableApp->changeTool(new SurfaceTool(i, j)); /*VARIANT val1; VARIANT val2; unsigned int puArgErr; diff --git a/src/source/Mouse.cpp b/src/source/Mouse.cpp index 5cae677..2a54c52 100644 --- a/src/source/Mouse.cpp +++ b/src/source/Mouse.cpp @@ -34,6 +34,16 @@ PartInstance * Mouse::getTarget() return selectedInstance; } +G3D::Ray * Mouse::getRay() +{ + return &g_usableApp->cameraController.getCamera()->worldRay(x, y, g_usableApp->getRenderDevice()->getViewport()); +} + +G3D::Ray Mouse::getLastRay() +{ + return testRay; +} + double getVectorDistance(Vector3 vector1, Vector3 vector2) { diff --git a/src/source/Renderer.cpp b/src/source/Renderer.cpp index 85b20e1..90c24f6 100644 --- a/src/source/Renderer.cpp +++ b/src/source/Renderer.cpp @@ -414,7 +414,6 @@ void renderSurface(const char face, const Enum::SurfaceType::Value& surface, con { case Enum::SurfaceType::Motor: { - printf("MOTOR\n"); glDisable(GL_LIGHTING); glColor(getControllerColor(controller)); GLUquadric * q = gluNewQuadric(); diff --git a/src/source/Tool/SurfaceTool.cpp b/src/source/Tool/SurfaceTool.cpp index 541673d..39d6990 100644 --- a/src/source/Tool/SurfaceTool.cpp +++ b/src/source/Tool/SurfaceTool.cpp @@ -1,7 +1,6 @@ #include "Tool/SurfaceTool.h" #include "Application.h" - -SurfaceTool::SurfaceTool(Enum::SurfaceType::Value theSurface, int extraParam) +SurfaceTool::SurfaceTool(int theSurface, int extraParam) { surface = theSurface; param = extraParam; @@ -11,9 +10,53 @@ SurfaceTool::~SurfaceTool(void) { } +std::vector getSurfaces(PartInstance * part) +{ + std::vector planes; + G3D::Box box = part->getBox(); + G3D::Vector3 v0; + G3D::Vector3 v1; + G3D::Vector3 v2; + G3D::Vector3 v3; + box.getFaceCorners(0,v0,v1,v2,v3); + planes.push_back(G3D::Box(v0, v2)); + box.getFaceCorners(1,v0,v1,v2,v3); + planes.push_back(G3D::Box(v0, v2)); + box.getFaceCorners(2,v0,v1,v2,v3); + planes.push_back(G3D::Box(v0, v2)); + box.getFaceCorners(3,v0,v1,v2,v3); + planes.push_back(G3D::Box(v0, v2)); + box.getFaceCorners(4,v0,v1,v2,v3); + planes.push_back(G3D::Box(v0, v2)); + box.getFaceCorners(5,v0,v1,v2,v3); + planes.push_back(G3D::Box(v0, v2)); + return planes; +} + void SurfaceTool::onButton1MouseDown(Mouse mouse) { - + AudioPlayer::playSound(dingSound); + PartInstance * target = mouse.getTarget(); + G3D::Ray ray = mouse.getLastRay(); + std::vector surfacesHit = getSurfaces(target); + int closest; + float nearValue = G3D::inf(); + for(size_t i = 0; i < surfacesHit.size(); i++) + { + float newTime = ray.intersectionTime(surfacesHit[i]); + if(nearValue > newTime) + { + nearValue = newTime; + closest = (int)i; + } + } + if(G3D::isFinite(nearValue)) + { + + printf("\n%d\n", closest); + target->setSurface(closest, Enum::SurfaceType::Value(surface)); + } + g_usableApp->changeTool(NULL); } void SurfaceTool::onButton1MouseUp(Mouse mouse) { @@ -25,6 +68,7 @@ void SurfaceTool::onMouseMoved(Mouse mouse) } void SurfaceTool::onSelect(Mouse mouse) { + AudioPlayer::playSound(dingSound); } void SurfaceTool::onKeyDown(int key)