diff --git a/WickedEngine/wiScene.cpp b/WickedEngine/wiScene.cpp index c5a5c3aab..3973dc414 100644 --- a/WickedEngine/wiScene.cpp +++ b/WickedEngine/wiScene.cpp @@ -3811,63 +3811,63 @@ namespace wi::scene const TransformComponent& transform = *transforms.GetComponent(entity); hair.UpdateCPU(transform, *mesh, dt); + } + } - GraphicsDevice* device = wi::graphics::GetDevice(); + GraphicsDevice* device = wi::graphics::GetDevice(); - uint32_t indexCount = (uint32_t)hair.primitiveBuffer.desc.size / (uint32_t)hair.primitiveBuffer.desc.stride; - uint32_t triangleCount = indexCount / 3u; - uint32_t meshletCount = triangle_count_to_meshlet_count(triangleCount); - uint32_t meshletOffset = meshletAllocator.fetch_add(meshletCount); + uint32_t indexCount = (uint32_t)hair.primitiveBuffer.desc.size / std::max(1u, (uint32_t)hair.primitiveBuffer.desc.stride); + uint32_t triangleCount = indexCount / 3u; + uint32_t meshletCount = triangle_count_to_meshlet_count(triangleCount); + uint32_t meshletOffset = meshletAllocator.fetch_add(meshletCount); - ShaderGeometry geometry; - geometry.init(); - geometry.indexOffset = 0; - geometry.materialIndex = (uint)materials.GetIndex(entity); - geometry.ib = device->GetDescriptorIndex(&hair.primitiveBuffer, SubresourceType::SRV); - geometry.vb_pos_nor_wind = device->GetDescriptorIndex(&hair.vertexBuffer_POS[0], SubresourceType::SRV); - geometry.vb_pre = device->GetDescriptorIndex(&hair.vertexBuffer_POS[1], SubresourceType::SRV); - geometry.vb_uvs = device->GetDescriptorIndex(&hair.vertexBuffer_UVS, SubresourceType::SRV); - geometry.flags = SHADERMESH_FLAG_DOUBLE_SIDED | SHADERMESH_FLAG_HAIRPARTICLE; - geometry.meshletOffset = 0; - geometry.meshletCount = meshletCount; + ShaderGeometry geometry; + geometry.init(); + geometry.indexOffset = 0; + geometry.materialIndex = (uint)materials.GetIndex(entity); + geometry.ib = device->GetDescriptorIndex(&hair.primitiveBuffer, SubresourceType::SRV); + geometry.vb_pos_nor_wind = device->GetDescriptorIndex(&hair.vertexBuffer_POS[0], SubresourceType::SRV); + geometry.vb_pre = device->GetDescriptorIndex(&hair.vertexBuffer_POS[1], SubresourceType::SRV); + geometry.vb_uvs = device->GetDescriptorIndex(&hair.vertexBuffer_UVS, SubresourceType::SRV); + geometry.flags = SHADERMESH_FLAG_DOUBLE_SIDED | SHADERMESH_FLAG_HAIRPARTICLE; + geometry.meshletOffset = 0; + geometry.meshletCount = meshletCount; - size_t geometryAllocation = geometryAllocator.fetch_add(1); - std::memcpy(geometryArrayMapped + geometryAllocation, &geometry, sizeof(geometry)); + size_t geometryAllocation = geometryAllocator.fetch_add(1); + std::memcpy(geometryArrayMapped + geometryAllocation, &geometry, sizeof(geometry)); - ShaderMeshInstance inst; - inst.init(); - inst.uid = entity; - inst.layerMask = hair.layerMask; - inst.geometryOffset = (uint)geometryAllocation; - inst.emissive = wi::math::Pack_R11G11B10_FLOAT(XMFLOAT3(1, 1, 1)); - inst.color = wi::math::CompressColor(XMFLOAT4(1, 1, 1, 1)); - inst.geometryCount = 1; - inst.meshletOffset = meshletOffset; + ShaderMeshInstance inst; + inst.init(); + inst.uid = entity; + inst.layerMask = hair.layerMask; + inst.geometryOffset = (uint)geometryAllocation; + inst.emissive = wi::math::Pack_R11G11B10_FLOAT(XMFLOAT3(1, 1, 1)); + inst.color = wi::math::CompressColor(XMFLOAT4(1, 1, 1, 1)); + inst.geometryCount = 1; + inst.meshletOffset = meshletOffset; - const size_t instanceIndex = objects.GetCount() + args.jobIndex; - std::memcpy(instanceArrayMapped + instanceIndex, &inst, sizeof(inst)); + const size_t instanceIndex = objects.GetCount() + args.jobIndex; + std::memcpy(instanceArrayMapped + instanceIndex, &inst, sizeof(inst)); - if (TLAS_instancesMapped != nullptr && hair.BLAS.IsValid()) + if (TLAS_instancesMapped != nullptr && hair.BLAS.IsValid()) + { + // TLAS instance data: + RaytracingAccelerationStructureDesc::TopLevel::Instance instance; + for (int i = 0; i < arraysize(instance.transform); ++i) + { + for (int j = 0; j < arraysize(instance.transform[i]); ++j) { - // TLAS instance data: - RaytracingAccelerationStructureDesc::TopLevel::Instance instance; - for (int i = 0; i < arraysize(instance.transform); ++i) - { - for (int j = 0; j < arraysize(instance.transform[i]); ++j) - { - instance.transform[i][j] = wi::math::IDENTITY_MATRIX.m[j][i]; - } - } - instance.instance_id = (uint32_t)instanceIndex; - instance.instance_mask = hair.layerMask & 0xFF; - instance.bottom_level = &hair.BLAS; - instance.instance_contribution_to_hit_group_index = 0; - instance.flags = RaytracingAccelerationStructureDesc::TopLevel::Instance::FLAG_TRIANGLE_CULL_DISABLE; - - void* dest = (void*)((size_t)TLAS_instancesMapped + instanceIndex * device->GetTopLevelAccelerationStructureInstanceSize()); - device->WriteTopLevelAccelerationStructureInstance(&instance, dest); + instance.transform[i][j] = wi::math::IDENTITY_MATRIX.m[j][i]; } } + instance.instance_id = (uint32_t)instanceIndex; + instance.instance_mask = hair.layerMask & 0xFF; + instance.bottom_level = &hair.BLAS; + instance.instance_contribution_to_hit_group_index = 0; + instance.flags = RaytracingAccelerationStructureDesc::TopLevel::Instance::FLAG_TRIANGLE_CULL_DISABLE; + + void* dest = (void*)((size_t)TLAS_instancesMapped + instanceIndex * device->GetTopLevelAccelerationStructureInstanceSize()); + device->WriteTopLevelAccelerationStructureInstance(&instance, dest); } }); @@ -3905,7 +3905,7 @@ namespace wi::scene GraphicsDevice* device = wi::graphics::GetDevice(); - uint32_t indexCount = (uint32_t)emitter.primitiveBuffer.desc.size / (uint32_t)emitter.primitiveBuffer.desc.stride; + uint32_t indexCount = (uint32_t)emitter.primitiveBuffer.desc.size / std::max(1u, (uint32_t)emitter.primitiveBuffer.desc.stride); uint32_t triangleCount = indexCount / 3u; uint32_t meshletCount = triangle_count_to_meshlet_count(triangleCount); uint32_t meshletOffset = meshletAllocator.fetch_add(meshletCount); diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index bdaf7d588..304feba4c 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wi::version // minor features, major updates, breaking compatibility changes const int minor = 60; // minor bug fixes, alterations, refactors, updates - const int revision = 75; + const int revision = 76; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);