Code:
// init
m_Control_OpenGL = OPENGL_CTL( m_PanelFuncs, m_PanelID, NULL, 640, 480 );
if( m_Control_OpenGL != NULL )
{
CON_SETEVENT( m_Control_OpenGL, UserDrawFunc_Forward, (void *) this );
}
// userdraw (after forwarding)
void CLWPreviewWindow::UserDraw(
DrMode dr_mode )
{
if( dr_mode != DR_ERASE )
{
if( m_Control_OpenGL != NULL )
{
LWValue ival = { LWT_INTEGER };
int width = CON_W( m_Control_OpenGL );
int height = CON_H( m_Control_OpenGL );
if( ( width != GetWidth() ) ||
( height != GetHeight() ) )
{
Resize( width, height );
}
void *buffer;
buffer = GetBuffer();
if( buffer != NULL )
{
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glMatrixMode( GL_TEXTURE );
glLoadIdentity();
GLdouble pos[ 3 ];
pos[ 0 ] = -1.0;
pos[ 1 ] = -1.0;
pos[ 2 ] = 0.0;
glRasterPos3dv( pos );
#if 0
glDrawPixels( GetWidth(), GetHeight(), GL_RGBA, GL_FLOAT, buffer );
#elif 1
float *src_buffer = (float *) buffer;
int buffer_width = GetWidth();
int buffer_height = GetHeight();
unsigned char *temp_buffer;
temp_buffer = new unsigned char[ buffer_width * buffer_height * 4 ];
if( temp_buffer != NULL )
{
int offset = 0;
for( int j = 0; j < buffer_height; j++ )
{
for( int i = 0; i < buffer_width; i++ )
{
temp_buffer[ offset + 0 ] = iclamp( (int) ( src_buffer[ offset + 0 ] * 255.0 ), 0, 255 );
temp_buffer[ offset + 1 ] = iclamp( (int) ( src_buffer[ offset + 1 ] * 255.0 ), 0, 255 );
temp_buffer[ offset + 2 ] = iclamp( (int) ( src_buffer[ offset + 2 ] * 255.0 ), 0, 255 );
temp_buffer[ offset + 3 ] = iclamp( (int) ( src_buffer[ offset + 3 ] * 255.0 ), 0, 255 );
offset += 4;
}
}
glDrawPixels( buffer_width, buffer_height, GL_RGBA, GL_UNSIGNED_BYTE, temp_buffer );
delete [] temp_buffer;
}
#endif
glFlush();
}
}
}
}
It has been 8 years or so after I wrote it, but if I recall correctly GL_FLOAT was slow or had other issue,
therefor I changed code to below one, and each time there was refresh, converted manually floats to unsigned bytes.
Not noticeable difference in speed, or even faster than OpenGL by itself doing this conversion.
But it was working on LW v9.6.
Bookmarks