Merge pull request #11176 from bncastle/master

Implement +,-,/, * and negate operators for Color type
This commit is contained in:
Rémi Verschelde 2017-09-17 12:43:21 +02:00 committed by GitHub
commit 2db9973ad4
3 changed files with 141 additions and 5 deletions

View File

@ -400,3 +400,122 @@ Color::operator String() const {
return rtos(r) + ", " + rtos(g) + ", " + rtos(b) + ", " + rtos(a);
}
Color Color::operator+(const Color &p_color) const {
return Color(
CLAMP(r + p_color.r, 0.0, 1.0),
CLAMP(g + p_color.g, 0.0, 1.0),
CLAMP(b + p_color.b, 0.0, 1.0),
CLAMP(a + p_color.a, 0.0, 1.0));
}
void Color::operator+=(const Color &p_color) {
r = CLAMP(r + p_color.r, 0.0, 1.0);
g = CLAMP(g + p_color.g, 0.0, 1.0);
b = CLAMP(b + p_color.b, 0.0, 1.0);
a = CLAMP(a + p_color.a, 0.0, 1.0);
}
Color Color::operator-(const Color &p_color) const {
return Color(
CLAMP(r - p_color.r, 0.0, 1.0),
CLAMP(g - p_color.g, 0.0, 1.0),
CLAMP(b - p_color.b, 0.0, 1.0),
CLAMP(a - p_color.a, 0.0, 1.0));
}
void Color::operator-=(const Color &p_color) {
r = CLAMP(r - p_color.r, 0.0, 1.0);
g = CLAMP(g - p_color.g, 0.0, 1.0);
b = CLAMP(b - p_color.b, 0.0, 1.0);
a = CLAMP(a - p_color.a, 0.0, 1.0);
}
Color Color::operator*(const Color &p_color) const {
return Color(
CLAMP(r * p_color.r, 0.0, 1.0),
CLAMP(g * p_color.g, 0.0, 1.0),
CLAMP(b * p_color.b, 0.0, 1.0),
CLAMP(a * p_color.a, 0.0, 1.0));
}
Color Color::operator*(const real_t &rvalue) const {
return Color(
CLAMP(r * rvalue, 0.0, 1.0),
CLAMP(g * rvalue, 0.0, 1.0),
CLAMP(b * rvalue, 0.0, 1.0),
CLAMP(a * rvalue, 0.0, 1.0));
}
void Color::operator*=(const Color &p_color) {
r = CLAMP(r * p_color.r, 0.0, 1.0);
g = CLAMP(g * p_color.g, 0.0, 1.0);
b = CLAMP(b * p_color.b, 0.0, 1.0);
a = CLAMP(a * p_color.a, 0.0, 1.0);
}
void Color::operator*=(const real_t &rvalue) {
r = CLAMP(r * rvalue, 0.0, 1.0);
g = CLAMP(g * rvalue, 0.0, 1.0);
b = CLAMP(b * rvalue, 0.0, 1.0);
a = CLAMP(a * rvalue, 0.0, 1.0);
};
Color Color::operator/(const Color &p_color) const {
return Color(
p_color.r == 0 ? 1 : CLAMP(r / p_color.r, 0.0, 1.0),
p_color.g == 0 ? 1 : CLAMP(g / p_color.g, 0.0, 1.0),
p_color.b == 0 ? 1 : CLAMP(b / p_color.b, 0.0, 1.0),
p_color.a == 0 ? 1 : CLAMP(a / p_color.a, 0.0, 1.0));
}
Color Color::operator/(const real_t &rvalue) const {
if (rvalue == 0) return Color(1.0, 1.0, 1.0, 1.0);
return Color(
CLAMP(r / rvalue, 0.0, 1.0),
CLAMP(g / rvalue, 0.0, 1.0),
CLAMP(b / rvalue, 0.0, 1.0),
CLAMP(a / rvalue, 0.0, 1.0));
}
void Color::operator/=(const Color &p_color) {
r = p_color.r == 0 ? 1 : CLAMP(r / p_color.r, 0.0, 1.0);
g = p_color.g == 0 ? 1 : CLAMP(g / p_color.g, 0.0, 1.0);
b = p_color.b == 0 ? 1 : CLAMP(b / p_color.b, 0.0, 1.0);
a = p_color.a == 0 ? 1 : CLAMP(a / p_color.a, 0.0, 1.0);
}
void Color::operator/=(const real_t &rvalue) {
if (rvalue == 0) {
r = 1.0;
g = 1.0;
b = 1.0;
a = 1.0;
} else {
r = CLAMP(r / rvalue, 0.0, 1.0);
g = CLAMP(g / rvalue, 0.0, 1.0);
b = CLAMP(b / rvalue, 0.0, 1.0);
a = CLAMP(a / rvalue, 0.0, 1.0);
}
};
Color Color::operator-() const {
return Color(
CLAMP(1.0 - r, 0.0, 1.0),
CLAMP(1.0 - g, 0.0, 1.0),
CLAMP(1.0 - b, 0.0, 1.0),
CLAMP(1.0 - a, 0.0, 1.0));
}

