2023-10-25 19:25:42 +08:00
|
|
|
/**
|
2022-06-24 16:23:26 +08:00
|
|
|
* 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"
|
2023-06-11 13:08:08 +08:00
|
|
|
#include "base/Director.h"
|
2022-06-24 16:23:26 +08:00
|
|
|
#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);
|
2022-06-24 16:23:26 +08:00
|
|
|
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();
|
2022-06-24 16:23:26 +08:00
|
|
|
|
|
|
|
// 頂点データ
|
|
|
|
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);
|
2022-06-24 16:23:26 +08:00
|
|
|
}
|
|
|
|
|
2023-10-25 19:25:42 +08:00
|
|
|
auto layout = programState->getMutableVertexLayout();
|
2022-06-24 16:23:26 +08:00
|
|
|
// attribute属性を登録
|
2023-10-25 19:25:42 +08:00
|
|
|
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);
|
2022-06-24 16:23:26 +08:00
|
|
|
|
|
|
|
// uniform属性の登録
|
2023-10-25 19:25:42 +08:00
|
|
|
programState->setTexture(_program->getUniformLocation("u_tex0"), 0, texture);
|
2022-06-24 16:23:26 +08:00
|
|
|
|
|
|
|
programState->setUniform(_program->getUniformLocation("baseColor"), _spriteColor, sizeof(float) * 4);
|
|
|
|
|
2023-10-25 19:25:42 +08:00
|
|
|
layout->setStride(sizeof(float) * 4);
|
2022-06-24 16:23:26 +08:00
|
|
|
|
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;
|
2022-06-24 16:23:26 +08:00
|
|
|
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;
|
|
|
|
}
|