00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef VRS_CONTAINER_PACKEDVERTEXITERATOR_H
00035 #define VRS_CONTAINER_PACKEDVERTEXITERATOR_H
00036
00037 #include <vrs/container/iterator.h>
00038 #include <vrs/container/stl_serialization.h>
00039 #include <vrs/vector.h>
00040 #include <vector>
00041
00042 namespace VRS {
00043
00052 template<typename VECTOR>
00053 class PackedVertexIteratorBase :
00054 public Iterator<VECTOR>
00055 {
00056 public:
00057 VRS_TYPEINFO(PackedVertexIteratorBase, Iterator<VECTOR>);
00058 VRS_SERIALIZABLE(PackedVertexIteratorBase);
00059
00060 public:
00061 PackedVertexIteratorBase(
00062 SO<Iterator<VECTOR> > vertices
00063 ) :
00064 Iterator<Vector>(),
00065 m_offset(),
00066 m_vertices()
00067 {
00068 if(!vertices || (vertices->size() == 0)) { return; }
00069
00070 m_offset = vertices->get(0);
00071
00072 m_vertices.resize(vertices->size());
00073 for(unsigned int i = 0, iEnd = vertices->size(); i < iEnd; ++i) {
00074 const Vector v = vertices->get(i) - m_offset;
00075 m_vertices[i] = Vertex3f(
00076 static_cast<float>(v[0]),
00077 static_cast<float>(v[1]),
00078 static_cast<float>(v[2])
00079 );
00080 }
00081 }
00082
00083 public:
00084 virtual unsigned int size() const {
00085 return static_cast<unsigned int>(m_vertices.size());
00086 }
00087
00088 virtual VECTOR get(
00089 unsigned int i
00090 ) const {
00091 return (m_offset + VECTOR(m_vertices[i][0], m_vertices[i][1], m_vertices[i][2]));
00092 }
00093
00094 public:
00095 virtual void translate(
00096 const VRS::Vector& offset
00097 ) {
00098 m_offset += offset;
00099 }
00100
00101 protected:
00102 PackedVertexIteratorBase() { }
00103
00104 private:
00105 typedef VertexData<3, float> Vertex3f;
00106 VECTOR m_offset;
00107 std::vector<Vertex3f> m_vertices;
00108 };
00109
00110 template<typename VECTOR>
00111 void PackedVertexIteratorBase<VECTOR>::serialize(
00112 SerializationManager& manager
00113 ) {
00114 UINT8 version = 0;
00115 manager.classVersion(version);
00116
00117 VRS_SERIALIZATION_PARENT_CLASS(manager, Iterator<VECTOR>);
00118 serialization(manager, "offset", m_offset);
00119 serialization(manager, "vertices", m_vertices);
00120 }
00121
00122 VRS_SERIALIZATION_REGISTRATION_TEMPLATE(PackedVertexIteratorBase);
00123
00124 typedef PackedVertexIteratorBase<Vector> PackedVertexIterator;
00125
00126 }
00127
00128 #endif // VRS_CONTAINER_PACKEDVERTEXITERATOR_H