소스 검색

SkeletonTwoColorBatch also support custom program

halx99 4 년 전
부모
커밋
5bacfcd733

+ 2 - 2
spine-cocos2dx/src/spine/SkeletonRenderer.cpp

@@ -504,7 +504,7 @@ void SkeletonRenderer::draw (Renderer* renderer, const Mat4& transform, uint32_t
 #if COCOS2D_VERSION < 0x00040000
 				TwoColorTrianglesCommand* batchedTriangles = lastTwoColorTrianglesCommand = twoColorBatch->addCommand(renderer, _globalZOrder, attachmentVertices->_texture->getName(), _glProgramState, blendFunc, trianglesTwoColor, transform, transformFlags);
 #else
-				TwoColorTrianglesCommand* batchedTriangles = lastTwoColorTrianglesCommand = twoColorBatch->addCommand(renderer, _globalZOrder, attachmentVertices->_texture, blendFunc, trianglesTwoColor, transform, transformFlags);
+				TwoColorTrianglesCommand* batchedTriangles = lastTwoColorTrianglesCommand = twoColorBatch->addCommand(renderer, _globalZOrder, attachmentVertices->_texture, _programState, blendFunc, trianglesTwoColor, transform, transformFlags);
 #endif
 
 				const float* verts = _clipper->getClippedVertices().buffer();
@@ -539,7 +539,7 @@ void SkeletonRenderer::draw (Renderer* renderer, const Mat4& transform, uint32_t
 #if COCOS2D_VERSION < 0x00040000
 				TwoColorTrianglesCommand* batchedTriangles = lastTwoColorTrianglesCommand = twoColorBatch->addCommand(renderer, _globalZOrder, attachmentVertices->_texture->getName(), _glProgramState, blendFunc, trianglesTwoColor, transform, transformFlags);
 #else
-				TwoColorTrianglesCommand* batchedTriangles = lastTwoColorTrianglesCommand = twoColorBatch->addCommand(renderer, _globalZOrder, attachmentVertices->_texture, blendFunc, trianglesTwoColor, transform, transformFlags);
+				TwoColorTrianglesCommand* batchedTriangles = lastTwoColorTrianglesCommand = twoColorBatch->addCommand(renderer, _globalZOrder, attachmentVertices->_texture, _programState, blendFunc, trianglesTwoColor, transform, transformFlags);
 #endif
 
 				if (_effect) {

+ 0 - 1
spine-cocos2dx/src/spine/v4/SkeletonBatch.cpp

@@ -40,7 +40,6 @@ using std::max;
 
 #include "renderer/ccShaders.h"
 #include "renderer/backend/Device.h"
-#include "renderer/backend/ProgramState.h"
 
 namespace spine {
 

+ 1 - 6
spine-cocos2dx/src/spine/v4/SkeletonBatch.h

@@ -35,12 +35,7 @@
 
 #include <spine/spine.h>
 #include <vector>
-
-namespace cocos2d {
-	namespace backend {
-		class ProgramState;
-	}
-}
+#include "renderer/backend/ProgramState.h"
 
 namespace spine {
     

+ 43 - 18
spine-cocos2dx/src/spine/v4/SkeletonTwoColorBatch.cpp

@@ -99,16 +99,7 @@ namespace {
     backend::UniformLocation                __locPMatrix;
     backend::UniformLocation                __locTexture;
 
-    void initTwoColorProgramState()
-    {
-        if (__twoColorProgramState)
-        {
-            return;
-        }
-        auto program = backend::Device::getInstance()->newProgram(TWO_COLOR_TINT_VERTEX_SHADER, TWO_COLOR_TINT_FRAGMENT_SHADER);
-        auto* programState = new backend::ProgramState(program);
-        program->autorelease();
-
+    static void updateProgramStateLayout(backend::ProgramState* programState) {
         __locPMatrix = programState->getUniformLocation("u_PMatrix");
         __locTexture = programState->getUniformLocation("u_texture");
 
@@ -124,6 +115,19 @@ namespace {
         layout->setAttribute("a_color2", locColor2, backend::VertexFormat::UBYTE4, offsetof(spine::V3F_C4B_C4B_T2F, color2), true);
         layout->setAttribute("a_texCoords", locTexcoord, backend::VertexFormat::FLOAT2, offsetof(spine::V3F_C4B_C4B_T2F, texCoords), false);
         layout->setLayout(sizeof(spine::V3F_C4B_C4B_T2F));
+    }
+
+    static void initTwoColorProgramState()
+    {
+        if (__twoColorProgramState)
+        {
+            return;
+        }
+        auto program = backend::Device::getInstance()->newProgram(TWO_COLOR_TINT_VERTEX_SHADER, TWO_COLOR_TINT_FRAGMENT_SHADER);
+        auto* programState = new backend::ProgramState(program);
+        program->release();
+
+        updateProgramStateLayout(programState);
 
         __twoColorProgramState = std::shared_ptr<backend::ProgramState>(programState);
     }
@@ -136,9 +140,9 @@ TwoColorTrianglesCommand::TwoColorTrianglesCommand() :_materialID(0), _texture(n
 	_type = RenderCommand::Type::CUSTOM_COMMAND;
 }
 
-void TwoColorTrianglesCommand::init(float globalOrder, cocos2d::Texture2D *texture, BlendFunc blendType, const TwoColorTriangles& triangles, const Mat4& mv, uint32_t flags) {
+void TwoColorTrianglesCommand::init(float globalOrder, cocos2d::Texture2D *texture, cocos2d::backend::ProgramState* programState, BlendFunc blendType, const TwoColorTriangles& triangles, const Mat4& mv, uint32_t flags) {
 
-    updateCommandPipelineDescriptor();
+    updateCommandPipelineDescriptor(programState);
     const cocos2d::Mat4& projectionMat = Director::getInstance()->getMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);
 
     auto finalMatrix = projectionMat * mv;
@@ -177,18 +181,39 @@ void TwoColorTrianglesCommand::init(float globalOrder, cocos2d::Texture2D *textu
 
 
 
-void TwoColorTrianglesCommand::updateCommandPipelineDescriptor()
+void TwoColorTrianglesCommand::updateCommandPipelineDescriptor(cocos2d::backend::ProgramState* programState)
 {
+    // OPTIMIZE ME: all commands belong a same Node should share a same programState like SkeletonBatch
     if (!__twoColorProgramState)
     {
         initTwoColorProgramState();
     }
 
-    CC_SAFE_RELEASE_NULL(_programState);
-    _programState = __twoColorProgramState->clone();
+    bool needsUpdateStateLayout = false;
+    auto& pipelinePS = _pipelineDescriptor.programState;
+    if (programState != nullptr)
+    {
+        if (_programState != programState) {
+            CC_SAFE_RELEASE(_programState);
+            _programState = programState; // Because the programState belong to Node, so no need to clone
+            CC_SAFE_RETAIN(_programState);
+            needsUpdateStateLayout = true;
+        }
+    }
+    else {
+        needsUpdateStateLayout = _programState != nullptr && _programState->getProgramType() != __twoColorProgramState->getProgramType();
+        CC_SAFE_RELEASE(_programState);
+        _programState = __twoColorProgramState->clone();
+    }
+
+    CCASSERT(_programState, "programState should not be null");
+    pipelinePS = _programState;
+
+    if (needsUpdateStateLayout)
+        updateProgramStateLayout(pipelinePS);
+
     _locPMatrix = __locPMatrix;
     _locTexture = __locTexture;
-    _pipelineDescriptor.programState = _programState;
 }
 
 TwoColorTrianglesCommand::~TwoColorTrianglesCommand()
@@ -330,9 +355,9 @@ void SkeletonTwoColorBatch::deallocateIndices(uint32_t numIndices) {
 	_indices.setSize(_indices.size() - numIndices, 0);
 }
 
-TwoColorTrianglesCommand* SkeletonTwoColorBatch::addCommand(cocos2d::Renderer* renderer, float globalOrder, cocos2d::Texture2D* texture, cocos2d::BlendFunc blendType, const TwoColorTriangles& triangles, const cocos2d::Mat4& mv, uint32_t flags) {
+TwoColorTrianglesCommand* SkeletonTwoColorBatch::addCommand(cocos2d::Renderer* renderer, float globalOrder, cocos2d::Texture2D* texture, backend::ProgramState* programState, cocos2d::BlendFunc blendType, const TwoColorTriangles& triangles, const cocos2d::Mat4& mv, uint32_t flags) {
 	TwoColorTrianglesCommand* command = nextFreeCommand();
-	command->init(globalOrder, texture, blendType, triangles, mv, flags);
+	command->init(globalOrder, texture, programState, blendType, triangles, mv, flags);
     command->updateVertexAndIndexBuffer(renderer, triangles.verts, triangles.vertCount, triangles.indices, triangles.indexCount);
 	renderer->addCommand(command);
 	return command;

+ 4 - 3
spine-cocos2dx/src/spine/v4/SkeletonTwoColorBatch.h

@@ -35,6 +35,7 @@
 
 #include <spine/spine.h>
 #include <vector>
+#include "renderer/backend/ProgramState.h"
 
 namespace spine {
 	struct V3F_C4B_C4B_T2F {
@@ -57,9 +58,9 @@ namespace spine {
 		
 		~TwoColorTrianglesCommand();
 
-        void init(float globalOrder, cocos2d::Texture2D* texture, cocos2d::BlendFunc blendType, const TwoColorTriangles& triangles, const cocos2d::Mat4& mv, uint32_t flags);
+        void init(float globalOrder, cocos2d::Texture2D* texture, cocos2d::backend::ProgramState* programState, cocos2d::BlendFunc blendType, const TwoColorTriangles& triangles, const cocos2d::Mat4& mv, uint32_t flags);
 
-        void updateCommandPipelineDescriptor();
+        void updateCommandPipelineDescriptor(cocos2d::backend::ProgramState* programState);
 
         inline cocos2d::backend::TextureBackend* getTexture() const { return _texture; }
 
@@ -118,7 +119,7 @@ namespace spine {
 		unsigned short* allocateIndices(uint32_t numIndices);
 		void deallocateIndices(uint32_t numIndices);
 
-        TwoColorTrianglesCommand* addCommand(cocos2d::Renderer* renderer, float globalOrder, cocos2d::Texture2D* texture, cocos2d::BlendFunc blendType, const TwoColorTriangles& triangles, const cocos2d::Mat4& mv, uint32_t flags);
+        TwoColorTrianglesCommand* addCommand(cocos2d::Renderer* renderer, float globalOrder, cocos2d::Texture2D* texture, cocos2d::backend::ProgramState* programState, cocos2d::BlendFunc blendType, const TwoColorTriangles& triangles, const cocos2d::Mat4& mv, uint32_t flags);
 
         void batch(cocos2d::Renderer* renderer, TwoColorTrianglesCommand* command);