From 72f97c210777fa143e80d485ffdb420c7c5d0c4b Mon Sep 17 00:00:00 2001 From: David Rose Date: Thu, 6 Oct 2011 18:59:10 +0000 Subject: [PATCH] support NT_float64 as a vertex numeric type --- panda/src/egg2pg/config_egg2pg.cxx | 10 + panda/src/egg2pg/config_egg2pg.h | 3 +- panda/src/egg2pg/eggLoader.cxx | 41 +- .../glstuff/glGraphicsStateGuardian_src.cxx | 3 + panda/src/gobj/geomEnums.cxx | 3 + panda/src/gobj/geomEnums.h | 3 +- panda/src/gobj/geomVertexColumn.cxx | 1255 +++++++++++++++++ panda/src/gobj/geomVertexColumn.h | 103 ++ panda/src/gobj/geomVertexData.cxx | 10 + panda/src/gobj/geomVertexReader.I | 52 + panda/src/gobj/geomVertexReader.h | 5 + panda/src/gobj/geomVertexWriter.I | 204 +++ panda/src/gobj/geomVertexWriter.h | 16 + 13 files changed, 1688 insertions(+), 20 deletions(-) diff --git a/panda/src/egg2pg/config_egg2pg.cxx b/panda/src/egg2pg/config_egg2pg.cxx index fdc06814f0..1789159da2 100644 --- a/panda/src/egg2pg/config_egg2pg.cxx +++ b/panda/src/egg2pg/config_egg2pg.cxx @@ -56,6 +56,16 @@ ConfigVariableDouble egg_flatten_radius "the user to specify what should be considered \"small\". Set " "it to 0.0 to disable this feature.")); +ConfigVariableBool egg_float64_vertices +("egg-float64-vertices", false, + PRC_DESC("When this is true, the egg loader will store the vertices " + "for all geometry in a 64-bit double-precision float, instead " + "of the standard 32-bit single-precision float. You almost never " + "want to set this true, since current hardware does not support " + "double-precision vertices, and setting this will just require the " + "driver to downsample the vertices at load time, making everything " + "slower.")); + ConfigVariableBool egg_unify ("egg-unify", true, PRC_DESC("When this is true, then in addition to flattening the scene graph " diff --git a/panda/src/egg2pg/config_egg2pg.h b/panda/src/egg2pg/config_egg2pg.h index 94e01e9c82..5bad7a8aa8 100644 --- a/panda/src/egg2pg/config_egg2pg.h +++ b/panda/src/egg2pg/config_egg2pg.h @@ -37,8 +37,9 @@ extern EXPCL_PANDAEGG ConfigVariableBool egg_ignore_filters; extern EXPCL_PANDAEGG ConfigVariableBool egg_ignore_clamp; extern EXPCL_PANDAEGG ConfigVariableBool egg_ignore_decals; extern EXPCL_PANDAEGG ConfigVariableBool egg_flatten; -extern EXPCL_PANDAEGG ConfigVariableBool egg_unify; extern EXPCL_PANDAEGG ConfigVariableDouble egg_flatten_radius; +extern EXPCL_PANDAEGG ConfigVariableBool egg_float64_vertices; +extern EXPCL_PANDAEGG ConfigVariableBool egg_unify; extern EXPCL_PANDAEGG ConfigVariableBool egg_combine_geoms; extern EXPCL_PANDAEGG ConfigVariableBool egg_rigid_geometry; extern EXPCL_PANDAEGG ConfigVariableBool egg_flat_shading; diff --git a/panda/src/egg2pg/eggLoader.cxx b/panda/src/egg2pg/eggLoader.cxx index 9b22f5f730..12639c6a14 100644 --- a/panda/src/egg2pg/eggLoader.cxx +++ b/panda/src/egg2pg/eggLoader.cxx @@ -622,8 +622,8 @@ show_normals(EggVertexPool *vertex_pool, GeomNode *geom_node) { LPoint3d pos = vert->get_pos3(); if (vert->has_normal()) { - vertex.add_data3f(LCAST(float, pos)); - vertex.add_data3f(LCAST(float, pos + vert->get_normal() * egg_normal_scale)); + vertex.add_data3d(pos); + vertex.add_data3d(pos + vert->get_normal() * egg_normal_scale); color.add_data4f(1.0f, 0.0f, 0.0f, 1.0f); color.add_data4f(1.0f, 0.0f, 0.0f, 1.0f); primitive->add_next_vertices(2); @@ -636,16 +636,16 @@ show_normals(EggVertexPool *vertex_pool, GeomNode *geom_node) { for (uvi = vert->uv_begin(); uvi != vert->uv_end(); ++uvi) { EggVertexUV *uv_obj = (*uvi); if (uv_obj->has_tangent()) { - vertex.add_data3f(LCAST(float, pos)); - vertex.add_data3f(LCAST(float, pos + uv_obj->get_tangent() * egg_normal_scale)); + vertex.add_data3d(pos); + vertex.add_data3d(pos + uv_obj->get_tangent() * egg_normal_scale); color.add_data4f(0.0f, 1.0f, 0.0f, 1.0f); color.add_data4f(0.0f, 1.0f, 0.0f, 1.0f); primitive->add_next_vertices(2); primitive->close_primitive(); } if (uv_obj->has_binormal()) { - vertex.add_data3f(LCAST(float, pos)); - vertex.add_data3f(LCAST(float, pos + uv_obj->get_binormal() * egg_normal_scale)); + vertex.add_data3d(pos); + vertex.add_data3d(pos + uv_obj->get_binormal() * egg_normal_scale); color.add_data4f(0.0f, 0.0f, 1.0f, 1.0f); color.add_data4f(0.0f, 0.0f, 1.0f, 1.0f); primitive->add_next_vertices(2); @@ -2199,10 +2199,15 @@ make_vertex_data(const EggRenderState *render_state, } // Decide on the format for the vertices. + Geom::NumericType vertex_numeric_type = Geom::NT_float32; + if (egg_float64_vertices) { + vertex_numeric_type = Geom::NT_float64; + } + PT(GeomVertexArrayFormat) array_format = new GeomVertexArrayFormat; array_format->add_column (InternalName::get_vertex(), vertex_pool->get_num_dimensions(), - Geom::NT_float32, Geom::C_point); + vertex_numeric_type, Geom::C_point); if (vertex_pool->has_normals()) { array_format->add_column @@ -2335,7 +2340,7 @@ make_vertex_data(const EggRenderState *render_state, GeomVertexFormat::register_format(temp_format); // Now create a new GeomVertexData using the indicated format. It - // is actually correct to create it with UH_static even it + // is actually correct to create it with UH_static even though it // represents a dynamic object, because the vertex data itself won't // be changing--just the result of applying the animation is // dynamic. @@ -2348,7 +2353,7 @@ make_vertex_data(const EggRenderState *render_state, vertex_data->set_slider_table(SliderTable::register_table(slider_table)); } - // And fill the data from the vertex pool. + // And fill in the data from the vertex pool. EggVertexPool::const_iterator vi; for (vi = vertex_pool->begin(); vi != vertex_pool->end(); ++vi) { GeomVertexWriter gvw(vertex_data); @@ -2356,7 +2361,7 @@ make_vertex_data(const EggRenderState *render_state, gvw.set_row(vertex->get_index()); gvw.set_column(InternalName::get_vertex()); - gvw.add_data4f(LCAST(float, vertex->get_pos4() * transform)); + gvw.add_data4d(vertex->get_pos4() * transform); if (is_dynamic) { EggMorphVertexList::const_iterator mvi; @@ -2365,7 +2370,7 @@ make_vertex_data(const EggRenderState *render_state, CPT(InternalName) delta_name = InternalName::get_morph(InternalName::get_vertex(), morph.get_name()); gvw.set_column(delta_name); - gvw.add_data3f(LCAST(float, morph.get_offset() * transform)); + gvw.add_data3d(morph.get_offset() * transform); } } @@ -2373,7 +2378,7 @@ make_vertex_data(const EggRenderState *render_state, gvw.set_column(InternalName::get_normal()); Normald orig_normal = vertex->get_normal(); Normald transformed_normal = normalize(orig_normal * transform); - gvw.add_data3f(LCAST(float, transformed_normal)); + gvw.add_data3d(transformed_normal); if (is_dynamic) { EggMorphNormalList::const_iterator mni; @@ -2385,7 +2390,7 @@ make_vertex_data(const EggRenderState *render_state, Normald morphed_normal = orig_normal + morph.get_offset(); Normald transformed_morphed_normal = normalize(morphed_normal * transform); LVector3d delta = transformed_morphed_normal - transformed_normal; - gvw.add_data3f(LCAST(float, delta)); + gvw.add_data3d(delta); } } } @@ -2422,7 +2427,7 @@ make_vertex_data(const EggRenderState *render_state, uvw = uvw * (*buv).second->get_transform3d(); } - gvw.set_data3f(LCAST(float, uvw)); + gvw.set_data3d(uvw); if (is_dynamic) { EggMorphTexCoordList::const_iterator mti; @@ -2437,7 +2442,7 @@ make_vertex_data(const EggRenderState *render_state, duvw = (new_uvw * (*buv).second->get_transform3d()) - uvw; } - gvw.add_data3f(LCAST(float, duvw)); + gvw.add_data3d(duvw); } } @@ -2448,9 +2453,9 @@ make_vertex_data(const EggRenderState *render_state, if (gvw.has_column()) { LVector3d tangent = egg_uv->get_tangent(); LVector3d binormal = egg_uv->get_binormal(); - gvw.add_data3f(LCAST(float, tangent)); + gvw.add_data3d(tangent); gvw.set_column(InternalName::get_binormal_name(name)); - gvw.add_data3f(LCAST(float, binormal)); + gvw.add_data3d(binormal); } } } @@ -2751,7 +2756,7 @@ make_sphere(EggGroup *egg_group, EggGroup::CollideFlags flags, radius2 = max(radius2, v.length_squared()); } - center = LCAST(float,d_center); + center = LCAST(float, d_center); radius = sqrtf(radius2); //egg2pg_cat.debug() << "make_sphere radius: " << radius << "\n"; diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index c18c663aa1..92598b5029 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -5736,6 +5736,9 @@ get_numeric_type(Geom::NumericType numeric_type) { case Geom::NT_float32: return GL_FLOAT; + + case Geom::NT_float64: + return GL_DOUBLE; } GLCAT.error() diff --git a/panda/src/gobj/geomEnums.cxx b/panda/src/gobj/geomEnums.cxx index 7b75ed3af4..73f0236edb 100644 --- a/panda/src/gobj/geomEnums.cxx +++ b/panda/src/gobj/geomEnums.cxx @@ -95,6 +95,9 @@ operator << (ostream &out, GeomEnums::NumericType numeric_type) { case GeomEnums::NT_float32: return out << "float32"; + + case GeomEnums::NT_float64: + return out << "float64"; } return out << "**invalid numeric type (" << (int)numeric_type << ")**"; diff --git a/panda/src/gobj/geomEnums.h b/panda/src/gobj/geomEnums.h index 728fbe1429..2b5e4a49ab 100644 --- a/panda/src/gobj/geomEnums.h +++ b/panda/src/gobj/geomEnums.h @@ -181,7 +181,8 @@ PUBLISHED: NT_uint32, // An integer 0..4294967296 NT_packed_dcba, // DirectX style, four byte values packed in a uint32 NT_packed_dabc, // DirectX packed color order (ARGB) - NT_float32, // A floating-point number + NT_float32, // A single-precision float + NT_float64, // A double-precision float }; // The contents determine the semantic meaning of a numeric value diff --git a/panda/src/gobj/geomVertexColumn.cxx b/panda/src/gobj/geomVertexColumn.cxx index 34bacfb5dc..1048f4f241 100644 --- a/panda/src/gobj/geomVertexColumn.cxx +++ b/panda/src/gobj/geomVertexColumn.cxx @@ -67,6 +67,11 @@ output(ostream &out) const { case NT_float32: out << "f"; + break; + + case NT_float64: + out << "d"; + break; } out << ")"; @@ -106,6 +111,10 @@ setup() { case NT_float32: _component_bytes = 4; // sizeof(PN_float32) break; + + case NT_float64: + _component_bytes = 8; // sizeof(PN_float64) + break; } _total_bytes = _component_bytes * _num_components; @@ -152,6 +161,29 @@ make_packer() const { } } break; + case NT_float64: + if (sizeof(double) == sizeof(PN_float64)) { + // Use the native float type implementation for a tiny bit + // more optimization. + switch (get_num_components()) { + case 2: + return new Packer_point_nativedouble_2; + case 3: + return new Packer_point_nativedouble_3; + case 4: + return new Packer_point_nativedouble_4; + } + } else { + switch (get_num_components()) { + case 2: + return new Packer_point_float64_2; + case 3: + return new Packer_point_float64_3; + case 4: + return new Packer_point_float64_4; + } + } + break; default: break; } @@ -211,6 +243,21 @@ make_packer() const { return new Packer_float32_3; } + default: + break; + } + break; + case NT_float64: + switch (get_num_components()) { + case 3: + if (sizeof(double) == sizeof(PN_float64)) { + // Use the native float type implementation for a tiny bit + // more optimization. + return new Packer_nativedouble_3; + } else { + return new Packer_float64_3; + } + default: break; } @@ -312,6 +359,9 @@ get_data1f(const unsigned char *pointer) { case NT_float32: return *(const PN_float32 *)pointer; + + case NT_float64: + return *(const PN_float64 *)pointer; } return 0.0f; @@ -370,6 +420,13 @@ get_data2f(const unsigned char *pointer) { _v2.set(pi[0], pi[1]); } return _v2; + + case NT_float64: + { + const PN_float64 *pi = (const PN_float64 *)pointer; + _v2.set(pi[0], pi[1]); + } + return _v2; } } @@ -439,6 +496,13 @@ get_data3f(const unsigned char *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; } } @@ -517,12 +581,285 @@ get_data4f(const unsigned char *pointer) { _v4.set(pi[0], pi[1], pi[2], pi[3]); } return _v4; + + case NT_float64: + { + const PN_float64 *pi = (const PN_float64 *)pointer; + _v4.set(pi[0], pi[1], pi[2], pi[3]); + } + return _v4; } } return _v4; } +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer::get_data1d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +double GeomVertexColumn::Packer:: +get_data1d(const unsigned char *pointer) { + switch (_column->get_numeric_type()) { + case NT_uint8: + return maybe_scale_color(*pointer); + + case NT_uint16: + return *(const PN_uint16 *)pointer; + + case NT_uint32: + return *(const PN_uint32 *)pointer; + + case NT_packed_dcba: + { + PN_uint32 dword = *(const PN_uint32 *)pointer; + return maybe_scale_color(GeomVertexData::unpack_abcd_d(dword)); + } + + case NT_packed_dabc: + { + PN_uint32 dword = *(const PN_uint32 *)pointer; + return maybe_scale_color(GeomVertexData::unpack_abcd_b(dword)); + } + + case NT_float32: + return *(const PN_float32 *)pointer; + + case NT_float64: + return *(const PN_float64 *)pointer; + } + + return 0.0f; +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer::get_data2d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +const LVecBase2d &GeomVertexColumn::Packer:: +get_data2d(const unsigned char *pointer) { + if (_column->get_num_values() == 1) { + _v2d.set(get_data1d(pointer), 0.0f); + return _v2d; + + } else { + switch (_column->get_numeric_type()) { + case NT_uint8: + maybe_scale_color(pointer[0], pointer[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(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(GeomVertexData::unpack_abcd_b(dword), + GeomVertexData::unpack_abcd_c(dword)); + } + return _v2d; + + case NT_float32: + { + const PN_float32 *pi = (const PN_float32 *)pointer; + _v2d.set(pi[0], pi[1]); + } + return _v2d; + + case NT_float64: + { + const PN_float64 *pi = (const PN_float64 *)pointer; + _v2d.set(pi[0], pi[1]); + } + return _v2d; + } + } + + return _v2d; +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer::get_data3d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +const LVecBase3d &GeomVertexColumn::Packer:: +get_data3d(const unsigned char *pointer) { + switch (_column->get_num_values()) { + case 1: + _v3d.set(get_data1d(pointer), 0.0f, 0.0f); + return _v3d; + + case 2: + { + const LVecBase2d &v2 = get_data2d(pointer); + _v3d.set(v2[0], v2[1], 0.0f); + } + return _v3d; + + default: + switch (_column->get_numeric_type()) { + case NT_uint8: + maybe_scale_color(pointer[0], pointer[1], pointer[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(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(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; + _v3d.set(pi[0], pi[1], pi[2]); + } + return _v3d; + } + } + + return _v3d; +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer::get_data4d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +const LVecBase4d &GeomVertexColumn::Packer:: +get_data4d(const unsigned char *pointer) { + switch (_column->get_num_values()) { + case 1: + _v4d.set(get_data1d(pointer), 0.0f, 0.0f, 0.0f); + return _v4d; + + case 2: + { + const LVecBase2d &v2 = get_data2d(pointer); + _v4d.set(v2[0], v2[1], 0.0f, 0.0f); + } + return _v4d; + + case 3: + { + const LVecBase3d &v3 = get_data3d(pointer); + _v4d.set(v3[0], v3[1], v3[2], 0.0f); + } + return _v4d; + + default: + switch (_column->get_numeric_type()) { + case NT_uint8: + maybe_scale_color(pointer[0], pointer[1], pointer[2], pointer[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(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(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; + _v4d.set(pi[0], pi[1], pi[2], pi[3]); + } + return _v4d; + } + } + + return _v4d; +} + //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer::get_data1i // Access: Public, Virtual @@ -554,6 +891,9 @@ get_data1i(const unsigned char *pointer) { case NT_float32: return (int)*(const PN_float32 *)pointer; + + case NT_float64: + return (int)*(const PN_float64 *)pointer; } return 0; @@ -618,6 +958,14 @@ get_data2i(const unsigned char *pointer) { _i[1] = (int)pi[1]; } return _i; + + case NT_float64: + { + const PN_float64 *pi = (const PN_float64 *)pointer; + _i[0] = (int)pi[0]; + _i[1] = (int)pi[1]; + } + return _i; } } @@ -699,6 +1047,15 @@ get_data3i(const unsigned char *pointer) { _i[2] = (int)pi[2]; } return _i; + + case NT_float64: + { + const PN_float64 *pi = (const PN_float64 *)pointer; + _i[0] = (int)pi[0]; + _i[1] = (int)pi[1]; + _i[2] = (int)pi[2]; + } + return _i; } } @@ -798,6 +1155,16 @@ get_data4i(const unsigned char *pointer) { _i[3] = (int)pi[3]; } return _i; + + case NT_float64: + { + const PN_float64 *pi = (const PN_float64 *)pointer; + _i[0] = (int)pi[0]; + _i[1] = (int)pi[1]; + _i[2] = (int)pi[2]; + _i[3] = (int)pi[3]; + } + return _i; } } @@ -834,6 +1201,10 @@ set_data1f(unsigned char *pointer, float data) { case NT_float32: *(PN_float32 *)pointer = data; break; + + case NT_float64: + *(PN_float64 *)pointer = data; + break; } break; @@ -898,6 +1269,14 @@ set_data2f(unsigned char *pointer, const LVecBase2f &data) { pi[1] = data[1]; } break; + + case NT_float64: + { + PN_float64 *pi = (PN_float64 *)pointer; + pi[0] = data[0]; + pi[1] = data[1]; + } + break; } break; @@ -967,6 +1346,15 @@ set_data3f(unsigned char *pointer, const LVecBase3f &data) { 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; } break; @@ -1045,6 +1433,293 @@ set_data4f(unsigned char *pointer, const LVecBase4f &data) { 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; + } + break; + } +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer::set_data1d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +void GeomVertexColumn::Packer:: +set_data1d(unsigned char *pointer, double data) { + switch (_column->get_num_values()) { + case 1: + switch (_column->get_numeric_type()) { + case NT_uint8: + *pointer = maybe_unscale_color(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; + } + break; + + case 2: + set_data2d(pointer, LVecBase2d(data, 0.0f)); + break; + + case 3: + set_data3d(pointer, LVecBase3d(data, 0.0f, 0.0f)); + break; + + case 4: + set_data4d(pointer, LVecBase4d(data, 0.0f, 0.0f, 0.0f)); + break; + } +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer::set_data2d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +void GeomVertexColumn::Packer:: +set_data2d(unsigned char *pointer, const LVecBase2d &data) { + switch (_column->get_num_values()) { + case 1: + set_data1d(pointer, data[0]); + + case 2: + switch (_column->get_numeric_type()) { + case NT_uint8: + maybe_unscale_color(LCAST(float, data)); + pointer[0] = _a; + pointer[1] = _b; + break; + + case NT_uint16: + { + PN_uint16 *pi = (PN_uint16 *)pointer; + pi[0] = (unsigned int)data[0]; + pi[1] = (unsigned int)data[1]; + } + break; + + case NT_uint32: + { + PN_uint32 *pi = (PN_uint32 *)pointer; + pi[0] = (unsigned int)data[0]; + 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; + pi[0] = data[0]; + pi[1] = data[1]; + } + break; + + case NT_float64: + { + PN_float64 *pi = (PN_float64 *)pointer; + pi[0] = data[0]; + pi[1] = data[1]; + } + break; + } + break; + + case 3: + set_data3d(pointer, LVecBase3d(data[0], data[1], 0.0f)); + break; + + default: + set_data4d(pointer, LVecBase4d(data[0], data[1], 0.0f, 0.0f)); + break; + } +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer::set_data3d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +void GeomVertexColumn::Packer:: +set_data3d(unsigned char *pointer, const LVecBase3d &data) { + switch (_column->get_num_values()) { + case 1: + set_data1d(pointer, data[0]); + break; + + case 2: + set_data2d(pointer, LVecBase2d(data[0], data[1])); + break; + + case 3: + switch (_column->get_numeric_type()) { + case NT_uint8: + maybe_unscale_color(LCAST(float, data)); + pointer[0] = _a; + pointer[1] = _b; + pointer[2] = _c; + break; + + case NT_uint16: + { + PN_uint16 *pi = (PN_uint16 *)pointer; + pi[0] = (unsigned int)data[0]; + pi[1] = (unsigned int)data[1]; + pi[2] = (unsigned int)data[2]; + } + break; + + case NT_uint32: + { + 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: + case NT_packed_dabc: + nassertv(false); + 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; + } + break; + + default: + set_data4d(pointer, LVecBase4d(data[0], data[1], data[2], 0.0f)); + break; + } +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer::set_data4d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +void GeomVertexColumn::Packer:: +set_data4d(unsigned char *pointer, const LVecBase4d &data) { + switch (_column->get_num_values()) { + case 1: + set_data1d(pointer, data[0]); + break; + + case 2: + set_data2d(pointer, LVecBase2d(data[0], data[1])); + break; + + case 3: + set_data3d(pointer, LVecBase3d(data[0], data[1], data[2])); + break; + + default: + switch (_column->get_numeric_type()) { + case NT_uint8: + maybe_unscale_color(LCAST(float, data)); + pointer[0] = _a; + pointer[1] = _b; + pointer[2] = _c; + pointer[3] = _d; + break; + + case NT_uint16: + { + PN_uint16 *pi = (PN_uint16 *)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_uint32: + { + 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: + maybe_unscale_color(LCAST(float, data)); + *(PN_uint32 *)pointer = GeomVertexData::pack_abcd(_d, _c, _b, _a); + break; + + case NT_packed_dabc: + maybe_unscale_color(LCAST(float, data)); + *(PN_uint32 *)pointer = GeomVertexData::pack_abcd(_d, _a, _b, _c); + 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; } break; } @@ -1082,6 +1757,10 @@ set_data1i(unsigned char *pointer, int a) { case NT_float32: *(PN_float32 *)pointer = (float)a; break; + + case NT_float64: + *(PN_float64 *)pointer = (double)a; + break; } break; @@ -1146,6 +1825,14 @@ set_data2i(unsigned char *pointer, int a, int b) { pi[1] = b; } break; + + case NT_float64: + { + PN_float64 *pi = (PN_float64 *)pointer; + pi[0] = a; + pi[1] = b; + } + break; } break; @@ -1214,6 +1901,15 @@ set_data3i(unsigned char *pointer, int a, int b, int c) { pi[2] = c; } break; + + case NT_float64: + { + PN_float64 *pi = (PN_float64 *)pointer; + pi[0] = a; + pi[1] = b; + pi[2] = c; + } + break; } break; @@ -1289,6 +1985,16 @@ set_data4i(unsigned char *pointer, int a, int b, int c, int d) { pi[3] = d; } break; + + case NT_float64: + { + PN_float64 *pi = (PN_float64 *)pointer; + pi[0] = a; + pi[1] = b; + pi[2] = c; + pi[3] = d; + } + break; } break; } @@ -1413,12 +2119,151 @@ get_data4f(const unsigned char *pointer) { _v4.set(pi[0], pi[1], pi[2], pi[3]); } return _v4; + + case NT_float64: + { + const PN_float64 *pi = (const PN_float64 *)pointer; + _v4.set(pi[0], pi[1], pi[2], pi[3]); + } + return _v4; } } return _v4; } +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_point::get_data1d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +double GeomVertexColumn::Packer_point:: +get_data1d(const unsigned char *pointer) { + if (_column->get_num_values() == 4) { + const LVecBase4d &v4 = get_data4d(pointer); + return v4[0] / v4[3]; + } else { + return Packer::get_data1d(pointer); + } +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_point::get_data2d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +const LVecBase2d &GeomVertexColumn::Packer_point:: +get_data2d(const unsigned char *pointer) { + if (_column->get_num_values() == 4) { + const LVecBase4d &v4 = get_data4d(pointer); + _v2d.set(v4[0] / v4[3], v4[1] / v4[3]); + return _v2d; + } else { + return Packer::get_data2d(pointer); + } +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_point::get_data3d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +const LVecBase3d &GeomVertexColumn::Packer_point:: +get_data3d(const unsigned char *pointer) { + if (_column->get_num_values() == 4) { + const LVecBase4d &v4 = get_data4d(pointer); + _v3d.set(v4[0] / v4[3], v4[1] / v4[3], v4[2] / v4[3]); + return _v3d; + } else { + return Packer::get_data3d(pointer); + } +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_point::get_data4d +// Access: Public, Virtual +// 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); + return _v4d; + + case 2: + { + const LVecBase2d &v2 = get_data2d(pointer); + _v4d.set(v2[0], v2[1], 0.0f, 1.0f); + } + return _v4d; + + case 3: + { + const LVecBase3d &v3 = get_data3d(pointer); + _v4d.set(v3[0], v3[1], v3[2], 1.0f); + } + return _v4d; + + default: + switch (_column->get_numeric_type()) { + case NT_uint8: + maybe_scale_color(pointer[0], pointer[1], pointer[2], pointer[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(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(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; + _v4d.set(pi[0], pi[1], pi[2], pi[3]); + } + return _v4d; + } + } + + return _v4d; +} + //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_point::set_data1f // Access: Public, Virtual @@ -1530,6 +2375,142 @@ set_data4f(unsigned char *pointer, const LVecBase4f &data) { 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; + } + break; + } +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_point::set_data1d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +void GeomVertexColumn::Packer_point:: +set_data1d(unsigned char *pointer, double data) { + if (_column->get_num_values() == 4) { + set_data4d(pointer, LVecBase4d(data, 0.0f, 0.0f, 1.0f)); + } else { + Packer::set_data1d(pointer, data); + } +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_point::set_data2d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +void GeomVertexColumn::Packer_point:: +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)); + } else { + Packer::set_data2d(pointer, data); + } +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_point::set_data3d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +void GeomVertexColumn::Packer_point:: +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)); + } else { + Packer::set_data3d(pointer, data); + } +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_point::set_data4d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +void GeomVertexColumn::Packer_point:: +set_data4d(unsigned char *pointer, const LVecBase4d &data) { + switch (_column->get_num_values()) { + case 1: + set_data1d(pointer, data[0] / data[3]); + break; + + case 2: + set_data2d(pointer, LVecBase2d(data[0] / data[3], data[1] / data[3])); + break; + + case 3: + set_data3d(pointer, LVecBase3d(data[0] / data[3], data[1] / data[3], data[2] / data[3])); + break; + + default: + switch (_column->get_numeric_type()) { + case NT_uint8: + maybe_unscale_color(LCAST(float, data)); + pointer[0] = _a; + pointer[1] = _b; + pointer[2] = _c; + pointer[3] = _d; + break; + + case NT_uint16: + { + PN_uint16 *pi = (PN_uint16 *)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_uint32: + { + 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: + maybe_unscale_color(LCAST(float, data)); + *(PN_uint32 *)pointer = GeomVertexData::pack_abcd(_d, _c, _b, _a); + break; + + case NT_packed_dabc: + maybe_unscale_color(LCAST(float, data)); + *(PN_uint32 *)pointer = GeomVertexData::pack_abcd(_d, _a, _b, _c); + 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; } break; } @@ -1607,12 +2588,104 @@ get_data4f(const unsigned char *pointer) { _v4.set(pi[0], pi[1], pi[2], pi[3]); } return _v4; + + case NT_float64: + { + const PN_float64 *pi = (const PN_float64 *)pointer; + _v4.set(pi[0], pi[1], pi[2], pi[3]); + } + return _v4; } } return _v4; } +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_color::get_data4d +// Access: Public, Virtual +// 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); + 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: + switch (_column->get_numeric_type()) { + case NT_uint8: + maybe_scale_color(pointer[0], pointer[1], pointer[2], pointer[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(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(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; + _v4d.set(pi[0], pi[1], pi[2], pi[3]); + } + return _v4d; + } + } + + return _v4d; +} + //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_color::set_data1f // Access: Public, Virtual @@ -1655,6 +2728,48 @@ set_data3f(unsigned char *pointer, const LVecBase3f &data) { } } +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_color::set_data1d +// Access: Public, Virtual +// 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)); + } else { + Packer::set_data1d(pointer, data); + } +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_color::set_data2d +// Access: Public, Virtual +// 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)); + } else { + Packer::set_data2d(pointer, data); + } +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_color::set_data3d +// Access: Public, Virtual +// 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)); + } else { + Packer::set_data3d(pointer, data); + } +} + //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_float32_3::get_data3f // Access: Public, Virtual @@ -1795,6 +2910,146 @@ get_data4f(const unsigned char *pointer) { return *(const LVecBase4f *)pointer; } +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_float64_3::get_data3d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +const LVecBase3d &GeomVertexColumn::Packer_float64_3:: +get_data3d(const unsigned char *pointer) { + const PN_float64 *pi = (const PN_float64 *)pointer; + _v3d.set(pi[0], pi[1], pi[2]); + return _v3d; +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_float64_3::set_data3d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +void GeomVertexColumn::Packer_float64_3:: +set_data3d(unsigned char *pointer, const LVecBase3d &data) { + PN_float64 *pi = (PN_float64 *)pointer; + pi[0] = data[0]; + pi[1] = data[1]; + pi[2] = data[2]; +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_point_float64_2::get_data2d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +const LVecBase2d &GeomVertexColumn::Packer_point_float64_2:: +get_data2d(const unsigned char *pointer) { + const PN_float64 *pi = (const PN_float64 *)pointer; + _v2d.set(pi[0], pi[1]); + return _v2d; +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_point_float64_2::set_data2d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +void GeomVertexColumn::Packer_point_float64_2:: +set_data2d(unsigned char *pointer, const LVecBase2d &data) { + PN_float64 *pi = (PN_float64 *)pointer; + pi[0] = data[0]; + pi[1] = data[1]; +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_point_float64_3::get_data3d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +const LVecBase3d &GeomVertexColumn::Packer_point_float64_3:: +get_data3d(const unsigned char *pointer) { + const PN_float64 *pi = (const PN_float64 *)pointer; + _v3d.set(pi[0], pi[1], pi[2]); + return _v3d; +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_point_float64_3::set_data3d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +void GeomVertexColumn::Packer_point_float64_3:: +set_data3d(unsigned char *pointer, const LVecBase3d &data) { + PN_float64 *pi = (PN_float64 *)pointer; + pi[0] = data[0]; + pi[1] = data[1]; + pi[2] = data[2]; +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_point_float64_4::get_data4d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +const LVecBase4d &GeomVertexColumn::Packer_point_float64_4:: +get_data4d(const unsigned char *pointer) { + const PN_float64 *pi = (const PN_float64 *)pointer; + _v4d.set(pi[0], pi[1], pi[2], pi[3]); + return _v4d; +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_point_float64_4::set_data4d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +void GeomVertexColumn::Packer_point_float64_4:: +set_data4d(unsigned char *pointer, const LVecBase4d &data) { + PN_float64 *pi = (PN_float64 *)pointer; + pi[0] = data[0]; + pi[1] = data[1]; + pi[2] = data[2]; + pi[3] = data[3]; +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_nativedouble_3::get_data3d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +const LVecBase3d &GeomVertexColumn::Packer_nativedouble_3:: +get_data3d(const unsigned char *pointer) { + return *(const LVecBase3d *)pointer; +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_point_nativedouble_2::get_data2d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +const LVecBase2d &GeomVertexColumn::Packer_point_nativedouble_2:: +get_data2d(const unsigned char *pointer) { + return *(const LVecBase2d *)pointer; +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_point_nativedouble_3::get_data3d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +const LVecBase3d &GeomVertexColumn::Packer_point_nativedouble_3:: +get_data3d(const unsigned char *pointer) { + return *(const LVecBase3d *)pointer; +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexColumn::Packer_point_nativedouble_4::get_data4d +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +const LVecBase4d &GeomVertexColumn::Packer_point_nativedouble_4:: +get_data4d(const unsigned char *pointer) { + return *(const LVecBase4d *)pointer; +} + //////////////////////////////////////////////////////////////////// // Function: GeomVertexColumn::Packer_argb_packed::get_data4f // Access: Public, Virtual diff --git a/panda/src/gobj/geomVertexColumn.h b/panda/src/gobj/geomVertexColumn.h index 3008736828..178b4b8aad 100644 --- a/panda/src/gobj/geomVertexColumn.h +++ b/panda/src/gobj/geomVertexColumn.h @@ -103,10 +103,17 @@ private: class Packer { public: virtual ~Packer(); + 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 int get_data1i(const unsigned char *pointer); virtual const int *get_data2i(const unsigned char *pointer); virtual const int *get_data3i(const unsigned char *pointer); @@ -116,6 +123,11 @@ private: 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 void set_data1i(unsigned char *pointer, int a); virtual void set_data2i(unsigned char *pointer, int a, int b); @@ -142,6 +154,9 @@ private: LVecBase2f _v2; LVecBase3f _v3; LVecBase4f _v4; + LVecBase2d _v2d; + LVecBase3d _v3d; + LVecBase4d _v4d; int _i[4]; unsigned int _a, _b, _c, _d; }; @@ -158,10 +173,18 @@ 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); + virtual void set_data4d(unsigned char *pointer, const LVecBase4d &data); virtual const char *get_name() const { return "Packer_point"; @@ -174,9 +197,13 @@ private: class Packer_color : public Packer { public: virtual const LVecBase4f &get_data4f(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_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 const char *get_name() const { return "Packer_color"; @@ -263,6 +290,82 @@ private: } }; + class Packer_float64_3 : public Packer { + public: + virtual const LVecBase3d &get_data3d(const unsigned char *pointer); + virtual void set_data3d(unsigned char *pointer, const LVecBase3d &value); + + virtual const char *get_name() const { + return "Packer_float64_3"; + } + }; + + class Packer_point_float64_2 : public Packer_point { + public: + virtual const LVecBase2d &get_data2d(const unsigned char *pointer); + virtual void set_data2d(unsigned char *pointer, const LVecBase2d &value); + + virtual const char *get_name() const { + return "Packer_point_float64_2"; + } + }; + + class Packer_point_float64_3 : public Packer_point { + public: + virtual const LVecBase3d &get_data3d(const unsigned char *pointer); + virtual void set_data3d(unsigned char *pointer, const LVecBase3d &value); + + virtual const char *get_name() const { + return "Packer_point_float64_3"; + } + }; + + class Packer_point_float64_4 : public Packer_point { + public: + virtual const LVecBase4d &get_data4d(const unsigned char *pointer); + virtual void set_data4d(unsigned char *pointer, const LVecBase4d &value); + + virtual const char *get_name() const { + return "Packer_point_float64_4"; + } + }; + + class Packer_nativedouble_3 : public Packer_float64_3 { + public: + virtual const LVecBase3d &get_data3d(const unsigned char *pointer); + + virtual const char *get_name() const { + return "Packer_nativedouble_3"; + } + }; + + class Packer_point_nativedouble_2 : public Packer_point_float64_2 { + public: + virtual const LVecBase2d &get_data2d(const unsigned char *pointer); + + virtual const char *get_name() const { + return "Packer_nativedouble_2"; + } + }; + + class Packer_point_nativedouble_3 : public Packer_point_float64_3 { + public: + virtual const LVecBase3d &get_data3d(const unsigned char *pointer); + + virtual const char *get_name() const { + return "Packer_point_nativedouble_3"; + } + }; + + class Packer_point_nativedouble_4 : public Packer_point_float64_4 { + public: + virtual const LVecBase4d &get_data4d(const unsigned char *pointer); + + virtual const char *get_name() const { + return "Packer_point_nativedouble_4"; + } + }; + class Packer_argb_packed : public Packer_color { public: virtual const LVecBase4f &get_data4f(const unsigned char *pointer); diff --git a/panda/src/gobj/geomVertexData.cxx b/panda/src/gobj/geomVertexData.cxx index d1001a3abf..2c61b8db31 100644 --- a/panda/src/gobj/geomVertexData.cxx +++ b/panda/src/gobj/geomVertexData.cxx @@ -2262,6 +2262,16 @@ set_num_rows(int n) { pointer += stride; } break; + + case NT_float64: + while (pointer < stop) { + PN_float64 *pi = (PN_float64 *)pointer; + for (int i = 0; i < num_values; i++) { + pi[i] = 1.0f; + } + pointer += stride; + } + break; } } diff --git a/panda/src/gobj/geomVertexReader.I b/panda/src/gobj/geomVertexReader.I index 1355f3f48b..a2c36fc81a 100644 --- a/panda/src/gobj/geomVertexReader.I +++ b/panda/src/gobj/geomVertexReader.I @@ -499,6 +499,58 @@ get_data4f() { return _packer->get_data4f(inc_pointer()); } +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexReader::get_data1d +// Access: Published +// Description: Returns the data associated with the read row, +// expressed as a 1-component value, and advances the +// read row. +//////////////////////////////////////////////////////////////////// +INLINE double GeomVertexReader:: +get_data1d() { + nassertr(has_column(), 0.0f); + return _packer->get_data1d(inc_pointer()); +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexReader::get_data2d +// Access: Published +// Description: Returns the data associated with the read row, +// expressed as a 2-component value, and advances the +// read row. +//////////////////////////////////////////////////////////////////// +INLINE const LVecBase2d &GeomVertexReader:: +get_data2d() { + nassertr(has_column(), LVecBase2d::zero()); + return _packer->get_data2d(inc_pointer()); +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexReader::get_data3d +// Access: Published +// Description: Returns the data associated with the read row, +// expressed as a 3-component value, and advances the +// read row. +//////////////////////////////////////////////////////////////////// +INLINE const LVecBase3d &GeomVertexReader:: +get_data3d() { + nassertr(has_column(), LVecBase3d::zero()); + return _packer->get_data3d(inc_pointer()); +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexReader::get_data4d +// Access: Published +// Description: Returns the data associated with the read row, +// expressed as a 4-component value, and advances the +// read row. +//////////////////////////////////////////////////////////////////// +INLINE const LVecBase4d &GeomVertexReader:: +get_data4d() { + nassertr(has_column(), LVecBase4d::zero()); + return _packer->get_data4d(inc_pointer()); +} + //////////////////////////////////////////////////////////////////// // Function: GeomVertexReader::get_data1i // Access: Published diff --git a/panda/src/gobj/geomVertexReader.h b/panda/src/gobj/geomVertexReader.h index 863fab1a27..43e93e959c 100644 --- a/panda/src/gobj/geomVertexReader.h +++ b/panda/src/gobj/geomVertexReader.h @@ -109,6 +109,11 @@ PUBLISHED: INLINE const LVecBase3f &get_data3f(); INLINE const LVecBase4f &get_data4f(); + INLINE double get_data1d(); + INLINE const LVecBase2d &get_data2d(); + INLINE const LVecBase3d &get_data3d(); + INLINE const LVecBase4d &get_data4d(); + INLINE int get_data1i(); INLINE const int *get_data2i(); INLINE const int *get_data3i(); diff --git a/panda/src/gobj/geomVertexWriter.I b/panda/src/gobj/geomVertexWriter.I index 6628df1214..13584da240 100644 --- a/panda/src/gobj/geomVertexWriter.I +++ b/panda/src/gobj/geomVertexWriter.I @@ -511,6 +511,108 @@ set_data4f(const LVecBase4f &data) { _packer->set_data4f(inc_pointer(), data); } +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexWriter::set_data1d +// Access: Published +// Description: Sets the write row to a particular 1-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_data1d(double data) { + nassertv(has_column()); + _packer->set_data1d(inc_pointer(), data); +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexWriter::set_data2d +// 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_data2d(double x, double y) { + set_data2d(LVecBase2d(x, y)); +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexWriter::set_data2d +// 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_data2d(const LVecBase2d &data) { + nassertv(has_column()); + _packer->set_data2d(inc_pointer(), data); +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexWriter::set_data3d +// 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_data3d(double x, double y, double z) { + set_data3d(LVecBase3d(x, y, z)); +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexWriter::set_data3d +// 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_data3d(const LVecBase3d &data) { + nassertv(has_column()); + _packer->set_data3d(inc_pointer(), data); +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexWriter::set_data4d +// 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_data4d(double x, double y, double z, double w) { + set_data4d(LVecBase4d(x, y, z, w)); +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexWriter::set_data4d +// 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_data4d(const LVecBase4d &data) { + nassertv(has_column()); + _packer->set_data4d(inc_pointer(), data); +} + //////////////////////////////////////////////////////////////////// // Function: GeomVertexWriter::set_data1i // Access: Published @@ -715,6 +817,108 @@ add_data4f(const LVecBase4f &data) { _packer->set_data4f(inc_add_pointer(), data); } +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexWriter::add_data1d +// Access: Published +// Description: Sets the write row to a particular 1-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_data1d(double data) { + nassertv(has_column()); + _packer->set_data1d(inc_add_pointer(), data); +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexWriter::add_data2d +// 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_data2d(double x, double y) { + add_data2d(LVecBase2d(x, y)); +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexWriter::add_data2d +// 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_data2d(const LVecBase2d &data) { + nassertv(has_column()); + _packer->set_data2d(inc_add_pointer(), data); +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexWriter::add_data3d +// 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_data3d(double x, double y, double z) { + add_data3d(LVecBase3d(x, y, z)); +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexWriter::add_data3d +// 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_data3d(const LVecBase3d &data) { + nassertv(has_column()); + _packer->set_data3d(inc_add_pointer(), data); +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexWriter::add_data4d +// 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_data4d(double x, double y, double z, double w) { + add_data4d(LVecBase4d(x, y, z, w)); +} + +//////////////////////////////////////////////////////////////////// +// Function: GeomVertexWriter::add_data4d +// 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_data4d(const LVecBase4d &data) { + nassertv(has_column()); + _packer->set_data4d(inc_add_pointer(), data); +} + //////////////////////////////////////////////////////////////////// // Function: GeomVertexWriter::add_data1i // Access: Published diff --git a/panda/src/gobj/geomVertexWriter.h b/panda/src/gobj/geomVertexWriter.h index eed9c64722..13cd5d1780 100644 --- a/panda/src/gobj/geomVertexWriter.h +++ b/panda/src/gobj/geomVertexWriter.h @@ -122,6 +122,14 @@ PUBLISHED: INLINE void set_data4f(float x, float y, float z, float w); INLINE void set_data4f(const LVecBase4f &data); + INLINE void set_data1d(double data); + INLINE void set_data2d(double x, double y); + INLINE void set_data2d(const LVecBase2d &data); + INLINE void set_data3d(double x, double y, double z); + INLINE void set_data3d(const LVecBase3d &data); + INLINE void set_data4d(double x, double y, double z, double w); + INLINE void set_data4d(const LVecBase4d &data); + INLINE void set_data1i(int data); INLINE void set_data2i(int a, int b); INLINE void set_data2i(const int data[2]); @@ -138,6 +146,14 @@ PUBLISHED: INLINE void add_data4f(float x, float y, float z, float w); INLINE void add_data4f(const LVecBase4f &data); + INLINE void add_data1d(double data); + INLINE void add_data2d(double x, double y); + INLINE void add_data2d(const LVecBase2d &data); + INLINE void add_data3d(double x, double y, double z); + INLINE void add_data3d(const LVecBase3d &data); + INLINE void add_data4d(double x, double y, double z, double w); + INLINE void add_data4d(const LVecBase4d &data); + INLINE void add_data1i(int data); INLINE void add_data2i(int a, int b); INLINE void add_data2i(const int data[2]);