📄 lightsourcepalettemanager.cpp
字号:
/* * 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 "LightSourcePaletteManager.h"#include "DataOutputStream.h"#include "Opcodes.h"#include <osg/Notify>#include <osg/Light>#include <osg/Vec4f>#include <cassert>#include <sstream>#include <stdio.h>namespace flt{LightSourcePaletteManager::LightSourcePaletteManager( ExportOptions& fltOpt ) : _fltOpt( fltOpt ), _currIndex( -1 ){ // TODO: Pay attention to the version here(?)}int LightSourcePaletteManager::add(osg::Light const* light){ int index = -1; if (light == NULL) return -1; // If this light has already been cached, set 'index' to the cached value LightPalette::const_iterator it = _lightPalette.find(light); if ( it != _lightPalette.end() ) { index = it->second.Index; } // New light? Add it to the cache... else { index = ++_currIndex; _lightPalette.insert(std::make_pair(light, LightRecord(light, index) ) ); } return index;}voidLightSourcePaletteManager::write( DataOutputStream& dos ) const{ using osg::Vec4f; static int const INFINITE_LIGHT = 0; static int const LOCAL_LIGHT = 1; static int const SPOT_LIGHT = 2; LightPalette::const_iterator it = _lightPalette.begin(); for ( ; it != _lightPalette.end(); ++it) { LightRecord m = it->second; static char lightName[64]; sprintf(lightName, "Light%02d", m.Light->getLightNum() ); int lightType = INFINITE_LIGHT; Vec4f const& lightPos = m.Light->getPosition(); if (lightPos.w() != 0) { if (m.Light->getSpotCutoff() < 180) lightType = SPOT_LIGHT; else lightType = LOCAL_LIGHT; } dos.writeInt16( (int16) LIGHT_SOURCE_PALETTE_OP ); dos.writeInt16( 240 ); dos.writeInt32( m.Index ); dos.writeFill(2*4, '\0'); // Reserved dos.writeString( lightName, 20 ); dos.writeFill(4, '\0'); // Reserved dos.writeVec4f(m.Light->getAmbient() ); dos.writeVec4f(m.Light->getDiffuse() ); dos.writeVec4f(m.Light->getSpecular() ); dos.writeInt32(lightType); dos.writeFill(4*10, '\0'); // Reserved dos.writeFloat32(m.Light->getSpotExponent() ); dos.writeFloat32(m.Light->getSpotCutoff() ); dos.writeFloat32(0); // Yaw (N/A) dos.writeFloat32(0); // Pitch (N/A) dos.writeFloat32(m.Light->getConstantAttenuation() ); dos.writeFloat32(m.Light->getLinearAttenuation() ); dos.writeFloat32(m.Light->getQuadraticAttenuation() ); dos.writeInt32(0); // Modeling flag (N/A) dos.writeFill(4*19, '\0'); // Reserved }}} // End namespace fltexp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -