blending effect for pause

This commit is contained in:
damdoum 2007-02-13 17:50:15 +00:00
parent 0d76a6288a
commit 4080704c88
7 changed files with 140 additions and 18 deletions

View File

@ -76,8 +76,12 @@ static int colnum=0;
static void refresh(); static void refresh();
static GtkWidget * wPaint; static GtkWidget * wPaint;
static GtkSpinButton * wSpin; static GtkSpinButton * wSpin;
static u16 mem[0x100]; static int gl_context_num=0;
#define TILE_NUM_MAX 1024
#define TILE_W_SZ 8
#define TILE_H_SZ 8
static u16 tiles[TILE_NUM_MAX][TILE_H_SZ*TILE_W_SZ];
static COLOR c; static COLOR c;
static COLOR32 c32; static COLOR32 c32;
@ -89,14 +93,101 @@ static void wtools_4_update() {
} }
static void refresh() { static void refresh() {
u16 palette_16[64];
u16 palette_256[64];
u8 * index16 = mem_addr[memnum];
u8 * index256 = mem_addr[memnum];
u8 * indexBMP = mem_addr[memnum];
u16 * pal;
int tile_n, index;
guint Textures;
return;
// this little thing doesnt display properly
// quad gets drawn in the wrong place ?
if (!my_gl_Begin(gl_context_num)) return;
my_gl_Identity();
glClearColor(0.5,0.5,0.5,1.0);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
my_gl_DrawBeautifulQuad();
my_gl_End(gl_context_num);
return;
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &Textures);
//proxy
glBindTexture(GL_TEXTURE_2D, Textures);
glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_RGBA,
256, 256, 0,
GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, NULL);
switch(colnum) {
case 0: //BMP
for (tile_n=0; tile_n<TILE_NUM_MAX; tile_n++) {
glTexSubImage2D(GL_TEXTURE_2D, 0,
(tile_n & 0x1F)<<3, (tile_n >> 5)<<3,
8, 8, GL_RGBA,
GL_UNSIGNED_SHORT_1_5_5_5_REV, indexBMP);
indexBMP +=64;
}
break;
case 1: //256c
if (pal = pal_addr[palindex]) {
pal += palnum*256;
for (tile_n=0; tile_n<1024; tile_n++) {
for (index=0; index<64; index++) {
palette_256[index]=pal[*index256];
index256++;
}
glTexSubImage2D(GL_TEXTURE_2D, 0,
(tile_n & 0x1F)<<3, (tile_n >> 5)<<3,
8, 8, GL_RGBA,
GL_UNSIGNED_SHORT_1_5_5_5_REV, palette_256);
}
}
break;
case 2: //16c
if (pal = pal_addr[palindex]) {
pal += palnum*16;
for (tile_n=0; tile_n<1024; tile_n++) {
for (index=0; index<64; index++) {
if (index & 1) continue;
palette_16[index] =pal[*index16 & 15];
palette_16[index+1]=pal[*index16 >> 4];
index16++;
}
glTexSubImage2D(GL_TEXTURE_2D, 0,
(tile_n & 0x1F)<<3, (tile_n >> 5)<<3,
8, 8, GL_RGBA,
GL_UNSIGNED_SHORT_1_5_5_5_REV, palette_16);
}
}
break;
}
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex2d(-1.0, 1.0);
glTexCoord2f(0.0, 1.0); glVertex2d(-1.0,-1.0);
glTexCoord2f(1.0, 1.0); glVertex2d( 1.0,-1.0);
glTexCoord2f(1.0, 0.0); glVertex2d( 1.0, 1.0);
glEnd();
glDeleteTextures(1, &Textures);
my_gl_End(gl_context_num);
} }
static void initialize() { static void initialize() {
GtkComboBox * combo; GtkComboBox * combo;
if (init) return; if (init) return;
init=TRUE;
wPaint= glade_xml_get_widget(xml_tools, "wDraw_Tile"); wPaint= glade_xml_get_widget(xml_tools, "wDraw_Tile");
wSpin = (GtkSpinButton*)glade_xml_get_widget(xml_tools, "wtools_4_palnum"); wSpin = (GtkSpinButton*)glade_xml_get_widget(xml_tools, "wtools_4_palnum");
@ -104,7 +195,9 @@ static void initialize() {
init_combo_palette(combo, pal_addr); init_combo_palette(combo, pal_addr);
combo = (GtkComboBox*)glade_xml_get_widget(xml_tools, "wtools_4_memory"); combo = (GtkComboBox*)glade_xml_get_widget(xml_tools, "wtools_4_memory");
init_combo_memory(combo, mem_addr); init_combo_memory(combo, mem_addr);
init=TRUE;
gl_context_num = init_GL_free(wPaint);
gtk_widget_show(wPaint);
} }
@ -136,6 +229,10 @@ void on_wtools_4_rXX_toggled (GtkToggleButton *togglebutton, gpointer user_data
colnum = dyn_CAST(int,user_data); colnum = dyn_CAST(int,user_data);
refresh(); refresh();
} }
gboolean on_wDraw_Tile_expose_event (GtkWidget * w, GdkEventExpose * e, gpointer user_data) {
refresh();
return TRUE;
}