View File

@ -67,6 +67,23 @@ struct Color {
return components[idx];
}
Color operator+(const Color &p_color) const;
void operator+=(const Color &p_color);
Color operator-() const;
Color operator-(const Color &p_color) const;
void operator-=(const Color &p_color);
Color operator*(const Color &p_color) const;
Color operator*(const real_t &rvalue) const;
void operator*=(const Color &p_color);
void operator*=(const real_t &rvalue);
Color operator/(const Color &p_color) const;
Color operator/(const real_t &rvalue) const;
void operator/=(const Color &p_color);
void operator/=(const real_t &rvalue);
void invert();
void contrast();
Color inverted() const;

View File

@ -493,7 +493,7 @@ void Variant::evaluate(const Operator &p_op, const Variant &p_a, const Variant &
DEFAULT_OP_FAIL(BASIS);
DEFAULT_OP_FAIL(TRANSFORM);
DEFAULT_OP_FAIL(COLOR);
DEFAULT_OP_LOCALMEM(+, COLOR, Color);
DEFAULT_OP_FAIL(NODE_PATH);
DEFAULT_OP_FAIL(_RID);
@ -549,7 +549,7 @@ void Variant::evaluate(const Operator &p_op, const Variant &p_a, const Variant &
DEFAULT_OP_FAIL(BASIS);
DEFAULT_OP_FAIL(TRANSFORM);
DEFAULT_OP_FAIL(COLOR);
DEFAULT_OP_LOCALMEM(-, COLOR, Color);
DEFAULT_OP_FAIL(NODE_PATH);
DEFAULT_OP_FAIL(_RID);
@ -645,7 +645,7 @@ void Variant::evaluate(const Operator &p_op, const Variant &p_a, const Variant &
r_valid = false;
return;
} break;
DEFAULT_OP_FAIL(COLOR);
DEFAULT_OP_LOCALMEM_NUM(*, COLOR, Color);
DEFAULT_OP_FAIL(NODE_PATH);
DEFAULT_OP_FAIL(_RID);
@ -717,7 +717,7 @@ void Variant::evaluate(const Operator &p_op, const Variant &p_a, const Variant &
DEFAULT_OP_FAIL(BASIS);
DEFAULT_OP_FAIL(TRANSFORM);
DEFAULT_OP_FAIL(COLOR);
DEFAULT_OP_LOCALMEM_NUM(/, COLOR, Color);
DEFAULT_OP_FAIL(NODE_PATH);
DEFAULT_OP_FAIL(_RID);
@ -797,7 +797,7 @@ void Variant::evaluate(const Operator &p_op, const Variant &p_a, const Variant &
DEFAULT_OP_FAIL(BASIS);
DEFAULT_OP_FAIL(TRANSFORM);
DEFAULT_OP_FAIL(COLOR);
DEFAULT_OP_LOCALMEM_NEG(COLOR, Color);
DEFAULT_OP_FAIL(NODE_PATH);
DEFAULT_OP_FAIL(_RID);