Browse Source

Merge branch 'master' into cmake

Sam Edwards 8 years ago
parent
commit
79f9ac402f

+ 4 - 2
direct/src/distributed/DistributedObject.py

@@ -4,7 +4,6 @@ from panda3d.core import *
 from panda3d.direct import *
 from direct.directnotify.DirectNotifyGlobal import directNotify
 from direct.distributed.DistributedObjectBase import DistributedObjectBase
-from direct.showbase.PythonUtil import StackTrace
 #from PyDatagram import PyDatagram
 #from PyDatagramIterator import PyDatagramIterator
 
@@ -259,7 +258,10 @@ class DistributedObject(DistributedObjectBase):
     def _destroyDO(self):
         # after this is called, the object is no longer a DistributedObject
         # but may still be used as a DelayDeleted object
-        self.destroyDoStackTrace = StackTrace()
+        if __debug__:
+            # StackTrace is omitted in packed versions
+            from direct.showbase.PythonUtil import StackTrace
+            self.destroyDoStackTrace = StackTrace()
         # check for leftover cached data that was not retrieved or flushed by this object
         # this will catch typos in the data name in calls to get/setCachedData
         if hasattr(self, '_cachedData'):

+ 0 - 1
direct/src/distributed/DoCollectionManager.py

@@ -312,7 +312,6 @@ class DoCollectionManager:
         else:
             self.notify.warning('handleSetLocation: object %s not present' % self.getMsgChannel())
 
-    @exceptionLogged()
     def storeObjectLocation(self, object, parentId, zoneId):
         oldParentId = object.parentId
         oldZoneId = object.zoneId

+ 6 - 0
panda/src/display/displayInformation.cxx

@@ -15,11 +15,13 @@
 #include "displayInformation.h"
 
 // For __rdtsc
+#if defined(__i386) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
 #ifdef _MSC_VER
 #include <intrin.h>
 #elif defined(__GNUC__) && !defined(__clang__)
 #include <x86intrin.h>
 #endif
