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

98 lines
3.7 KiB
C++
Raw Normal View History

/**
* 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/Director.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;
2022-10-18 19:17:36 +08:00
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);
// 画面サイズを取得する
2022-10-18 19:17:36 +08:00
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)
{
2022-10-18 19:17:36 +08:00
programState = new ax::backend::ProgramState(_program);
}
auto layout = programState->getMutableVertexLayout();
// attribute属性を登録
layout->setAttrib("a_position", _program->getAttributeLocation("a_position"), backend::VertexFormat::FLOAT2, 0, false);
layout->setAttrib("a_texCoord", _program->getAttributeLocation("a_texCoord"), backend::VertexFormat::FLOAT2,
sizeof(float) * 2, false);
// uniform属性の登録
programState->setTexture(_program->getUniformLocation("u_tex0"), 0, texture);
programState->setUniform(_program->getUniformLocation("baseColor"), _spriteColor, sizeof(float) * 4);
layout->setStride(sizeof(float) * 4);
2022-10-18 19:17:36 +08:00
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;
}