Browse Source

Merge branch 'release/1.9.x'

rdb 9 years ago
parent
commit
7d6b7f40f5

+ 3 - 2
dtool/src/interrogate/interfaceMakerPythonNative.cxx

@@ -2862,9 +2862,10 @@ write_module_class(ostream &out, Object *obj) {
   }
   }
 
 
   string gcflag;
   string gcflag;
-  if (obj->_protocol_types & Object::PT_python_gc) {
+  // Disabled for now because it's too unstable.
+  /*if (obj->_protocol_types & Object::PT_python_gc) {
     gcflag = " | Py_TPFLAGS_HAVE_GC";
     gcflag = " | Py_TPFLAGS_HAVE_GC";
-  }
+  }*/
 
 
   // long tp_flags;
   // long tp_flags;
   if (has_local_getbuffer) {
   if (has_local_getbuffer) {

+ 1 - 1
panda/src/egg2pg/eggLoader.cxx

@@ -2242,7 +2242,7 @@ make_vertex_data(const EggRenderState *render_state,
     PT(GeomVertexArrayFormat) anim_array_format = new GeomVertexArrayFormat;
     PT(GeomVertexArrayFormat) anim_array_format = new GeomVertexArrayFormat;
     anim_array_format->add_column
     anim_array_format->add_column
       (InternalName::get_transform_blend(), 1,
       (InternalName::get_transform_blend(), 1,
-       Geom::NT_uint16, Geom::C_index);
+       Geom::NT_uint16, Geom::C_index, 0, 2);
     temp_format->add_array(anim_array_format);
     temp_format->add_array(anim_array_format);
 
 
     pmap<string, BitArray> slider_names;
     pmap<string, BitArray> slider_names;

+ 4 - 0
panda/src/event/pythonTask.cxx

@@ -319,12 +319,14 @@ __getattr__(PyObject *attr) const {
  */
  */
 int PythonTask::
 int PythonTask::
 __traverse__(visitproc visit, void *arg) {
 __traverse__(visitproc visit, void *arg) {
+/*
   Py_VISIT(_function);
   Py_VISIT(_function);
   Py_VISIT(_args);
   Py_VISIT(_args);
   Py_VISIT(_upon_death);
   Py_VISIT(_upon_death);
   Py_VISIT(_owner);
   Py_VISIT(_owner);
   Py_VISIT(__dict__);
   Py_VISIT(__dict__);
   Py_VISIT(_generator);
   Py_VISIT(_generator);
+*/
   return 0;
   return 0;
 }
 }
 
 
@@ -333,12 +335,14 @@ __traverse__(visitproc visit, void *arg) {
  */
  */
 int PythonTask::
 int PythonTask::
 __clear__() {
 __clear__() {
+/*
   Py_CLEAR(_function);
   Py_CLEAR(_function);
   Py_CLEAR(_args);
   Py_CLEAR(_args);
   Py_CLEAR(_upon_death);
   Py_CLEAR(_upon_death);
   Py_CLEAR(_owner);
   Py_CLEAR(_owner);
   Py_CLEAR(__dict__);
   Py_CLEAR(__dict__);
   Py_CLEAR(_generator);
   Py_CLEAR(_generator);
+*/
   return 0;
   return 0;
 }
 }
 
 

+ 2 - 1
panda/src/gobj/geomVertexArrayFormat.cxx

@@ -363,7 +363,8 @@ align_columns_for_animation() {
       add_column(column->get_name(), 4, column->get_numeric_type(), column->get_contents(), -1, 16);
       add_column(column->get_name(), 4, column->get_numeric_type(), column->get_contents(), -1, 16);
     } else {
     } else {
       add_column(column->get_name(), column->get_num_components(),
       add_column(column->get_name(), column->get_num_components(),
-                 column->get_numeric_type(), column->get_contents());
+                 column->get_numeric_type(), column->get_contents(),
+                 -1, column->get_column_alignment());
     }
     }
   }
   }
 }
 }

+ 119 - 29
panda/src/gobj/texture.cxx

@@ -6652,25 +6652,84 @@ convert_from_pnmimage(PTA_uchar &image, size_t page_size,
 
 
   if (maxval == 255 && component_width == 1) {
   if (maxval == 255 && component_width == 1) {
     // Most common case: one byte per pixel, and the source image shows a
     // Most common case: one byte per pixel, and the source image shows a
-    // maxval of 255.  No scaling is necessary.
-    for (int j = y_size-1; j >= 0; j--) {
-      for (int i = 0; i < x_size; i++) {
-        if (is_grayscale) {
-          store_unscaled_byte(p, pnmimage.get_gray_val(i, j));
-        } else {
-          store_unscaled_byte(p, pnmimage.get_blue_val(i, j));
-          store_unscaled_byte(p, pnmimage.get_green_val(i, j));
-          store_unscaled_byte(p, pnmimage.get_red_val(i, j));
+    // maxval of 255.  No scaling is necessary.  Because this is such a common
+    // case, we break it out per component for best performance.
+    switch (num_components) {
+    case 1:
+      for (int j = y_size-1; j >= 0; j--) {
+        xel *row = pnmimage.row(j);
+        for (int i = 0; i < x_size; i++) {
+          *p++ = (uchar)PPM_GETB(row[i]);
         }
         }
-        if (has_alpha) {
-          if (img_has_alpha) {
-            store_unscaled_byte(p, pnmimage.get_alpha_val(i, j));
-          } else {
-            store_unscaled_byte(p, 255);
+        p += row_skip;
+      }
+      break;
+
+    case 2:
+      if (img_has_alpha) {
+        for (int j = y_size-1; j >= 0; j--) {
+          xel *row = pnmimage.row(j);
+          xelval *alpha_row = pnmimage.alpha_row(j);
+          for (int i = 0; i < x_size; i++) {
+            *p++ = (uchar)PPM_GETB(row[i]);
+            *p++ = (uchar)alpha_row[i];
           }
           }
+          p += row_skip;
+        }
+      } else {
+        for (int j = y_size-1; j >= 0; j--) {
+          xel *row = pnmimage.row(j);
+          for (int i = 0; i < x_size; i++) {
+            *p++ = (uchar)PPM_GETB(row[i]);
+            *p++ = (uchar)255;
+          }
+          p += row_skip;
         }
         }
       }
       }
-      p += row_skip;
+      break;
+
+    case 3:
+      for (int j = y_size-1; j >= 0; j--) {
+        xel *row = pnmimage.row(j);
+        for (int i = 0; i < x_size; i++) {
+          *p++ = (uchar)PPM_GETB(row[i]);
+          *p++ = (uchar)PPM_GETG(row[i]);
+          *p++ = (uchar)PPM_GETR(row[i]);
+        }
+        p += row_skip;
+      }
+      break;
+
+    case 4:
+      if (img_has_alpha) {
+        for (int j = y_size-1; j >= 0; j--) {
+          xel *row = pnmimage.row(j);
+          xelval *alpha_row = pnmimage.alpha_row(j);
+          for (int i = 0; i < x_size; i++) {
+            *p++ = (uchar)PPM_GETB(row[i]);
+            *p++ = (uchar)PPM_GETG(row[i]);
+            *p++ = (uchar)PPM_GETR(row[i]);
+            *p++ = (uchar)alpha_row[i];
+          }
+          p += row_skip;
+        }
+      } else {
+        for (int j = y_size-1; j >= 0; j--) {
+          xel *row = pnmimage.row(j);
+          for (int i = 0; i < x_size; i++) {
+            *p++ = (uchar)PPM_GETB(row[i]);
+            *p++ = (uchar)PPM_GETG(row[i]);
+            *p++ = (uchar)PPM_GETR(row[i]);
+            *p++ = (uchar)255;
+          }
+          p += row_skip;
+        }
+      }
+      break;
+
+    default:
+      nassertv(num_components >= 1 && num_components <= 4);
+      break;
     }
     }
 
 
   } else if (maxval == 65535 && component_width == 2) {
   } else if (maxval == 65535 && component_width == 2) {
@@ -6845,17 +6904,44 @@ convert_to_pnmimage(PNMImage &pnmimage, int x_size, int y_size,
   const unsigned char *p = &image[idx];
   const unsigned char *p = &image[idx];
 
 
   if (component_width == 1) {
   if (component_width == 1) {
-    for (int j = y_size-1; j >= 0; j--) {
-      for (int i = 0; i < x_size; i++) {
-        if (is_grayscale) {
-          pnmimage.set_gray(i, j, get_unsigned_byte(p));
-        } else {
-          pnmimage.set_blue(i, j, get_unsigned_byte(p));
-          pnmimage.set_green(i, j, get_unsigned_byte(p));
-          pnmimage.set_red(i, j, get_unsigned_byte(p));
+    if (is_grayscale) {
+      if (has_alpha) {
+        for (int j = y_size-1; j >= 0; j--) {
+          xel *row = pnmimage.row(j);
+          xelval *alpha_row = pnmimage.alpha_row(j);
+          for (int i = 0; i < x_size; i++) {
+            PPM_PUTB(row[i], *p++);
+            alpha_row[i] = *p++;
+          }
         }
         }
-        if (has_alpha) {
-          pnmimage.set_alpha(i, j, get_unsigned_byte(p));
+      } else {
+        for (int j = y_size-1; j >= 0; j--) {
+          xel *row = pnmimage.row(j);
+          for (int i = 0; i < x_size; i++) {
+            PPM_PUTB(row[i], *p++);
+          }
+        }
+      }
+    } else {
+      if (has_alpha) {
+        for (int j = y_size-1; j >= 0; j--) {
+          xel *row = pnmimage.row(j);
+          xelval *alpha_row = pnmimage.alpha_row(j);
+          for (int i = 0; i < x_size; i++) {
+            PPM_PUTB(row[i], *p++);
+            PPM_PUTG(row[i], *p++);
+            PPM_PUTR(row[i], *p++);
+            alpha_row[i] = *p++;
+          }
+        }
+      } else {
+        for (int j = y_size-1; j >= 0; j--) {
+          xel *row = pnmimage.row(j);
+          for (int i = 0; i < x_size; i++) {
+            PPM_PUTB(row[i], *p++);
+            PPM_PUTG(row[i], *p++);
+            PPM_PUTR(row[i], *p++);
+          }
         }
         }
       }
       }
     }
     }
@@ -7773,11 +7859,15 @@ compare_images(const PNMImage &a, const PNMImage &b) {
 
 
   int delta = 0;
   int delta = 0;
   for (int yi = 0; yi < a.get_y_size(); ++yi) {
   for (int yi = 0; yi < a.get_y_size(); ++yi) {
+    xel *a_row = a.row(yi);
+    xel *b_row = b.row(yi);
+    xelval *a_alpha_row = a.alpha_row(yi);
+    xelval *b_alpha_row = b.alpha_row(yi);
     for (int xi = 0; xi < a.get_x_size(); ++xi) {
     for (int xi = 0; xi < a.get_x_size(); ++xi) {
-      delta += abs(a.get_red_val(xi, yi) - b.get_red_val(xi, yi));
-      delta += abs(a.get_green_val(xi, yi) - b.get_green_val(xi, yi));
-      delta += abs(a.get_blue_val(xi, yi) - b.get_blue_val(xi, yi));
-      delta += abs(a.get_alpha_val(xi, yi) - b.get_alpha_val(xi, yi));
+      delta += abs(PPM_GETR(a_row[xi]) - PPM_GETR(b_row[xi]));
+      delta += abs(PPM_GETG(a_row[xi]) - PPM_GETG(b_row[xi]));
+      delta += abs(PPM_GETB(a_row[xi]) - PPM_GETB(b_row[xi]));
+      delta += abs(a_alpha_row[xi] - b_alpha_row[xi]);
     }
     }
   }
   }
 
 

+ 3 - 3
panda/src/grutil/rigidBodyCombiner.cxx

@@ -210,9 +210,9 @@ convert_vd(const VertexTransform *transform, const GeomVertexData *orig) {
 
 
   PT(GeomVertexFormat) format = new GeomVertexFormat(*orig->get_format());
   PT(GeomVertexFormat) format = new GeomVertexFormat(*orig->get_format());
   if (!orig->get_format()->has_column(InternalName::get_transform_blend())) {
   if (!orig->get_format()->has_column(InternalName::get_transform_blend())) {
-    PT(GeomVertexArrayFormat) af =
-      new GeomVertexArrayFormat(InternalName::get_transform_blend(), 1,
-                                Geom::NT_uint16, Geom::C_index);
+    PT(GeomVertexArrayFormat) af = new GeomVertexArrayFormat();
+    af->add_column(InternalName::get_transform_blend(), 1,
+                   Geom::NT_uint16, Geom::C_index, 0, 2);
     format->add_array(af);
     format->add_array(af);
   }
   }
 
 

+ 1 - 0
panda/src/pnmimage/pnmImage.h

@@ -366,6 +366,7 @@ PUBLISHED:
 
 
 private:
 private:
   friend class Row;
   friend class Row;
+  friend class Texture;
 
 
   xel *_array;
   xel *_array;
   xelval *_alpha;
   xelval *_alpha;