Jelajahi Sumber

Clamp colors to 0-1 range in tinydisplay

rdb 10 tahun lalu
induk
melakukan
a359ef8a0b

+ 9 - 9
panda/src/tinydisplay/clip.cxx

@@ -42,15 +42,15 @@ void gl_transform_to_viewport(GLContext *c,GLVertex *v)
   }
   }
 
 
   /* color */
   /* 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 */
   /* texture */
   if (c->num_textures_enabled >= 1) {
   if (c->num_textures_enabled >= 1) {
     static const int si = 0;
     static const int si = 0;

+ 12 - 8
panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx

@@ -234,6 +234,7 @@ clear(DrawableRegion *clearable) {
   PIXEL color = 0;
   PIXEL color = 0;
   if (clearable->get_clear_color_active()) {
   if (clearable->get_clear_color_active()) {
     LColor v = clearable->get_clear_color();
     LColor v = clearable->get_clear_color();
+    v = v.fmin(LColor(1, 1, 1, 1)).fmax(LColor::zero());
 
 
     if (_current_properties->get_srgb_color()) {
     if (_current_properties->get_srgb_color()) {
       color = SRGBA_TO_PIXEL(
       color = SRGBA_TO_PIXEL(
@@ -697,10 +698,10 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader,
   if (!needs_color) {
   if (!needs_color) {
     const LColor &d = _scene_graph_color;
     const LColor &d = _scene_graph_color;
     const LColor &s = _current_color_scale;
     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;
   bool needs_normal = false;
@@ -756,10 +757,10 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader,
     if (needs_color) {
     if (needs_color) {
       const LColor &d = rcolor.get_data4();
       const LColor &d = rcolor.get_data4();
       const LColor &s = _current_color_scale;
       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) {
         if (_color_material_flags & CMF_ambient) {
         if (_color_material_flags & CMF_ambient) {
@@ -1414,6 +1415,7 @@ framebuffer_copy_to_texture(Texture *tex, int view, int z,
     return false;
     return false;
   }
   }
   LColor border_color = tex->get_border_color();
   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[0] = border_color[0];
   gltex->border_color.v[1] = border_color[1];
   gltex->border_color.v[1] = border_color[1];
   gltex->border_color.v[2] = border_color[2];
   gltex->border_color.v[2] = border_color[2];
@@ -2565,6 +2567,7 @@ upload_texture(TinyTextureContext *gtc, bool force, bool uses_mipmaps) {
     return false;
     return false;
   }
   }
   LColor border_color = tex->get_border_color();
   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[0] = border_color[0];
   gltex->border_color.v[1] = border_color[1];
   gltex->border_color.v[1] = border_color[1];
   gltex->border_color.v[2] = border_color[2];
   gltex->border_color.v[2] = border_color[2];
@@ -2681,6 +2684,7 @@ upload_simple_texture(TinyTextureContext *gtc) {
     return false;
     return false;
   }
   }
   LColor border_color = tex->get_border_color();
   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[0] = border_color[0];
   gltex->border_color.v[1] = border_color[1];
   gltex->border_color.v[1] = border_color[1];
   gltex->border_color.v[2] = border_color[2];
   gltex->border_color.v[2] = border_color[2];