载入中...
搜索中...
未找到
GraphicsSkin.cpp
浏览该文件的文档.
1#include "common/Exception.h"
3
4namespace eve::graphics::webgpu {
5wgpu::Buffer Graphics::uploadSkinPalette(Mesh* mesh) {
6 const bool skinned = mesh && mesh->hasGpuSkinning() && mesh->getSkinPaletteCount() > 0;
7 const uint64_t bytes = skinned ? mesh->skinPalette().size() * sizeof(float) : sizeof(glm::mat4);
8 wgpu::Limits limits{};
9 if (device.GetLimits(&limits) != wgpu::Status::Success || bytes > limits.maxStorageBufferBindingSize)
10 throw Exception("Skin palette exceeds device maxStorageBufferBindingSize");
11 auto& arena = currentUboArena();
12 const size_t slot = arena.paletteIndex++;
13 if (arena.palettes.size() <= slot) arena.palettes.resize(slot + 1);
14 auto& buffer = arena.palettes[slot];
15 if (!buffer || buffer.GetSize() < bytes) {
16 wgpu::BufferDescriptor desc{};
17 desc.size = bytes;
18 desc.usage = wgpu::BufferUsage::Storage | wgpu::BufferUsage::CopyDst;
19 buffer = device.CreateBuffer(&desc);
20 }
21 const glm::mat4 identity(1.f);
22 queue.WriteBuffer(buffer, 0, skinned ? mesh->skinPalette().data() : &identity[0][0], bytes);
23 return buffer;
24}
25} // namespace eve::graphics::webgpu
scene::NodeDesc desc
std::uint64_t bytes
std::unique_ptr< gpgpu::GpuBuffer > buffer
Definition OnnxGpgpu.cpp:26
Mesh * mesh
const AssetImportLimits & limits