Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 

289 Zeilen
6.7 KiB

  1. //
  2. // Lol Engine
  3. //
  4. // Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net>
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the Do What The Fuck You Want To
  7. // Public License, Version 2, as published by Sam Hocevar. See
  8. // http://sam.zoy.org/projects/COPYING.WTFPL for more details.
  9. //
  10. #if defined HAVE_CONFIG_H
  11. # include "config.h"
  12. #endif
  13. #include <cstdlib>
  14. #include <cstdio>
  15. #include <cmath>
  16. #include <cstring>
  17. #if defined WIN32 && !defined _XBOX
  18. # define WIN32_LEAN_AND_MEAN
  19. # include <windows.h>
  20. #endif
  21. #include "core.h"
  22. #include "lolgl.h"
  23. using namespace std;
  24. namespace lol
  25. {
  26. /*
  27. * TileSet implementation class
  28. */
  29. class TileSetData
  30. {
  31. friend class TileSet;
  32. private:
  33. char *name, *path;
  34. int *tiles, ntiles;
  35. ivec2 size, isize, count;
  36. float dilate, tx, ty;
  37. Image *img;
  38. #if defined _XBOX
  39. # define STR0(x) #x
  40. # define STR(x) STR0(x)
  41. # pragma message(__FILE__ "(" STR(__LINE__) "): warning: TileSet not implemented")
  42. # undef STR
  43. # undef STR0
  44. #else
  45. GLuint texture;
  46. #endif
  47. };
  48. /*
  49. * Public TileSet class
  50. */
  51. TileSet::TileSet(char const *path, ivec2 size, ivec2 count, float dilate)
  52. : data(new TileSetData())
  53. {
  54. data->name = (char *)malloc(10 + strlen(path) + 1);
  55. data->path = data->name + 10;
  56. sprintf(data->name, "<tileset> %s", path);
  57. data->tiles = NULL;
  58. #if defined _XBOX
  59. # define STR0(x) #x
  60. # define STR(x) STR0(x)
  61. # pragma message(__FILE__ "(" STR(__LINE__) "): warning: TileSet::TileSet() not implemented")
  62. # undef STR
  63. # undef STR0
  64. #else
  65. data->texture = 0;
  66. #endif
  67. data->img = new Image(path);
  68. data->isize = data->img->GetSize();
  69. if (count.x > 0 && count.y > 0)
  70. {
  71. data->count = count;
  72. data->size = data->isize / count;
  73. }
  74. else
  75. {
  76. if (size.x <= 0 || size.y <= 0)
  77. size = ivec2(32, 32);
  78. data->count.x = data->isize.x > size.x ? data->isize.x / size.x : 1;
  79. data->count.y = data->isize.y > size.y ? data->isize.y / size.y : 1;
  80. data->size = size;
  81. }
  82. data->tx = (float)data->size.x / PotUp(data->isize.x);
  83. data->ty = (float)data->size.y / PotUp(data->isize.y);
  84. data->dilate = dilate;
  85. data->ntiles = data->count.x * data->count.y;
  86. m_drawgroup = DRAWGROUP_BEFORE;
  87. }
  88. TileSet::~TileSet()
  89. {
  90. free(data->tiles);
  91. free(data->name);
  92. delete data;
  93. }
  94. void TileSet::TickDraw(float deltams)
  95. {
  96. Entity::TickDraw(deltams);
  97. if (IsDestroying())
  98. {
  99. if (data->img)
  100. delete data->img;
  101. #if defined _XBOX
  102. # define STR0(x) #x
  103. # define STR(x) STR0(x)
  104. # pragma message(__FILE__ "(" STR(__LINE__) "): warning: TileSet::TickDraw() not implemented")
  105. # undef STR
  106. # undef STR0
  107. #else
  108. else
  109. glDeleteTextures(1, &data->texture);
  110. #endif
  111. }
  112. else if (data->img)
  113. {
  114. #if defined _XBOX
  115. # define STR0(x) #x
  116. # define STR(x) STR0(x)
  117. # pragma message(__FILE__ "(" STR(__LINE__) "): warning: TileSet::TickDraw() not implemented")
  118. # undef STR
  119. # undef STR0
  120. #else
  121. GLuint format;
  122. int planes;
  123. switch (data->img->GetFormat())
  124. {
  125. case Image::FORMAT_RGB:
  126. format = GL_RGB;
  127. planes = 3;
  128. break;
  129. case Image::FORMAT_RGBA:
  130. default:
  131. format = GL_RGBA;
  132. planes = 4;
  133. break;
  134. }
  135. int w = PotUp(data->isize.x);
  136. int h = PotUp(data->isize.y);
  137. uint8_t *pixels = (uint8_t *)data->img->GetData();
  138. if (w != data->isize.x || h != data->isize.y)
  139. {
  140. uint8_t *tmp = (uint8_t *)malloc(planes * w * h);
  141. for (int line = 0; line < data->isize.y; line++)
  142. memcpy(tmp + planes * w * line,
  143. pixels + planes * data->isize.x * line,
  144. planes * data->isize.x);
  145. pixels = tmp;
  146. }
  147. glGenTextures(1, &data->texture);
  148. glEnable(GL_TEXTURE_2D);
  149. glBindTexture(GL_TEXTURE_2D, data->texture);
  150. glTexImage2D(GL_TEXTURE_2D, 0, format, w, h, 0,
  151. format, GL_UNSIGNED_BYTE, pixels);
  152. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  153. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  154. if (pixels != data->img->GetData())
  155. free(pixels);
  156. #endif
  157. delete data->img;
  158. data->img = NULL;
  159. }
  160. }
  161. char const *TileSet::GetName()
  162. {
  163. return data->name;
  164. }
  165. ivec2 TileSet::GetCount() const
  166. {
  167. return data->count;
  168. }
  169. ivec2 TileSet::GetSize(int tileid) const
  170. {
  171. return data->size;
  172. }
  173. void TileSet::Bind()
  174. {
  175. #if defined _XBOX
  176. # define STR0(x) #x
  177. # define STR(x) STR0(x)
  178. # pragma message(__FILE__ "(" STR(__LINE__) "): warning: TileSet::Bind() not implemented")
  179. # undef STR
  180. # undef STR0
  181. #else
  182. if (!data->img && data->texture)
  183. {
  184. glActiveTexture(GL_TEXTURE0);
  185. glBindTexture(GL_TEXTURE_2D, data->texture);
  186. }
  187. #endif
  188. }
  189. void TileSet::BlitTile(uint32_t id, vec3 pos, int o,
  190. float *vertex, float *texture)
  191. {
  192. float tx = data->tx * ((id & 0xffff) % data->count.x);
  193. float ty = data->ty * ((id & 0xffff) / data->count.x);
  194. float dilate = data->dilate;
  195. int dx = data->size.x;
  196. int dy = o ? 0 : data->size.y;
  197. int dz = o ? data->size.y : 0;
  198. #if defined _XBOX
  199. # define STR0(x) #x
  200. # define STR(x) STR0(x)
  201. # pragma message(__FILE__ "(" STR(__LINE__) "): warning: TileSet::TileSet() not implemented")
  202. # undef STR
  203. # undef STR0
  204. #else
  205. if (!data->img && data->texture)
  206. {
  207. float tmp[10];
  208. *vertex++ = tmp[0] = pos.x;
  209. *vertex++ = tmp[1] = dilate * (pos.y + dy);
  210. *vertex++ = tmp[2] = dilate * (pos.z + dz);
  211. *texture++ = tmp[3] = tx;
  212. *texture++ = tmp[4] = ty;
  213. *vertex++ = pos.x + dx;
  214. *vertex++ = dilate * (pos.y + dy);
  215. *vertex++ = dilate * (pos.z + dz);
  216. *texture++ = tx + data->tx;
  217. *texture++ = ty;
  218. *vertex++ = tmp[5] = pos.x + dx;
  219. *vertex++ = tmp[6] = dilate * pos.y;
  220. *vertex++ = tmp[7] = dilate * pos.z;
  221. *texture++ = tmp[8] = tx + data->tx;
  222. *texture++ = tmp[9] = ty + data->ty;
  223. *vertex++ = tmp[0];
  224. *vertex++ = tmp[1];
  225. *vertex++ = tmp[2];
  226. *texture++ = tmp[3];
  227. *texture++ = tmp[4];
  228. *vertex++ = tmp[5];
  229. *vertex++ = tmp[6];
  230. *vertex++ = tmp[7];
  231. *texture++ = tmp[8];
  232. *texture++ = tmp[9];
  233. *vertex++ = pos.x;
  234. *vertex++ = dilate * pos.y;
  235. *vertex++ = dilate * pos.z;
  236. *texture++ = tx;
  237. *texture++ = ty + data->ty;
  238. }
  239. else
  240. {
  241. memset(vertex, 0, 3 * sizeof(float));
  242. memset(texture, 0, 2 * sizeof(float));
  243. }
  244. #endif
  245. }
  246. } /* namespace lol */