| 12 | using namespace game; |
| 13 | |
| 14 | void RenderPassForward::on_update(const skr_primitive_pass_context_t* context) |
| 15 | { |
| 16 | namespace rg = skr::render_graph; |
| 17 | SkrZoneScopedN("ForwardPass Update"); |
| 18 | |
| 19 | need_clear = true; |
| 20 | |
| 21 | auto render_graph = context->render_graph; |
| 22 | auto storage = context->storage; |
| 23 | |
| 24 | if (!anim_query) |
| 25 | { |
| 26 | auto sig = u8"[in]skr::renderer::MeshComponent, [in]skr::anim::AnimComponent"; |
| 27 | *anim_query = sugoiQ_from_literal(storage, sig); |
| 28 | } |
| 29 | // upload skin mesh data |
| 30 | { |
| 31 | uint64_t skinVerticesSize = 0; |
| 32 | { |
| 33 | SkrZoneScopedN("CalculateSkinMeshSize"); |
| 34 | |
| 35 | auto calcUploadBufferSize = [&](sugoi_chunk_view_t* r_cv) { |
| 36 | const auto anims = sugoi::get_component_ro<skr::anim::AnimComponent>(r_cv); |
| 37 | for (uint32_t i = 0; i < r_cv->count; i++) |
| 38 | { |
| 39 | auto* anim = anims + i; |
| 40 | const bool use_dynamic_buffer = anim->use_dynamic_buffer; |
| 41 | if (use_dynamic_buffer) continue; |
| 42 | for (size_t j = 0u; j < anim->buffers.size(); j++) |
| 43 | { |
| 44 | skinVerticesSize += anim->buffers[j]->get_size(); |
| 45 | } |
| 46 | } |
| 47 | }; |
| 48 | sugoiQ_get_views(*anim_query, SUGOI_LAMBDA(calcUploadBufferSize)); |
| 49 | } |
| 50 | if (skinVerticesSize == 0) return; |
| 51 | |
| 52 | auto upload_buffer_handle = render_graph->create_buffer( |
| 53 | [=](rg::RenderGraph& g, rg::BufferBuilder& builder) { |
| 54 | builder.set_name(SKR_UTF8("SkinMeshUploadBuffer")) |
| 55 | .size(skinVerticesSize) |
| 56 | .with_tags(kRenderGraphDefaultResourceTag) |
| 57 | .as_upload_buffer(); |
| 58 | }); |
| 59 | |
| 60 | render_graph->add_copy_pass( |
| 61 | [=](rg::RenderGraph& g, rg::CopyPassBuilder& builder) { |
| 62 | builder.set_name(SKR_UTF8("CopySkinMesh")) |
| 63 | .from_buffer(upload_buffer_handle.range(0, skinVerticesSize)) |
| 64 | .can_be_lone(); |
| 65 | }, |
| 66 | [this, upload_buffer_handle](rg::RenderGraph& g, rg::CopyPassContext& context) { |
| 67 | SkrZoneScopedN("CopySkinMesh"); |
| 68 | |
| 69 | auto uploadVertices = [&](sugoi_chunk_view_t* r_cv) { |
| 70 | const skr::anim::AnimComponent* anims = nullptr; |
| 71 | { |
nothing calls this directly
no test coverage detected