-!!ARBvp1.0
+// simple vertex shader
+/*
+struct VS_INPUT {
+ float3 Pos : POSITION;
+ float I : TEXCOORD0;
+};
-# Constant Parameters
-PARAM mvp[4] = { state.matrix.mvp }; # modelview projection matrix
-PARAM constSize = program.env[0]; # constant size
-PARAM constColor = program.env[1]; # constant color (defined by the application)
-PARAM coefficient = program.env[2];
+struct VS_OUTPUT {
+// float4 Pos : POSITION;
+// float4 Col : COLOR0;
+ float Size : PSIZE;
+};
-# constColor.x == 1.0
-# constColor.y == 1.0
-# constColor.z == 1.0
-# constColor.w == 1.0
+float ComputePointSize(float3 inVertex, float inSize) {
+ float4 viewPos = mul(float4(inVertex, 1), WorldView);
+ float dist = (viewPos.x * viewPos.x + viewPos.y * viewPos.y + viewPos.z * viewPos.z);
+ float size = viewportSize.y * inSize * globalPointSize * rsqrt((1 + dist));
-# constSize.x == 50.0
-# constSize.y == 1.0
-# constSize.z == 1.0
-# constSize.w == 1.0
+ return max( 16.0f, size );
+}
-# coefficient.x == 1.0
-# coefficient.y == 10.0
-# coefficient.z == 100.0
-# coefficient.w == 1000.0
+VS_OUTPUT VertexShader_PointSpritePalette(VS_INPUT vIn) {
+ VS_OUTPUT Out;
-# Per-vertex inputs
-ATTRIB inPosition = vertex.position;
-ATTRIB inColor = vertex.color;
+// Out.Pos = mul(float4(vIn.Pos, 1), WorldViewProjection);
-# Per-vertex outputs
-OUTPUT outPosition = result.position;
-OUTPUT outColor = result.color;
-OUTPUT outSize = result.pointsize;
+ if( vIn.I < limitMin || vIn.I > limitMax ) {
+ Out.Size = 0;
+ } else {
+ float stepValue = vIn.I;
-DP4 outPosition.x, mvp[0], inPosition; # Transform the x component of the per-vertex position into clip-space
-DP4 outPosition.y, mvp[1], inPosition; # Transform the y component of the per-vertex position into clip-space
-DP4 outPosition.z, mvp[2], inPosition; # Transform the z component of the per-vertex position into clip-space
-DP4 outPosition.w, mvp[3], inPosition; # Transform the w component of the per-vertex position into clip-space
+ float size1 = 1.0f;
+ float size2 = 4.0f;
+ float pSize = size1 + stepValue * (size2 - size1);
+ Out.Size = ComputePointSize(vIn.Pos, pSize) * 0.5;
+ }
-# Color management
-MOV outColor, inColor; # Use the original per-vertex color specified
-#MOV outColor, constColor; # Uncomment this to use the constant color stored at "program.env[0]"
+ return Out;
+}
+*/
-# Size management
-TEMP size1;
+float3 ComputePointSize( float3 inColor )
+{
+ int r = inColor.x * 255;
+ int g = inColor.y * 255;
+ int b = inColor.z * 255;
+ int h = 0;
-MOV size1, constSize;
+ int max = r;
+ int whatmax = 0;
+ if( g > max )
+ {
+ max = g;
+ whatmax = 1;
+ }
+ if( b > max )
+ {
+ max = b;
+ whatmax = 2;
+ }
+ int min = r;
+ if ( g < min ) min = g;
+ if ( b < min ) min = b;
+ int delta = max-min;
-#DP4 size1.x, inColor, inColor;
-#MUL size1.x, size1.x, coefficient.y;
+ if( whatmax == 0 )
+ {
+ if ( g >= b )
+ h = (120*(g-b)+delta)/(2*delta);
+ else
+ h = (120*(g-b+delta)+delta)/(2*delta) + 300;
+ }
+ else if( whatmax == 1 )
+ {
+ if ( b > r )
+ h = 120 + (120*(b-r)+delta)/(2*delta);
+ else
+ h = 60 + (120*(b-r+delta)+delta)/(2*delta);
+ }
+ else
+ {
+ if ( r > g )
+ h = 240 + (120*(r-g)+delta)/(2*delta);
+ else
+ h = 180 + (120*(r-g+delta)+delta)/(2*delta);
+ }
-#MUL size1.x, size1.x, inColor.w;
-#MUL size1.x, size1.x, coefficient.y;
+ float minSize = 20.0f;
+ float maxSize = 40.0f;
-MOV outSize, size1;
+ float size = minSize + ( maxSize - minSize ) * ( 1 - h / 256.0f );
-END
\ No newline at end of file
+ return size;
+}
+
+void main()
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+
+ gl_FrontColor = gl_Color;
+
+ float size = ComputePointSize( gl_Color );
+
+ gl_PointSize = size * gl_ProjectionMatrix[0].x;
+
+}
#include "vtkXMLImageDataReader.h"
#include "vtkImageData.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
#include <GL/glext.h>
#include <GL/glx.h>
-#ifdef __cplusplus
-}
-#endif
#include <dlfcn.h>
#define VTK_PDPSM_OPAQUE_COLORS 0x0040
#define VTK_PDPSM_ALPHA_ARRAY 0x0080
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define GL_POINT_SPRITE_ARB 0x8861
-#define GL_COORD_REPLACE_ARB 0x8862
-
-#define GL_ARB_point_parameters 1
-
-//GLAPI void APIENTRY glPointParameterfARB (GLenum, GLfloat);
-//GLAPI void APIENTRY glPointParameterfvARB (GLenum, const GLfloat *);
-
-#ifdef __cplusplus
-}
-#endif
-
PFNGLGENPROGRAMSARBPROC glGenProgramsARB = NULL;
PFNGLDELETEPROGRAMSARBPROC glDeleteProgramsARB = NULL;
PFNGLBINDPROGRAMARBPROC glBindProgramARB = NULL;
PFNGLPROGRAMSTRINGARBPROC glProgramStringARB = NULL;
PFNGLPROGRAMENVPARAMETER4FARBPROC glProgramEnvParameter4fARB = NULL;
+PFNGLSHADERSOURCEARBPROC glShaderSourceARB = NULL;
+PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = NULL;
+PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL;
+PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL;
+PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL;
+PFNGLLINKPROGRAMPROC glLinkProgramARB = NULL;
+PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL;
+PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB = NULL;
+PFNGLGETINFOLOGARBPROC glGetInfoLogARB = NULL;
+
unsigned int shaderId;
//-----------------------------------------------------------------------------
}
}
//-----------------------------------------------------------------------------
-// Name: readShaderFile()
-// Desc:
-//-----------------------------------------------------------------------------
-unsigned char *readShaderFile( std::string fileName )
+char* readFromFile( std::string fileName )
{
FILE* file = fopen( fileName.c_str(), "r" );
- unsigned char* buffer = new unsigned char[ 2000 ];
- int bytes = fread( buffer, 1, 2000, file );
- buffer[bytes] = 0;
-
- unsigned char* shader = new unsigned char[ bytes ];
- for( int i = 0; i < bytes; i++ )
- shader[i] = buffer[i];
+ char* content = NULL;
+ int count = 0;
- fclose( file );
+ if( file != NULL )
+ {
+ fseek( file, 0, SEEK_END );
+ count = ftell( file );
+ rewind( file );
- delete buffer;
+ if( count > 0 )
+ {
+ content = ( char* )malloc( sizeof( char ) * ( count + 1 ) );
+ count = fread( content, sizeof( char ), count, file );
+ content[ count ] = '\0';
+ }
+ fclose( file );
+ }
- return shader;
+ return content;
}
//-----------------------------------------------------------------------------
-// Name: initShader()
-// Desc: Assemble the shader
+void printInfoLog( GLhandleARB obj )
+{
+ int infologLength = 0;
+ int charsWritten = 0;
+ char* infoLog;
+
+ glGetObjectParameterivARB( obj, GL_OBJECT_INFO_LOG_LENGTH_ARB, &infologLength );
+
+ if( infologLength > 0 )
+ {
+ infoLog = ( char* )malloc( infologLength );
+ glGetInfoLogARB( obj, infologLength, &charsWritten, infoLog );
+ printf( "%s\n", infoLog );
+ free( infoLog );
+ }
+}
//-----------------------------------------------------------------------------
void initShader()
{
std::string fileName = std::string( getenv( "VISU_ROOT_DIR") ) +
"/share/salome/resources/Vertex_Program_ARB.txt";
- unsigned char* shader = readShaderFile( fileName );
- int size = strlen( (char*)shader );
+ //std::string fileName = std::string( "/dn06/salome/ouv/SALOME3/VISU_SRC/resources/Vertex_Program_ARB.txt");
- glGenProgramsARB( 1, &shaderId );
- glBindProgramARB( GL_VERTEX_PROGRAM_ARB, shaderId );
+ char* shader = readFromFile( fileName );
- glProgramStringARB( GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
- size, shader );
+ //glGenProgramsARB( 1, &shaderId );
+ //glBindProgramARB( GL_VERTEX_PROGRAM_ARB, shaderId );
+ //glProgramStringARB( GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen( shader ), shader );
+
+ GLhandleARB v = glCreateShaderObjectARB( GL_VERTEX_SHADER_ARB );
+ glShaderSourceARB( v, 1, (const GLcharARB**)&shader, NULL );
+ glCompileShaderARB( v );
+ //printInfoLog( v );
+
+ GLhandleARB p = glCreateProgramObjectARB();
+ glAttachObjectARB( p, v );
+
+ glLinkProgramARB( p );
+ //printInfoLog( p );
+
+ glUseProgramObjectARB( p );
/*
cout << "Shader from " << fileName << endl;
- for( int i = 0; i < size; i++ )
+ for( int i = 0; i < strlen( shader ); i++ )
cout << shader[i];
cout << endl;
void* libHandle = dlopen( "libGL.so", RTLD_NOW );
glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC)dlsym( libHandle, "glGenProgramsARB" );
- glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC)dlsym( libHandle, "glDeleteProgramsARB");
- glBindProgramARB = (PFNGLBINDPROGRAMARBPROC)dlsym( libHandle, "glBindProgramARB");
- glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC)dlsym( libHandle, "glProgramStringARB");
- glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC)dlsym( libHandle, "glProgramEnvParameter4fARB");
-
- /*
- glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC)glXGetProcAddressARB((const GLubyte*)"glGenProgramsARB");
- glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC)glXGetProcAddressARB((const GLubyte*)"glDeleteProgramsARB");
- glBindProgramARB = (PFNGLBINDPROGRAMARBPROC)glXGetProcAddressARB((const GLubyte*)"glBindProgramARB");
- glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC)glXGetProcAddressARB((const GLubyte*)"glProgramStringARB");
- glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC)glXGetProcAddressARB((const GLubyte*)"glProgramEnvParameter4fARB");
- */
+ glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC)dlsym( libHandle, "glDeleteProgramsARB" );
+ glBindProgramARB = (PFNGLBINDPROGRAMARBPROC)dlsym( libHandle, "glBindProgramARB" );
+ glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC)dlsym( libHandle, "glProgramStringARB" );
+ glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC)dlsym( libHandle, "glProgramEnvParameter4fARB" );
+
+ glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)dlsym( libHandle, "glShaderSourceARB" );
+ glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)dlsym( libHandle, "glCreateShaderObjectARB" );
+ glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)dlsym( libHandle, "glCompileShaderARB" );
+ glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)dlsym( libHandle, "glCreateProgramObjectARB" );
+ glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)dlsym( libHandle, "glAttachObjectARB" );
+ glLinkProgramARB = (PFNGLLINKPROGRAMPROC)dlsym( libHandle, "glLinkProgramARB" );
+ glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)dlsym( libHandle, "glUseProgramObjectARB" );
+ glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)dlsym( libHandle, "glGetObjectParameterivARB" );
+ glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)dlsym( libHandle, "glGetInfoLogARB" );
initShader();
setShaderConstants();
glEnd(); \
}
//-----------------------------------------------------------------------------
-void VISU_OpenGLPointSpriteMapper::cleanupSprites()
-{
- // Set GL params back to normal to stop other vtkMappers diusplaying wrongly
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_LIGHTING);
- glEnable( GL_BLEND );
-
- glDisable( GL_VERTEX_PROGRAM_POINT_SIZE_ARB );
- glDisable( GL_POINT_SPRITE_ARB );
-}
-//-----------------------------------------------------------------------------
-GLuint VISU_OpenGLPointSpriteMapper::LoadTexture( vtkImageData* imageData )
-{
- //this->XMLImageDataReader->SetFileName( fileName );
- //vtkImageData* imageData = this->XMLImageDataReader->GetOutput();
- //imageData->DebugOn();
- imageData->RequestExactExtentOn();
- imageData->UpdateInformation();
- imageData->SetUpdateExtentToWholeExtent();
- imageData->Update();
- //cout << "Dimension of image data : " << imageData->GetDataDimension() << endl;
-
- int* size = imageData->GetDimensions();
- vtkDataArray* scalars = imageData->GetPointData()->GetScalars();
- unsigned char* dataPtr = static_cast<vtkUnsignedCharArray *>(scalars)->GetPointer(0);
-
- GLuint texture;
- glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
- glGenTextures( 1, &texture );
- glBindTexture( GL_TEXTURE_2D, texture );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
- glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, dataPtr );
-
- return texture;
-}
-//-----------------------------------------------------------------------------
-void VISU_OpenGLPointSpriteMapper::DrawTexture( GLuint texture, GLfloat x, GLfloat y, GLfloat z )
-{
- //cout << "DrawTexture : " << texture << endl;
- glColor4f( 1.0, 1.0, 1.0, 1.0 );
-
- glEnable( GL_POINT_SPRITE_ARB );
- glEnable( GL_TEXTURE_2D );
- glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
- //glAlphaFunc( GL_GREATER, 0.95F );
- //glEnable( GL_ALPHA_TEST );
-
- glBindTexture( GL_TEXTURE_2D, texture );
- glBegin( GL_POINTS );
-
- glVertex3f( x, y, z );
-
- glEnd();
- glFlush();
-
- //glDisable( GL_ALPHA_TEST );
- glDisable( GL_TEXTURE_2D );
-}
-//-----------------------------------------------------------------------------
void VISU_OpenGLPointSpriteMapper::initSprites()
{
+ glBindTexture( GL_TEXTURE_2D, TextureIntensity );
+
switch (this->RenderMode)
{
case VISU_OpenGLPointSpriteMapper::Accumulate:
}
glPointSize( CurrentPointSize );
+ glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE );
+
glEnable( GL_POINT_SPRITE_ARB );
glEnable( GL_VERTEX_PROGRAM_POINT_SIZE_ARB );
*/
}
//-----------------------------------------------------------------------------
+void VISU_OpenGLPointSpriteMapper::cleanupSprites()
+{
+ // Set GL params back to normal to stop other vtkMappers diusplaying wrongly
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_LIGHTING);
+ glEnable( GL_BLEND );
+
+ glDisable( GL_VERTEX_PROGRAM_POINT_SIZE_ARB );
+ glDisable( GL_POINT_SPRITE_ARB );
+
+ glDisable( GL_TEXTURE_2D );
+}
+//-----------------------------------------------------------------------------
+GLuint VISU_OpenGLPointSpriteMapper::LoadTexture( vtkImageData* imageData )
+{
+ //this->XMLImageDataReader->SetFileName( fileName );
+ //vtkImageData* imageData = this->XMLImageDataReader->GetOutput();
+ //imageData->DebugOn();
+ imageData->RequestExactExtentOn();
+ imageData->UpdateInformation();
+ imageData->SetUpdateExtentToWholeExtent();
+ imageData->Update();
+ //cout << "Dimension of image data : " << imageData->GetDataDimension() << endl;
+
+ int* size = imageData->GetDimensions();
+ vtkDataArray* scalars = imageData->GetPointData()->GetScalars();
+ unsigned char* dataPtr = static_cast<vtkUnsignedCharArray *>(scalars)->GetPointer(0);
+
+ glEnable( GL_TEXTURE_2D );
+
+ GLuint texture;
+ glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
+ glGenTextures( 1, &texture );
+ glBindTexture( GL_TEXTURE_2D, texture );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
+ glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, dataPtr );
+
+ return texture;
+}
+//-----------------------------------------------------------------------------
+void VISU_OpenGLPointSpriteMapper::DrawTexture( GLuint texture, GLfloat x, GLfloat y, GLfloat z )
+{
+ //cout << "DrawTexture : " << texture << endl;
+ //glColor4f( 1.0, 1.0, 1.0, 1.0 );
+
+ //glAlphaFunc( GL_GREATER, 0.95F );
+ //glEnable( GL_ALPHA_TEST );
+
+ //glBindTexture( GL_TEXTURE_2D, texture );
+ glBegin( GL_POINTS );
+
+ glVertex3f( x, y, z );
+
+ glEnd();
+ glFlush();
+
+ //glDisable( GL_ALPHA_TEST );
+ //glDisable( GL_TEXTURE_2D );
+}
+//-----------------------------------------------------------------------------
void VISU_OpenGLPointSpriteMapper::DrawPoints(int idx,
- vtkPoints *p,
- vtkUnsignedCharArray *colors,
- vtkFloatArray *alpha,
- vtkIdType &cellNum,
- int &noAbort,
- vtkCellArray *cells,
- vtkRenderer *ren)
+ vtkPoints *p,
+ vtkUnsignedCharArray *colors,
+ vtkFloatArray *alpha,
+ vtkIdType &cellNum,
+ int &noAbort,
+ vtkCellArray *cells,
+ vtkRenderer *ren)
{
void *voidPoints = p->GetVoidPointer(0);
unsigned char *rgba;
initSprites();
- glEnable( GL_VERTEX_PROGRAM_ARB );
+ //glEnable( GL_VERTEX_PROGRAM_ARB );
+ //glBindProgramARB( GL_VERTEX_PROGRAM_ARB, shaderId );
//glColor4f( 1.0, 1.0, 1.0, 1.0 );
- glBindProgramARB( GL_VERTEX_PROGRAM_ARB, shaderId );
-
vtkIdType *pts = 0;
vtkIdType npts = 0;
unsigned short count = 0;
}
}
- //cout << "POINT : ";
- //cout << p->GetPoint(pts[0])[0] << " ";
- //cout << p->GetPoint(pts[0])[1] << " ";
- //cout << p->GetPoint(pts[0])[2] << endl;
-
- glVertex3fv(p->GetPoint(pts[0]));
+ glVertex3fv(p->GetPoint(pts[0]));
/*
vtkXMLImageDataReader* aReader = vtkXMLImageDataReader::New();
TextureAlphaChannel = this->LoadTexture( aReader->GetOutput() );
aReader->Delete();
*/
-
- /*
+ /*
this->DrawTexture( TextureIntensity,
p->GetPoint(pts[0])[0],
p->GetPoint(pts[0])[1],
p->GetPoint(pts[0])[2] );
*/
+ //glVertex3fv(p->GetPoint(pts[0]));
// check for abort condition
if (count == 10000)
}
glEnd();
- glDisable( GL_VERTEX_PROGRAM_ARB );
+ //glDisable( GL_VERTEX_PROGRAM_ARB );
}
}
- //
- // restore Gl state to normal
- //
+
cleanupSprites();
}