Beispiel #1
0
        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);
        }
Beispiel #2
0
        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;
                }
            }
        }