From ef322aba613ce883429d2cf8138a5ac05ba9d6c0 Mon Sep 17 00:00:00 2001 From: Paul MARTZ Date: Mon, 23 May 2011 15:29:40 +0000 Subject: [PATCH] 2.8 branch: Doubly odd. Not sure why the merge didn't mark the Texture2DMultisample files for addition... --- src/osg/Texture2DMultisample.cpp | 143 +++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 src/osg/Texture2DMultisample.cpp diff --git a/src/osg/Texture2DMultisample.cpp b/src/osg/Texture2DMultisample.cpp new file mode 100644 index 000000000..8b16502c9 --- /dev/null +++ b/src/osg/Texture2DMultisample.cpp @@ -0,0 +1,143 @@ +/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2010 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. + * + * Texture2DMultisample codes Copyright (C) 2010 Marcin Hajder + * Thanks to to my company http://www.ai.com.pl for allowing me free this work. +*/ + +#include +#include +#include +#include + +using namespace osg; + +Texture2DMultisample::Texture2DMultisample(): + _textureWidth(0), + _textureHeight(0), + _numSamples(1), + _fixedsamplelocations(GL_FALSE) +{ +} + +Texture2DMultisample::Texture2DMultisample(GLsizei numSamples, GLboolean fixedsamplelocations): + _textureWidth(0), + _textureHeight(0), + _numSamples(numSamples), + _fixedsamplelocations(fixedsamplelocations) +{ +} + +Texture2DMultisample::Texture2DMultisample(const Texture2DMultisample& text,const CopyOp& copyop): + Texture(text,copyop), + _textureWidth(text._textureWidth), + _textureHeight(text._textureHeight), + _numSamples(text._numSamples), + _fixedsamplelocations(text._fixedsamplelocations) +{ +} + +Texture2DMultisample::~Texture2DMultisample() +{ +} + +int Texture2DMultisample::compare(const StateAttribute& sa) const +{ + // check the types are equal and then create the rhs variable + // used by the COMPARE_StateAttribute_Parameter macro's below. + COMPARE_StateAttribute_Types(Texture2DMultisample,sa) + + + int result = compareTexture(rhs); + if (result!=0) return result; + + // compare each parameter in turn against the rhs. + if (_textureWidth != 0 && rhs._textureWidth != 0) + { + COMPARE_StateAttribute_Parameter(_textureWidth) + } + if (_textureHeight != 0 && rhs._textureHeight != 0) + { + COMPARE_StateAttribute_Parameter(_textureHeight) + } + if (_numSamples != 0 && rhs._numSamples != 0) + { + COMPARE_StateAttribute_Parameter(_numSamples) + } + if (_fixedsamplelocations != 0 && rhs._fixedsamplelocations != 0) + { + COMPARE_StateAttribute_Parameter(_fixedsamplelocations) + } + + + return 0; // passed all the above comparison macro's, must be equal. +} + +void Texture2DMultisample::apply(State& state) const +{ + // current OpenGL context. + const unsigned int contextID = state.getContextID(); + const Extensions* extensions = getExtensions(contextID,true); + if (!extensions->isTextureMultisampledSupported()) + { + OSG_INFO<<"Texture2DMultisample not supoorted."<getApplyTime())); + tom->getNumberApplied()++; +#endif + + // get the texture object for the current contextID. + TextureObject* textureObject = getTextureObject(contextID); + + if (textureObject) + { + textureObject->bind(); + } + else if ( (_textureWidth!=0) && (_textureHeight!=0) && (_numSamples!=0) ) + { + _textureObjectBuffer[contextID] = textureObject = + generateTextureObject( // this, // added to 2.9.x, not part of 2.8.x + contextID, + getTextureTarget(), + 1, + _internalFormat, + _textureWidth, + _textureHeight, + 1, + _borderWidth); + + textureObject->bind(); + + extensions->glTexImage2DMultisample( getTextureTarget(), + _numSamples, + _internalFormat, + _textureWidth, + _textureHeight, + _fixedsamplelocations ); + + } + else + { + glBindTexture( getTextureTarget(), 0 ); + } +} + +void Texture2DMultisample::computeInternalFormat() const +{ + computeInternalFormatType(); +} +