Browse Source

Merge branch 'release/1.10.x'

rdb 7 years ago
parent
commit
9d0b074162

+ 42 - 20
direct/src/showbase/Loader.py

@@ -27,6 +27,42 @@ class Loader(DirectObject):
         # This indicates that this class behaves like a Future.
         # This indicates that this class behaves like a Future.
         _asyncio_future_blocking = False
         _asyncio_future_blocking = False
 
 
+        class ResultAwaiter(object):
+            """Reinvents generators because of PEP 479, sigh.  See #513."""
+
+            __slots__ = 'requestList', 'index'
+
+            def __init__(self, requestList):
+                self.requestList = requestList
+                self.index = 0
+
+            def __await__(self):
+                return self
+
+            def __anext__(self):
+                if self.index >= len(self.requestList):
+                    raise StopAsyncIteration
+                return self
+
+            def __iter__(self):
+                return self
+
+            def __next__(self):
+                i = self.index
+                request = self.requestList[i]
+                if not request.done():
+                    return request
+
+                self.index = i + 1
+
+                result = request.result()
+                if isinstance(result, PandaNode):
+                    result = NodePath(result)
+
+                exc = StopIteration(result)
+                exc.value = result
+                raise exc
+
         def __init__(self, loader, numObjects, gotList, callback, extraArgs):
         def __init__(self, loader, numObjects, gotList, callback, extraArgs):
             self._loader = loader
             self._loader = loader
             self.objects = [None] * numObjects
             self.objects = [None] * numObjects
@@ -81,16 +117,14 @@ class Loader(DirectObject):
         def __await__(self):
         def __await__(self):
             """ Returns a generator that raises StopIteration when the loading
             """ Returns a generator that raises StopIteration when the loading
             is complete.  This allows this class to be used with 'await'."""
             is complete.  This allows this class to be used with 'await'."""
+
             if self.requests:
             if self.requests:
                 self._asyncio_future_blocking = True
                 self._asyncio_future_blocking = True
-                yield self
 
 
-            # This should be a simple return, but older versions of Python
-            # don't allow return statements with arguments.
-            result = self.result()
-            exc = StopIteration(result)
-            exc.value = result
-            raise exc
+            if self.gotList:
+                return self.ResultAwaiter([self])
+            else:
+                return self.ResultAwaiter(self.requestList)
 
 
         def __aiter__(self):
         def __aiter__(self):
             """ This allows using `async for` to iterate asynchronously over
             """ This allows using `async for` to iterate asynchronously over
@@ -100,19 +134,7 @@ class Loader(DirectObject):
             requestList = self.requestList
             requestList = self.requestList
             assert requestList is not None, "Request was cancelled."
             assert requestList is not None, "Request was cancelled."
 
 
-            class AsyncIter:
-                index = 0
-                def __anext__(self):
-                    if self.index < len(requestList):
-                        i = self.index
-                        self.index = i + 1
-                        return requestList[i]
-                    else:
-                        raise StopAsyncIteration
-
-            iter = AsyncIter()
-            iter.objects = self.objects
-            return iter
+            return self.ResultAwaiter(requestList)
 
 
     # special methods
     # special methods
     def __init__(self, base):
     def __init__(self, base):

+ 1 - 0
direct/src/tkwidgets/Valuator.py

@@ -7,6 +7,7 @@ from direct.showbase.TkGlobal import *
 from . import WidgetPropertiesDialog
 from . import WidgetPropertiesDialog
 import Pmw
 import Pmw
 from direct.directtools.DirectUtil import getTkColorString
 from direct.directtools.DirectUtil import getTkColorString
+from panda3d.core import Vec4
 
 
 if sys.version_info >= (3, 0):
 if sys.version_info >= (3, 0):
     from tkinter.colorchooser import askcolor
     from tkinter.colorchooser import askcolor

+ 1 - 1
makepanda/makepackage.py

@@ -473,7 +473,7 @@ def MakeInstallerOSX(version, runtime=False, python_versions=[], **kwargs):
 
 
     dmg_name = "Panda3D-" + version
     dmg_name = "Panda3D-" + version
     if len(python_versions) == 1 and not python_versions[0]["version"].startswith("2."):
     if len(python_versions) == 1 and not python_versions[0]["version"].startswith("2."):
