diff --git a/CHANGELOG.md b/CHANGELOG.md index 99a4bbcf2..269a19f75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,7 @@ * Optimized rendering by removing all per-frame allocation in `SkeletonRenderer`, resulting in 15% performance increase for large numbers of skeletons being rendered per frame. * Added support for two color tinting. Tinting is enabled/disabled per `SkeletonRenderer`/`SkeletonAnimation` instance. Use `SkeletonRenderer::setTwoColorTint()`. Note that two color tinting requires the use of a non-standard shader and vertex format. This means that skeletons rendered with two color tinting will break batching. However, skeletons with two color tinting enabled and rendered after each other will be batched. * Updated example to use Cocos2d-x 3.14.1. + * Added mesh debug rendering. Enable/Disable via `SkeletonRenderer::setDebugMeshesEnabled()`. ### Cocos2d-Objc * Fixed renderer to work with 3.6 changes diff --git a/spine-cocos2dx/example/Classes/RaptorExample.cpp b/spine-cocos2dx/example/Classes/RaptorExample.cpp index f1a648f66..71cbb782e 100644 --- a/spine-cocos2dx/example/Classes/RaptorExample.cpp +++ b/spine-cocos2dx/example/Classes/RaptorExample.cpp @@ -55,9 +55,10 @@ bool RaptorExample::init () { EventListenerTouchOneByOne* listener = EventListenerTouchOneByOne::create(); listener->onTouchBegan = [this] (Touch* touch, Event* event) -> bool { - if (!skeletonNode->getDebugBonesEnabled()) + if (!skeletonNode->getDebugBonesEnabled()) { skeletonNode->setDebugBonesEnabled(true); - else if (skeletonNode->getTimeScale() == 1) + skeletonNode->setDebugMeshesEnabled(true); + } else if (skeletonNode->getTimeScale() == 1) skeletonNode->setTimeScale(0.3f); else Director::getInstance()->replaceScene(TankExample::scene()); diff --git a/spine-cocos2dx/src/spine/SkeletonRenderer.cpp b/spine-cocos2dx/src/spine/SkeletonRenderer.cpp index 3b5ec595e..26ef4c8b1 100644 --- a/spine-cocos2dx/src/spine/SkeletonRenderer.cpp +++ b/spine-cocos2dx/src/spine/SkeletonRenderer.cpp @@ -75,21 +75,21 @@ void SkeletonRenderer::setSkeletonData (spSkeletonData *skeletonData, bool ownsS } SkeletonRenderer::SkeletonRenderer () - : _atlas(nullptr), _attachmentLoader(nullptr), _debugSlots(false), _debugBones(false), _timeScale(1) { + : _atlas(nullptr), _attachmentLoader(nullptr), _debugSlots(false), _debugBones(false), _debugMeshes(false), _timeScale(1) { } SkeletonRenderer::SkeletonRenderer (spSkeletonData *skeletonData, bool ownsSkeletonData) - : _atlas(nullptr), _attachmentLoader(nullptr), _debugSlots(false), _debugBones(false), _timeScale(1) { + : _atlas(nullptr), _attachmentLoader(nullptr), _debugSlots(false), _debugBones(false), _debugMeshes(false), _timeScale(1) { initWithData(skeletonData, ownsSkeletonData); } SkeletonRenderer::SkeletonRenderer (const std::string& skeletonDataFile, spAtlas* atlas, float scale) - : _atlas(nullptr), _attachmentLoader(nullptr), _debugSlots(false), _debugBones(false), _timeScale(1) { + : _atlas(nullptr), _attachmentLoader(nullptr), _debugSlots(false), _debugBones(false), _debugMeshes(false), _timeScale(1) { initWithJsonFile(skeletonDataFile, atlas, scale); } SkeletonRenderer::SkeletonRenderer (const std::string& skeletonDataFile, const std::string& atlasFile, float scale) - : _atlas(nullptr), _attachmentLoader(nullptr), _debugSlots(false), _debugBones(false), _timeScale(1) { + : _atlas(nullptr), _attachmentLoader(nullptr), _debugSlots(false), _debugBones(false), _debugMeshes(false), _timeScale(1) { initWithJsonFile(skeletonDataFile, atlasFile, scale); } @@ -368,7 +368,7 @@ void SkeletonRenderer::draw (Renderer* renderer, const Mat4& transform, uint32_t } } - if (_debugSlots || _debugBones) { + if (_debugSlots || _debugBones || _debugMeshes) { drawDebug(renderer, transform, transformFlags); } } @@ -416,6 +416,26 @@ void SkeletonRenderer::drawDebug (Renderer* renderer, const Mat4 &transform, uin if (i == 0) color = Color4F::GREEN; } } + + if (_debugMeshes) { + // Meshes. + glLineWidth(1); + for (int i = 0, n = _skeleton->slotsCount; i < n; ++i) { + spSlot* slot = _skeleton->drawOrder[i]; + if (!slot->attachment || slot->attachment->type != SP_ATTACHMENT_MESH) continue; + spMeshAttachment* attachment = (spMeshAttachment*)slot->attachment; + spVertexAttachment_computeWorldVertices(SUPER(attachment), slot, 0, attachment->super.worldVerticesLength, _worldVertices, 0, 2); + for (int ii = 0; ii < attachment->trianglesCount;) { + Vec2 v1(_worldVertices + (attachment->triangles[ii++] * 2)); + Vec2 v2(_worldVertices + (attachment->triangles[ii++] * 2)); + Vec2 v3(_worldVertices + (attachment->triangles[ii++] * 2)); + drawNode->drawLine(v1, v2, Color4F::YELLOW); + drawNode->drawLine(v2, v3, Color4F::YELLOW); + drawNode->drawLine(v3, v1, Color4F::YELLOW); + } + } + + } drawNode->draw(renderer, transform, transformFlags); director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW); @@ -535,6 +555,13 @@ void SkeletonRenderer::setDebugBonesEnabled (bool enabled) { bool SkeletonRenderer::getDebugBonesEnabled () const { return _debugBones; } + +void SkeletonRenderer::setDebugMeshesEnabled (bool enabled) { + _debugMeshes = enabled; +} +bool SkeletonRenderer::getDebugMeshesEnabled () const { + return _debugMeshes; +} void SkeletonRenderer::onEnter () { #if CC_ENABLE_SCRIPT_BINDING diff --git a/spine-cocos2dx/src/spine/SkeletonRenderer.h b/spine-cocos2dx/src/spine/SkeletonRenderer.h index 14992705a..6fadc69aa 100644 --- a/spine-cocos2dx/src/spine/SkeletonRenderer.h +++ b/spine-cocos2dx/src/spine/SkeletonRenderer.h @@ -64,6 +64,9 @@ public: void setDebugBonesEnabled(bool enabled); bool getDebugBonesEnabled() const; + + void setDebugMeshesEnabled(bool enabled); + bool getDebugMeshesEnabled() const; // --- Convenience methods for common Skeleton_* functions. void updateWorldTransform (); @@ -135,6 +138,7 @@ protected: float _timeScale; bool _debugSlots; bool _debugBones; + bool _debugMeshes; }; }