layer.cpp

来自「最新osg包」· C++ 代码 · 共 292 行

CPP
292
字号
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2008 Robert Osfield  * * This library is open source and may be redistributed and/or modified under   * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or  * (at your option) any later version.  The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. *  * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  * OpenSceneGraph Public License for more details.*/#include "Exception.h"#include "Layer.h"#include "Locator.h"#include "Object.h"#include "Locator.h"#include "ImageLayer.h"#include "HeightFieldLayer.h"#include "CompositeLayer.h"#include "SwitchLayer.h"#include <osgDB/ReadFile>using namespace ive;void Layer::write(DataOutputStream* out){    // Write Layer's identification.    out->writeInt(IVELAYER);    // If the osg class is inherited by any other class we should also write this to file.    osg::Object*  object = dynamic_cast<osg::Object*>(this);    if (object)        ((ive::Object*)(object))->write(out);    else        throw Exception("Layer::write(): Could not cast this osgLayer::Layer to an osg::Object.");     if (out->getVersion() >= VERSION_0023)    {        out->writeLocator(getLocator());        if (out->getVersion() >= VERSION_0034)        {            out->writeUInt(getMinFilter());            out->writeUInt(getMagFilter());        }        else        {            out->writeUInt((getMagFilter()==osg::Texture::LINEAR) ? 1 : 0);        }    }    else    {        LayerHelper helper;        helper.writeLocator(out, getLocator());    }            out->writeUInt(getMinLevel());    out->writeUInt(getMaxLevel());    if (out->getVersion() >= VERSION_0027)    {        writeValidDataOperator(out,getValidDataOperator());    }}void Layer::read(DataInputStream* in){    // Peek on Layer's identification.    int id = in->peekInt();    if (id != IVELAYER)        throw Exception("Layer::read(): Expected Layer identification.");        // Read Layer's identification.    id = in->readInt();    // If the osg class is inherited by any other class we should also read this from file.    osg::Object*  object = dynamic_cast<osg::Object*>(this);    if(object)        ((ive::Object*)(object))->read(in);    else        throw Exception("Layer::read(): Could not cast this osgLayer::Layer to an osg::Group.");    if (in->getVersion() >= VERSION_0023)    {        setLocator(in->readLocator());        if (in->getVersion() >= VERSION_0034)        {            setMinFilter(osg::Texture::FilterMode(in->readUInt()));            setMagFilter(osg::Texture::FilterMode(in->readUInt()));        }        else        {            setMagFilter(in->readUInt()==0 ? osg::Texture::NEAREST : osg::Texture::LINEAR);        }    }    else    {        LayerHelper helper;        setLocator(helper.readLocator(in));    }    setMinLevel(in->readUInt());    setMaxLevel(in->readUInt());    if (in->getVersion() >= VERSION_0027)    {        setValidDataOperator(readValidDataOperator(in));    }}void LayerHelper::writeLayer(DataOutputStream* out, osgTerrain::Layer* layer){    if (layer)     {        out->writeBool(true);        if (dynamic_cast<osgTerrain::HeightFieldLayer*>(layer))        {            ((ive::HeightFieldLayer*)(layer))->write(out);        }        else if (dynamic_cast<osgTerrain::ImageLayer*>(layer))        {            ((ive::ImageLayer*)(layer))->write(out);        }        else if (dynamic_cast<osgTerrain::SwitchLayer*>(layer))        {            ((ive::SwitchLayer*)(layer))->write(out);        }        else if (dynamic_cast<osgTerrain::CompositeLayer*>(layer))        {            ((ive::CompositeLayer*)(layer))->write(out);        }        else if (dynamic_cast<osgTerrain::ProxyLayer*>(layer))        {            out->writeInt(IVEPROXYLAYER);            out->writeString(layer->getFileName());            osgTerrain::Locator* locator = layer->getLocator();            bool writeOutLocator = locator && !locator->getDefinedInFile();            writeLocator(out, writeOutLocator ? locator : 0 );            out->writeUInt(layer->getMinLevel());            out->writeUInt(layer->getMaxLevel());        }    }    else    {        out->writeBool(false);    }}osgTerrain::Layer* LayerHelper::readLayer(DataInputStream* in){    bool layerExist = in->readBool();    if (!layerExist) return 0;    int id = in->peekInt();    if (id==IVEHEIGHTFIELDLAYER)    {        osgTerrain::HeightFieldLayer* layer = new osgTerrain::HeightFieldLayer;        ((ive::HeightFieldLayer*)(layer))->read(in);        return layer;    }    else if (id==IVEIMAGELAYER)    {        osgTerrain::ImageLayer* layer = new osgTerrain::ImageLayer;        ((ive::ImageLayer*)(layer))->read(in);        return layer;    }    else if (id==IVESWITCHLAYER)    {        osgTerrain::SwitchLayer* layer = new osgTerrain::SwitchLayer;        ((ive::SwitchLayer*)(layer))->read(in);        return layer;    }    else if (id==IVECOMPOSITELAYER)    {        osgTerrain::CompositeLayer* layer = new osgTerrain::CompositeLayer;        ((ive::CompositeLayer*)(layer))->read(in);        return layer;    }    else if (id==IVEPROXYLAYER)    {        std::string filename = in->readString();        osg::ref_ptr<osg::Object> object = osgDB::readObjectFile(filename+".gdal");        osgTerrain::ProxyLayer* proxyLayer = dynamic_cast<osgTerrain::ProxyLayer*>(object.get());                osg::ref_ptr<osgTerrain::Locator> locator = readLocator(in);        unsigned int minLevel = in->readUInt();        unsigned int maxLevel = in->readUInt();                if (proxyLayer)        {            if (locator.valid()) proxyLayer->setLocator(locator.get());                        proxyLayer->setMinLevel(minLevel);            proxyLayer->setMaxLevel(maxLevel);        }                return proxyLayer;    }        return new osgTerrain::ImageLayer;}void LayerHelper::writeLocator(DataOutputStream* out, osgTerrain::Locator* locator){    if (locator)     {        out->writeBool(true);                ((ive::Locator*)(locator))->write(out);    }    else    {        out->writeBool(false);    }}osgTerrain::Locator* LayerHelper::readLocator(DataInputStream* in){    bool locatorExist = in->readBool();    if (!locatorExist) return 0;        osgTerrain::Locator* locator = new osgTerrain::Locator;        ((ive::Locator*)(locator))->read(in);        return locator;}void Layer::writeValidDataOperator(DataOutputStream* out, osgTerrain::ValidDataOperator* validDataOperator){    if (validDataOperator)    {        out->writeBool(true);        osgTerrain::ValidRange* validRange = dynamic_cast<osgTerrain::ValidRange*>(validDataOperator);        if (validRange)        {            out->writeInt(IVEVALIDRANGE);            out->writeFloat(validRange->getMinValue());            out->writeFloat(validRange->getMaxValue());        }        else         {                osgTerrain::NoDataValue* noDataValue  = dynamic_cast<osgTerrain::NoDataValue*>(validDataOperator);            if (noDataValue)            {                out->writeInt(IVENODATAVALUE);                out->writeFloat(noDataValue->getValue());            }        }    }    else    {        out->writeBool(false);    }}osgTerrain::ValidDataOperator* Layer::readValidDataOperator(DataInputStream* in){    bool hasOperator = in->readBool();    if (!hasOperator) return 0;        int id = in->peekInt();    if (id==IVEVALIDRANGE)    {        id = in->readInt();        float minValue = in->readFloat();        float maxValue = in->readFloat();        return new osgTerrain::ValidRange(minValue,maxValue);            }    else if (id==IVENODATAVALUE)    {        id = in->readInt();        float value = in->readFloat();        return new osgTerrain::NoDataValue(value);    }    else    {        return 0;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?