/**
* 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 "CubismRenderer_OpenGLES2.hpp"
#include "Math/CubismMatrix44.hpp"
#include "Type/csmVector.hpp"
#include "Model/CubismModel.hpp"
#include <float.h>
#ifdef CSM_TARGET_WIN_GL
#include <Windows.h>
#endif
#define CSM_FRAGMENT_SHADER_FP_PRECISION_HIGH "highp"
#define CSM_FRAGMENT_SHADER_FP_PRECISION_MID "mediump"
#define CSM_FRAGMENT_SHADER_FP_PRECISION_LOW "lowp"
#define CSM_FRAGMENT_SHADER_FP_PRECISION CSM_FRAGMENT_SHADER_FP_PRECISION_HIGH
//------------ LIVE2D NAMESPACE ------------
namespace Live2D { namespace Cubism { namespace Framework { namespace Rendering {
/*********************************************************************************************************************
* CubismClippingManager_OpenGLES2
********************************************************************************************************************/
///< ファイルスコープの変数宣言
namespace {
const csmInt32 ColorChannelCount = 4; // 実験時に1チャンネルの場合は1、RGBだけの場合は3、アルファも含める場合は4
const csmInt32 ClippingMaskMaxCountOnDefault = 36; // 通常のフレームバッファ1枚あたりのマスク最大数
const csmInt32 ClippingMaskMaxCountOnMultiRenderTexture = 32; // フレームバッファが2枚以上ある場合のフレームバッファ1枚あたりのマスク最大数
}
CubismClippingManager_OpenGLES2::CubismClippingManager_OpenGLES2() :
_clippingMaskBufferSize(256, 256)
{
CubismRenderer::CubismTextureColor* tmp;
tmp = CSM_NEW CubismRenderer::CubismTextureColor();
tmp->R = 1.0f;
tmp->G = 0.0f;
tmp->B = 0.0f;
tmp->A = 0.0f;
_channelColors.PushBack(tmp);
tmp = CSM_NEW CubismRenderer::CubismTextureColor();
tmp->R = 0.0f;
tmp->G = 1.0f;
tmp->B = 0.0f;
tmp->A = 0.0f;
_channelColors.PushBack(tmp);
tmp = CSM_NEW CubismRenderer::CubismTextureColor();
tmp->R = 0.0f;
tmp->G = 0.0f;
tmp->B = 1.0f;
tmp->A = 0.0f;
_channelColors.PushBack(tmp);
tmp = CSM_NEW CubismRenderer::CubismTextureColor();
tmp->R = 0.0f;
tmp->G = 0.0f;
tmp->B = 0.0f;
tmp->A = 1.0f;
_channelColors.PushBack(tmp);
}
CubismClippingManager_OpenGLES2::~CubismClippingManager_OpenGLES2()
{
for (csmUint32 i = 0; i < _clippingContextListForMask.GetSize(); i++)
{
if (_clippingContextListForMask[i]) CSM_DELETE_SELF(CubismClippingContext, _clippingContextListForMask[i]);
_clippingContextListForMask[i] = NULL;
}
// _clippingContextListForDrawは_clippingContextListForMaskにあるインスタンスを指している。上記の処理により要素ごとのDELETEは不要。
for (csmUint32 i = 0; i < _clippingContextListForDraw.GetSize(); i++)
{
_clippingContextListForDraw[i] = NULL;
}
for (csmUint32 i = 0; i < _channelColors.GetSize(); i++)
{
if (_channelColors[i]) CSM_DELETE(_channelColors[i]);
_channelColors[i] = NULL;
}
if (_clearedFrameBufferFlags.GetSize() != 0)
{
_clearedFrameBufferFlags.Clear();
_clearedFrameBufferFlags = NULL;
}
}
void CubismClippingManager_OpenGLES2::Initialize(CubismModel& model, csmInt32 drawableCount, const csmInt32** drawableMasks, const csmInt32* drawableMaskCounts, const csmInt32 maskBufferCount)
{
_renderTextureCount = maskBufferCount;
// レンダーテクスチャのクリアフラグの設定
for (csmInt32 i = 0; i < _renderTextureCount; ++i)
{
_clearedFrameBufferFlags.PushBack(false);
}
//クリッピングマスクを使う描画オブジェクトを全て登録する
//クリッピングマスクは、通常数個程度に限定して使うものとする
for (csmInt32 i = 0; i < drawableCount; i++)
{
if (drawableMaskCounts[i] <= 0)
{
//クリッピングマスクが使用されていないアートメッシュ(多くの場合使用しない)
_clippingContextListForDraw.PushBack(NULL);
continue;
}
// 既にあるClipContextと同じかチェックする
CubismClippingContext* cc = FindSameClip(drawableMasks[i], drawableMaskCounts[i]);
if (cc == NULL)
{
// 同一のマスクが存在していない場合は生成する
cc = CSM_NEW CubismClippingContext(this, drawableMasks[i], drawableMaskCounts[i]);
_clippingContextListForMask.PushBack(cc);
}
cc->AddClippedDrawable(i);
_clippingContextListForDraw.PushBack(cc);
}
}
CubismClippingContext* CubismClippingManager_OpenGLES2::FindSameClip(const csmInt32* drawableMasks, csmInt32 drawableMaskCounts) const
{
// 作成済みClippingContextと一致するか確認
for (csmUint32 i = 0; i < _clippingContextListForMask.GetSize(); i++)
{
CubismClippingContext* cc = _clippingContextListForMask[i];
const csmInt32 count = cc->_clippingIdCount;
if (count != drawableMaskCounts) continue; //個数が違う場合は別物
csmInt32 samecount = 0;
// 同じIDを持つか確認。配列の数が同じなので、一致した個数が同じなら同じ物を持つとする。
for (csmInt32 j = 0; j < count; j++)
{
const csmInt32 clipId = cc->_clippingIdList[j];
for (csmInt32 k = 0; k < count; k++)
{
if (drawableMasks[k] == clipId)
{
samecount++;
break;
}
}
}
if (samecount == count)
{
return cc;
}
}
return NULL; //見つからなかった
}
void CubismClippingManager_OpenGLES2::SetupClippingContext(CubismModel& model, CubismRenderer_OpenGLES2* renderer, GLint lastFBO, GLint lastViewport[4])
{
// 全てのクリッピングを用意する
// 同じクリップ(複数の場合はまとめて1つのクリップ)を使う場合は1度だけ設定する
csmInt32 usingClipCount = 0;
for (csmUint32 clipIndex = 0; clipIndex < _clippingContextListForMask.GetSize(); clipIndex++)
{
// 1つのクリッピングマスクに関して
CubismClippingContext* cc = _clippingContextListForMask[clipIndex];
// このクリップを利用する描画オブジェクト群全体を囲む矩形を計算
CalcClippedDrawTotalBounds(model, cc);
if (cc->_isUsing)
{
usingClipCount++; //使用中としてカウント
}
}
// マスク作成処理
if (usingClipCount > 0)
{
if (!renderer->IsUsingHighPrecisionMask())
{
// 生成したFrameBufferと同じサイズでビューポートを設定
glViewport(0, 0, _clippingMaskBufferSize.X, _clippingMaskBufferSize.Y);
// 後の計算のためにインデックスの最初をセット
_currentOffscreenFrame = renderer->GetMaskBuffer(0);
// ----- マスク描画処理 -----
_currentOffscreenFrame->BeginDraw(lastFBO);
renderer->PreDraw(); // バッファをクリアする
}
// 各マスクのレイアウトを決定していく
SetupLayoutBounds(renderer->IsUsingHighPrecisionMask() ? 0 : usingClipCount);
// サイズがレンダーテクスチャの枚数と合わない場合は合わせる
if (_clearedFrameBufferFlags.GetSize() != _renderTextureCount)
{
_clearedFrameBufferFlags.Clear();
for (csmInt32 i = 0; i < _renderTextureCount; ++i)
{
_cle
没有合适的资源?快使用搜索试试~ 我知道了~
Live2d-FOR-QT-6.6.2
共700个文件
json:226个
hpp:158个
cpp:132个
0 下载量 195 浏览量
2024-04-02
11:22:59
上传
评论
收藏 41.54MB ZIP 举报
温馨提示
Live2d SDK C++ 移植 QT6.6.2,博客 https://blog.csdn.net/weixin_47560078/article/details/136989233
资源推荐
资源详情
资源评论
收起资源包目录
Live2d-FOR-QT-6.6.2 (700个子文件)
CubismRenderer_OpenGLES2.cpp 108KB
CubismRenderer_OpenGLES2.cpp 108KB
CubismRenderer_Cocos2dx.cpp 103KB
CubismRenderer_Cocos2dx.cpp 103KB
CubismRenderer_D3D11.cpp 66KB
CubismRenderer_D3D11.cpp 66KB
CubismRenderer_D3D9.cpp 62KB
CubismRenderer_D3D9.cpp 62KB
CubismPhysics.cpp 38KB
CubismPhysics.cpp 38KB
CubismModel.cpp 29KB
CubismModel.cpp 29KB
CubismMotion.cpp 27KB
CubismMotion.cpp 27KB
LAppModel.cpp 19KB
LAppModel.cpp 19KB
CubismUserModelExtend.cpp 16KB
CubismUserModelExtend.cpp 16KB
CubismRenderState_D3D11.cpp 16KB
CubismRenderState_D3D11.cpp 16KB
CubismShader_D3D11.cpp 14KB
CubismShader_D3D11.cpp 14KB
CubismModelSettingJson.cpp 14KB
CubismModelSettingJson.cpp 14KB
LAppView.cpp 13KB
LAppView.cpp 13KB
csmString.cpp 12KB
csmString.cpp 12KB
CubismJson.cpp 12KB
CubismJson.cpp 12KB
CubismRenderState_D3D9.cpp 11KB
CubismRenderState_D3D9.cpp 11KB
CubismFramework.cpp 10KB
CubismFramework.cpp 10KB
CubismShader_D3D9.cpp 9KB
CubismShader_D3D9.cpp 9KB
CubismPose.cpp 9KB
CubismPose.cpp 9KB
LAppDelegate.cpp 9KB
LAppDelegate.cpp 8KB
CubismPhysicsJson.cpp 8KB
CubismPhysicsJson.cpp 8KB
CubismOffscreenSurface_D3D11.cpp 7KB
CubismOffscreenSurface_D3D11.cpp 7KB
CubismCommandBuffer_Cocos2dx.cpp 7KB
CubismCommandBuffer_Cocos2dx.cpp 7KB
LAppWavFileHandler.cpp 7KB
LAppWavFileHandler.cpp 7KB
LAppLive2DManager.cpp 7KB
LAppLive2DManager.cpp 7KB
CubismMotionQueueManager.cpp 7KB
CubismMotionQueueManager.cpp 7KB
CubismUserModel.cpp 6KB
CubismUserModel.cpp 6KB
LAppSprite.cpp 5KB
LAppSprite.cpp 5KB
CubismTargetPoint.cpp 5KB
CubismTargetPoint.cpp 5KB
CubismViewMatrix.cpp 5KB
CubismViewMatrix.cpp 5KB
CubismMotionJson.cpp 5KB
CubismMotionJson.cpp 5KB
CubismOffscreenSurface_Cocos2dx.cpp 5KB
CubismOffscreenSurface_Cocos2dx.cpp 5KB
CubismOffscreenSurface_D3D9.cpp 5KB
CubismOffscreenSurface_D3D9.cpp 5KB
ACubismMotion.cpp 4KB
ACubismMotion.cpp 4KB
CubismExpressionMotion.cpp 4KB
CubismExpressionMotion.cpp 4KB
CubismMath.cpp 4KB
CubismMath.cpp 4KB
CubismOffscreenSurface_OpenGLES2.cpp 4KB
CubismOffscreenSurface_OpenGLES2.cpp 4KB
CubismEyeBlink.cpp 4KB
CubismEyeBlink.cpp 4KB
CubismModelMatrix.cpp 4KB
CubismModelMatrix.cpp 4KB
LAppTextureManager.cpp 3KB
LAppTextureManager.cpp 3KB
moc_mainwindow.cpp 3KB
moc_mainwindow.cpp 3KB
CubismMotionQueueEntry.cpp 3KB
CubismMotionQueueEntry.cpp 3KB
CubismMatrix44.cpp 3KB
CubismMatrix44.cpp 3KB
MouseActionManager.cpp 3KB
MouseActionManager.cpp 3KB
CubismString.cpp 3KB
CubismString.cpp 3KB
CubismRenderer.cpp 3KB
CubismRenderer.cpp 3KB
CubismCdiJson.cpp 3KB
CubismCdiJson.cpp 3KB
CubismMoc.cpp 3KB
CubismMoc.cpp 3KB
LAppDefine.cpp 3KB
LAppDefine.cpp 3KB
CubismDefaultParameterId.cpp 3KB
CubismDefaultParameterId.cpp 3KB
共 700 条
- 1
- 2
- 3
- 4
- 5
- 6
- 7
资源评论
余衫马
- 粉丝: 1505
- 资源: 18
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- matlab神经网络的简单应用(用于预测光伏出力,输入为温度湿度等因素,输出为光伏出力).zip
- 面试资格确认c语言,一些常见的知识点以及简要说明
- Matlab基本算法智能微电网粒子群优化算法.zip
- 搜索网站-通过特定算法和系统,使用户能够在互联网上查找和获取相关信息的技术
- 基于Matlab和CPLEX的2变量机组组合调度程序.zip
- 2019华为杯研究生数学建模竞赛A题-基于 python 实现无线智能传播模型
- c语言连接两个字符串,一个简单的示例代码
- java EE 酒店管理系统项目源码
- 建模比赛数学建模、数据分析、工程设计数据清洗、特征提取或其他预处理步骤
- HTML Document Structure
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功