Ver código fonte

[cocos2dx] Added debug meshes rendering.

badlogic 8 anos atrás
pai
commit
137f95a20f

+ 1 - 0
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

+ 3 - 2
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());

+ 32 - 5
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

+ 4 - 0
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;
 };
 
 }