RUTextureAttachmentLoader.cpp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. //
  2. // RUTextureAttachmentLoader.cpp
  3. // red_utils
  4. //
  5. // Created by RedInfinity on 2024/1/16.
  6. //
  7. #include "RUTextureAttachmentLoader.hpp"
  8. ///第三方库
  9. #include "cocos2d.h"
  10. #include "editor-support/spine/AttachmentVertices.h"
  11. NS_RU_BEGIN
  12. static void deleteAttachmentVertices(void* vertices) {
  13. delete static_cast<spine::AttachmentVertices*>(vertices);
  14. }
  15. static unsigned short quadTriangles[6] = {0, 1, 2, 2, 3, 0};
  16. TextureAttachmentLoader* TextureAttachmentLoader::_instance = nullptr;
  17. TextureAttachmentLoader* TextureAttachmentLoader::getInstance() {
  18. if (_instance == nullptr) {
  19. _instance = new TextureAttachmentLoader();
  20. }
  21. return _instance;
  22. }
  23. void TextureAttachmentLoader::destoryInstance() {
  24. if (_instance) {
  25. delete _instance;
  26. _instance = nullptr;
  27. }
  28. }
  29. void TextureAttachmentLoader::rebindAttachmentTexture(spine::Attachment* attachment, const spine::String& imageName) {
  30. if (attachment->getRTTI().isExactly(spine::RegionAttachment::rtti)) {
  31. _rebindRegionAttachmentTexture(static_cast<spine::RegionAttachment*>(attachment), imageName);
  32. } else if (attachment->getRTTI().isExactly(spine::MeshAttachment::rtti)) {
  33. _rebindMeshAttachmentTexture(static_cast<spine::MeshAttachment*>(attachment), imageName);
  34. }
  35. }
  36. spine::RegionAttachment* TextureAttachmentLoader::newRegionAttachment(spine::Skin& skin, const spine::String& name, const spine::String& path) {
  37. spine::RegionAttachment* ret = nullptr;
  38. cocos2d::TextureCache* tc = cocos2d::Director::getInstance()->getTextureCache();
  39. cocos2d::Texture2D* t2d = tc->addImage(path.buffer());
  40. if (t2d) {
  41. ret = new spine::RegionAttachment(name);
  42. ret->setRendererObject(t2d);
  43. ret->setUVs(0, 0, 1, 1, false);
  44. ret->setRegionOffsetX(0.0f);
  45. ret->setRegionOffsetY(0.0f);
  46. const cocos2d::Size& t2dSize = t2d->getContentSizeInPixels();
  47. ret->setRegionWidth(t2dSize.width);
  48. ret->setRegionHeight(t2dSize.width);
  49. ret->setRegionOriginalWidth(t2dSize.width);
  50. ret->setRegionOriginalHeight(t2dSize.width);
  51. }
  52. return ret;
  53. }
  54. spine::MeshAttachment* TextureAttachmentLoader::newMeshAttachment(spine::Skin& skin, const spine::String& name, const spine::String& path) {
  55. spine::MeshAttachment* ret = nullptr;
  56. cocos2d::TextureCache* tc = cocos2d::Director::getInstance()->getTextureCache();
  57. cocos2d::Texture2D* t2d = tc->addImage(path.buffer());
  58. if (t2d) {
  59. ret = new spine::MeshAttachment(name);
  60. ret->setRendererObject(t2d);
  61. ret->setRegionU(0.0f);
  62. ret->setRegionV(0.0f);
  63. ret->setRegionU2(1.0f);
  64. ret->setRegionV2(1.0f);
  65. ret->setRegionRotate(false);
  66. ret->setRegionDegrees(0);
  67. ret->setRegionOffsetX(0.0f);
  68. ret->setRegionOffsetY(0.0f);
  69. const cocos2d::Size& t2dSize = t2d->getContentSizeInPixels();
  70. ret->setRegionWidth(t2dSize.width);
  71. ret->setRegionHeight(t2dSize.width);
  72. ret->setRegionOriginalWidth(t2dSize.width);
  73. ret->setRegionOriginalHeight(t2dSize.width);
  74. }
  75. return ret;
  76. }
  77. spine::BoundingBoxAttachment* TextureAttachmentLoader::newBoundingBoxAttachment(spine::Skin& skin, const spine::String& name) {
  78. return new spine::BoundingBoxAttachment(name);
  79. }
  80. spine::PathAttachment* TextureAttachmentLoader::newPathAttachment(spine::Skin& skin, const spine::String& name) {
  81. return new spine::PathAttachment(name);
  82. }
  83. spine::PointAttachment* TextureAttachmentLoader::newPointAttachment(spine::Skin& skin, const spine::String& name) {
  84. return new spine::PointAttachment(name);
  85. }
  86. spine::ClippingAttachment* TextureAttachmentLoader::newClippingAttachment(spine::Skin& skin, const spine::String& name) {
  87. return new spine::ClippingAttachment(name);
  88. }
  89. void TextureAttachmentLoader::configureAttachment(spine::Attachment* attachment) {
  90. if (attachment->getRTTI().isExactly(spine::RegionAttachment::rtti)) {
  91. _configureRegionAttachment(static_cast<spine::RegionAttachment*>(attachment));
  92. } else if (attachment->getRTTI().isExactly(spine::MeshAttachment::rtti)) {
  93. _configureMeshAttachment(static_cast<spine::MeshAttachment*>(attachment));
  94. }
  95. }
  96. void TextureAttachmentLoader::_rebindRegionAttachmentTexture(spine::RegionAttachment* attachment, const spine::String& imageName) {
  97. cocos2d::TextureCache* tc = cocos2d::Director::getInstance()->getTextureCache();
  98. cocos2d::Texture2D* t2d = tc->addImage(imageName.buffer());
  99. if (t2d) {
  100. attachment->setRendererObject(t2d);
  101. attachment->setUVs(0, 0, 1, 1, false);
  102. attachment->setRegionOffsetX(0.0f);
  103. attachment->setRegionOffsetY(0.0f);
  104. const cocos2d::Size& t2dSize = t2d->getContentSizeInPixels();
  105. attachment->setRegionWidth(t2dSize.width);
  106. attachment->setRegionHeight(t2dSize.width);
  107. attachment->setRegionOriginalWidth(t2dSize.width);
  108. attachment->setRegionOriginalHeight(t2dSize.width);
  109. attachment->updateOffset();
  110. _configureRegionAttachment(attachment);
  111. }
  112. }
  113. void TextureAttachmentLoader::_rebindMeshAttachmentTexture(spine::MeshAttachment* attachment, const spine::String& imageName) {
  114. cocos2d::TextureCache* tc = cocos2d::Director::getInstance()->getTextureCache();
  115. cocos2d::Texture2D* t2d = tc->addImage(imageName.buffer());
  116. if (t2d) {
  117. attachment->setRendererObject(t2d);
  118. attachment->setRegionU(0.0f);
  119. attachment->setRegionV(0.0f);
  120. attachment->setRegionU2(1.0f);
  121. attachment->setRegionV2(1.0f);
  122. attachment->setRegionRotate(false);
  123. attachment->setRegionDegrees(0);
  124. attachment->setRegionOffsetX(0.0f);
  125. attachment->setRegionOffsetY(0.0f);
  126. const cocos2d::Size& t2dSize = t2d->getContentSizeInPixels();
  127. attachment->setRegionWidth(t2dSize.width);
  128. attachment->setRegionHeight(t2dSize.width);
  129. attachment->setRegionOriginalWidth(t2dSize.width);
  130. attachment->setRegionOriginalHeight(t2dSize.width);
  131. attachment->updateUVs();
  132. _configureMeshAttachment(attachment);
  133. }
  134. }
  135. void TextureAttachmentLoader::_configureRegionAttachment(spine::RegionAttachment* attachment) {
  136. cocos2d::Texture2D* t2d = static_cast<cocos2d::Texture2D*>(attachment->getRendererObject());
  137. spine::AttachmentVertices* attachmentVertices = new spine::AttachmentVertices(t2d, 4, quadTriangles, 6);
  138. cocos2d::V3F_C4B_T2F* vertices = attachmentVertices->_triangles->verts;
  139. for (int i = 0, ii = 0; i < 4; ++i, ii += 2) {
  140. vertices[i].texCoords.u = attachment->getUVs()[ii];
  141. vertices[i].texCoords.v = attachment->getUVs()[ii + 1];
  142. }
  143. attachment->setRendererObject(attachmentVertices, deleteAttachmentVertices);
  144. }
  145. void TextureAttachmentLoader::_configureMeshAttachment(spine::MeshAttachment* attachment) {
  146. cocos2d::Texture2D* t2d = static_cast<cocos2d::Texture2D*>(attachment->getRendererObject());
  147. spine::AttachmentVertices* attachmentVertices = new spine::AttachmentVertices(t2d, attachment->getWorldVerticesLength() >> 1, attachment->getTriangles().buffer(), attachment->getTriangles().size());
  148. cocos2d::V3F_C4B_T2F* vertices = attachmentVertices->_triangles->verts;
  149. for (int i = 0, ii = 0, nn = attachment->getWorldVerticesLength(); ii < nn; ++i, ii += 2) {
  150. vertices[i].texCoords.u = attachment->getUVs()[ii];
  151. vertices[i].texCoords.v = attachment->getUVs()[ii + 1];
  152. }
  153. attachment->setRendererObject(attachmentVertices, deleteAttachmentVertices);
  154. }
  155. NS_RU_END