diff --git a/BaseButtonInstance.cpp b/BaseButtonInstance.cpp new file mode 100644 index 0000000..33251e8 --- /dev/null +++ b/BaseButtonInstance.cpp @@ -0,0 +1,29 @@ +#include "BaseButtonInstance.h" + +bool floatBottom; +bool floatRight; +bool floatCenter; + +BaseButtonInstance::BaseButtonInstance(void) +{ +} + +BaseButtonInstance::~BaseButtonInstance(void) +{ +} + +void BaseButtonInstance::drawObj(RenderDevice* rd, Vector2 mousePos, bool mouseDown){} + +bool BaseButtonInstance::mouseInArea(float point1x, float point1y, float point2x, float point2y, float mousex, float mousey) +{ + + + if(mousex >= point1x && mousey >= point1y) + { + if(mousex < point2x && mousey < point2y) + { + return true; + } + } + return false; +} \ No newline at end of file diff --git a/BaseButtonInstance.h b/BaseButtonInstance.h new file mode 100644 index 0000000..3459b9a --- /dev/null +++ b/BaseButtonInstance.h @@ -0,0 +1,15 @@ +#pragma once +#include "instance.h" + +class BaseButtonInstance : public Instance +{ +public: + BaseButtonInstance(void); + ~BaseButtonInstance(void); + virtual void drawObj(RenderDevice* rd, Vector2 mousePos, bool mouseDown); + bool floatBottom; + bool floatRight; + bool floatCenter; +protected: + bool mouseInArea(float, float, float, float, float, float); +}; diff --git a/G3DTest.vcproj b/G3DTest.vcproj index 5b27a90..41d451f 100644 --- a/G3DTest.vcproj +++ b/G3DTest.vcproj @@ -230,6 +230,10 @@ Name="Source Files" Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" > + + @@ -279,6 +283,10 @@ Name="Header Files" Filter="h;hpp;hxx;hm;inl" > + + diff --git a/ImageButtonInstance.cpp b/ImageButtonInstance.cpp index 8b16f19..5912afa 100644 --- a/ImageButtonInstance.cpp +++ b/ImageButtonInstance.cpp @@ -5,6 +5,8 @@ G3D::TextureRef image_ovr = NULL; int openGLID_ovr = 0; G3D::TextureRef image_dn = NULL; int openGLID_dn = 0; +Vector2 size; +Vector2 position; ImageButtonInstance::ImageButtonInstance(G3D::TextureRef newImage = NULL, G3D::TextureRef overImage = NULL, G3D::TextureRef downImage = NULL) { @@ -14,8 +16,53 @@ ImageButtonInstance::ImageButtonInstance(G3D::TextureRef newImage = NULL, G3D::T openGLID_ovr = image_ovr->getOpenGLID(); image_dn = downImage; openGLID_dn = image_dn->getOpenGLID(); + Vector2 size = Vector2(0,0); + Vector2 position = Vector2(0,0); + floatCenter = false; + floatBottom = false; + floatRight = false; + + className = "ImageButton"; } ImageButtonInstance::~ImageButtonInstance(void) { } + +void ImageButtonInstance::drawObj(RenderDevice* rd, Vector2 mousePos, bool mouseDown) +{ + Vector2 positionRelative = position; + int renderimage = openGLID; + if(mouseInArea(position.x, position.y, position.x + size.x, position.y + size.y, mousePos.x, mousePos.y)) + { + if(mouseDown && openGLID_dn != 0) + { + renderimage = openGLID_dn; + } + else if(openGLID_ovr != 0) + { + renderimage = openGLID_ovr; + } + } + + + rd->pushState(); + rd->beforePrimitive(); + glEnable( GL_TEXTURE_2D ); + glEnable(GL_BLEND);// you enable blending function + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBindTexture( GL_TEXTURE_2D, renderimage); + glBegin( GL_QUADS ); + glTexCoord2d(0.0,0.0); + glVertex2f( positionRelative.x, positionRelative.y ); + glTexCoord2d( 1.0,0.0 ); + glVertex2f( positionRelative.x + size.x, positionRelative.y ); + glTexCoord2d( 1.0,1.0 ); + glVertex2f( positionRelative.x + size.x, positionRelative.y + size.y ); + glTexCoord2d( 0.0,1.0 ); + glVertex2f( positionRelative.x, positionRelative.y + size.y ); + glEnd(); + glDisable( GL_TEXTURE_2D ); + rd->afterPrimitive(); + rd->popState(); +} \ No newline at end of file diff --git a/ImageButtonInstance.h b/ImageButtonInstance.h index 139b2b3..e215576 100644 --- a/ImageButtonInstance.h +++ b/ImageButtonInstance.h @@ -1,10 +1,12 @@ #pragma once -#include "instance.h" +#include "BaseButtonInstance.h" -class ImageButtonInstance : - public Instance +class ImageButtonInstance : public BaseButtonInstance { public: ImageButtonInstance(G3D::TextureRef,G3D::TextureRef,G3D::TextureRef); ~ImageButtonInstance(void); + void drawObj(RenderDevice*, Vector2, bool); + Vector2 size; + Vector2 position; }; diff --git a/TextButtonInstance.cpp b/TextButtonInstance.cpp index e22b991..f9e0c13 100644 --- a/TextButtonInstance.cpp +++ b/TextButtonInstance.cpp @@ -18,9 +18,7 @@ bool centeredWithinBox; std::string title; G3D::GFontRef* font; int textSize; -bool floatBottom; -bool floatRight; -bool floatCenter; + bool visible; ButtonListener* buttonListener; @@ -35,6 +33,7 @@ TextButtonInstance::TextButtonInstance(void) textOutlineColor = Color4(0, 0, 0, 0); boxColor = Color4(0.6F,0.6F,0.6F,0.4F); boxOutlineColor = Color4(0, 0, 0, 0); + setAllColorsSame(); textSize = 12; floatBottom = false; floatRight = false; @@ -43,6 +42,18 @@ TextButtonInstance::TextButtonInstance(void) className = "TextButton"; } +void TextButtonInstance::setAllColorsSame() +{ + textColorOvr = textColor; + textOutlineColorOvr = textOutlineColor; + boxColorOvr = boxColor; + boxOutlineColorOvr = boxOutlineColor; + textColorDn = textColor; + textOutlineColorDn = textOutlineColor; + boxColorDn = boxColor; + boxOutlineColorDn = boxOutlineColor; +} + TextButtonInstance::~TextButtonInstance(void) { delete buttonListener; @@ -61,7 +72,7 @@ void TextButtonInstance::onClick() } } -void TextButtonInstance::drawObj(RenderDevice* rd) +void TextButtonInstance::drawObj(RenderDevice* rd, Vector2 mousePos, bool mouseDown) { Vector3 point1; Vector3 point2; @@ -76,8 +87,24 @@ void TextButtonInstance::drawObj(RenderDevice* rd) point1 = Vector3(boxBegin.x, boxBegin.y,0); point2 = Vector3(boxEnd.x, boxEnd.y,0); } - Draw::box(Box(point1, point2), rd, boxColor, boxOutlineColor); Vector2 RelativeTo = Vector2(point1.x + fontLocationRelativeTo.x, point1.y + fontLocationRelativeTo.y); - font->draw2D(rd, title, RelativeTo, textSize, textColor, textOutlineColor); + 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); + } + else if(mouseInArea(point1.x, point1.y, point2.x, point2.y, mousePos.x, mousePos.y)) + { + Draw::box(Box(point1, point2), rd, boxColorOvr, boxOutlineColorOvr); + font->draw2D(rd, title, RelativeTo, textSize, textColorOvr, textOutlineColorOvr); + } + else + { + Draw::box(Box(point1, point2), rd, boxColor, boxOutlineColor); + font->draw2D(rd, title, RelativeTo, textSize, textColor, textOutlineColor); + } +} +void doNullCheck() +{ } \ No newline at end of file diff --git a/TextButtonInstance.h b/TextButtonInstance.h index 8dddb0c..f913210 100644 --- a/TextButtonInstance.h +++ b/TextButtonInstance.h @@ -1,14 +1,14 @@ #pragma once -#include "instance.h" +#include "BaseButtonInstance.h" #pragma once #include "ButtonListener.h" class ButtonListener; -class TextButtonInstance : - public Instance +class TextButtonInstance : public BaseButtonInstance { public: TextButtonInstance(void); ~TextButtonInstance(void); + void setAllColorsSame(void); Vector2 boxBegin; Vector2 boxEnd; Vector2 fontLocationRelativeTo; @@ -27,11 +27,9 @@ public: bool centeredWithinBox; std::string title; G3D::GFontRef font; - bool floatBottom; - bool floatRight; bool visible; int textSize; - void drawObj(G3D::RenderDevice*); + void drawObj(RenderDevice*, Vector2, bool); void setButtonListener(ButtonListener*); void onClick(); }; \ No newline at end of file diff --git a/main.cpp b/main.cpp index 8738808..e25341d 100644 --- a/main.cpp +++ b/main.cpp @@ -15,6 +15,7 @@ #include "resource.h" #include "PhysicalInstance.h" #include "TextButtonInstance.h" +#include "ImageButtonInstance.h" #if G3D_VER < 61000 @@ -139,6 +140,14 @@ TextButtonInstance* makeTextButton() return part; } +ImageButtonInstance* makeImageButton(G3D::TextureRef newImage = NULL, G3D::TextureRef overImage = NULL, G3D::TextureRef downImage = NULL) +{ + ImageButtonInstance* part = new ImageButtonInstance(newImage,overImage, downImage); + instances.push_back(part); + instances_2D.push_back(part); + return part; +} + void initGUI() { @@ -152,6 +161,7 @@ void initGUI() button->textOutlineColor = Color4::clear(); button->title = "Hopper"; button->fontLocationRelativeTo = Vector2(10, 3); + button->setAllColorsSame(); button = makeTextButton(); button->boxBegin = Vector2(0, -48); @@ -163,6 +173,7 @@ void initGUI() button->textOutlineColor = Color4::clear(); button->title = "Controller"; button->fontLocationRelativeTo = Vector2(10, 3); + button->setAllColorsSame(); button = makeTextButton(); button->boxBegin = Vector2(0, -72); @@ -174,6 +185,7 @@ void initGUI() button->textOutlineColor = Color4::clear(); button->title = "Color"; button->fontLocationRelativeTo = Vector2(10, 3); + button->setAllColorsSame(); button = makeTextButton(); button->boxBegin = Vector2(0, -96); @@ -185,6 +197,7 @@ void initGUI() button->textOutlineColor = Color4::clear(); button->title = "Surface"; button->fontLocationRelativeTo = Vector2(10, 3); + button->setAllColorsSame(); button = makeTextButton(); button->boxBegin = Vector2(0, -120); @@ -196,6 +209,7 @@ void initGUI() button->boxOutlineColor = Color3(0,255,255); button->title = "Model"; button->fontLocationRelativeTo = Vector2(10, 3); + button->setAllColorsSame(); button = makeTextButton(); button->boxBegin = Vector2(0, 0); @@ -208,6 +222,7 @@ void initGUI() button->title = "File"; button->textSize = 16; button->fontLocationRelativeTo = Vector2(10, 0); + button->setAllColorsSame(); button = makeTextButton(); button->boxBegin = Vector2(125, 0); @@ -220,6 +235,7 @@ void initGUI() button->title = "Edit"; button->textSize = 16; button->fontLocationRelativeTo = Vector2(10, 0); + button->setAllColorsSame(); button = makeTextButton(); button->boxBegin = Vector2(250, 0); @@ -232,6 +248,7 @@ void initGUI() button->title = "View"; button->textSize = 16; button->fontLocationRelativeTo = Vector2(10, 0); + button->setAllColorsSame(); button = makeTextButton(); button->boxBegin = Vector2(375, 0); @@ -244,6 +261,7 @@ void initGUI() button->title = "Insert"; button->textSize = 16; button->fontLocationRelativeTo = Vector2(10, 0); + button->setAllColorsSame(); button = makeTextButton(); button->boxBegin = Vector2(500, 0); @@ -256,6 +274,12 @@ void initGUI() button->title = "Format"; button->textSize = 16; button->fontLocationRelativeTo = Vector2(10, 0); + button->setAllColorsSame(); + + ImageButtonInstance* instance = makeImageButton(go, go_ovr, go_dn); + instance->size = Vector2(60,60); + instance->position = Vector2(10, 25); + instance->parent = dataModel; } void Demo::onInit() { @@ -635,10 +659,10 @@ void drawButtons(RenderDevice* rd) for(size_t i = 0; i < instances_2D.size(); i++) { Instance* instance = instances_2D.at(i); - if(instance->className == "TextButton" && instance->parent == dataModel) + if((instance->className == "TextButton" || instance->className == "ImageButton") && instance->parent == dataModel) { - TextButtonInstance* tbi = (TextButtonInstance*)instance; - tbi->drawObj(rd); + BaseButtonInstance* tbi = (BaseButtonInstance*)instance; + tbi->drawObj(rd, Vector2(mousex, mousey), mouseButton1Down); } } } @@ -717,7 +741,7 @@ void Demo::onGraphics(RenderDevice* rd) { rd->window()->getRelativeMouseState(mousepos, num); bool mouseOnScreen = true; - if(mousepos.x < 5 || mousepos.y < 5 || mousepos.x > rd->getViewport().width()-5 || mousepos.y > rd->getViewport().height()-5) + if(mousepos.x < 1 || mousepos.y < 1 || mousepos.x >= rd->getViewport().width()-1 || mousepos.y >= rd->getViewport().height()-1) { mouseOnScreen = false; rd->window()->setInputCaptureCount(0); @@ -846,42 +870,10 @@ void Demo::onGraphics(RenderDevice* rd) { //app->debugFont->draw2D("Debug Mode Enabled", Vector2(0,30), 20, Color3::white(), Color3::black()); - + drawButtons(rd); rd->pushState(); rd->beforePrimitive(); - - - glEnable( GL_TEXTURE_2D ); - glEnable(GL_BLEND);// you enable blending function - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - if(mouseInArea(10,25,70,85)) - { - if(mouseButton1Down) - glBindTexture( GL_TEXTURE_2D, go_dn_id); - else - glBindTexture( GL_TEXTURE_2D, go_ovr_id); - } - else - glBindTexture( GL_TEXTURE_2D, go_id); - - glBegin( GL_QUADS ); - glTexCoord2d(0.0,0.0); - glVertex2f( 10, 0+offset ); - glTexCoord2d( 1.0,0.0 ); - glVertex2f( 70, 0+offset ); - glTexCoord2d( 1.0,1.0 ); - glVertex2f( 70, 60+offset ); - glTexCoord2d( 0.0,1.0 ); - glVertex2f( 10, 60+offset ); - glEnd(); - - glDisable( GL_TEXTURE_2D ); - - - - if(showMouse && mouseOnScreen) { glEnable( GL_TEXTURE_2D ); @@ -915,7 +907,7 @@ void Demo::onGraphics(RenderDevice* rd) { - drawButtons(rd); + app->renderDevice->pop2D();