Files
OpenSceneGraph/src/osgPlugins/OpenFlight/MaterialPaletteManager.cpp
2012-03-21 17:36:20 +00:00

116 lines
3.7 KiB
C++

/*
* 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 the 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.
*/
//
// Copyright(c) 2008 Skew Matrix Software LLC.
//
#include "MaterialPaletteManager.h"
#include "DataOutputStream.h"
#include "Opcodes.h"
#include <osg/Notify>
#include <osg/Material>
#include <osg/Vec4f>
#include <cassert>
#include <sstream>
namespace flt
{
MaterialPaletteManager::MaterialPaletteManager( ExportOptions& fltOpt )
: _currIndex( -1 ),
_fltOpt( fltOpt )
{
// TODO: Pay attention to the version here(?)
}
int MaterialPaletteManager::add(osg::Material const* material)
{
int index = -1;
if (material == NULL) return -1;
// If this material has already been cached, set 'index' to the cached value
MaterialPalette::const_iterator it = _materialPalette.find(material);
if ( it != _materialPalette.end() )
{
index = it->second.Index;
}
// New material? Add it to the cache...
else
{
index = ++_currIndex;
_materialPalette.insert(std::make_pair(material,
MaterialRecord(material, index) ) );
}
return index;
}
void
MaterialPaletteManager::write( DataOutputStream& dos ) const
{
using osg::Vec4f;
MaterialPalette::const_iterator it = _materialPalette.begin();
for ( ; it != _materialPalette.end(); ++it)
{
MaterialRecord m = it->second;
Vec4f const& ambient = m.Material->getAmbient(osg::Material::FRONT);
Vec4f const& diffuse = m.Material->getDiffuse(osg::Material::FRONT);
Vec4f const& specular = m.Material->getSpecular(osg::Material::FRONT);
Vec4f const& emissive = m.Material->getEmission(osg::Material::FRONT);
float shininess = m.Material->getShininess(osg::Material::FRONT);
dos.writeInt16( (int16) MATERIAL_PALETTE_OP );
dos.writeInt16( 84 ); // Length - FIXME: hard-code/FLT version?
dos.writeInt32( m.Index );
dos.writeString( m.Material->getName(), 12 );
dos.writeInt32( 0 ); // Flags
dos.writeFloat32(ambient.r() );
dos.writeFloat32(ambient.g() );
dos.writeFloat32(ambient.b() );
dos.writeFloat32(diffuse.r() );
dos.writeFloat32(diffuse.g() );
dos.writeFloat32(diffuse.b() );
dos.writeFloat32(specular.r() );
dos.writeFloat32(specular.g() );
dos.writeFloat32(specular.b() );
dos.writeFloat32(emissive.r() );
dos.writeFloat32(emissive.g() );
dos.writeFloat32(emissive.b() );
dos.writeFloat32(shininess);
dos.writeFloat32( diffuse.a() ); // alpha
dos.writeFloat32(1.0f); // 'Reserved' - unused
if (m.Material->getAmbientFrontAndBack() == false ||
m.Material->getDiffuseFrontAndBack() == false ||
m.Material->getSpecularFrontAndBack() == false ||
m.Material->getEmissionFrontAndBack() == false ||
m.Material->getShininessFrontAndBack() == false )
{
std::string warning( "fltexp: No support for different front and back material properties." );
OSG_WARN << warning << std::endl;
_fltOpt.getWriteResult().warn( warning );
}
}
}
} // End namespace fltexp