294 lines
8.4 KiB
Text
294 lines
8.4 KiB
Text
|
/**
|
||
|
* PANDA 3D SOFTWARE
|
||
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
||
|
*
|
||
|
* All use of this software is subject to the terms of the revised BSD
|
||
|
* license. You should have received a copy of this license along
|
||
|
* with this source code in a file named "LICENSE."
|
||
|
*
|
||
|
* @file geomVertexRewriter.I
|
||
|
* @author drose
|
||
|
* @date 2005-03-28
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Constructs an invalid GeomVertexRewriter. You must use the assignment
|
||
|
* operator to assign a valid GeomVertexRewriter to this object before you can
|
||
|
* use it.
|
||
|
*/
|
||
|
INLINE GeomVertexRewriter::
|
||
|
GeomVertexRewriter(Thread *current_thread) :
|
||
|
GeomVertexWriter(current_thread),
|
||
|
GeomVertexReader(current_thread)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Constructs a new rewriter to process the vertices of the indicated data
|
||
|
* object.
|
||
|
*/
|
||
|
INLINE GeomVertexRewriter::
|
||
|
GeomVertexRewriter(GeomVertexData *vertex_data, Thread *current_thread) :
|
||
|
GeomVertexWriter(vertex_data, current_thread),
|
||
|
GeomVertexReader(vertex_data, current_thread)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Constructs a new rewriter to process the vertices of the indicated data
|
||
|
* object. This flavor creates the rewriter specifically to process the named
|
||
|
* data type.
|
||
|
*/
|
||
|
INLINE GeomVertexRewriter::
|
||
|
GeomVertexRewriter(GeomVertexData *vertex_data, CPT_InternalName name,
|
||
|
Thread *current_thread) :
|
||
|
GeomVertexWriter(vertex_data, current_thread),
|
||
|
GeomVertexReader(vertex_data, current_thread)
|
||
|
{
|
||
|
set_column(std::move(name));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Constructs a new rewriter to process the vertices of the indicated array
|
||
|
* only.
|
||
|
*/
|
||
|
INLINE GeomVertexRewriter::
|
||
|
GeomVertexRewriter(GeomVertexArrayData *array_data, Thread *current_thread) :
|
||
|
GeomVertexWriter(array_data, current_thread),
|
||
|
GeomVertexReader(array_data, current_thread)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Constructs a new rewriter to process the vertices of the indicated array
|
||
|
* only.
|
||
|
*/
|
||
|
INLINE GeomVertexRewriter::
|
||
|
GeomVertexRewriter(GeomVertexArrayData *array_data, int column,
|
||
|
Thread *current_thread) :
|
||
|
GeomVertexWriter(array_data, current_thread),
|
||
|
GeomVertexReader(array_data, current_thread)
|
||
|
{
|
||
|
set_column(column);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE GeomVertexRewriter::
|
||
|
GeomVertexRewriter(const GeomVertexRewriter ©) :
|
||
|
GeomVertexWriter(copy),
|
||
|
GeomVertexReader(copy)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE void GeomVertexRewriter::
|
||
|
operator = (const GeomVertexRewriter ©) {
|
||
|
GeomVertexWriter::operator = (copy);
|
||
|
GeomVertexReader::operator = (copy);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE GeomVertexRewriter::
|
||
|
~GeomVertexRewriter() {
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the vertex data object that the rewriter is processing.
|
||
|
*/
|
||
|
INLINE GeomVertexData *GeomVertexRewriter::
|
||
|
get_vertex_data() const {
|
||
|
nassertr(GeomVertexWriter::get_vertex_data() ==
|
||
|
GeomVertexReader::get_vertex_data(), nullptr);
|
||
|
return GeomVertexWriter::get_vertex_data();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the particular array object that the rewriter is currently
|
||
|
* processing.
|
||
|
*/
|
||
|
INLINE GeomVertexArrayData *GeomVertexRewriter::
|
||
|
get_array_data() const {
|
||
|
nassertr(GeomVertexWriter::get_array_data() ==
|
||
|
GeomVertexReader::get_array_data(), nullptr);
|
||
|
return GeomVertexWriter::get_array_data();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the write handle to the array object that the rewriter is currently
|
||
|
* processing. This low-level call should be used with caution; be careful
|
||
|
* with modifying the data in the handle out from under the
|
||
|
* GeomVertexRewriter.
|
||
|
*/
|
||
|
INLINE GeomVertexArrayDataHandle *GeomVertexRewriter::
|
||
|
get_array_handle() const {
|
||
|
return GeomVertexWriter::get_array_handle();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the per-row stride (bytes between consecutive rows) of the
|
||
|
* underlying vertex array. This low-level information is normally not needed
|
||
|
* to use the GeomVertexRewriter directly.
|
||
|
*/
|
||
|
INLINE size_t GeomVertexRewriter::
|
||
|
get_stride() const {
|
||
|
nassertr(GeomVertexWriter::get_stride() == GeomVertexReader::get_stride(), 0);
|
||
|
return GeomVertexWriter::get_stride();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the Thread pointer of the currently-executing thread, as passed to
|
||
|
* the constructor of this object.
|
||
|
*/
|
||
|
INLINE Thread *GeomVertexRewriter::
|
||
|
get_current_thread() const {
|
||
|
nassertr(GeomVertexWriter::get_current_thread() ==
|
||
|
GeomVertexReader::get_current_thread(), nullptr);
|
||
|
return GeomVertexWriter::get_current_thread();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets up the rewriter to use the nth data type of the GeomVertexFormat,
|
||
|
* numbering from 0.
|
||
|
*
|
||
|
* This also resets both the read and write row numbers to the start row (the
|
||
|
* same value passed to a previous call to set_row(), or 0 if set_row() was
|
||
|
* never called.)
|
||
|
*
|
||
|
* The return value is true if the data type is valid, false otherwise.
|
||
|
*/
|
||
|
INLINE bool GeomVertexRewriter::
|
||
|
set_column(int column) {
|
||
|
// It's important to invoke the writer first, then the reader. See
|
||
|
// set_row().
|
||
|
GeomVertexWriter::set_column(column);
|
||
|
return GeomVertexReader::set_column(column);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets up the rewriter to use the data type with the indicated name.
|
||
|
*
|
||
|
* This also resets both the read and write row numbers to the start row (the
|
||
|
* same value passed to a previous call to set_row(), or 0 if set_row() was
|
||
|
* never called.)
|
||
|
*
|
||
|
* The return value is true if the data type is valid, false otherwise.
|
||
|
*/
|
||
|
INLINE bool GeomVertexRewriter::
|
||
|
set_column(CPT_InternalName name) {
|
||
|
// It's important to invoke the writer first, then the reader. See
|
||
|
// set_row().
|
||
|
GeomVertexWriter::set_column(name);
|
||
|
return GeomVertexReader::set_column(std::move(name));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets up the rewriter to use the indicated column description on the given
|
||
|
* array.
|
||
|
*
|
||
|
* This also resets both the read and write row numbers to the start row (the
|
||
|
* same value passed to a previous call to set_row(), or 0 if set_row() was
|
||
|
* never called.)
|
||
|
*
|
||
|
* The return value is true if the data type is valid, false otherwise.
|
||
|
*/
|
||
|
INLINE bool GeomVertexRewriter::
|
||
|
set_column(int array, const GeomVertexColumn *column) {
|
||
|
// It's important to invoke the writer first, then the reader. See
|
||
|
// set_row().
|
||
|
GeomVertexWriter::set_column(array, column);
|
||
|
return GeomVertexReader::set_column(array, column);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Resets the GeomVertexRewriter to the initial state.
|
||
|
*/
|
||
|
INLINE void GeomVertexRewriter::
|
||
|
clear() {
|
||
|
GeomVertexWriter::clear();
|
||
|
GeomVertexReader::clear();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns true if a valid data type has been successfully set, or false if
|
||
|
* the data type does not exist.
|
||
|
*/
|
||
|
INLINE bool GeomVertexRewriter::
|
||
|
has_column() const {
|
||
|
nassertr(GeomVertexWriter::get_column() ==
|
||
|
GeomVertexReader::get_column(), false);
|
||
|
return GeomVertexWriter::has_column();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the array index containing the data type that the rewriter is
|
||
|
* working on.
|
||
|
*/
|
||
|
INLINE int GeomVertexRewriter::
|
||
|
get_array() const {
|
||
|
nassertr(GeomVertexWriter::get_array() ==
|
||
|
GeomVertexReader::get_array(), -1);
|
||
|
return GeomVertexWriter::get_array();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the description of the data type that the rewriter is working on.
|
||
|
*/
|
||
|
INLINE const GeomVertexColumn *GeomVertexRewriter::
|
||
|
get_column() const {
|
||
|
nassertr(GeomVertexWriter::get_column() ==
|
||
|
GeomVertexReader::get_column(), nullptr);
|
||
|
return GeomVertexWriter::get_column();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the start row to the indicated value, without internal checks. This
|
||
|
* is the same as set_row(), but it does not check for the possibility that
|
||
|
* the array has been reallocated internally for some reason; use only when
|
||
|
* you are confident that the array is unchanged and you really need every bit
|
||
|
* of available performance.
|
||
|
*/
|
||
|
INLINE void GeomVertexRewriter::
|
||
|
set_row_unsafe(int row) {
|
||
|
// It's important to invoke the Writer first, since that might force a
|
||
|
// recopy of the array, which might invalidate the pointer already stored by
|
||
|
// the Reader if we invoked the Reader first.
|
||
|
GeomVertexWriter::set_row_unsafe(row);
|
||
|
GeomVertexReader::set_row_unsafe(row);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the start, write, and write index to the indicated value. The
|
||
|
* rewriter will begin traversing from the given row.
|
||
|
*/
|
||
|
INLINE void GeomVertexRewriter::
|
||
|
set_row(int row) {
|
||
|
GeomVertexWriter::set_row(row);
|
||
|
GeomVertexReader::set_row(row);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the row index at which the rewriter started. It will return to
|
||
|
* this row if you reset the current column.
|
||
|
*/
|
||
|
INLINE int GeomVertexRewriter::
|
||
|
get_start_row() const {
|
||
|
nassertr(GeomVertexWriter::get_start_row() ==
|
||
|
GeomVertexReader::get_start_row(), 0);
|
||
|
return GeomVertexWriter::get_start_row();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns true if the reader or writer is currently at the end of the list of
|
||
|
* vertices, false otherwise.
|
||
|
*/
|
||
|
INLINE bool GeomVertexRewriter::
|
||
|
is_at_end() const {
|
||
|
return GeomVertexWriter::is_at_end() || GeomVertexReader::is_at_end();
|
||
|
}
|