Files
SingularityViewer/indra/test_apps/llplugintest/media_simple_test.cpp
Aleric Inglewood 6848c2df6f Fix underlinkage of libmedia_plugin_webkit.so
Fixed by updating indra/cmake/WebKitLibPlugin.cmake with
version from imprudence.

This commit also contains removal of execute permissions
of source files and configure files, sorry...
2011-05-02 23:13:15 +02:00

461 lines
12 KiB
C++

/**
* @file demo_plugin.cpp
* @brief Test plugin to be loaded by the llplugin testbed.
*
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008-2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#include <string>
#include <iostream>
#include <stdlib.h>
#include <time.h>
#if LL_DARWIN
#include <GLUT/glut.h>
#elif LL_LINUX
#include <GL/glut.h>
#else
#include "glut.h"
#endif
////////////////////////////////////////////////////////////////////////////////
//
class mediaSource
{
public:
////////////////////////////////////////////////////////////////////////////////
//
mediaSource() :
mPixels( 0 ),
mIsDirty( false ),
mWidth( 200 ),
mHeight( 100 ),
mDepth( 3 ),
mPixelFormat( GL_BGR_EXT )
{
mPixels = new unsigned char [ mWidth * mHeight * mDepth ];
for( int i = 0; i < mWidth * mHeight * mDepth; ++i )
*( mPixels + i ) = rand() % 0x40;
};
////////////////////////////////////////////////////////////////////////////////
//
void update()
{
const time_t interval = 1;
static time_t last_time = time( NULL );
time_t cur_time = time( NULL );
if ( cur_time - last_time > interval )
{
for( int i = 0; i < mWidth * mHeight * mDepth; ++i )
*( mPixels + i ) = rand() % 0x40;
mIsDirty = true;
last_time = cur_time;
};
};
////////////////////////////////////////////////////////////////////////////////
//
void write_pixel( int x, int y, unsigned char r, unsigned char g, unsigned char b )
{
// make sure we don't write outside the buffer
if((x < 0) || (x >= mWidth) || (y < 0) || (y >= mHeight))
return;
*( mPixels + ( mHeight - y ) * mWidth * mDepth + x * mDepth + 0 ) = b;
*( mPixels + ( mHeight - y ) * mWidth * mDepth + x * mDepth + 1 ) = g;
*( mPixels + ( mHeight - y ) * mWidth * mDepth + x * mDepth + 2 ) = r;
mIsDirty = true;
}
////////////////////////////////////////////////////////////////////////////////
//
void mouseDown( int x, int y )
{
write_pixel( x, y, 0xff, 0x00, 0x00 );
};
////////////////////////////////////////////////////////////////////////////////
//
void mouseUp( int x, int y )
{
write_pixel( x, y, 0xff, 0xff, 0x00 );
};
////////////////////////////////////////////////////////////////////////////////
//
void mouseMove( int x, int y )
{
write_pixel( x, y, 0xff, 0x00, 0xff );
};
////////////////////////////////////////////////////////////////////////////////
//
void keyPress( unsigned char key )
{
};
////////////////////////////////////////////////////////////////////////////////
//
int getWidth() { return mWidth; };
int getHeight() { return mHeight; };
int getDepth() { return mDepth; };
int getPixelFormat() { return mPixelFormat; };
bool isDirty() { return mIsDirty; };
void ackDirty() { mIsDirty = false; };
unsigned char* getPixels() { return mPixels; };
private:
unsigned char* mPixels;
bool mIsDirty;
int mWidth;
int mHeight;
int mDepth;
int mPixelFormat;
};
////////////////////////////////////////////////////////////////////////////////
//
class mediaSimpleTest
{
public:
mediaSimpleTest() :
mAppWindowWidth( 800 ),
mAppWindowHeight( 600 ),
mAppTextureWidth( 0 ),
mAppTextureHeight( 0 ),
mAppTexture( 0 ),
mAppWindowName( "Media Simple Test" ),
mHomeUrl( "" )
{
mMediaSource = new mediaSource;
// calculate texture size required (next power of two above browser window size
for ( mAppTextureWidth = 1; mAppTextureWidth < mMediaSource->getWidth(); mAppTextureWidth <<= 1 ) {};
for ( mAppTextureHeight = 1; mAppTextureHeight < mMediaSource->getHeight(); mAppTextureHeight <<= 1 ) {};
};
////////////////////////////////////////////////////////////////////////////////
//
~mediaSimpleTest()
{
delete mMediaSource;
};
////////////////////////////////////////////////////////////////////////////////
//
void initGL()
{
// OpenGL initialization
glClearColor( 0.0f, 0.0f, 0.0f, 0.5f);
glEnable( GL_COLOR_MATERIAL );
glColorMaterial( GL_FRONT, GL_AMBIENT_AND_DIFFUSE );
glEnable( GL_TEXTURE_2D );
glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
glEnable( GL_CULL_FACE );
// create the texture used to display the browser data
glGenTextures( 1, &mAppTexture );
glBindTexture( GL_TEXTURE_2D, mAppTexture );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexImage2D( GL_TEXTURE_2D, 0,
GL_RGB,
mAppTextureWidth, mAppTextureHeight,
0, GL_RGB, GL_UNSIGNED_BYTE, 0 );
}
////////////////////////////////////////////////////////////////////////////////
//
void reshape( int width, int height )
{
if ( height == 0 )
height = 1;
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glViewport( 0, 0, width, height );
glOrtho( 0.0f, width, height, 0.0f, -1.0f, 1.0f );
// we use these values elsewhere so save
mAppWindowWidth = width;
mAppWindowHeight = height;
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glutPostRedisplay();
};
////////////////////////////////////////////////////////////////////////////////
//
void idle()
{
// lots of updates for smooth motion
glutPostRedisplay();
};
////////////////////////////////////////////////////////////////////////////////
//
void display()
{
// clear screen
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();
// use the browser texture
glBindTexture( GL_TEXTURE_2D, mAppTexture );
// needs to be updated?
mMediaSource->update();
if ( mMediaSource->isDirty() )
{
// grab the page
const unsigned char* pixels = mMediaSource->getPixels();
if ( pixels )
{
// write them into the texture
glTexSubImage2D( GL_TEXTURE_2D, 0,
0, 0,
mMediaSource->getWidth(),
mMediaSource->getHeight(),
mMediaSource->getPixelFormat(),
GL_UNSIGNED_BYTE,
pixels );
// acknowledge we saw media was dirty and updated
mMediaSource->ackDirty();
};
};
// scale the texture so that it fits the screen
GLfloat texture_scale_x = ( GLfloat )mMediaSource->getWidth() / ( GLfloat )mAppTextureWidth;
GLfloat texture_scale_y = ( GLfloat )mMediaSource->getHeight() / ( GLfloat )mAppTextureHeight;
// draw the single quad full screen (orthographic)
glMatrixMode( GL_TEXTURE );
glPushMatrix();
glScalef( texture_scale_x, texture_scale_y, 1.0f );
glEnable( GL_TEXTURE_2D );
glColor3f( 1.0f, 1.0f, 1.0f );
glBegin( GL_QUADS );
glTexCoord2f( 1.0f, 1.0f );
glVertex2d( mAppWindowWidth, 0 );
glTexCoord2f( 0.0f, 1.0f );
glVertex2d( 0, 0 );
glTexCoord2f( 0.0f, 0.0f );
glVertex2d( 0, mAppWindowHeight );
glTexCoord2f( 1.0f, .0f );
glVertex2d( mAppWindowWidth, mAppWindowHeight );
glEnd();
glMatrixMode( GL_TEXTURE );
glPopMatrix();
glutSwapBuffers();
};
////////////////////////////////////////////////////////////////////////////////
//
void mouseButton( int button, int state, int x, int y )
{
// texture is scaled to fit the screen so we scale mouse coords in the same way
x = ( x * mMediaSource->getWidth() ) / mAppWindowWidth;
y = ( y * mMediaSource->getHeight() ) / mAppWindowHeight;
if ( button == GLUT_LEFT_BUTTON )
{
if ( state == GLUT_DOWN )
mMediaSource->mouseDown( x, y );
else
if ( state == GLUT_UP )
mMediaSource->mouseUp( x, y );
};
// force a GLUT update
glutPostRedisplay();
};
////////////////////////////////////////////////////////////////////////////////
//
void mouseMove( int x , int y )
{
// texture is scaled to fit the screen so we scale mouse coords in the same way
x = ( x * mMediaSource->getWidth() ) / mAppWindowWidth;
y = ( y * mMediaSource->getHeight() ) / mAppWindowHeight;
mMediaSource->mouseMove( x, y );
// force a GLUT update
glutPostRedisplay();
};
////////////////////////////////////////////////////////////////////////////////
//
void keyboard( unsigned char key )
{
mMediaSource->keyPress( key );
};
////////////////////////////////////////////////////////////////////////////////
//
int getAppWindowWidth()
{
return mAppWindowWidth;
};
////////////////////////////////////////////////////////////////////////////////
//
int getAppWindowHeight()
{
return mAppWindowHeight;
};
////////////////////////////////////////////////////////////////////////////////
//
std::string getAppWindowName()
{
return mAppWindowName;
};
private:
int mAppWindowWidth;
int mAppWindowHeight;
mediaSource* mMediaSource;
int mAppTextureWidth;
int mAppTextureHeight;
GLuint mAppTexture;
std::string mAppWindowName;
std::string mHomeUrl;
};
mediaSimpleTest* gApplication;
////////////////////////////////////////////////////////////////////////////////
//
void glutReshape( int width, int height )
{
if ( gApplication )
gApplication->reshape( width, height );
};
////////////////////////////////////////////////////////////////////////////////
//
void glutDisplay()
{
if ( gApplication )
gApplication->display();
};
////////////////////////////////////////////////////////////////////////////////
//
void glutIdle()
{
if ( gApplication )
gApplication->idle();
};
////////////////////////////////////////////////////////////////////////////////
//
void glutKeyboard( unsigned char key, int x, int y )
{
if ( key == 27 )
{
delete gApplication;
exit( 0 );
};
if ( gApplication )
gApplication->keyboard( key );
};
////////////////////////////////////////////////////////////////////////////////
//
void glutMouseMove( int x, int y )
{
if ( gApplication )
gApplication->mouseMove( x, y );
}
////////////////////////////////////////////////////////////////////////////////
//
void glutMouseButton( int button, int state, int x, int y )
{
if ( gApplication )
gApplication->mouseButton( button, state, x, y );
}
////////////////////////////////////////////////////////////////////////////////
//
int main( int argc, char* argv[] )
{
gApplication = new mediaSimpleTest;
if ( gApplication )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB );
glutInitWindowPosition( 80, 0 );
glutInitWindowSize( gApplication->getAppWindowWidth(), gApplication->getAppWindowHeight() );
glutCreateWindow( gApplication->getAppWindowName().c_str() );
glutKeyboardFunc( glutKeyboard );
glutMouseFunc( glutMouseButton );
glutPassiveMotionFunc( glutMouseMove );
glutMotionFunc( glutMouseMove );
glutDisplayFunc( glutDisplay );
glutReshapeFunc( glutReshape );
glutIdleFunc( glutIdle );
gApplication->initGL();
glutMainLoop();
delete gApplication;
};
return 0;
}