From a359ef8a0b8875dcf3c26ead010aad381ae91774 Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 20 Aug 2015 21:04:32 +0200 Subject: [PATCH] Clamp colors to 0-1 range in tinydisplay --- panda/src/tinydisplay/clip.cxx | 18 ++++++++--------- .../tinydisplay/tinyGraphicsStateGuardian.cxx | 20 +++++++++++-------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/panda/src/tinydisplay/clip.cxx b/panda/src/tinydisplay/clip.cxx index ca1f7930d7..da20a86adc 100644 --- a/panda/src/tinydisplay/clip.cxx +++ b/panda/src/tinydisplay/clip.cxx @@ -42,15 +42,15 @@ void gl_transform_to_viewport(GLContext *c,GLVertex *v) } /* color */ - v->zp.r=(int)(v->color.v[0] * (ZB_POINT_RED_MAX - ZB_POINT_RED_MIN) - + ZB_POINT_RED_MIN); - v->zp.g=(int)(v->color.v[1] * (ZB_POINT_GREEN_MAX - ZB_POINT_GREEN_MIN) - + ZB_POINT_GREEN_MIN); - v->zp.b=(int)(v->color.v[2] * (ZB_POINT_BLUE_MAX - ZB_POINT_BLUE_MIN) - + ZB_POINT_BLUE_MIN); - v->zp.a=(int)(v->color.v[3] * (ZB_POINT_ALPHA_MAX - ZB_POINT_ALPHA_MIN) - + ZB_POINT_ALPHA_MIN); - + v->zp.r=min((int)(v->color.v[0] * (ZB_POINT_RED_MAX - ZB_POINT_RED_MIN)) + + ZB_POINT_RED_MIN, ZB_POINT_RED_MAX); + v->zp.g=min((int)(v->color.v[1] * (ZB_POINT_GREEN_MAX - ZB_POINT_GREEN_MIN)) + + ZB_POINT_GREEN_MIN, ZB_POINT_GREEN_MAX); + v->zp.b=min((int)(v->color.v[2] * (ZB_POINT_BLUE_MAX - ZB_POINT_BLUE_MIN)) + + ZB_POINT_BLUE_MIN, ZB_POINT_BLUE_MAX); + v->zp.a=min((int)(v->color.v[3] * (ZB_POINT_ALPHA_MAX - ZB_POINT_ALPHA_MIN)) + + ZB_POINT_ALPHA_MIN, ZB_POINT_ALPHA_MAX); + /* texture */ if (c->num_textures_enabled >= 1) { static const int si = 0; diff --git a/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx b/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx index e477deae9c..b9efe215c5 100644 --- a/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx +++ b/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx @@ -234,6 +234,7 @@ clear(DrawableRegion *clearable) { PIXEL color = 0; if (clearable->get_clear_color_active()) { LColor v = clearable->get_clear_color(); + v = v.fmin(LColor(1, 1, 1, 1)).fmax(LColor::zero()); if (_current_properties->get_srgb_color()) { color = SRGBA_TO_PIXEL( @@ -697,10 +698,10 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader, if (!needs_color) { const LColor &d = _scene_graph_color; const LColor &s = _current_color_scale; - _c->current_color.v[0] = d[0] * s[0]; - _c->current_color.v[1] = d[1] * s[1]; - _c->current_color.v[2] = d[2] * s[2]; - _c->current_color.v[3] = d[3] * s[3]; + _c->current_color.v[0] = max(d[0] * s[0], (PN_stdfloat)0); + _c->current_color.v[1] = max(d[1] * s[1], (PN_stdfloat)0); + _c->current_color.v[2] = max(d[2] * s[2], (PN_stdfloat)0); + _c->current_color.v[3] = max(d[3] * s[3], (PN_stdfloat)0); } bool needs_normal = false; @@ -756,10 +757,10 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader, if (needs_color) { const LColor &d = rcolor.get_data4(); const LColor &s = _current_color_scale; - _c->current_color.v[0] = d[0] * s[0]; - _c->current_color.v[1] = d[1] * s[1]; - _c->current_color.v[2] = d[2] * s[2]; - _c->current_color.v[3] = d[3] * s[3]; + _c->current_color.v[0] = max(d[0] * s[0], (PN_stdfloat)0); + _c->current_color.v[1] = max(d[1] * s[1], (PN_stdfloat)0); + _c->current_color.v[2] = max(d[2] * s[2], (PN_stdfloat)0); + _c->current_color.v[3] = max(d[3] * s[3], (PN_stdfloat)0); if (_color_material_flags) { if (_color_material_flags & CMF_ambient) { @@ -1414,6 +1415,7 @@ framebuffer_copy_to_texture(Texture *tex, int view, int z, return false; } LColor border_color = tex->get_border_color(); + border_color = border_color.fmin(LColor(1, 1, 1, 1)).fmax(LColor::zero()); gltex->border_color.v[0] = border_color[0]; gltex->border_color.v[1] = border_color[1]; gltex->border_color.v[2] = border_color[2]; @@ -2565,6 +2567,7 @@ upload_texture(TinyTextureContext *gtc, bool force, bool uses_mipmaps) { return false; } LColor border_color = tex->get_border_color(); + border_color = border_color.fmin(LColor(1, 1, 1, 1)).fmax(LColor::zero()); gltex->border_color.v[0] = border_color[0]; gltex->border_color.v[1] = border_color[1]; gltex->border_color.v[2] = border_color[2]; @@ -2681,6 +2684,7 @@ upload_simple_texture(TinyTextureContext *gtc) { return false; } LColor border_color = tex->get_border_color(); + border_color = border_color.fmin(LColor(1, 1, 1, 1)).fmax(LColor::zero()); gltex->border_color.v[0] = border_color[0]; gltex->border_color.v[1] = border_color[1]; gltex->border_color.v[2] = border_color[2];