View File

@ -67,5 +67,5 @@ G_MODULE_EXPORT void on_wtools_4_memory_changed (GtkComboBox *, gpoi
G_MODULE_EXPORT void on_wtools_4_palette_changed (GtkComboBox *, gpointer ); G_MODULE_EXPORT void on_wtools_4_palette_changed (GtkComboBox *, gpointer );
G_MODULE_EXPORT void on_wtools_4_palnum_value_changed (GtkSpinButton *, gpointer ); G_MODULE_EXPORT void on_wtools_4_palnum_value_changed (GtkSpinButton *, gpointer );
G_MODULE_EXPORT void on_wtools_4_rXX_toggled (GtkToggleButton *togglebutton, gpointer user_data); G_MODULE_EXPORT void on_wtools_4_rXX_toggled (GtkToggleButton *togglebutton, gpointer user_data);
G_MODULE_EXPORT gboolean on_wDraw_Tile_expose_event (GtkWidget *, GdkEventExpose *, gpointer );

View File

@ -145,7 +145,8 @@ gboolean EmuLoop(gpointer data)
gtk_widget_queue_draw(pDrawingArea2); gtk_widget_queue_draw(pDrawingArea2);
return TRUE; return TRUE;
} }
gtk_widget_queue_draw(pDrawingArea);
gtk_widget_queue_draw(pDrawingArea2);
regMainLoop = FALSE; regMainLoop = FALSE;
return FALSE; return FALSE;
} }

View File