-        dmg_name += "-py" + pyver
+        dmg_name += "-py" + python_versions[0]["version"]
     dmg_name += ".dmg"
     dmg_name += ".dmg"
 
 
     if (os.path.isfile(dmg_name)): oscmd("rm -f %s" % dmg_name)
     if (os.path.isfile(dmg_name)): oscmd("rm -f %s" % dmg_name)

+ 6 - 7
panda/src/event/asyncTaskChain.cxx

@@ -788,18 +788,17 @@ cleanup_task(AsyncTask *task, bool upon_death, bool clean_exit) {
 
 
   _manager->remove_task_by_name(task);
   _manager->remove_task_by_name(task);
 
 
-  if (upon_death && task->set_future_state(clean_exit ? AsyncFuture::FS_finished
-                                                      : AsyncFuture::FS_cancelled)) {
-    task->notify_done(clean_exit);
-  }
-
-  task->_manager = nullptr;
-
   if (upon_death) {
   if (upon_death) {
     _manager->_lock.unlock();
     _manager->_lock.unlock();
+    if (task->set_future_state(clean_exit ? AsyncFuture::FS_finished
+                                          : AsyncFuture::FS_cancelled)) {
+      task->notify_done(clean_exit);
+    }
     task->upon_death(_manager, clean_exit);
     task->upon_death(_manager, clean_exit);
     _manager->_lock.lock();
     _manager->_lock.lock();
   }
   }
+
+  task->_manager = nullptr;
 }
 }
 
 
 /**
 /**

+ 3 - 1
panda/src/event/pythonTask.cxx

@@ -598,7 +598,9 @@ do_python_task() {
             // directly instead of having to do:
             // directly instead of having to do:
             //   await taskMgr.add(Task.pause(1.0))
             //   await taskMgr.add(Task.pause(1.0))
             AsyncTask *task = (AsyncTask *)fut;
             AsyncTask *task = (AsyncTask *)fut;
-            _manager->add(task);
+            if (!task->is_alive()) {
+              _manager->add(task);
+            }
           }
           }
           if (fut->add_waiting_task(this)) {
           if (fut->add_waiting_task(this)) {
             if (task_cat.is_debug()) {
             if (task_cat.is_debug()) {

+ 11 - 7
panda/src/glstuff/glGraphicsBuffer_src.cxx

@@ -1162,12 +1162,6 @@ bind_slot_multisample(bool rb_resize, Texture **attach, RenderTexturePlane slot,
     GLuint gl_format = GL_RGBA;
     GLuint gl_format = GL_RGBA;
 #ifndef OPENGLES
 #ifndef OPENGLES
     switch (slot) {
     switch (slot) {
-      case RTP_aux_rgba_0:
-      case RTP_aux_rgba_1:
-      case RTP_aux_rgba_2:
-      case RTP_aux_rgba_3:
-        gl_format = GL_RGBA;
-        break;
       case RTP_aux_hrgba_0:
       case RTP_aux_hrgba_0:
       case RTP_aux_hrgba_1:
       case RTP_aux_hrgba_1:
       case RTP_aux_hrgba_2:
       case RTP_aux_hrgba_2:
@@ -1180,8 +1174,18 @@ bind_slot_multisample(bool rb_resize, Texture **attach, RenderTexturePlane slot,
       case RTP_aux_float_3:
       case RTP_aux_float_3:
         gl_format = GL_RGBA32F_ARB;
         gl_format = GL_RGBA32F_ARB;
         break;
         break;
+      case RTP_aux_rgba_0:
+      case RTP_aux_rgba_1:
+      case RTP_aux_rgba_2:
+      case RTP_aux_rgba_3:
       default:
       default:
-        gl_format = GL_RGBA;
+        if (_fb_properties.get_srgb_color()) {
+          gl_format = GL_SRGB8_ALPHA8;
+        } else if (_fb_properties.get_float_color()) {
+          gl_format = GL_RGBA32F_ARB;
+        } else {
+          gl_format = GL_RGBA;
+        }
         break;
         break;
     }
     }
 #endif
 #endif

+ 5 - 4
panda/src/glstuff/glShaderContext_src.cxx

@@ -2042,10 +2042,6 @@ set_state_and_transform(const RenderState *target_rs,
         target_rs->get_attrib(MaterialAttrib::get_class_slot())) {
         target_rs->get_attrib(MaterialAttrib::get_class_slot())) {
       altered |= Shader::SSD_material;
       altered |= Shader::SSD_material;
     }
     }
-    if (state_rs->get_attrib(ShaderAttrib::get_class_slot()) !=
-        target_rs->get_attrib(ShaderAttrib::get_class_slot())) {
-      altered |= Shader::SSD_shaderinputs;
-    }
     if (state_rs->get_attrib(FogAttrib::get_class_slot()) !=
     if (state_rs->get_attrib(FogAttrib::get_class_slot()) !=
         target_rs->get_attrib(FogAttrib::get_class_slot())) {
         target_rs->get_attrib(FogAttrib::get_class_slot())) {
       altered |= Shader::SSD_fog;
       altered |= Shader::SSD_fog;
@@ -2069,6 +2065,11 @@ set_state_and_transform(const RenderState *target_rs,
     _state_rs = target_rs;
     _state_rs = target_rs;
   }
   }
 
 
+  if (_shader_attrib.get_orig() != _glgsg->_target_shader || _shader_attrib.was_deleted()) {
+    altered |= Shader::SSD_shaderinputs;
+    _shader_attrib = _glgsg->_target_shader;
+  }
+
   // Is this the first time this shader is used this frame?
   // Is this the first time this shader is used this frame?
   int frame_number = ClockObject::get_global_clock()->get_frame_count();
   int frame_number = ClockObject::get_global_clock()->get_frame_count();
   if (frame_number != _frame_number) {
   if (frame_number != _frame_number) {

+ 1 - 0
panda/src/glstuff/glShaderContext_src.h

@@ -76,6 +76,7 @@ private:
   CPT(TransformState) _camera_transform;
   CPT(TransformState) _camera_transform;
   CPT(TransformState) _projection_transform;
   CPT(TransformState) _projection_transform;
   CPT(ColorAttrib) _color_attrib;
   CPT(ColorAttrib) _color_attrib;
+  WCPT(ShaderAttrib) _shader_attrib;
 
 
 /*
 /*
  * struct ParamContext { CPT(InternalName) _name; GLint _location; GLsizei
  * struct ParamContext { CPT(InternalName) _name; GLint _location; GLsizei

+ 23 - 5
panda/src/putil/datagramInputFile.cxx

@@ -109,7 +109,7 @@ read_header(std::string &header, size_t num_bytes) {
   nassertr(buffer != nullptr, false);
   nassertr(buffer != nullptr, false);
 
 
   _in->read(buffer, num_bytes);
   _in->read(buffer, num_bytes);
-  if (_in->fail() || _in->eof()) {
+  if (_in->fail()) {
     return false;
     return false;
   }
   }
 
 
@@ -130,7 +130,7 @@ get_datagram(Datagram &data) {
   // First, get the size of the upcoming datagram.
   // First, get the size of the upcoming datagram.
   StreamReader reader(_in, false);
   StreamReader reader(_in, false);
   uint32_t num_bytes_32 = reader.get_uint32();
   uint32_t num_bytes_32 = reader.get_uint32();
-  if (_in->fail() || _in->eof()) {
+  if (_in->fail()) {
     return false;
     return false;
   }
   }
 
 
@@ -141,16 +141,29 @@ get_datagram(Datagram &data) {
     return true;
     return true;
   }
   }
 
 
+  if (_in->eof()) {
+    return false;
+  }
+
   size_t num_bytes = (size_t)num_bytes_32;
   size_t num_bytes = (size_t)num_bytes_32;
   if (num_bytes_32 == (uint32_t)-1) {
   if (num_bytes_32 == (uint32_t)-1) {
     // Another special case for a value larger than 32 bits.
     // Another special case for a value larger than 32 bits.
     uint64_t num_bytes_64 = reader.get_uint64();
     uint64_t num_bytes_64 = reader.get_uint64();
 
 
-    if (_in->fail() || _in->eof()) {
+    if (_in->fail()) {
       _error = true;
       _error = true;
       return false;
       return false;
     }
     }
 
 
+    if (num_bytes_64 == 0) {
+      data.clear();
+      return false;
+    }
+
+    if (_in->eof()) {
+      return false;
+    }
+
     num_bytes = (size_t)num_bytes_64;
     num_bytes = (size_t)num_bytes_64;
 
 
     // Make sure we have a reasonable datagram size for putting into memory.
     // Make sure we have a reasonable datagram size for putting into memory.
@@ -169,6 +182,11 @@ get_datagram(Datagram &data) {
   while (bytes_read < num_bytes) {
   while (bytes_read < num_bytes) {
     size_t bytes_left = num_bytes - bytes_read;
     size_t bytes_left = num_bytes - bytes_read;
 
 
+    if (_in->eof()) {
+      _error = true;
+      return false;
+    }
+
     // Hold up a second - datagrams >4MB are pretty large by bam/network
     // Hold up a second - datagrams >4MB are pretty large by bam/network
     // standards. Let's take it 4MB at a time just in case the length is
     // standards. Let's take it 4MB at a time just in case the length is
     // corrupt, so we don't allocate potentially a few GBs of RAM only to
     // corrupt, so we don't allocate potentially a few GBs of RAM only to
@@ -180,7 +198,7 @@ get_datagram(Datagram &data) {
     unsigned char *ptr = &buffer.p()[bytes_read];
     unsigned char *ptr = &buffer.p()[bytes_read];
 
 
     _in->read((char *)ptr, (streamsize)bytes_left);
     _in->read((char *)ptr, (streamsize)bytes_left);
-    if (_in->fail() || _in->eof()) {
+    if (_in->fail()) {
       _error = true;
       _error = true;
       return false;
       return false;
     }
     }
@@ -210,7 +228,7 @@ save_datagram(SubfileInfo &info) {
   // First, get the size of the upcoming datagram.
   // First, get the size of the upcoming datagram.
   StreamReader reader(_in, false);
   StreamReader reader(_in, false);
   size_t num_bytes_32 = reader.get_uint32();
   size_t num_bytes_32 = reader.get_uint32();
-  if (_in->fail() || _in->eof()) {
+  if (_in->fail() || (_in->eof() && num_bytes_32 > 0)) {
     return false;
     return false;
   }
   }
 
 

+ 25 - 24
pandatool/src/flt/fltRecordReader.cxx

@@ -131,20 +131,21 @@ advance(bool ok_eof) {
 
 
   // And now read the full record based on the length.
   // And now read the full record based on the length.
   int length = _next_record_length - header_size;
   int length = _next_record_length - header_size;
-  char *buffer = new char[length];
   if (length > 0) {
   if (length > 0) {
-    _in.read(buffer, length);
-  }
-  _datagram = Datagram(buffer, length);
-  delete[] buffer;
-
-  if (_in.eof()) {
-    _state = S_eof;
-    assert(!flt_error_abort);
-    return FE_end_of_file;
+    vector_uchar data((size_t)length);
+    _in.read((char *)&data[0], length);
+    _datagram = Datagram(std::move(data));
+  } else {
+    _datagram = Datagram();
   }
   }
 
 
   if (_in.fail()) {
   if (_in.fail()) {
+    if (_in.eof()) {
+      _state = S_eof;
+      assert(!flt_error_abort);
+      return FE_end_of_file;
+    }
+
     _state = S_error;
     _state = S_error;
     assert(!flt_error_abort);
     assert(!flt_error_abort);
     return FE_read_error;
     return FE_read_error;
@@ -162,20 +163,20 @@ advance(bool ok_eof) {
     _record_length += _next_record_length;
     _record_length += _next_record_length;
     length = _next_record_length - header_size;
     length = _next_record_length - header_size;
 
 
-    buffer = new char[length];
     if (length > 0) {
     if (length > 0) {
+      char *buffer = new char[length];
       _in.read(buffer, length);
       _in.read(buffer, length);
-    }
-    _datagram.append_data(buffer, length);
-    delete[] buffer;
-
-    if (_in.eof()) {
-      _state = S_eof;
-      assert(!flt_error_abort);
-      return FE_end_of_file;
+      _datagram.append_data(buffer, length);
+      delete[] buffer;
     }
     }
 
 
     if (_in.fail()) {
     if (_in.fail()) {
+      if (_in.eof()) {
+        _state = S_eof;
+        assert(!flt_error_abort);
+        return FE_end_of_file;
+      }
+
       _state = S_error;
       _state = S_error;
       assert(!flt_error_abort);
       assert(!flt_error_abort);
       return FE_read_error;
       return FE_read_error;
@@ -221,11 +222,11 @@ read_next_header() {
   char bytes[header_size];
   char bytes[header_size];
   _in.read(bytes, header_size);
   _in.read(bytes, header_size);
 
 
-  if (_in.eof()) {
-    _next_error = FE_end_of_file;
-    return;
-
-  } else if (_in.fail()) {
+  if (_in.fail()) {
+    if (_in.eof()) {
+      _next_error = FE_end_of_file;
+      return;
+    }
     _next_error = FE_read_error;
     _next_error = FE_read_error;
     return;
     return;
   }
   }