mirror of
https://github.com/The-Powder-Toy/The-Powder-Toy.git
synced 2025-08-11 19:04:05 +02:00
More fancy Sliders for deco colour
This commit is contained in:
@@ -207,11 +207,11 @@ GameView::GameView():
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
ColourChange * colC = new ColourChange(this);
|
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);
|
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);
|
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);
|
colourBSlider->SetActionCallback(colC);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -367,8 +367,11 @@ void GameView::NotifyColourSelectorVisibilityChanged(GameModel * sender)
|
|||||||
void GameView::NotifyColourSelectorColourChanged(GameModel * sender)
|
void GameView::NotifyColourSelectorColourChanged(GameModel * sender)
|
||||||
{
|
{
|
||||||
colourRSlider->SetValue(sender->GetColourSelectorColour().Red);
|
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->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->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();
|
vector<Tool*> tools = sender->GetMenuList()[SC_DECO]->GetToolList();
|
||||||
for(int i = 0; i < tools.size(); i++)
|
for(int i = 0; i < tools.size(); i++)
|
||||||
|
@@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include "Slider.h"
|
#include "Slider.h"
|
||||||
|
#include "Colour.h"
|
||||||
|
|
||||||
namespace ui {
|
namespace ui {
|
||||||
|
|
||||||
@@ -14,7 +15,8 @@ Slider::Slider(Point position, Point size, int steps):
|
|||||||
Component(position, size),
|
Component(position, size),
|
||||||
sliderSteps(steps),
|
sliderSteps(steps),
|
||||||
sliderPosition(0),
|
sliderPosition(0),
|
||||||
isMouseDown(false)
|
isMouseDown(false),
|
||||||
|
bgGradient(NULL)
|
||||||
{
|
{
|
||||||
// TODO Auto-generated constructor stub
|
// TODO Auto-generated constructor stub
|
||||||
|
|
||||||
@@ -73,6 +75,15 @@ int Slider::GetValue()
|
|||||||
return sliderPosition;
|
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)
|
void Slider::SetValue(int value)
|
||||||
{
|
{
|
||||||
if(value < 0)
|
if(value < 0)
|
||||||
@@ -85,8 +96,16 @@ void Slider::SetValue(int value)
|
|||||||
void Slider::Draw(const Point& screenPos)
|
void Slider::Draw(const Point& screenPos)
|
||||||
{
|
{
|
||||||
Graphics * g = Engine::Ref().g;
|
Graphics * g = Engine::Ref().g;
|
||||||
g->drawrect(screenPos.X, screenPos.Y, Size.X, Size.Y, 255, 255, 255, 255);
|
//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);
|
|
||||||
|
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 fPosition = sliderPosition;
|
||||||
float fSize = Size.X-6;
|
float fSize = Size.X-6;
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
#define SLIDER_H_
|
#define SLIDER_H_
|
||||||
|
|
||||||
#include "Component.h"
|
#include "Component.h"
|
||||||
|
#include "Colour.h"
|
||||||
|
|
||||||
namespace ui {
|
namespace ui {
|
||||||
class Slider;
|
class Slider;
|
||||||
@@ -23,6 +24,7 @@ class Slider: public ui::Component {
|
|||||||
int sliderSteps;
|
int sliderSteps;
|
||||||
int sliderPosition;
|
int sliderPosition;
|
||||||
bool isMouseDown;
|
bool isMouseDown;
|
||||||
|
unsigned char * bgGradient;
|
||||||
SliderAction * actionCallback;
|
SliderAction * actionCallback;
|
||||||
void updatePosition(int position);
|
void updatePosition(int position);
|
||||||
public:
|
public:
|
||||||
@@ -31,6 +33,7 @@ public:
|
|||||||
virtual void OnMouseClick(int x, int y, unsigned button);
|
virtual void OnMouseClick(int x, int y, unsigned button);
|
||||||
virtual void OnMouseUp(int x, int y, unsigned button);
|
virtual void OnMouseUp(int x, int y, unsigned button);
|
||||||
virtual void Draw(const Point& screenPos);
|
virtual void Draw(const Point& screenPos);
|
||||||
|
void SetColour(Colour col1, Colour col2);
|
||||||
void SetActionCallback(SliderAction * action) { actionCallback = action; }
|
void SetActionCallback(SliderAction * action) { actionCallback = action; }
|
||||||
int GetValue();
|
int GetValue();
|
||||||
void SetValue(int value);
|
void SetValue(int value);
|
||||||
|
@@ -300,73 +300,85 @@ int Simulation::create_part_add_props(int p, int x, int y, int tv, int rx, int r
|
|||||||
return p;
|
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];
|
rp = pmap[y][x];
|
||||||
if (!rp)
|
if (!rp)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (mode == DECO_DRAW)
|
|
||||||
{
|
|
||||||
parts[rp>>8].dcolour = ((colA<<24)|(colR<<16)|(colG<<8)|colB);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (parts[rp>>8].dcolour == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ta = (parts[rp>>8].dcolour>>24)&0xFF;
|
ta = (parts[rp>>8].dcolour>>24)&0xFF;
|
||||||
tr = (parts[rp>>8].dcolour>>16)&0xFF;
|
tr = (parts[rp>>8].dcolour>>16)&0xFF;
|
||||||
tg = (parts[rp>>8].dcolour>>8)&0xFF;
|
tg = (parts[rp>>8].dcolour>>8)&0xFF;
|
||||||
tb = (parts[rp>>8].dcolour)&0xFF;
|
tb = (parts[rp>>8].dcolour)&0xFF;
|
||||||
|
|
||||||
if (mode == DECO_ADD)
|
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)
|
||||||
{
|
{
|
||||||
ta += colA;
|
ta = colA;
|
||||||
tr += colR;
|
tr = colR;
|
||||||
tg += colG;
|
tg = colG;
|
||||||
tb += colB;
|
tb = colB;
|
||||||
|
}
|
||||||
|
else if (mode == DECO_ADD)
|
||||||
|
{
|
||||||
|
tr += colR*0.05f;
|
||||||
|
tg += colG*0.05f;
|
||||||
|
tb += colB*0.05f;
|
||||||
}
|
}
|
||||||
else if (mode == DECO_SUBTRACT)
|
else if (mode == DECO_SUBTRACT)
|
||||||
{
|
{
|
||||||
ta -= colA;
|
tr -= colR*0.05f;
|
||||||
tr -= colR;
|
tg -= colG*0.05f;
|
||||||
tg -= colG;
|
tb -= colB*0.05f;
|
||||||
tb -= colB;
|
|
||||||
}
|
}
|
||||||
else if (mode == DECO_MULTIPLY)
|
else if (mode == DECO_MULTIPLY)
|
||||||
{
|
{
|
||||||
ta *= (int)((float)(1.0f+((float)colA)/255.0f));
|
tr *= colR*0.05f;
|
||||||
tr *= (int)((float)(1.0f+((float)colR)/255.0f));
|
tg *= colG*0.05f;
|
||||||
tg *= (int)((float)(1.0f+((float)colG)/255.0f));
|
tb *= colB*0.05f;
|
||||||
tb *= (int)((float)(1.0f+((float)colB)/255.0f));
|
|
||||||
}
|
}
|
||||||
else if (mode == DECO_DIVIDE)
|
else if (mode == DECO_DIVIDE)
|
||||||
{
|
{
|
||||||
ta /= (int)((float)(1.0f+((float)colA)/255.0f));
|
if(colR>0)
|
||||||
tr /= (int)((float)(1.0f+((float)colR)/255.0f));
|
tr /= colR*0.05f;
|
||||||
tg /= (int)((float)(1.0f+((float)colG)/255.0f));
|
else
|
||||||
tb /= (int)((float)(1.0f+((float)colB)/255.0f));
|
tr = 0.0f;
|
||||||
}
|
if(colG>0)
|
||||||
if(ta > 255)
|
tg /= colG*0.05f;
|
||||||
ta = 255;
|
else
|
||||||
else if(ta < 0)
|
tg = 0.0f;
|
||||||
ta = 0;
|
if(colB>0)
|
||||||
if(tr > 255)
|
tb /= colB*0.05f;
|
||||||
tr = 255;
|
else
|
||||||
else if(tr < 0)
|
tb = 0.0f;
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
void Simulation::ApplyDecorationPoint(int x, int y, int rx, int ry, int colR, int colG, int colB, int colA, int mode, Brush * cBrush)
|
||||||
|
Reference in New Issue
Block a user