@ -39,16 +39,15 @@ GtkWidget *pDrawingTexArea;
#undef _DUP4 #undef _DUP4
#undef _DUP2 #undef _DUP2
INLINE void my_gl_Identity() { void my_gl_Identity() {
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);
glLoadIdentity(); glLoadIdentity();
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); glLoadIdentity();
} }
INLINE void my_gl_DrawBeautifulQuad() { void my_gl_DrawBeautifulQuad() {
// beautiful quad // beautiful quad
glColor4ub(255,255,255,128);
glBegin(GL_QUADS); glBegin(GL_QUADS);
glColor3ub(255,0,0); glVertex2d(-0.75,-0.75); glColor3ub(255,0,0); glVertex2d(-0.75,-0.75);
glColor3ub(128,255,0); glVertex2d(-0.75, 0.75); glColor3ub(128,255,0); glVertex2d(-0.75, 0.75);
@ -58,6 +57,13 @@ INLINE void my_gl_DrawBeautifulQuad() {
glColor3ub(255,255,255); glColor3ub(255,255,255);
} }
void my_gl_DrawLogo() {
}
BOOL my_gl_Begin (int screen) { BOOL my_gl_Begin (int screen) {
return gdk_gl_drawable_gl_begin(my_glDrawable[screen], my_glContext[screen]); return gdk_gl_drawable_gl_begin(my_glDrawable[screen], my_glContext[screen]);
} }
@ -75,6 +81,7 @@ void my_gl_Clear(int screen) {
/* Set the background black */ /* Set the background black */
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
my_gl_DrawBeautifulQuad(); my_gl_DrawBeautifulQuad();
@ -86,7 +93,9 @@ void init_GL(GtkWidget * widget, int screen, int share_num) {
// init GL capability // init GL capability
if (!gtk_widget_set_gl_capability( if (!gtk_widget_set_gl_capability(
widget, my_glConfig, widget, my_glConfig,
&my_glContext[share_num], TRUE, my_glContext[share_num],
//NULL,
TRUE,
GDK_GL_RGBA_TYPE)) { GDK_GL_RGBA_TYPE)) {
printf ("gtk_widget_set_gl_capability\n"); printf ("gtk_widget_set_gl_capability\n");
exit(1); exit(1);
@ -94,7 +103,7 @@ void init_GL(GtkWidget * widget, int screen, int share_num) {
// realize so that we get a GdkWindow // realize so that we get a GdkWindow
gtk_widget_realize(widget); gtk_widget_realize(widget);
// make sure we realize // make sure we realize
while (gtk_events_pending()) gtk_main_iteration(); // while (gtk_events_pending()) gtk_main_iteration();
my_glDrawable[screen] = gtk_widget_get_gl_drawable(widget); my_glDrawable[screen] = gtk_widget_get_gl_drawable(widget);
if (screen == share_num) { if (screen == share_num) {
@ -160,7 +169,9 @@ INLINE void my_gl_Texture2D() {
} }
INLINE void my_gl_ScreenTex() { INLINE void my_gl_ScreenTex() {
glTexImage2D(GL_TEXTURE_2D, 0, 4, // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
// pause effect
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
256, 512, 0, GL_RGBA, 256, 512, 0, GL_RGBA,
GL_UNSIGNED_SHORT_1_5_5_5_REV, GL_UNSIGNED_SHORT_1_5_5_5_REV,
// GL_UNSIGNED_SHORT_5_5_5_1, // GL_UNSIGNED_SHORT_5_5_5_1,
@ -172,9 +183,9 @@ void my_gl_ScreenTexApply(int screen) {
glBegin(GL_QUADS); glBegin(GL_QUADS);
// texcoords 0.375 means 192, 1 means 256 // texcoords 0.375 means 192, 1 means 256
glTexCoord2f(0.0, off+0.000); glVertex2d(-1.0, 1.0); glTexCoord2f(0.0, off+0.000); glVertex2d(-1.0, 1.0);
glTexCoord2f(0.0, off+0.375); glVertex2d(-1.0,-1.0);
glTexCoord2f(1.0, off+0.375); glVertex2d( 1.0,-1.0);
glTexCoord2f(1.0, off+0.000); glVertex2d( 1.0, 1.0); glTexCoord2f(1.0, off+0.000); glVertex2d( 1.0, 1.0);
glTexCoord2f(1.0, off+0.375); glVertex2d( 1.0,-1.0);
glTexCoord2f(0.0, off+0.375); glVertex2d(-1.0,-1.0);
glEnd(); glEnd();
} }
@ -188,12 +199,16 @@ gboolean screen (GtkWidget * widget, int viewportscreen) {
if (!my_gl_Begin(viewportscreen)) return TRUE; if (!my_gl_Begin(viewportscreen)) return TRUE;
glLoadIdentity(); // glLoadIdentity();
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
my_gl_DrawBeautifulQuad(); glEnable(GL_TEXTURE_2D);
// glEnable(GL_BLEND);
// glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
if (desmume_running()) { if (desmume_running()) {
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glColor4ub(255,255,255,255);
// rotate // rotate
glRotatef(ScreenRotate, 0.0, 0.0, 1.0); glRotatef(ScreenRotate, 0.0, 0.0, 1.0);
// draw screen // draw screen
@ -201,8 +216,15 @@ gboolean screen (GtkWidget * widget, int viewportscreen) {
if (viewportscreen==0) { if (viewportscreen==0) {
my_gl_ScreenTex(); my_gl_ScreenTex();
} }
my_gl_ScreenTexApply(screen); } else {
// background color black
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glColor4f(0.5f,0.5f,0.5f,0.5f);
} }
my_gl_ScreenTexApply(screen);
glDisable(GL_TEXTURE_2D);
// glDisable(GL_BLEND);
my_gl_End(viewportscreen); my_gl_End(viewportscreen);
return TRUE; return TRUE;
} }

View File

@ -33,6 +33,7 @@
BOOL my_gl_Begin (int screen); BOOL my_gl_Begin (int screen);
void my_gl_End (int screen); void my_gl_End (int screen);
void my_gl_Clear(int screen); void my_gl_Clear(int screen);
void my_gl_DrawBeautifulQuad();
void init_GL_capabilities(); void init_GL_capabilities();
void init_GL(GtkWidget * widget, int screen, int share_num); void init_GL(GtkWidget * widget, int screen, int share_num);

View File

@ -609,7 +609,7 @@ ARM7 cpu</property>
<property name="width_request">256</property> <property name="width_request">256</property>
<property name="height_request">256</property> <property name="height_request">256</property>
<property name="events">GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK</property> <property name="events">GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK</property>
<signal name="expose_event" handler="on_wDraw_Tex_expose_event" last_modification_time="Mon, 12 Feb 2007 17:45:04 GMT"/> <signal name="expose_event" handler="on_wDraw_Tile_expose_event" last_modification_time="Mon, 12 Feb 2007 17:45:04 GMT"/>
</widget> </widget>
<packing> <packing>
<property name="left_attach">0</property> <property name="left_attach">0</property>

View File

@ -112,6 +112,7 @@ typedef void (*VoidFunPtr)();
void notify_Tools(); void notify_Tools();
void register_Tool(VoidFunPtr fun); void register_Tool(VoidFunPtr fun);
void unregister_Tool(VoidFunPtr fun); void unregister_Tool(VoidFunPtr fun);
gchar * get_ui_file (const char *filename);
/* callbacks.c */ /* callbacks.c */
void enable_rom_features(); void enable_rom_features();