diff --git a/src/game/GameView.cpp b/src/game/GameView.cpp index 7969ed00c..f84acb1ed 100644 --- a/src/game/GameView.cpp +++ b/src/game/GameView.cpp @@ -207,11 +207,11 @@ GameView::GameView(): } }; ColourChange * colC = new ColourChange(this); - colourRSlider = new ui::Slider(ui::Point(5, Size.Y-40), ui::Point(100, 16), 255); + colourRSlider = new ui::Slider(ui::Point(5, Size.Y-39), ui::Point(80, 14), 255); colourRSlider->SetActionCallback(colC); - colourGSlider = new ui::Slider(ui::Point(115, Size.Y-40), ui::Point(100, 16), 255); + colourGSlider = new ui::Slider(ui::Point(95, Size.Y-39), ui::Point(80, 14), 255); colourGSlider->SetActionCallback(colC); - colourBSlider = new ui::Slider(ui::Point(225, Size.Y-40), ui::Point(100, 16), 255); + colourBSlider = new ui::Slider(ui::Point(185, Size.Y-39), ui::Point(80, 14), 255); colourBSlider->SetActionCallback(colC); } @@ -367,8 +367,11 @@ void GameView::NotifyColourSelectorVisibilityChanged(GameModel * sender) void GameView::NotifyColourSelectorColourChanged(GameModel * sender) { colourRSlider->SetValue(sender->GetColourSelectorColour().Red); + colourRSlider->SetColour(ui::Colour(0, sender->GetColourSelectorColour().Green, sender->GetColourSelectorColour().Blue), ui::Colour(255, sender->GetColourSelectorColour().Green, sender->GetColourSelectorColour().Blue)); colourGSlider->SetValue(sender->GetColourSelectorColour().Green); + colourGSlider->SetColour(ui::Colour(sender->GetColourSelectorColour().Red, 0, sender->GetColourSelectorColour().Blue), ui::Colour(sender->GetColourSelectorColour().Red, 255, sender->GetColourSelectorColour().Blue)); colourBSlider->SetValue(sender->GetColourSelectorColour().Blue); + colourBSlider->SetColour(ui::Colour(sender->GetColourSelectorColour().Red, sender->GetColourSelectorColour().Green, 0), ui::Colour(sender->GetColourSelectorColour().Red, sender->GetColourSelectorColour().Green, 255)); vector tools = sender->GetMenuList()[SC_DECO]->GetToolList(); for(int i = 0; i < tools.size(); i++) diff --git a/src/interface/Slider.cpp b/src/interface/Slider.cpp index 1e141d209..06d6f8750 100644 --- a/src/interface/Slider.cpp +++ b/src/interface/Slider.cpp @@ -7,6 +7,7 @@ #include #include "Slider.h" +#include "Colour.h" namespace ui { @@ -14,7 +15,8 @@ Slider::Slider(Point position, Point size, int steps): Component(position, size), sliderSteps(steps), sliderPosition(0), - isMouseDown(false) + isMouseDown(false), + bgGradient(NULL) { // TODO Auto-generated constructor stub @@ -73,6 +75,15 @@ int Slider::GetValue() return sliderPosition; } +void Slider::SetColour(Colour col1, Colour col2) +{ + if(bgGradient) + free(bgGradient); + bgGradient = (unsigned char*)Graphics::GenerateGradient( + (pixel[2]){PIXRGB(col1.Red, col1.Green, col1.Blue), PIXRGB(col2.Red, col2.Green, col2.Blue)}, + (float[2]){0.0f, 1.0f}, 2, Size.X-6); +} + void Slider::SetValue(int value) { if(value < 0) @@ -85,8 +96,16 @@ void Slider::SetValue(int value) void Slider::Draw(const Point& screenPos) { Graphics * g = Engine::Ref().g; - g->drawrect(screenPos.X, screenPos.Y, Size.X, Size.Y, 255, 255, 255, 255); - g->fillrect(screenPos.X+3, screenPos.Y+3, Size.X-6, Size.Y-6, 255, 255, 255, 255); + //g->drawrect(screenPos.X, screenPos.Y, Size.X, Size.Y, 255, 255, 255, 255); + + if(bgGradient) + { + for (int j = 3; j < Size.Y-6; j++) + for (int i = 3; i < Size.X-6; i++) + g->drawpixel(screenPos.X+i+2, screenPos.Y+j+2, bgGradient[(i-3)*3], bgGradient[(i-3)*3+1], bgGradient[(i-3)*3+2], 255); + } + + g->drawrect(screenPos.X+3, screenPos.Y+3, Size.X-6, Size.Y-6, 255, 255, 255, 255); float fPosition = sliderPosition; float fSize = Size.X-6; diff --git a/src/interface/Slider.h b/src/interface/Slider.h index 682bc0981..4992f802a 100644 --- a/src/interface/Slider.h +++ b/src/interface/Slider.h @@ -9,6 +9,7 @@ #define SLIDER_H_ #include "Component.h" +#include "Colour.h" namespace ui { class Slider; @@ -23,6 +24,7 @@ class Slider: public ui::Component { int sliderSteps; int sliderPosition; bool isMouseDown; + unsigned char * bgGradient; SliderAction * actionCallback; void updatePosition(int position); public: @@ -31,6 +33,7 @@ public: virtual void OnMouseClick(int x, int y, unsigned button); virtual void OnMouseUp(int x, int y, unsigned button); virtual void Draw(const Point& screenPos); + void SetColour(Colour col1, Colour col2); void SetActionCallback(SliderAction * action) { actionCallback = action; } int GetValue(); void SetValue(int value); diff --git a/src/simulation/Simulation.cpp b/src/simulation/Simulation.cpp index 0c6c54ec0..d88d4d61b 100644 --- a/src/simulation/Simulation.cpp +++ b/src/simulation/Simulation.cpp @@ -300,73 +300,85 @@ int Simulation::create_part_add_props(int p, int x, int y, int tv, int rx, int r return p; } -void Simulation::ApplyDecoration(int x, int y, int colR, int colG, int colB, int colA, int mode) +void Simulation::ApplyDecoration(int x, int y, int colR_, int colG_, int colB_, int colA_, int mode) { - int rp, tr, tg, tb, ta; + int rp; + float tr, tg, tb, ta, colR = colR_, colG = colG_, colB = colB_, colA = colA_; rp = pmap[y][x]; if (!rp) return; + ta = (parts[rp>>8].dcolour>>24)&0xFF; + tr = (parts[rp>>8].dcolour>>16)&0xFF; + tg = (parts[rp>>8].dcolour>>8)&0xFF; + tb = (parts[rp>>8].dcolour)&0xFF; + + ta /= 255.0f; tr /= 255.0f; tg /= 255.0f; tb /= 255.0f; + colR /= 255.0f; colG /= 255.0f; colB /= 255.0f; colA /= 255.0f; + if (mode == DECO_DRAW) { - parts[rp>>8].dcolour = ((colA<<24)|(colR<<16)|(colG<<8)|colB); + ta = colA; + tr = colR; + tg = colG; + tb = colB; } - else + else if (mode == DECO_ADD) { - if (parts[rp>>8].dcolour == 0) - return; - - ta = (parts[rp>>8].dcolour>>24)&0xFF; - tr = (parts[rp>>8].dcolour>>16)&0xFF; - tg = (parts[rp>>8].dcolour>>8)&0xFF; - tb = (parts[rp>>8].dcolour)&0xFF; - - if (mode == DECO_ADD) - { - ta += colA; - tr += colR; - tg += colG; - tb += colB; - } - else if (mode == DECO_SUBTRACT) - { - ta -= colA; - tr -= colR; - tg -= colG; - tb -= colB; - } - else if (mode == DECO_MULTIPLY) - { - ta *= (int)((float)(1.0f+((float)colA)/255.0f)); - tr *= (int)((float)(1.0f+((float)colR)/255.0f)); - tg *= (int)((float)(1.0f+((float)colG)/255.0f)); - tb *= (int)((float)(1.0f+((float)colB)/255.0f)); - } - else if (mode == DECO_DIVIDE) - { - ta /= (int)((float)(1.0f+((float)colA)/255.0f)); - tr /= (int)((float)(1.0f+((float)colR)/255.0f)); - tg /= (int)((float)(1.0f+((float)colG)/255.0f)); - tb /= (int)((float)(1.0f+((float)colB)/255.0f)); - } - if(ta > 255) - ta = 255; - else if(ta < 0) - ta = 0; - if(tr > 255) - tr = 255; - else if(tr < 0) - tr = 0; - if(tg > 255) - tg = 255; - else if(tg < 0) - tg = 0; - if(tb > 255) - tb = 255; - else if(tb < 0) - tb = 0; - parts[rp>>8].dcolour = ((ta<<24)|(tr<<16)|(tg<<8)|tb); + tr += colR*0.05f; + tg += colG*0.05f; + tb += colB*0.05f; } + else if (mode == DECO_SUBTRACT) + { + tr -= colR*0.05f; + tg -= colG*0.05f; + tb -= colB*0.05f; + } + else if (mode == DECO_MULTIPLY) + { + tr *= colR*0.05f; + tg *= colG*0.05f; + tb *= colB*0.05f; + } + else if (mode == DECO_DIVIDE) + { + if(colR>0) + tr /= colR*0.05f; + else + tr = 0.0f; + if(colG>0) + tg /= colG*0.05f; + else + tg = 0.0f; + if(colB>0) + tb /= colB*0.05f; + else + tb = 0.0f; + } + + colA_ = ta*255.0f; + colR_ = tr*255.0f; + colG_ = tg*255.0f; + colB_ = tb*255.0f; + + if(colA_ > 255) + colA_ = 255; + else if(colA_ < 0) + colA_ = 0; + if(colR_ > 255) + colR_ = 255; + else if(colR_ < 0) + colR_ = 0; + if(colG_ > 255) + colG_ = 255; + else if(colG_ < 0) + colG_ = 0; + if(colB_ > 255) + colB_ = 255; + else if(colB_ < 0) + colB_ = 0; + parts[rp>>8].dcolour = ((colA_<<24)|(colR_<<16)|(colG_<<8)|colB_); } void Simulation::ApplyDecorationPoint(int x, int y, int rx, int ry, int colR, int colG, int colB, int colA, int mode, Brush * cBrush)