blob: 3c0c52970ca934f0c4861b947bc12fc97a601b65 [file] [log] [blame]
/**
* projectM -- Milkdrop-esque visualisation SDK
* Copyright (C)2003-2004 projectM Team
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* 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 GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* See 'LICENSE.txt' included within this release
*
*/
#include <math.h>
#include <projectM.hpp>
#include <sdltoprojectM.hpp>
#ifdef DEBUG
FILE *debugFile = NULL;
#endif
projectM *globalPM = NULL;
int dumpFrame = 0;
int frameNumber = 0;
GLubyte *fbuffer = NULL;
extern void addPCM16(short [2][512]);
void renderLoop( projectM *pm ) {
int i;
int x, y;
int index;
short pcm_data[2][512];
while ( 1 ) {
projectMEvent evt;
projectMKeycode key;
projectMModifier mod;
/** Process SDL events */
SDL_Event event;
while ( SDL_PollEvent( &event ) ) {
/** Translate into projectM codes and process */
evt = sdl2pmEvent( event );
key = sdl2pmKeycode( event.key.keysym.sym );
mod = sdl2pmModifier( event.key.keysym.mod );
if ( evt == PROJECTM_KEYDOWN ) {
pm->key_handler( evt, key, mod );
}
}
/** Produce some fake PCM data to stuff into projectM */
if ( pm->count % 5 == 0 ) {
for ( i = 0 ; i < 512 ; i++ ) {
pcm_data[0][i] = 0;
pcm_data[1][i] = 0;
}
} else {
for ( i = 0 ; i < 512 ; i++ ) {
if ( i % 2 == 0 ) {
pcm_data[0][i] = (float)( rand() / ( (float)RAND_MAX ) * (pow(2,14) ) );
pcm_data[1][i] = (float)( rand() / ( (float)RAND_MAX ) * (pow(2,14) ) );
} else {
pcm_data[0][i] = (float)( rand() / ( (float)RAND_MAX ) * (pow(2,14) ) );
pcm_data[1][i] = (float)( rand() / ( (float)RAND_MAX ) * (pow(2,14) ) );
}
if ( i % 2 == 1 ) {
pcm_data[0][i] = -pcm_data[0][i];
pcm_data[1][i] = -pcm_data[1][i];
}
}
}
/** Add the waveform data */
//addPCM16( pcm_data );
/** Render the new frame */
pm->renderFrame();
if ( dumpFrame ) {
char fname[1024];
FILE *f;
sprintf( fname, "projectM_%08d.ppm", frameNumber++ );
f = fopen( fname, "wb" );
fprintf( f, "P3\n#\n%d %d\n255\n", pm->wvw, pm->wvh );
glReadPixels( 0, 0, pm->wvw, pm->wvh, GL_RGB, GL_UNSIGNED_BYTE, fbuffer );
index = 0;
for ( y = 0 ; y < pm->wvh ; y++ ) {
for ( x = 0 ; x < pm->wvw ; x++ ) {
fprintf( f, "%d %d %d ", fbuffer[index++], fbuffer[index++], fbuffer[index++] );
}
fprintf( f, "\n" );
}
fclose( f );
}
SDL_GL_SwapBuffers();
}
printf("Worker thread: Exiting\n");
}
int main( int argc, char *argv[] ) {
/** Variables */
int fullscreen = 0;
int width = 784,
height = 784;
SDL_Surface *screen;
#ifdef DEBUG
int value;
int rgb_size[3];
#endif
const SDL_VideoInfo* info = NULL;
int bpp = 0;
/* Flags we will pass into SDL_SetVideoMode. */
int flags = 0;
#ifdef DEBUG
#ifdef WIN32
/** Init debug */
debugFile = fopen( "c:\\projectMvis.txt", "wb" );
#else
debugFile = fopen( "/tmp/projectMvis.txt", "wb" );
#endif /** WIN32 */
#endif /** DEBUG */
/** Allocate the SDL windows */
/* Information about the current video settings. */
/* First, initialize SDL's video subsystem. */
if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) {
/* Failed, exit. */
#ifdef DEBUG
fprintf( debugFile, "Video initialization failed: %s\n",
SDL_GetError( ) );
#endif
//projectM_vtable.disable_plugin (&projectM_vtable);
return PROJECTM_ERROR;
}
/* Let's get some video information. */
info = SDL_GetVideoInfo( );
if( !info ) {
/* This should probably never happen. */
#ifdef DEBUG
fprintf( debugFile, "Video query failed: %s\n",
SDL_GetError( ) );
#endif
// projectM_vtable.disable_plugin (&projectM_vtable);
return PROJECTM_ERROR;
}
bpp = info->vfmt->BitsPerPixel;
// SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 5 );
// SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 5 );
// SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 5 );
//SDL_GL_SetAttribute( SDL_GL_ACCUM_RED_SIZE, 8 );
// SDL_GL_SetAttribute( SDL_GL_ACCUM_GREEN_SIZE, 8 );
// SDL_GL_SetAttribute( SDL_GL_ACCUM_BLUE_SIZE, 8 );
SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 8 );
SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 );
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
if (fullscreen==0)
flags = SDL_OPENGL | SDL_HWSURFACE;
else flags = SDL_OPENGL | SDL_HWSURFACE |SDL_FULLSCREEN;
// w = 512; h = 512; bpp = 16;
#ifdef DEBUG
fprintf( debugFile, "pre SDL_SetVideoMode()\n" );
#endif
screen = SDL_SetVideoMode( width, height, bpp, flags ) ;
#ifdef DEBUG
fprintf( debugFile, "post SDL_SetVideoMode()\n" );
#endif
if(screen == NULL ) {
/*
* This could happen for a variety of reasons,
* including DISPLAY not being set, the specified
* resolution not being available, etc.
*/
#ifdef DEBUG
fprintf( debugFile, "Video mode set failed: %s\n",
SDL_GetError( ) );
#endif
// projectM_vtable.disable_plugin (&projectM_vtable);
return PROJECTM_ERROR;
}
#ifdef DEBUG
fprintf(debugFile, "Screen BPP: %d\n", SDL_GetVideoSurface()->format->BitsPerPixel);
fprintf(debugFile, "\n");
fprintf( debugFile, "Vendor : %s\n", glGetString( GL_VENDOR ) );
fprintf( debugFile, "Renderer : %s\n", glGetString( GL_RENDERER ) );
fprintf( debugFile, "Version : %s\n", glGetString( GL_VERSION ) );
fprintf( debugFile, "Extensions : %s\n", glGetString( GL_EXTENSIONS ) );
fprintf(debugFile, "\n");
rgb_size[0] = 8;
rgb_size[1] = 8;
rgb_size[2] = 8;
SDL_GL_GetAttribute( SDL_GL_RED_SIZE, &value );
fprintf( debugFile, "SDL_GL_RED_SIZE: requested %d, got %d\n", rgb_size[0],value);
SDL_GL_GetAttribute( SDL_GL_GREEN_SIZE, &value );
fprintf( debugFile, "SDL_GL_GREEN_SIZE: requested %d, got %d\n", rgb_size[1],value);
SDL_GL_GetAttribute( SDL_GL_BLUE_SIZE, &value );
fprintf( debugFile, "SDL_GL_BLUE_SIZE: requested %d, got %d\n", rgb_size[2],value);
SDL_GL_GetAttribute( SDL_GL_DEPTH_SIZE, &value );
fprintf( debugFile, "SDL_GL_DEPTH_SIZE: requested %d, got %d\n", bpp, value );
SDL_GL_GetAttribute( SDL_GL_DOUBLEBUFFER, &value );
fprintf( debugFile, "SDL_GL_DOUBLEBUFFER: requested 1, got %d\n", value );
#ifdef PANTS
if ( fsaa ) {
SDL_GL_GetAttribute( SDL_GL_MULTISAMPLEBUFFERS, &value );
printf( "SDL_GL_MULTISAMPLEBUFFERS: requested 1, got %d\n", value );
SDL_GL_GetAttribute( SDL_GL_MULTISAMPLESAMPLES, &value );
printf( "SDL_GL_MULTISAMPLESAMPLES: requested %d, got %d\n", fsaa, value );
}
#endif
#endif
/** Setup some window stuff */
SDL_WM_SetCaption( PROJECTM_TITLE, NULL );
/** Initialise projectM */
globalPM = (projectM *)malloc( sizeof( projectM ) );
globalPM->projectM_reset();
globalPM->fullscreen = 0;
// globalPM->renderTarget->texsize = 1024;
// globalPM->renderTarget->context1 = (void *)aglGetCurrentContext();
#ifdef DEBUG22
if ( debugFile != NULL ) {
fprintf( debugFile, "current context: %X\n",
globalPM->renderTarget->context1 );
fflush( debugFile );
}
#endif
#ifdef MACOS
globalPM->fontURL = (char *)malloc( sizeof( char ) * 512 );
strcpy( globalPM->fontURL, "../../fonts" );
globalPM->presetURL = (char *)malloc( sizeof( char ) * 512 );
strcpy( globalPM->presetURL, "../../presets" );
#endif
#ifdef WIN32
globalPM->fontURL = (char *)malloc( sizeof( char ) * 512 );
strcpy( globalPM->fontURL, "c:\\tmp\\projectM\\fonts" );
globalPM->presetURL = (char *)malloc( sizeof( char ) * 512 );
strcpy( globalPM->presetURL, "c:\\tmp\\projectM\\presets_test" );
#endif
#ifdef LINUX
globalPM->fontURL = (char *)malloc( sizeof( char ) * 512 );
strcpy( globalPM->fontURL, "/etc/projectM/fonts" );
globalPM->presetURL = (char *)malloc( sizeof( char ) * 512 );
strcpy( globalPM->presetURL, "/etc/projectM/presets" );
#endif
globalPM->projectM_init();
globalPM->projectM_resetGL( width, height );
/** Allocate the buffer for frame dumping, if applicable */
if ( dumpFrame ) {
fbuffer = (GLubyte *)malloc( sizeof( GLubyte ) * globalPM->wvw * globalPM->wvh * 3 );
}
/** Initialise the thread */
renderLoop( globalPM );
return PROJECTM_SUCCESS;
}