From 9231694f8f83d580b254fdea47ea6c675e95e4a8 Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 14 Jun 2018 14:10:35 +0200 Subject: [PATCH] gobj: fix Python 3 support for GVADHandle::get_(sub)data/set_(sub)data That said, you should really be using the buffer protocol; you can create a memoryview() directly around the GeomVertexArrayData. --- panda/src/gobj/geomVertexArrayData.I | 10 ++++++---- panda/src/gobj/geomVertexArrayData.cxx | 4 ++-- panda/src/gobj/geomVertexArrayData.h | 8 ++++---- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/panda/src/gobj/geomVertexArrayData.I b/panda/src/gobj/geomVertexArrayData.I index d573489ba6..cfe12f9013 100644 --- a/panda/src/gobj/geomVertexArrayData.I +++ b/panda/src/gobj/geomVertexArrayData.I @@ -518,10 +518,11 @@ prepare_now(PreparedGraphicsObjects *prepared_objects, * a string. This is primarily for the benefit of high-level languages such * as Python. */ -INLINE std::string GeomVertexArrayDataHandle:: +INLINE vector_uchar GeomVertexArrayDataHandle:: get_data() const { mark_used(); - return std::string((const char *)_cdata->_buffer.get_read_pointer(true), _cdata->_buffer.get_size()); + const unsigned char *ptr = _cdata->_buffer.get_read_pointer(true); + return vector_uchar(ptr, ptr + _cdata->_buffer.get_size()); } /** @@ -529,12 +530,13 @@ get_data() const { * formatted as a string. This is primarily for the benefit of high-level * languages such as Python. */ -INLINE std::string GeomVertexArrayDataHandle:: +INLINE vector_uchar GeomVertexArrayDataHandle:: get_subdata(size_t start, size_t size) const { mark_used(); start = std::min(start, _cdata->_buffer.get_size()); size = std::min(size, _cdata->_buffer.get_size() - start); - return std::string((const char *)_cdata->_buffer.get_read_pointer(true) + start, size); + const unsigned char *ptr = _cdata->_buffer.get_read_pointer(true) + start; + return vector_uchar(ptr, ptr + size); } /** diff --git a/panda/src/gobj/geomVertexArrayData.cxx b/panda/src/gobj/geomVertexArrayData.cxx index 9b4803d3bf..b868fc87e0 100644 --- a/panda/src/gobj/geomVertexArrayData.cxx +++ b/panda/src/gobj/geomVertexArrayData.cxx @@ -842,7 +842,7 @@ copy_subdata_from(size_t to_start, size_t to_size, * Python. */ void GeomVertexArrayDataHandle:: -set_data(const string &data) { +set_data(const vector_uchar &data) { nassertv(_writable); mark_used(); @@ -864,7 +864,7 @@ set_data(const string &data) { * This is primarily for the benefit of high-level languages like Python. */ void GeomVertexArrayDataHandle:: -set_subdata(size_t start, size_t size, const string &data) { +set_subdata(size_t start, size_t size, const vector_uchar &data) { nassertv(_writable); mark_used(); diff --git a/panda/src/gobj/geomVertexArrayData.h b/panda/src/gobj/geomVertexArrayData.h index 40935563e5..917b27c71a 100644 --- a/panda/src/gobj/geomVertexArrayData.h +++ b/panda/src/gobj/geomVertexArrayData.h @@ -316,10 +316,10 @@ PUBLISHED: PyObject *buffer, size_t from_start, size_t from_size)); - INLINE std::string get_data() const; - void set_data(const std::string &data); - INLINE std::string get_subdata(size_t start, size_t size) const; - void set_subdata(size_t start, size_t size, const std::string &data); + INLINE vector_uchar get_data() const; + void set_data(const vector_uchar &data); + INLINE vector_uchar get_subdata(size_t start, size_t size) const; + void set_subdata(size_t start, size_t size, const vector_uchar &data); INLINE void mark_used() const;