136 lines
2.6 KiB

  1. //
  2. // Deus Hax (working title)
  3. // Copyright (c) 2010 Sam Hocevar <sam@hocevar.net>
  4. //
  5. #if defined HAVE_CONFIG_H
  6. # include "config.h"
  7. #endif
  8. #include <cstdlib>
  9. #include <cmath>
  10. #ifdef WIN32
  11. # define WIN32_LEAN_AND_MEAN
  12. # include <windows.h>
  13. #endif
  14. #if defined __APPLE__ && defined __MACH__
  15. # include <OpenGL/gl.h>
  16. #else
  17. # define GL_GLEXT_PROTOTYPES
  18. # include <GL/gl.h>
  19. #endif
  20. #include <SDL.h>
  21. #include <SDL_image.h>
  22. #include "tileset.h"
  23. /*
  24. * TileSet implementation class
  25. */
  26. class TileSetData
  27. {
  28. friend class TileSet;
  29. private:
  30. char *name;
  31. int *tiles;
  32. int ntiles;
  33. SDL_Surface *img;
  34. GLuint texture;
  35. };
  36. /*
  37. * Public TileSet class
  38. */
  39. TileSet::TileSet(char const *path)
  40. {
  41. data = new TileSetData();
  42. data->name = strdup(path);
  43. data->tiles = NULL;
  44. data->ntiles = 0;
  45. data->img = NULL;
  46. data->texture = 0;
  47. for (char const *name = path; *name; name++)
  48. if ((data->img = IMG_Load(name)))
  49. break;
  50. if (!data->img)
  51. {
  52. SDL_Quit();
  53. exit(1);
  54. }
  55. }
  56. TileSet::~TileSet()
  57. {
  58. free(data->tiles);
  59. free(data->name);
  60. delete data;
  61. }
  62. Entity::Group TileSet::GetGroup()
  63. {
  64. return GROUP_BEFORE;
  65. }
  66. void TileSet::TickRender(float deltams)
  67. {
  68. Entity::TickRender(deltams);
  69. if (data->img)
  70. {
  71. glGenTextures(1, &data->texture);
  72. glBindTexture(GL_TEXTURE_2D, data->texture);
  73. glTexImage2D(GL_TEXTURE_2D, 0, 4, data->img->w, data->img->h, 0,
  74. GL_RGBA, GL_UNSIGNED_BYTE, data->img->pixels);
  75. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  76. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  77. SDL_FreeSurface(data->img);
  78. data->img = NULL;
  79. }
  80. else if (ref == 0)
  81. {
  82. glDeleteTextures(1, &data->texture);
  83. destroy = 1;
  84. }
  85. }
  86. char const *TileSet::GetName()
  87. {
  88. return data->name;
  89. }
  90. void TileSet::BlitTile(uint32_t id, int x, int y, int z, int o)
  91. {
  92. float tx = .0625f * (id & 0xf);
  93. float ty = .0625f * ((id >> 4) & 0xf);
  94. float sqrt2 = sqrtf(2.0f);
  95. int off = o ? 32 : 0;
  96. if (!data->img)
  97. {
  98. glBindTexture(GL_TEXTURE_2D, data->texture);
  99. glBegin(GL_QUADS);
  100. glTexCoord2f(tx, ty);
  101. glVertex3f(x, sqrt2 * (y + off), sqrt2 * (z + off));
  102. glTexCoord2f(tx + .0625f, ty);
  103. glVertex3f(x + 32, sqrt2 * (y + off), sqrt2 * (z + off));
  104. glTexCoord2f(tx + .0625f, ty + .0625f);
  105. glVertex3f(x + 32, sqrt2 * (y + 32), sqrt2 * z);
  106. glTexCoord2f(tx, ty + .0625f);
  107. glVertex3f(x, sqrt2 * (y + 32), sqrt2 * z);
  108. glEnd();
  109. }
  110. }