axmol/tests/live2d-tests/Classes/LAppSprite.cpp

96 lines
3.6 KiB
C++

/**
* Copyright(c) Live2D Inc. All rights reserved.
*
* Use of this source code is governed by the Live2D Open Software license
* that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.
*/
#include "LAppSprite.hpp"
#include "base/CCDirector.h"
#include "LAppPal.hpp"
LAppSprite::LAppSprite(backend::Program* program)
{
_program = program;
std::fill_n(_spriteColor, 4, 1);
}
LAppSprite::~LAppSprite()
{
}
void LAppSprite::RenderImmidiate(Csm::Rendering::CubismCommandBuffer_Cocos2dx* commandBuffer,
backend::TextureBackend* texture,
float uvVertex[8]) const
{
Csm::Rendering::CubismCommandBuffer_Cocos2dx::DrawCommandBuffer* drawCommandBuffer = CSM_NEW Csm::Rendering::CubismCommandBuffer_Cocos2dx::DrawCommandBuffer();
PipelineDescriptor* pipelineDescriptor = drawCommandBuffer->GetCommandDraw()->GetPipelineDescriptor();
backend::BlendDescriptor* blendDescriptor = drawCommandBuffer->GetCommandDraw()->GetBlendDescriptor();
backend::ProgramState* programState = pipelineDescriptor->programState;
drawCommandBuffer->GetCommandDraw()->GetCommand()->setDrawType(ax::CustomCommand::DrawType::ELEMENT);
drawCommandBuffer->GetCommandDraw()->GetCommand()->setPrimitiveType(ax::backend::PrimitiveType::TRIANGLE);
drawCommandBuffer->CreateVertexBuffer(sizeof(float) * 2, 4 * 2);
drawCommandBuffer->CreateIndexBuffer(6);
// 画面サイズを取得する
ax::Size visibleSize = ax::Director::getInstance()->getVisibleSize();
ax::Size winSize = ax::Director::getInstance()->getWinSize();
// 頂点データ
float positionVertex[] =
{
visibleSize.width / winSize.width, visibleSize.height / winSize.height,
-visibleSize.width / winSize.width, visibleSize.height / winSize.height,
-visibleSize.width / winSize.width,-visibleSize.height / winSize.height,
visibleSize.width / winSize.width,-visibleSize.height / winSize.height,
};
short positionIndex[] =
{
0,1,2,
0,2,3
};
drawCommandBuffer->UpdateVertexBuffer(positionVertex, uvVertex, 4);
drawCommandBuffer->UpdateIndexBuffer(positionIndex, 6);
drawCommandBuffer->CommitVertexBuffer();
if (!programState)
{
programState = new ax::backend::ProgramState(_program);
}
// attribute属性を登録
programState->setVertexAttrib("position", _program->getAttributeLocation("position"), backend::VertexFormat::FLOAT2, 0, false);
programState->setVertexAttrib("uv", _program->getAttributeLocation("uv"), backend::VertexFormat::FLOAT2, sizeof(float) * 2, false);
// uniform属性の登録
programState->setTexture(_program->getUniformLocation("texture"), 0, texture);
programState->setUniform(_program->getUniformLocation("baseColor"), _spriteColor, sizeof(float) * 4);
programState->setVertexStride(sizeof(float) * 4);
blendDescriptor->sourceRGBBlendFactor = ax::backend::BlendFactor::ONE;
blendDescriptor->destinationRGBBlendFactor = ax::backend::BlendFactor::ONE_MINUS_SRC_ALPHA;
blendDescriptor->sourceAlphaBlendFactor = ax::backend::BlendFactor::ONE;
blendDescriptor->destinationAlphaBlendFactor = ax::backend::BlendFactor::ONE_MINUS_SRC_ALPHA;
blendDescriptor->blendEnabled = true;
pipelineDescriptor->programState = programState;
// モデルの描画
commandBuffer->AddDrawCommand(drawCommandBuffer->GetCommandDraw());
}
void LAppSprite::SetColor(float r, float g, float b, float a)
{
_spriteColor[0] = r;
_spriteColor[1] = g;
_spriteColor[2] = b;
_spriteColor[3] = a;
}