More fancy Sliders for deco colour

This commit is contained in:
Simon Robertshaw 2012-03-05 15:24:52 +00:00
parent 644e6770e4
commit 55acb6aa80
4 changed files with 100 additions and 63 deletions

View File

@ -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<Tool*> tools = sender->GetMenuList()[SC_DECO]->GetToolList();
for(int i = 0; i < tools.size(); i++)

View File

@ -7,6 +7,7 @@
#include <iostream>
#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;

View File

@ -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);

View File

@ -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)