|
@@ -27,9 +27,8 @@
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
INLINE GeomVertexWriter::
|
|
INLINE GeomVertexWriter::
|
|
|
GeomVertexWriter() :
|
|
GeomVertexWriter() :
|
|
|
- _data_writer(NULL),
|
|
|
|
|
- _array_writer(NULL),
|
|
|
|
|
- _owns_writer(false)
|
|
|
|
|
|
|
+ _vertex_data(NULL),
|
|
|
|
|
+ _current_thread(Thread::get_current_thread())
|
|
|
{
|
|
{
|
|
|
initialize();
|
|
initialize();
|
|
|
}
|
|
}
|
|
@@ -42,9 +41,8 @@ GeomVertexWriter() :
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
INLINE GeomVertexWriter::
|
|
INLINE GeomVertexWriter::
|
|
|
GeomVertexWriter(GeomVertexData *vertex_data) :
|
|
GeomVertexWriter(GeomVertexData *vertex_data) :
|
|
|
- _data_writer(new GeomVertexDataPipelineWriter(vertex_data, true, Thread::get_current_thread())),
|
|
|
|
|
- _array_writer(NULL),
|
|
|
|
|
- _owns_writer(true)
|
|
|
|
|
|
|
+ _vertex_data(vertex_data),
|
|
|
|
|
+ _current_thread(Thread::get_current_thread())
|
|
|
{
|
|
{
|
|
|
initialize();
|
|
initialize();
|
|
|
}
|
|
}
|
|
@@ -58,9 +56,8 @@ GeomVertexWriter(GeomVertexData *vertex_data) :
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
INLINE GeomVertexWriter::
|
|
INLINE GeomVertexWriter::
|
|
|
GeomVertexWriter(GeomVertexData *vertex_data, const string &name) :
|
|
GeomVertexWriter(GeomVertexData *vertex_data, const string &name) :
|
|
|
- _data_writer(new GeomVertexDataPipelineWriter(vertex_data, true, Thread::get_current_thread())),
|
|
|
|
|
- _array_writer(NULL),
|
|
|
|
|
- _owns_writer(true)
|
|
|
|
|
|
|
+ _vertex_data(vertex_data),
|
|
|
|
|
+ _current_thread(Thread::get_current_thread())
|
|
|
{
|
|
{
|
|
|
initialize();
|
|
initialize();
|
|
|
set_column(name);
|
|
set_column(name);
|
|
@@ -75,9 +72,8 @@ GeomVertexWriter(GeomVertexData *vertex_data, const string &name) :
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
INLINE GeomVertexWriter::
|
|
INLINE GeomVertexWriter::
|
|
|
GeomVertexWriter(GeomVertexData *vertex_data, const InternalName *name) :
|
|
GeomVertexWriter(GeomVertexData *vertex_data, const InternalName *name) :
|
|
|
- _data_writer(new GeomVertexDataPipelineWriter(vertex_data, true, Thread::get_current_thread())),
|
|
|
|
|
- _array_writer(NULL),
|
|
|
|
|
- _owns_writer(true)
|
|
|
|
|
|
|
+ _vertex_data(vertex_data),
|
|
|
|
|
+ _current_thread(Thread::get_current_thread())
|
|
|
{
|
|
{
|
|
|
initialize();
|
|
initialize();
|
|
|
set_column(name);
|
|
set_column(name);
|
|
@@ -91,9 +87,8 @@ GeomVertexWriter(GeomVertexData *vertex_data, const InternalName *name) :
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
INLINE GeomVertexWriter::
|
|
INLINE GeomVertexWriter::
|
|
|
GeomVertexWriter(GeomVertexArrayData *array_data) :
|
|
GeomVertexWriter(GeomVertexArrayData *array_data) :
|
|
|
- _data_writer(NULL),
|
|
|
|
|
- _array_writer(new GeomVertexArrayDataPipelineWriter(array_data, true, Thread::get_current_thread())),
|
|
|
|
|
- _owns_writer(true)
|
|
|
|
|
|
|
+ _array_data(array_data),
|
|
|
|
|
+ _current_thread(Thread::get_current_thread())
|
|
|
{
|
|
{
|
|
|
initialize();
|
|
initialize();
|
|
|
}
|
|
}
|
|
@@ -106,9 +101,8 @@ GeomVertexWriter(GeomVertexArrayData *array_data) :
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
INLINE GeomVertexWriter::
|
|
INLINE GeomVertexWriter::
|
|
|
GeomVertexWriter(GeomVertexArrayData *array_data, int column) :
|
|
GeomVertexWriter(GeomVertexArrayData *array_data, int column) :
|
|
|
- _data_writer(NULL),
|
|
|
|
|
- _array_writer(new GeomVertexArrayDataPipelineWriter(array_data, true, Thread::get_current_thread())),
|
|
|
|
|
- _owns_writer(true)
|
|
|
|
|
|
|
+ _array_data(array_data),
|
|
|
|
|
+ _current_thread(Thread::get_current_thread())
|
|
|
{
|
|
{
|
|
|
initialize();
|
|
initialize();
|
|
|
set_column(column);
|
|
set_column(column);
|
|
@@ -122,28 +116,29 @@ GeomVertexWriter(GeomVertexArrayData *array_data, int column) :
|
|
|
// writer specifically to process the named data type.
|
|
// writer specifically to process the named data type.
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
INLINE GeomVertexWriter::
|
|
INLINE GeomVertexWriter::
|
|
|
-GeomVertexWriter(GeomVertexDataPipelineWriter *data_writer,
|
|
|
|
|
|
|
+GeomVertexWriter(GeomVertexDataPipelineWriter *data_writer,
|
|
|
const InternalName *name) :
|
|
const InternalName *name) :
|
|
|
- _data_writer(data_writer),
|
|
|
|
|
- _array_writer(NULL),
|
|
|
|
|
- _owns_writer(false)
|
|
|
|
|
|
|
+ _vertex_data(data_writer->get_object()),
|
|
|
|
|
+ _current_thread(data_writer->get_current_thread())
|
|
|
{
|
|
{
|
|
|
initialize();
|
|
initialize();
|
|
|
- set_column(name);
|
|
|
|
|
|
|
+ const GeomVertexFormat *format = data_writer->get_format();
|
|
|
|
|
+ set_vertex_column(format->get_array_with(name),
|
|
|
|
|
+ format->get_column(name),
|
|
|
|
|
+ data_writer);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
// Function: GeomVertexWriter::Copy Constructor
|
|
// Function: GeomVertexWriter::Copy Constructor
|
|
|
// Access: Published
|
|
// Access: Published
|
|
|
-// Description: The copy constructor steals ownership of the writer
|
|
|
|
|
-// pointer.
|
|
|
|
|
|
|
+// Description:
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
INLINE GeomVertexWriter::
|
|
INLINE GeomVertexWriter::
|
|
|
GeomVertexWriter(const GeomVertexWriter ©) :
|
|
GeomVertexWriter(const GeomVertexWriter ©) :
|
|
|
- _data_writer(copy._data_writer),
|
|
|
|
|
|
|
+ _vertex_data(copy._vertex_data),
|
|
|
_array(copy._array),
|
|
_array(copy._array),
|
|
|
- _array_writer(copy._array_writer),
|
|
|
|
|
- _owns_writer(copy._owns_writer),
|
|
|
|
|
|
|
+ _array_data(copy._array_data),
|
|
|
|
|
+ _current_thread(copy._current_thread),
|
|
|
_packer(copy._packer),
|
|
_packer(copy._packer),
|
|
|
_stride(copy._stride),
|
|
_stride(copy._stride),
|
|
|
_pointer_begin(copy._pointer_begin),
|
|
_pointer_begin(copy._pointer_begin),
|
|
@@ -151,29 +146,25 @@ GeomVertexWriter(const GeomVertexWriter ©) :
|
|
|
_pointer(copy._pointer),
|
|
_pointer(copy._pointer),
|
|
|
_start_row(copy._start_row)
|
|
_start_row(copy._start_row)
|
|
|
{
|
|
{
|
|
|
- ((GeomVertexWriter &)copy)._owns_writer = false;
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
// Function: GeomVertexWriter::Copy Assignment Operator
|
|
// Function: GeomVertexWriter::Copy Assignment Operator
|
|
|
// Access: Published
|
|
// Access: Published
|
|
|
-// Description: The copy constructor steals ownership of the writer
|
|
|
|
|
-// pointer.
|
|
|
|
|
|
|
+// Description:
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
INLINE void GeomVertexWriter::
|
|
INLINE void GeomVertexWriter::
|
|
|
operator = (const GeomVertexWriter ©) {
|
|
operator = (const GeomVertexWriter ©) {
|
|
|
- _data_writer = copy._data_writer;
|
|
|
|
|
|
|
+ _vertex_data = copy._vertex_data;
|
|
|
_array = copy._array;
|
|
_array = copy._array;
|
|
|
- _array_writer = copy._array_writer;
|
|
|
|
|
- _owns_writer = copy._owns_writer;
|
|
|
|
|
|
|
+ _array_data = copy._array_data;
|
|
|
|
|
+ _current_thread = copy._current_thread;
|
|
|
_packer = copy._packer;
|
|
_packer = copy._packer;
|
|
|
_stride = copy._stride;
|
|
_stride = copy._stride;
|
|
|
_pointer_begin = copy._pointer_begin;
|
|
_pointer_begin = copy._pointer_begin;
|
|
|
_pointer_end = copy._pointer_end;
|
|
_pointer_end = copy._pointer_end;
|
|
|
_pointer = copy._pointer;
|
|
_pointer = copy._pointer;
|
|
|
_start_row = copy._start_row;
|
|
_start_row = copy._start_row;
|
|
|
-
|
|
|
|
|
- ((GeomVertexWriter &)copy)._owns_writer = false;
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
@@ -183,9 +174,6 @@ operator = (const GeomVertexWriter ©) {
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
INLINE GeomVertexWriter::
|
|
INLINE GeomVertexWriter::
|
|
|
~GeomVertexWriter() {
|
|
~GeomVertexWriter() {
|
|
|
- if (_owns_writer) {
|
|
|
|
|
- clear_writer();
|
|
|
|
|
- }
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
@@ -197,10 +185,7 @@ INLINE GeomVertexWriter::
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
INLINE GeomVertexData *GeomVertexWriter::
|
|
INLINE GeomVertexData *GeomVertexWriter::
|
|
|
get_vertex_data() const {
|
|
get_vertex_data() const {
|
|
|
- if (_data_writer != (GeomVertexDataPipelineWriter *)NULL) {
|
|
|
|
|
- return _data_writer->get_object();
|
|
|
|
|
- }
|
|
|
|
|
- return NULL;
|
|
|
|
|
|
|
+ return _vertex_data;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
@@ -211,7 +196,18 @@ get_vertex_data() const {
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
INLINE GeomVertexArrayData *GeomVertexWriter::
|
|
INLINE GeomVertexArrayData *GeomVertexWriter::
|
|
|
get_array_data() const {
|
|
get_array_data() const {
|
|
|
- return _array_writer->get_object();
|
|
|
|
|
|
|
+ return _array_data;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+////////////////////////////////////////////////////////////////////
|
|
|
|
|
+// Function: GeomVertexWriter::get_current_thread
|
|
|
|
|
+// Access: Published
|
|
|
|
|
+// Description: Returns the Thread pointer of the currently-executing
|
|
|
|
|
+// thread, as passed to the constructor of this object.
|
|
|
|
|
+////////////////////////////////////////////////////////////////////
|
|
|
|
|
+INLINE Thread *GeomVertexWriter::
|
|
|
|
|
+get_current_thread() const {
|
|
|
|
|
+ return _current_thread;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
@@ -229,12 +225,18 @@ get_array_data() const {
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
INLINE bool GeomVertexWriter::
|
|
INLINE bool GeomVertexWriter::
|
|
|
set_column(int column) {
|
|
set_column(int column) {
|
|
|
- if (_data_writer != (GeomVertexDataPipelineWriter *)NULL) {
|
|
|
|
|
- return set_column(_data_writer->get_format()->get_array_with(column),
|
|
|
|
|
- _data_writer->get_format()->get_column(column));
|
|
|
|
|
|
|
+ if (_vertex_data != (GeomVertexData *)NULL) {
|
|
|
|
|
+ GeomVertexDataPipelineWriter writer(_vertex_data, true, _current_thread);
|
|
|
|
|
+ writer.check_array_writers();
|
|
|
|
|
+ const GeomVertexFormat *format = writer.get_format();
|
|
|
|
|
+ return set_vertex_column(format->get_array_with(column),
|
|
|
|
|
+ format->get_column(column),
|
|
|
|
|
+ &writer);
|
|
|
}
|
|
}
|
|
|
- if (_array_writer != (GeomVertexArrayDataPipelineWriter *)NULL) {
|
|
|
|
|
- return set_column(0, _array_writer->get_array_format()->get_column(column));
|
|
|
|
|
|
|
+ if (_array_data != (GeomVertexArrayData *)NULL) {
|
|
|
|
|
+ GeomVertexArrayDataPipelineWriter writer(_array_data, true, _current_thread);
|
|
|
|
|
+ return set_array_column(writer.get_array_format()->get_column(column),
|
|
|
|
|
+ &writer);
|
|
|
}
|
|
}
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
@@ -272,14 +274,19 @@ set_column(const string &name) {
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
INLINE bool GeomVertexWriter::
|
|
INLINE bool GeomVertexWriter::
|
|
|
set_column(const InternalName *name) {
|
|
set_column(const InternalName *name) {
|
|
|
- if (_data_writer != (GeomVertexDataPipelineWriter *)NULL) {
|
|
|
|
|
- return set_column(_data_writer->get_format()->get_array_with(name),
|
|
|
|
|
- _data_writer->get_format()->get_column(name));
|
|
|
|
|
|
|
+ if (_vertex_data != (GeomVertexData *)NULL) {
|
|
|
|
|
+ GeomVertexDataPipelineWriter writer(_vertex_data, true, _current_thread);
|
|
|
|
|
+ writer.check_array_writers();
|
|
|
|
|
+ const GeomVertexFormat *format = writer.get_format();
|
|
|
|
|
+ return set_vertex_column(format->get_array_with(name),
|
|
|
|
|
+ format->get_column(name),
|
|
|
|
|
+ &writer);
|
|
|
}
|
|
}
|
|
|
- if (_array_writer != (GeomVertexArrayDataPipelineWriter *)NULL) {
|
|
|
|
|
- return set_column(0, _array_writer->get_array_format()->get_column(name));
|
|
|
|
|
|
|
+ if (_array_data != (GeomVertexArrayData *)NULL) {
|
|
|
|
|
+ GeomVertexArrayDataPipelineWriter writer(_array_data, true, _current_thread);
|
|
|
|
|
+ return set_array_column(writer.get_array_format()->get_column(name),
|
|
|
|
|
+ &writer);
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -801,17 +808,9 @@ get_packer() const {
|
|
|
// and sets the internal pointer to the indicated row.
|
|
// and sets the internal pointer to the indicated row.
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
INLINE void GeomVertexWriter::
|
|
INLINE void GeomVertexWriter::
|
|
|
-set_pointer(int row) {
|
|
|
|
|
- if (_data_writer != (const GeomVertexDataPipelineWriter *)NULL) {
|
|
|
|
|
- _data_writer->modify_array(_array);
|
|
|
|
|
- GeomVertexArrayDataPipelineWriter *array_data = _data_writer->get_array_writer(_array);
|
|
|
|
|
- _pointer_begin = array_data->modify_data();
|
|
|
|
|
- _pointer_end = _pointer_begin + array_data->get_data_size_bytes();
|
|
|
|
|
-
|
|
|
|
|
- } else {
|
|
|
|
|
- _pointer_begin = _array_writer->modify_data();
|
|
|
|
|
- _pointer_end = _pointer_begin + _array_writer->get_data_size_bytes();
|
|
|
|
|
- }
|
|
|
|
|
|
|
+set_pointer(int row, GeomVertexArrayDataPipelineWriter *array_writer) {
|
|
|
|
|
+ _pointer_begin = array_writer->modify_data();
|
|
|
|
|
+ _pointer_end = _pointer_begin + array_writer->get_data_size_bytes();
|
|
|
quick_set_pointer(row);
|
|
quick_set_pointer(row);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -827,11 +826,11 @@ quick_set_pointer(int row) {
|
|
|
nassertv(has_column());
|
|
nassertv(has_column());
|
|
|
|
|
|
|
|
#ifdef _DEBUG
|
|
#ifdef _DEBUG
|
|
|
- if (_data_writer != (const GeomVertexDataPipelineWriter *)NULL) {
|
|
|
|
|
- GeomVertexArrayDataPipelineWriter *array_writer = _data_writer->get_array_writer(_array);
|
|
|
|
|
- nassertv(_pointer_begin == array_writer->get_data());
|
|
|
|
|
|
|
+ if (_vertex_data != (const GeomVertexData *)NULL) {
|
|
|
|
|
+ const GeomVertexArrayData *array_data = _vertex_data->get_array(_array);
|
|
|
|
|
+ nassertv(_pointer_begin == array_data->get_data());
|
|
|
} else {
|
|
} else {
|
|
|
- nassertv(_pointer_begin == _array_writer->get_data());
|
|
|
|
|
|
|
+ nassertv(_pointer_begin == _array_data->get_data());
|
|
|
}
|
|
}
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
@@ -848,11 +847,11 @@ INLINE unsigned char *GeomVertexWriter::
|
|
|
inc_pointer() {
|
|
inc_pointer() {
|
|
|
#ifdef _DEBUG
|
|
#ifdef _DEBUG
|
|
|
nassertr(_pointer < _pointer_end, empty_buffer);
|
|
nassertr(_pointer < _pointer_end, empty_buffer);
|
|
|
- if (_data_writer != (GeomVertexDataPipelineWriter *)NULL){
|
|
|
|
|
- GeomVertexArrayDataPipelineWriter *array_writer = _data_writer->get_array_writer(_array);
|
|
|
|
|
- nassertr(_pointer >= array_writer->get_data().p() && _pointer < array_writer->get_data().p() + array_writer->get_data_size_bytes(), empty_buffer);
|
|
|
|
|
|
|
+ if (_vertex_data != (GeomVertexData *)NULL){
|
|
|
|
|
+ const GeomVertexArrayData *array_data = _vertex_data->get_array(_array);
|
|
|
|
|
+ nassertr(_pointer >= array_data->get_data().p() && _pointer < array_data->get_data().p() + array_data->get_data_size_bytes(), empty_buffer);
|
|
|
} else {
|
|
} else {
|
|
|
- nassertr(_pointer >= _array_writer->get_data().p() && _pointer < _array_writer->get_data().p() + _array_writer->get_data_size_bytes(), empty_buffer);
|
|
|
|
|
|
|
+ nassertr(_pointer >= _array_data->get_data().p() && _pointer < _array_data->get_data().p() + _array_data->get_data_size_bytes(), empty_buffer);
|
|
|
}
|
|
}
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
@@ -874,12 +873,16 @@ inc_add_pointer() {
|
|
|
if (_pointer >= _pointer_end) {
|
|
if (_pointer >= _pointer_end) {
|
|
|
// Reset the data pointer.
|
|
// Reset the data pointer.
|
|
|
int write_row = get_write_row();
|
|
int write_row = get_write_row();
|
|
|
- if (_data_writer != (GeomVertexDataPipelineWriter *)NULL) {
|
|
|
|
|
- _data_writer->set_num_rows(max(write_row + 1, _data_writer->get_num_rows()));
|
|
|
|
|
|
|
+ if (_vertex_data != (GeomVertexData *)NULL) {
|
|
|
|
|
+ GeomVertexDataPipelineWriter writer(_vertex_data, true, _current_thread);
|
|
|
|
|
+ writer.check_array_writers();
|
|
|
|
|
+ writer.set_num_rows(max(write_row + 1, writer.get_num_rows()));
|
|
|
|
|
+ set_pointer(write_row, writer.get_array_writer(_array));
|
|
|
} else {
|
|
} else {
|
|
|
- _array_writer->set_num_rows(max(write_row + 1, _array_writer->get_num_rows()));
|
|
|
|
|
|
|
+ GeomVertexArrayDataPipelineWriter writer(_array_data, true, _current_thread);
|
|
|
|
|
+ writer.set_num_rows(max(write_row + 1, writer.get_num_rows()));
|
|
|
|
|
+ set_pointer(write_row, &writer);
|
|
|
}
|
|
}
|
|
|
- set_pointer(write_row);
|
|
|
|
|
}
|
|
}
|
|
|
return inc_pointer();
|
|
return inc_pointer();
|
|
|
}
|
|
}
|