|
|
Search
|
|||||||
| Home | Register | Downloads | FAQ | Members List | Calendar | Arcade | Mark Forums Read |
![]() |
|
|
LinkBack | Thread Tools | Display Modes |
|
|
#1 (permalink) |
|
Banned
![]() ![]() ![]() ![]() ![]() Join Date: Feb 2007
Location: Lost.
Posts: 1,767
|
AA in OpenGL plugin
Hi, This topic is mainly for the developers. Since the plugin seems to use framebuffer objects, I have some code that allows for multisampling of render buffers..... Code:
#define STRICT
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdlib.h>
#include "GLee.h"
#include <GL/glu.h>
#include <GL/glaux.h>
#include "resource.h"
// EXT_framebuffer_object - http://oss.sgi.com/projects/ogl-sample/registry/EXT/framebuffer_object.txt
//------------------------------------------------------------------------------
// GLOBALS
//------------------------------------------------------------------------------
HWND g_hWnd = NULL;
HDC g_hDC = NULL;
HGLRC g_hRC = NULL;
GLuint testTexture = -1;
GLuint fbtexture = -1;
GLuint fbo;
GLuint depthBuffer;
GLuint colorBuffer;
GLuint mfbo;
int g_nWindowWidth = 640;
int g_nWindowHeight = 480;
const int RENDERBUFFER_WIDTH = 256;
const int RENDERBUFFER_HEIGHT = 256;
float g_fSpinX_L = 0.0f;
float g_fSpinY_L = 0.0f;
float g_fSpinX_R = 0.0f;
float g_fSpinY_R = 0.0f;
struct Vertex
{
float tu, tv;
float x, y, z;
};
Vertex g_cubeVertices[] =
{
{ 0.0f,0.0f, -1.0f,-1.0f, 1.0f },
{ 1.0f,0.0f, 1.0f,-1.0f, 1.0f },
{ 1.0f,1.0f, 1.0f, 1.0f, 1.0f },
{ 0.0f,1.0f, -1.0f, 1.0f, 1.0f },
{ 1.0f,0.0f, -1.0f,-1.0f,-1.0f },
{ 1.0f,1.0f, -1.0f, 1.0f,-1.0f },
{ 0.0f,1.0f, 1.0f, 1.0f,-1.0f },
{ 0.0f,0.0f, 1.0f,-1.0f,-1.0f },
{ 0.0f,1.0f, -1.0f, 1.0f,-1.0f },
{ 0.0f,0.0f, -1.0f, 1.0f, 1.0f },
{ 1.0f,0.0f, 1.0f, 1.0f, 1.0f },
{ 1.0f,1.0f, 1.0f, 1.0f,-1.0f },
{ 1.0f,1.0f, -1.0f,-1.0f,-1.0f },
{ 0.0f,1.0f, 1.0f,-1.0f,-1.0f },
{ 0.0f,0.0f, 1.0f,-1.0f, 1.0f },
{ 1.0f,0.0f, -1.0f,-1.0f, 1.0f },
{ 1.0f,0.0f, 1.0f,-1.0f,-1.0f },
{ 1.0f,1.0f, 1.0f, 1.0f,-1.0f },
{ 0.0f,1.0f, 1.0f, 1.0f, 1.0f },
{ 0.0f,0.0f, 1.0f,-1.0f, 1.0f },
{ 0.0f,0.0f, -1.0f,-1.0f,-1.0f },
{ 1.0f,0.0f, -1.0f,-1.0f, 1.0f },
{ 1.0f,1.0f, -1.0f, 1.0f, 1.0f },
{ 0.0f,1.0f, -1.0f, 1.0f,-1.0f }
};
//------------------------------------------------------------------------------
// PROTOTYPES
//------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow);
LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
void loadTexture(void);
void init(void);
void render(void);
void shutDown(void);
//------------------------------------------------------------------------------
// Name: WinMain()
// Desc: The application's entry point
//------------------------------------------------------------------------------
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
WNDCLASSEX winClass;
MSG uMsg;
memset(&uMsg,0,sizeof(uMsg));
winClass.lpszClassName = "MY_WINDOWS_CLASS";
winClass.cbSize = sizeof(WNDCLASSEX);
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
winClass.lpfnWndProc = WindowProc;
winClass.hInstance = hInstance;
winClass.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_OPENGL_ICON);
winClass.hIconSm = LoadIcon(hInstance, (LPCTSTR)IDI_OPENGL_ICON);
winClass.hCursor = LoadCursor(NULL, IDC_ARROW);
winClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
winClass.lpszMenuName = NULL;
winClass.cbClsExtra = 0;
winClass.cbWndExtra = 0;
if( !RegisterClassEx(&winClass) )
return E_FAIL;
g_hWnd = CreateWindowEx( NULL, "MY_WINDOWS_CLASS",
"OpenGL - Off-Screen Rendering Using Frame Buffer Objects",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
0, 0, 640, 480, NULL, NULL, hInstance, NULL );
if( g_hWnd == NULL )
return E_FAIL;
ShowWindow( g_hWnd, nCmdShow );
UpdateWindow( g_hWnd );
GLeeInit();
init();
while( uMsg.message != WM_QUIT )
{
if( PeekMessage( &uMsg, NULL, 0, 0, PM_REMOVE ) )
{
TranslateMessage( &uMsg );
DispatchMessage( &uMsg );
}
else
render();
}
shutDown();
UnregisterClass( "MY_WINDOWS_CLASS", winClass.hInstance );
return uMsg.wParam;
}
//------------------------------------------------------------------------------
// Name: WindowProc()
// Desc: The window's message handler
//------------------------------------------------------------------------------
LRESULT CALLBACK WindowProc( HWND hWnd,
UINT msg,
WPARAM wParam,
LPARAM lParam )
{
static POINT ptLastMousePosit_L;
static POINT ptCurrentMousePosit_L;
static bool bMousing_L;
static POINT ptLastMousePosit_R;
static POINT ptCurrentMousePosit_R;
static bool bMousing_R;
switch( msg )
{
case WM_KEYDOWN:
{
switch( wParam )
{
case VK_ESCAPE:
PostQuitMessage(0);
break;
}
}
break;
case WM_LBUTTONDOWN:
{
ptLastMousePosit_L.x = ptCurrentMousePosit_L.x = LOWORD (lParam);
ptLastMousePosit_L.y = ptCurrentMousePosit_L.y = HIWORD (lParam);
bMousing_L = true;
}
break;
case WM_LBUTTONUP:
{
bMousing_L = false;
}
break;
case WM_RBUTTONDOWN:
{
ptLastMousePosit_R.x = ptCurrentMousePosit_R.x = LOWORD (lParam);
ptLastMousePosit_R.y = ptCurrentMousePosit_R.y = HIWORD (lParam);
bMousing_R = true;
}
break;
case WM_RBUTTONUP:
{
bMousing_R = false;
}
break;
case WM_MOUSEMOVE:
{
ptCurrentMousePosit_L.x = LOWORD (lParam);
ptCurrentMousePosit_L.y = HIWORD (lParam);
ptCurrentMousePosit_R.x = LOWORD (lParam);
ptCurrentMousePosit_R.y = HIWORD (lParam);
if( bMousing_L )
{
g_fSpinX_L -= (ptCurrentMousePosit_L.x - ptLastMousePosit_L.x);
g_fSpinY_L -= (ptCurrentMousePosit_L.y - ptLastMousePosit_L.y);
}
if( bMousing_R )
{
g_fSpinX_R -= (ptCurrentMousePosit_R.x - ptLastMousePosit_R.x);
g_fSpinY_R -= (ptCurrentMousePosit_R.y - ptLastMousePosit_R.y);
}
ptLastMousePosit_L.x = ptCurrentMousePosit_L.x;
ptLastMousePosit_L.y = ptCurrentMousePosit_L.y;
ptLastMousePosit_R.x = ptCurrentMousePosit_R.x;
ptLastMousePosit_R.y = ptCurrentMousePosit_R.y;
}
break;
case WM_SIZE:
{
g_nWindowWidth = LOWORD(lParam);
g_nWindowHeight = HIWORD(lParam);
glViewport(0, 0, g_nWindowWidth, g_nWindowHeight);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 45.0, (GLdouble)g_nWindowWidth / (GLdouble)g_nWindowHeight, 0.1, 100.0);
}
break;
case WM_CLOSE:
{
PostQuitMessage(0);
}
break;
case WM_DESTROY:
{
PostQuitMessage(0);
}
break;
default:
{
return DefWindowProc( hWnd, msg, wParam, lParam );
}
break;
}
return 0;
}
//------------------------------------------------------------------------------
// Name: loadTexture()
// Desc:
//------------------------------------------------------------------------------
void loadTexture( void )
{
AUX_RGBImageRec *pTextureImage = auxDIBImageLoad( ".\\test.bmp" );
if( pTextureImage != NULL )
{
glGenTextures( 1, &testTexture );
glBindTexture(GL_TEXTURE_2D, testTexture);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D( GL_TEXTURE_2D, 0, 3,pTextureImage->sizeX,pTextureImage->sizeY, 0,
GL_RGB, GL_UNSIGNED_BYTE,pTextureImage->data );
}
if( pTextureImage != NULL )
{
if( pTextureImage->data != NULL )
free( pTextureImage->data );
free( pTextureImage );
}
}
//------------------------------------------------------------------------------
// Name: init()
// Desc:
//------------------------------------------------------------------------------
void init( void )
{
GLuint PixelFormat;
PIXELFORMATDESCRIPTOR pfd;
memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 16;
pfd.cDepthBits = 16;
g_hDC = GetDC( g_hWnd );
PixelFormat = ChoosePixelFormat( g_hDC, &pfd );
SetPixelFormat( g_hDC, PixelFormat, &pfd);
g_hRC = wglCreateContext( g_hDC );
wglMakeCurrent( g_hDC, g_hRC );
glClearColor( 0.0f, 0.0f, 1.0f, 1.0f );
glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 45.0, (GLdouble)g_nWindowWidth / g_nWindowHeight, 0.1, 100.0 );
//
// If the required extensions are present, get the addresses for the
// functions that we wish to use...
//
//
// EXT_framebuffer_object
//
char *ext = (char*)glGetString( GL_EXTENSIONS );
if( strstr( ext, "EXT_framebuffer_multisample" ) == NULL )
{
MessageBox(NULL,"No framebuffer object multisampling detected!",
"ERROR",MB_OK|MB_ICONEXCLAMATION);
exit(-1);
}
//
// Create a frame-buffer object..
//
glGenFramebuffersEXT( 1, &fbo );
glGenRenderbuffersEXT(1, &colorBuffer);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, colorBuffer);
glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, 8, GL_RGB, RENDERBUFFER_WIDTH, RENDERBUFFER_HEIGHT);
// Initialize the render-buffer for usage as a depth buffer.
// We don't really need this to render things into the frame-buffer object,
// but without it the geometry will not be sorted properly.
glGenRenderbuffersEXT( 1, &depthBuffer );
glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, depthBuffer );
glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, 8, GL_DEPTH_COMPONENT24, RENDERBUFFER_WIDTH, RENDERBUFFER_HEIGHT);
glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depthBuffer );
//
// Check for errors...
//
glGenFramebuffersEXT(1, &mfbo);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mfbo);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, colorBuffer);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depthBuffer);
GLenum status = glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT );
switch( status )
{
case GL_FRAMEBUFFER_COMPLETE_EXT:
//MessageBox(NULL,"GL_FRAMEBUFFER_COMPLETE_EXT!","SUCCESS",MB_OK|MB_ICONEXCLAMATION);
break;
case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
MessageBox(NULL,"GL_FRAMEBUFFER_UNSUPPORTED_EXT!","ERROR",MB_OK|MB_ICONEXCLAMATION);
exit(0);
break;
default:
exit(0);
}
//
// Now, create our dynamic texture. It doesn't actually get loaded with any
// pixel data, but its texture ID becomes associated with the pixel data
// contained in the frame-buffer object. This allows us to bind to this data
// like we would any regular texture.
//
glGenTextures( 1, &fbtexture );
glBindTexture( GL_TEXTURE_2D, fbtexture );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB,
RENDERBUFFER_WIDTH, RENDERBUFFER_HEIGHT,
0, GL_RGB, GL_UNSIGNED_BYTE, 0 );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
// Load a regular texture...
loadTexture();
glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fbo );
glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, fbtexture, 0 );
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}
//-----------------------------------------------------------------------------
// Name: shutDown()
// Desc:
//-----------------------------------------------------------------------------
void shutDown( void )
{
glDeleteTextures( 1, &testTexture );
glDeleteTextures( 1, &fbtexture );
glDeleteFramebuffersEXT( 1, &fbo );
glDeleteRenderbuffersEXT( 1, &depthBuffer );
if( g_hRC != NULL )
{
wglMakeCurrent( NULL, NULL );
wglDeleteContext( g_hRC );
g_hRC = NULL;
}
if( g_hDC != NULL )
{
ReleaseDC( g_hWnd, g_hDC );
g_hDC = NULL;
}
}
//------------------------------------------------------------------------------
// Name: render()
// Desc:
//------------------------------------------------------------------------------
void render( void )
{
//
// Bind the frame-buffer object so we can render to it.
//
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mfbo);
//
// Set up the frame-buffer object just like you would set up a window.
//
glPushAttrib(GL_VIEWPORT_BIT);
glViewport( 0, 0, RENDERBUFFER_WIDTH, RENDERBUFFER_HEIGHT );
glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
//
// Let the user spin the cube about with the right mouse button, so our
// dynamic texture will show motion.
//
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glTranslatef( 0.0f, 0.0f, -5.0f );
glRotatef( -g_fSpinY_R, 1.0f, 0.0f, 0.0f );
glRotatef( -g_fSpinX_R, 0.0f, 1.0f, 0.0f );
//
// Now, render the cube to the frame-buffer object just like you we would
// have done with a regular window.
//
glBindTexture( GL_TEXTURE_2D, testTexture );
glInterleavedArrays( GL_T2F_V3F, 0, g_cubeVertices );
glDrawArrays( GL_QUADS, 0, 24 );
//
// Rebind framebuffers for HWFB MSAA blitting
//
glPopAttrib();
glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, mfbo);
glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fbo);
glBlitFramebufferEXT(0, 0, RENDERBUFFER_WIDTH, RENDERBUFFER_HEIGHT, 0, 0, RENDERBUFFER_WIDTH, RENDERBUFFER_HEIGHT, GL_COLOR_BUFFER_BIT, GL_NEAREST);
// unbind fbo, so that we render to the window framebuffer
glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );
//--------------------------------------------------------------------------
// Now, set up the regular window for rendering...
//--------------------------------------------------------------------------
glClearColor( 0.0f, 0.0f, 1.0f, 1.0f );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
//
// Let the user spin the cube about with the left mouse button.
//
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glTranslatef( 0.0f, 0.0f, -5.0f );
glRotatef( -g_fSpinY_L, 1.0f, 0.0f, 0.0f );
glRotatef( -g_fSpinX_L, 0.0f, 1.0f, 0.0f );
//
// Finally, we'll use the dynamic texture like a regular static texture.
//
glBindTexture( GL_TEXTURE_2D, fbtexture );
glInterleavedArrays( GL_T2F_V3F, 0, g_cubeVertices );
glDrawArrays( GL_QUADS, 0, 24 );
SwapBuffers( g_hDC );
}
|
|
|
|
| Advertisement | [Remove Advertisement] | ||
|
|
|
|
#2 (permalink) |
|
Behind ur girlfriend :D
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Join Date: Feb 2006
Location: Sydney, Australia
Posts: 18,918
|
Trust mudlord to add some of his expertise to the opengl portion :P However, what about AF control?
__________________
![]() ![]() VBA-M | Xtemu | NGOHQ | Post Impact Productions | TNHW | XBCD 0.2.6 | Satanic666's Emulator Compiles Don't be a NOOB, READ THE NGEmu/EmuForums Rules of Conduct Need Help with ePSXe? This is your first stop!. If you don't post all the required information, you don't get help. Everytime someone posts a romsite, God kills a beautiful woman. |
|
|
|
|
|
#6 (permalink) | |
|
Controller Freak
![]() ![]() Join Date: Jul 2008
Location: Argentina
Posts: 156
|
Quote:
__________________
Want to get YouTube to add a great new feature? Let's spread this video to see if we can get it! CPU: Intel Core2Duo E6750 Motherboard: Gigabyte (forgot the model )RAM: 2gb OCZ HD: 320 GB Maxtor Sound card: Sound Blaster X-Fi Graphics Card: Geforce 8600 GT XXX OS: 1. Windows XP Professional 32bit |
|
|
|
|
|
|
#7 (permalink) |
|
Behind ur girlfriend :D
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Join Date: Feb 2006
Location: Sydney, Australia
Posts: 18,918
|
i hardly call mudlord an outsider.
__________________
![]() ![]() VBA-M | Xtemu | NGOHQ | Post Impact Productions | TNHW | XBCD 0.2.6 | Satanic666's Emulator Compiles Don't be a NOOB, READ THE NGEmu/EmuForums Rules of Conduct Need Help with ePSXe? This is your first stop!. If you don't post all the required information, you don't get help. Everytime someone posts a romsite, God kills a beautiful woman. |
|
|
|
|
|
#8 (permalink) |
|
Registered User
![]() Join Date: Jul 2008
Location: Germany
Posts: 89
|
I think he (N4ch007) was talking about himself... ;-)
__________________
Windows xp professional SP2 32 bit AMD Athlon 64 2x2GHz ATI Radeon x1900xt 2GB DDR Terratec Aureon 7.1 Space or: Windows xp home sp2 32 bit intel c2d 2x2GHz nvidia geforce 7900 go 2GB DDR2 |
|
|
|
|
|
#9 (permalink) |
|
Behind ur girlfriend :D
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Join Date: Feb 2006
Location: Sydney, Australia
Posts: 18,918
|
Guten Tag. Maybe, only he would know for sure.
__________________
![]() ![]() VBA-M | Xtemu | NGOHQ | Post Impact Productions | TNHW | XBCD 0.2.6 | Satanic666's Emulator Compiles Don't be a NOOB, READ THE NGEmu/EmuForums Rules of Conduct Need Help with ePSXe? This is your first stop!. If you don't post all the required information, you don't get help. Everytime someone posts a romsite, God kills a beautiful woman. |
|
|
|
|
|
#12 (permalink) |
|
Behind ur girlfriend :D
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Join Date: Feb 2006
Location: Sydney, Australia
Posts: 18,918
|
i think mudlord has enough projects underway as it is.
__________________
![]() ![]() VBA-M | Xtemu | NGOHQ | Post Impact Productions | TNHW | XBCD 0.2.6 | Satanic666's Emulator Compiles Don't be a NOOB, READ THE NGEmu/EmuForums Rules of Conduct Need Help with ePSXe? This is your first stop!. If you don't post all the required information, you don't get help. Everytime someone posts a romsite, God kills a beautiful woman. |
|
|
|
|
|
#13 (permalink) |
![]() ![]() ![]() Join Date: Nov 2006
Location: nowhere
Posts: 418
|
If mudlord aren't wisht to join team, so team can use this code for AA function in Dolphin please))))
__________________
My PC: Core2Duo e6750 2,66 Ghz (@ 3,20 Ghz), MB: Gigabyte GA-965p-s3, Ram: 2Gb (2x1) Corsair XMS2 PRO pc6400 800Mhz 4-4-4-12, Video: gf9800Gt 1Gb, HDD: Seagate SATAII 400Gb (372Gb) |
|
|
|
|
|
#15 (permalink) | |
|
Banned
![]() ![]() ![]() ![]() ![]() Join Date: Feb 2007
Location: Lost.
Posts: 1,767
|
Quote:
You see, when I program, I prefer to test things out thoroughly. And this addon isn't exactly a walk in the park, as it involves some major changes to how render to texture operates in the OpenGL plugin.. Last edited by mudlord; September 12th, 2008 at 06:44.. Reason: Automerged Doublepost |
|
|
|
|
|
|
#16 (permalink) |
|
Controller Freak
![]() ![]() Join Date: Jul 2008
Location: Argentina
Posts: 156
|
heheh yes, i was talking about myself. i´m an outsider on emu coding, but not on using
__________________
Want to get YouTube to add a great new feature? Let's spread this video to see if we can get it! CPU: Intel Core2Duo E6750 Motherboard: Gigabyte (forgot the model )RAM: 2gb OCZ HD: 320 GB Maxtor Sound card: Sound Blaster X-Fi Graphics Card: Geforce 8600 GT XXX OS: 1. Windows XP Professional 32bit |
|
|
|
|
|
#17 (permalink) | |
|
Behind ur girlfriend :D
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Join Date: Feb 2006
Location: Sydney, Australia
Posts: 18,918
|
Quote:
The Emulator Zone - Gamecube
__________________
![]() ![]() VBA-M | Xtemu | NGOHQ | Post Impact Productions | TNHW | XBCD 0.2.6 | Satanic666's Emulator Compiles Don't be a NOOB, READ THE NGEmu/EmuForums Rules of Conduct Need Help with ePSXe? This is your first stop!. If you don't post all the required information, you don't get help. Everytime someone posts a romsite, God kills a beautiful woman. |
|
|
|
|
![]() |
| Thread Tools | |
| Display Modes | |
|
|