| 1 | |
|---|
| 2 | |
|---|
| 3 | |
|---|
| 4 | |
|---|
| 5 | |
|---|
| 6 | |
|---|
| 7 | |
|---|
| 8 | |
|---|
| 9 | |
|---|
| 10 | |
|---|
| 11 | |
|---|
| 12 | |
|---|
| 13 | |
|---|
| 14 | #include "domSourceReader.h" |
|---|
| 15 | |
|---|
| 16 | #include <dom/domSource.h> |
|---|
| 17 | |
|---|
| 18 | using namespace osgDAE; |
|---|
| 19 | |
|---|
| 20 | domSourceReader::domSourceReader() : m_array_type( None ), m_count( 0 ), srcInit( NULL ) |
|---|
| 21 | {} |
|---|
| 22 | |
|---|
| 23 | domSourceReader::domSourceReader( domSource *src ) : m_array_type( None ), m_count( 0 ), srcInit( src ) |
|---|
| 24 | { |
|---|
| 25 | } |
|---|
| 26 | |
|---|
| 27 | void domSourceReader::convert(bool doublePrecision) |
|---|
| 28 | { |
|---|
| 29 | domSource * src = srcInit; |
|---|
| 30 | srcInit = NULL; |
|---|
| 31 | domSource::domTechnique_common* technique = src->getTechnique_common(); |
|---|
| 32 | if ( technique == NULL ) |
|---|
| 33 | { |
|---|
| 34 | OSG_WARN<<"Warning: IntDaeSource::createFrom: Unable to find COMMON technique"<<std::endl; |
|---|
| 35 | return; |
|---|
| 36 | } |
|---|
| 37 | |
|---|
| 38 | domAccessor* accessor = technique->getAccessor(); |
|---|
| 39 | int stride = accessor->getStride(); |
|---|
| 40 | m_count = accessor->getCount(); |
|---|
| 41 | |
|---|
| 42 | |
|---|
| 43 | daeDoubleArray* float_array = NULL; |
|---|
| 44 | if (src->getFloat_array()) |
|---|
| 45 | { |
|---|
| 46 | float_array = &(src->getFloat_array()->getValue()); |
|---|
| 47 | } |
|---|
| 48 | else if (src->getName_array()) |
|---|
| 49 | { |
|---|
| 50 | m_array_type = String; |
|---|
| 51 | return; |
|---|
| 52 | } |
|---|
| 53 | |
|---|
| 54 | switch (stride) |
|---|
| 55 | { |
|---|
| 56 | case 1: |
|---|
| 57 | m_array_type = Float; |
|---|
| 58 | m_float_array = new osg::FloatArray(); |
|---|
| 59 | break; |
|---|
| 60 | case 2: |
|---|
| 61 | if (!doublePrecision) |
|---|
| 62 | { |
|---|
| 63 | m_array_type = Vec2; |
|---|
| 64 | m_vec2_array = new osg::Vec2Array(); |
|---|
| 65 | } |
|---|
| 66 | else |
|---|
| 67 | { |
|---|
| 68 | m_array_type = Vec2d; |
|---|
| 69 | m_vec2d_array = new osg::Vec2dArray(); |
|---|
| 70 | } |
|---|
| 71 | break; |
|---|
| 72 | case 3: |
|---|
| 73 | if (!doublePrecision) |
|---|
| 74 | { |
|---|
| 75 | m_array_type = Vec3; |
|---|
| 76 | m_vec3_array = new osg::Vec3Array(); |
|---|
| 77 | } |
|---|
| 78 | else |
|---|
| 79 | { |
|---|
| 80 | m_array_type = Vec3d; |
|---|
| 81 | m_vec3d_array = new osg::Vec3dArray(); |
|---|
| 82 | } |
|---|
| 83 | break; |
|---|
| 84 | case 4: |
|---|
| 85 | if (!doublePrecision) |
|---|
| 86 | { |
|---|
| 87 | m_array_type = Vec4; |
|---|
| 88 | m_vec4_array = new osg::Vec4Array(); |
|---|
| 89 | } |
|---|
| 90 | else |
|---|
| 91 | { |
|---|
| 92 | m_array_type = Vec4d; |
|---|
| 93 | m_vec4d_array = new osg::Vec4dArray(); |
|---|
| 94 | } |
|---|
| 95 | break; |
|---|
| 96 | case 16: |
|---|
| 97 | m_array_type = Matrix; |
|---|
| 98 | m_matrix_array = new osg::MatrixfArray(); |
|---|
| 99 | break; |
|---|
| 100 | default: |
|---|
| 101 | OSG_WARN<<"Unsupported stride: "<<stride<<std::endl; |
|---|
| 102 | return; |
|---|
| 103 | } |
|---|
| 104 | |
|---|
| 105 | if (float_array) |
|---|
| 106 | { |
|---|
| 107 | daeDoubleArray& va = *float_array; |
|---|
| 108 | switch (m_array_type) |
|---|
| 109 | { |
|---|
| 110 | case Float: |
|---|
| 111 | for ( size_t i = 0; i < accessor->getCount(); i++ ) { |
|---|
| 112 | m_float_array->push_back(va[i]); |
|---|
| 113 | } |
|---|
| 114 | break; |
|---|
| 115 | case Vec2: |
|---|
| 116 | for ( size_t i = 0; i < accessor->getCount(); i++ ) { |
|---|
| 117 | m_vec2_array->push_back( osg::Vec2( va[i*2], va[i*2+1])); |
|---|
| 118 | } |
|---|
| 119 | break; |
|---|
| 120 | case Vec2d: |
|---|
| 121 | for ( size_t i = 0; i < accessor->getCount(); i++ ) { |
|---|
| 122 | m_vec2d_array->push_back( osg::Vec2d( va[i*2], va[i*2+1])); |
|---|
| 123 | } |
|---|
| 124 | break; |
|---|
| 125 | case Vec3: |
|---|
| 126 | for ( size_t i = 0; i < accessor->getCount(); i++ ) { |
|---|
| 127 | m_vec3_array->push_back( osg::Vec3( va[i*3], va[i*3+1], va[i*3+2])); |
|---|
| 128 | } |
|---|
| 129 | break; |
|---|
| 130 | case Vec3d: |
|---|
| 131 | for ( size_t i = 0; i < accessor->getCount(); i++ ) { |
|---|
| 132 | m_vec3d_array->push_back( osg::Vec3d( va[i*3], va[i*3+1], va[i*3+2])); |
|---|
| 133 | } |
|---|
| 134 | break; |
|---|
| 135 | case Vec4: |
|---|
| 136 | for ( size_t i = 0; i < accessor->getCount(); i++ ) { |
|---|
| 137 | m_vec4_array->push_back( osg::Vec4( va[i*4], va[i*4+1], va[i*4+2], va[i*4+3])); |
|---|
| 138 | } |
|---|
| 139 | break; |
|---|
| 140 | case Vec4d: |
|---|
| 141 | for ( size_t i = 0; i < accessor->getCount(); i++ ) { |
|---|
| 142 | m_vec4d_array->push_back( osg::Vec4d( va[i*4], va[i*4+1], va[i*4+2], va[i*4+3])); |
|---|
| 143 | } |
|---|
| 144 | break; |
|---|
| 145 | case Matrix: |
|---|
| 146 | for ( size_t i = 0; i < accessor->getCount(); i++ ) { |
|---|
| 147 | m_matrix_array->push_back(osg::Matrixf( va[i*16+0], va[i*16+4], va[i*16+8], va[i*16+12], |
|---|
| 148 | va[i*16+1], va[i*16+5], va[i*16+9], va[i*16+13], |
|---|
| 149 | va[i*16+2], va[i*16+6], va[i*16+10], va[i*16+14], |
|---|
| 150 | va[i*16+3], va[i*16+7], va[i*16+11], va[i*16+15])); |
|---|
| 151 | } |
|---|
| 152 | break; |
|---|
| 153 | default: |
|---|
| 154 | OSG_WARN << "Unsupported stride in Source: " << stride << std::endl; |
|---|
| 155 | return; |
|---|
| 156 | } |
|---|
| 157 | } |
|---|
| 158 | else |
|---|
| 159 | { |
|---|
| 160 | OSG_WARN << "No float array found" << std::endl; |
|---|
| 161 | } |
|---|
| 162 | } |
|---|