diff --git a/CameraController.cpp b/CameraController.cpp index 567f089..909ed9a 100644 --- a/CameraController.cpp +++ b/CameraController.cpp @@ -1,7 +1,7 @@ #include "CameraController.h" #include "win32Defines.h" #include -#include "PhysicalInstance.h" +#include "PartInstance.h" #include "Demo.h" #include "AudioPlayer.h" @@ -141,7 +141,7 @@ void CameraController::centerCamera(Instance* selection) } else { - Vector3 partPos = ((PhysicalInstance*)selection)->getPosition()/2; + Vector3 partPos = ((PartInstance*)selection)->getPosition()/2; lookAt(partPos); focusPosition=partPos; zoom=((partPos-frame.translation).magnitude()); diff --git a/DataModelInstance.cpp b/DataModelInstance.cpp index 4cba7db..087dd23 100644 --- a/DataModelInstance.cpp +++ b/DataModelInstance.cpp @@ -15,6 +15,11 @@ DataModelInstance::DataModelInstance(void) mousey = 0; mouseButton1Down = false; showMessage = false; + canDelete = false; + winMessage = "You Won!"; + loseMessage = "You Lost. Try Again"; + timer = 60.0F; + score = 0; } DataModelInstance::~DataModelInstance(void) @@ -68,3 +73,59 @@ Instance* DataModelInstance::getGuiRoot() { return guiRoot; } + +char timerTxt[12]; +char scoreTxt[12]; +std::vector DataModelInstance::getProperties() +{ + std::vector properties = Instance::getProperties(); + + + + properties.push_back(createPGI("Messages", + "WinMessage", + "The message that shows when the player wins.", + (LPARAM)winMessage.c_str(), + PIT_EDIT)); + properties.push_back(createPGI("Messages", + "LoseMessage", + "The message that shows when the player loses.", + (LPARAM)loseMessage.c_str(), + PIT_EDIT)); + + + sprintf(timerTxt, "%g", timer); + sprintf(scoreTxt, "%d", score); + properties.push_back(createPGI("Gameplay", + "InitialTimerValue", + "The ammount of time in seconds the player has to complete this level.\r\n\r\nPut 0 if time is limitless.", + (LPARAM)timerTxt, + PIT_EDIT)); + properties.push_back(createPGI("Gameplay", + "InitialScoreValue", + "The ammount of points the player starts with.", + (LPARAM)scoreTxt, + PIT_EDIT)); + return properties; +} +void DataModelInstance::PropUpdate(LPPROPGRIDITEM &pItem) +{ + if(strcmp(pItem->lpszPropName, "InitialTimerValue") == 0) + { + timer = atoi((LPSTR)pItem->lpCurValue); + } + if(strcmp(pItem->lpszPropName, "InitialScoreValue") == 0) + { + score = atof((LPSTR)pItem->lpCurValue); + } + if(strcmp(pItem->lpszPropName, "LoseMessage") == 0) + { + loseMessage = (LPSTR)pItem->lpCurValue; + } + if(strcmp(pItem->lpszPropName, "WinMessage") == 0) + { + winMessage = (LPSTR)pItem->lpCurValue; + } + else + Instance::PropUpdate(pItem); +} \ No newline at end of file diff --git a/DataModelInstance.h b/DataModelInstance.h index ac614d4..879f732 100644 --- a/DataModelInstance.h +++ b/DataModelInstance.h @@ -24,4 +24,11 @@ public: void setMousePos(int x,int y); void setMousePos(Vector2 pos); bool mouseButton1Down; + + float timer; + int score; + virtual std::vector getProperties(); + std::string winMessage; + std::string loseMessage; + virtual void PropUpdate(LPPROPGRIDITEM &pItem); }; diff --git a/Enum.h b/Enum.h index 4e70d15..5de2af4 100644 --- a/Enum.h +++ b/Enum.h @@ -6,4 +6,10 @@ namespace Enum Smooth, Bumps, Welds, Glue }; } + namespace Shape + { + enum Value { + Block, Sphere, Cylinder + }; + } } \ No newline at end of file diff --git a/G3DTest.vcproj b/G3DTest.vcproj index f234481..79a5e2c 100644 --- a/G3DTest.vcproj +++ b/G3DTest.vcproj @@ -313,6 +313,10 @@ RelativePath=".\DataModelInstance.cpp" > + + @@ -322,7 +326,11 @@ > + + + + @@ -419,7 +431,11 @@ > + + GroupInstance::getProperties() +{ + std::vector properties = PVInstance::getProperties(); + return properties; +} +void GroupInstance::PropUpdate(LPPROPGRIDITEM &pItem) +{ + PVInstance::PropUpdate(pItem); +} diff --git a/GroupInstance.h b/GroupInstance.h new file mode 100644 index 0000000..98d63e3 --- /dev/null +++ b/GroupInstance.h @@ -0,0 +1,13 @@ +#pragma once +#include "PVInstance.h" + +class GroupInstance : + public PVInstance +{ +public: + GroupInstance(void); + ~GroupInstance(void); + GroupInstance(const GroupInstance &oinst); + virtual std::vector getProperties(); + virtual void PropUpdate(LPPROPGRIDITEM &pItem); +}; diff --git a/Instance.cpp b/Instance.cpp index 7cc363d..1a9dbb0 100644 --- a/Instance.cpp +++ b/Instance.cpp @@ -9,6 +9,7 @@ Instance::Instance(void) name = "Default Game Instance"; className = "BaseInstance"; listicon = 0; + canDelete = true; } Instance::Instance(const Instance &oinst) @@ -16,6 +17,7 @@ Instance::Instance(const Instance &oinst) name = oinst.name; className = oinst.className; + canDelete = oinst.canDelete; //setParent(oinst.parent); } diff --git a/Instance.h b/Instance.h index 07231a1..2af6866 100644 --- a/Instance.h +++ b/Instance.h @@ -5,6 +5,7 @@ class Instance { public: + bool canDelete; Instance(void); Instance(const Instance&); virtual ~Instance(void); @@ -12,7 +13,7 @@ public: virtual void render(RenderDevice*); std::vector children; // All children. std::string getClassName(); - virtual Instance* findFirstChild(std::string); + Instance* findFirstChild(std::string); std::vector getChildren(); std::vector getAllChildren(); void setParent(Instance*); diff --git a/PVInstance.cpp b/PVInstance.cpp new file mode 100644 index 0000000..8f0332d --- /dev/null +++ b/PVInstance.cpp @@ -0,0 +1,25 @@ +#include "PVInstance.h" + +PVInstance::PVInstance(void) +{ + Instance::Instance(); +} + +PVInstance::PVInstance(const PVInstance &oinst) +{ + Instance::Instance(oinst); +} + +PVInstance::~PVInstance(void) +{ +} + +std::vector PVInstance::getProperties() +{ + std::vector properties = Instance::getProperties(); + return properties; +} +void PVInstance::PropUpdate(LPPROPGRIDITEM &pItem) +{ + Instance::PropUpdate(pItem); +} diff --git a/PVInstance.h b/PVInstance.h new file mode 100644 index 0000000..99f2233 --- /dev/null +++ b/PVInstance.h @@ -0,0 +1,13 @@ +#pragma once +#include "instance.h" + +class PVInstance : + public Instance +{ +public: + PVInstance(void); + ~PVInstance(void); + PVInstance(const PVInstance &oinst); + virtual std::vector getProperties(); + virtual void PropUpdate(LPPROPGRIDITEM &pItem); +}; diff --git a/PhysicalInstance.cpp b/PartInstance.cpp similarity index 86% rename from PhysicalInstance.cpp rename to PartInstance.cpp index c8734f3..8a1c627 100644 --- a/PhysicalInstance.cpp +++ b/PartInstance.cpp @@ -1,11 +1,11 @@ -#include "PhysicalInstance.h" +#include "PartInstance.h" #include "Globals.h" -PhysicalInstance::PhysicalInstance(void) +PartInstance::PartInstance(void) { - Instance::Instance(); - name = "Default PhysicalInstance"; + PVInstance::PVInstance(); + name = "Default PartInstance"; className = "Part"; canCollide = true; anchored = true; @@ -20,13 +20,15 @@ PhysicalInstance::PhysicalInstance(void) back = Enum::SurfaceType::Smooth; left = Enum::SurfaceType::Smooth; bottom = Enum::SurfaceType::Smooth; + shape = Enum::Shape::Block; } -PhysicalInstance::PhysicalInstance(const PhysicalInstance &oinst) +PartInstance::PartInstance(const PartInstance &oinst) { - Instance::Instance(oinst); + PVInstance::PVInstance(oinst); //name = oinst.name; //className = "Part"; + name = oinst.name; canCollide = oinst.canCollide; setParent(oinst.parent); anchored = oinst.anchored; @@ -41,9 +43,10 @@ PhysicalInstance::PhysicalInstance(const PhysicalInstance &oinst) back = oinst.back; left = oinst.left; bottom = oinst.bottom; + shape = oinst.shape; } -void PhysicalInstance::setSize(Vector3 newSize) +void PartInstance::setSize(Vector3 newSize) { int minsize = 1; int maxsize = 512; @@ -66,42 +69,52 @@ void PhysicalInstance::setSize(Vector3 newSize) if(sizez > 512) sizez = 512; + if(shape != Enum::Shape::Block) + { + int max = sizex; + if(sizey > max) + max = sizey; + if(sizez > max) + max = sizez; + sizex = sizey = sizez = max; + } + size = Vector3(sizex, sizey, sizez); } -Vector3 PhysicalInstance::getSize() +Vector3 PartInstance::getSize() { return size; } -Vector3 PhysicalInstance::getPosition() +Vector3 PartInstance::getPosition() { return position; } -void PhysicalInstance::setPosition(Vector3 pos) +void PartInstance::setPosition(Vector3 pos) { position = pos; cFrame = CoordinateFrame(pos); changed = true; } -CoordinateFrame PhysicalInstance::getCFrame() +CoordinateFrame PartInstance::getCFrame() { return cFrame; } -void PhysicalInstance::setCFrame(CoordinateFrame coordinateFrame) +void PartInstance::setCFrame(CoordinateFrame coordinateFrame) { cFrame = coordinateFrame; position = coordinateFrame.translation; changed = true; } -CoordinateFrame PhysicalInstance::getCFrameRenderBased() +CoordinateFrame PartInstance::getCFrameRenderBased() { return CoordinateFrame(getCFrame().rotation,Vector3(getCFrame().translation.x/2, getCFrame().translation.y/2, getCFrame().translation.z/2)); } -Box PhysicalInstance::getBox() +Box PartInstance::getBox() { if(changed) { @@ -132,12 +145,12 @@ Box PhysicalInstance::getBox() return itemBox; } -bool PhysicalInstance::collides(Box box) +bool PartInstance::collides(Box box) { return CollisionDetection::fixedSolidBoxIntersectsFixedSolidBox(getBox(), box); } -void PhysicalInstance::render(RenderDevice* rd) +void PartInstance::render(RenderDevice* rd) { if(changed) Box box = getBox(); @@ -211,14 +224,14 @@ void PhysicalInstance::render(RenderDevice* rd) } -PhysicalInstance::~PhysicalInstance(void) +PartInstance::~PartInstance(void) { } char pto[512]; char pto2[512]; #include -void PhysicalInstance::PropUpdate(LPPROPGRIDITEM &item) +void PartInstance::PropUpdate(LPPROPGRIDITEM &item) { if(strcmp(item->lpszPropName, "Color3") == 0) { @@ -285,7 +298,7 @@ void PhysicalInstance::PropUpdate(LPPROPGRIDITEM &item) else Instance::PropUpdate(item); } -std::vector PhysicalInstance::getProperties() +std::vector PartInstance::getProperties() { std::vector properties = Instance::getProperties(); diff --git a/PhysicalInstance.h b/PartInstance.h similarity index 78% rename from PhysicalInstance.h rename to PartInstance.h index 70d89b2..84c4fe2 100644 --- a/PhysicalInstance.h +++ b/PartInstance.h @@ -1,15 +1,14 @@ #pragma once -#include "instance.h" +#include "PVInstance.h" #include "Enum.h" -class PhysicalInstance : - public Instance +class PartInstance : public PVInstance { public: - PhysicalInstance(void); - PhysicalInstance(const PhysicalInstance &oinst); - Instance* clone() const { return new PhysicalInstance(*this); } - ~PhysicalInstance(void); + PartInstance(void); + PartInstance(const PartInstance &oinst); + Instance* clone() const { return new PartInstance(*this); } + ~PartInstance(void); virtual void render(RenderDevice*); Vector3 velocity; Enum::SurfaceType::Value top; @@ -18,6 +17,7 @@ public: Enum::SurfaceType::Value back; Enum::SurfaceType::Value left; Enum::SurfaceType::Value bottom; + Enum::Shape::Value shape; CoordinateFrame cFrame; Color3 color; Vector3 getPosition(); diff --git a/TextButtonInstance.cpp b/TextButtonInstance.cpp index 6c8cfd1..5a9b472 100644 --- a/TextButtonInstance.cpp +++ b/TextButtonInstance.cpp @@ -58,6 +58,10 @@ void TextButtonInstance::setAllColorsSame() textOutlineColorDn = textOutlineColor; boxColorDn = boxColor; boxOutlineColorDn = boxOutlineColor; + textColorDis = textColor; + textOutlineColorDis = textOutlineColor; + boxColorDis = boxColor; + boxOutlineColorDis = boxOutlineColor; } TextButtonInstance::~TextButtonInstance(void) @@ -80,7 +84,12 @@ void TextButtonInstance::drawObj(RenderDevice* rd, Vector2 mousePos, bool mouseD point2 = Vector3(boxEnd.x, boxEnd.y,0); } Vector2 RelativeTo = Vector2(point1.x + fontLocationRelativeTo.x, point1.y + fontLocationRelativeTo.y); - if(mouseInArea(point1.x, point1.y, point2.x, point2.y, mousePos.x, mousePos.y) && mouseDown) + if(disabled) + { + Draw::box(Box(point1, point2), rd, boxColorDis, boxOutlineColorDis); + font->draw2D(rd, title, RelativeTo, textSize, textColorDis, textOutlineColorDis); + } + else if(mouseInArea(point1.x, point1.y, point2.x, point2.y, mousePos.x, mousePos.y) && mouseDown) { Draw::box(Box(point1, point2), rd, boxColorDn, boxOutlineColorDn); font->draw2D(rd, title, RelativeTo, textSize, textColorDn, textOutlineColorDn); diff --git a/TextButtonInstance.h b/TextButtonInstance.h index 2f8823c..cc53f7f 100644 --- a/TextButtonInstance.h +++ b/TextButtonInstance.h @@ -21,6 +21,10 @@ public: Color4 textOutlineColorDn; Color4 boxColorDn; Color4 boxOutlineColorDn; + Color4 textColorDis; + Color4 textOutlineColorDis; + Color4 boxColorDis; + Color4 boxOutlineColorDis; bool centeredWithinBox; std::string title; G3D::GFontRef font; diff --git a/WorkspaceInstance.cpp b/WorkspaceInstance.cpp index 2f4d463..47fceec 100644 --- a/WorkspaceInstance.cpp +++ b/WorkspaceInstance.cpp @@ -3,11 +3,10 @@ WorkspaceInstance::WorkspaceInstance(void) { - Instance::Instance(); - name = "Instance"; - className = "Level"; - timer = 60.0F; - score = 0; + GroupInstance::GroupInstance(); + name = "Workspace"; + className = "Workspace"; + canDelete = false; } WorkspaceInstance::~WorkspaceInstance(void) diff --git a/WorkspaceInstance.h b/WorkspaceInstance.h index 26a5bc4..9ca7899 100644 --- a/WorkspaceInstance.h +++ b/WorkspaceInstance.h @@ -1,13 +1,10 @@ #pragma once -#include "instance.h" +#include "GroupInstance.h" class WorkspaceInstance : - public Instance + public GroupInstance { public: - float timer; - int score; WorkspaceInstance(void); ~WorkspaceInstance(void); - }; diff --git a/content/images/ArrowCursor.png b/content/images/ArrowCursor.png new file mode 100644 index 0000000..85c4639 Binary files /dev/null and b/content/images/ArrowCursor.png differ diff --git a/main.cpp b/main.cpp index e07b3ee..90b1ef6 100644 --- a/main.cpp +++ b/main.cpp @@ -20,7 +20,7 @@ #include #include "Instance.h" #include "resource.h" -#include "PhysicalInstance.h" +#include "PartInstance.h" #include "TextButtonInstance.h" #include "ImageButtonInstance.h" #include "DataModelInstance.h" @@ -68,7 +68,10 @@ static std::string cameraSound = ""; static std::string clickSound = ""; static std::string dingSound = ""; static int cursorid = 0; +static int cursorOvrid = 0; +static int currentcursorid = 0; static G3D::TextureRef cursor = NULL; +static G3D::TextureRef cursorOvr = NULL; static bool running = true; static bool mouseMovedBeginMotion = false; static const int CURSOR = 0; @@ -192,9 +195,9 @@ std::string Convert (float number){ } -PhysicalInstance* makePart() +PartInstance* makePart() { - PhysicalInstance* part = new PhysicalInstance(); + PartInstance* part = new PartInstance(); return part; } @@ -246,7 +249,14 @@ public: void GUDButtonListener::onButton1MouseClick(BaseButtonInstance* button) { - if(g_selectedInstances.size() > 0) + bool cont = false; + for(size_t i = 0; i < g_selectedInstances.size(); i++) + if(g_selectedInstances.at(i)->canDelete) + { + cont = true; + break; + } + if(cont) { AudioPlayer::playSound(dingSound); if(button->name == "Duplicate") @@ -254,7 +264,7 @@ void GUDButtonListener::onButton1MouseClick(BaseButtonInstance* button) std::vector newinst; for(size_t i = 0; i < g_selectedInstances.size(); i++) { - if(g_selectedInstances.at(i) != dataModel->getWorkspace()) + if(g_selectedInstances.at(i)->canDelete) { Instance* tempinst = g_selectedInstances.at(i); @@ -283,7 +293,7 @@ void RotateButtonListener::onButton1MouseClick(BaseButtonInstance* button) { Instance* selectedInstance = g_selectedInstances.at(0); AudioPlayer::playSound(clickSound); - if(PhysicalInstance* part = dynamic_cast(selectedInstance)) + if(PartInstance* part = dynamic_cast(selectedInstance)) { if(button->name == "Tilt") part->setCFrame(part->getCFrame()*Matrix3::fromEulerAnglesXYZ(0,0,toRadians(90))); @@ -302,7 +312,7 @@ void deleteInstance() size_t undeletable = 0; while(g_selectedInstances.size() > undeletable) { - if(g_selectedInstances.at(0) != dataModel && g_selectedInstances.at(0) != dataModel->getWorkspace()) + if(g_selectedInstances.at(0)->canDelete) { AudioPlayer::playSound(GetFileInPath("/content/sounds/pageturn.wav")); Instance* selectedInstance = g_selectedInstances.at(0); @@ -503,7 +513,9 @@ void Demo::initGUI() button->boxColor = Color4::clear(); button->textSize = 12; button->title = "Group"; - button->setAllColorsSame(); + button->name = "Group"; + button->setAllColorsSame(); + button->textColorDis = Color3(0.8F,0.8F,0.8F); button->font = fntlighttrek; button->fontLocationRelativeTo = Vector2(10, 0); button->setParent(dataModel->getGuiRoot()); @@ -517,7 +529,9 @@ void Demo::initGUI() button->boxColor = Color4::clear(); button->textSize = 12; button->title = "UnGroup"; + button->name = "UnGroup"; button->setAllColorsSame(); + button->textColorDis = Color3(0.8F,0.8F,0.8F); button->font = fntlighttrek; button->fontLocationRelativeTo = Vector2(10, 0); button->setParent(dataModel->getGuiRoot()); @@ -531,6 +545,7 @@ void Demo::initGUI() button->textSize = 12; button->title = "Duplicate"; button->setAllColorsSame(); + button->textColorDis = Color3(0.8F,0.8F,0.8F); button->font = fntlighttrek; button->fontLocationRelativeTo = Vector2(10, 0); button->setParent(dataModel->getGuiRoot()); @@ -710,7 +725,7 @@ void Demo::onInit() { initGUI(); - PhysicalInstance* test = makePart(); + PartInstance* test = makePart(); test->setParent(dataModel->getWorkspace()); test->color = Color3(0.2F,0.3F,1); test->setSize(Vector3(24,1,24)); @@ -838,14 +853,39 @@ std::vector Demo::getSelection() } void Demo::onSimulation(RealTime rdt, SimTime sdt, SimTime idt) { - Instance* obj = dataModel->getGuiRoot()->findFirstChild("Delete"); - if(obj != NULL) + + + Instance * obj6 = dataModel->getGuiRoot()->findFirstChild("Delete"); + Instance * obj = dataModel->getGuiRoot()->findFirstChild("Duplicate"); + Instance * obj2 = dataModel->getGuiRoot()->findFirstChild("Group"); + Instance * obj3 = dataModel->getGuiRoot()->findFirstChild("UnGroup"); + Instance * obj4 = dataModel->getGuiRoot()->findFirstChild("Rotate"); + Instance * obj5 = dataModel->getGuiRoot()->findFirstChild("Tilt"); + if(obj != NULL && obj2 != NULL && obj3 != NULL && obj4 !=NULL && obj5 != NULL && obj6 != NULL) { - ImageButtonInstance* button = (ImageButtonInstance*)obj; - if(g_selectedInstances.size() <= 0 || g_selectedInstances.at(0) == dataModel->getWorkspace()) - button->disabled = true; - else - button->disabled = false; + BaseButtonInstance* button = (BaseButtonInstance*)obj; + BaseButtonInstance* button2 = (BaseButtonInstance*)obj2; + BaseButtonInstance* button3 = (BaseButtonInstance*)obj3; + BaseButtonInstance* button4 = (BaseButtonInstance*)obj4; + BaseButtonInstance* button5 = (BaseButtonInstance*)obj5; + BaseButtonInstance* button6 = (BaseButtonInstance*)obj6; + button->disabled = true; + button2->disabled = true; + button3->disabled = true; + button4->disabled = true; + button5->disabled = true; + button6->disabled = true; + for(size_t i = 0; i < g_selectedInstances.size(); i++) + if(g_selectedInstances.at(i)->canDelete) + { + button->disabled = false; + button2->disabled = false; + button3->disabled = false; + button4->disabled = false; + button5->disabled = false; + button6->disabled = false; + break; + } } @@ -913,14 +953,14 @@ void Demo::onUserInput(UserInput* ui) { if (GetHoldKeyState(VK_LBUTTON)) { if (dragging) { - PhysicalInstance* part = NULL; + PartInstance* part = NULL; if(g_selectedInstances.size() > 0) - part = (PhysicalInstance*) g_selectedInstances.at(0); + part = (PartInstance*) g_selectedInstances.at(0); Ray dragRay = cameraController.getCamera()->worldRay(dataModel->mousex, dataModel->mousey, renderDevice->getViewport()); std::vector instances = dataModel->getWorkspace()->getAllChildren(); for(size_t i = 0; i < instances.size(); i++) { - if(PhysicalInstance* moveTo = dynamic_cast(instances.at(i))) + if(PartInstance* moveTo = dynamic_cast(instances.at(i))) { float __time = testRay.intersectionTime(moveTo->getBox()); float __nearest=std::numeric_limits::infinity(); @@ -1162,7 +1202,7 @@ void Demo::onGraphics(RenderDevice* rd) { { for(size_t i = 0; i < g_selectedInstances.size(); i++) { - if(PhysicalInstance* part = dynamic_cast(g_selectedInstances.at(i))) + if(PartInstance* part = dynamic_cast(g_selectedInstances.at(i))) { Vector3 size = part->getSize(); Vector3 pos = part->getPosition(); @@ -1197,9 +1237,9 @@ void Demo::onGraphics(RenderDevice* rd) { //TODO--Move these to their own instance std::stringstream stream; - stream << std::fixed << std::setprecision(1) << dataModel->getWorkspace()->timer; + stream << std::fixed << std::setprecision(1) << dataModel->timer; fntdominant->draw2D(rd, "Timer: " + stream.str(), Vector2(rd->getWidth() - 120, 25), 20, Color3::fromARGB(0x81C518), Color3::black()); - fntdominant->draw2D(rd, "Score: " + Convert(dataModel->getWorkspace()->score), Vector2(rd->getWidth() - 120, 50), 20, Color3::fromARGB(0x81C518), Color3::black()); + fntdominant->draw2D(rd, "Score: " + Convert(dataModel->score), Vector2(rd->getWidth() - 120, 50), 20, Color3::fromARGB(0x81C518), Color3::black()); //GUI Boxes Draw::box(G3D::Box(Vector3(0,25,0),Vector3(80,355,0)),rd,Color4(0.6F,0.6F,0.6F,0.4F), Color4(0,0,0,0)); @@ -1225,19 +1265,35 @@ void Demo::onGraphics(RenderDevice* rd) { glEnable(GL_BLEND);// you enable blending function glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + std::vector instances = dataModel->getWorkspace()->getAllChildren(); + currentcursorid = cursorid; + for(size_t i = 0; i < instances.size(); i++) + { + if(PartInstance* test = dynamic_cast(instances.at(i))) + { + float time = cameraController.getCamera()->worldRay(dataModel->mousex, dataModel->mousey, renderDevice->getViewport()).intersectionTime(test->getBox()); + //float time = testRay.intersectionTime(test->getBox()); + if (time != inf()) + { + currentcursorid = cursorOvrid; + break; + } + + } + } - glBindTexture( GL_TEXTURE_2D, cursorid); + glBindTexture( GL_TEXTURE_2D, currentcursorid); glBegin( GL_QUADS ); glTexCoord2d(0.0,0.0); - glVertex2f(mousepos.x-40, mousepos.y-40); + glVertex2f(mousepos.x-64, mousepos.y-64); glTexCoord2d( 1.0,0.0 ); - glVertex2f(mousepos.x+40, mousepos.y-40); + glVertex2f(mousepos.x+64, mousepos.y-64); glTexCoord2d(1.0,1.0 ); - glVertex2f(mousepos.x+40, mousepos.y+40 ); + glVertex2f(mousepos.x+64, mousepos.y+64 ); glTexCoord2d( 0.0,1.0 ); - glVertex2f( mousepos.x-40, mousepos.y+40 ); + glVertex2f( mousepos.x-64, mousepos.y+64 ); glEnd(); glDisable( GL_TEXTURE_2D ); @@ -1291,7 +1347,7 @@ void Demo::onMouseLeftPressed(HWND hwnd,int x,int y) bool objFound = false; for(size_t i = 0; i < instances.size(); i++) { - if(PhysicalInstance* test = dynamic_cast(instances.at(i))) + if(PartInstance* test = dynamic_cast(instances.at(i))) { float time = testRay.intersectionTime(test->getBox()); @@ -1330,8 +1386,8 @@ void Demo::onMouseLeftPressed(HWND hwnd,int x,int y) { while(g_selectedInstances.size() > 0) g_selectedInstances.erase(g_selectedInstances.begin()); - g_selectedInstances.push_back(dataModel->getWorkspace()); - _propWindow->SetProperties(dataModel->getWorkspace()); + g_selectedInstances.push_back(dataModel); + _propWindow->SetProperties(dataModel); } } @@ -1344,7 +1400,7 @@ void Demo::onMouseLeftUp(int x,int y) //message = "Dragging = false."; //messageTime = System::time(); std::vector instances_2D = dataModel->getGuiRoot()->getAllChildren(); - std::vector instances = dataModel->getWorkspace()->getAllChildren(); + //std::vector instances = dataModel->getWorkspace()->getAllChildren(); for(size_t i = 0; i < instances_2D.size(); i++) { if(BaseButtonInstance* button = dynamic_cast(instances_2D[i])) @@ -1545,7 +1601,8 @@ void Demo::run() { UpdateWindow(_hWndMain); // Load objects here= - cursor = Texture::fromFile(GetFileInPath("/content/cursor2.png")); + cursor = Texture::fromFile(GetFileInPath("/content/images/ArrowCursor.png")); + cursorOvr = Texture::fromFile(GetFileInPath("/content/images/DragCursor.png")); Globals::surface = Texture::fromFile(GetFileInPath("/content/images/surfacebr.png")); Globals::surfaceId = Globals::surface->getOpenGLID(); fntdominant = GFont::fromFile(GetFileInPath("/content/font/dominant.fnt")); @@ -1555,7 +1612,8 @@ void Demo::run() { dingSound = GetFileInPath("/content/sounds/electronicpingshort.wav"); sky = Sky::create(NULL, ExePath() + "/content/sky/"); cursorid = cursor->openGLID(); - + currentcursorid = cursorid; + cursorOvrid = cursorOvr->openGLID(); RealTime now=0, lastTime=0; double simTimeRate = 1.0f; float fps=30.0f;