private static void ConfigureVertexAttributes(Mesh mesh, UltimateMesh renderMesh, RSkeleton skeleton, MeshObject meshObject, BufferObject vertexBuffer0, BufferObject vertexBuffer1) { var riggingAccessor = new SsbhRiggingAccessor(mesh); var influences = riggingAccessor.ReadRiggingBuffer(meshObject.Name, (int)meshObject.SubIndex); var indexByBoneName = GetIndexByBoneName(skeleton); // TODO: Optimize reading/configuring rigging buffer? GetRiggingData(meshObject.VertexCount, influences, indexByBoneName, out IVec4[] boneIndices, out Vector4[] boneWeights);
private UltimateMesh CreateRenderMesh(RSkeleton skeleton, MeshObject meshObject) { var vertexAccessor = new SsbhVertexAccessor(mesh); var vertexIndices = vertexAccessor.ReadIndices(meshObject); var renderMesh = new UltimateMesh(vertexIndices, meshObject.VertexCount); ConfigureVertexAttributes(renderMesh, skeleton, meshObject, vertexAccessor); return(renderMesh); }
private static UltimateMesh CreateRenderMesh(Mesh mesh, RSkeleton skeleton, MeshObject meshObject, BufferObject vertexBuffer0, BufferObject vertexBuffer1) { var vertexAccessor = new SsbhVertexAccessor(mesh); var vertexIndices = vertexAccessor.ReadIndices(meshObject); var renderMesh = new UltimateMesh(vertexIndices, meshObject.VertexCount); ConfigureVertexAttributes(mesh, renderMesh, skeleton, meshObject, vertexBuffer0, vertexBuffer1); return renderMesh; }
private void ConfigureVertexAttributes(UltimateMesh renderMesh, RSkeleton skeleton, MeshObject meshObject, SsbhVertexAccessor vertexAccessor) { // TODO: Just use the mesh buffer. var positionValues = ReadAttributeOrSetZero("Position0", meshObject, vertexAccessor); var normalValues = ReadAttributeOrSetZero("Normal0", meshObject, vertexAccessor); var tangentValues = ReadAttributeOrSetZero("Tangent0", meshObject, vertexAccessor); var map1Values = ReadAttributeOrSetZero("map1", meshObject, vertexAccessor); var uvSetValues = ReadAttributeOrSetZero("uvSet", meshObject, vertexAccessor); var uvSet1Values = ReadAttributeOrSetZero("uvSet1", meshObject, vertexAccessor); var uvSet2Values = ReadAttributeOrSetZero("uvSet2", meshObject, vertexAccessor); var bake1Values = ReadAttributeOrSetZero("bake1", meshObject, vertexAccessor); var colorSet1Values = ReadAttributeOrSetDefault("colorSet1", meshObject, vertexAccessor, 128f); // TODO: How to reduce the number of attributes if attributes are read directly from a shared mesh buffer? var colorSet2Values = ReadAttributeOrSetZero("colorSet2", meshObject, vertexAccessor); var colorSet21Values = ReadAttributeOrSetZero("colorSet2_1", meshObject, vertexAccessor); var colorSet22Values = ReadAttributeOrSetZero("colorSet2_2", meshObject, vertexAccessor); var colorSet23Values = ReadAttributeOrSetZero("colorSet2_3", meshObject, vertexAccessor); var colorSet3Values = ReadAttributeOrSetZero("colorSet3", meshObject, vertexAccessor); var colorSet4Values = ReadAttributeOrSetZero("colorSet4", meshObject, vertexAccessor); var colorSet5Values = ReadAttributeOrSetZero("colorSet5", meshObject, vertexAccessor); var colorSet6Values = ReadAttributeOrSetZero("colorSet6", meshObject, vertexAccessor); var colorSet7Values = ReadAttributeOrSetZero("colorSet7", meshObject, vertexAccessor); AddAttribute("Position0", renderMesh, positionValues); AddAttribute("Normal0", renderMesh, normalValues); AddAttribute("Tangent0", renderMesh, tangentValues); AddAttribute("map1", renderMesh, map1Values); AddAttribute("uvSet", renderMesh, uvSetValues); AddAttribute("uvSet1", renderMesh, uvSet1Values); AddAttribute("uvSet2", renderMesh, uvSet2Values); AddAttribute("bake1", renderMesh, bake1Values); AddAttribute("colorSet1", renderMesh, colorSet1Values); var riggingAccessor = new SsbhRiggingAccessor(mesh); var influences = riggingAccessor.ReadRiggingBuffer(meshObject.Name, (int)meshObject.SubMeshIndex); var indexByBoneName = GetIndexByBoneName(skeleton); GetRiggingData(meshObject.VertexCount, influences, indexByBoneName, out IVec4[] boneIndices, out Vector4[] boneWeights);