fix GeomVertexRewriter::set_row() problem with empty data; add GeomVertexReader/Writer::set_row_unsafe(); fix some compiler warnings

This commit is contained in:
David Rose 2011-06-17 18:57:04 +00:00
parent 320be916f5
commit 87ebb4f32c
35 changed files with 219 additions and 127 deletions

View File

@ -260,7 +260,7 @@ void ColladaInput::
write_data(GeomVertexData *vdata, int start_row, domP &p, unsigned int stride, unsigned int offset) const { write_data(GeomVertexData *vdata, int start_row, domP &p, unsigned int stride, unsigned int offset) const {
nassertv(_column_name != NULL); nassertv(_column_name != NULL);
GeomVertexWriter writer (vdata, _column_name); GeomVertexWriter writer (vdata, _column_name);
writer.set_row(start_row); writer.set_row_unsafe(start_row);
domList_of_uints &indices = p.getValue(); domList_of_uints &indices = p.getValue();

View File

@ -1330,11 +1330,11 @@ compare_collider_to_geom(CollisionEntry &entry, const Geom *geom,
while (!index.is_at_end()) { while (!index.is_at_end()) {
Vertexf v[3]; Vertexf v[3];
vertex.set_row(index.get_data1i()); vertex.set_row_unsafe(index.get_data1i());
v[0] = vertex.get_data3f(); v[0] = vertex.get_data3f();
vertex.set_row(index.get_data1i()); vertex.set_row_unsafe(index.get_data1i());
v[1] = vertex.get_data3f(); v[1] = vertex.get_data3f();
vertex.set_row(index.get_data1i()); vertex.set_row_unsafe(index.get_data1i());
v[2] = vertex.get_data3f(); v[2] = vertex.get_data3f();
// Generate a temporary CollisionGeom on the fly for each // Generate a temporary CollisionGeom on the fly for each
@ -1358,7 +1358,7 @@ compare_collider_to_geom(CollisionEntry &entry, const Geom *geom,
} }
} else { } else {
// Non-indexed case. // Non-indexed case.
vertex.set_row(primitive->get_first_vertex()); vertex.set_row_unsafe(primitive->get_first_vertex());
int num_vertices = primitive->get_num_vertices(); int num_vertices = primitive->get_num_vertices();
for (int i = 0; i < num_vertices; i += 3) { for (int i = 0; i < num_vertices; i += 3) {
Vertexf v[3]; Vertexf v[3];

View File

@ -137,9 +137,9 @@ rotate_impl() const {
GeomVertexWriter to(new_vertices, 0); GeomVertexWriter to(new_vertices, 0);
for (int begin = 0; begin < num_vertices; begin += 2) { for (int begin = 0; begin < num_vertices; begin += 2) {
from.set_row(begin + 1); from.set_row_unsafe(begin + 1);
to.set_data1i(from.get_data1i()); to.set_data1i(from.get_data1i());
from.set_row(begin); from.set_row_unsafe(begin);
to.set_data1i(from.get_data1i()); to.set_data1i(from.get_data1i());
} }

View File

@ -182,7 +182,7 @@ rotate_impl() const {
for (ei = ends.begin(); ei != ends.end(); ++ei) { for (ei = ends.begin(); ei != ends.end(); ++ei) {
int end = (*ei); int end = (*ei);
for (int vi = end - 1; vi >= begin; --vi) { for (int vi = end - 1; vi >= begin; --vi) {
from.set_row(vi); from.set_row_unsafe(vi);
to.set_data1i(from.get_data1i()); to.set_data1i(from.get_data1i());
} }
begin = end; begin = end;

View File

@ -231,7 +231,7 @@ add_vertex(int vertex) {
PT(GeomVertexArrayData) array_obj = cdata->_vertices.get_write_pointer(); PT(GeomVertexArrayData) array_obj = cdata->_vertices.get_write_pointer();
GeomVertexWriter index(array_obj, 0); GeomVertexWriter index(array_obj, 0);
index.set_row(array_obj->get_num_rows()); index.set_row_unsafe(array_obj->get_num_rows());
index.add_data1i(vertex); index.add_data1i(vertex);
@ -295,7 +295,7 @@ add_consecutive_vertices(int start, int num_vertices) {
PT(GeomVertexArrayData) array_obj = cdata->_vertices.get_write_pointer(); PT(GeomVertexArrayData) array_obj = cdata->_vertices.get_write_pointer();
GeomVertexWriter index(array_obj, 0); GeomVertexWriter index(array_obj, 0);
index.set_row(array_obj->get_num_rows()); index.set_row_unsafe(array_obj->get_num_rows());
for (int v = start; v <= end; ++v) { for (int v = start; v <= end; ++v) {
index.add_data1i(v); index.add_data1i(v);
@ -680,7 +680,7 @@ get_primitive_min_vertex(int n) const {
nassertr(n >= 0 && n < mins->get_num_rows(), -1); nassertr(n >= 0 && n < mins->get_num_rows(), -1);
GeomVertexReader index(mins, 0); GeomVertexReader index(mins, 0);
index.set_row(n); index.set_row_unsafe(n);
return index.get_data1i(); return index.get_data1i();
} else { } else {
return get_primitive_start(n); return get_primitive_start(n);
@ -700,7 +700,7 @@ get_primitive_max_vertex(int n) const {
nassertr(n >= 0 && n < maxs->get_num_rows(), -1); nassertr(n >= 0 && n < maxs->get_num_rows(), -1);
GeomVertexReader index(maxs, 0); GeomVertexReader index(maxs, 0);
index.set_row(n); index.set_row_unsafe(n);
return index.get_data1i(); return index.get_data1i();
} else { } else {
return get_primitive_end(n) - 1; return get_primitive_end(n) - 1;
@ -1491,7 +1491,7 @@ calc_tight_bounds(LPoint3f &min_point, LPoint3f &max_point,
nassertv(cdata->_num_vertices != -1); nassertv(cdata->_num_vertices != -1);
if (got_mat) { if (got_mat) {
for (int i = 0; i < cdata->_num_vertices; i++) { for (int i = 0; i < cdata->_num_vertices; i++) {
reader.set_row(cdata->_first_vertex + i); reader.set_row_unsafe(cdata->_first_vertex + i);
LPoint3f vertex = mat.xform_point(reader.get_data3f()); LPoint3f vertex = mat.xform_point(reader.get_data3f());
if (found_any) { if (found_any) {
@ -1509,7 +1509,7 @@ calc_tight_bounds(LPoint3f &min_point, LPoint3f &max_point,
} }
} else { } else {
for (int i = 0; i < cdata->_num_vertices; i++) { for (int i = 0; i < cdata->_num_vertices; i++) {
reader.set_row(cdata->_first_vertex + i); reader.set_row_unsafe(cdata->_first_vertex + i);
const LVecBase3f &vertex = reader.get_data3f(); const LVecBase3f &vertex = reader.get_data3f();
if (found_any) { if (found_any) {
@ -1534,7 +1534,7 @@ calc_tight_bounds(LPoint3f &min_point, LPoint3f &max_point,
if (got_mat) { if (got_mat) {
while (!index.is_at_end()) { while (!index.is_at_end()) {
int ii = index.get_data1i(); int ii = index.get_data1i();
reader.set_row(ii); reader.set_row_unsafe(ii);
LPoint3f vertex = mat.xform_point(reader.get_data3f()); LPoint3f vertex = mat.xform_point(reader.get_data3f());
if (found_any) { if (found_any) {
@ -1553,7 +1553,7 @@ calc_tight_bounds(LPoint3f &min_point, LPoint3f &max_point,
} else { } else {
while (!index.is_at_end()) { while (!index.is_at_end()) {
int ii = index.get_data1i(); int ii = index.get_data1i();
reader.set_row(ii); reader.set_row_unsafe(ii);
const LVecBase3f &vertex = reader.get_data3f(); const LVecBase3f &vertex = reader.get_data3f();
if (found_any) { if (found_any) {
@ -2035,7 +2035,7 @@ get_vertex(int i) const {
nassertr(i >= 0 && i < _vertices_reader->get_num_rows(), -1); nassertr(i >= 0 && i < _vertices_reader->get_num_rows(), -1);
GeomVertexReader index(_cdata->_vertices.get_read_pointer(), 0); GeomVertexReader index(_cdata->_vertices.get_read_pointer(), 0);
index.set_row(i); index.set_row_unsafe(i);
return index.get_data1i(); return index.get_data1i();
} else { } else {

View File

@ -210,10 +210,10 @@ rotate_impl() const {
// Move the first vertex to the end. // Move the first vertex to the end.
{ {
for (int begin = 0; begin < num_vertices; begin += 3) { for (int begin = 0; begin < num_vertices; begin += 3) {
from.set_row(begin + 1); from.set_row_unsafe(begin + 1);
to.set_data1i(from.get_data1i()); to.set_data1i(from.get_data1i());
to.set_data1i(from.get_data1i()); to.set_data1i(from.get_data1i());
from.set_row(begin); from.set_row_unsafe(begin);
to.set_data1i(from.get_data1i()); to.set_data1i(from.get_data1i());
} }
} }
@ -223,9 +223,9 @@ rotate_impl() const {
// Move the last vertex to the front. // Move the last vertex to the front.
{ {
for (int begin = 0; begin < num_vertices; begin += 3) { for (int begin = 0; begin < num_vertices; begin += 3) {
from.set_row(begin + 2); from.set_row_unsafe(begin + 2);
to.set_data1i(from.get_data1i()); to.set_data1i(from.get_data1i());
from.set_row(begin); from.set_row_unsafe(begin);
to.set_data1i(from.get_data1i()); to.set_data1i(from.get_data1i());
to.set_data1i(from.get_data1i()); to.set_data1i(from.get_data1i());
} }

View File

@ -291,7 +291,7 @@ rotate_impl() const {
if (begin != 0) { if (begin != 0) {
// Copy in the unused vertices between tristrips. // Copy in the unused vertices between tristrips.
to.set_data1i(last_added); to.set_data1i(last_added);
from.set_row(end - 1); from.set_row_unsafe(end - 1);
to.set_data1i(from.get_data1i()); to.set_data1i(from.get_data1i());
begin += 2; begin += 2;
} }
@ -300,7 +300,7 @@ rotate_impl() const {
// an odd number of vertices, which is not allowed. // an odd number of vertices, which is not allowed.
nassertr((num_vertices & 1) == 0, NULL); nassertr((num_vertices & 1) == 0, NULL);
for (int vi = end - 1; vi >= begin; --vi) { for (int vi = end - 1; vi >= begin; --vi) {
from.set_row(vi); from.set_row_unsafe(vi);
last_added = from.get_data1i(); last_added = from.get_data1i();
to.set_data1i(last_added); to.set_data1i(last_added);
} }
@ -368,11 +368,11 @@ requires_unused_vertices() const {
void GeomTristrips:: void GeomTristrips::
append_unused_vertices(GeomVertexArrayData *vertices, int vertex) { append_unused_vertices(GeomVertexArrayData *vertices, int vertex) {
GeomVertexReader from(vertices, 0); GeomVertexReader from(vertices, 0);
from.set_row(vertices->get_num_rows() - 1); from.set_row_unsafe(vertices->get_num_rows() - 1);
int prev = from.get_data1i(); int prev = from.get_data1i();
GeomVertexWriter to(vertices, 0); GeomVertexWriter to(vertices, 0);
to.set_row(vertices->get_num_rows()); to.set_row_unsafe(vertices->get_num_rows());
to.add_data1i(prev); to.add_data1i(prev);
to.add_data1i(vertex); to.add_data1i(vertex);

View File

@ -526,7 +526,7 @@ write_with_data(ostream &out, int indent_level,
for (int i = 0; i < num_rows; i++) { for (int i = 0; i < num_rows; i++) {
indent(out, indent_level) indent(out, indent_level)
<< "row " << i << ":\n"; << "row " << i << ":\n";
reader.set_row(i); reader.set_row_unsafe(i);
Columns::const_iterator ci; Columns::const_iterator ci;
for (ci = _columns.begin(); ci != _columns.end(); ++ci) { for (ci = _columns.begin(); ci != _columns.end(); ++ci) {
const GeomVertexColumn *column = (*ci); const GeomVertexColumn *column = (*ci);

View File

@ -1245,7 +1245,7 @@ describe_vertex(ostream &out, int row) const {
out << "Vertex " << row << ":\n"; out << "Vertex " << row << ":\n";
GeomVertexReader reader(this); GeomVertexReader reader(this);
reader.set_row(row); reader.set_row_unsafe(row);
const GeomVertexFormat *format = get_format(); const GeomVertexFormat *format = get_format();
const TransformBlendTable *tb_table = NULL; const TransformBlendTable *tb_table = NULL;
@ -1476,8 +1476,8 @@ update_animated_vertices(GeomVertexData::CData *cdata, Thread *current_thread) {
for (int i = 0; i < num_subranges; ++i) { for (int i = 0; i < num_subranges; ++i) {
int begin = rows.get_subrange_begin(i); int begin = rows.get_subrange_begin(i);
int end = rows.get_subrange_end(i); int end = rows.get_subrange_end(i);
data.set_row(begin); data.set_row_unsafe(begin);
delta.set_row(begin); delta.set_row_unsafe(begin);
for (int j = begin; j < end; ++j) { for (int j = begin; j < end; ++j) {
LPoint4f vertex = data.get_data4f(); LPoint4f vertex = data.get_data4f();
LPoint3f d = delta.get_data3f(); LPoint3f d = delta.get_data3f();
@ -1493,8 +1493,8 @@ update_animated_vertices(GeomVertexData::CData *cdata, Thread *current_thread) {
for (int i = 0; i < num_subranges; ++i) { for (int i = 0; i < num_subranges; ++i) {
int begin = rows.get_subrange_begin(i); int begin = rows.get_subrange_begin(i);
int end = rows.get_subrange_end(i); int end = rows.get_subrange_end(i);
data.set_row(begin); data.set_row_unsafe(begin);
delta.set_row(begin); delta.set_row_unsafe(begin);
for (int j = begin; j < end; ++j) { for (int j = begin; j < end; ++j) {
const LPoint4f &vertex = data.get_data4f(); const LPoint4f &vertex = data.get_data4f();
LPoint4f d = delta.get_data4f(); LPoint4f d = delta.get_data4f();
@ -1508,8 +1508,8 @@ update_animated_vertices(GeomVertexData::CData *cdata, Thread *current_thread) {
for (int i = 0; i < num_subranges; ++i) { for (int i = 0; i < num_subranges; ++i) {
int begin = rows.get_subrange_begin(i); int begin = rows.get_subrange_begin(i);
int end = rows.get_subrange_end(i); int end = rows.get_subrange_end(i);
data.set_row(begin); data.set_row_unsafe(begin);
delta.set_row(begin); delta.set_row_unsafe(begin);
for (int j = begin; j < end; ++j) { for (int j = begin; j < end; ++j) {
const LPoint3f &vertex = data.get_data3f(); const LPoint3f &vertex = data.get_data3f();
LPoint3f d = delta.get_data3f(); LPoint3f d = delta.get_data3f();
@ -1591,7 +1591,7 @@ update_animated_vertices(GeomVertexData::CData *cdata, Thread *current_thread) {
for (int i = 0; i < num_subranges; ++i) { for (int i = 0; i < num_subranges; ++i) {
int begin = rows.get_subrange_begin(i); int begin = rows.get_subrange_begin(i);
int end = rows.get_subrange_end(i); int end = rows.get_subrange_end(i);
data.set_row(begin); data.set_row_unsafe(begin);
for (int j = begin; j < end; ++j) { for (int j = begin; j < end; ++j) {
LPoint4f vertex = data.get_data4f(); LPoint4f vertex = data.get_data4f();
int bi = blendt[j]; int bi = blendt[j];
@ -1606,7 +1606,7 @@ update_animated_vertices(GeomVertexData::CData *cdata, Thread *current_thread) {
for (int i = 0; i < num_subranges; ++i) { for (int i = 0; i < num_subranges; ++i) {
int begin = rows.get_subrange_begin(i); int begin = rows.get_subrange_begin(i);
int end = rows.get_subrange_end(i); int end = rows.get_subrange_end(i);
data.set_row(begin); data.set_row_unsafe(begin);
for (int j = begin; j < end; ++j) { for (int j = begin; j < end; ++j) {
LPoint3f vertex = data.get_data3f(); LPoint3f vertex = data.get_data3f();
int bi = blendt[j]; int bi = blendt[j];
@ -1648,7 +1648,7 @@ update_animated_vertices(GeomVertexData::CData *cdata, Thread *current_thread) {
for (int i = 0; i < num_subranges; ++i) { for (int i = 0; i < num_subranges; ++i) {
int begin = rows.get_subrange_begin(i); int begin = rows.get_subrange_begin(i);
int end = rows.get_subrange_end(i); int end = rows.get_subrange_end(i);
data.set_row(begin); data.set_row_unsafe(begin);
for (int j = begin; j < end; ++j) { for (int j = begin; j < end; ++j) {
LVector3f vertex = data.get_data3f(); LVector3f vertex = data.get_data3f();
int bi = blendt[j]; int bi = blendt[j];
@ -1674,8 +1674,8 @@ update_animated_vertices(GeomVertexData::CData *cdata, Thread *current_thread) {
for (int i = 0; i < num_subranges; ++i) { for (int i = 0; i < num_subranges; ++i) {
int begin = rows.get_subrange_begin(i); int begin = rows.get_subrange_begin(i);
int end = rows.get_subrange_end(i); int end = rows.get_subrange_end(i);
data.set_row(begin); data.set_row_unsafe(begin);
blendi.set_row(begin); blendi.set_row_unsafe(begin);
for (int j = begin; j < end; ++j) { for (int j = begin; j < end; ++j) {
LPoint4f vertex = data.get_data4f(); LPoint4f vertex = data.get_data4f();
int bi = blendi.get_data1i(); int bi = blendi.get_data1i();
@ -1687,8 +1687,8 @@ update_animated_vertices(GeomVertexData::CData *cdata, Thread *current_thread) {
for (int i = 0; i < num_subranges; ++i) { for (int i = 0; i < num_subranges; ++i) {
int begin = rows.get_subrange_begin(i); int begin = rows.get_subrange_begin(i);
int end = rows.get_subrange_end(i); int end = rows.get_subrange_end(i);
data.set_row(begin); data.set_row_unsafe(begin);
blendi.set_row(begin); blendi.set_row_unsafe(begin);
for (int j = begin; j < end; ++j) { for (int j = begin; j < end; ++j) {
LPoint3f vertex = data.get_data3f(); LPoint3f vertex = data.get_data3f();
int bi = blendi.get_data1i(); int bi = blendi.get_data1i();
@ -1703,8 +1703,8 @@ update_animated_vertices(GeomVertexData::CData *cdata, Thread *current_thread) {
for (int i = 0; i < num_subranges; ++i) { for (int i = 0; i < num_subranges; ++i) {
int begin = rows.get_subrange_begin(i); int begin = rows.get_subrange_begin(i);
int end = rows.get_subrange_end(i); int end = rows.get_subrange_end(i);
data.set_row(begin); data.set_row_unsafe(begin);
blendi.set_row(begin); blendi.set_row_unsafe(begin);
for (int j = begin; j < end; ++j) { for (int j = begin; j < end; ++j) {
LVector3f vertex = data.get_data3f(); LVector3f vertex = data.get_data3f();
int bi = blendi.get_data1i(); int bi = blendi.get_data1i();

View File

@ -374,6 +374,25 @@ get_column() const {
return NULL; return NULL;
} }
////////////////////////////////////////////////////////////////////
// Function: GeomVertexReader::set_row_unsafe
// Access: Published
// Description: 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 GeomVertexReader::
set_row_unsafe(int row) {
_start_row = row;
if (has_column()) {
quick_set_pointer(_start_row);
}
}
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: GeomVertexReader::set_row // Function: GeomVertexReader::set_row
// Access: Published // Access: Published
@ -387,7 +406,8 @@ INLINE void GeomVertexReader::
set_row(int row) { set_row(int row) {
_start_row = row; _start_row = row;
if (has_column()) { if (has_column()) {
quick_set_pointer(_start_row); bool result = set_pointer(_start_row);
nassertv(result);
} }
} }
@ -556,12 +576,13 @@ get_packer() const {
INLINE bool GeomVertexReader:: INLINE bool GeomVertexReader::
set_pointer(int row) { set_pointer(int row) {
_pointer_begin = _handle->get_read_pointer(_force); _pointer_begin = _handle->get_read_pointer(_force);
if (_pointer_begin == NULL) { if (_pointer_begin == NULL && _handle->get_data_size_bytes() != 0) {
// Vertex data is not resident. // Vertex data is not resident.
set_column(0, NULL); set_column(0, NULL);
return false; return false;
} }
// Vertex data is resident, or just empty.
_pointer_end = _pointer_begin + _handle->get_data_size_bytes(); _pointer_end = _pointer_begin + _handle->get_data_size_bytes();
quick_set_pointer(row); quick_set_pointer(row);
return true; return true;
@ -576,7 +597,7 @@ set_pointer(int row) {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE void GeomVertexReader:: INLINE void GeomVertexReader::
quick_set_pointer(int row) { quick_set_pointer(int row) {
nassertv(has_column() && _pointer_begin != NULL); nassertv(has_column() && (_pointer_begin != NULL || row == 0));
#if defined(_DEBUG) #if defined(_DEBUG)
// Make sure we still have the same pointer as stored in the array. // Make sure we still have the same pointer as stored in the array.

View File

@ -97,6 +97,7 @@ PUBLISHED:
INLINE int get_array() const; INLINE int get_array() const;
INLINE const GeomVertexColumn *get_column() const; INLINE const GeomVertexColumn *get_column() const;
INLINE void set_row_unsafe(int row);
INLINE void set_row(int row); INLINE void set_row(int row);
INLINE int get_start_row() const; INLINE int get_start_row() const;

View File

@ -295,6 +295,26 @@ get_column() const {
return GeomVertexWriter::get_column(); return GeomVertexWriter::get_column();
} }
////////////////////////////////////////////////////////////////////
// Function: GeomVertexRewriter::set_row_unsafe
// Access: Published
// Description: 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);
}
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: GeomVertexRewriter::set_row // Function: GeomVertexRewriter::set_row
// Access: Published // Access: Published
@ -304,9 +324,6 @@ get_column() const {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE void GeomVertexRewriter:: INLINE void GeomVertexRewriter::
set_row(int row) { set_row(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(row); GeomVertexWriter::set_row(row);
GeomVertexReader::set_row(row); GeomVertexReader::set_row(row);
} }

View File

@ -64,6 +64,7 @@ PUBLISHED:
INLINE int get_array() const; INLINE int get_array() const;
INLINE const GeomVertexColumn *get_column() const; INLINE const GeomVertexColumn *get_column() const;
INLINE void set_row_unsafe(int row);
INLINE void set_row(int row); INLINE void set_row(int row);
INLINE int get_start_row() const; INLINE int get_start_row() const;

View File

@ -335,6 +335,25 @@ get_column() const {
return NULL; return NULL;
} }
////////////////////////////////////////////////////////////////////
// Function: GeomVertexWriter::set_row_unsafe
// Access: Published
// Description: 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 GeomVertexWriter::
set_row_unsafe(int row) {
_start_row = row;
if (has_column()) {
quick_set_pointer(_start_row);
}
}
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: GeomVertexWriter::set_row // Function: GeomVertexWriter::set_row
// Access: Published // Access: Published
@ -348,7 +367,7 @@ INLINE void GeomVertexWriter::
set_row(int row) { set_row(int row) {
_start_row = row; _start_row = row;
if (has_column()) { if (has_column()) {
quick_set_pointer(_start_row); set_pointer(_start_row);
} }
} }

View File

@ -107,6 +107,7 @@ PUBLISHED:
INLINE int get_array() const; INLINE int get_array() const;
INLINE const GeomVertexColumn *get_column() const; INLINE const GeomVertexColumn *get_column() const;
INLINE void set_row_unsafe(int row);
INLINE void set_row(int row); INLINE void set_row(int row);
INLINE int get_start_row() const; INLINE int get_start_row() const;

View File

@ -1360,6 +1360,7 @@ cg_compile_entry_point(const char *entry, const ShaderCaps &caps, ShaderType typ
break; break;
case ST_none: case ST_none:
default:
active = CG_PROFILE_UNKNOWN; active = CG_PROFILE_UNKNOWN;
ultimate = CG_PROFILE_UNKNOWN; ultimate = CG_PROFILE_UNKNOWN;
}; };
@ -1459,7 +1460,7 @@ cg_compile_shader(const ShaderCaps &caps) {
} }
} }
if ((_text->_separate && !_text->_geometry.empty()) || (!_text->_separate && _text->_shared.find("gshader") != -1)) { if ((_text->_separate && !_text->_geometry.empty()) || (!_text->_separate && _text->_shared.find("gshader") != string::npos)) {
_cg_gprogram = cg_compile_entry_point("gshader", caps, ST_geometry); _cg_gprogram = cg_compile_entry_point("gshader", caps, ST_geometry);
if (_cg_gprogram == 0) { if (_cg_gprogram == 0) {
cg_release_resources(); cg_release_resources();
@ -1829,9 +1830,9 @@ cg_compile_for(const ShaderCaps &caps,
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
Shader:: Shader::
Shader(CPT(ShaderFile) filename, CPT(ShaderFile) text, const ShaderLanguage &lang) : Shader(CPT(ShaderFile) filename, CPT(ShaderFile) text, const ShaderLanguage &lang) :
_filename(filename),
_text(text),
_error_flag(true), _error_flag(true),
_text(text),
_filename(filename),
_parse(0), _parse(0),
_loaded(false), _loaded(false),
_language(lang) _language(lang)

View File

@ -262,20 +262,20 @@ public:
// Container structure for data of parameters ShaderPtrSpec. // Container structure for data of parameters ShaderPtrSpec.
struct ShaderPtrData{ struct ShaderPtrData{
public:
ShaderPtrType _type;
int _size; //number of elements vec3[4]=12
bool _updated;
void* _ptr;
private: private:
PTA_float _pta_float; PTA_float _pta_float;
PTA_double _pta_double; PTA_double _pta_double;
PTA_LMatrix4f _pta_lmat4f;
PTA_LMatrix3f _pta_lmat3f;
PTA_LVecBase4f _pta_lvec4f; PTA_LVecBase4f _pta_lvec4f;
PTA_LVecBase3f _pta_lvec3f; PTA_LVecBase3f _pta_lvec3f;
PTA_LVecBase2f _pta_lvec2f; PTA_LVecBase2f _pta_lvec2f;
PTA_LMatrix4f _pta_lmat4f;
PTA_LMatrix3f _pta_lmat3f; public:
void* _ptr;
ShaderPtrType _type;
bool _updated;
int _size; //number of elements vec3[4]=12
public: public:
INLINE ShaderPtrData(); INLINE ShaderPtrData();
@ -459,7 +459,7 @@ public:
CPT(ShaderFile) _text; CPT(ShaderFile) _text;
protected: protected:
CPT(ShaderFile)_filename; CPT(ShaderFile) _filename;
int _parse; int _parse;
bool _loaded; bool _loaded;
ShaderLanguage _language; ShaderLanguage _language;

View File

@ -2199,6 +2199,10 @@ format_compression_mode(CompressionMode cm) {
return "dxt4"; return "dxt4";
case CM_dxt5: case CM_dxt5:
return "dxt5"; return "dxt5";
case CM_pvr1_2bpp:
return "pvr1_2bpp";
case CM_pvr1_4bpp:
return "pvr1_4bpp";
} }
return "**invalid**"; return "**invalid**";
@ -2230,6 +2234,10 @@ string_compression_mode(const string &str) {
return CM_dxt4; return CM_dxt4;
} else if (cmp_nocase_uh(str, "dxt5") == 0) { } else if (cmp_nocase_uh(str, "dxt5") == 0) {
return CM_dxt5; return CM_dxt5;
} else if (cmp_nocase_uh(str, "pvr1_2bpp") == 0) {
return CM_pvr1_2bpp;
} else if (cmp_nocase_uh(str, "pvr1_4bpp") == 0) {
return CM_pvr1_4bpp;
} }
gobj_cat->error() gobj_cat->error()

View File

@ -73,8 +73,9 @@ INLINE VertexDataBuffer::
// is not currently resident, this will implicitly // is not currently resident, this will implicitly
// request it to become resident soon. // request it to become resident soon.
// //
// If force is true, this method will never return NULL, // If force is true, this method will never return NULL
// but may block until the data is available. // (unless the data is actually empty), but may block
// until the data is available.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE const unsigned char *VertexDataBuffer:: INLINE const unsigned char *VertexDataBuffer::
get_read_pointer(bool force) const { get_read_pointer(bool force) const {

View File

@ -391,7 +391,6 @@ make_resident() {
size_t new_allocated_size = round_up(_uncompressed_size); size_t new_allocated_size = round_up(_uncompressed_size);
unsigned char *new_data = alloc_page_data(new_allocated_size); unsigned char *new_data = alloc_page_data(new_allocated_size);
unsigned char *end_data = new_data + new_allocated_size; unsigned char *end_data = new_data + new_allocated_size;
uLongf dest_len = _uncompressed_size;
z_stream z_source; z_stream z_source;
#ifdef USE_MEMORY_NOWRAPPERS #ifdef USE_MEMORY_NOWRAPPERS

View File

@ -128,7 +128,7 @@ Vertexf LineSegs::
get_vertex(int n) const { get_vertex(int n) const {
nassertr(_created_data != (GeomVertexData *)NULL, Vertexf::zero()); nassertr(_created_data != (GeomVertexData *)NULL, Vertexf::zero());
GeomVertexReader vertex(_created_data, InternalName::get_vertex()); GeomVertexReader vertex(_created_data, InternalName::get_vertex());
vertex.set_row(n); vertex.set_row_unsafe(n);
return vertex.get_data3f(); return vertex.get_data3f();
} }
@ -145,7 +145,7 @@ void LineSegs::
set_vertex(int n, const Vertexf &vert) { set_vertex(int n, const Vertexf &vert) {
nassertv(_created_data != (GeomVertexData *)NULL); nassertv(_created_data != (GeomVertexData *)NULL);
GeomVertexWriter vertex(_created_data, InternalName::get_vertex()); GeomVertexWriter vertex(_created_data, InternalName::get_vertex());
vertex.set_row(n); vertex.set_row_unsafe(n);
vertex.set_data3f(vert); vertex.set_data3f(vert);
} }
@ -158,7 +158,7 @@ Colorf LineSegs::
get_vertex_color(int n) const { get_vertex_color(int n) const {
nassertr(_created_data != (GeomVertexData *)NULL, Colorf::zero()); nassertr(_created_data != (GeomVertexData *)NULL, Colorf::zero());
GeomVertexReader color(_created_data, InternalName::get_color()); GeomVertexReader color(_created_data, InternalName::get_color());
color.set_row(n); color.set_row_unsafe(n);
return color.get_data4f(); return color.get_data4f();
} }
@ -172,7 +172,7 @@ void LineSegs::
set_vertex_color(int n, const Colorf &c) { set_vertex_color(int n, const Colorf &c) {
nassertv(_created_data != (GeomVertexData *)NULL); nassertv(_created_data != (GeomVertexData *)NULL);
GeomVertexWriter color(_created_data, InternalName::get_color()); GeomVertexWriter color(_created_data, InternalName::get_color());
color.set_row(n); color.set_row_unsafe(n);
color.set_data4f(c); color.set_data4f(c);
} }

View File

@ -413,8 +413,8 @@ void MeshDrawer::geometry(NodePath draw_node) {
// process polygon // process polygon
for(int idx=s; idx<e; idx++) { for(int idx=s; idx<e; idx++) {
int vidx = _prim->get_vertex(idx); int vidx = _prim->get_vertex(idx);
prim_vertex_reader->set_row(vidx); prim_vertex_reader->set_row_unsafe(vidx);
prim_uv_reader->set_row(vidx); prim_uv_reader->set_row_unsafe(vidx);
vec[indx_over] = _render.get_relative_point( vec[indx_over] = _render.get_relative_point(
current_node_path,prim_vertex_reader->get_data3f()); current_node_path,prim_vertex_reader->get_data3f());
uv[indx_over] = prim_uv_reader->get_data2f(); uv[indx_over] = prim_uv_reader->get_data2f();

View File

@ -226,8 +226,8 @@ process_primitive(const GeomPrimitive *primitive,
out.width(8); out << "" << "primitive " << i << ":" << "\n"; out.width(8); out << "" << "primitive " << i << ":" << "\n";
for (int j = s, m = 0; j < e; j++, m++, _num_vertices++) { for (int j = s, m = 0; j < e; j++, m++, _num_vertices++) {
int vRowIndex = dPrimitive->get_vertex(j); int vRowIndex = dPrimitive->get_vertex(j);
vReader.set_row(vRowIndex); vReader.set_row_unsafe(vRowIndex);
nReader.set_row(vRowIndex); nReader.set_row_unsafe(vRowIndex);
vertex = vReader.get_data3f(); vertex = vReader.get_data3f();
//normal = nReader.get_data3f(); //normal = nReader.get_data3f();
_faces[_num_faces].Indices[m] = _num_vertices; _faces[_num_faces].Indices[m] = _num_vertices;
@ -247,8 +247,8 @@ process_primitive(const GeomPrimitive *primitive,
out.width(8); out << "" << "primitive " << i << ":" << "\n"; out.width(8); out << "" << "primitive " << i << ":" << "\n";
for (int j = s, m = 0; j < e; j++, m++, _num_vertices++) { for (int j = s, m = 0; j < e; j++, m++, _num_vertices++) {
int vRowIndex = dPrimitive->get_vertex(j); int vRowIndex = dPrimitive->get_vertex(j);
vReader.set_row(vRowIndex); vReader.set_row_unsafe(vRowIndex);
nReader.set_row(vRowIndex); nReader.set_row_unsafe(vRowIndex);
vertex = vReader.get_data3f(); vertex = vReader.get_data3f();
//normal = nReader.get_data3f(); //normal = nReader.get_data3f();

View File

@ -321,7 +321,7 @@ add_from_node(const NodePath &node_path, bool size_from_texels, bool resize) {
primitive = geom->get_primitive(pi); primitive = geom->get_primitive(pi);
for (int vi = 0; vi < primitive->get_num_vertices(); ++vi) { for (int vi = 0; vi < primitive->get_num_vertices(); ++vi) {
int vert = primitive->get_vertex(vi); int vert = primitive->get_vertex(vi);
texcoord.set_row(vert); texcoord.set_row_unsafe(vert);
if (!got_texcoord) { if (!got_texcoord) {
min_uv = max_uv = texcoord.get_data2f(); min_uv = max_uv = texcoord.get_data2f();
@ -365,7 +365,7 @@ add_from_node(const NodePath &node_path, bool size_from_texels, bool resize) {
primitive = geom->get_primitive(pi); primitive = geom->get_primitive(pi);
for (int vi = 0; vi < primitive->get_num_vertices(); ++vi) { for (int vi = 0; vi < primitive->get_num_vertices(); ++vi) {
int vert = primitive->get_vertex(vi); int vert = primitive->get_vertex(vi);
vertex.set_row(vert); vertex.set_row_unsafe(vert);
if (!got_vertex) { if (!got_vertex) {
min_xyz = max_xyz = vertex.get_data3f(); min_xyz = max_xyz = vertex.get_data3f();

View File

@ -256,7 +256,6 @@ transform_texcoords(Geom *geom, const InternalName *from_name,
} }
geom->set_vertex_data(new_data._vdata); geom->set_vertex_data(new_data._vdata);
VertexDataAssoc &assoc = _vdata_assoc[new_data._vdata];
if (st._vertex_data->get_ref_count() > 1) { if (st._vertex_data->get_ref_count() > 1) {
_vdata_assoc[new_data._vdata]._might_have_unused = true; _vdata_assoc[new_data._vdata]._might_have_unused = true;
_vdata_assoc[st._vertex_data]._might_have_unused = true; _vdata_assoc[st._vertex_data]._might_have_unused = true;
@ -325,7 +324,6 @@ set_color(Geom *geom, const Colorf &color) {
} }
geom->set_vertex_data(new_data._vdata); geom->set_vertex_data(new_data._vdata);
VertexDataAssoc &assoc = _vdata_assoc[new_data._vdata];
if (sc._vertex_data->get_ref_count() > 1) { if (sc._vertex_data->get_ref_count() > 1) {
_vdata_assoc[new_data._vdata]._might_have_unused = true; _vdata_assoc[new_data._vdata]._might_have_unused = true;
_vdata_assoc[sc._vertex_data]._might_have_unused = true; _vdata_assoc[sc._vertex_data]._might_have_unused = true;
@ -391,7 +389,6 @@ transform_colors(Geom *geom, const LVecBase4f &scale) {
} }
geom->set_vertex_data(new_data._vdata); geom->set_vertex_data(new_data._vdata);
VertexDataAssoc &assoc = _vdata_assoc[new_data._vdata];
if (sc._vertex_data->get_ref_count() > 1) { if (sc._vertex_data->get_ref_count() > 1) {
_vdata_assoc[new_data._vdata]._might_have_unused = true; _vdata_assoc[new_data._vdata]._might_have_unused = true;
_vdata_assoc[sc._vertex_data]._might_have_unused = true; _vdata_assoc[sc._vertex_data]._might_have_unused = true;
@ -616,7 +613,6 @@ apply_texture_colors(Geom *geom, TextureStage *ts, Texture *tex,
} }
geom->set_vertex_data(new_data._vdata); geom->set_vertex_data(new_data._vdata);
VertexDataAssoc &assoc = _vdata_assoc[new_data._vdata];
if (stc._vertex_data->get_ref_count() > 1) { if (stc._vertex_data->get_ref_count() > 1) {
_vdata_assoc[new_data._vdata]._might_have_unused = true; _vdata_assoc[new_data._vdata]._might_have_unused = true;
_vdata_assoc[stc._vertex_data]._might_have_unused = true; _vdata_assoc[stc._vertex_data]._might_have_unused = true;
@ -753,7 +749,6 @@ set_format(Geom *geom, const GeomVertexFormat *new_format) {
} }
geom->set_vertex_data(new_data._vdata); geom->set_vertex_data(new_data._vdata);
VertexDataAssoc &assoc = _vdata_assoc[new_data._vdata];
if (sf._vertex_data->get_ref_count() > 1) { if (sf._vertex_data->get_ref_count() > 1) {
_vdata_assoc[new_data._vdata]._might_have_unused = true; _vdata_assoc[new_data._vdata]._might_have_unused = true;
_vdata_assoc[sf._vertex_data]._might_have_unused = true; _vdata_assoc[sf._vertex_data]._might_have_unused = true;
@ -920,7 +915,6 @@ reverse_normals(Geom *geom) {
} }
geom->set_vertex_data(new_data._vdata); geom->set_vertex_data(new_data._vdata);
VertexDataAssoc &assoc = _vdata_assoc[new_data._vdata];
if (orig_data->get_ref_count() > 1) { if (orig_data->get_ref_count() > 1) {
_vdata_assoc[new_data._vdata]._might_have_unused = true; _vdata_assoc[new_data._vdata]._might_have_unused = true;
_vdata_assoc[orig_data]._might_have_unused = true; _vdata_assoc[orig_data]._might_have_unused = true;
@ -1463,7 +1457,7 @@ append_vdata(const GeomVertexData *vdata, int vertex_offset) {
int num_rows = vdata->get_num_rows(); int num_rows = vdata->get_num_rows();
int new_index[4]; int new_index[4];
index.set_row(vertex_offset); index.set_row_unsafe(vertex_offset);
for (int ci = 0; ci < num_rows; ++ci) { for (int ci = 0; ci < num_rows; ++ci) {
const int *orig_index = index.get_data4i(); const int *orig_index = index.get_data4i();
for (int i = 0; i < num_values; i++) { for (int i = 0; i < num_values; i++) {
@ -1511,7 +1505,7 @@ append_vdata(const GeomVertexData *vdata, int vertex_offset) {
GeomVertexRewriter index(_new_data, InternalName::get_transform_blend()); GeomVertexRewriter index(_new_data, InternalName::get_transform_blend());
if (index.has_column()) { if (index.has_column()) {
int num_rows = vdata->get_num_rows(); int num_rows = vdata->get_num_rows();
index.set_row(vertex_offset); index.set_row_unsafe(vertex_offset);
for (int ci = 0; ci < num_rows; ++ci) { for (int ci = 0; ci < num_rows; ++ci) {
int orig_index = index.get_data1i(); int orig_index = index.get_data1i();

View File

@ -200,6 +200,9 @@ void LightRampAttrib::
output(ostream &out) const { output(ostream &out) const {
out << get_type() << ":"; out << get_type() << ":";
switch (_mode) { switch (_mode) {
case LRT_default:
out << "default()";
break;
case LRT_identity: case LRT_identity:
out << "identity()"; out << "identity()";
break; break;
@ -209,6 +212,15 @@ output(ostream &out) const {
case LRT_double_threshold: case LRT_double_threshold:
out << "double_threshold(" << _level[0] << "," << _level[1] << "," << _threshold[0] << "," << _threshold[1] << ")"; out << "double_threshold(" << _level[0] << "," << _level[1] << "," << _threshold[0] << "," << _threshold[1] << ")";
break; break;
case LRT_hdr0:
out << "hdr0()";
break;
case LRT_hdr1:
out << "hdr1()";
break;
case LRT_hdr2:
out << "hdr2()";
break;
} }
} }

View File

@ -77,9 +77,9 @@ OccluderNode(const string &name) :
OccluderNode:: OccluderNode::
OccluderNode(const OccluderNode &copy) : OccluderNode(const OccluderNode &copy) :
PandaNode(copy), PandaNode(copy),
_vertices(copy._vertices),
_double_sided(copy._double_sided), _double_sided(copy._double_sided),
_min_coverage(copy._min_coverage) _min_coverage(copy._min_coverage),
_vertices(copy._vertices)
{ {
} }

View File

@ -646,7 +646,6 @@ __copy__() const {
int num_children = children.get_num_children(); int num_children = children.get_num_children();
for (int i = 0; i < num_children; ++i) { for (int i = 0; i < num_children; ++i) {
PandaNode *child = children.get_child(i);
node_dupe->add_child(children.get_child(i), children.get_child_sort(i)); node_dupe->add_child(children.get_child(i), children.get_child_sort(i));
} }

View File

@ -50,12 +50,12 @@ ShaderAttrib(const ShaderAttrib &copy) :
_flags(copy._flags), _flags(copy._flags),
_has_flags(copy._has_flags), _has_flags(copy._has_flags),
_instance_count(copy._instance_count), _instance_count(copy._instance_count),
_inputs(copy._inputs),
_auto_normal_on(copy._auto_normal_on), _auto_normal_on(copy._auto_normal_on),
_auto_glow_on(copy._auto_glow_on), _auto_glow_on(copy._auto_glow_on),
_auto_gloss_on(copy._auto_gloss_on), _auto_gloss_on(copy._auto_gloss_on),
_auto_ramp_on(copy._auto_ramp_on), _auto_ramp_on(copy._auto_ramp_on),
_auto_shadow_on(copy._auto_shadow_on) _auto_shadow_on(copy._auto_shadow_on),
_inputs(copy._inputs)
{ {
} }

View File

@ -83,10 +83,10 @@ private:
PT(InternalName) _name; PT(InternalName) _name;
int _type; int _type;
int _priority; int _priority;
Shader::ShaderPtrData _stored_ptr;
PT(Texture) _stored_texture; PT(Texture) _stored_texture;
NodePath _stored_nodepath; NodePath _stored_nodepath;
LVector4f _stored_vector; LVector4f _stored_vector;
Shader::ShaderPtrData _stored_ptr;
public: public:
static TypeHandle get_class_type() { static TypeHandle get_class_type() {

View File

@ -310,18 +310,20 @@ analyze_renderstate(const RenderState *rs) {
} }
if (tex_gen->has_stage(stage)) { if (tex_gen->has_stage(stage)) {
switch (tex_gen->get_mode(stage)) { switch (tex_gen->get_mode(stage)) {
case TexGenAttrib::M_world_position: case TexGenAttrib::M_world_position:
_need_world_position = true; _need_world_position = true;
break; break;
case TexGenAttrib::M_world_normal: case TexGenAttrib::M_world_normal:
_need_world_normal = true; _need_world_normal = true;
break; break;
case TexGenAttrib::M_eye_position: case TexGenAttrib::M_eye_position:
_need_eye_position = true; _need_eye_position = true;
break; break;
case TexGenAttrib::M_eye_normal: case TexGenAttrib::M_eye_normal:
_need_eye_normal = true; _need_eye_normal = true;
break; break;
default:
break;
} }
} }
} }
@ -917,11 +919,19 @@ synthesize_shader(const RenderState *rs) {
nassertr(tex != NULL, NULL); nassertr(tex != NULL, NULL);
text << "\t float4 tex" << _map_index_height << " = tex" << texture_type_as_string(tex->get_texture_type()); text << "\t float4 tex" << _map_index_height << " = tex" << texture_type_as_string(tex->get_texture_type());
text << "(tex_" << _map_index_height << ", l_texcoord" << _map_index_height << "."; text << "(tex_" << _map_index_height << ", l_texcoord" << _map_index_height << ".";
switch(tex->get_texture_type()) { switch (tex->get_texture_type()) {
case Texture::TT_cube_map: case Texture::TT_cube_map:
case Texture::TT_3d_texture: text << "xyz"; break; case Texture::TT_3d_texture:
case Texture::TT_2d_texture: text << "xy"; break; text << "xyz";
case Texture::TT_1d_texture: text << "x"; break; break;
case Texture::TT_2d_texture:
text << "xy";
break;
case Texture::TT_1d_texture:
text << "x";
break;
default:
break;
} }
text << ");\n\t float3 parallax_offset = l_eyevec.xyz * (tex" << _map_index_height; text << ");\n\t float3 parallax_offset = l_eyevec.xyz * (tex" << _map_index_height;
if (_map_height_in_alpha) { if (_map_height_in_alpha) {
@ -952,10 +962,18 @@ synthesize_shader(const RenderState *rs) {
text << "\t float4 tex" << i << " = tex" << texture_type_as_string(tex->get_texture_type()); text << "\t float4 tex" << i << " = tex" << texture_type_as_string(tex->get_texture_type());
text << "(tex_" << i << ", l_texcoord" << i << "."; text << "(tex_" << i << ", l_texcoord" << i << ".";
switch(tex->get_texture_type()) { switch(tex->get_texture_type()) {
case Texture::TT_cube_map: case Texture::TT_cube_map:
case Texture::TT_3d_texture: text << "xyz"; break; case Texture::TT_3d_texture:
case Texture::TT_2d_texture: text << "xy"; break; text << "xyz";
case Texture::TT_1d_texture: text << "x"; break; break;
case Texture::TT_2d_texture:
text << "xy";
break;
case Texture::TT_1d_texture:
text << "x";
break;
default:
break;
} }
text << ");\n"; text << ");\n";
} }

View File

@ -21,10 +21,10 @@
INLINE UvScrollNode:: INLINE UvScrollNode::
UvScrollNode(const string &name, float u_speed, float v_speed, float r_speed) : UvScrollNode(const string &name, float u_speed, float v_speed, float r_speed) :
PandaNode(name), PandaNode(name),
_start_time(ClockObject::get_global_clock()->get_frame_time()),
_u_speed(u_speed), _u_speed(u_speed),
_v_speed(v_speed), _v_speed(v_speed),
_r_speed(r_speed) _r_speed(r_speed),
_start_time(ClockObject::get_global_clock()->get_frame_time())
{ {
set_cull_callback(); set_cull_callback();
} }
@ -37,10 +37,10 @@ UvScrollNode(const string &name, float u_speed, float v_speed, float r_speed) :
INLINE UvScrollNode:: INLINE UvScrollNode::
UvScrollNode(const string &name) : UvScrollNode(const string &name) :
PandaNode(name), PandaNode(name),
_start_time(ClockObject::get_global_clock()->get_frame_time()),
_u_speed(0), _u_speed(0),
_v_speed(0), _v_speed(0),
_r_speed(0) _r_speed(0),
_start_time(ClockObject::get_global_clock()->get_frame_time())
{ {
set_cull_callback(); set_cull_callback();
} }

View File

@ -238,9 +238,9 @@ remove_tris_related_to_vertex(const int vertexIndex) {
if (vertexIndex == idx0 || vertexIndex == idx1 || vertexIndex == idx2) { if (vertexIndex == idx0 || vertexIndex == idx1 || vertexIndex == idx2) {
// Make this triangle degenerated // Make this triangle degenerated
vrewriter.set_row(idx0); v = vrewriter.get_data3f(); vrewriter.set_row_unsafe(idx0); v = vrewriter.get_data3f();
vrewriter.set_row(idx1); vrewriter.set_data3f(v.get_x(), v.get_y(), v.get_z()); vrewriter.set_row_unsafe(idx1); vrewriter.set_data3f(v.get_x(), v.get_y(), v.get_z());
vrewriter.set_row(idx2); vrewriter.set_data3f(v.get_x(), v.get_y(), v.get_z()); vrewriter.set_row_unsafe(idx2); vrewriter.set_data3f(v.get_x(), v.get_y(), v.get_z());
} }
} }
} }
@ -288,9 +288,9 @@ update_normals() {
int idx1 = _prim->get_vertex(s+1); int idx1 = _prim->get_vertex(s+1);
int idx2 = _prim->get_vertex(s+2); int idx2 = _prim->get_vertex(s+2);
vreader.set_row(idx0); v0 = vreader.get_data3f(); vreader.set_row_unsafe(idx0); v0 = vreader.get_data3f();
vreader.set_row(idx1); v1 = vreader.get_data3f(); vreader.set_row_unsafe(idx1); v1 = vreader.get_data3f();
vreader.set_row(idx2); v2 = vreader.get_data3f(); vreader.set_row_unsafe(idx2); v2 = vreader.get_data3f();
n = (v1 - v0).cross(v2 - v0); n = (v1 - v0).cross(v2 - v0);

View File

@ -2382,7 +2382,7 @@ append_vertex(const GeomVertexData *orig_vdata, int orig_row,
_vdata->copy_row_from(new_row, orig_vdata, orig_row, Thread::get_current_thread()); _vdata->copy_row_from(new_row, orig_vdata, orig_row, Thread::get_current_thread());
GeomVertexRewriter vertex_rewriter(_vdata, InternalName::get_vertex()); GeomVertexRewriter vertex_rewriter(_vdata, InternalName::get_vertex());
vertex_rewriter.set_row(new_row); vertex_rewriter.set_row_unsafe(new_row);
LPoint3f point = vertex_rewriter.get_data3f(); LPoint3f point = vertex_rewriter.get_data3f();
vertex_rewriter.set_data3f(point * xform); vertex_rewriter.set_data3f(point * xform);

View File

@ -677,8 +677,8 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader,
break; break;
} }
tcdata[si]._r1.set_row(_min_vertex); tcdata[si]._r1.set_row_unsafe(_min_vertex);
tcdata[si]._r2.set_row(_min_vertex); tcdata[si]._r2.set_row_unsafe(_min_vertex);
if (!tcdata[si]._r1.has_column()) { if (!tcdata[si]._r1.has_column()) {
texgen_func[si] = &texgen_null; texgen_func[si] = &texgen_null;
} }
@ -687,7 +687,7 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader,
bool needs_color = false; bool needs_color = false;
if (_vertex_colors_enabled) { if (_vertex_colors_enabled) {
rcolor = GeomVertexReader(data_reader, InternalName::get_color(), force); rcolor = GeomVertexReader(data_reader, InternalName::get_color(), force);
rcolor.set_row(_min_vertex); rcolor.set_row_unsafe(_min_vertex);
needs_color = rcolor.has_column(); needs_color = rcolor.has_column();
} }
@ -703,12 +703,12 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader,
bool needs_normal = false; bool needs_normal = false;
if (_c->lighting_enabled) { if (_c->lighting_enabled) {
rnormal = GeomVertexReader(data_reader, InternalName::get_normal(), force); rnormal = GeomVertexReader(data_reader, InternalName::get_normal(), force);
rnormal.set_row(_min_vertex); rnormal.set_row_unsafe(_min_vertex);
needs_normal = rnormal.has_column(); needs_normal = rnormal.has_column();
} }
GeomVertexReader rvertex(data_reader, InternalName::get_vertex(), force); GeomVertexReader rvertex(data_reader, InternalName::get_vertex(), force);
rvertex.set_row(_min_vertex); rvertex.set_row_unsafe(_min_vertex);
if (!rvertex.has_column()) { if (!rvertex.has_column()) {
// Whoops, guess the vertex data isn't resident. // Whoops, guess the vertex data isn't resident.