Browse Source

[cocos2dx] Closes #611, cocos2d-x v3 auto-batcher does it's work, makes SkeletonBatch a lot simpler

badlogic 9 years ago
parent
commit
48c5b06676

+ 0 - 4
spine-cocos2dx/example/Classes/BatchingExample.cpp

@@ -44,10 +44,6 @@ Scene* BatchingExample::scene () {
 bool BatchingExample::init () {
 bool BatchingExample::init () {
 	if (!LayerColor::initWithColor(Color4B(128, 128, 128, 255))) return false;
 	if (!LayerColor::initWithColor(Color4B(128, 128, 128, 255))) return false;
 
 
-	// To avoid the SkeletonBatch buffer from being resized, set this to the number of vertices ever rendered in one frame.
-	// BatchingExample needs ~3200, but let's set it low to test the buffer resizing.
-	SkeletonBatch::setBufferSize(512);
-
 	// Load the texture atlas.
 	// Load the texture atlas.
 	_atlas = spAtlas_createFromFile("spineboy.atlas", 0);
 	_atlas = spAtlas_createFromFile("spineboy.atlas", 0);
 	CCASSERT(_atlas, "Error reading atlas file.");
 	CCASSERT(_atlas, "Error reading atlas file.");

+ 70 - 100
spine-cocos2dx/src/spine/SkeletonBatch.cpp

@@ -1,10 +1,10 @@
 /******************************************************************************
 /******************************************************************************
  * Spine Runtimes Software License
  * Spine Runtimes Software License
  * Version 2.3
  * Version 2.3
- * 
+ *
  * Copyright (c) 2013-2015, Esoteric Software
  * Copyright (c) 2013-2015, Esoteric Software
  * All rights reserved.
  * All rights reserved.
- * 
+ *
  * You are granted a perpetual, non-exclusive, non-sublicensable and
  * You are granted a perpetual, non-exclusive, non-sublicensable and
  * non-transferable license to use, install, execute and perform the Spine
  * non-transferable license to use, install, execute and perform the Spine
  * Runtimes Software (the "Software") and derivative works solely for personal
  * Runtimes Software (the "Software") and derivative works solely for personal
@@ -16,7 +16,7 @@
  * or other intellectual property or proprietary rights notices on or in the
  * or other intellectual property or proprietary rights notices on or in the
  * Software, including any copy thereof. Redistributions in binary or source
  * Software, including any copy thereof. Redistributions in binary or source
  * form must include this license and terms.
  * form must include this license and terms.
- * 
+ *
  * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR
  * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
@@ -38,102 +38,72 @@ USING_NS_CC;
 using std::max;
 using std::max;
 
 
 namespace spine {
 namespace spine {
-
-static SkeletonBatch* instance = nullptr;
-
-void SkeletonBatch::setBufferSize (int vertexCount) {
-	if (instance) delete instance;
-	instance = new SkeletonBatch(vertexCount);
-}
-
-SkeletonBatch* SkeletonBatch::getInstance () {
-	if (!instance) instance = new SkeletonBatch(8192);
-	return instance;
-}
     
     
-void SkeletonBatch::destroyInstance () {
-    if (instance) {
-        delete instance;
-        instance = nullptr;
+    static SkeletonBatch* instance = nullptr;
+    
+    SkeletonBatch* SkeletonBatch::getInstance () {
+        if (!instance) instance = new SkeletonBatch();
+        return instance;
     }
     }
-}
-
-SkeletonBatch::SkeletonBatch (int capacity) :
-	_capacity(capacity), _position(0)
-{
-	_buffer = new V3F_C4B_T2F[capacity];
-	_firstCommand = new Command();
-	_command = _firstCommand;
-
-    Director::getInstance()->getEventDispatcher()->addCustomEventListener(EVENT_AFTER_DRAW_RESET_POSITION, [this](EventCustom* eventCustom){
-        this->update(0);
-    });;
-}
-
-SkeletonBatch::~SkeletonBatch () {
-	Director::getInstance()->getEventDispatcher()->removeCustomEventListeners(EVENT_AFTER_DRAW_RESET_POSITION);
-
-	Command* command = _firstCommand;
-	while (command) {
-		Command* next = command->next;
-		delete command;
-		command = next;
-	}
-
-	delete [] _buffer;
-}
-
-void SkeletonBatch::update (float delta) {
-	_position = 0;
-	_command = _firstCommand;
-}
-
-void SkeletonBatch::addCommand (cocos2d::Renderer* renderer, float globalZOrder, GLuint textureID, GLProgramState* glProgramState,
-	BlendFunc blendFunc, const TrianglesCommand::Triangles& triangles, const Mat4& transform, uint32_t transformFlags
-) {
-	if (_position + triangles.vertCount > _capacity) {
-		int newCapacity = max(_capacity + _capacity / 2, _position + triangles.vertCount);
-		V3F_C4B_T2F* newBuffer = new V3F_C4B_T2F[newCapacity];
-		memcpy(newBuffer, _buffer, _position);
-
-		int newPosition = 0;
-		Command* command = _firstCommand;
-		while (newPosition < _position) {
-			command->triangles->verts = newBuffer + newPosition;
-			newPosition += command->triangles->vertCount;
-			command = command->next;
-		}
-
-		delete [] _buffer;
-		_buffer = newBuffer;
-		_capacity = newCapacity;
-	}
-
-	memcpy(_buffer + _position, triangles.verts, sizeof(V3F_C4B_T2F) * triangles.vertCount);
-	_command->triangles->verts = _buffer + _position;
-	_position += triangles.vertCount;
-
-	_command->triangles->vertCount = triangles.vertCount;
-	_command->triangles->indexCount = triangles.indexCount;
-	_command->triangles->indices = triangles.indices;
-
-	_command->trianglesCommand->init(globalZOrder, textureID, glProgramState, blendFunc, *_command->triangles, transform, transformFlags);
-	renderer->addCommand(_command->trianglesCommand);
-
-	if (!_command->next) _command->next = new Command();
-	_command = _command->next;
-}
-
-SkeletonBatch::Command::Command () :
-	next(nullptr)
-{
-	trianglesCommand = new TrianglesCommand();
-	triangles = new TrianglesCommand::Triangles();
-}
-
-SkeletonBatch::Command::~Command () {
-	delete triangles;
-	delete trianglesCommand;
-}
-
-}
+    
+    void SkeletonBatch::destroyInstance () {
+        if (instance) {
+            delete instance;
+            instance = nullptr;
+        }
+    }
+    
+    SkeletonBatch::SkeletonBatch ()
+    {
+        _firstCommand = new Command();
+        _command = _firstCommand;
+        
+        Director::getInstance()->getEventDispatcher()->addCustomEventListener(EVENT_AFTER_DRAW_RESET_POSITION, [this](EventCustom* eventCustom){
+            this->update(0);
+        });;
+    }
+    
+    SkeletonBatch::~SkeletonBatch () {
+        Director::getInstance()->getEventDispatcher()->removeCustomEventListeners(EVENT_AFTER_DRAW_RESET_POSITION);
+        
+        Command* command = _firstCommand;
+        while (command) {
+            Command* next = command->next;
+            delete command;
+            command = next;
+        }
+    }
+    
+    void SkeletonBatch::update (float delta) {
+        _command = _firstCommand;
+    }
+    
+    void SkeletonBatch::addCommand (cocos2d::Renderer* renderer, float globalZOrder, GLuint textureID, GLProgramState* glProgramState,
+                                    BlendFunc blendFunc, const TrianglesCommand::Triangles& triangles, const Mat4& transform, uint32_t transformFlags
+                                    ) {
+        _command->triangles->verts = triangles.verts;
+        
+        _command->triangles->vertCount = triangles.vertCount;
+        _command->triangles->indexCount = triangles.indexCount;
+        _command->triangles->indices = triangles.indices;
+        
+        _command->trianglesCommand->init(globalZOrder, textureID, glProgramState, blendFunc, *_command->triangles, transform);
+        renderer->addCommand(_command->trianglesCommand);
+        
+        if (!_command->next) _command->next = new Command();
+        _command = _command->next;
+    }
+    
+    SkeletonBatch::Command::Command () :
+    next(nullptr)
+    {
+        trianglesCommand = new TrianglesCommand();
+        triangles = new TrianglesCommand::Triangles();
+    }
+    
+    SkeletonBatch::Command::~Command () {
+        delete triangles;
+        delete trianglesCommand;
+    }
+    
+}

+ 33 - 42
spine-cocos2dx/src/spine/SkeletonBatch.h

@@ -1,10 +1,10 @@
 /******************************************************************************
 /******************************************************************************
  * Spine Runtimes Software License
  * Spine Runtimes Software License
  * Version 2.3
  * Version 2.3
- * 
+ *
  * Copyright (c) 2013-2015, Esoteric Software
  * Copyright (c) 2013-2015, Esoteric Software
  * All rights reserved.
  * All rights reserved.
- * 
+ *
  * You are granted a perpetual, non-exclusive, non-sublicensable and
  * You are granted a perpetual, non-exclusive, non-sublicensable and
  * non-transferable license to use, install, execute and perform the Spine
  * non-transferable license to use, install, execute and perform the Spine
  * Runtimes Software (the "Software") and derivative works solely for personal
  * Runtimes Software (the "Software") and derivative works solely for personal
@@ -16,7 +16,7 @@
  * or other intellectual property or proprietary rights notices on or in the
  * or other intellectual property or proprietary rights notices on or in the
  * Software, including any copy thereof. Redistributions in binary or source
  * Software, including any copy thereof. Redistributions in binary or source
  * form must include this license and terms.
  * form must include this license and terms.
- * 
+ *
  * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR
  * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
@@ -36,45 +36,36 @@
 #include "cocos2d.h"
 #include "cocos2d.h"
 
 
 namespace spine {
 namespace spine {
-
-class SkeletonBatch {
-public:
-	/* Sets the max number of vertices that can be drawn in a single frame. The buffer will grow automatically as needed, but
-	 * setting it to the appropriate is more efficient. Best to call before getInstance is called for the first time. Default is
-	 * 8192. */
-	static void setBufferSize (int vertexCount);
-
-	static SkeletonBatch* getInstance ();
     
     
-    static void destroyInstance ();
-
-	void update (float delta);
-
-	void addCommand (cocos2d::Renderer* renderer, float globalOrder, GLuint textureID, cocos2d::GLProgramState* glProgramState,
-		cocos2d::BlendFunc blendType, const cocos2d::TrianglesCommand:: Triangles& triangles, const cocos2d::Mat4& mv, uint32_t flags);
-
-protected:
-	SkeletonBatch (int capacity);
-	virtual ~SkeletonBatch ();
-
-	cocos2d::V3F_C4B_T2F* _buffer;
-	int _capacity;
-	int _position;
-
-	class Command {
-	public:
-		Command ();
-		virtual ~Command ();
-
-		cocos2d::TrianglesCommand* trianglesCommand;
-		cocos2d::TrianglesCommand::Triangles* triangles;
-		Command* next;
-	};
-
-	Command* _firstCommand;
-	Command* _command;
-};
-
+    class SkeletonBatch {
+    public:
+        static SkeletonBatch* getInstance ();
+        
+        static void destroyInstance ();
+        
+        void update (float delta);
+        
+        void addCommand (cocos2d::Renderer* renderer, float globalOrder, GLuint textureID, cocos2d::GLProgramState* glProgramState,
+                         cocos2d::BlendFunc blendType, const cocos2d::TrianglesCommand:: Triangles& triangles, const cocos2d::Mat4& mv, uint32_t flags);
+        
+    protected:
+        SkeletonBatch ();
+        virtual ~SkeletonBatch ();
+        
+        class Command {
+        public:
+            Command ();
+            virtual ~Command ();
+            
+            cocos2d::TrianglesCommand* trianglesCommand;
+            cocos2d::TrianglesCommand::Triangles* triangles;
+            Command* next;
+        };
+        
+        Command* _firstCommand;
+        Command* _command;
+    };
+    
 }
 }
 
 
-#endif // SPINE_SKELETONBATCH_H_
+#endif // SPINE_SKELETONBATCH_H_