25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

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