Exemplo n.º 1
0
    void SceneEditingData::readData(const String& fileName)
    {
        String baseName, path;
        Ogre::StringUtil::splitFilename(fileName, baseName, path);
        if (Ogre::StringUtil::endsWith(baseName, ".scene"))
            baseName.erase(baseName.length() - (sizeof(".scene") - 1));

        String editDataFileName = path + baseName + ".SED";

        std::ifstream stream;
        stream.open(editDataFileName.c_str());

        if (stream)
        {
            Ogre::DataStreamPtr ifStream( new Ogre::FileStreamDataStream(&stream, false) );

            String line;

            while (!ifStream->eof())
            {
                line = ifStream->getLine();

                Ogre::StringVector para = Ogre::StringUtil::split(line);

                if ( para[0] == "ReshapeLeft" )
                {
                    mTerrainReshapeSize.left = Ogre::StringConverter::parseInt(para[1]);
                }
                else if ( para[0] == "ReshapeRight" )
                {
                    mTerrainReshapeSize.right = Ogre::StringConverter::parseInt(para[1]);
                }
                else if ( para[0] == "ReshapeTop" )
                {
                    mTerrainReshapeSize.top = Ogre::StringConverter::parseInt(para[1]);
                }
                else if ( para[0] == "ReshapeBottom" )
                {
                    mTerrainReshapeSize.bottom = Ogre::StringConverter::parseInt(para[1]);
                }
            }
        }
    }
void CameraTrackSettingDialog::OnLoadTrack(wxCommandEvent& event)
{
    wxFileDialog fileDialog(this,
        _("Load track file"),
        "",
        "",
        "Track files (*.track)|*.track",
        wxOPEN | wxFILE_MUST_EXIST);

    if (fileDialog.ShowModal() != wxID_OK)
        return;

    // 先清除当前的轨迹
    ClearTrack();

    std::ifstream stream;
    stream.open( fileDialog.GetPath().c_str() );

    if (stream)
    {
        Ogre::DataStreamPtr ifStream( new Ogre::FileStreamDataStream(&stream, false) );

        Ogre::String line;

        line = ifStream->getAsString();

        Ogre::StringVector paras = Ogre::StringUtil::split(line, ",");

        if (paras.size() >= 2)
        {
            float length = Ogre::StringConverter::parseReal(paras[0]);

            if (!mCameraNode)
            {
                mCameraNode = mSceneManipulator->getBaseSceneNode()->createChildSceneNode();
            }

            if (mTrackClear)
            {
                mCameraAnimation = mSceneManipulator->getSceneManager()->createAnimation("CameraTrack", length);
                // Spline it for nice curves
                mCameraAnimation->setInterpolationMode(Ogre::Animation::IM_SPLINE);
                // Create a track to animate the camera's node
                mCameraTrack = mCameraAnimation->createNodeTrack(0, mCameraNode);
                mCameraAnimState = mSceneManipulator->getSceneManager()->createAnimationState("CameraTrack");
                mTrackClear = false;
            }

            unsigned int keyCount = Ogre::StringConverter::parseUnsignedInt(paras[1]);

            for (unsigned int i=0; i<keyCount; ++i)
            {
                Ogre::Vector3 pos = Ogre::StringConverter::parseVector3(paras[2 + i*3]);
                Ogre::Quaternion ori = Ogre::StringConverter::parseQuaternion(paras[3 + i*3]);
                float time = Ogre::StringConverter::parseReal(paras[4 + i*3]);

                Ogre::TransformKeyFrame* key = mCameraTrack->createNodeKeyFrame(time); // startposition
                key->setTranslate(pos);
                key->setRotation(ori);
            }

            RefreshCodeText();
        }
    }
}