blob: ab4a70a63abcbc8c1fe73efa0779293ae0c9323c [file] [log] [blame]
/**
* projectM -- Milkdrop-esque visualisation SDK
* Copyright (C)2003-2008 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 "video_init.h"
#include <projectM.hpp>
#include "sdltoprojectM.h"
#include "ConfigFile.h"
#include "getConfigFilename.h"
#include <stdlib.h>
// FIXME: portable includes?
// i just added what works for me -fatray
#include <GL/gl.h>
#include <cassert>
projectM *globalPM= NULL;
// window stuff
int wvw, wvh, fvw, fvh;
bool fullscreen;
void renderLoop();
// texture test
bool doTextureTest = false;
void textureTest();
// memleak test
bool doMemleakTest = false;
int memLeakIterations = 100;
int main(int argc, char **argv) {
// fix `fullscreen quit kills mouse` issue.
atexit(SDL_Quit);
std::string config_filename = getConfigFilename();
ConfigFile config(config_filename);
// window dimensions from configfile
wvw = config.read<int>("Window Width", 512);
wvh = config.read<int>("Window Height", 512);
fullscreen = config.read("Fullscreen", false);
init_display(wvw, wvh, &fvw, &fvh, fullscreen);
SDL_WM_SetCaption(PROJECTM_TITLE, NULL);
// memleak test
while (doMemleakTest) {
static int k = 0;
std::cerr << "[iter " << k++ << "]" << std::endl;
globalPM = new projectM(config_filename);
assert(globalPM);
delete (globalPM);
if (k >= memLeakIterations)
break;
}
globalPM = new projectM(config_filename);
// if started fullscreen, give PM new viewport dimensions
if (fullscreen)
globalPM->projectM_resetGL(fvw, fvh);
renderLoop();
// not reached
return 1;
}
float fakePCM[512];
void cleanup() {
delete(globalPM);
exit(0);
}
void renderLoop() {
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, event.key.keysym.mod);
mod = sdl2pmModifier(event.key.keysym.mod);
switch (evt) {
case PROJECTM_KEYDOWN:
switch (key) {
case PROJECTM_K_ESCAPE:
cleanup();
break;
case PROJECTM_K_f: {
fullscreen = !fullscreen;
if (fullscreen) {
resize_display(fvw, fvh, fullscreen);
globalPM->projectM_resetGL(fvw, fvh);
} else {
resize_display(wvw, wvh, fullscreen);
globalPM->projectM_resetGL(wvw, wvh);
}
break;
}
case PROJECTM_K_q:
cleanup();
break;
default:
globalPM->key_handler(evt, key, mod);
}
break;
case PROJECTM_VIDEORESIZE:
wvw = event.resize.w;
wvh = event.resize.h;
resize_display(wvw, wvh, 0);
globalPM->projectM_resetGL(wvw, wvh);
break;
default:
// not for us, give it to projectM
globalPM->key_handler(evt, key, mod);
break;
}
}
fakePCM[0]=0;
for (int x = 1; x< 512;x++)
{
fakePCM[x] = fakePCM[x-1] + (rand()%200 - 100) *.002;
}
globalPM->pcm()->addPCMfloat(fakePCM, 512);
globalPM->renderFrame();
if (doTextureTest)
textureTest();
SDL_GL_SwapBuffers();
}
}
void textureTest() {
static int textureHandle = globalPM->initRenderToTexture();
static int frame = 0;
frame++;
glClear(GL_COLOR_BUFFER_BIT);
glClear(GL_DEPTH_BUFFER_BIT);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
if (fullscreen)
glViewport(0, 0, fvw, fvh);
else
glViewport(0, 0, wvw, wvh);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1, 1, -1, 1, 2, 10);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(cos(frame*0.023), cos(frame*0.017), -5+sin(frame*0.022)*2);
glRotatef(sin(frame*0.0043)*360, sin(frame*0.0017)*360, sin(frame *0.0032)
*360, 1);
glEnable(GL_TEXTURE_2D);
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glBindTexture(GL_TEXTURE_2D, textureHandle);
glColor4d(1.0, 1.0, 1.0, 1.0);
glBegin(GL_QUADS);
glTexCoord2d(0, 1);
glVertex3d(-0.8, 0.8, 0);
glTexCoord2d(0, 0);
glVertex3d(-0.8, -0.8, 0);
glTexCoord2d(1, 0);
glVertex3d(0.8, -0.8, 0);
glTexCoord2d(1, 1);
glVertex3d(0.8, 0.8, 0);
glEnd();
glDisable(GL_TEXTURE_2D);
glMatrixMode(GL_MODELVIEW);
glDisable(GL_DEPTH_TEST);
}