+#endif
 
 /**
  * Returns true if these two DisplayModes are identical.
@@ -529,6 +531,7 @@ get_cpu_frequency() {
  */
 uint64_t DisplayInformation::
 get_cpu_time() {
+#if defined(__i386) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
 #if defined(_MSC_VER) || (defined(__GNUC__) && !defined(__clang__))
   return __rdtsc();
 #else
@@ -536,6 +539,9 @@ get_cpu_time() {
   __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
   return ((uint64_t)hi << 32) | lo;
 #endif
+#else
+  return 0;
+#endif
 }
 
 /**

+ 13 - 7
panda/src/display/graphicsPipe.cxx

@@ -28,6 +28,16 @@
 #include <unistd.h>
 #endif
 
+#ifdef _WIN32
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN 1
+#endif
+#include <windows.h>
+#endif
+
+// CPUID is only available on i386 and x86-64 architectures.
+#if defined(__i386) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
+
 #if defined(__GNUC__) && !defined(__APPLE__)
 // GCC and Clang offer a useful cpuid.h header.
 #include <cpuid.h>
@@ -38,13 +48,6 @@
 #include <intrin.h>
 #endif
 
-#ifdef _WIN32
-#ifndef WIN32_LEAN_AND_MEAN
-#define WIN32_LEAN_AND_MEAN 1
-#endif
-#include <windows.h>
-#endif
-
 union cpuid_info {
   char str[16];
   struct {
@@ -85,6 +88,7 @@ static inline void get_cpuid(uint32_t leaf, cpuid_info &info) {
            : "0" (leaf));
 #endif
 }
+#endif
 
 #ifdef IS_LINUX
 /**
@@ -123,6 +127,7 @@ GraphicsPipe() :
 
   _display_information = new DisplayInformation();
 
+#if defined(__i386) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
   cpuid_info info;
   const uint32_t max_cpuid = get_cpuid_max(0);
   const uint32_t max_extended = get_cpuid_max(0x80000000);
@@ -148,6 +153,7 @@ GraphicsPipe() :
     brand[48] = 0;
     _display_information->_cpu_brand_string = brand;
   }
+#endif
 
 #if defined(IS_OSX)
   // macOS exposes a lot of useful information through sysctl.

+ 2 - 2
panda/src/glstuff/glShaderContext_src.cxx

@@ -2194,7 +2194,7 @@ update_shader_vertex_arrays(ShaderContext *prev, bool force) {
     // Figure out which attributes to enable or disable.
     BitMask32 enabled_attribs = _enabled_attribs;
     if (_color_attrib_index != -1 &&
-        color_attrib->get_type() != ColorAttrib::T_vertex) {
+        color_attrib->get_color_type() != ColorAttrib::T_vertex) {
       // Vertex colours are disabled.
       enabled_attribs.clear_bit(_color_attrib_index);
 
@@ -2247,7 +2247,7 @@ update_shader_vertex_arrays(ShaderContext *prev, bool force) {
       // Don't apply vertex colors if they are disabled with a ColorAttrib.
       int num_elements, element_stride, divisor;
       bool normalized;
-      if ((p != _color_attrib_index || color_attrib->get_type() == ColorAttrib::T_vertex) &&
+      if ((p != _color_attrib_index || color_attrib->get_color_type() == ColorAttrib::T_vertex) &&
           _glgsg->_data_reader->get_array_info(name, array_reader,
                                                num_values, numeric_type,
                                                normalized, start, stride, divisor,

+ 50 - 0
panda/src/gobj/geomVertexArrayData.I

@@ -283,6 +283,31 @@ GeomVertexArrayDataHandle(CPT(GeomVertexArrayData) object,
 #endif
 }
 
+/**
+ *
+ */
+INLINE GeomVertexArrayDataHandle::
+GeomVertexArrayDataHandle(const GeomVertexArrayData *object,
+                          Thread *current_thread) :
+  _object((GeomVertexArrayData *)object),
+  _current_thread(current_thread),
+  _cdata((GeomVertexArrayData::CData *)object->_cycler.read_unlocked(current_thread)),
+  _writable(false)
+{
+#ifdef _DEBUG
+  nassertv(_object->test_ref_count_nonzero());
+#endif // _DEBUG
+#ifdef DO_PIPELINING
+  _cdata->ref();
+#endif  // DO_PIPELINING
+  // We must grab the lock *after* we have incremented the reference count,
+  // above.
+  _cdata->_rw_lock.acquire();
+#ifdef DO_MEMORY_USAGE
+  MemoryUsage::update_type(this, get_class_type());
+#endif
+}
+
 /**
  *
  */
@@ -309,6 +334,31 @@ GeomVertexArrayDataHandle(PT(GeomVertexArrayData) object,
 #endif
 }
 
+/**
+ *
+ */
+INLINE GeomVertexArrayDataHandle::
+GeomVertexArrayDataHandle(GeomVertexArrayData *object,
+                          Thread *current_thread) :
+  _object(object),
+  _current_thread(current_thread),
+  _cdata(object->_cycler.write_upstream(true, current_thread)),
+  _writable(true)
+{
+#ifdef _DEBUG
+  nassertv(_object->test_ref_count_nonzero());
+#endif // _DEBUG
+#ifdef DO_PIPELINING
+  _cdata->ref();
+#endif  // DO_PIPELINING
+  // We must grab the lock *after* we have incremented the reference count,
+  // above.
+  _cdata->_rw_lock.acquire();
+#ifdef DO_MEMORY_USAGE
+  MemoryUsage::update_type(this, get_class_type());
+#endif
+}
+
 /**
  * Don't attempt to copy these objects.
  */

+ 4 - 0
panda/src/gobj/geomVertexArrayData.h

@@ -250,8 +250,12 @@ class EXPCL_PANDA_GOBJ GeomVertexArrayDataHandle : public ReferenceCount, public
 private:
   INLINE GeomVertexArrayDataHandle(CPT(GeomVertexArrayData) object,
                                    Thread *current_thread);
+  INLINE GeomVertexArrayDataHandle(const GeomVertexArrayData *object,
+                                   Thread *current_thread);
   INLINE GeomVertexArrayDataHandle(PT(GeomVertexArrayData) object,
                                    Thread *current_thread);
+  INLINE GeomVertexArrayDataHandle(GeomVertexArrayData *object,
+                                   Thread *current_thread);
   INLINE GeomVertexArrayDataHandle(const GeomVertexArrayDataHandle &);
   INLINE void operator = (const GeomVertexArrayDataHandle &);
 

+ 8 - 1
panda/src/gobj/texture.I

@@ -1544,7 +1544,14 @@ INLINE size_t Texture::
 get_ram_mipmap_image_size(int n) const {
   CDReader cdata(_cycler);
   if (n >= 0 && n < (int)cdata->_ram_images.size()) {
-    return cdata->_ram_images[n]._image.size();
+    if (cdata->_ram_images[n]._pointer_image == nullptr) {
+      return cdata->_ram_images[n]._image.size();
+    } else {
+      // Calculate it based on the given page size.
+      return do_get_ram_mipmap_page_size(cdata, n) *
+             do_get_expected_mipmap_z_size(cdata, n) *
+             cdata->_num_views;
+    }
   }
   return 0;
 }

+ 2 - 2
panda/src/gobj/texture.cxx

@@ -3441,8 +3441,8 @@ do_load_sub_image(CData *cdata, const PNMImage &image, int x, int y, int z, int
   nassertr(y >= 0 && y < tex_y_size, false);
   nassertr(z >= 0 && z < tex_z_size, false);
 
-  nassertr(image.get_x_size() + x < tex_x_size, false);
-  nassertr(image.get_y_size() + y < tex_y_size, false);
+  nassertr(image.get_x_size() + x <= tex_x_size, false);
+  nassertr(image.get_y_size() + y <= tex_y_size, false);
 
   // Flip y
   y = cdata->_y_size - (image.get_y_size() + y);

+ 1 - 0
panda/src/pgraphnodes/directionalLight.cxx

@@ -59,6 +59,7 @@ DirectionalLight(const string &name) :
   LightLensNode(name, new OrthographicLens()),
   _has_specular_color(false)
 {
+  _lenses[0]._lens->set_interocular_distance(0);
 }
 
 /**

+ 6 - 0
panda/src/pgraphnodes/pointLight.cxx

@@ -66,21 +66,27 @@ PointLight(const string &name) :
 {
   PT(Lens) lens;
   lens = new PerspectiveLens(90, 90);
+  lens->set_interocular_distance(0);
   lens->set_view_vector(1, 0, 0, 0, -1, 0);
   set_lens(0, lens);
   lens = new PerspectiveLens(90, 90);
+  lens->set_interocular_distance(0);
   lens->set_view_vector(-1, 0, 0, 0, -1, 0);
   set_lens(1, lens);
   lens = new PerspectiveLens(90, 90);
+  lens->set_interocular_distance(0);
   lens->set_view_vector(0, 1, 0, 0, 0, 1);
   set_lens(2, lens);
   lens = new PerspectiveLens(90, 90);
+  lens->set_interocular_distance(0);
   lens->set_view_vector(0, -1, 0, 0, 0, -1);
   set_lens(3, lens);
   lens = new PerspectiveLens(90, 90);
+  lens->set_interocular_distance(0);
   lens->set_view_vector(0, 0, 1, 0, -1, 0);
   set_lens(4, lens);
   lens = new PerspectiveLens(90, 90);
+  lens->set_interocular_distance(0);
   lens->set_view_vector(0, 0, -1, 0, -1, 0);
   set_lens(5, lens);
 }

+ 1 - 0
panda/src/pgraphnodes/spotlight.cxx

@@ -68,6 +68,7 @@ Spotlight(const string &name) :
   LightLensNode(name),
   _has_specular_color(false)
 {
+  _lenses[0]._lens->set_interocular_distance(0);
 }
 
 /**