From 9303c247b647e4b07f5a5750cb2c15f60ea19967 Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 30 Apr 2015 20:13:36 +0200 Subject: [PATCH] Support signed int vertex data, normalize 16-bit uint colors properly, don't normalize int columns passed to shaders --- panda/src/glstuff/glGeomMunger_src.cxx | 34 + .../glstuff/glGraphicsStateGuardian_src.cxx | 14 +- panda/src/glstuff/glShaderContext_src.cxx | 10 +- panda/src/gobj/geomEnums.cxx | 9 + panda/src/gobj/geomEnums.h | 11 +- panda/src/gobj/geomVertexArrayFormat.cxx | 17 + panda/src/gobj/geomVertexColumn.I | 292 --- panda/src/gobj/geomVertexColumn.cxx | 2133 +++++++++++++---- panda/src/gobj/geomVertexColumn.h | 42 +- panda/src/gobj/geomVertexData.cxx | 10 +- panda/src/gobj/geomVertexData.h | 2 +- panda/src/gobj/geomVertexWriter.I | 84 - panda/src/gobj/geomVertexWriter.h | 6 - 13 files changed, 1781 insertions(+), 883 deletions(-) diff --git a/panda/src/glstuff/glGeomMunger_src.cxx b/panda/src/glstuff/glGeomMunger_src.cxx index b2deb6e29f..fd2b494386 100644 --- a/panda/src/glstuff/glGeomMunger_src.cxx +++ b/panda/src/glstuff/glGeomMunger_src.cxx @@ -87,6 +87,23 @@ munge_format_impl(const GeomVertexFormat *orig, CLP(GraphicsStateGuardian) *glgsg; DCAST_INTO_R(glgsg, get_gsg(), NULL); +#ifndef OPENGLES + // OpenGL ES 1 does, but regular OpenGL doesn't support GL_BYTE vertices + // and texture coordinates. + const GeomVertexColumn *vertex_type = orig->get_vertex_column(); + if (vertex_type != (GeomVertexColumn *)NULL && + vertex_type->get_numeric_type() == NT_int8) { + int vertex_array = orig->get_array_with(InternalName::get_vertex()); + + PT(GeomVertexArrayFormat) new_array_format = new_format->modify_array(vertex_array); + + // Replace the existing vertex format with the new format. + new_array_format->add_column + (InternalName::get_vertex(), 3, NT_int16, + C_point, vertex_type->get_start(), vertex_type->get_column_alignment()); + } +#endif + const GeomVertexColumn *color_type = orig->get_color_column(); if (color_type != (GeomVertexColumn *)NULL && color_type->get_numeric_type() == NT_packed_dabc && @@ -237,6 +254,23 @@ premunge_format_impl(const GeomVertexFormat *orig) { CLP(GraphicsStateGuardian) *glgsg; DCAST_INTO_R(glgsg, get_gsg(), NULL); +#ifndef OPENGLES + // OpenGL ES 1 does, but regular OpenGL doesn't support GL_BYTE vertices + // and texture coordinates. + const GeomVertexColumn *vertex_type = orig->get_vertex_column(); + if (vertex_type != (GeomVertexColumn *)NULL && + vertex_type->get_numeric_type() == NT_int8) { + int vertex_array = orig->get_array_with(InternalName::get_vertex()); + + PT(GeomVertexArrayFormat) new_array_format = new_format->modify_array(vertex_array); + + // Replace the existing vertex format with the new format. + new_array_format->add_column + (InternalName::get_vertex(), 3, NT_int16, + C_point, vertex_type->get_start(), vertex_type->get_column_alignment()); + } +#endif + const GeomVertexColumn *color_type = orig->get_color_column(); if (color_type != (GeomVertexColumn *)NULL && color_type->get_numeric_type() == NT_packed_dabc && diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index 5c1a3adc21..26809b9143 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -1013,8 +1013,9 @@ reset() { #ifdef OPENGLES _supports_packed_dabc = false; #else - _supports_packed_dabc = /*gl_support_packed_dabc &&*/ - has_extension("GL_ARB_vertex_array_bgra") || has_extension("GL_EXT_vertex_array_bgra"); + _supports_packed_dabc = is_at_least_gl_version(3, 2) || + has_extension("GL_ARB_vertex_array_bgra") || + has_extension("GL_EXT_vertex_array_bgra"); #endif _supports_multisample = @@ -7370,6 +7371,15 @@ get_numeric_type(Geom::NumericType numeric_type) { case Geom::NT_stdfloat: // Shouldn't happen, display error. break; + + case Geom::NT_int8: + return GL_BYTE; + + case Geom::NT_int16: + return GL_SHORT; + + case Geom::NT_int32: + return GL_INT; } GLCAT.error() diff --git a/panda/src/glstuff/glShaderContext_src.cxx b/panda/src/glstuff/glShaderContext_src.cxx index dc50428d00..6e136f818d 100644 --- a/panda/src/glstuff/glShaderContext_src.cxx +++ b/panda/src/glstuff/glShaderContext_src.cxx @@ -1420,9 +1420,10 @@ update_shader_vertex_arrays(ShaderContext *prev, bool force) { GLint p = _glsl_parameter_map[bind._id._seqno]; int num_elements, element_stride, divisor; + bool normalized; if (_glgsg->_data_reader->get_array_info(name, array_reader, num_values, numeric_type, - start, stride, divisor, + normalized, start, stride, divisor, num_elements, element_stride)) { const unsigned char *client_pointer; if (!_glgsg->setup_array_data(client_pointer, array_reader, force)) { @@ -1440,11 +1441,14 @@ update_shader_vertex_arrays(ShaderContext *prev, bool force) { } else #endif if (numeric_type == GeomEnums::NT_packed_dabc) { + // GL_BGRA is a special accepted value available since OpenGL 3.2. + // It requires us to pass GL_TRUE for normalized. _glgsg->_glVertexAttribPointer(p, GL_BGRA, GL_UNSIGNED_BYTE, GL_TRUE, stride, client_pointer); } else { - _glgsg->_glVertexAttribPointer(p, num_values, _glgsg->get_numeric_type(numeric_type), - GL_TRUE, stride, client_pointer); + _glgsg->_glVertexAttribPointer(p, num_values, + _glgsg->get_numeric_type(numeric_type), + normalized, stride, client_pointer); } if (_glgsg->_supports_vertex_attrib_divisor) { diff --git a/panda/src/gobj/geomEnums.cxx b/panda/src/gobj/geomEnums.cxx index e105b0c246..4d7ed0f010 100644 --- a/panda/src/gobj/geomEnums.cxx +++ b/panda/src/gobj/geomEnums.cxx @@ -101,6 +101,15 @@ operator << (ostream &out, GeomEnums::NumericType numeric_type) { case GeomEnums::NT_stdfloat: return out << "stdfloat"; + + case GeomEnums::NT_int8: + return out << "int8"; + + case GeomEnums::NT_int16: + return out << "int16"; + + case GeomEnums::NT_int32: + return out << "int32"; } return out << "**invalid numeric type (" << (int)numeric_type << ")**"; diff --git a/panda/src/gobj/geomEnums.h b/panda/src/gobj/geomEnums.h index 62265cfc23..18f576efcc 100644 --- a/panda/src/gobj/geomEnums.h +++ b/panda/src/gobj/geomEnums.h @@ -144,12 +144,12 @@ PUBLISHED: // SM_uniform: all vertices across all faces have the same colors // and normals. It doesn't really matter which ShadeModelAttrib // mode is used to render this primitive. - SM_uniform, + SM_uniform, // SM_smooth: vertices within a single face have different // colors/normals that should be smoothed across the face. This // primitive should be rendered with SmoothModelAttrib::M_smooth. - SM_smooth, + SM_smooth, // SM_flat_(first,last)_vertex: each face within the primitive // might have a different color/normal than the other faces, but @@ -177,12 +177,15 @@ PUBLISHED: enum NumericType { NT_uint8, // An integer 0..255 NT_uint16, // An integer 0..65535 - NT_uint32, // An integer 0..4294967296 + NT_uint32, // An integer 0..4294967295 NT_packed_dcba, // DirectX style, four byte values packed in a uint32 NT_packed_dabc, // DirectX packed color order (ARGB) NT_float32, // A single-precision float NT_float64, // A double-precision float - NT_stdfloat // Either single- or double-precision, according to vertices-float64. + NT_stdfloat, // Either single- or double-precision, according to vertices-float64. + NT_int8, // An integer -128..127 + NT_int16, // An integer -32768..32767 + NT_int32, // An integer -2147483648..2147483647 }; // The contents determine the semantic meaning of a numeric value diff --git a/panda/src/gobj/geomVertexArrayFormat.cxx b/panda/src/gobj/geomVertexArrayFormat.cxx index 7f1deaff61..2c06afca7a 100644 --- a/panda/src/gobj/geomVertexArrayFormat.cxx +++ b/panda/src/gobj/geomVertexArrayFormat.cxx @@ -627,20 +627,37 @@ get_format_string(bool pad) const { case NT_uint8: fmt_code = 'B'; break; + case NT_uint16: fmt_code = 'H'; break; + case NT_uint32: case NT_packed_dcba: case NT_packed_dabc: fmt_code = 'I'; break; + case NT_float32: fmt_code = 'f'; break; + case NT_float64: fmt_code = 'd'; break; + + case NT_int8: + fmt_code = 'b'; + break; + + case NT_int16: + fmt_code = 'h'; + break; + + case NT_int32: + fmt_code = 'i'; + break; + default: gobj_cat.error() << "Unknown numeric type " << column->get_numeric_type() << "!\n"; diff --git a/panda/src/gobj/geomVertexColumn.I b/panda/src/gobj/geomVertexColumn.I index f2646a0fb0..f9a33bfaf6 100644 --- a/panda/src/gobj/geomVertexColumn.I +++ b/panda/src/gobj/geomVertexColumn.I @@ -365,295 +365,3 @@ operator << (ostream &out, const GeomVertexColumn &obj) { obj.output(out); return out; } - -//////////////////////////////////////////////////////////////////// -// Function: GeomVertexColumn::Packer::maybe_scale_color_f -// Access: Public -// Description: Converts an integer (typically a uint8) value to a -// floating-point value. If the contents value -// indicates this is a color value, scales it into the -// range 0..1 per convention; otherwise leaves it alone. -//////////////////////////////////////////////////////////////////// -INLINE float GeomVertexColumn::Packer:: -maybe_scale_color_f(unsigned int value) { - if (_column->get_contents() == C_color) { - return (float)value / 255.0f; - } else { - return (float)value; - } -} - -//////////////////////////////////////////////////////////////////// -// Function: GeomVertexColumn::Packer::maybe_scale_color_f -// Access: Public -// Description: Converts a pair of integers into the _v2 member. See -// one-parameter maybe_scale_color_f() for more info. -//////////////////////////////////////////////////////////////////// -INLINE void GeomVertexColumn::Packer:: -maybe_scale_color_f(unsigned int a, unsigned int b) { - if (_column->get_contents() == C_color) { - _v2.set((float)a / 255.0f, - (float)b / 255.0f); - } else { - _v2.set((float)a, (float)b); - } -} - -//////////////////////////////////////////////////////////////////// -// Function: GeomVertexColumn::Packer::maybe_scale_color_f -// Access: Public -// Description: Converts a pair of integers into the _v3 member. See -// one-parameter maybe_scale_color_f() for more info. -//////////////////////////////////////////////////////////////////// -INLINE void GeomVertexColumn::Packer:: -maybe_scale_color_f(unsigned int a, unsigned int b, unsigned int c) { - if (_column->get_contents() == C_color) { - _v3.set((float)a / 255.0f, - (float)b / 255.0f, - (float)c / 255.0f); - } else { - _v3.set((float)a, (float)b, (float)c); - } -} - -//////////////////////////////////////////////////////////////////// -// Function: GeomVertexColumn::Packer::maybe_scale_color_f -// Access: Public -// Description: Converts a pair of integers into the _v4 member. See -// one-parameter maybe_scale_color_f() for more info. -//////////////////////////////////////////////////////////////////// -INLINE void GeomVertexColumn::Packer:: -maybe_scale_color_f(unsigned int a, unsigned int b, unsigned int c, - unsigned int d) { - if (_column->get_contents() == C_color) { - _v4.set((float)a / 255.0f, - (float)b / 255.0f, - (float)c / 255.0f, - (float)d / 255.0f); - } else { - _v4.set((float)a, (float)b, (float)c, (float)d); - } -} - -//////////////////////////////////////////////////////////////////// -// Function: GeomVertexColumn::Packer::maybe_unscale_color_f -// Access: Public -// Description: Converts a floating-point value to a uint8 value. If -// the contents value indicates this is a color value, -// scales it into the range 0..255 per convention; -// otherwise leaves it alone. -//////////////////////////////////////////////////////////////////// -INLINE unsigned int GeomVertexColumn::Packer:: -maybe_unscale_color_f(float data) { - if (_column->get_contents() == C_color) { - return (unsigned int)(data * 255.0f); - } else { - return (unsigned int)data; - } -} - -//////////////////////////////////////////////////////////////////// -// Function: GeomVertexColumn::Packer::maybe_unscale_color_f -// Access: Public -// Description: Converts an LVecBase2f into a pair of uint8 -// values. See one-parameter maybe_unscale_color_f() for -// more info. -//////////////////////////////////////////////////////////////////// -INLINE void GeomVertexColumn::Packer:: -maybe_unscale_color_f(const LVecBase2f &data) { - if (_column->get_contents() == C_color) { - _a = (unsigned int)(data[0] * 255.0f); - _b = (unsigned int)(data[1] * 255.0f); - } else { - _a = (unsigned int)data[0]; - _b = (unsigned int)data[1]; - } -} - -//////////////////////////////////////////////////////////////////// -// Function: GeomVertexColumn::Packer::maybe_unscale_color_f -// Access: Public -// Description: Converts an LVecBase3f into a pair of uint8 -// values. See one-parameter maybe_unscale_color_f() for -// more info. -//////////////////////////////////////////////////////////////////// -INLINE void GeomVertexColumn::Packer:: -maybe_unscale_color_f(const LVecBase3f &data) { - if (_column->get_contents() == C_color) { - _a = (unsigned int)(data[0] * 255.0f); - _b = (unsigned int)(data[1] * 255.0f); - _c = (unsigned int)(data[2] * 255.0f); - } else { - _a = (unsigned int)data[0]; - _b = (unsigned int)data[1]; - _c = (unsigned int)data[2]; - } -} - -//////////////////////////////////////////////////////////////////// -// Function: GeomVertexColumn::Packer::maybe_unscale_color_f -// Access: Public -// Description: Converts an LVecBase4f into a pair of uint8 -// values. See one-parameter maybe_unscale_color_f() for -// more info. -//////////////////////////////////////////////////////////////////// -INLINE void GeomVertexColumn::Packer:: -maybe_unscale_color_f(const LVecBase4f &data) { - if (_column->get_contents() == C_color) { - _a = (unsigned int)(data[0] * 255.0f); - _b = (unsigned int)(data[1] * 255.0f); - _c = (unsigned int)(data[2] * 255.0f); - _d = (unsigned int)(data[3] * 255.0f); - } else { - _a = (unsigned int)data[0]; - _b = (unsigned int)data[1]; - _c = (unsigned int)data[2]; - _d = (unsigned int)data[3]; - } -} - -//////////////////////////////////////////////////////////////////// -// Function: GeomVertexColumn::Packer::maybe_scale_color_d -// Access: Public -// Description: Converts an integer (typically a uint8) value to a -// floating-point value. If the contents value -// indicates this is a color value, scales it into the -// range 0..1 per convention; otherwise leaves it alone. -//////////////////////////////////////////////////////////////////// -INLINE double GeomVertexColumn::Packer:: -maybe_scale_color_d(unsigned int value) { - if (_column->get_contents() == C_color) { - return (double)value / 255.0; - } else { - return (double)value; - } -} - -//////////////////////////////////////////////////////////////////// -// Function: GeomVertexColumn::Packer::maybe_scale_color_d -// Access: Public -// Description: Converts a pair of integers into the _v2d member. See -// one-parameter maybe_scale_color_d() for more info. -//////////////////////////////////////////////////////////////////// -INLINE void GeomVertexColumn::Packer:: -maybe_scale_color_d(unsigned int a, unsigned int b) { - if (_column->get_contents() == C_color) { - _v2d.set((double)a / 255.0, - (double)b / 255.0); - } else { - _v2d.set((double)a, (double)b); - } -} - -//////////////////////////////////////////////////////////////////// -// Function: GeomVertexColumn::Packer::maybe_scale_color_d -// Access: Public -// Description: Converts a pair of integers into the _v3d member. See -// one-parameter maybe_scale_color_d() for more info. -//////////////////////////////////////////////////////////////////// -INLINE void GeomVertexColumn::Packer:: -maybe_scale_color_d(unsigned int a, unsigned int b, unsigned int c) { - if (_column->get_contents() == C_color) { - _v3d.set((double)a / 255.0, - (double)b / 255.0, - (double)c / 255.0); - } else { - _v3d.set((double)a, (double)b, (double)c); - } -} - -//////////////////////////////////////////////////////////////////// -// Function: GeomVertexColumn::Packer::maybe_scale_color_d -// Access: Public -// Description: Converts a pair of integers into the _v4d member. See -// one-parameter maybe_scale_color_d() for more info. -//////////////////////////////////////////////////////////////////// -INLINE void GeomVertexColumn::Packer:: -maybe_scale_color_d(unsigned int a, unsigned int b, unsigned int c, - unsigned int d) { - if (_column->get_contents() == C_color) { - _v4d.set((double)a / 255.0, - (double)b / 255.0, - (double)c / 255.0, - (double)d / 255.0); - } else { - _v4d.set((double)a, (double)b, (double)c, (double)d); - } -} - -//////////////////////////////////////////////////////////////////// -// Function: GeomVertexColumn::Packer::maybe_unscale_color_d -// Access: Public -// Description: Converts a floating-point value to a uint8 value. If -// the contents value indicates this is a color value, -// scales it into the range 0..255 per convention; -// otherwise leaves it alone. -//////////////////////////////////////////////////////////////////// -INLINE unsigned int GeomVertexColumn::Packer:: -maybe_unscale_color_d(double data) { - if (_column->get_contents() == C_color) { - return (unsigned int)(data * 255.0); - } else { - return (unsigned int)data; - } -} - -//////////////////////////////////////////////////////////////////// -// Function: GeomVertexColumn::Packer::maybe_unscale_color_d -// Access: Public -// Description: Converts an LVecBase2d into a pair of uint8 -// values. See one-parameter maybe_unscale_color_d() for -// more info. -//////////////////////////////////////////////////////////////////// -INLINE void GeomVertexColumn::Packer:: -maybe_unscale_color_d(const LVecBase2d &data) { - if (_column->get_contents() == C_color) { - _a = (unsigned int)(data[0] * 255.0); - _b = (unsigned int)(data[1] * 255.0); - } else { - _a = (unsigned int)data[0]; - _b = (unsigned int)data[1]; - } -} - -//////////////////////////////////////////////////////////////////// -// Function: GeomVertexColumn::Packer::maybe_unscale_color_d -// Access: Public -// Description: Converts an LVecBase3d into a pair of uint8 -// values. See one-parameter maybe_unscale_color_d() for -// more info. -//////////////////////////////////////////////////////////////////// -INLINE void GeomVertexColumn::Packer:: -maybe_unscale_color_d(const LVecBase3d &data) { - if (_column->get_contents() == C_color) { - _a = (unsigned int)(data[0] * 255.0); - _b = (unsigned int)(data[1] * 255.0); - _c = (unsigned int)(data[2] * 255.0); - } else { - _a = (unsigned int)data[0]; - _b = (unsigned int)data[1]; - _c = (unsigned int)data[2]; - } -} - -//////////////////////////////////////////////////////////////////// -// Function: GeomVertexColumn::Packer::maybe_unscale_color_d -// Access: Public -// Description: Converts an LVecBase4d into a pair of uint8 -// values. See one-parameter maybe_unscale_color_d() for -// more info. -//////////////////////////////////////////////////////////////////// -INLINE void GeomVertexColumn::Packer:: -maybe_unscale_color_d(const LVecBase4d &data) { - if (_column->get_contents() == C_color) { - _a = (unsigned int)(data[0] * 255.0); - _b = (unsigned int)(data[1] * 255.0); - _c = (unsigned int)(data[2] * 255.0); - _d = (unsigned int)(data[3] * 255.0); - } else { - _a = (unsigned int)data[0]; - _b = (unsigned int)data[1]; - _c = (unsigned int)data[2]; - _d = (unsigned int)data[3]; - } -} diff --git a/panda/src/gobj/geomVertexColumn.cxx b/panda/src/gobj/geomVertexColumn.cxx index 1698384d07..05419c41b5 100644 --- a/panda/src/gobj/geomVertexColumn.cxx +++ b/panda/src/gobj/geomVertexColumn.cxx @@ -20,7 +20,7 @@ //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Copy Assignment Operator // Access: Published -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn:: operator = (const GeomVertexColumn ©) { @@ -115,21 +115,24 @@ set_column_alignment(int column_alignment) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::output // Access: Published -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn:: output(ostream &out) const { out << *get_name() << "(" << get_num_components(); switch (get_numeric_type()) { case NT_uint8: + case NT_int8: out << "b"; break; case NT_uint16: + case NT_int16: out << "s"; break; case NT_uint32: + case NT_int32: out << "l"; break; @@ -180,14 +183,17 @@ setup() { switch (_numeric_type) { case NT_uint16: + case NT_int16: _component_bytes = 2; // sizeof(PN_uint16) break; case NT_uint32: + case NT_int32: _component_bytes = 4; // sizeof(PN_uint32) break; case NT_uint8: + case NT_int8: _component_bytes = 1; break; @@ -230,7 +236,7 @@ setup() { if (_packer != NULL) { delete _packer; } - + _packer = make_packer(); _packer->_column = this; } @@ -302,28 +308,15 @@ make_packer() const { return new Packer_point; case C_color: - switch (get_numeric_type()) { - case NT_uint8: - switch (get_num_components()) { - case 4: + if (get_num_values() == 4) { + switch (get_numeric_type()) { + case NT_uint8: return new Packer_rgba_uint8_4; - - default: - break; - } - break; - case NT_packed_dabc: - switch (get_num_components()) { - case 1: + + case NT_packed_dabc: return new Packer_argb_packed; - - default: - break; - } - break; - case NT_float32: - switch (get_num_components()) { - case 4: + + case NT_float32: if (sizeof(float) == sizeof(PN_float32)) { // Use the native float type implementation for a tiny bit // more optimization. @@ -331,15 +324,16 @@ make_packer() const { } else { return new Packer_rgba_float32_4; } - + default: break; } - break; - default: - break; + } else if (get_num_values() != 3) { + gobj_cat.error() + << "GeomVertexColumn with contents C_color must have 3 or 4 components!\n"; } return new Packer_color; + default: // Otherwise, we just read it as a generic value. switch (get_numeric_type()) { @@ -439,7 +433,7 @@ fillin(DatagramIterator &scan, BamReader *manager) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::Destructor // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// GeomVertexColumn::Packer:: ~Packer() { @@ -448,13 +442,13 @@ GeomVertexColumn::Packer:: //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::get_data1f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// float GeomVertexColumn::Packer:: get_data1f(const unsigned char *pointer) { switch (_column->get_numeric_type()) { case NT_uint8: - return maybe_scale_color_f(*pointer); + return *(const PN_uint8 *)pointer; case NT_uint16: return *(const PN_uint16 *)pointer; @@ -465,13 +459,13 @@ get_data1f(const unsigned char *pointer) { case NT_packed_dcba: { PN_uint32 dword = *(const PN_uint32 *)pointer; - return maybe_scale_color_f(GeomVertexData::unpack_abcd_d(dword)); + return GeomVertexData::unpack_abcd_d(dword); } case NT_packed_dabc: { PN_uint32 dword = *(const PN_uint32 *)pointer; - return maybe_scale_color_f(GeomVertexData::unpack_abcd_b(dword)); + return GeomVertexData::unpack_abcd_b(dword); } case NT_float32: @@ -480,6 +474,15 @@ get_data1f(const unsigned char *pointer) { case NT_float64: return *(const PN_float64 *)pointer; + case NT_int8: + return *(const PN_int8 *)pointer; + + case NT_int16: + return *(const PN_int16 *)pointer; + + case NT_int32: + return *(const PN_int32 *)pointer; + default: nassertr(false, 0.0f); } @@ -490,7 +493,7 @@ get_data1f(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::get_data2f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase2f &GeomVertexColumn::Packer:: get_data2f(const unsigned char *pointer) { @@ -501,39 +504,42 @@ get_data2f(const unsigned char *pointer) { } else { switch (_column->get_numeric_type()) { case NT_uint8: - maybe_scale_color_f(pointer[0], pointer[1]); + { + const PN_uint8 *pi = (const PN_uint8 *)pointer; + _v2.set(pi[0], pi[1]); + } return _v2; - + case NT_uint16: { const PN_uint16 *pi = (const PN_uint16 *)pointer; _v2.set(pi[0], pi[1]); } return _v2; - + case NT_uint32: { const PN_uint32 *pi = (const PN_uint32 *)pointer; _v2.set(pi[0], pi[1]); } return _v2; - + case NT_packed_dcba: { PN_uint32 dword = *(const PN_uint32 *)pointer; - maybe_scale_color_f(GeomVertexData::unpack_abcd_d(dword), - GeomVertexData::unpack_abcd_c(dword)); + _v2.set(GeomVertexData::unpack_abcd_d(dword), + GeomVertexData::unpack_abcd_c(dword)); } return _v2; - + case NT_packed_dabc: { PN_uint32 dword = *(const PN_uint32 *)pointer; - maybe_scale_color_f(GeomVertexData::unpack_abcd_b(dword), - GeomVertexData::unpack_abcd_c(dword)); + _v2.set(GeomVertexData::unpack_abcd_b(dword), + GeomVertexData::unpack_abcd_c(dword)); } return _v2; - + case NT_float32: { const PN_float32 *pi = (const PN_float32 *)pointer; @@ -550,6 +556,28 @@ get_data2f(const unsigned char *pointer) { case NT_stdfloat: nassertr(false, _v2); + return _v2; + + case NT_int8: + { + const PN_int8 *pi = (const PN_int8 *)pointer; + _v2.set(pi[0], pi[1]); + } + return _v2; + + case NT_int16: + { + const PN_int16 *pi = (const PN_int16 *)pointer; + _v2.set(pi[0], pi[1]); + } + return _v2; + + case NT_int32: + { + const PN_int32 *pi = (const PN_int32 *)pointer; + _v2.set(pi[0], pi[1]); + } + return _v2; } } @@ -559,7 +587,7 @@ get_data2f(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::get_data3f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase3f &GeomVertexColumn::Packer:: get_data3f(const unsigned char *pointer) { @@ -578,48 +606,51 @@ get_data3f(const unsigned char *pointer) { default: switch (_column->get_numeric_type()) { case NT_uint8: - maybe_scale_color_f(pointer[0], pointer[1], pointer[2]); + { + const PN_uint8 *pi = (const PN_uint8 *)pointer; + _v3.set(pi[0], pi[1], pi[2]); + } return _v3; - + case NT_uint16: { const PN_uint16 *pi = (const PN_uint16 *)pointer; _v3.set(pi[0], pi[1], pi[2]); } return _v3; - + case NT_uint32: { const PN_uint32 *pi = (const PN_uint32 *)pointer; _v3.set(pi[0], pi[1], pi[2]); } return _v3; - + case NT_packed_dcba: { PN_uint32 dword = *(const PN_uint32 *)pointer; - maybe_scale_color_f(GeomVertexData::unpack_abcd_d(dword), - GeomVertexData::unpack_abcd_c(dword), - GeomVertexData::unpack_abcd_b(dword)); + _v3.set(GeomVertexData::unpack_abcd_d(dword), + GeomVertexData::unpack_abcd_c(dword), + GeomVertexData::unpack_abcd_b(dword)); } return _v3; - + case NT_packed_dabc: { PN_uint32 dword = *(const PN_uint32 *)pointer; - maybe_scale_color_f(GeomVertexData::unpack_abcd_b(dword), - GeomVertexData::unpack_abcd_c(dword), - GeomVertexData::unpack_abcd_d(dword)); + _v3.set(GeomVertexData::unpack_abcd_b(dword), + GeomVertexData::unpack_abcd_c(dword), + GeomVertexData::unpack_abcd_d(dword)); } return _v3; - + case NT_float32: { const PN_float32 *pi = (const PN_float32 *)pointer; _v3.set(pi[0], pi[1], pi[2]); } return _v3; - + case NT_float64: { const PN_float64 *pi = (const PN_float64 *)pointer; @@ -629,6 +660,28 @@ get_data3f(const unsigned char *pointer) { case NT_stdfloat: nassertr(false, _v3); + return _v3; + + case NT_int8: + { + const PN_int8 *pi = (const PN_int8 *)pointer; + _v3.set(pi[0], pi[1], pi[2]); + } + return _v3; + + case NT_int16: + { + const PN_int16 *pi = (const PN_int16 *)pointer; + _v3.set(pi[0], pi[1], pi[2]); + } + return _v3; + + case NT_int32: + { + const PN_int32 *pi = (const PN_int32 *)pointer; + _v3.set(pi[0], pi[1], pi[2]); + } + return _v3; } } @@ -638,7 +691,7 @@ get_data3f(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::get_data4f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase4f &GeomVertexColumn::Packer:: get_data4f(const unsigned char *pointer) { @@ -664,50 +717,53 @@ get_data4f(const unsigned char *pointer) { default: switch (_column->get_numeric_type()) { case NT_uint8: - maybe_scale_color_f(pointer[0], pointer[1], pointer[2], pointer[3]); + { + const PN_uint8 *pi = (const PN_uint8 *)pointer; + _v4.set(pi[0], pi[1], pi[2], pi[3]); + } return _v4; - + case NT_uint16: { const PN_uint16 *pi = (const PN_uint16 *)pointer; _v4.set(pi[0], pi[1], pi[2], pi[3]); } return _v4; - + case NT_uint32: { const PN_uint32 *pi = (const PN_uint32 *)pointer; _v4.set(pi[0], pi[1], pi[2], pi[3]); } return _v4; - + case NT_packed_dcba: { PN_uint32 dword = *(const PN_uint32 *)pointer; - maybe_scale_color_f(GeomVertexData::unpack_abcd_d(dword), - GeomVertexData::unpack_abcd_c(dword), - GeomVertexData::unpack_abcd_b(dword), - GeomVertexData::unpack_abcd_a(dword)); + _v4.set(GeomVertexData::unpack_abcd_d(dword), + GeomVertexData::unpack_abcd_c(dword), + GeomVertexData::unpack_abcd_b(dword), + GeomVertexData::unpack_abcd_a(dword)); } return _v4; - + case NT_packed_dabc: { PN_uint32 dword = *(const PN_uint32 *)pointer; - maybe_scale_color_f(GeomVertexData::unpack_abcd_b(dword), - GeomVertexData::unpack_abcd_c(dword), - GeomVertexData::unpack_abcd_d(dword), - GeomVertexData::unpack_abcd_a(dword)); + _v4.set(GeomVertexData::unpack_abcd_b(dword), + GeomVertexData::unpack_abcd_c(dword), + GeomVertexData::unpack_abcd_d(dword), + GeomVertexData::unpack_abcd_a(dword)); } return _v4; - + case NT_float32: { const PN_float32 *pi = (const PN_float32 *)pointer; _v4.set(pi[0], pi[1], pi[2], pi[3]); } return _v4; - + case NT_float64: { const PN_float64 *pi = (const PN_float64 *)pointer; @@ -717,6 +773,28 @@ get_data4f(const unsigned char *pointer) { case NT_stdfloat: nassertr(false, _v4); + break; + + case NT_int8: + { + const PN_int8 *pi = (const PN_int8 *)pointer; + _v4.set(pi[0], pi[1], pi[2], pi[3]); + } + return _v4; + + case NT_int16: + { + const PN_int16 *pi = (const PN_int16 *)pointer; + _v4.set(pi[0], pi[1], pi[2], pi[3]); + } + return _v4; + + case NT_int32: + { + const PN_int32 *pi = (const PN_int32 *)pointer; + _v4.set(pi[0], pi[1], pi[2], pi[3]); + } + return _v4; } } @@ -726,13 +804,13 @@ get_data4f(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::get_data1d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// double GeomVertexColumn::Packer:: get_data1d(const unsigned char *pointer) { switch (_column->get_numeric_type()) { case NT_uint8: - return maybe_scale_color_d(*pointer); + return *(const PN_uint8 *)pointer; case NT_uint16: return *(const PN_uint16 *)pointer; @@ -743,13 +821,13 @@ get_data1d(const unsigned char *pointer) { case NT_packed_dcba: { PN_uint32 dword = *(const PN_uint32 *)pointer; - return maybe_scale_color_d(GeomVertexData::unpack_abcd_d(dword)); + return GeomVertexData::unpack_abcd_d(dword); } case NT_packed_dabc: { PN_uint32 dword = *(const PN_uint32 *)pointer; - return maybe_scale_color_d(GeomVertexData::unpack_abcd_b(dword)); + return GeomVertexData::unpack_abcd_b(dword); } case NT_float32: @@ -760,6 +838,16 @@ get_data1d(const unsigned char *pointer) { case NT_stdfloat: nassertr(false, 0.0f); + return 0.0f; + + case NT_int8: + return *(const PN_int8 *)pointer; + + case NT_int16: + return *(const PN_int16 *)pointer; + + case NT_int32: + return *(const PN_int32 *)pointer; } return 0.0f; @@ -768,7 +856,7 @@ get_data1d(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::get_data2d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase2d &GeomVertexColumn::Packer:: get_data2d(const unsigned char *pointer) { @@ -779,39 +867,42 @@ get_data2d(const unsigned char *pointer) { } else { switch (_column->get_numeric_type()) { case NT_uint8: - maybe_scale_color_d(pointer[0], pointer[1]); + { + const PN_uint8 *pi = (const PN_uint8 *)pointer; + _v2d.set(pi[0], pi[1]); + } return _v2d; - + case NT_uint16: { const PN_uint16 *pi = (const PN_uint16 *)pointer; _v2d.set(pi[0], pi[1]); } return _v2d; - + case NT_uint32: { const PN_uint32 *pi = (const PN_uint32 *)pointer; _v2d.set(pi[0], pi[1]); } return _v2d; - + case NT_packed_dcba: { PN_uint32 dword = *(const PN_uint32 *)pointer; - maybe_scale_color_d(GeomVertexData::unpack_abcd_d(dword), - GeomVertexData::unpack_abcd_c(dword)); + _v2d.set(GeomVertexData::unpack_abcd_d(dword), + GeomVertexData::unpack_abcd_c(dword)); } return _v2d; - + case NT_packed_dabc: { PN_uint32 dword = *(const PN_uint32 *)pointer; - maybe_scale_color_d(GeomVertexData::unpack_abcd_b(dword), - GeomVertexData::unpack_abcd_c(dword)); + _v2d.set(GeomVertexData::unpack_abcd_b(dword), + GeomVertexData::unpack_abcd_c(dword)); } return _v2d; - + case NT_float32: { const PN_float32 *pi = (const PN_float32 *)pointer; @@ -828,6 +919,28 @@ get_data2d(const unsigned char *pointer) { case NT_stdfloat: nassertr(false, _v2d); + return _v2d; + + case NT_int8: + { + const PN_int8 *pi = (const PN_int8 *)pointer; + _v2d.set(pi[0], pi[1]); + } + return _v2d; + + case NT_int16: + { + const PN_int16 *pi = (const PN_int16 *)pointer; + _v2d.set(pi[0], pi[1]); + } + return _v2d; + + case NT_int32: + { + const PN_int32 *pi = (const PN_int32 *)pointer; + _v2d.set(pi[0], pi[1]); + } + return _v2d; } } @@ -837,7 +950,7 @@ get_data2d(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::get_data3d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase3d &GeomVertexColumn::Packer:: get_data3d(const unsigned char *pointer) { @@ -856,48 +969,51 @@ get_data3d(const unsigned char *pointer) { default: switch (_column->get_numeric_type()) { case NT_uint8: - maybe_scale_color_d(pointer[0], pointer[1], pointer[2]); + { + const PN_uint8 *pi = (const PN_uint8 *)pointer; + _v3d.set(pi[0], pi[1], pi[2]); + } return _v3d; - + case NT_uint16: { const PN_uint16 *pi = (const PN_uint16 *)pointer; _v3d.set(pi[0], pi[1], pi[2]); } return _v3d; - + case NT_uint32: { const PN_uint32 *pi = (const PN_uint32 *)pointer; _v3d.set(pi[0], pi[1], pi[2]); } return _v3d; - + case NT_packed_dcba: { PN_uint32 dword = *(const PN_uint32 *)pointer; - maybe_scale_color_d(GeomVertexData::unpack_abcd_d(dword), - GeomVertexData::unpack_abcd_c(dword), - GeomVertexData::unpack_abcd_b(dword)); + _v3d.set(GeomVertexData::unpack_abcd_d(dword), + GeomVertexData::unpack_abcd_c(dword), + GeomVertexData::unpack_abcd_b(dword)); } return _v3d; - + case NT_packed_dabc: { PN_uint32 dword = *(const PN_uint32 *)pointer; - maybe_scale_color_d(GeomVertexData::unpack_abcd_b(dword), - GeomVertexData::unpack_abcd_c(dword), - GeomVertexData::unpack_abcd_d(dword)); + _v3d.set(GeomVertexData::unpack_abcd_b(dword), + GeomVertexData::unpack_abcd_c(dword), + GeomVertexData::unpack_abcd_d(dword)); } return _v3d; - + case NT_float32: { const PN_float32 *pi = (const PN_float32 *)pointer; _v3d.set(pi[0], pi[1], pi[2]); } return _v3d; - + case NT_float64: { const PN_float64 *pi = (const PN_float64 *)pointer; @@ -907,6 +1023,28 @@ get_data3d(const unsigned char *pointer) { case NT_stdfloat: nassertr(false, _v3d); + return _v3d; + + case NT_int8: + { + const PN_int8 *pi = (const PN_int8 *)pointer; + _v3d.set(pi[0], pi[1], pi[2]); + } + return _v3d; + + case NT_int16: + { + const PN_int16 *pi = (const PN_int16 *)pointer; + _v3d.set(pi[0], pi[1], pi[2]); + } + return _v3d; + + case NT_int32: + { + const PN_int32 *pi = (const PN_int32 *)pointer; + _v3d.set(pi[0], pi[1], pi[2]); + } + return _v3d; } } @@ -916,7 +1054,7 @@ get_data3d(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::get_data4d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase4d &GeomVertexColumn::Packer:: get_data4d(const unsigned char *pointer) { @@ -942,50 +1080,53 @@ get_data4d(const unsigned char *pointer) { default: switch (_column->get_numeric_type()) { case NT_uint8: - maybe_scale_color_d(pointer[0], pointer[1], pointer[2], pointer[3]); + { + const PN_uint8 *pi = (const PN_uint8 *)pointer; + _v4d.set(pi[0], pi[1], pi[2], pi[3]); + } return _v4d; - + case NT_uint16: { const PN_uint16 *pi = (const PN_uint16 *)pointer; _v4d.set(pi[0], pi[1], pi[2], pi[3]); } return _v4d; - + case NT_uint32: { const PN_uint32 *pi = (const PN_uint32 *)pointer; _v4d.set(pi[0], pi[1], pi[2], pi[3]); } return _v4d; - + case NT_packed_dcba: { PN_uint32 dword = *(const PN_uint32 *)pointer; - maybe_scale_color_d(GeomVertexData::unpack_abcd_d(dword), - GeomVertexData::unpack_abcd_c(dword), - GeomVertexData::unpack_abcd_b(dword), - GeomVertexData::unpack_abcd_a(dword)); + _v4d.set(GeomVertexData::unpack_abcd_d(dword), + GeomVertexData::unpack_abcd_c(dword), + GeomVertexData::unpack_abcd_b(dword), + GeomVertexData::unpack_abcd_a(dword)); } return _v4d; - + case NT_packed_dabc: { PN_uint32 dword = *(const PN_uint32 *)pointer; - maybe_scale_color_d(GeomVertexData::unpack_abcd_b(dword), - GeomVertexData::unpack_abcd_c(dword), - GeomVertexData::unpack_abcd_d(dword), - GeomVertexData::unpack_abcd_a(dword)); + _v4d.set(GeomVertexData::unpack_abcd_b(dword), + GeomVertexData::unpack_abcd_c(dword), + GeomVertexData::unpack_abcd_d(dword), + GeomVertexData::unpack_abcd_a(dword)); } return _v4d; - + case NT_float32: { const PN_float32 *pi = (const PN_float32 *)pointer; _v4d.set(pi[0], pi[1], pi[2], pi[3]); } return _v4d; - + case NT_float64: { const PN_float64 *pi = (const PN_float64 *)pointer; @@ -995,6 +1136,28 @@ get_data4d(const unsigned char *pointer) { case NT_stdfloat: nassertr(false, _v4d); + break; + + case NT_int8: + { + const PN_int8 *pi = (const PN_int8 *)pointer; + _v4d.set(pi[0], pi[1], pi[2], pi[3]); + } + return _v4d; + + case NT_int16: + { + const PN_int16 *pi = (const PN_int16 *)pointer; + _v4d.set(pi[0], pi[1], pi[2], pi[3]); + } + return _v4d; + + case NT_int32: + { + const PN_int32 *pi = (const PN_int32 *)pointer; + _v4d.set(pi[0], pi[1], pi[2], pi[3]); + } + return _v4d; } } @@ -1004,7 +1167,7 @@ get_data4d(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::get_data1i // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// int GeomVertexColumn::Packer:: get_data1i(const unsigned char *pointer) { @@ -1038,6 +1201,16 @@ get_data1i(const unsigned char *pointer) { case NT_stdfloat: nassertr(false, 0); + break; + + case NT_int8: + return *(const PN_int8 *)pointer; + + case NT_int16: + return *(const PN_int16 *)pointer; + + case NT_int32: + return *(const PN_int32 *)pointer; } return 0; @@ -1046,7 +1219,7 @@ get_data1i(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::get_data2i // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase2i &GeomVertexColumn::Packer:: get_data2i(const unsigned char *pointer) { @@ -1060,21 +1233,21 @@ get_data2i(const unsigned char *pointer) { case NT_uint8: _v2i.set(pointer[0], pointer[1]); return _v2i; - + case NT_uint16: { const PN_uint16 *pi = (const PN_uint16 *)pointer; _v2i.set(pi[0], pi[1]); } return _v2i; - + case NT_uint32: { const PN_uint32 *pi = (const PN_uint32 *)pointer; _v2i.set(pi[0], pi[1]); } return _v2i; - + case NT_packed_dcba: { PN_uint32 dword = *(const PN_uint32 *)pointer; @@ -1082,7 +1255,7 @@ get_data2i(const unsigned char *pointer) { GeomVertexData::unpack_abcd_c(dword)); } return _v2i; - + case NT_packed_dabc: { PN_uint32 dword = *(const PN_uint32 *)pointer; @@ -1090,14 +1263,14 @@ get_data2i(const unsigned char *pointer) { GeomVertexData::unpack_abcd_c(dword)); } return _v2i; - + case NT_float32: { const PN_float32 *pi = (const PN_float32 *)pointer; _v2i.set((int)pi[0], (int)pi[1]); } return _v2i; - + case NT_float64: { const PN_float64 *pi = (const PN_float64 *)pointer; @@ -1107,6 +1280,28 @@ get_data2i(const unsigned char *pointer) { case NT_stdfloat: nassertr(false, _v2i); + break; + + case NT_int8: + { + const PN_int8 *pi = (const PN_int8 *)pointer; + _v2i.set(pi[0], pi[1]); + } + return _v2i; + + case NT_int16: + { + const PN_int16 *pi = (const PN_int16 *)pointer; + _v2i.set(pi[0], pi[1]); + } + return _v2i; + + case NT_int32: + { + const PN_int32 *pi = (const PN_int32 *)pointer; + _v2i.set(pi[0], pi[1]); + } + return _v2i; } } @@ -1116,7 +1311,7 @@ get_data2i(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::get_data3i // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase3i &GeomVertexColumn::Packer:: get_data3i(const unsigned char *pointer) { @@ -1186,6 +1381,28 @@ get_data3i(const unsigned char *pointer) { case NT_stdfloat: nassertr(false, _v3i); + break; + + case NT_int8: + { + const PN_int8 *pi = (const PN_int8 *)pointer; + _v3i.set(pi[0], pi[1], pi[2]); + } + return _v3i; + + case NT_int16: + { + const PN_int16 *pi = (const PN_int16 *)pointer; + _v3i.set(pi[0], pi[1], pi[2]); + } + return _v3i; + + case NT_int32: + { + const PN_int32 *pi = (const PN_int32 *)pointer; + _v3i.set(pi[0], pi[1], pi[2]); + } + return _v3i; } } @@ -1195,7 +1412,7 @@ get_data3i(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::get_data4i // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase4i &GeomVertexColumn::Packer:: get_data4i(const unsigned char *pointer) { @@ -1223,21 +1440,21 @@ get_data4i(const unsigned char *pointer) { case NT_uint8: _v4i.set(pointer[0], pointer[1], pointer[2], pointer[3]); return _v4i; - + case NT_uint16: { const PN_uint16 *pi = (const PN_uint16 *)pointer; _v4i.set(pi[0], pi[1], pi[2], pi[3]); } return _v4i; - + case NT_uint32: { const PN_uint32 *pi = (const PN_uint32 *)pointer; _v4i.set(pi[0], pi[1], pi[2], pi[3]); } return _v4i; - + case NT_packed_dcba: { PN_uint32 dword = *(const PN_uint32 *)pointer; @@ -1247,7 +1464,7 @@ get_data4i(const unsigned char *pointer) { GeomVertexData::unpack_abcd_a(dword)); } return _v4i; - + case NT_packed_dabc: { PN_uint32 dword = *(const PN_uint32 *)pointer; @@ -1257,14 +1474,14 @@ get_data4i(const unsigned char *pointer) { GeomVertexData::unpack_abcd_a(dword)); } return _v4i; - + case NT_float32: { const PN_float32 *pi = (const PN_float32 *)pointer; _v4i.set((int)pi[0], (int)pi[1], (int)pi[2], (int)pi[3]); } return _v4i; - + case NT_float64: { const PN_float64 *pi = (const PN_float64 *)pointer; @@ -1274,6 +1491,28 @@ get_data4i(const unsigned char *pointer) { case NT_stdfloat: nassertr(false, _v4i); + break; + + case NT_int8: + { + const PN_int8 *pi = (const PN_int8 *)pointer; + _v4i.set(pi[0], pi[1], pi[2], pi[3]); + } + return _v4i; + + case NT_int16: + { + const PN_int16 *pi = (const PN_int16 *)pointer; + _v4i.set(pi[0], pi[1], pi[2], pi[3]); + } + return _v4i; + + case NT_int32: + { + const PN_int32 *pi = (const PN_int32 *)pointer; + _v4i.set(pi[0], pi[1], pi[2], pi[3]); + } + return _v4i; } } @@ -1283,7 +1522,7 @@ get_data4i(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::set_data1f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer:: set_data1f(unsigned char *pointer, float data) { @@ -1291,32 +1530,45 @@ set_data1f(unsigned char *pointer, float data) { case 1: switch (_column->get_numeric_type()) { case NT_uint8: - *pointer = maybe_unscale_color_f(data); + *(PN_uint8 *)pointer = (unsigned int)data; break; - + case NT_uint16: *(PN_uint16 *)pointer = (unsigned int)data; break; - + case NT_uint32: *(PN_uint32 *)pointer = (unsigned int)data; break; - + case NT_packed_dcba: case NT_packed_dabc: nassertv(false); break; - + case NT_float32: *(PN_float32 *)pointer = data; break; - + case NT_float64: *(PN_float64 *)pointer = data; break; case NT_stdfloat: nassertv(false); + break; + + case NT_int8: + *(PN_int8 *)pointer = (int)data; + break; + + case NT_int16: + *(PN_int16 *)pointer = (int)data; + break; + + case NT_int32: + *(PN_int32 *)pointer = (int)data; + break; } break; @@ -1337,7 +1589,7 @@ set_data1f(unsigned char *pointer, float data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::set_data2f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer:: set_data2f(unsigned char *pointer, const LVecBase2f &data) { @@ -1348,11 +1600,13 @@ set_data2f(unsigned char *pointer, const LVecBase2f &data) { case 2: switch (_column->get_numeric_type()) { case NT_uint8: - maybe_unscale_color_f(data); - pointer[0] = _a; - pointer[1] = _b; + { + PN_uint8 *pi = (PN_uint8 *)pointer; + pi[0] = (unsigned int)data[0]; + pi[1] = (unsigned int)data[1]; + } break; - + case NT_uint16: { PN_uint16 *pi = (PN_uint16 *)pointer; @@ -1360,7 +1614,7 @@ set_data2f(unsigned char *pointer, const LVecBase2f &data) { pi[1] = (unsigned int)data[1]; } break; - + case NT_uint32: { PN_uint32 *pi = (PN_uint32 *)pointer; @@ -1368,12 +1622,12 @@ set_data2f(unsigned char *pointer, const LVecBase2f &data) { pi[1] = (unsigned int)data[1]; } break; - + case NT_packed_dcba: case NT_packed_dabc: nassertv(false); break; - + case NT_float32: { PN_float32 *pi = (PN_float32 *)pointer; @@ -1381,7 +1635,7 @@ set_data2f(unsigned char *pointer, const LVecBase2f &data) { pi[1] = data[1]; } break; - + case NT_float64: { PN_float64 *pi = (PN_float64 *)pointer; @@ -1392,6 +1646,31 @@ set_data2f(unsigned char *pointer, const LVecBase2f &data) { case NT_stdfloat: nassertv(false); + break; + + case NT_int8: + { + PN_int8 *pi = (PN_int8 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + } + break; + + case NT_int16: + { + PN_int16 *pi = (PN_int16 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + } + break; + + case NT_int32: + { + PN_int32 *pi = (PN_int32 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + } + break; } break; @@ -1408,7 +1687,7 @@ set_data2f(unsigned char *pointer, const LVecBase2f &data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::set_data3f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer:: set_data3f(unsigned char *pointer, const LVecBase3f &data) { @@ -1420,16 +1699,18 @@ set_data3f(unsigned char *pointer, const LVecBase3f &data) { case 2: set_data2f(pointer, LVecBase2f(data[0], data[1])); break; - + case 3: switch (_column->get_numeric_type()) { case NT_uint8: - maybe_unscale_color_f(data); - pointer[0] = _a; - pointer[1] = _b; - pointer[2] = _c; + { + PN_uint8 *pi = (PN_uint8 *)pointer; + pi[0] = (unsigned int)data[0]; + pi[1] = (unsigned int)data[1]; + pi[2] = (unsigned int)data[2]; + } break; - + case NT_uint16: { PN_uint16 *pi = (PN_uint16 *)pointer; @@ -1438,7 +1719,7 @@ set_data3f(unsigned char *pointer, const LVecBase3f &data) { pi[2] = (unsigned int)data[2]; } break; - + case NT_uint32: { PN_uint32 *pi = (PN_uint32 *)pointer; @@ -1447,12 +1728,12 @@ set_data3f(unsigned char *pointer, const LVecBase3f &data) { pi[2] = (unsigned int)data[2]; } break; - + case NT_packed_dcba: case NT_packed_dabc: nassertv(false); break; - + case NT_float32: { PN_float32 *pi = (PN_float32 *)pointer; @@ -1461,7 +1742,7 @@ set_data3f(unsigned char *pointer, const LVecBase3f &data) { pi[2] = data[2]; } break; - + case NT_float64: { PN_float64 *pi = (PN_float64 *)pointer; @@ -1473,6 +1754,34 @@ set_data3f(unsigned char *pointer, const LVecBase3f &data) { case NT_stdfloat: nassertv(false); + break; + + case NT_int8: + { + PN_int8 *pi = (PN_int8 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + pi[2] = (int)data[2]; + } + break; + + case NT_int16: + { + PN_int16 *pi = (PN_int16 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + pi[2] = (int)data[2]; + } + break; + + case NT_int32: + { + PN_int32 *pi = (PN_int32 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + pi[2] = (int)data[2]; + } + break; } break; @@ -1485,7 +1794,7 @@ set_data3f(unsigned char *pointer, const LVecBase3f &data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::set_data4f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer:: set_data4f(unsigned char *pointer, const LVecBase4f &data) { @@ -1505,11 +1814,13 @@ set_data4f(unsigned char *pointer, const LVecBase4f &data) { default: switch (_column->get_numeric_type()) { case NT_uint8: - maybe_unscale_color_f(data); - pointer[0] = _a; - pointer[1] = _b; - pointer[2] = _c; - pointer[3] = _d; + { + PN_uint8 *pi = (PN_uint8 *)pointer; + pi[0] = (unsigned int)data[0]; + pi[1] = (unsigned int)data[1]; + pi[2] = (unsigned int)data[2]; + pi[3] = (unsigned int)data[3]; + } break; case NT_uint16: @@ -1531,17 +1842,15 @@ set_data4f(unsigned char *pointer, const LVecBase4f &data) { pi[3] = (unsigned int)data[3]; } break; - + case NT_packed_dcba: - maybe_unscale_color_f(data); - *(PN_uint32 *)pointer = GeomVertexData::pack_abcd(_d, _c, _b, _a); + *(PN_uint32 *)pointer = GeomVertexData::pack_abcd(data[3], data[2], data[1], data[0]); break; - + case NT_packed_dabc: - maybe_unscale_color_f(data); - *(PN_uint32 *)pointer = GeomVertexData::pack_abcd(_d, _a, _b, _c); + *(PN_uint32 *)pointer = GeomVertexData::pack_abcd(data[3], data[0], data[1], data[2]); break; - + case NT_float32: { PN_float32 *pi = (PN_float32 *)pointer; @@ -1551,7 +1860,7 @@ set_data4f(unsigned char *pointer, const LVecBase4f &data) { pi[3] = data[3]; } break; - + case NT_float64: { PN_float64 *pi = (PN_float64 *)pointer; @@ -1564,6 +1873,37 @@ set_data4f(unsigned char *pointer, const LVecBase4f &data) { case NT_stdfloat: nassertv(false); + break; + + case NT_int8: + { + PN_int8 *pi = (PN_int8 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + pi[2] = (int)data[2]; + pi[3] = (int)data[3]; + } + break; + + case NT_int16: + { + PN_int16 *pi = (PN_int16 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + pi[2] = (int)data[2]; + pi[3] = (int)data[3]; + } + break; + + case NT_int32: + { + PN_int32 *pi = (PN_int32 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + pi[2] = (int)data[2]; + pi[3] = (int)data[3]; + } + break; } break; } @@ -1572,7 +1912,7 @@ set_data4f(unsigned char *pointer, const LVecBase4f &data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::set_data1d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer:: set_data1d(unsigned char *pointer, double data) { @@ -1580,32 +1920,45 @@ set_data1d(unsigned char *pointer, double data) { case 1: switch (_column->get_numeric_type()) { case NT_uint8: - *pointer = maybe_unscale_color_d(data); + *(PN_uint8 *)pointer = (unsigned int)data; break; - + case NT_uint16: *(PN_uint16 *)pointer = (unsigned int)data; break; - + case NT_uint32: *(PN_uint32 *)pointer = (unsigned int)data; break; - + case NT_packed_dcba: case NT_packed_dabc: nassertv(false); break; - + case NT_float32: *(PN_float32 *)pointer = data; break; - + case NT_float64: *(PN_float64 *)pointer = data; break; case NT_stdfloat: nassertv(false); + break; + + case NT_int8: + *(PN_int8 *)pointer = (int)data; + break; + + case NT_int16: + *(PN_int16 *)pointer = (int)data; + break; + + case NT_int32: + *(PN_int32 *)pointer = (int)data; + break; } break; @@ -1626,7 +1979,7 @@ set_data1d(unsigned char *pointer, double data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::set_data2d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer:: set_data2d(unsigned char *pointer, const LVecBase2d &data) { @@ -1637,11 +1990,13 @@ set_data2d(unsigned char *pointer, const LVecBase2d &data) { case 2: switch (_column->get_numeric_type()) { case NT_uint8: - maybe_unscale_color_d(data); - pointer[0] = _a; - pointer[1] = _b; + { + PN_uint8 *pi = (PN_uint8 *)pointer; + pi[0] = (unsigned int)data[0]; + pi[1] = (unsigned int)data[1]; + } break; - + case NT_uint16: { PN_uint16 *pi = (PN_uint16 *)pointer; @@ -1649,7 +2004,7 @@ set_data2d(unsigned char *pointer, const LVecBase2d &data) { pi[1] = (unsigned int)data[1]; } break; - + case NT_uint32: { PN_uint32 *pi = (PN_uint32 *)pointer; @@ -1657,12 +2012,12 @@ set_data2d(unsigned char *pointer, const LVecBase2d &data) { pi[1] = (unsigned int)data[1]; } break; - + case NT_packed_dcba: case NT_packed_dabc: nassertv(false); break; - + case NT_float32: { PN_float32 *pi = (PN_float32 *)pointer; @@ -1670,7 +2025,7 @@ set_data2d(unsigned char *pointer, const LVecBase2d &data) { pi[1] = data[1]; } break; - + case NT_float64: { PN_float64 *pi = (PN_float64 *)pointer; @@ -1681,6 +2036,31 @@ set_data2d(unsigned char *pointer, const LVecBase2d &data) { case NT_stdfloat: nassertv(false); + break; + + case NT_int8: + { + PN_int8 *pi = (PN_int8 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + } + break; + + case NT_int16: + { + PN_int16 *pi = (PN_int16 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + } + break; + + case NT_int32: + { + PN_int32 *pi = (PN_int32 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + } + break; } break; @@ -1697,7 +2077,7 @@ set_data2d(unsigned char *pointer, const LVecBase2d &data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::set_data3d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer:: set_data3d(unsigned char *pointer, const LVecBase3d &data) { @@ -1709,16 +2089,18 @@ set_data3d(unsigned char *pointer, const LVecBase3d &data) { case 2: set_data2d(pointer, LVecBase2d(data[0], data[1])); break; - + case 3: switch (_column->get_numeric_type()) { case NT_uint8: - maybe_unscale_color_d(data); - pointer[0] = _a; - pointer[1] = _b; - pointer[2] = _c; + { + PN_uint8 *pi = (PN_uint8 *)pointer; + pi[0] = (unsigned int)data[0]; + pi[1] = (unsigned int)data[1]; + pi[2] = (unsigned int)data[2]; + } break; - + case NT_uint16: { PN_uint16 *pi = (PN_uint16 *)pointer; @@ -1727,7 +2109,7 @@ set_data3d(unsigned char *pointer, const LVecBase3d &data) { pi[2] = (unsigned int)data[2]; } break; - + case NT_uint32: { PN_uint32 *pi = (PN_uint32 *)pointer; @@ -1736,12 +2118,12 @@ set_data3d(unsigned char *pointer, const LVecBase3d &data) { pi[2] = (unsigned int)data[2]; } break; - + case NT_packed_dcba: case NT_packed_dabc: nassertv(false); break; - + case NT_float32: { PN_float32 *pi = (PN_float32 *)pointer; @@ -1750,7 +2132,7 @@ set_data3d(unsigned char *pointer, const LVecBase3d &data) { pi[2] = data[2]; } break; - + case NT_float64: { PN_float64 *pi = (PN_float64 *)pointer; @@ -1762,6 +2144,34 @@ set_data3d(unsigned char *pointer, const LVecBase3d &data) { case NT_stdfloat: nassertv(false); + break; + + case NT_int8: + { + PN_int8 *pi = (PN_int8 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + pi[2] = (int)data[2]; + } + break; + + case NT_int16: + { + PN_int16 *pi = (PN_int16 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + pi[2] = (int)data[2]; + } + break; + + case NT_int32: + { + PN_int32 *pi = (PN_int32 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + pi[2] = (int)data[2]; + } + break; } break; @@ -1774,7 +2184,7 @@ set_data3d(unsigned char *pointer, const LVecBase3d &data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::set_data4d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer:: set_data4d(unsigned char *pointer, const LVecBase4d &data) { @@ -1794,11 +2204,13 @@ set_data4d(unsigned char *pointer, const LVecBase4d &data) { default: switch (_column->get_numeric_type()) { case NT_uint8: - maybe_unscale_color_d(data); - pointer[0] = _a; - pointer[1] = _b; - pointer[2] = _c; - pointer[3] = _d; + { + PN_uint8 *pi = (PN_uint8 *)pointer; + pi[0] = (unsigned int)data[0]; + pi[1] = (unsigned int)data[1]; + pi[2] = (unsigned int)data[2]; + pi[3] = (unsigned int)data[3]; + } break; case NT_uint16: @@ -1820,17 +2232,15 @@ set_data4d(unsigned char *pointer, const LVecBase4d &data) { pi[3] = (unsigned int)data[3]; } break; - + case NT_packed_dcba: - maybe_unscale_color_d(data); - *(PN_uint32 *)pointer = GeomVertexData::pack_abcd(_d, _c, _b, _a); + *(PN_uint32 *)pointer = GeomVertexData::pack_abcd(data[3], data[2], data[1], data[0]); break; - + case NT_packed_dabc: - maybe_unscale_color_d(data); - *(PN_uint32 *)pointer = GeomVertexData::pack_abcd(_d, _a, _b, _c); + *(PN_uint32 *)pointer = GeomVertexData::pack_abcd(data[3], data[0], data[1], data[2]); break; - + case NT_float32: { PN_float32 *pi = (PN_float32 *)pointer; @@ -1840,7 +2250,7 @@ set_data4d(unsigned char *pointer, const LVecBase4d &data) { pi[3] = data[3]; } break; - + case NT_float64: { PN_float64 *pi = (PN_float64 *)pointer; @@ -1853,6 +2263,37 @@ set_data4d(unsigned char *pointer, const LVecBase4d &data) { case NT_stdfloat: nassertv(false); + break; + + case NT_int8: + { + PN_int8 *pi = (PN_int8 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + pi[2] = (int)data[2]; + pi[3] = (int)data[3]; + } + break; + + case NT_int16: + { + PN_int16 *pi = (PN_int16 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + pi[2] = (int)data[2]; + pi[3] = (int)data[3]; + } + break; + + case NT_int32: + { + PN_int32 *pi = (PN_int32 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + pi[2] = (int)data[2]; + pi[3] = (int)data[3]; + } + break; } break; } @@ -1861,7 +2302,7 @@ set_data4d(unsigned char *pointer, const LVecBase4d &data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::set_data1i // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer:: set_data1i(unsigned char *pointer, int data) { @@ -1872,31 +2313,46 @@ set_data1i(unsigned char *pointer, int data) { *pointer = data; nassertv((*pointer) == data); break; - + case NT_uint16: *(PN_uint16 *)pointer = data; nassertv(*(PN_uint16 *)pointer == data); break; - + case NT_uint32: *(PN_uint32 *)pointer = data; break; - + case NT_packed_dcba: case NT_packed_dabc: nassertv(false); break; - + case NT_float32: *(PN_float32 *)pointer = (float)data; break; - + case NT_float64: *(PN_float64 *)pointer = (double)data; break; case NT_stdfloat: nassertv(false); + break; + + case NT_int8: + *(PN_int8 *)pointer = data; + nassertv(*(PN_int8 *)pointer == data); + break; + + case NT_int16: + *(PN_int16 *)pointer = data; + nassertv(*(PN_int16 *)pointer == data); + break; + + case NT_int32: + *(PN_int32 *)pointer = data; + break; } break; @@ -1917,7 +2373,7 @@ set_data1i(unsigned char *pointer, int data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::set_data2i // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer:: set_data2i(unsigned char *pointer, const LVecBase2i &data) { @@ -1948,12 +2404,12 @@ set_data2i(unsigned char *pointer, const LVecBase2i &data) { pi[1] = data[1]; } break; - + case NT_packed_dcba: case NT_packed_dabc: nassertv(false); break; - + case NT_float32: { PN_float32 *pi = (PN_float32 *)pointer; @@ -1961,7 +2417,7 @@ set_data2i(unsigned char *pointer, const LVecBase2i &data) { pi[1] = data[1]; } break; - + case NT_float64: { PN_float64 *pi = (PN_float64 *)pointer; @@ -1972,6 +2428,31 @@ set_data2i(unsigned char *pointer, const LVecBase2i &data) { case NT_stdfloat: nassertv(false); + break; + + case NT_int8: + { + PN_int8 *pi = (PN_int8 *)pointer; + pi[0] = data[0]; + pi[1] = data[1]; + } + break; + + case NT_int16: + { + PN_int16 *pi = (PN_int16 *)pointer; + pi[0] = data[0]; + pi[1] = data[1]; + } + break; + + case NT_int32: + { + PN_int32 *pi = (PN_int32 *)pointer; + pi[0] = data[0]; + pi[1] = data[1]; + } + break; } break; @@ -1988,7 +2469,7 @@ set_data2i(unsigned char *pointer, const LVecBase2i &data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::set_data3i // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer:: set_data3i(unsigned char *pointer, const LVecBase3i &data) { @@ -2026,12 +2507,12 @@ set_data3i(unsigned char *pointer, const LVecBase3i &data) { pi[2] = data[2]; } break; - + case NT_packed_dcba: case NT_packed_dabc: nassertv(false); break; - + case NT_float32: { PN_float32 *pi = (PN_float32 *)pointer; @@ -2040,7 +2521,7 @@ set_data3i(unsigned char *pointer, const LVecBase3i &data) { pi[2] = data[2]; } break; - + case NT_float64: { PN_float64 *pi = (PN_float64 *)pointer; @@ -2052,6 +2533,34 @@ set_data3i(unsigned char *pointer, const LVecBase3i &data) { case NT_stdfloat: nassertv(false); + break; + + case NT_int8: + { + PN_int8 *pi = (PN_int8 *)pointer; + pi[0] = data[0]; + pi[1] = data[1]; + pi[2] = data[2]; + } + break; + + case NT_int16: + { + PN_int16 *pi = (PN_int16 *)pointer; + pi[0] = data[0]; + pi[1] = data[1]; + pi[2] = data[2]; + } + break; + + case NT_int32: + { + PN_int32 *pi = (PN_int32 *)pointer; + pi[0] = data[0]; + pi[1] = data[1]; + pi[2] = data[2]; + } + break; } break; @@ -2064,7 +2573,7 @@ set_data3i(unsigned char *pointer, const LVecBase3i &data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::set_data4i // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer:: set_data4i(unsigned char *pointer, const LVecBase4i &data) { @@ -2109,15 +2618,15 @@ set_data4i(unsigned char *pointer, const LVecBase4i &data) { pi[3] = data[3]; } break; - + case NT_packed_dcba: *(PN_uint32 *)pointer = GeomVertexData::pack_abcd(data[3], data[2], data[1], data[0]); break; - + case NT_packed_dabc: *(PN_uint32 *)pointer = GeomVertexData::pack_abcd(data[3], data[0], data[1], data[2]); break; - + case NT_float32: { PN_float32 *pi = (PN_float32 *)pointer; @@ -2127,7 +2636,7 @@ set_data4i(unsigned char *pointer, const LVecBase4i &data) { pi[3] = data[3]; } break; - + case NT_float64: { PN_float64 *pi = (PN_float64 *)pointer; @@ -2140,6 +2649,37 @@ set_data4i(unsigned char *pointer, const LVecBase4i &data) { case NT_stdfloat: nassertv(false); + break; + + case NT_int8: + { + PN_int8 *pi = (PN_int8 *)pointer; + pi[0] = data[0]; + pi[1] = data[1]; + pi[2] = data[2]; + pi[3] = data[3]; + } + break; + + case NT_int16: + { + PN_int16 *pi = (PN_int16 *)pointer; + pi[0] = data[0]; + pi[1] = data[1]; + pi[2] = data[2]; + pi[3] = data[3]; + } + break; + + case NT_int32: + { + PN_int32 *pi = (PN_int32 *)pointer; + pi[0] = data[0]; + pi[1] = data[1]; + pi[2] = data[2]; + pi[3] = data[3]; + } + break; } break; } @@ -2148,7 +2688,7 @@ set_data4i(unsigned char *pointer, const LVecBase4i &data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point::get_data1f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// float GeomVertexColumn::Packer_point:: get_data1f(const unsigned char *pointer) { @@ -2163,7 +2703,7 @@ get_data1f(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point::get_data2f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase2f &GeomVertexColumn::Packer_point:: get_data2f(const unsigned char *pointer) { @@ -2179,7 +2719,7 @@ get_data2f(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point::get_data3f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase3f &GeomVertexColumn::Packer_point:: get_data3f(const unsigned char *pointer) { @@ -2195,13 +2735,13 @@ get_data3f(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point::get_data4f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase4f &GeomVertexColumn::Packer_point:: get_data4f(const unsigned char *pointer) { switch (_column->get_num_values()) { case 1: - _v4.set(get_data1i(pointer), 0.0f, 0.0f, 1.0f); + _v4.set(get_data1f(pointer), 0.0f, 0.0f, 1.0f); return _v4; case 2: @@ -2221,50 +2761,53 @@ get_data4f(const unsigned char *pointer) { default: switch (_column->get_numeric_type()) { case NT_uint8: - maybe_scale_color_f(pointer[0], pointer[1], pointer[2], pointer[3]); + { + const PN_uint8 *pi = (const PN_uint8 *)pointer; + _v4.set(pi[0], pi[1], pi[2], pi[3]); + } return _v4; - + case NT_uint16: { const PN_uint16 *pi = (const PN_uint16 *)pointer; _v4.set(pi[0], pi[1], pi[2], pi[3]); } return _v4; - + case NT_uint32: { const PN_uint32 *pi = (const PN_uint32 *)pointer; _v4.set(pi[0], pi[1], pi[2], pi[3]); } return _v4; - + case NT_packed_dcba: { PN_uint32 dword = *(const PN_uint32 *)pointer; - maybe_scale_color_f(GeomVertexData::unpack_abcd_d(dword), - GeomVertexData::unpack_abcd_c(dword), - GeomVertexData::unpack_abcd_b(dword), - GeomVertexData::unpack_abcd_a(dword)); + _v4.set(GeomVertexData::unpack_abcd_d(dword), + GeomVertexData::unpack_abcd_c(dword), + GeomVertexData::unpack_abcd_b(dword), + GeomVertexData::unpack_abcd_a(dword)); } return _v4; - + case NT_packed_dabc: { PN_uint32 dword = *(const PN_uint32 *)pointer; - maybe_scale_color_f(GeomVertexData::unpack_abcd_b(dword), - GeomVertexData::unpack_abcd_c(dword), - GeomVertexData::unpack_abcd_d(dword), - GeomVertexData::unpack_abcd_a(dword)); + _v4.set(GeomVertexData::unpack_abcd_b(dword), + GeomVertexData::unpack_abcd_c(dword), + GeomVertexData::unpack_abcd_d(dword), + GeomVertexData::unpack_abcd_a(dword)); } return _v4; - + case NT_float32: { const PN_float32 *pi = (const PN_float32 *)pointer; _v4.set(pi[0], pi[1], pi[2], pi[3]); } return _v4; - + case NT_float64: { const PN_float64 *pi = (const PN_float64 *)pointer; @@ -2274,6 +2817,28 @@ get_data4f(const unsigned char *pointer) { case NT_stdfloat: nassertr(false, _v4); + break; + + case NT_int8: + { + const PN_int8 *pi = (const PN_int8 *)pointer; + _v4.set(pi[0], pi[1], pi[2], pi[3]); + } + return _v4; + + case NT_int16: + { + const PN_int16 *pi = (const PN_int16 *)pointer; + _v4.set(pi[0], pi[1], pi[2], pi[3]); + } + return _v4; + + case NT_int32: + { + const PN_int32 *pi = (const PN_int32 *)pointer; + _v4.set(pi[0], pi[1], pi[2], pi[3]); + } + return _v4; } } @@ -2283,7 +2848,7 @@ get_data4f(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point::get_data1d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// double GeomVertexColumn::Packer_point:: get_data1d(const unsigned char *pointer) { @@ -2298,7 +2863,7 @@ get_data1d(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point::get_data2d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase2d &GeomVertexColumn::Packer_point:: get_data2d(const unsigned char *pointer) { @@ -2314,7 +2879,7 @@ get_data2d(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point::get_data3d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase3d &GeomVertexColumn::Packer_point:: get_data3d(const unsigned char *pointer) { @@ -2330,13 +2895,13 @@ get_data3d(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point::get_data4d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase4d &GeomVertexColumn::Packer_point:: get_data4d(const unsigned char *pointer) { switch (_column->get_num_values()) { case 1: - _v4d.set(get_data1i(pointer), 0.0f, 0.0f, 1.0f); + _v4d.set(get_data1d(pointer), 0.0f, 0.0f, 1.0f); return _v4d; case 2: @@ -2356,50 +2921,53 @@ get_data4d(const unsigned char *pointer) { default: switch (_column->get_numeric_type()) { case NT_uint8: - maybe_scale_color_d(pointer[0], pointer[1], pointer[2], pointer[3]); + { + const PN_uint8 *pi = (const PN_uint8 *)pointer; + _v4d.set(pi[0], pi[1], pi[2], pi[3]); + } return _v4d; - + case NT_uint16: { const PN_uint16 *pi = (const PN_uint16 *)pointer; _v4d.set(pi[0], pi[1], pi[2], pi[3]); } return _v4d; - + case NT_uint32: { const PN_uint32 *pi = (const PN_uint32 *)pointer; _v4d.set(pi[0], pi[1], pi[2], pi[3]); } return _v4d; - + case NT_packed_dcba: { PN_uint32 dword = *(const PN_uint32 *)pointer; - maybe_scale_color_d(GeomVertexData::unpack_abcd_d(dword), - GeomVertexData::unpack_abcd_c(dword), - GeomVertexData::unpack_abcd_b(dword), - GeomVertexData::unpack_abcd_a(dword)); + _v4d.set(GeomVertexData::unpack_abcd_d(dword), + GeomVertexData::unpack_abcd_c(dword), + GeomVertexData::unpack_abcd_b(dword), + GeomVertexData::unpack_abcd_a(dword)); } return _v4d; - + case NT_packed_dabc: { PN_uint32 dword = *(const PN_uint32 *)pointer; - maybe_scale_color_d(GeomVertexData::unpack_abcd_b(dword), - GeomVertexData::unpack_abcd_c(dword), - GeomVertexData::unpack_abcd_d(dword), - GeomVertexData::unpack_abcd_a(dword)); + _v4d.set(GeomVertexData::unpack_abcd_b(dword), + GeomVertexData::unpack_abcd_c(dword), + GeomVertexData::unpack_abcd_d(dword), + GeomVertexData::unpack_abcd_a(dword)); } return _v4d; - + case NT_float32: { const PN_float32 *pi = (const PN_float32 *)pointer; _v4d.set(pi[0], pi[1], pi[2], pi[3]); } return _v4d; - + case NT_float64: { const PN_float64 *pi = (const PN_float64 *)pointer; @@ -2409,6 +2977,28 @@ get_data4d(const unsigned char *pointer) { case NT_stdfloat: nassertr(false, _v4d); + break; + + case NT_int8: + { + const PN_int8 *pi = (const PN_int8 *)pointer; + _v4d.set(pi[0], pi[1], pi[2], pi[3]); + } + return _v4d; + + case NT_int16: + { + const PN_int16 *pi = (const PN_int16 *)pointer; + _v4d.set(pi[0], pi[1], pi[2], pi[3]); + } + return _v4d; + + case NT_int32: + { + const PN_int32 *pi = (const PN_int32 *)pointer; + _v4d.set(pi[0], pi[1], pi[2], pi[3]); + } + return _v4d; } } @@ -2418,7 +3008,7 @@ get_data4d(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point::set_data1f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_point:: set_data1f(unsigned char *pointer, float data) { @@ -2432,7 +3022,7 @@ set_data1f(unsigned char *pointer, float data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point::set_data2f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_point:: set_data2f(unsigned char *pointer, const LVecBase2f &data) { @@ -2446,7 +3036,7 @@ set_data2f(unsigned char *pointer, const LVecBase2f &data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point::set_data3f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_point:: set_data3f(unsigned char *pointer, const LVecBase3f &data) { @@ -2460,7 +3050,7 @@ set_data3f(unsigned char *pointer, const LVecBase3f &data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point::set_data4f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_point:: set_data4f(unsigned char *pointer, const LVecBase4f &data) { @@ -2480,11 +3070,13 @@ set_data4f(unsigned char *pointer, const LVecBase4f &data) { default: switch (_column->get_numeric_type()) { case NT_uint8: - maybe_unscale_color_f(data); - pointer[0] = _a; - pointer[1] = _b; - pointer[2] = _c; - pointer[3] = _d; + { + PN_uint8 *pi = (PN_uint8 *)pointer; + pi[0] = (unsigned int)data[0]; + pi[1] = (unsigned int)data[1]; + pi[2] = (unsigned int)data[2]; + pi[3] = (unsigned int)data[3]; + } break; case NT_uint16: @@ -2506,17 +3098,15 @@ set_data4f(unsigned char *pointer, const LVecBase4f &data) { pi[3] = (unsigned int)data[3]; } break; - + case NT_packed_dcba: - maybe_unscale_color_f(data); - *(PN_uint32 *)pointer = GeomVertexData::pack_abcd(_d, _c, _b, _a); + *(PN_uint32 *)pointer = GeomVertexData::pack_abcd(data[3], data[2], data[1], data[0]); break; - + case NT_packed_dabc: - maybe_unscale_color_f(data); - *(PN_uint32 *)pointer = GeomVertexData::pack_abcd(_d, _a, _b, _c); + *(PN_uint32 *)pointer = GeomVertexData::pack_abcd(data[3], data[0], data[1], data[2]); break; - + case NT_float32: { PN_float32 *pi = (PN_float32 *)pointer; @@ -2526,7 +3116,7 @@ set_data4f(unsigned char *pointer, const LVecBase4f &data) { pi[3] = data[3]; } break; - + case NT_float64: { PN_float64 *pi = (PN_float64 *)pointer; @@ -2539,6 +3129,37 @@ set_data4f(unsigned char *pointer, const LVecBase4f &data) { case NT_stdfloat: nassertv(false); + break; + + case NT_int8: + { + PN_int8 *pi = (PN_int8 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + pi[2] = (int)data[2]; + pi[3] = (int)data[3]; + } + break; + + case NT_int16: + { + PN_int16 *pi = (PN_int16 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + pi[2] = (int)data[2]; + pi[3] = (int)data[3]; + } + break; + + case NT_int32: + { + PN_int32 *pi = (PN_int32 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + pi[2] = (int)data[2]; + pi[3] = (int)data[3]; + } + break; } break; } @@ -2547,7 +3168,7 @@ set_data4f(unsigned char *pointer, const LVecBase4f &data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point::set_data1d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_point:: set_data1d(unsigned char *pointer, double data) { @@ -2561,7 +3182,7 @@ set_data1d(unsigned char *pointer, double data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point::set_data2d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_point:: set_data2d(unsigned char *pointer, const LVecBase2d &data) { @@ -2575,7 +3196,7 @@ set_data2d(unsigned char *pointer, const LVecBase2d &data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point::set_data3d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_point:: set_data3d(unsigned char *pointer, const LVecBase3d &data) { @@ -2589,7 +3210,7 @@ set_data3d(unsigned char *pointer, const LVecBase3d &data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point::set_data4d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_point:: set_data4d(unsigned char *pointer, const LVecBase4d &data) { @@ -2609,11 +3230,13 @@ set_data4d(unsigned char *pointer, const LVecBase4d &data) { default: switch (_column->get_numeric_type()) { case NT_uint8: - maybe_unscale_color_d(data); - pointer[0] = _a; - pointer[1] = _b; - pointer[2] = _c; - pointer[3] = _d; + { + PN_uint8 *pi = (PN_uint8 *)pointer; + pi[0] = (unsigned int)data[0]; + pi[1] = (unsigned int)data[1]; + pi[2] = (unsigned int)data[2]; + pi[3] = (unsigned int)data[3]; + } break; case NT_uint16: @@ -2635,17 +3258,15 @@ set_data4d(unsigned char *pointer, const LVecBase4d &data) { pi[3] = (unsigned int)data[3]; } break; - + case NT_packed_dcba: - maybe_unscale_color_d(data); - *(PN_uint32 *)pointer = GeomVertexData::pack_abcd(_d, _c, _b, _a); + *(PN_uint32 *)pointer = GeomVertexData::pack_abcd(data[3], data[2], data[1], data[0]); break; - + case NT_packed_dabc: - maybe_unscale_color_d(data); - *(PN_uint32 *)pointer = GeomVertexData::pack_abcd(_d, _a, _b, _c); + *(PN_uint32 *)pointer = GeomVertexData::pack_abcd(data[3], data[0], data[1], data[2]); break; - + case NT_float32: { PN_float32 *pi = (PN_float32 *)pointer; @@ -2655,7 +3276,7 @@ set_data4d(unsigned char *pointer, const LVecBase4d &data) { pi[3] = data[3]; } break; - + case NT_float64: { PN_float64 *pi = (PN_float64 *)pointer; @@ -2668,84 +3289,234 @@ set_data4d(unsigned char *pointer, const LVecBase4d &data) { case NT_stdfloat: nassertv(false); + break; + + case NT_int8: + { + PN_int8 *pi = (PN_int8 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + pi[2] = (int)data[2]; + pi[3] = (int)data[3]; + } + break; + + case NT_int16: + { + PN_int16 *pi = (PN_int16 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + pi[2] = (int)data[2]; + pi[3] = (int)data[3]; + } + break; + + case NT_int32: + { + PN_int32 *pi = (PN_int32 *)pointer; + pi[0] = (int)data[0]; + pi[1] = (int)data[1]; + pi[2] = (int)data[2]; + pi[3] = (int)data[3]; + } + break; } break; } } +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_color::get_data1f +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +float GeomVertexColumn::Packer_color:: +get_data1f(const unsigned char *pointer) { + switch (_column->get_numeric_type()) { + case NT_uint8: + return (*(const PN_uint8 *)pointer) / 255.0f; + + case NT_uint16: + return (*(const PN_uint16 *)pointer) / 65535.0f; + + case NT_uint32: + return (*(const PN_uint32 *)pointer) / 4294967295.0f; + + case NT_packed_dcba: + { + PN_uint32 dword = *(const PN_uint32 *)pointer; + return GeomVertexData::unpack_abcd_d(dword) / 255.0f; + } + + case NT_packed_dabc: + { + PN_uint32 dword = *(const PN_uint32 *)pointer; + return GeomVertexData::unpack_abcd_b(dword) / 255.0f; + } + + case NT_float32: + return *(const PN_float32 *)pointer; + + case NT_float64: + return *(const PN_float64 *)pointer; + + default: + nassertr(false, 0.0f); + } + + return 0.0f; +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_color::get_data2f +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +const LVecBase2f &GeomVertexColumn::Packer_color:: +get_data2f(const unsigned char *pointer) { + if (_column->get_num_values() == 3) { + const LVecBase3f &v3 = get_data3f(pointer); + _v2.set(v3[0], v3[1]); + return _v2; + } else { + const LVecBase4f &v4 = get_data4f(pointer); + _v2.set(v4[0], v4[1]); + return _v2; + } +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_color::get_data3f +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +const LVecBase3f &GeomVertexColumn::Packer_color:: +get_data3f(const unsigned char *pointer) { + if (_column->get_num_values() == 3) { + switch (_column->get_numeric_type()) { + case NT_uint8: + { + const PN_uint8 *pi = (const PN_uint8 *)pointer; + _v3.set(pi[0], pi[1], pi[2]); + _v3 /= 255.0f; + } + return _v3; + + case NT_uint16: + { + const PN_uint16 *pi = (const PN_uint16 *)pointer; + _v3.set(pi[0], pi[1], pi[2]); + _v3 /= 65535.0f; + } + return _v3; + + case NT_uint32: + { + const PN_uint32 *pi = (const PN_uint32 *)pointer; + _v3.set(pi[0], pi[1], pi[2]); + _v3 /= 4294967295.0f; + } + return _v3; + + case NT_packed_dcba: + case NT_packed_dabc: + nassertr(false, _v3); + return _v3; + + case NT_float32: + { + const PN_float32 *pi = (const PN_float32 *)pointer; + _v3.set(pi[0], pi[1], pi[2]); + } + return _v3; + + case NT_float64: + { + const PN_float64 *pi = (const PN_float64 *)pointer; + _v3.set(pi[0], pi[1], pi[2]); + } + return _v3; + + case NT_stdfloat: + case NT_int8: + case NT_int16: + case NT_int32: + nassertr(false, _v3); + return _v3; + } + } else { + const LVecBase4f &v4 = get_data4f(pointer); + _v3.set(v4[0], v4[1], v4[2]); + return _v3; + } +} + //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_color::get_data4f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase4f &GeomVertexColumn::Packer_color:: get_data4f(const unsigned char *pointer) { - switch (_column->get_num_values()) { - case 1: - _v4.set(get_data1i(pointer), 0.0f, 0.0f, 1.0f); + if (_column->get_num_values() == 3) { + const LVecBase3f &v3 = get_data3f(pointer); + _v4.set(v3[0], v3[1], v3[2], 1.0f); return _v4; - - case 2: - { - const LVecBase2f &v2 = get_data2f(pointer); - _v4.set(v2[0], v2[1], 0.0f, 1.0f); - } - return _v4; - - case 3: - { - const LVecBase3f &v3 = get_data3f(pointer); - _v4.set(v3[0], v3[1], v3[2], 1.0f); - } - return _v4; - - default: + } else { switch (_column->get_numeric_type()) { case NT_uint8: - maybe_scale_color_f(pointer[0], pointer[1], pointer[2], pointer[3]); + { + const PN_uint8 *pi = (const PN_uint8 *)pointer; + _v4.set(pi[0], pi[1], pi[2], pi[3]); + _v4 /= 255.0f; + } return _v4; - + case NT_uint16: { const PN_uint16 *pi = (const PN_uint16 *)pointer; _v4.set(pi[0], pi[1], pi[2], pi[3]); + _v4 /= 65535.0f; } return _v4; - + case NT_uint32: { const PN_uint32 *pi = (const PN_uint32 *)pointer; _v4.set(pi[0], pi[1], pi[2], pi[3]); + _v4 /= 4294967295.0f; } return _v4; - + case NT_packed_dcba: { PN_uint32 dword = *(const PN_uint32 *)pointer; - maybe_scale_color_f(GeomVertexData::unpack_abcd_d(dword), - GeomVertexData::unpack_abcd_c(dword), - GeomVertexData::unpack_abcd_b(dword), - GeomVertexData::unpack_abcd_a(dword)); + _v4.set(GeomVertexData::unpack_abcd_d(dword), + GeomVertexData::unpack_abcd_c(dword), + GeomVertexData::unpack_abcd_b(dword), + GeomVertexData::unpack_abcd_a(dword)); + _v4 /= 255.0f; } return _v4; - + case NT_packed_dabc: { PN_uint32 dword = *(const PN_uint32 *)pointer; - maybe_scale_color_f(GeomVertexData::unpack_abcd_b(dword), - GeomVertexData::unpack_abcd_c(dword), - GeomVertexData::unpack_abcd_d(dword), - GeomVertexData::unpack_abcd_a(dword)); + _v4.set(GeomVertexData::unpack_abcd_b(dword), + GeomVertexData::unpack_abcd_c(dword), + GeomVertexData::unpack_abcd_d(dword), + GeomVertexData::unpack_abcd_a(dword)); + _v4 /= 255.0f; } return _v4; - + case NT_float32: { const PN_float32 *pi = (const PN_float32 *)pointer; _v4.set(pi[0], pi[1], pi[2], pi[3]); } return _v4; - + case NT_float64: { const PN_float64 *pi = (const PN_float64 *)pointer; @@ -2754,86 +3525,207 @@ get_data4f(const unsigned char *pointer) { return _v4; case NT_stdfloat: + case NT_int8: + case NT_int16: + case NT_int32: nassertr(false, _v4); + return _v4; } } +} - return _v4; +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_color::get_data1d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +double GeomVertexColumn::Packer_color:: +get_data1d(const unsigned char *pointer) { + switch (_column->get_numeric_type()) { + case NT_uint8: + return (*(const PN_uint8 *)pointer) / 255.0; + + case NT_uint16: + return (*(const PN_uint16 *)pointer) / 65535.0; + + case NT_uint32: + return (*(const PN_uint32 *)pointer) / 4294967295.0; + + case NT_packed_dcba: + { + PN_uint32 dword = *(const PN_uint32 *)pointer; + return GeomVertexData::unpack_abcd_d(dword) / 255.0; + } + + case NT_packed_dabc: + { + PN_uint32 dword = *(const PN_uint32 *)pointer; + return GeomVertexData::unpack_abcd_b(dword) / 255.0; + } + + case NT_float32: + return *(const PN_float32 *)pointer; + + case NT_float64: + return *(const PN_float64 *)pointer; + + default: + nassertr(false, 0.0); + } + + return 0.0; +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_color::get_data2d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +const LVecBase2d &GeomVertexColumn::Packer_color:: +get_data2d(const unsigned char *pointer) { + if (_column->get_num_values() == 3) { + const LVecBase3d &v3 = get_data3d(pointer); + _v2d.set(v3[0], v3[1]); + return _v2d; + } else { + const LVecBase4d &v4 = get_data4d(pointer); + _v2d.set(v4[0], v4[1]); + return _v2d; + } +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_color::get_data3d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +const LVecBase3d &GeomVertexColumn::Packer_color:: +get_data3d(const unsigned char *pointer) { + if (_column->get_num_values() == 3) { + switch (_column->get_numeric_type()) { + case NT_uint8: + { + const PN_uint8 *pi = (const PN_uint8 *)pointer; + _v3d.set(pi[0], pi[1], pi[2]); + _v3d /= 255.0; + } + return _v3d; + + case NT_uint16: + { + const PN_uint16 *pi = (const PN_uint16 *)pointer; + _v3d.set(pi[0], pi[1], pi[2]); + _v3d /= 65535.0; + } + return _v3d; + + case NT_uint32: + { + const PN_uint32 *pi = (const PN_uint32 *)pointer; + _v3d.set(pi[0], pi[1], pi[2]); + _v3d /= 4294967295.0; + } + return _v3d; + + case NT_packed_dcba: + case NT_packed_dabc: + nassertr(false, _v3d); + return _v3d; + + case NT_float32: + { + const PN_float32 *pi = (const PN_float32 *)pointer; + _v3d.set(pi[0], pi[1], pi[2]); + } + return _v3d; + + case NT_float64: + { + const PN_float64 *pi = (const PN_float64 *)pointer; + _v3d.set(pi[0], pi[1], pi[2]); + } + return _v3d; + + case NT_stdfloat: + case NT_int8: + case NT_int16: + case NT_int32: + nassertr(false, _v3d); + return _v3d; + } + } else { + const LVecBase4d &v4 = get_data4d(pointer); + _v3d.set(v4[0], v4[1], v4[2]); + return _v3d; + } } //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_color::get_data4d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase4d &GeomVertexColumn::Packer_color:: get_data4d(const unsigned char *pointer) { - switch (_column->get_num_values()) { - case 1: - _v4d.set(get_data1i(pointer), 0.0f, 0.0f, 1.0f); + if (_column->get_num_values() == 3) { + const LVecBase3d &v3 = get_data3d(pointer); + _v4d.set(v3[0], v3[1], v3[2], 1.0); return _v4d; - - case 2: - { - const LVecBase2f &v2 = get_data2f(pointer); - _v4d.set(v2[0], v2[1], 0.0f, 1.0f); - } - return _v4d; - - case 3: - { - const LVecBase3f &v3 = get_data3f(pointer); - _v4d.set(v3[0], v3[1], v3[2], 1.0f); - } - return _v4d; - - default: + } else { switch (_column->get_numeric_type()) { case NT_uint8: - maybe_scale_color_d(pointer[0], pointer[1], pointer[2], pointer[3]); + { + const PN_uint8 *pi = (const PN_uint8 *)pointer; + _v4d.set(pi[0], pi[1], pi[2], pi[3]); + _v4d /= 255.0; + } return _v4d; - + case NT_uint16: { const PN_uint16 *pi = (const PN_uint16 *)pointer; _v4d.set(pi[0], pi[1], pi[2], pi[3]); + _v4d /= 65535.0; } return _v4d; - + case NT_uint32: { const PN_uint32 *pi = (const PN_uint32 *)pointer; _v4d.set(pi[0], pi[1], pi[2], pi[3]); + _v4d /= 4294967295.0; } return _v4d; - + case NT_packed_dcba: { PN_uint32 dword = *(const PN_uint32 *)pointer; - maybe_scale_color_d(GeomVertexData::unpack_abcd_d(dword), - GeomVertexData::unpack_abcd_c(dword), - GeomVertexData::unpack_abcd_b(dword), - GeomVertexData::unpack_abcd_a(dword)); + _v4d.set(GeomVertexData::unpack_abcd_d(dword), + GeomVertexData::unpack_abcd_c(dword), + GeomVertexData::unpack_abcd_b(dword), + GeomVertexData::unpack_abcd_a(dword)); + _v4d /= 255.0; } return _v4d; - + case NT_packed_dabc: { PN_uint32 dword = *(const PN_uint32 *)pointer; - maybe_scale_color_d(GeomVertexData::unpack_abcd_b(dword), - GeomVertexData::unpack_abcd_c(dword), - GeomVertexData::unpack_abcd_d(dword), - GeomVertexData::unpack_abcd_a(dword)); + _v4d.set(GeomVertexData::unpack_abcd_b(dword), + GeomVertexData::unpack_abcd_c(dword), + GeomVertexData::unpack_abcd_d(dword), + GeomVertexData::unpack_abcd_a(dword)); + _v4d /= 255.0; } return _v4d; - + case NT_float32: { const PN_float32 *pi = (const PN_float32 *)pointer; _v4d.set(pi[0], pi[1], pi[2], pi[3]); } return _v4d; - + case NT_float64: { const PN_float64 *pi = (const PN_float64 *)pointer; @@ -2842,101 +3734,425 @@ get_data4d(const unsigned char *pointer) { return _v4d; case NT_stdfloat: + case NT_int8: + case NT_int16: + case NT_int32: nassertr(false, _v4d); + return _v4d; } } - - return _v4d; } //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_color::set_data1f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_color:: set_data1f(unsigned char *pointer, float data) { - if (_column->get_num_values() == 4) { - set_data4f(pointer, LVecBase4f(data, 0.0f, 0.0f, 1.0f)); + if (_column->get_num_values() == 3) { + set_data3f(pointer, LVecBase3f(data, 0.0f, 0.0f)); } else { - Packer::set_data1f(pointer, data); + set_data4f(pointer, LVecBase4f(data, 0.0f, 0.0f, 1.0f)); } } //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_color::set_data2f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_color:: set_data2f(unsigned char *pointer, const LVecBase2f &data) { - if (_column->get_num_values() == 4) { - set_data4f(pointer, LVecBase4f(data[0], data[1], 0.0f, 1.0f)); + if (_column->get_num_values() == 3) { + set_data3f(pointer, LVecBase3f(data[0], data[1], 0.0f)); } else { - Packer::set_data2f(pointer, data); + set_data4f(pointer, LVecBase4f(data[0], data[1], 0.0f, 1.0f)); } } //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_color::set_data3f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_color:: set_data3f(unsigned char *pointer, const LVecBase3f &data) { - if (_column->get_num_values() == 4) { - set_data4f(pointer, LVecBase4f(data[0], data[1], data[2], 1.0f)); + if (_column->get_num_values() == 3) { + switch (_column->get_numeric_type()) { + case NT_uint8: + { + LVecBase3f scaled = data * 255.0f; + PN_uint8 *pi = (PN_uint8 *)pointer; + pi[0] = (unsigned int)scaled[0]; + pi[1] = (unsigned int)scaled[1]; + pi[2] = (unsigned int)scaled[2]; + } + break; + + case NT_uint16: + { + LVecBase3f scaled = data * 65535.0f; + PN_uint16 *pi = (PN_uint16 *)pointer; + pi[0] = (unsigned int)scaled[0]; + pi[1] = (unsigned int)scaled[1]; + pi[2] = (unsigned int)scaled[2]; + } + break; + + case NT_uint32: + { + LVecBase3f scaled = data * 4294967295.0f; + PN_uint32 *pi = (PN_uint32 *)pointer; + pi[0] = (unsigned int)data[0]; + pi[1] = (unsigned int)data[1]; + pi[2] = (unsigned int)data[2]; + } + break; + + case NT_packed_dcba: + { + LVecBase3f scaled = data * 255.0f; + *(PN_uint32 *)pointer = GeomVertexData::pack_abcd( + 1.0f, scaled[2], scaled[1], scaled[0]); + } + break; + + case NT_packed_dabc: + { + LVecBase3f scaled = data * 255.0f; + *(PN_uint32 *)pointer = GeomVertexData::pack_abcd( + 1.0f, scaled[0], scaled[1], scaled[2]); + } + break; + + case NT_float32: + { + PN_float32 *pi = (PN_float32 *)pointer; + pi[0] = data[0]; + pi[1] = data[1]; + pi[2] = data[2]; + } + break; + + case NT_float64: + { + PN_float64 *pi = (PN_float64 *)pointer; + pi[0] = data[0]; + pi[1] = data[1]; + pi[2] = data[2]; + } + break; + + case NT_stdfloat: + case NT_int8: + case NT_int16: + case NT_int32: + nassertv(false); + break; + } } else { - Packer::set_data3f(pointer, data); + set_data4f(pointer, LVecBase4f(data[0], data[1], data[2], 1.0f)); + } +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_color::set_data4f +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +void GeomVertexColumn::Packer_color:: +set_data4f(unsigned char *pointer, const LVecBase4f &data) { + if (_column->get_num_values() == 3) { + set_data3f(pointer, LVecBase3f(data[0], data[1], data[2])); + } else { + switch (_column->get_numeric_type()) { + case NT_uint8: + { + LVecBase4f scaled = data * 255.0f; + PN_uint8 *pi = (PN_uint8 *)pointer; + pi[0] = (unsigned int)scaled[0]; + pi[1] = (unsigned int)scaled[1]; + pi[2] = (unsigned int)scaled[2]; + pi[3] = (unsigned int)scaled[3]; + } + break; + + case NT_uint16: + { + LVecBase4f scaled = data * 65535.0f; + PN_uint16 *pi = (PN_uint16 *)pointer; + pi[0] = (unsigned int)scaled[0]; + pi[1] = (unsigned int)scaled[1]; + pi[2] = (unsigned int)scaled[2]; + pi[3] = (unsigned int)scaled[3]; + } + break; + + case NT_uint32: + { + LVecBase4f scaled = data * 4294967295.0f; + PN_uint32 *pi = (PN_uint32 *)pointer; + pi[0] = (unsigned int)data[0]; + pi[1] = (unsigned int)data[1]; + pi[2] = (unsigned int)data[2]; + pi[3] = (unsigned int)data[3]; + } + break; + + case NT_packed_dcba: + { + LVecBase4f scaled = data * 255.0f; + *(PN_uint32 *)pointer = GeomVertexData::pack_abcd( + scaled[3], scaled[2], scaled[1], scaled[0]); + } + break; + + case NT_packed_dabc: + { + LVecBase4f scaled = data * 255.0f; + *(PN_uint32 *)pointer = GeomVertexData::pack_abcd( + scaled[3], scaled[0], scaled[1], scaled[2]); + } + break; + + case NT_float32: + { + PN_float32 *pi = (PN_float32 *)pointer; + pi[0] = data[0]; + pi[1] = data[1]; + pi[2] = data[2]; + pi[3] = data[3]; + } + break; + + case NT_float64: + { + PN_float64 *pi = (PN_float64 *)pointer; + pi[0] = data[0]; + pi[1] = data[1]; + pi[2] = data[2]; + pi[3] = data[3]; + } + break; + + case NT_stdfloat: + case NT_int8: + case NT_int16: + case NT_int32: + nassertv(false); + break; + } } } //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_color::set_data1d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_color:: set_data1d(unsigned char *pointer, double data) { - if (_column->get_num_values() == 4) { - set_data4d(pointer, LVecBase4d(data, 0.0f, 0.0f, 1.0f)); + if (_column->get_num_values() == 3) { + set_data3d(pointer, LVecBase3d(data, 0.0, 0.0)); } else { - Packer::set_data1d(pointer, data); + set_data4d(pointer, LVecBase4d(data, 0.0, 0.0, 1.0)); } } //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_color::set_data2d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_color:: set_data2d(unsigned char *pointer, const LVecBase2d &data) { - if (_column->get_num_values() == 4) { - set_data4d(pointer, LVecBase4d(data[0], data[1], 0.0f, 1.0f)); + if (_column->get_num_values() == 3) { + set_data3d(pointer, LVecBase3d(data[0], data[1], 0.0)); } else { - Packer::set_data2d(pointer, data); + set_data4d(pointer, LVecBase4d(data[0], data[1], 0.0, 1.0)); } } //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_color::set_data3d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_color:: set_data3d(unsigned char *pointer, const LVecBase3d &data) { - if (_column->get_num_values() == 4) { - set_data4d(pointer, LVecBase4d(data[0], data[1], data[2], 1.0f)); + if (_column->get_num_values() == 3) { + switch (_column->get_numeric_type()) { + case NT_uint8: + { + LVecBase3d scaled = data * 255.0; + PN_uint8 *pi = (PN_uint8 *)pointer; + pi[0] = (unsigned int)scaled[0]; + pi[1] = (unsigned int)scaled[1]; + pi[2] = (unsigned int)scaled[2]; + } + break; + + case NT_uint16: + { + LVecBase3d scaled = data * 65535.0; + PN_uint16 *pi = (PN_uint16 *)pointer; + pi[0] = (unsigned int)scaled[0]; + pi[1] = (unsigned int)scaled[1]; + pi[2] = (unsigned int)scaled[2]; + } + break; + + case NT_uint32: + { + LVecBase3d scaled = data * 4294967295.0; + PN_uint32 *pi = (PN_uint32 *)pointer; + pi[0] = (unsigned int)data[0]; + pi[1] = (unsigned int)data[1]; + pi[2] = (unsigned int)data[2]; + } + break; + + case NT_packed_dcba: + { + LVecBase3d scaled = data * 255.0; + *(PN_uint32 *)pointer = GeomVertexData::pack_abcd( + 1.0, scaled[2], scaled[1], scaled[0]); + } + break; + + case NT_packed_dabc: + { + LVecBase3d scaled = data * 255.0; + *(PN_uint32 *)pointer = GeomVertexData::pack_abcd( + 1.0, scaled[0], scaled[1], scaled[2]); + } + break; + + case NT_float32: + { + PN_float32 *pi = (PN_float32 *)pointer; + pi[0] = data[0]; + pi[1] = data[1]; + pi[2] = data[2]; + } + break; + + case NT_float64: + { + PN_float64 *pi = (PN_float64 *)pointer; + pi[0] = data[0]; + pi[1] = data[1]; + pi[2] = data[2]; + } + break; + + case NT_stdfloat: + case NT_int8: + case NT_int16: + case NT_int32: + nassertv(false); + break; + } } else { - Packer::set_data3d(pointer, data); + set_data4d(pointer, LVecBase4d(data[0], data[1], data[2], 1.0f)); + } +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_color::set_data4d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +void GeomVertexColumn::Packer_color:: +set_data4d(unsigned char *pointer, const LVecBase4d &data) { + if (_column->get_num_values() == 3) { + set_data3d(pointer, LVecBase3d(data[0], data[1], data[2])); + } else { + switch (_column->get_numeric_type()) { + case NT_uint8: + { + LVecBase4d scaled = data * 255.0; + PN_uint8 *pi = (PN_uint8 *)pointer; + pi[0] = (unsigned int)scaled[0]; + pi[1] = (unsigned int)scaled[1]; + pi[2] = (unsigned int)scaled[2]; + pi[3] = (unsigned int)scaled[3]; + } + break; + + case NT_uint16: + { + LVecBase4d scaled = data * 65535.0; + PN_uint16 *pi = (PN_uint16 *)pointer; + pi[0] = (unsigned int)scaled[0]; + pi[1] = (unsigned int)scaled[1]; + pi[2] = (unsigned int)scaled[2]; + pi[3] = (unsigned int)scaled[3]; + } + break; + + case NT_uint32: + { + LVecBase4d scaled = data * 4294967295.0; + PN_uint32 *pi = (PN_uint32 *)pointer; + pi[0] = (unsigned int)data[0]; + pi[1] = (unsigned int)data[1]; + pi[2] = (unsigned int)data[2]; + pi[3] = (unsigned int)data[3]; + } + break; + + case NT_packed_dcba: + { + LVecBase4d scaled = data * 255.0; + *(PN_uint32 *)pointer = GeomVertexData::pack_abcd( + scaled[3], scaled[2], scaled[1], scaled[0]); + } + break; + + case NT_packed_dabc: + { + LVecBase4d scaled = data * 255.0; + *(PN_uint32 *)pointer = GeomVertexData::pack_abcd( + scaled[3], scaled[0], scaled[1], scaled[2]); + } + break; + + case NT_float32: + { + PN_float32 *pi = (PN_float32 *)pointer; + pi[0] = data[0]; + pi[1] = data[1]; + pi[2] = data[2]; + pi[3] = data[3]; + } + break; + + case NT_float64: + { + PN_float64 *pi = (PN_float64 *)pointer; + pi[0] = data[0]; + pi[1] = data[1]; + pi[2] = data[2]; + pi[3] = data[3]; + } + break; + + case NT_stdfloat: + case NT_int8: + case NT_int16: + case NT_int32: + nassertv(false); + break; + } } } //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_float32_3::get_data3f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase3f &GeomVertexColumn::Packer_float32_3:: get_data3f(const unsigned char *pointer) { @@ -2948,7 +4164,7 @@ get_data3f(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_float32_3::set_data3f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_float32_3:: set_data3f(unsigned char *pointer, const LVecBase3f &data) { @@ -2961,7 +4177,7 @@ set_data3f(unsigned char *pointer, const LVecBase3f &data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point_float32_2::get_data2f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase2f &GeomVertexColumn::Packer_point_float32_2:: get_data2f(const unsigned char *pointer) { @@ -2973,7 +4189,7 @@ get_data2f(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point_float32_2::set_data2f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_point_float32_2:: set_data2f(unsigned char *pointer, const LVecBase2f &data) { @@ -2985,7 +4201,7 @@ set_data2f(unsigned char *pointer, const LVecBase2f &data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point_float32_3::get_data3f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase3f &GeomVertexColumn::Packer_point_float32_3:: get_data3f(const unsigned char *pointer) { @@ -2997,7 +4213,7 @@ get_data3f(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point_float32_3::set_data3f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_point_float32_3:: set_data3f(unsigned char *pointer, const LVecBase3f &data) { @@ -3010,7 +4226,7 @@ set_data3f(unsigned char *pointer, const LVecBase3f &data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point_float32_4::get_data4f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase4f &GeomVertexColumn::Packer_point_float32_4:: get_data4f(const unsigned char *pointer) { @@ -3022,7 +4238,7 @@ get_data4f(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point_float32_4::set_data4f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_point_float32_4:: set_data4f(unsigned char *pointer, const LVecBase4f &data) { @@ -3036,7 +4252,7 @@ set_data4f(unsigned char *pointer, const LVecBase4f &data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_nativefloat_3::get_data3f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase3f &GeomVertexColumn::Packer_nativefloat_3:: get_data3f(const unsigned char *pointer) { @@ -3046,7 +4262,7 @@ get_data3f(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point_nativefloat_2::get_data2f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase2f &GeomVertexColumn::Packer_point_nativefloat_2:: get_data2f(const unsigned char *pointer) { @@ -3056,7 +4272,7 @@ get_data2f(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point_nativefloat_3::get_data3f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase3f &GeomVertexColumn::Packer_point_nativefloat_3:: get_data3f(const unsigned char *pointer) { @@ -3066,7 +4282,7 @@ get_data3f(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point_nativefloat_4::get_data4f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase4f &GeomVertexColumn::Packer_point_nativefloat_4:: get_data4f(const unsigned char *pointer) { @@ -3076,7 +4292,7 @@ get_data4f(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_float64_3::get_data3d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase3d &GeomVertexColumn::Packer_float64_3:: get_data3d(const unsigned char *pointer) { @@ -3088,7 +4304,7 @@ get_data3d(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_float64_3::set_data3d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_float64_3:: set_data3d(unsigned char *pointer, const LVecBase3d &data) { @@ -3101,7 +4317,7 @@ set_data3d(unsigned char *pointer, const LVecBase3d &data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point_float64_2::get_data2d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase2d &GeomVertexColumn::Packer_point_float64_2:: get_data2d(const unsigned char *pointer) { @@ -3113,7 +4329,7 @@ get_data2d(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point_float64_2::set_data2d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_point_float64_2:: set_data2d(unsigned char *pointer, const LVecBase2d &data) { @@ -3125,7 +4341,7 @@ set_data2d(unsigned char *pointer, const LVecBase2d &data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point_float64_3::get_data3d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase3d &GeomVertexColumn::Packer_point_float64_3:: get_data3d(const unsigned char *pointer) { @@ -3137,7 +4353,7 @@ get_data3d(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point_float64_3::set_data3d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_point_float64_3:: set_data3d(unsigned char *pointer, const LVecBase3d &data) { @@ -3150,7 +4366,7 @@ set_data3d(unsigned char *pointer, const LVecBase3d &data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point_float64_4::get_data4d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase4d &GeomVertexColumn::Packer_point_float64_4:: get_data4d(const unsigned char *pointer) { @@ -3162,7 +4378,7 @@ get_data4d(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point_float64_4::set_data4d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_point_float64_4:: set_data4d(unsigned char *pointer, const LVecBase4d &data) { @@ -3176,7 +4392,7 @@ set_data4d(unsigned char *pointer, const LVecBase4d &data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_nativedouble_3::get_data3d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase3d &GeomVertexColumn::Packer_nativedouble_3:: get_data3d(const unsigned char *pointer) { @@ -3186,7 +4402,7 @@ get_data3d(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point_nativedouble_2::get_data2d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase2d &GeomVertexColumn::Packer_point_nativedouble_2:: get_data2d(const unsigned char *pointer) { @@ -3196,7 +4412,7 @@ get_data2d(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point_nativedouble_3::get_data3d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase3d &GeomVertexColumn::Packer_point_nativedouble_3:: get_data3d(const unsigned char *pointer) { @@ -3206,7 +4422,7 @@ get_data3d(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point_nativedouble_4::get_data4d // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase4d &GeomVertexColumn::Packer_point_nativedouble_4:: get_data4d(const unsigned char *pointer) { @@ -3216,73 +4432,66 @@ get_data4d(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_argb_packed::get_data4f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase4f &GeomVertexColumn::Packer_argb_packed:: get_data4f(const unsigned char *pointer) { PN_uint32 dword = *(const PN_uint32 *)pointer; - _v4.set((float)GeomVertexData::unpack_abcd_b(dword) / 255.0f, - (float)GeomVertexData::unpack_abcd_c(dword) / 255.0f, - (float)GeomVertexData::unpack_abcd_d(dword) / 255.0f, - (float)GeomVertexData::unpack_abcd_a(dword) / 255.0f); + _v4.set(GeomVertexData::unpack_abcd_b(dword), + GeomVertexData::unpack_abcd_c(dword), + GeomVertexData::unpack_abcd_d(dword), + GeomVertexData::unpack_abcd_a(dword)); + _v4 /= 255.0f; return _v4; } //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_argb_packed::set_data4f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_argb_packed:: set_data4f(unsigned char *pointer, const LVecBase4f &data) { // when packing an argb, we want to make sure we cap // the input values at 1 since going above one will cause // the value to be truncated. - float newData[4]; - for (int i = 0; i < 4; i++) { - if (data[i] > 1.0) - newData[i] = 1.0; - else - newData[i] = data[i]; - } *(PN_uint32 *)pointer = GeomVertexData::pack_abcd - ((unsigned int)(newData[3] * 255.0f), - (unsigned int)(newData[0] * 255.0f), - (unsigned int)(newData[1] * 255.0f), - (unsigned int)(newData[2] * 255.0f)); + ((unsigned int)(min(max(data[3], 0.0f), 1.0f) * 255.0f), + (unsigned int)(min(max(data[0], 0.0f), 1.0f) * 255.0f), + (unsigned int)(min(max(data[1], 0.0f), 1.0f) * 255.0f), + (unsigned int)(min(max(data[2], 0.0f), 1.0f) * 255.0f)); } //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_rgba_uint8_4::get_data4f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase4f &GeomVertexColumn::Packer_rgba_uint8_4:: get_data4f(const unsigned char *pointer) { - _v4.set((float)pointer[0] / 255.0f, - (float)pointer[1] / 255.0f, - (float)pointer[2] / 255.0f, - (float)pointer[3] / 255.0f); + _v4.set((float)pointer[0], (float)pointer[1], + (float)pointer[2], (float)pointer[3]); + _v4 /= 255.0f; return _v4; } //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_rgba_uint8_4::set_data4f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_rgba_uint8_4:: set_data4f(unsigned char *pointer, const LVecBase4f &data) { - pointer[0] = (unsigned int)(data[0] * 255.0f); - pointer[1] = (unsigned int)(data[1] * 255.0f); - pointer[2] = (unsigned int)(data[2] * 255.0f); - pointer[3] = (unsigned int)(data[3] * 255.0f); + pointer[0] = (unsigned int)(min(max(data[0], 0.0f), 1.0f) * 255.0f); + pointer[1] = (unsigned int)(min(max(data[1], 0.0f), 1.0f) * 255.0f); + pointer[2] = (unsigned int)(min(max(data[2], 0.0f), 1.0f) * 255.0f); + pointer[3] = (unsigned int)(min(max(data[3], 0.0f), 1.0f) * 255.0f); } //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_rgba_float32_4::get_data4f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase4f &GeomVertexColumn::Packer_rgba_float32_4:: get_data4f(const unsigned char *pointer) { @@ -3294,7 +4503,7 @@ get_data4f(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_rgba_float32_4::set_data4f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_rgba_float32_4:: set_data4f(unsigned char *pointer, const LVecBase4f &data) { @@ -3308,7 +4517,7 @@ set_data4f(unsigned char *pointer, const LVecBase4f &data) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_rgba_nativefloat_4::get_data4f // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// const LVecBase4f &GeomVertexColumn::Packer_rgba_nativefloat_4:: get_data4f(const unsigned char *pointer) { @@ -3318,7 +4527,7 @@ get_data4f(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_uint16_1::get_data1i // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// int GeomVertexColumn::Packer_uint16_1:: get_data1i(const unsigned char *pointer) { @@ -3328,7 +4537,7 @@ get_data1i(const unsigned char *pointer) { //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_uint16_1::set_data1i // Access: Public, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// void GeomVertexColumn::Packer_uint16_1:: set_data1i(unsigned char *pointer, int data) { diff --git a/panda/src/gobj/geomVertexColumn.h b/panda/src/gobj/geomVertexColumn.h index ab3ddf9f4f..8629c786d5 100644 --- a/panda/src/gobj/geomVertexColumn.h +++ b/panda/src/gobj/geomVertexColumn.h @@ -150,30 +150,6 @@ private: return "Packer"; } - INLINE float maybe_scale_color_f(unsigned int value); - INLINE void maybe_scale_color_f(unsigned int a, unsigned int b); - INLINE void maybe_scale_color_f(unsigned int a, unsigned int b, - unsigned int c); - INLINE void maybe_scale_color_f(unsigned int a, unsigned int b, - unsigned int c, unsigned int d); - - INLINE unsigned int maybe_unscale_color_f(float data); - INLINE void maybe_unscale_color_f(const LVecBase2f &data); - INLINE void maybe_unscale_color_f(const LVecBase3f &data); - INLINE void maybe_unscale_color_f(const LVecBase4f &data); - - INLINE double maybe_scale_color_d(unsigned int value); - INLINE void maybe_scale_color_d(unsigned int a, unsigned int b); - INLINE void maybe_scale_color_d(unsigned int a, unsigned int b, - unsigned int c); - INLINE void maybe_scale_color_d(unsigned int a, unsigned int b, - unsigned int c, unsigned int d); - - INLINE unsigned int maybe_unscale_color_d(double data); - INLINE void maybe_unscale_color_d(const LVecBase2d &data); - INLINE void maybe_unscale_color_d(const LVecBase3d &data); - INLINE void maybe_unscale_color_d(const LVecBase4d &data); - const GeomVertexColumn *_column; LVecBase2f _v2; LVecBase3f _v3; @@ -191,7 +167,7 @@ private: // This is a specialization on the generic Packer that handles // points, which are special because the fourth component, if not // present in the data, is implicitly 1.0; and if it is present, - // than any three-component or smaller return is implicitly divided + // then any three-component or smaller return is implicitly divided // by the fourth component. class Packer_point : public Packer { public: @@ -199,14 +175,17 @@ private: virtual const LVecBase2f &get_data2f(const unsigned char *pointer); virtual const LVecBase3f &get_data3f(const unsigned char *pointer); virtual const LVecBase4f &get_data4f(const unsigned char *pointer); + virtual double get_data1d(const unsigned char *pointer); virtual const LVecBase2d &get_data2d(const unsigned char *pointer); virtual const LVecBase3d &get_data3d(const unsigned char *pointer); virtual const LVecBase4d &get_data4d(const unsigned char *pointer); + virtual void set_data1f(unsigned char *pointer, float data); virtual void set_data2f(unsigned char *pointer, const LVecBase2f &data); virtual void set_data3f(unsigned char *pointer, const LVecBase3f &data); virtual void set_data4f(unsigned char *pointer, const LVecBase4f &data); + virtual void set_data1d(unsigned char *pointer, double data); virtual void set_data2d(unsigned char *pointer, const LVecBase2d &data); virtual void set_data3d(unsigned char *pointer, const LVecBase3d &data); @@ -219,17 +198,28 @@ private: // This is similar to Packer_point, in that the fourth component is // implicitly 1.0 if it is not present in the data, but we never - // divide by alpha. + // divide by alpha. It also transforms integer colors to the 0-1 range. class Packer_color : public Packer { public: + virtual float get_data1f(const unsigned char *pointer); + virtual const LVecBase2f &get_data2f(const unsigned char *pointer); + virtual const LVecBase3f &get_data3f(const unsigned char *pointer); virtual const LVecBase4f &get_data4f(const unsigned char *pointer); + + virtual double get_data1d(const unsigned char *pointer); + virtual const LVecBase2d &get_data2d(const unsigned char *pointer); + virtual const LVecBase3d &get_data3d(const unsigned char *pointer); virtual const LVecBase4d &get_data4d(const unsigned char *pointer); + virtual void set_data1f(unsigned char *pointer, float data); virtual void set_data2f(unsigned char *pointer, const LVecBase2f &data); virtual void set_data3f(unsigned char *pointer, const LVecBase3f &data); + virtual void set_data4f(unsigned char *pointer, const LVecBase4f &data); + virtual void set_data1d(unsigned char *pointer, double data); virtual void set_data2d(unsigned char *pointer, const LVecBase2d &data); virtual void set_data3d(unsigned char *pointer, const LVecBase3d &data); + virtual void set_data4d(unsigned char *pointer, const LVecBase4d &data); virtual const char *get_name() const { return "Packer_color"; diff --git a/panda/src/gobj/geomVertexData.cxx b/panda/src/gobj/geomVertexData.cxx index 7a265b66a0..5e5795f7fb 100644 --- a/panda/src/gobj/geomVertexData.cxx +++ b/panda/src/gobj/geomVertexData.cxx @@ -2368,7 +2368,7 @@ get_array_info(const InternalName *name, const GeomVertexArrayDataHandle *&array_reader, int &num_values, GeomVertexDataPipelineReader::NumericType &numeric_type, - int &start, int &stride, int &divisor, + bool &normalized, int &start, int &stride, int &divisor, int &num_elements, int &element_stride) const { nassertr(_got_array_readers, false); int array_index; @@ -2377,6 +2377,7 @@ get_array_info(const InternalName *name, array_reader = _array_readers[array_index]; num_values = column->get_num_values(); numeric_type = column->get_numeric_type(); + normalized = (column->get_contents() == GeomEnums::C_color); start = column->get_start(); stride = _cdata->_format->get_array(array_index)->get_stride(); divisor = _cdata->_format->get_array(array_index)->get_divisor(); @@ -2553,11 +2554,11 @@ set_num_rows(int n) { int num_values = column->get_num_values(); switch (column->get_numeric_type()) { - case NT_packed_dcba: - case NT_packed_dabc: case NT_uint8: case NT_uint16: case NT_uint32: + case NT_packed_dcba: + case NT_packed_dabc: while (pointer < stop) { memset(pointer, 0xff, column->get_total_bytes()); pointer += stride; @@ -2585,6 +2586,9 @@ set_num_rows(int n) { break; case NT_stdfloat: + case NT_int8: + case NT_int16: + case NT_int32: // Shouldn't have this type in the format. nassertr(false, false); } diff --git a/panda/src/gobj/geomVertexData.h b/panda/src/gobj/geomVertexData.h index 9bcdd7daec..b7a4fefe95 100644 --- a/panda/src/gobj/geomVertexData.h +++ b/panda/src/gobj/geomVertexData.h @@ -453,7 +453,7 @@ public: bool get_array_info(const InternalName *name, const GeomVertexArrayDataHandle *&array_reader, int &num_values, NumericType &numeric_type, - int &start, int &stride, int &divisor, + bool &normalized, int &start, int &stride, int &divisor, int &num_elements, int &element_stride) const; INLINE bool has_vertex() const; diff --git a/panda/src/gobj/geomVertexWriter.I b/panda/src/gobj/geomVertexWriter.I index 66a9f4ee6d..708ce474a1 100644 --- a/panda/src/gobj/geomVertexWriter.I +++ b/panda/src/gobj/geomVertexWriter.I @@ -906,20 +906,6 @@ set_data2i(int a, int b) { set_data2i(LVecBase2i(a, b)); } -//////////////////////////////////////////////////////////////////// -// Function: GeomVertexWriter::set_data2i -// Access: Published -// Description: Sets the write row to a particular 2-component -// value, and advances the write row. -// -// It is an error for the write row to advance past -// the end of data. -//////////////////////////////////////////////////////////////////// -INLINE void GeomVertexWriter:: -set_data2i(const int data[2]) { - set_data2i(LVecBase2i(data[0], data[1])); -} - //////////////////////////////////////////////////////////////////// // Function: GeomVertexWriter::set_data2i // Access: Published @@ -949,20 +935,6 @@ set_data3i(int a, int b, int c) { set_data3i(LVecBase3i(a, b, c)); } -//////////////////////////////////////////////////////////////////// -// Function: GeomVertexWriter::set_data3i -// Access: Published -// Description: Sets the write row to a particular 3-component -// value, and advances the write row. -// -// It is an error for the write row to advance past -// the end of data. -//////////////////////////////////////////////////////////////////// -INLINE void GeomVertexWriter:: -set_data3i(const int data[3]) { - set_data3i(LVecBase3i(data[0], data[1], data[2])); -} - //////////////////////////////////////////////////////////////////// // Function: GeomVertexWriter::set_data3i // Access: Published @@ -992,20 +964,6 @@ set_data4i(int a, int b, int c, int d) { set_data4i(LVecBase4i(a, b, c, d)); } -//////////////////////////////////////////////////////////////////// -// Function: GeomVertexWriter::set_data4i -// Access: Published -// Description: Sets the write row to a particular 4-component -// value, and advances the write row. -// -// It is an error for the write row to advance past -// the end of data. -//////////////////////////////////////////////////////////////////// -INLINE void GeomVertexWriter:: -set_data4i(const int data[4]) { - set_data4i(LVecBase4i(data[0], data[1], data[2], data[3])); -} - //////////////////////////////////////////////////////////////////// // Function: GeomVertexWriter::set_data4i // Access: Published @@ -1526,20 +1484,6 @@ add_data2i(int a, int b) { add_data2i(LVecBase2i(a, b)); } -//////////////////////////////////////////////////////////////////// -// Function: GeomVertexWriter::add_data2i -// Access: Published -// Description: Sets the write row to a particular 2-component -// value, and advances the write row. -// -// If the write row advances past the end of data, -// implicitly adds a new row to the data. -//////////////////////////////////////////////////////////////////// -INLINE void GeomVertexWriter:: -add_data2i(const int data[2]) { - add_data2i(LVecBase2i(data[0], data[1])); -} - //////////////////////////////////////////////////////////////////// // Function: GeomVertexWriter::add_data2i // Access: Published @@ -1569,20 +1513,6 @@ add_data3i(int a, int b, int c) { add_data3i(LVecBase3i(a, b, c)); } -//////////////////////////////////////////////////////////////////// -// Function: GeomVertexWriter::add_data3i -// Access: Published -// Description: Sets the write row to a particular 3-component -// value, and advances the write row. -// -// If the write row advances past the end of data, -// implicitly adds a new row to the data. -//////////////////////////////////////////////////////////////////// -INLINE void GeomVertexWriter:: -add_data3i(const int data[3]) { - add_data3i(LVecBase3i(data[0], data[1], data[2])); -} - //////////////////////////////////////////////////////////////////// // Function: GeomVertexWriter::add_data3i // Access: Published @@ -1612,20 +1542,6 @@ add_data4i(int a, int b, int c, int d) { add_data4i(LVecBase4i(a, b, c, d)); } -//////////////////////////////////////////////////////////////////// -// Function: GeomVertexWriter::add_data4i -// Access: Published -// Description: Sets the write row to a particular 4-component -// value, and advances the write row. -// -// If the write row advances past the end of data, -// implicitly adds a new row to the data. -//////////////////////////////////////////////////////////////////// -INLINE void GeomVertexWriter:: -add_data4i(const int data[4]) { - add_data4i(LVecBase4i(data[0], data[1], data[2], data[3])); -} - //////////////////////////////////////////////////////////////////// // Function: GeomVertexWriter::add_data4i // Access: Published diff --git a/panda/src/gobj/geomVertexWriter.h b/panda/src/gobj/geomVertexWriter.h index 2a22f78f1f..7f49d81c54 100644 --- a/panda/src/gobj/geomVertexWriter.h +++ b/panda/src/gobj/geomVertexWriter.h @@ -144,13 +144,10 @@ PUBLISHED: INLINE void set_data1i(int data); INLINE void set_data2i(int a, int b); - INLINE void set_data2i(const int data[2]); INLINE void set_data2i(const LVecBase2i &data); INLINE void set_data3i(int a, int b, int c); - INLINE void set_data3i(const int data[3]); INLINE void set_data3i(const LVecBase3i &data); INLINE void set_data4i(int a, int b, int c, int d); - INLINE void set_data4i(const int data[4]); INLINE void set_data4i(const LVecBase4i &data); INLINE void add_data1f(float data); @@ -185,13 +182,10 @@ PUBLISHED: INLINE void add_data1i(int data); INLINE void add_data2i(int a, int b); - INLINE void add_data2i(const int data[2]); INLINE void add_data2i(const LVecBase2i &data); INLINE void add_data3i(int a, int b, int c); - INLINE void add_data3i(const int data[3]); INLINE void add_data3i(const LVecBase3i &data); INLINE void add_data4i(int a, int b, int c, int d); - INLINE void add_data4i(const int data[4]); INLINE void add_data4i(const LVecBase4i &data); void output(ostream &out) const;