Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

183 строки
3.9 KiB

  1. //
  2. // Lol Engine
  3. //
  4. // Copyright: (c) 2010-2014 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://www.wtfpl.net/ for more details.
  9. //
  10. #include <lol/engine-internal.h>
  11. #include <cstdlib>
  12. #include <cstdio>
  13. #include <cstring>
  14. #if defined _WIN32
  15. # define WIN32_LEAN_AND_MEAN
  16. # include <windows.h>
  17. # undef WIN32_LEAN_AND_MEAN
  18. #endif
  19. #include "textureimage-private.h"
  20. namespace lol
  21. {
  22. /*
  23. * TileSet implementation class
  24. */
  25. TextureImageData* TextureImage::GetNewData()
  26. {
  27. return new TextureImageData();
  28. }
  29. /*
  30. * Public TextureImage class
  31. */
  32. TextureImage::TextureImage(char const *path)
  33. : m_data(GetNewData())
  34. {
  35. Init(path);
  36. }
  37. TextureImage::TextureImage(char const *path, Image* image)
  38. : m_data(GetNewData())
  39. {
  40. Init(path, image);
  41. }
  42. TextureImage::~TextureImage()
  43. {
  44. delete m_data;
  45. }
  46. void TextureImage::Init(char const *path)
  47. {
  48. Init(path, new Image(path));
  49. }
  50. void TextureImage::Init(char const *path, Image* image)
  51. {
  52. m_data->m_name = String("<textureimage> ") + path;
  53. m_data->m_texture = nullptr;
  54. m_data->m_image = image;
  55. m_data->m_image_size = m_data->m_image->GetSize();
  56. m_data->m_texture_size = ivec2(PotUp(m_data->m_image_size.x),
  57. PotUp(m_data->m_image_size.y));
  58. m_drawgroup = DRAWGROUP_TEXTURE;
  59. }
  60. void TextureImage::TickDraw(float seconds, Scene &scene)
  61. {
  62. super::TickDraw(seconds, scene);
  63. if (IsDestroying())
  64. {
  65. if (m_data->m_image)
  66. {
  67. delete m_data->m_image;
  68. m_data->m_image = nullptr;
  69. }
  70. else
  71. {
  72. delete m_data->m_texture;
  73. m_data->m_texture = nullptr;
  74. }
  75. }
  76. else if (m_data->m_image)
  77. {
  78. //Update texture is needed
  79. if (m_data->m_texture)
  80. {
  81. delete m_data->m_texture;
  82. m_data->m_texture = nullptr;
  83. }
  84. PixelFormat format = m_data->m_image->GetFormat();
  85. int planes = BytesPerPixel(format);
  86. int w = m_data->m_texture_size.x;
  87. int h = m_data->m_texture_size.y;
  88. uint8_t *pixels = (uint8_t *)m_data->m_image->Lock();
  89. bool resized = false;
  90. if (w != m_data->m_image_size.x || h != m_data->m_image_size.y)
  91. {
  92. uint8_t *tmp = new uint8_t[planes * w * h];
  93. for (int line = 0; line < m_data->m_image_size.y; line++)
  94. memcpy(tmp + planes * w * line,
  95. pixels + planes * m_data->m_image_size.x * line,
  96. planes * m_data->m_image_size.x);
  97. pixels = tmp;
  98. resized = false;
  99. }
  100. m_data->m_texture = new Texture(ivec2(w, h), format);
  101. m_data->m_texture->SetData(pixels);
  102. if (resized)
  103. delete[] pixels;
  104. delete m_data->m_image;
  105. m_data->m_image = nullptr;
  106. }
  107. }
  108. //-----------------------------------------------------------------------------
  109. char const *TextureImage::GetName()
  110. {
  111. return m_data->m_name.C();
  112. }
  113. void TextureImage::UpdateTexture(Image* image)
  114. {
  115. m_data->m_image = image;
  116. m_data->m_image_size = m_data->m_image->GetSize();
  117. m_data->m_texture_size = ivec2(PotUp(m_data->m_image_size.x),
  118. PotUp(m_data->m_image_size.y));
  119. }
  120. Texture * TextureImage::GetTexture()
  121. {
  122. return m_data->m_texture;
  123. }
  124. Texture const * TextureImage::GetTexture() const
  125. {
  126. return m_data->m_texture;
  127. }
  128. Image * TextureImage::GetImage()
  129. {
  130. return m_data->m_image;
  131. }
  132. Image const * TextureImage::GetImage() const
  133. {
  134. return m_data->m_image;
  135. }
  136. ivec2 TextureImage::GetTextureSize() const
  137. {
  138. return m_data->m_texture_size;
  139. }
  140. void TextureImage::Bind()
  141. {
  142. if (!m_data->m_image && m_data->m_texture)
  143. m_data->m_texture->Bind();
  144. }
  145. void TextureImage::Unbind()
  146. {
  147. ;
  148. }
  149. } /* namespace lol */