Introduced beginings of osgVolume NodeKit.
This commit is contained in:
47
include/osgVolume/Export
Normal file
47
include/osgVolume/Export
Normal file
@@ -0,0 +1,47 @@
|
||||
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 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.
|
||||
*/
|
||||
|
||||
#ifndef OSGVOLUME_EXPORT_
|
||||
#define OSGVOLUME_EXPORT_ 1
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#pragma warning( disable : 4244 )
|
||||
#pragma warning( disable : 4251 )
|
||||
#pragma warning( disable : 4267 )
|
||||
#pragma warning( disable : 4275 )
|
||||
#pragma warning( disable : 4290 )
|
||||
#pragma warning( disable : 4786 )
|
||||
#pragma warning( disable : 4305 )
|
||||
#pragma warning( disable : 4996 )
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER) || defined(__CYGWIN__) || defined(__MINGW32__) || defined( __BCPLUSPLUS__)
|
||||
# if defined( OSG_LIBRARY_STATIC )
|
||||
# define OSGVOLUME_EXPORT
|
||||
# elif defined( OSGVOLUME_LIBRARY )
|
||||
# define OSGVOLUME_EXPORT __declspec(dllexport)
|
||||
# else
|
||||
# define OSGVOLUME_EXPORT __declspec(dllimport)
|
||||
# endif
|
||||
#else
|
||||
# define OSGVOLUME_EXPORT
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
||||
\namespace osgVolume
|
||||
|
||||
The osgVolume library is a NodeKit that extends the core scene graph to support volume rendering.
|
||||
*/
|
||||
|
||||
#endif
|
||||
132
include/osgVolume/ImageUtils
Normal file
132
include/osgVolume/ImageUtils
Normal file
@@ -0,0 +1,132 @@
|
||||
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 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.
|
||||
*/
|
||||
|
||||
#ifndef OSGVOLUME_IMAGEUTILS
|
||||
#define OSGVOLUME_IMAGEUTILS 1
|
||||
|
||||
#include <osgVolume/Export>
|
||||
|
||||
#include <osg/Image>
|
||||
|
||||
namespace osgVolume {
|
||||
|
||||
template <typename T, class O>
|
||||
void _readRow(unsigned int num, GLenum pixelFormat, const T* data,float scale, O& operation)
|
||||
{
|
||||
switch(pixelFormat)
|
||||
{
|
||||
case(GL_LUMINANCE): { for(unsigned int i=0;i<num;++i) { float l = float(*data++)*scale; operation.luminance(l); } } break;
|
||||
case(GL_ALPHA): { for(unsigned int i=0;i<num;++i) { float a = float(*data++)*scale; operation.alpha(a); } } break;
|
||||
case(GL_LUMINANCE_ALPHA): { for(unsigned int i=0;i<num;++i) { float l = float(*data++)*scale; float a = float(*data++)*scale; operation.luminance_alpha(l,a); } } break;
|
||||
case(GL_RGB): { for(unsigned int i=0;i<num;++i) { float r = float(*data++)*scale; float g = float(*data++)*scale; float b = float(*data++)*scale; operation.rgb(r,g,b); } } break;
|
||||
case(GL_RGBA): { for(unsigned int i=0;i<num;++i) { float r = float(*data++)*scale; float g = float(*data++)*scale; float b = float(*data++)*scale; float a = float(*data++)*scale; operation.rgba(r,g,b,a); } } break;
|
||||
case(GL_BGR): { for(unsigned int i=0;i<num;++i) { float b = float(*data++)*scale; float g = float(*data++)*scale; float r = float(*data++)*scale; operation.rgb(r,g,b); } } break;
|
||||
case(GL_BGRA): { for(unsigned int i=0;i<num;++i) { float b = float(*data++)*scale; float g = float(*data++)*scale; float r = float(*data++)*scale; float a = float(*data++)*scale; operation.rgba(r,g,b,a); } } break;
|
||||
}
|
||||
}
|
||||
|
||||
template <class O>
|
||||
void readRow(unsigned int num, GLenum pixelFormat, GLenum dataType, const unsigned char* data, O& operation)
|
||||
{
|
||||
switch(dataType)
|
||||
{
|
||||
case(GL_BYTE): _readRow(num,pixelFormat, (const char*)data, 1.0f/128.0f, operation); break;
|
||||
case(GL_UNSIGNED_BYTE): _readRow(num,pixelFormat, (const unsigned char*)data, 1.0f/255.0f, operation); break;
|
||||
case(GL_SHORT): _readRow(num,pixelFormat, (const short*) data, 1.0f/32768.0f, operation); break;
|
||||
case(GL_UNSIGNED_SHORT): _readRow(num,pixelFormat, (const unsigned short*)data, 1.0f/65535.0f, operation); break;
|
||||
case(GL_INT): _readRow(num,pixelFormat, (const int*) data, 1.0f/2147483648.0f, operation); break;
|
||||
case(GL_UNSIGNED_INT): _readRow(num,pixelFormat, (const unsigned int*) data, 1.0f/4294967295.0f, operation); break;
|
||||
case(GL_FLOAT): _readRow(num,pixelFormat, (const float*) data, 1.0f, operation); break;
|
||||
}
|
||||
}
|
||||
|
||||
template <class O>
|
||||
void readImage(const osg::Image* image, O& operation)
|
||||
{
|
||||
if (!image) return;
|
||||
|
||||
for(int r=0;r<image->r();++r)
|
||||
{
|
||||
for(int t=0;t<image->t();++t)
|
||||
{
|
||||
readRow(image->s(), image->getPixelFormat(), image->getDataType(), image->data(0,t,r), operation);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// example ModifyOperator
|
||||
// struct ModifyOperator
|
||||
// {
|
||||
// inline void luminance(float& l) const {}
|
||||
// inline void alpha(float& a) const {}
|
||||
// inline void luminance_alpha(float& l,float& a) const {}
|
||||
// inline void rgb(float& r,float& g,float& b) const {}
|
||||
// inline void rgba(float& r,float& g,float& b,float& a) const {}
|
||||
// };
|
||||
|
||||
|
||||
template <typename T, class M>
|
||||
void _modifyRow(unsigned int num, GLenum pixelFormat, T* data,float scale, const M& operation)
|
||||
{
|
||||
float inv_scale = 1.0f/scale;
|
||||
switch(pixelFormat)
|
||||
{
|
||||
case(GL_LUMINANCE): { for(unsigned int i=0;i<num;++i) { float l = float(*data)*scale; operation.luminance(l); *data++ = T(l*inv_scale); } } break;
|
||||
case(GL_ALPHA): { for(unsigned int i=0;i<num;++i) { float a = float(*data)*scale; operation.alpha(a); *data++ = T(a*inv_scale); } } break;
|
||||
case(GL_LUMINANCE_ALPHA): { for(unsigned int i=0;i<num;++i) { float l = float(*data)*scale; float a = float(*(data+1))*scale; operation.luminance_alpha(l,a); *data++ = T(l*inv_scale); *data++ = T(a*inv_scale); } } break;
|
||||
case(GL_RGB): { for(unsigned int i=0;i<num;++i) { float r = float(*data)*scale; float g = float(*(data+1))*scale; float b = float(*(data+2))*scale; operation.rgb(r,g,b); *data++ = T(r*inv_scale); *data++ = T(g*inv_scale); *data++ = T(b*inv_scale); } } break;
|
||||
case(GL_RGBA): { for(unsigned int i=0;i<num;++i) { float r = float(*data)*scale; float g = float(*(data+1))*scale; float b = float(*(data+2))*scale; float a = float(*(data+3))*scale; operation.rgba(r,g,b,a); *data++ = T(r*inv_scale); *data++ = T(g*inv_scale); *data++ = T(g*inv_scale); *data++ = T(a*inv_scale); } } break;
|
||||
case(GL_BGR): { for(unsigned int i=0;i<num;++i) { float b = float(*data)*scale; float g = float(*(data+1))*scale; float r = float(*(data+2))*scale; operation.rgb(r,g,b); *data++ = T(b*inv_scale); *data++ = T(g*inv_scale); *data++ = T(r*inv_scale); } } break;
|
||||
case(GL_BGRA): { for(unsigned int i=0;i<num;++i) { float b = float(*data)*scale; float g = float(*(data+1))*scale; float r = float(*(data+2))*scale; float a = float(*(data+3))*scale; operation.rgba(r,g,b,a); *data++ = T(g*inv_scale); *data++ = T(b*inv_scale); *data++ = T(r*inv_scale); *data++ = T(a*inv_scale); } } break;
|
||||
}
|
||||
}
|
||||
|
||||
template <class M>
|
||||
void modifyRow(unsigned int num, GLenum pixelFormat, GLenum dataType, unsigned char* data, const M& operation)
|
||||
{
|
||||
switch(dataType)
|
||||
{
|
||||
case(GL_BYTE): _modifyRow(num,pixelFormat, (char*)data, 1.0f/128.0f, operation); break;
|
||||
case(GL_UNSIGNED_BYTE): _modifyRow(num,pixelFormat, (unsigned char*)data, 1.0f/255.0f, operation); break;
|
||||
case(GL_SHORT): _modifyRow(num,pixelFormat, (short*) data, 1.0f/32768.0f, operation); break;
|
||||
case(GL_UNSIGNED_SHORT): _modifyRow(num,pixelFormat, (unsigned short*)data, 1.0f/65535.0f, operation); break;
|
||||
case(GL_INT): _modifyRow(num,pixelFormat, (int*) data, 1.0f/2147483648.0f, operation); break;
|
||||
case(GL_UNSIGNED_INT): _modifyRow(num,pixelFormat, (unsigned int*) data, 1.0f/4294967295.0f, operation); break;
|
||||
case(GL_FLOAT): _modifyRow(num,pixelFormat, (float*) data, 1.0f, operation); break;
|
||||
}
|
||||
}
|
||||
|
||||
template <class M>
|
||||
void modifyImage(osg::Image* image, const M& operation)
|
||||
{
|
||||
if (!image) return;
|
||||
|
||||
for(int r=0;r<image->r();++r)
|
||||
{
|
||||
for(int t=0;t<image->t();++t)
|
||||
{
|
||||
modifyRow(image->s(), image->getPixelFormat(), image->getDataType(), image->data(0,t,r), operation);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Compute the min max colour values in the image.*/
|
||||
extern OSGVOLUME_EXPORT bool computeMinMax(const osg::Image* image, osg::Vec4& min, osg::Vec4& max);
|
||||
|
||||
/** Compute the min max colour values in the image.*/
|
||||
extern OSGVOLUME_EXPORT bool offsetAndScaleImage(osg::Image* image, const osg::Vec4& offset, const osg::Vec4& scale);
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
46
include/osgVolume/Version
Normal file
46
include/osgVolume/Version
Normal file
@@ -0,0 +1,46 @@
|
||||
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 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.
|
||||
*/
|
||||
|
||||
#ifndef OSGVOLUME_VERSION
|
||||
#define OSGVOLUME_VERSION 1
|
||||
|
||||
#include <osgVolume/Export>
|
||||
|
||||
extern "C" {
|
||||
|
||||
/**
|
||||
* osgVolumeGetVersion() returns the library version number.
|
||||
* Numbering convention : OpenSceneGraph-1.0 will return 1.0 from osgVolumeGetVersion.
|
||||
*
|
||||
* This C function can be also used to check for the existence of the OpenSceneGraph
|
||||
* library using autoconf and its m4 macro AC_CHECK_LIB.
|
||||
*
|
||||
* Here is the code to add to your configure.in:
|
||||
\verbatim
|
||||
#
|
||||
# Check for the OpenSceneGraph (OSG) Volume library
|
||||
#
|
||||
AC_CHECK_LIB(osg, osgVolumeGetVersion, ,
|
||||
[AC_MSG_ERROR(OpenSceneGraph Volume library not found. See http://www.openscenegraph.org)],)
|
||||
\endverbatim
|
||||
*/
|
||||
extern OSGVOLUME_EXPORT const char* osgVolumeGetVersion();
|
||||
|
||||
/**
|
||||
* osgVolumeGetLibraryName() returns the library name in human friendly form.
|
||||
*/
|
||||
extern OSGVOLUME_EXPORT const char* osgVolumeGetLibraryName();
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user