//-----------------------------------------------------------------------
	void MeshReadHelper::calculateMeshInfo()
	{
		mNumVertices = 0;
		mSubMeshInfos.resize(0);

		if(!mMesh.isNull())
		{
			size_t numSubMeshes = mMesh->getNumSubMeshes();
			mSubMeshInfos.reserve(numSubMeshes + 1);

			if(mMesh->sharedVertexData)
				mNumVertices += mMesh->sharedVertexData->vertexCount;

			for(unsigned short j = 0; j != numSubMeshes; ++j)
			{
				SubMesh* subMesh = mMesh->getSubMesh(j);
				mSubMeshInfos.push_back(SubMeshInfo());
				SubMeshInfo& smi = mSubMeshInfos.back();
				smi.subMesh = subMesh;

				if(subMesh->useSharedVertices)
				{
					smi.vertexData = mMesh->sharedVertexData;
					smi.vertexStartInJoinedList = 0;
				}
				else
				{
					smi.vertexData = subMesh->vertexData;
					smi.vertexStartInJoinedList = mNumVertices;
					mNumVertices += subMesh->vertexData->vertexCount;
				}
				smi.vertexStart = smi.vertexData->vertexStart;
				smi.vertexCount = smi.vertexData->vertexCount;
				smi.indexData = subMesh->indexData;
				smi.indexStart = smi.indexData->indexStart;
				smi.indexCount = smi.indexData->indexCount;
			}
		}

		// 
		mSubMeshInfos.push_back(SubMeshInfo());
		SubMeshInfo& smi = mSubMeshInfos.back();
		smi.subMesh = nullptr;
		smi.vertexData = nullptr;
		smi.vertexStart = 0;
		smi.vertexCount = 0;
		smi.vertexStartInJoinedList = mNumVertices;
		smi.indexData = nullptr;
		smi.indexStart = 0;
		smi.indexCount = 0;
	}
void
OgreMeshReader::readSubMesh(SubMeshStore       &subMeshInfo,
                            VertexElementStore &sharedVertexElements,
                            bool                skelAnim             )
{
    OSG_OGRE_LOG(("OgreMeshReader::readSubMesh\n"));

    subMeshInfo.push_back((SubMeshInfo()));
    SubMeshInfo &smInfo = subMeshInfo.back();

    smInfo.matName       = readString(_is);
    smInfo.sharedVertex  = readBool  (_is);
    UInt32      idxCount = readUInt32(_is);
    bool        idx32Bit = readBool  (_is);

    OSG_OGRE_LOG(("OgreMeshReader::readSubMesh: matName '%s' sharedVert '%d' "
                  "idxCount '%d' idx32Bit '%d'\n",
                  smInfo.matName.c_str(), smInfo.sharedVertex, idxCount, idx32Bit));

    smInfo.skelAnim = skelAnim;
    smInfo.meshOp   = SMO_TRIANGLE_LIST;

    if(idx32Bit == true)
    {
        GeoUInt32PropertyUnrecPtr pi = GeoUInt32Property::create();
        pi->resize(idxCount);

        _is.read(reinterpret_cast<Char8 *>(&pi->editField().front()),
                 idxCount * sizeof(UInt32));

        smInfo.propIdx = pi;
    }
    else
    {
        GeoUInt16PropertyUnrecPtr pi = GeoUInt16Property::create();
        pi->resize(idxCount);

        _is.read(reinterpret_cast<Char8 *>(&pi->editField().front()),
                 idxCount * sizeof(UInt16));

        smInfo.propIdx = pi;
    }

    Int16 boneIdxVE    = -1;
    Int16 boneWeightVE = -1;
    bool  stop         = false;

    while(_is)
    {
        readChunkHeader(_is);

        switch(_header.chunkId)
        {
        case CHUNK_GEOMETRY:
            readGeometry(smInfo.vertexElements);
            break;

        case CHUNK_SUBMESH_OPERATION:
            readSubMeshOperation(smInfo);
            break;

        case CHUNK_SUBMESH_BONE_ASSIGNMENT:
            readSubMeshBoneAssignment(smInfo, boneIdxVE, boneWeightVE);
            break;

        case CHUNK_SUBMESH_TEXTURE_ALIAS:
            readSubMeshTextureAlias();
            break;

        default:
            OSG_OGRE_LOG(("OgreMeshReader::readSubMesh: Unknown chunkId '0x%x'\n",
                          _header.chunkId));
            stop = true;
            break;
        };

        if(stop == true)
        {
            skip(_is, -_chunkHeaderSize);
            break;
        }
    }

    if(boneIdxVE >= 0 || boneWeightVE >= 0)
    {
        verifyBoneAssignment(smInfo.vertexElements, boneIdxVE, boneWeightVE);
    }
}