/**************************************************************************\ * Copyright (c) Kongsberg Oil & Gas Technologies AS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the copyright holder nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\**************************************************************************//*! \class SoGLEnvironmentElement Inventor/elements/SoGLEnvironmentElement.h \brief The SoGLEnvironmentElement class is for setting GL fog etc. \ingroup elements*/#include <Inventor/elements/SoGLEnvironmentElement.h>#include <Inventor/elements/SoViewVolumeElement.h>#include <Inventor/SbColor4f.h>#include "coindefs.h"#ifdef HAVE_CONFIG_H#include <config.h>#endif // HAVE_CONFIG_H#include <Inventor/system/gl.h>#include <cassert>SO_ELEMENT_SOURCE(SoGLEnvironmentElement);/*! This static method initializes static data for the SoGLEnvironmentElement class.*/voidSoGLEnvironmentElement::initClass(){SO_ELEMENT_INIT_CLASS(SoGLEnvironmentElement,inherited);}/*! The destructor.*/SoGLEnvironmentElement::~SoGLEnvironmentElement(){}voidSoGLEnvironmentElement::init(SoState*state){inherited::init(state);}voidSoGLEnvironmentElement::pop(SoState*COIN_UNUSED_ARG(state),constSoElement*prevTopElement){this->capture(state);this->updategl(state);}voidSoGLEnvironmentElement::setElt(SoState*conststateptr,constfloatambientIntensityarg,constSbColor&ambientColorarg,constSbVec3f&attenuationarg,constint32_tfogTypearg,constSbColor&fogColorarg,constfloatfogVisibilityarg,constfloatfogStartarg){inherited::setElt(stateptr,ambientIntensityarg,ambientColorarg,attenuationarg,fogTypearg,fogColorarg,fogVisibilityarg,fogStartarg);this->updategl(stateptr);}//! FIXME: write doc.voidSoGLEnvironmentElement::updategl(SoState*conststate){floatambient[4];ambient[0]=ambientColor[0]*ambientIntensity;ambient[1]=ambientColor[1]*ambientIntensity;ambient[2]=ambientColor[2]*ambientIntensity;ambient[3]=1.0f;glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambient);if(fogType==(int)NONE){glDisable(GL_FOG);return;}floatnearval=1.0f;floatfarval=10.0f;constSbViewVolume&vv=SoViewVolumeElement::get(state);nearval=vv.getNearDist();farval=nearval+vv.getDepth();floatdist=fogVisibility;if(dist>0.0f)farval=dist;switch(fogType){caseHAZE:glFogi(GL_FOG_MODE,GL_LINEAR);glFogf(GL_FOG_START,this->fogStart);glFogf(GL_FOG_END,farval);break;caseFOG:glFogi(GL_FOG_MODE,GL_EXP);// formula used for finding density://// 1/256 = e ^ -(density * farval)//// ln (1/256) = ln (e ^ -(density * farval))//// -5.545 = - density * farval//// density = 5.545 / farval;glFogf(GL_FOG_DENSITY,5.545f/farval);break;caseSMOKE:glFogi(GL_FOG_MODE,GL_EXP2);// formula used for finding density://// 1/256 = e ^ (-(density * farval)^2)//// ln (1/256) = ln (e ^ (-(density * farval)^2))//// -5.545 = - (density * farval)^2//// sqrt(5.545) = density * farval//// density = 2.35 / farval//glFogf(GL_FOG_DENSITY,2.35f/farval);break;default:assert(0&&"unknown fog type");break;}SbColor4fcolor(fogColor,1.0f);glFogfv(GL_FOG_COLOR,color.getValue());glEnable(GL_FOG);}