private static List <MemoryStream> ContainTextureStreams(rendRenderMorphTargetMeshBlob blob, MemoryStream texbuffer) { var textureStreams = new List <MemoryStream>(); var Count = blob.Header.TargetTextureDiffsData.Count; var texCount = 0; var TargetDiffsDataOffset = new List <uint>(); var TargetDiffsDataSize = new List <uint>(); var TargetDiffsMipLevelCounts = new List <uint>(); var TargetDiffsWidth = new List <uint>(); for (var i = 0; i < Count; i++) { if (blob.Header.TargetTextureDiffsData[i].TargetDiffsDataSize.Count == 0) { break; } TargetDiffsDataOffset.Add(blob.Header.TargetTextureDiffsData[i].TargetDiffsDataOffset[0]); TargetDiffsDataSize.Add(blob.Header.TargetTextureDiffsData[i].TargetDiffsDataSize[0]); TargetDiffsMipLevelCounts.Add(blob.Header.TargetTextureDiffsData[i].TargetDiffsMipLevelCounts[0]); TargetDiffsWidth.Add(blob.Header.TargetTextureDiffsData[i].TargetDiffsWidth[0]); texCount++; } var texbr = new BinaryReader(texbuffer); for (var i = 0; i < texCount; i++) { texbuffer.Position = TargetDiffsDataOffset[i]; var bytes = texbr.ReadBytes((int)TargetDiffsDataSize[i]); var ms = new MemoryStream(); var metadata = new DDSMetadata( TargetDiffsWidth[i], TargetDiffsWidth[i], 1, 1, TargetDiffsMipLevelCounts[i], 0, 0, DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM, TEX_DIMENSION.TEX_DIMENSION_TEXTURE2D, 16, true); DDSUtils.GenerateAndWriteHeader(ms, metadata); var bw = new BinaryWriter(ms); bw.Write(bytes); textureStreams.Add(ms); } return(textureStreams); }
static List <MemoryStream> ContainTextureStreams(rendRenderMorphTargetMeshBlob blob, MemoryStream texbuffer) { List <MemoryStream> textureStreams = new List <MemoryStream>(); int Count = blob.Header.TargetTextureDiffsData.Count; int texCount = 0; List <UInt32> TargetDiffsDataOffset = new List <UInt32>(); List <UInt32> TargetDiffsDataSize = new List <UInt32>(); List <UInt32> TargetDiffsMipLevelCounts = new List <UInt32>(); List <UInt32> TargetDiffsWidth = new List <UInt32>(); for (int i = 0; i < Count; i++) { if (blob.Header.TargetTextureDiffsData[i].TargetDiffsDataSize.Count == 0) { break; } TargetDiffsDataOffset.Add(blob.Header.TargetTextureDiffsData[i].TargetDiffsDataOffset[0].Value); TargetDiffsDataSize.Add(blob.Header.TargetTextureDiffsData[i].TargetDiffsDataSize[0].Value); TargetDiffsMipLevelCounts.Add(blob.Header.TargetTextureDiffsData[i].TargetDiffsMipLevelCounts[0].Value); TargetDiffsWidth.Add(blob.Header.TargetTextureDiffsData[i].TargetDiffsWidth[0].Value); texCount++; } BinaryReader texbr = new BinaryReader(texbuffer); for (int i = 0; i < texCount; i++) { texbuffer.Position = TargetDiffsDataOffset[i]; byte[] bytes = texbr.ReadBytes((int)TargetDiffsDataSize[i]); MemoryStream ms = new MemoryStream(); DDSMetadata metadata = new DDSMetadata(TargetDiffsWidth[i], TargetDiffsWidth[i], TargetDiffsMipLevelCounts[i], EFormat.BC7_UNORM, 16, false, 0, true); DDSUtils.GenerateAndWriteHeader(ms, metadata); BinaryWriter bw = new BinaryWriter(ms); bw.Write(bytes); textureStreams.Add(ms); } return(textureStreams); }
private void SetTargets(CR2WFile cr2w, ModelRoot model, rendRenderMorphTargetMeshBlob blob, Stream diffsBuffer, Stream mappingsBuffer) { // Validate that all submeshes contain the same number of morph targets var morphTargetCount = model.LogicalMeshes[0].Primitives[0].MorphTargetsCount; if (model.LogicalMeshes.Any(l => l.Primitives[0].MorphTargetsCount != morphTargetCount)) { throw new Exception("All submeshes must have the same number of morph targets."); } if (morphTargetCount == 0) { throw new Exception("Mesh contains no morph targets to import."); } // Set global headers for blob blob.Header.NumTargets = (uint)morphTargetCount; // Write buffer positions for all the morph targets for (var morphTarget = 0; morphTarget < morphTargetCount; morphTarget++) { blob.Header.TargetStartsInVertexDiffs[morphTarget] = (uint)morphTarget; blob.Header.TargetStartsInVertexDiffsMapping[morphTarget] = (uint)morphTarget; for (var i = 0; i < morphTarget; i++) { var vertexCount = GetVertexCountInMorphTarget(model, i); blob.Header.TargetStartsInVertexDiffs[morphTarget] += vertexCount - 1; blob.Header.TargetStartsInVertexDiffsMapping[morphTarget] += vertexCount - 1; } } var diffsWriter = new BinaryWriter(diffsBuffer); var mappingsWriter = new BinaryWriter(mappingsBuffer); for (var i = 0; i < morphTargetCount; i++) { // Write scale and offsets var(scale, offset) = CalculateTargetQuant(model, i); blob.Header.TargetPositionDiffOffset[i].X = offset.X; blob.Header.TargetPositionDiffOffset[i].Y = offset.Y; blob.Header.TargetPositionDiffOffset[i].Z = offset.Z; blob.Header.TargetPositionDiffScale[i].X = scale.X; blob.Header.TargetPositionDiffScale[i].Y = scale.Y; blob.Header.TargetPositionDiffScale[i].Z = scale.Z; for (var subMeshId = 0; subMeshId < model.LogicalMeshes.Count; subMeshId++) { var logicalMesh = model.LogicalMeshes[subMeshId].Primitives[0]; var morphTarget = logicalMesh.GetMorphTargetAccessors(i); if (!morphTarget.ContainsKey("TANGENT")) { throw new Exception($"Morph target {i} does not contain any tangents. Did you remember to export them?"); } if (!morphTarget.ContainsKey("NORMAL")) { throw new Exception($"Morph target {i} does not contain any normals. Did you remember to export them?"); } var vertices = morphTarget["POSITION"].AsVector3Array(); var normals = morphTarget["NORMAL"].AsVector3Array(); var tangents = morphTarget["TANGENT"].AsVector3Array(); var mappings = new List <ushort>(); var deltaCount = 0; for (var x = 0; x < vertices.Count; x++) { var vertexDelta = vertices[x]; var normalsDelta = normals[x]; var tangentsDelta = tangents[x]; if (vertexDelta.X == 0 && vertexDelta.Y == 0 && vertexDelta.Z == 0) { continue; } // Mappings mappings.Add((ushort)x); deltaCount++; var convertX = (vertexDelta.X - offset.X) / scale.X; var convertY = (vertexDelta.Y - offset.Z) / scale.Z; var convertZ = (vertexDelta.Z - -offset.Y) / scale.Y; // Position var output = Converters.Vec3ToU32(new TargetVec3(convertX, -convertZ, convertY), 1); diffsWriter.Write(output); // Normal output = Converters.Vec4ToU32(new Vec4(normalsDelta.X, -normalsDelta.Z, normalsDelta.Y, 1f)); diffsWriter.Write(output); // Tangent output = Converters.Vec4ToU32(new Vec4(tangentsDelta.X, -tangentsDelta.Z, tangentsDelta.Y, 1f)); diffsWriter.Write(output); } // Write mappings foreach (var mapping in mappings) { mappingsWriter.Write(mapping); } // Padding? foreach (var mapping in mappings) { mappingsWriter.Write((ushort)0); } blob.Header.NumVertexDiffsInEachChunk[i][subMeshId] = (uint)deltaCount; blob.Header.NumVertexDiffsMappingInEachChunk[i][subMeshId] = (uint)deltaCount; blob.Header.NumDiffs += (uint)deltaCount; } } }