2004-07-24 21:38:12 +02:00
|
|
|
#include "precompiled.h"
|
|
|
|
|
2004-07-27 02:26:51 +02:00
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
|
2004-07-24 21:38:12 +02:00
|
|
|
#ifdef _WIN32
|
|
|
|
|
|
|
|
// From win.cpp (so we don't need all the Windows headers in here)
|
|
|
|
void cursor_set(const char* name);
|
|
|
|
|
|
|
|
void cursor_draw(const char* name)
|
|
|
|
{
|
|
|
|
cursor_set(name);
|
|
|
|
}
|
|
|
|
|
|
|
|
#else // #ifdef _WIN32
|
|
|
|
|
|
|
|
#include "lib/res/tex.h"
|
|
|
|
#include "lib/res/ogl_tex.h"
|
|
|
|
#include "lib/res/vfs.h"
|
|
|
|
#include "lib/ogl.h"
|
|
|
|
|
|
|
|
extern int mouse_x, mouse_y;
|
|
|
|
|
|
|
|
struct Cursor {
|
|
|
|
Handle tex;
|
|
|
|
int hotspotx, hotspoty;
|
|
|
|
int w, h;
|
|
|
|
void draw(int x, int y)
|
|
|
|
{
|
|
|
|
tex_bind(tex);
|
|
|
|
glEnable(GL_TEXTURE_2D);
|
|
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
|
|
glEnable(GL_BLEND);
|
|
|
|
glDisable(GL_DEPTH_TEST);
|
|
|
|
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
|
|
|
|
|
|
|
|
glBegin(GL_QUADS);
|
|
|
|
glTexCoord2i(0, 0); glVertex2i( x-hotspotx, y+hotspoty );
|
|
|
|
glTexCoord2i(1, 0); glVertex2i( x-hotspotx+w, y+hotspoty );
|
|
|
|
glTexCoord2i(1, 1); glVertex2i( x-hotspotx+w, y+hotspoty-h );
|
|
|
|
glTexCoord2i(0, 1); glVertex2i( x-hotspotx, y+hotspoty-h );
|
|
|
|
glEnd();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
extern int g_yres;
|
|
|
|
|
|
|
|
// TODO: Remove duplication with Windows cursor code, handle errors, rewrite.
|
|
|
|
void cursor_draw(const char* name)
|
|
|
|
{
|
|
|
|
static struct Cursor* last_cursor = NULL;
|
|
|
|
static char* last_name = NULL;
|
|
|
|
|
|
|
|
if (name == NULL)
|
|
|
|
{
|
|
|
|
// Clean up
|
|
|
|
|
|
|
|
if (last_cursor)
|
|
|
|
{
|
|
|
|
tex_free(last_cursor->tex);
|
|
|
|
delete last_cursor;
|
|
|
|
}
|
|
|
|
last_cursor = NULL;
|
|
|
|
|
|
|
|
delete[] last_name;
|
|
|
|
last_name = NULL;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Don't do much if it's the same as last time
|
|
|
|
if (last_name && !strcmp(name, last_name))
|
|
|
|
{
|
|
|
|
last_cursor->draw(mouse_x, g_yres-mouse_y);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Store the name, so that the code can tell when it's
|
|
|
|
// being called several times with the same cursor
|
|
|
|
delete[] last_name;
|
|
|
|
last_name = new char[strlen(name)+1];
|
|
|
|
strcpy(last_name, name);
|
|
|
|
|
|
|
|
char filename[VFS_MAX_PATH];
|
|
|
|
|
|
|
|
// Load the .txt file containing the pixel offset of
|
|
|
|
// the cursor's hotspot (the bit of it that's
|
|
|
|
// drawn at (mouse_x,mouse_y) )
|
|
|
|
sprintf(filename, "art/textures/cursors/%s.txt", name);
|
|
|
|
|
|
|
|
int hotspotx, hotspoty;
|
|
|
|
{
|
|
|
|
void* data;
|
|
|
|
size_t size;
|
|
|
|
Handle h = vfs_load(filename, data, size);
|
|
|
|
if (h <= 0)
|
|
|
|
{
|
|
|
|
// TODO: Handle errors
|
|
|
|
assert(! "Error loading cursor hotspot .txt file");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (sscanf((const char*)data, "%d %d", &hotspotx, &hotspoty) != 2)
|
|
|
|
{
|
|
|
|
// TODO: Handle errors
|
|
|
|
assert(! "Invalid contents of cursor hotspot .txt file (should be like \"123 456\")");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: Unload the file
|
|
|
|
}
|
|
|
|
|
|
|
|
sprintf(filename, "art/textures/cursors/%s.png", name);
|
|
|
|
|
|
|
|
Handle tex = tex_load(filename);
|
|
|
|
if (tex <= 0)
|
|
|
|
{
|
|
|
|
// TODO: Handle errors
|
|
|
|
assert(! "Error loading cursor texture");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
int err = tex_upload(tex);
|
|
|
|
if (err < 0)
|
|
|
|
{
|
|
|
|
// TODO: Handle errors
|
|
|
|
assert(! "Error uploading cursor texture");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create the cursor object:
|
|
|
|
|
|
|
|
int w, h;
|
|
|
|
tex_info(tex, &w, &h, NULL, NULL, NULL);
|
|
|
|
|
|
|
|
struct Cursor* cursor = new struct Cursor;
|
|
|
|
cursor->tex = tex;
|
|
|
|
cursor->hotspotx = hotspotx;
|
|
|
|
cursor->hotspoty = hotspoty;
|
|
|
|
cursor->w = w;
|
|
|
|
cursor->h = h;
|
|
|
|
|
|
|
|
if (last_cursor)
|
|
|
|
{
|
|
|
|
tex_free(last_cursor->tex);
|
|
|
|
delete last_cursor;
|
|
|
|
}
|
|
|
|
cursor->draw(mouse_x, mouse_y);
|
|
|
|
last_cursor = cursor;
|
|
|
|
}
|
|
|
|
|
2004-07-27 02:26:51 +02:00
|
|
|
#endif // #ifdef _WIN32 / #else
|