mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 22:49:01 +08:00
[cocos2dx] Rework way meshes are generated to fix crash when attachment sources region from a sequence. Closes #2166.
This commit is contained in:
parent
114852b15c
commit
927fd637f0
@ -61,6 +61,10 @@ cp -f ../tank/export/tank.png "$ROOT/spine-cocos2d-objc/Resources/"
|
|||||||
echo "spine-cocos2dx"
|
echo "spine-cocos2dx"
|
||||||
rm -rf "$ROOT/spine-cocos2dx/example/Resources/common/"*
|
rm -rf "$ROOT/spine-cocos2dx/example/Resources/common/"*
|
||||||
|
|
||||||
|
cp -f ../dragon/export/dragon-ess.skel "$ROOT/spine-cocos2dx/example/Resources/common/"
|
||||||
|
cp -f ../dragon/export/dragon-pma.atlas "$ROOT/spine-cocos2dx/example/Resources/common/"
|
||||||
|
cp -f ../dragon/export/dragon-pma*.png "$ROOT/spine-cocos2dx/example/Resources/common/"
|
||||||
|
|
||||||
cp -f ../coin/export/coin-pro.skel "$ROOT/spine-cocos2dx/example/Resources/common/"
|
cp -f ../coin/export/coin-pro.skel "$ROOT/spine-cocos2dx/example/Resources/common/"
|
||||||
cp -f ../coin/export/coin.atlas "$ROOT/spine-cocos2dx/example/Resources/common/"
|
cp -f ../coin/export/coin.atlas "$ROOT/spine-cocos2dx/example/Resources/common/"
|
||||||
cp -f ../coin/export/coin.png "$ROOT/spine-cocos2dx/example/Resources/common/"
|
cp -f ../coin/export/coin.png "$ROOT/spine-cocos2dx/example/Resources/common/"
|
||||||
|
|||||||
@ -34,6 +34,7 @@
|
|||||||
|
|
||||||
#include "AppMacros.h"
|
#include "AppMacros.h"
|
||||||
#include "IKExample.h"
|
#include "IKExample.h"
|
||||||
|
#include "SequenceExample.h"
|
||||||
#include <spine/Debug.h>
|
#include <spine/Debug.h>
|
||||||
#include <spine/spine-cocos2dx.h>
|
#include <spine/spine-cocos2dx.h>
|
||||||
|
|
||||||
@ -110,7 +111,7 @@ bool AppDelegate::applicationDidFinishLaunching() {
|
|||||||
|
|
||||||
// create a scene. it's an autorelease object
|
// create a scene. it's an autorelease object
|
||||||
//auto scene = RaptorExample::scene();
|
//auto scene = RaptorExample::scene();
|
||||||
auto scene = IKExample::scene();
|
auto scene = SequenceExample::scene();
|
||||||
|
|
||||||
// run
|
// run
|
||||||
director->runWithScene(scene);
|
director->runWithScene(scene);
|
||||||
|
|||||||
@ -28,7 +28,7 @@
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#include "BatchingExample.h"
|
#include "BatchingExample.h"
|
||||||
#include "IKExample.h"
|
#include "SequenceExample.h"
|
||||||
|
|
||||||
USING_NS_CC;
|
USING_NS_CC;
|
||||||
using namespace spine;
|
using namespace spine;
|
||||||
@ -95,7 +95,7 @@ bool BatchingExample::init() {
|
|||||||
|
|
||||||
EventListenerTouchOneByOne *listener = EventListenerTouchOneByOne::create();
|
EventListenerTouchOneByOne *listener = EventListenerTouchOneByOne::create();
|
||||||
listener->onTouchBegan = [this](Touch *touch, cocos2d::Event *event) -> bool {
|
listener->onTouchBegan = [this](Touch *touch, cocos2d::Event *event) -> bool {
|
||||||
Director::getInstance()->replaceScene(IKExample::scene());
|
Director::getInstance()->replaceScene(SequenceExample::scene());
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
|
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
|
||||||
|
|||||||
@ -27,27 +27,35 @@
|
|||||||
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#include <spine/AttachmentVertices.h>
|
#include "SequenceExample.h"
|
||||||
|
#include "IKExample.h"
|
||||||
|
|
||||||
USING_NS_CC;
|
USING_NS_CC;
|
||||||
|
using namespace spine;
|
||||||
|
|
||||||
namespace spine {
|
Scene *SequenceExample::scene() {
|
||||||
|
Scene *scene = Scene::create();
|
||||||
|
scene->addChild(SequenceExample::create());
|
||||||
|
return scene;
|
||||||
|
}
|
||||||
|
|
||||||
AttachmentVertices::AttachmentVertices(Texture2D *texture, int verticesCount, unsigned short *triangles, int trianglesCount) {
|
bool SequenceExample::init() {
|
||||||
_texture = texture;
|
if (!LayerColor::initWithColor(Color4B(128, 128, 128, 255))) return false;
|
||||||
if (_texture) _texture->retain();
|
|
||||||
|
|
||||||
_triangles = new TrianglesCommand::Triangles();
|
skeletonNode = SkeletonAnimation::createWithBinaryFile("dragon-ess.skel", "dragon-pma.atlas", 1);
|
||||||
_triangles->verts = new V3F_C4B_T2F[verticesCount];
|
skeletonNode->setAnimation(0, "flying", true);
|
||||||
_triangles->vertCount = verticesCount;
|
|
||||||
_triangles->indices = triangles;
|
|
||||||
_triangles->indexCount = trianglesCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
AttachmentVertices::~AttachmentVertices() {
|
skeletonNode->setPosition(Vec2(_contentSize.width / 2, _contentSize.height / 2));
|
||||||
delete[] _triangles->verts;
|
addChild(skeletonNode);
|
||||||
delete _triangles;
|
|
||||||
if (_texture) _texture->release();
|
|
||||||
}
|
|
||||||
|
|
||||||
}// namespace spine
|
scheduleUpdate();
|
||||||
|
|
||||||
|
EventListenerTouchOneByOne *listener = EventListenerTouchOneByOne::create();
|
||||||
|
listener->onTouchBegan = [this](Touch *touch, cocos2d::Event *event) -> bool {
|
||||||
|
Director::getInstance()->replaceScene(IKExample::scene());
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
@ -27,22 +27,22 @@
|
|||||||
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#ifndef SPINE_ATTACHMENTVERTICES_H_
|
#ifndef _SEQUENCEEXAMPLE_H_
|
||||||
#define SPINE_ATTACHMENTVERTICES_H_
|
#define _SEQUENCEEXAMPLE_H_
|
||||||
|
|
||||||
#include "cocos2d.h"
|
#include "cocos2d.h"
|
||||||
|
#include <spine/spine-cocos2dx.h>
|
||||||
|
|
||||||
namespace spine {
|
class SequenceExample : public cocos2d::LayerColor {
|
||||||
|
public:
|
||||||
|
static cocos2d::Scene *scene();
|
||||||
|
|
||||||
class AttachmentVertices {
|
CREATE_FUNC(SequenceExample);
|
||||||
public:
|
|
||||||
AttachmentVertices(cocos2d::Texture2D *texture, int verticesCount, unsigned short *triangles, int trianglesCount);
|
|
||||||
virtual ~AttachmentVertices();
|
|
||||||
|
|
||||||
cocos2d::Texture2D *_texture;
|
virtual bool init();
|
||||||
cocos2d::TrianglesCommand::Triangles *_triangles;
|
|
||||||
};
|
|
||||||
|
|
||||||
}// namespace spine
|
private:
|
||||||
|
spine::SkeletonAnimation *skeletonNode;
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* SPINE_ATTACHMENTVERTICES_H_ */
|
#endif
|
||||||
BIN
spine-cocos2dx/example/Resources/common/dragon-ess.skel
Normal file
BIN
spine-cocos2dx/example/Resources/common/dragon-ess.skel
Normal file
Binary file not shown.
129
spine-cocos2dx/example/Resources/common/dragon-pma.atlas
Normal file
129
spine-cocos2dx/example/Resources/common/dragon-pma.atlas
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
dragon-pma.png
|
||||||
|
size: 1024, 1024
|
||||||
|
filter: Linear, Linear
|
||||||
|
pma: true
|
||||||
|
back
|
||||||
|
bounds: 564, 534, 190, 185
|
||||||
|
chest
|
||||||
|
bounds: 2, 645, 136, 122
|
||||||
|
chin
|
||||||
|
bounds: 140, 619, 214, 146
|
||||||
|
front-toe-a
|
||||||
|
bounds: 2, 862, 29, 50
|
||||||
|
rotate: 90
|
||||||
|
front-toe-b
|
||||||
|
bounds: 467, 835, 56, 57
|
||||||
|
rotate: 90
|
||||||
|
head
|
||||||
|
bounds: 756, 398, 296, 260
|
||||||
|
rotate: 90
|
||||||
|
left-front-leg
|
||||||
|
bounds: 599, 834, 84, 57
|
||||||
|
left-front-thigh
|
||||||
|
bounds: 782, 819, 84, 72
|
||||||
|
left-rear-leg
|
||||||
|
bounds: 356, 558, 206, 177
|
||||||
|
left-rear-thigh
|
||||||
|
bounds: 216, 767, 91, 149
|
||||||
|
rotate: 90
|
||||||
|
left-wing01
|
||||||
|
bounds: 2, 268, 264, 589
|
||||||
|
rotate: 90
|
||||||
|
left-wing02
|
||||||
|
bounds: 2, 2, 264, 589
|
||||||
|
rotate: 90
|
||||||
|
right-front-leg
|
||||||
|
bounds: 113, 769, 101, 89
|
||||||
|
right-front-thigh
|
||||||
|
bounds: 758, 709, 108, 108
|
||||||
|
right-rear-leg
|
||||||
|
bounds: 640, 721, 116, 100
|
||||||
|
right-rear-thigh
|
||||||
|
bounds: 367, 742, 91, 149
|
||||||
|
rotate: 90
|
||||||
|
right-rear-toe
|
||||||
|
bounds: 2, 781, 109, 77
|
||||||
|
tail01
|
||||||
|
bounds: 868, 696, 120, 153
|
||||||
|
rotate: 90
|
||||||
|
tail02
|
||||||
|
bounds: 518, 737, 95, 120
|
||||||
|
rotate: 90
|
||||||
|
tail03
|
||||||
|
bounds: 868, 818, 73, 92
|
||||||
|
rotate: 90
|
||||||
|
tail04
|
||||||
|
bounds: 526, 835, 56, 71
|
||||||
|
rotate: 90
|
||||||
|
tail05
|
||||||
|
bounds: 406, 839, 52, 59
|
||||||
|
rotate: 90
|
||||||
|
tail06
|
||||||
|
bounds: 685, 823, 95, 68
|
||||||
|
thiagobrayner
|
||||||
|
bounds: 54, 860, 350, 31
|
||||||
|
|
||||||
|
dragon-pma_2.png
|
||||||
|
size: 1024, 1024
|
||||||
|
filter: Linear, Linear
|
||||||
|
pma: true
|
||||||
|
left-wing03
|
||||||
|
bounds: 2, 534, 264, 589
|
||||||
|
rotate: 90
|
||||||
|
left-wing04
|
||||||
|
bounds: 2, 268, 264, 589
|
||||||
|
rotate: 90
|
||||||
|
left-wing05
|
||||||
|
bounds: 593, 209, 264, 589
|
||||||
|
left-wing06
|
||||||
|
bounds: 2, 2, 264, 589
|
||||||
|
rotate: 90
|
||||||
|
|
||||||
|
dragon-pma_3.png
|
||||||
|
size: 1024, 1024
|
||||||
|
filter: Linear, Linear
|
||||||
|
pma: true
|
||||||
|
left-wing07
|
||||||
|
bounds: 2, 694, 264, 589
|
||||||
|
rotate: 90
|
||||||
|
left-wing08
|
||||||
|
bounds: 2, 428, 264, 589
|
||||||
|
rotate: 90
|
||||||
|
left-wing09
|
||||||
|
bounds: 593, 369, 264, 589
|
||||||
|
right-wing01
|
||||||
|
bounds: 2, 2, 365, 643
|
||||||
|
rotate: 90
|
||||||
|
|
||||||
|
dragon-pma_4.png
|
||||||
|
size: 1024, 1024
|
||||||
|
filter: Linear, Linear
|
||||||
|
pma: true
|
||||||
|
right-wing02
|
||||||
|
bounds: 2, 369, 365, 643
|
||||||
|
right-wing03
|
||||||
|
bounds: 369, 369, 365, 643
|
||||||
|
right-wing04
|
||||||
|
bounds: 2, 2, 365, 643
|
||||||
|
rotate: 90
|
||||||
|
|
||||||
|
dragon-pma_5.png
|
||||||
|
size: 1024, 1024
|
||||||
|
filter: Linear, Linear
|
||||||
|
pma: true
|
||||||
|
right-wing05
|
||||||
|
bounds: 2, 369, 365, 643
|
||||||
|
right-wing06
|
||||||
|
bounds: 369, 369, 365, 643
|
||||||
|
right-wing07
|
||||||
|
bounds: 2, 2, 365, 643
|
||||||
|
rotate: 90
|
||||||
|
|
||||||
|
dragon-pma_6.png
|
||||||
|
size: 1024, 1024
|
||||||
|
filter: Linear, Linear
|
||||||
|
pma: true
|
||||||
|
right-wing08
|
||||||
|
bounds: 2, 2, 365, 643
|
||||||
|
right-wing09
|
||||||
|
bounds: 369, 2, 365, 643
|
||||||
BIN
spine-cocos2dx/example/Resources/common/dragon-pma.png
Normal file
BIN
spine-cocos2dx/example/Resources/common/dragon-pma.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 355 KiB |
BIN
spine-cocos2dx/example/Resources/common/dragon-pma_2.png
Normal file
BIN
spine-cocos2dx/example/Resources/common/dragon-pma_2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
BIN
spine-cocos2dx/example/Resources/common/dragon-pma_3.png
Normal file
BIN
spine-cocos2dx/example/Resources/common/dragon-pma_3.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 77 KiB |
BIN
spine-cocos2dx/example/Resources/common/dragon-pma_4.png
Normal file
BIN
spine-cocos2dx/example/Resources/common/dragon-pma_4.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 129 KiB |
BIN
spine-cocos2dx/example/Resources/common/dragon-pma_5.png
Normal file
BIN
spine-cocos2dx/example/Resources/common/dragon-pma_5.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 98 KiB |
BIN
spine-cocos2dx/example/Resources/common/dragon-pma_6.png
Normal file
BIN
spine-cocos2dx/example/Resources/common/dragon-pma_6.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 80 KiB |
@ -28,7 +28,6 @@
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <spine/AttachmentVertices.h>
|
|
||||||
#include <spine/Extension.h>
|
#include <spine/Extension.h>
|
||||||
#include <spine/spine-cocos2dx.h>
|
#include <spine/spine-cocos2dx.h>
|
||||||
|
|
||||||
@ -100,34 +99,13 @@ namespace spine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SkeletonRenderer::setupGLProgramState(bool twoColorTintEnabled) {
|
void SkeletonRenderer::setupGLProgramState(bool twoColorTintEnabled) {
|
||||||
if (twoColorTintEnabled) {
|
|
||||||
#if COCOS2D_VERSION < 0x00040000
|
#if COCOS2D_VERSION < 0x00040000
|
||||||
|
if (twoColorTintEnabled) {
|
||||||
setGLProgramState(SkeletonTwoColorBatch::getInstance()->getTwoColorTintProgramState());
|
setGLProgramState(SkeletonTwoColorBatch::getInstance()->getTwoColorTintProgramState());
|
||||||
#endif
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Texture2D *texture = nullptr;
|
setGLProgramState(GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP, nullptr));
|
||||||
for (int i = 0, n = _skeleton->getSlots().size(); i < n; i++) {
|
|
||||||
Slot *slot = _skeleton->getDrawOrder()[i];
|
|
||||||
Attachment *const attachment = slot->getAttachment();
|
|
||||||
if (!attachment) continue;
|
|
||||||
if (attachment->getRTTI().isExactly(RegionAttachment::rtti)) {
|
|
||||||
RegionAttachment *regionAttachment = static_cast<RegionAttachment *>(attachment);
|
|
||||||
texture = static_cast<AttachmentVertices *>(regionAttachment->getRendererObject())->_texture;
|
|
||||||
} else if (attachment->getRTTI().isExactly(MeshAttachment::rtti)) {
|
|
||||||
MeshAttachment *meshAttachment = static_cast<MeshAttachment *>(attachment);
|
|
||||||
texture = static_cast<AttachmentVertices *>(meshAttachment->getRendererObject())->_texture;
|
|
||||||
} else {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (texture != nullptr) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#if COCOS2D_VERSION < 0x00040000
|
|
||||||
setGLProgramState(GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP, texture));
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -290,11 +268,9 @@ namespace spine {
|
|||||||
Color color;
|
Color color;
|
||||||
Color darkColor;
|
Color darkColor;
|
||||||
const float darkPremultipliedAlpha = _premultipliedAlpha ? 1.f : 0;
|
const float darkPremultipliedAlpha = _premultipliedAlpha ? 1.f : 0;
|
||||||
AttachmentVertices *attachmentVertices = nullptr;
|
|
||||||
TwoColorTrianglesCommand *lastTwoColorTrianglesCommand = nullptr;
|
TwoColorTrianglesCommand *lastTwoColorTrianglesCommand = nullptr;
|
||||||
for (int i = 0, n = _skeleton->getSlots().size(); i < n; ++i) {
|
for (int i = 0, n = _skeleton->getSlots().size(); i < n; ++i) {
|
||||||
Slot *slot = _skeleton->getDrawOrder()[i];
|
Slot *slot = _skeleton->getDrawOrder()[i];
|
||||||
;
|
|
||||||
|
|
||||||
if (nothingToDraw(*slot, _startSlotIndex, _endSlotIndex)) {
|
if (nothingToDraw(*slot, _startSlotIndex, _endSlotIndex)) {
|
||||||
_clipper->clipEnd(*slot);
|
_clipper->clipEnd(*slot);
|
||||||
@ -303,31 +279,39 @@ namespace spine {
|
|||||||
|
|
||||||
cocos2d::TrianglesCommand::Triangles triangles;
|
cocos2d::TrianglesCommand::Triangles triangles;
|
||||||
TwoColorTriangles trianglesTwoColor;
|
TwoColorTriangles trianglesTwoColor;
|
||||||
|
static unsigned short quadIndices[6] = {0, 1, 2, 2, 3, 0};
|
||||||
|
Texture2D *texture = nullptr;
|
||||||
|
|
||||||
if (slot->getAttachment()->getRTTI().isExactly(RegionAttachment::rtti)) {
|
if (slot->getAttachment()->getRTTI().isExactly(RegionAttachment::rtti)) {
|
||||||
RegionAttachment *attachment = static_cast<RegionAttachment *>(slot->getAttachment());
|
RegionAttachment *attachment = static_cast<RegionAttachment *>(slot->getAttachment());
|
||||||
attachmentVertices = static_cast<AttachmentVertices *>(attachment->getRendererObject());
|
texture = (Texture2D*)((AtlasRegion*)attachment->getRegion())->page->getRendererObject();
|
||||||
|
|
||||||
float *dstTriangleVertices = nullptr;
|
float *dstTriangleVertices = nullptr;
|
||||||
int dstStride = 0;// in floats
|
int dstStride = 0;// in floats
|
||||||
if (hasSingleTint) {
|
if (hasSingleTint) {
|
||||||
triangles.indices = attachmentVertices->_triangles->indices;
|
triangles.indices = quadIndices;
|
||||||
triangles.indexCount = attachmentVertices->_triangles->indexCount;
|
triangles.indexCount = 6;
|
||||||
triangles.verts = batch->allocateVertices(attachmentVertices->_triangles->vertCount);
|
triangles.verts = batch->allocateVertices(4);
|
||||||
triangles.vertCount = attachmentVertices->_triangles->vertCount;
|
triangles.vertCount = 4;
|
||||||
assert(triangles.vertCount == 4);
|
assert(triangles.vertCount == 4);
|
||||||
memcpy(triangles.verts, attachmentVertices->_triangles->verts, sizeof(cocos2d::V3F_C4B_T2F) * attachmentVertices->_triangles->vertCount);
|
for (int v = 0, i = 0; v < triangles.vertCount; v++, i += 2) {
|
||||||
|
auto &texCoords = triangles.verts[v].texCoords;
|
||||||
|
texCoords.u = attachment->getUVs()[i];
|
||||||
|
texCoords.v = attachment->getUVs()[i + 1];
|
||||||
|
}
|
||||||
dstStride = sizeof(V3F_C4B_T2F) / sizeof(float);
|
dstStride = sizeof(V3F_C4B_T2F) / sizeof(float);
|
||||||
dstTriangleVertices = reinterpret_cast<float *>(triangles.verts);
|
dstTriangleVertices = reinterpret_cast<float *>(triangles.verts);
|
||||||
} else {
|
} else {
|
||||||
trianglesTwoColor.indices = attachmentVertices->_triangles->indices;
|
trianglesTwoColor.indices = quadIndices;
|
||||||
trianglesTwoColor.indexCount = attachmentVertices->_triangles->indexCount;
|
trianglesTwoColor.indexCount = 6;
|
||||||
trianglesTwoColor.verts = twoColorBatch->allocateVertices(attachmentVertices->_triangles->vertCount);
|
trianglesTwoColor.verts = twoColorBatch->allocateVertices(4);
|
||||||
trianglesTwoColor.vertCount = attachmentVertices->_triangles->vertCount;
|
trianglesTwoColor.vertCount = 4;
|
||||||
assert(trianglesTwoColor.vertCount == 4);
|
assert(trianglesTwoColor.vertCount == 4);
|
||||||
for (int v = 0; v < trianglesTwoColor.vertCount; v++) {
|
for (int v = 0, i = 0; v < trianglesTwoColor.vertCount; v++, i += 2) {
|
||||||
trianglesTwoColor.verts[v].texCoords = attachmentVertices->_triangles->verts[v].texCoords;
|
auto &texCoords = trianglesTwoColor.verts[v].texCoords;
|
||||||
}
|
texCoords.u = attachment->getUVs()[i];
|
||||||
|
texCoords.v = attachment->getUVs()[i + 1];
|
||||||
|
}
|
||||||
dstTriangleVertices = reinterpret_cast<float *>(trianglesTwoColor.verts);
|
dstTriangleVertices = reinterpret_cast<float *>(trianglesTwoColor.verts);
|
||||||
dstStride = sizeof(V3F_C4B_C4B_T2F) / sizeof(float);
|
dstStride = sizeof(V3F_C4B_C4B_T2F) / sizeof(float);
|
||||||
}
|
}
|
||||||
@ -338,28 +322,34 @@ namespace spine {
|
|||||||
color = attachment->getColor();
|
color = attachment->getColor();
|
||||||
} else if (slot->getAttachment()->getRTTI().isExactly(MeshAttachment::rtti)) {
|
} else if (slot->getAttachment()->getRTTI().isExactly(MeshAttachment::rtti)) {
|
||||||
MeshAttachment *attachment = (MeshAttachment *) slot->getAttachment();
|
MeshAttachment *attachment = (MeshAttachment *) slot->getAttachment();
|
||||||
attachmentVertices = (AttachmentVertices *) attachment->getRendererObject();
|
texture = (Texture2D*)((AtlasRegion*)attachment->getRegion())->page->getRendererObject();
|
||||||
|
|
||||||
float *dstTriangleVertices = nullptr;
|
float *dstTriangleVertices = nullptr;
|
||||||
int dstStride = 0;// in floats
|
int dstStride = 0;// in floats
|
||||||
int dstVertexCount = 0;
|
int dstVertexCount = 0;
|
||||||
if (hasSingleTint) {
|
if (hasSingleTint) {
|
||||||
triangles.indices = attachmentVertices->_triangles->indices;
|
triangles.indices = attachment->getTriangles().buffer();
|
||||||
triangles.indexCount = attachmentVertices->_triangles->indexCount;
|
triangles.indexCount = (unsigned short)attachment->getTriangles().size();
|
||||||
triangles.verts = batch->allocateVertices(attachmentVertices->_triangles->vertCount);
|
triangles.verts = batch->allocateVertices(attachment->getWorldVerticesLength() / 2);
|
||||||
triangles.vertCount = attachmentVertices->_triangles->vertCount;
|
triangles.vertCount = attachment->getWorldVerticesLength() / 2;
|
||||||
memcpy(triangles.verts, attachmentVertices->_triangles->verts, sizeof(cocos2d::V3F_C4B_T2F) * attachmentVertices->_triangles->vertCount);
|
for (int v = 0, i = 0; v < triangles.vertCount; v++, i += 2) {
|
||||||
|
auto &texCoords = triangles.verts[v].texCoords;
|
||||||
|
texCoords.u = attachment->getUVs()[i];
|
||||||
|
texCoords.v = attachment->getUVs()[i + 1];
|
||||||
|
}
|
||||||
dstTriangleVertices = (float *) triangles.verts;
|
dstTriangleVertices = (float *) triangles.verts;
|
||||||
dstStride = sizeof(V3F_C4B_T2F) / sizeof(float);
|
dstStride = sizeof(V3F_C4B_T2F) / sizeof(float);
|
||||||
dstVertexCount = triangles.vertCount;
|
dstVertexCount = triangles.vertCount;
|
||||||
} else {
|
} else {
|
||||||
trianglesTwoColor.indices = attachmentVertices->_triangles->indices;
|
trianglesTwoColor.indices = attachment->getTriangles().buffer();
|
||||||
trianglesTwoColor.indexCount = attachmentVertices->_triangles->indexCount;
|
trianglesTwoColor.indexCount = (unsigned short)attachment->getTriangles().size();
|
||||||
trianglesTwoColor.verts = twoColorBatch->allocateVertices(attachmentVertices->_triangles->vertCount);
|
trianglesTwoColor.verts = twoColorBatch->allocateVertices(attachment->getWorldVerticesLength() / 2);
|
||||||
trianglesTwoColor.vertCount = attachmentVertices->_triangles->vertCount;
|
trianglesTwoColor.vertCount = attachment->getWorldVerticesLength() / 2;
|
||||||
for (int v = 0; v < trianglesTwoColor.vertCount; v++) {
|
for (int v = 0, i = 0; v < trianglesTwoColor.vertCount; v++, i += 2) {
|
||||||
trianglesTwoColor.verts[v].texCoords = attachmentVertices->_triangles->verts[v].texCoords;
|
auto &texCoords = trianglesTwoColor.verts[v].texCoords;
|
||||||
}
|
texCoords.u = attachment->getUVs()[i];
|
||||||
|
texCoords.v = attachment->getUVs()[i + 1];
|
||||||
|
}
|
||||||
dstTriangleVertices = (float *) trianglesTwoColor.verts;
|
dstTriangleVertices = (float *) trianglesTwoColor.verts;
|
||||||
dstStride = sizeof(V3F_C4B_C4B_T2F) / sizeof(float);
|
dstStride = sizeof(V3F_C4B_C4B_T2F) / sizeof(float);
|
||||||
dstVertexCount = trianglesTwoColor.vertCount;
|
dstVertexCount = trianglesTwoColor.vertCount;
|
||||||
@ -405,7 +395,7 @@ namespace spine {
|
|||||||
|
|
||||||
const cocos2d::Color4B color4B = ColorToColor4B(color);
|
const cocos2d::Color4B color4B = ColorToColor4B(color);
|
||||||
const cocos2d::Color4B darkColor4B = ColorToColor4B(darkColor);
|
const cocos2d::Color4B darkColor4B = ColorToColor4B(darkColor);
|
||||||
const BlendFunc blendFunc = makeBlendFunc(slot->getData().getBlendMode(), attachmentVertices->_texture->hasPremultipliedAlpha());
|
const BlendFunc blendFunc = makeBlendFunc(slot->getData().getBlendMode(), texture->hasPremultipliedAlpha());
|
||||||
_blendFunc = blendFunc;
|
_blendFunc = blendFunc;
|
||||||
|
|
||||||
if (hasSingleTint) {
|
if (hasSingleTint) {
|
||||||
@ -421,14 +411,13 @@ namespace spine {
|
|||||||
triangles.vertCount = _clipper->getClippedVertices().size() / 2;
|
triangles.vertCount = _clipper->getClippedVertices().size() / 2;
|
||||||
triangles.verts = batch->allocateVertices(triangles.vertCount);
|
triangles.verts = batch->allocateVertices(triangles.vertCount);
|
||||||
triangles.indexCount = _clipper->getClippedTriangles().size();
|
triangles.indexCount = _clipper->getClippedTriangles().size();
|
||||||
triangles.indices =
|
triangles.indices = batch->allocateIndices(triangles.indexCount);
|
||||||
batch->allocateIndices(triangles.indexCount);
|
|
||||||
memcpy(triangles.indices, _clipper->getClippedTriangles().buffer(), sizeof(unsigned short) * _clipper->getClippedTriangles().size());
|
memcpy(triangles.indices, _clipper->getClippedTriangles().buffer(), sizeof(unsigned short) * _clipper->getClippedTriangles().size());
|
||||||
|
|
||||||
#if COCOS2D_VERSION < 0x00040000
|
#if COCOS2D_VERSION < 0x00040000
|
||||||
cocos2d::TrianglesCommand *batchedTriangles = batch->addCommand(renderer, _globalZOrder, attachmentVertices->_texture, _glProgramState, blendFunc, triangles, transform, transformFlags);
|
cocos2d::TrianglesCommand *batchedTriangles = batch->addCommand(renderer, _globalZOrder, texture, _glProgramState, blendFunc, triangles, transform, transformFlags);
|
||||||
#else
|
#else
|
||||||
cocos2d::TrianglesCommand *batchedTriangles = batch->addCommand(renderer, _globalZOrder, attachmentVertices->_texture, _programState, blendFunc, triangles, transform, transformFlags);
|
cocos2d::TrianglesCommand *batchedTriangles = batch->addCommand(renderer, _globalZOrder, texture, _programState, blendFunc, triangles, transform, transformFlags);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const float *verts = _clipper->getClippedVertices().buffer();
|
const float *verts = _clipper->getClippedVertices().buffer();
|
||||||
@ -444,9 +433,9 @@ namespace spine {
|
|||||||
} else {
|
} else {
|
||||||
// Not clipping.
|
// Not clipping.
|
||||||
#if COCOS2D_VERSION < 0x00040000
|
#if COCOS2D_VERSION < 0x00040000
|
||||||
cocos2d::TrianglesCommand *batchedTriangles = batch->addCommand(renderer, _globalZOrder, attachmentVertices->_texture, _glProgramState, blendFunc, triangles, transform, transformFlags);
|
cocos2d::TrianglesCommand *batchedTriangles = batch->addCommand(renderer, _globalZOrder, texture, _glProgramState, blendFunc, triangles, transform, transformFlags);
|
||||||
#else
|
#else
|
||||||
cocos2d::TrianglesCommand *batchedTriangles = batch->addCommand(renderer, _globalZOrder, attachmentVertices->_texture, _programState, blendFunc, triangles, transform, transformFlags);
|
cocos2d::TrianglesCommand *batchedTriangles = batch->addCommand(renderer, _globalZOrder, texture, _programState, blendFunc, triangles, transform, transformFlags);
|
||||||
#endif
|
#endif
|
||||||
V3F_C4B_T2F *vertex = batchedTriangles->getTriangles().verts;
|
V3F_C4B_T2F *vertex = batchedTriangles->getTriangles().verts;
|
||||||
for (int v = 0, vn = batchedTriangles->getTriangles().vertCount; v < vn; ++v, ++vertex) {
|
for (int v = 0, vn = batchedTriangles->getTriangles().vertCount; v < vn; ++v, ++vertex) {
|
||||||
@ -472,9 +461,9 @@ namespace spine {
|
|||||||
memcpy(trianglesTwoColor.indices, _clipper->getClippedTriangles().buffer(), sizeof(unsigned short) * _clipper->getClippedTriangles().size());
|
memcpy(trianglesTwoColor.indices, _clipper->getClippedTriangles().buffer(), sizeof(unsigned short) * _clipper->getClippedTriangles().size());
|
||||||
|
|
||||||
#if COCOS2D_VERSION < 0x00040000
|
#if COCOS2D_VERSION < 0x00040000
|
||||||
TwoColorTrianglesCommand *batchedTriangles = lastTwoColorTrianglesCommand = twoColorBatch->addCommand(renderer, _globalZOrder, attachmentVertices->_texture->getName(), _glProgramState, blendFunc, trianglesTwoColor, transform, transformFlags);
|
TwoColorTrianglesCommand *batchedTriangles = lastTwoColorTrianglesCommand = twoColorBatch->addCommand(renderer, _globalZOrder, texture->getName(), _glProgramState, blendFunc, trianglesTwoColor, transform, transformFlags);
|
||||||
#else
|
#else
|
||||||
TwoColorTrianglesCommand *batchedTriangles = lastTwoColorTrianglesCommand = twoColorBatch->addCommand(renderer, _globalZOrder, attachmentVertices->_texture, _programState, blendFunc, trianglesTwoColor, transform, transformFlags);
|
TwoColorTrianglesCommand *batchedTriangles = lastTwoColorTrianglesCommand = twoColorBatch->addCommand(renderer, _globalZOrder, texture, _programState, blendFunc, trianglesTwoColor, transform, transformFlags);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const float *verts = _clipper->getClippedVertices().buffer();
|
const float *verts = _clipper->getClippedVertices().buffer();
|
||||||
@ -492,9 +481,9 @@ namespace spine {
|
|||||||
} else {
|
} else {
|
||||||
|
|
||||||
#if COCOS2D_VERSION < 0x00040000
|
#if COCOS2D_VERSION < 0x00040000
|
||||||
TwoColorTrianglesCommand *batchedTriangles = lastTwoColorTrianglesCommand = twoColorBatch->addCommand(renderer, _globalZOrder, attachmentVertices->_texture->getName(), _glProgramState, blendFunc, trianglesTwoColor, transform, transformFlags);
|
TwoColorTrianglesCommand *batchedTriangles = lastTwoColorTrianglesCommand = twoColorBatch->addCommand(renderer, _globalZOrder, texture->getName(), _glProgramState, blendFunc, trianglesTwoColor, transform, transformFlags);
|
||||||
#else
|
#else
|
||||||
TwoColorTrianglesCommand *batchedTriangles = lastTwoColorTrianglesCommand = twoColorBatch->addCommand(renderer, _globalZOrder, attachmentVertices->_texture, _programState, blendFunc, trianglesTwoColor, transform, transformFlags);
|
TwoColorTrianglesCommand *batchedTriangles = lastTwoColorTrianglesCommand = twoColorBatch->addCommand(renderer, _globalZOrder, texture, _programState, blendFunc, trianglesTwoColor, transform, transformFlags);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
V3F_C4B_C4B_T2F *vertex = batchedTriangles->getTriangles().verts;
|
V3F_C4B_C4B_T2F *vertex = batchedTriangles->getTriangles().verts;
|
||||||
|
|||||||
@ -153,6 +153,8 @@ namespace spine {
|
|||||||
int _startSlotIndex;
|
int _startSlotIndex;
|
||||||
int _endSlotIndex;
|
int _endSlotIndex;
|
||||||
bool _twoColorTint;
|
bool _twoColorTint;
|
||||||
|
|
||||||
|
Pool<AttachmentVertices*> _verticesPool;
|
||||||
};
|
};
|
||||||
|
|
||||||
}// namespace spine
|
}// namespace spine
|
||||||
|
|||||||
@ -27,53 +27,18 @@
|
|||||||
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#include <spine/AttachmentVertices.h>
|
|
||||||
#include <spine/Extension.h>
|
#include <spine/Extension.h>
|
||||||
#include <spine/spine-cocos2dx.h>
|
#include <spine/spine-cocos2dx.h>
|
||||||
|
|
||||||
USING_NS_CC;
|
USING_NS_CC;
|
||||||
using namespace spine;
|
using namespace spine;
|
||||||
|
|
||||||
static void deleteAttachmentVertices(void *vertices) {
|
|
||||||
delete (AttachmentVertices *) vertices;
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned short quadTriangles[6] = {0, 1, 2, 2, 3, 0};
|
|
||||||
|
|
||||||
static void setAttachmentVertices(RegionAttachment *attachment) {
|
|
||||||
AtlasRegion *region = (AtlasRegion *) attachment->getRendererObject();
|
|
||||||
AttachmentVertices *attachmentVertices = new AttachmentVertices((Texture2D *) region->page->getRendererObject(), 4, quadTriangles, 6);
|
|
||||||
V3F_C4B_T2F *vertices = attachmentVertices->_triangles->verts;
|
|
||||||
for (int i = 0, ii = 0; i < 4; ++i, ii += 2) {
|
|
||||||
vertices[i].texCoords.u = attachment->getUVs()[ii];
|
|
||||||
vertices[i].texCoords.v = attachment->getUVs()[ii + 1];
|
|
||||||
}
|
|
||||||
attachment->setRendererObject(attachmentVertices, deleteAttachmentVertices);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void setAttachmentVertices(MeshAttachment *attachment) {
|
|
||||||
AtlasRegion *region = (AtlasRegion *) attachment->getRendererObject();
|
|
||||||
AttachmentVertices *attachmentVertices = new AttachmentVertices((Texture2D *) region->page->getRendererObject(),
|
|
||||||
attachment->getWorldVerticesLength() >> 1, attachment->getTriangles().buffer(), attachment->getTriangles().size());
|
|
||||||
V3F_C4B_T2F *vertices = attachmentVertices->_triangles->verts;
|
|
||||||
for (int i = 0, ii = 0, nn = attachment->getWorldVerticesLength(); ii < nn; ++i, ii += 2) {
|
|
||||||
vertices[i].texCoords.u = attachment->getUVs()[ii];
|
|
||||||
vertices[i].texCoords.v = attachment->getUVs()[ii + 1];
|
|
||||||
}
|
|
||||||
attachment->setRendererObject(attachmentVertices, deleteAttachmentVertices);
|
|
||||||
}
|
|
||||||
|
|
||||||
Cocos2dAtlasAttachmentLoader::Cocos2dAtlasAttachmentLoader(Atlas *atlas) : AtlasAttachmentLoader(atlas) {
|
Cocos2dAtlasAttachmentLoader::Cocos2dAtlasAttachmentLoader(Atlas *atlas) : AtlasAttachmentLoader(atlas) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Cocos2dAtlasAttachmentLoader::~Cocos2dAtlasAttachmentLoader() {}
|
Cocos2dAtlasAttachmentLoader::~Cocos2dAtlasAttachmentLoader() {}
|
||||||
|
|
||||||
void Cocos2dAtlasAttachmentLoader::configureAttachment(Attachment *attachment) {
|
void Cocos2dAtlasAttachmentLoader::configureAttachment(Attachment *attachment) {
|
||||||
if (attachment->getRTTI().isExactly(RegionAttachment::rtti)) {
|
|
||||||
setAttachmentVertices((RegionAttachment *) attachment);
|
|
||||||
} else if (attachment->getRTTI().isExactly(MeshAttachment::rtti)) {
|
|
||||||
setAttachmentVertices((MeshAttachment *) attachment);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if COCOS2D_VERSION >= 0x0040000
|
#if COCOS2D_VERSION >= 0x0040000
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user