Main Page Namespace List Class Hierarchy Alphabetical List Compound List File List Namespace Members Compound Members File Members Related Pages

# OgreMeshSerializer.cpp

Go to the documentation of this file.

    00001 /*
    00002 -----------------------------------------------------------------------------
    00003 This source file is part of OGRE
    00004     (Object-oriented Graphics Rendering Engine)
    00005 For the latest info, see http://www.ogre3d.org/
    00006
    00007 Copyright © 2000-2002 The OGRE Team
    00008 Also see acknowledgements in Readme.html
    00009
    00010 This program is free software; you can redistribute it and/or modify it under
    00011 the terms of the GNU Lesser General Public License as published by the Free Software
    00012 Foundation; either version 2 of the License, or (at your option) any later
    00013 version.
    00014
    00015 This program is distributed in the hope that it will be useful, but WITHOUT
    00016 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
    00017 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
    00018
    00019 You should have received a copy of the GNU Lesser General Public License along with
    00020 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
    00021 Place - Suite 330, Boston, MA 02111-1307, USA, or go to
    00022 http://www.gnu.org/copyleft/lesser.txt.
    00023 -----------------------------------------------------------------------------
    00024 */
    00025 #include "OgreStableHeaders.h"
    00026
    00027 #include "OgreMeshSerializer.h"
    00028 #include "OgreMeshFileFormat.h"
    00029 #include "OgreMesh.h"
    00030 #include "OgreSubMesh.h"
    00031 #include "OgreException.h"
    00032 #include "OgreMaterialManager.h"
    00033 #include "OgreLogManager.h"
    00034 #include "OgreSkeleton.h"
    00035
    00036 namespace Ogre {
    00037
    00038     String MeshSerializer::msCurrentVersion = "[MeshSerializer_v1.30]";
    00039     const unsigned short HEADER_CHUNK_ID = 0x1000;
    00040     //---------------------------------------------------------------------
    00041     MeshSerializer::MeshSerializer()
    00042     {
    00043         // Set up map
    00044         mImplementations.insert(
    00045             MeshSerializerImplMap::value_type("[MeshSerializer_v1.10]",
    00046             new MeshSerializerImpl_v1_1() ) );
    00047
    00048         mImplementations.insert(
    00049             MeshSerializerImplMap::value_type("[MeshSerializer_v1.20]",
    00050             new MeshSerializerImpl_v1_2() ) );
    00051
    00052         mImplementations.insert(
    00053             MeshSerializerImplMap::value_type(msCurrentVersion,
    00054             new MeshSerializerImpl() ) );
    00055     }
    00056     //---------------------------------------------------------------------
    00057     MeshSerializer::~MeshSerializer()
    00058     {
    00059         // delete map
    00060         for (MeshSerializerImplMap::iterator i = mImplementations.begin();
    00061             i != mImplementations.end(); ++i)
    00062         {
    00063             delete i->second;
    00064         }
    00065         mImplementations.clear();
    00066
    00067     }
    00068     //---------------------------------------------------------------------
    00069     void MeshSerializer::exportMesh(const Mesh* pMesh, const String& filename)
    00070     {
    00071         MeshSerializerImplMap::iterator impl = mImplementations.find(msCurrentVersion);
    00072         if (impl == mImplementations.end())
    00073         {
    00074             Except(Exception::ERR_INTERNAL_ERROR, "Cannot find serializer implementation for "
    00075                 "current version " + msCurrentVersion, "MeshSerializer::exportMesh");
    00076         }
    00077
    00078         impl->second->exportMesh(pMesh, filename);
    00079     }
    00080     //---------------------------------------------------------------------
    00081     void MeshSerializer::importMesh(DataChunk& chunk, Mesh* pDest)
    00082     {
    00083         // Read header and determine the version
    00084         unsigned short headerID;
    00085
    00086         // Read header ID
    00087         readShorts(chunk, &headerID, 1);
    00088
    00089         if (headerID != HEADER_CHUNK_ID)
    00090         {
    00091             Except(Exception::ERR_INTERNAL_ERROR, "File header not found",
    00092                 "MeshSerializer::importMesh");
    00093         }
    00094         // Read version
    00095         String ver = readString(chunk);
    00096         // Jump back to start
    00097         chunk.seek(0);
    00098
    00099         // Find the implementation to use
    00100         MeshSerializerImplMap::iterator impl = mImplementations.find(ver);
    00101         if (impl == mImplementations.end())
    00102         {
    00103             Except(Exception::ERR_INTERNAL_ERROR, "Cannot find serializer implementation for "
    00104                 "current version " + ver, "MeshSerializer::importMesh");
    00105         }
    00106
    00107         // Call implementation
    00108         impl->second->importMesh(chunk, pDest);
    00109         // Warn on old version of mesh
    00110         if (ver != msCurrentVersion)
    00111         {
    00112             LogManager::getSingleton().logMessage("WARNING: " + pDest->getName() +
    00113                 " is an older format (" + ver + "); you should upgrade it as soon as possible" +
    00114                 " using the OgreMeshUpgrade tool.");
    00115         }
    00116
    00117     }
    00118     //---------------------------------------------------------------------
    00119
    00120 }
    00121

Copyright © 2002-2003 by The OGRE Team
Last modified Sun Nov 28 19:48:35 2004