Browse Source

Fix bugs in the prev commit

Panagiotis Christopoulos Charitos 2 years ago
parent
commit
2f34ba6546

+ 14 - 0
AnKi/Resource/ModelResource.cpp

@@ -34,6 +34,20 @@ void ModelPatch::getRenderingInfo(const RenderingKey& key, ModelRenderingInfo& i
 	inf.m_program = variant.getShaderProgram();
 }
 
+void ModelPatch::getGeometryInfo(U32 lod, ModelPatchGeometryInfo& inf) const
+{
+	lod = min<U32>(lod, m_meshLodCount - 1);
+
+	inf.m_indexBufferOffset = m_lodInfos[lod].m_indexBufferOffset + m_lodInfos[lod].m_firstIndex * getIndexSize(IndexType::kU16);
+	inf.m_indexType = IndexType::kU16;
+	inf.m_indexCount = m_lodInfos[lod].m_indexCount;
+
+	for(VertexStreamId stream : EnumIterable(VertexStreamId::kMeshRelatedFirst, VertexStreamId::kMeshRelatedCount))
+	{
+		inf.m_vertexBufferOffsets[stream] = m_lodInfos[lod].m_vertexBufferOffsets[stream];
+	}
+}
+
 void ModelPatch::getRayTracingInfo(const RenderingKey& key, ModelRayTracingInfo& info) const
 {
 	ANKI_ASSERT(!!(m_mtl->getRenderingTechniques() & RenderingTechniqueBit(1 << key.getRenderingTechnique())));

+ 15 - 0
AnKi/Resource/ModelResource.h

@@ -44,6 +44,19 @@ public:
 	PtrSize m_indexBufferOffset;
 };
 
+/// @memberof ModelResource
+/// Part of the information required render the model.
+class ModelPatchGeometryInfo
+{
+public:
+	PtrSize m_indexBufferOffset;
+	U32 m_indexCount;
+	IndexType m_indexType;
+
+	/// Offset to the vertex buffer or kMaxPtrSize if stream is not present.
+	Array<PtrSize, U32(VertexStreamId::kMeshRelatedCount)> m_vertexBufferOffsets;
+};
+
 /// Model patch class. Its very important class and it binds a material with a mesh.
 class ModelPatch
 {
@@ -68,6 +81,8 @@ public:
 	/// Get information for rendering.
 	void getRenderingInfo(const RenderingKey& key, ModelRenderingInfo& inf) const;
 
+	void getGeometryInfo(U32 lod, ModelPatchGeometryInfo& inf) const;
+
 	/// Get the ray tracing info.
 	void getRayTracingInfo(const RenderingKey& key, ModelRayTracingInfo& info) const;
 

+ 16 - 23
AnKi/Scene/Components/ModelComponent.cpp

@@ -165,33 +165,26 @@ Error ModelComponent::update(SceneComponentUpdateInfo& info, Bool& updated)
 				meshLod.m_positionScale = mesh.getPositionsScale();
 				meshLod.m_positionTranslation = mesh.getPositionsTranslation();
 
-				for(VertexStreamId stream = VertexStreamId::kPosition; stream <= VertexStreamId::kBoneWeights; ++stream)
+				ModelPatchGeometryInfo inf;
+				patch.getGeometryInfo(l, inf);
+
+				ANKI_ASSERT((inf.m_indexBufferOffset % getIndexSize(inf.m_indexType)) == 0);
+				meshLod.m_firstIndex = U32(inf.m_indexBufferOffset / getIndexSize(inf.m_indexType));
+				meshLod.m_indexCount = inf.m_indexCount;
+
+				for(VertexStreamId stream = VertexStreamId::kMeshRelatedFirst; stream < VertexStreamId::kMeshRelatedCount; ++stream)
 				{
-					if(!mesh.isVertexStreamPresent(stream))
+					if(mesh.isVertexStreamPresent(stream))
 					{
-						continue;
+						const PtrSize elementSize = getFormatInfo(kMeshRelatedVertexStreamFormats[stream]).m_texelSize;
+						ANKI_ASSERT((inf.m_vertexBufferOffsets[stream] % elementSize) == 0);
+						meshLod.m_vertexOffsets[U32(stream)] = U32(inf.m_vertexBufferOffsets[stream] / elementSize);
+					}
+					else
+					{
+						meshLod.m_vertexOffsets[U32(stream)] = kMaxU32;
 					}
-
-					PtrSize offset;
-					U32 vertCount;
-					mesh.getVertexStreamInfo(l, stream, offset, vertCount);
-
-					const PtrSize elementSize = getFormatInfo(kMeshRelatedVertexStreamFormats[stream]).m_texelSize;
-
-					ANKI_ASSERT((offset % elementSize) == 0);
-					meshLod.m_vertexOffsets[U32(stream)] = U32(offset / elementSize);
 				}
-
-				U32 firstIndex;
-				U32 indexCount;
-				Aabb aabb;
-				mesh.getSubMeshInfo(l, i, firstIndex, indexCount, aabb);
-				PtrSize offset;
-				IndexType indexType;
-				mesh.getIndexBufferInfo(l, offset, indexCount, indexType);
-				ANKI_ASSERT((U32(offset) % getIndexSize(indexType)) == 0);
-				meshLod.m_firstIndex = U32(offset) / getIndexSize(indexType) + firstIndex;
-				meshLod.m_indexCount = indexCount;
 			}
 
 			// Copy the last LOD to the rest just in case