Ejemplo n.º 1
0
        public static void WriteModel(TextWriter textWriter, IFlexibleModel model)
        {
            using (var writer = new JsonTextWriter(textWriter))
            {
                writer.Formatting = Formatting.Indented;

                writer.WriteStartObject();
                {
                    // todo: make this for Radius -> Sphere
                    //writer.WritePropertyName("Version");
                    //writer.WriteValue(2);
                    writer.WritePropertyName("VertexSets");
                    writer.WriteStartArray();
                    foreach (var vertexSet in model.VertexSets)
                    {
                        writer.WriteStartObject();
                        {
                            writer.WritePropertyName("ArraySubranges");
                            writer.WriteStartArray();
                            {
                                foreach (var arraySubrange in vertexSet.ArraySubranges)
                                {
                                    writer.WriteStartObject();
                                    {
                                        var bytes = new byte[arraySubrange.Length];
                                        var ptr   = arraySubrange.RawDataResource.Map();
                                        Marshal.Copy(ptr + arraySubrange.StartOffset, bytes, 0, arraySubrange.Length);
                                        arraySubrange.RawDataResource.Unmap(false);
                                        writer.WritePropertyName("Data");

                                        // Inverse normals code
                                        //fixed (byte* pBytes = bytes)
                                        //{
                                        //    var normalElemInfo = vertexSet.ElementInfos
                                        //        .FirstOrDefault(x => x.CommonSemantic == CommonVertexSemantic.Normal);
                                        //    if (normalElemInfo != null && normalElemInfo.ArrayIndex == i)
                                        //    {
                                        //        for (var j = normalElemInfo.Offset;
                                        //            j < bytes.Length;
                                        //            j += normalElemInfo.Stride)
                                        //        {
                                        //            *(Vector3*)&pBytes[j] = -*(Vector3*)(ptr + j);
                                        //        }
                                        //    }
                                        //}

                                        writer.WriteValue(bytes);
                                    }
                                    writer.WriteEnd();
                                }
                            }
                            writer.WriteEnd();

                            var indicesInfo = vertexSet.IndicesInfo;
                            writer.WritePropertyName("IndicesInfo");
                            if (indicesInfo == null)
                            {
                                writer.WriteNull();
                            }
                            else
                            {
                                writer.WriteStartObject();
                                {
                                    writer.WritePropertyName("ArrayIndex");
                                    writer.WriteValue(indicesInfo.ArrayIndex);
                                    writer.WritePropertyName("Format");
                                    writer.WriteValue(indicesInfo.Format.ToString());
                                }
                                writer.WriteEnd();
                            }

                            writer.WritePropertyName("ElementInfos");
                            writer.WriteStartArray();
                            {
                                foreach (var elementInfo in vertexSet.ElementInfos)
                                {
                                    writer.WriteStartObject();
                                    {
                                        writer.WritePropertyName("ArrayIndex");
                                        writer.WriteValue(elementInfo.ArrayIndex);
                                        writer.WritePropertyName("Format");
                                        writer.WriteValue(elementInfo.Format.ToString());
                                        writer.WritePropertyName("Stride");
                                        writer.WriteValue(elementInfo.Stride);
                                        writer.WritePropertyName("Offset");
                                        writer.WriteValue(elementInfo.Offset);
                                        writer.WritePropertyName("CommonSemantic");
                                        writer.WriteValue(elementInfo.CommonSemantic.ToString());
                                        writer.WritePropertyName("Semantic");
                                        writer.WriteValue(elementInfo.Semantic);
                                    }
                                    writer.WriteEnd();
                                }
                            }
                            writer.WriteEnd();
                        }
                        writer.WriteEnd();
                    }
                    writer.WriteEnd();

                    writer.WritePropertyName("Parts");
                    writer.WriteStartArray();
                    foreach (var part in model.Parts)
                    {
                        writer.WriteStartObject();
                        {
                            writer.WritePropertyName("VertexSetIndex");
                            writer.WriteValue(part.VertexSetIndex);
                            writer.WritePropertyName("PrimitiveTopology");
                            writer.WriteValue(part.PrimitiveTopology.ToString());
                            writer.WritePropertyName("VertexOffset");
                            writer.WriteValue(part.VertexOffset);
                            writer.WritePropertyName("FirstIndex");
                            writer.WriteValue(part.FirstIndex);
                            writer.WritePropertyName("IndexCount");
                            writer.WriteValue(part.IndexCount);
                            writer.WritePropertyName("ModelMaterialName");
                            writer.WriteValue(part.ModelMaterialName);
                        }
                        writer.WriteEnd();
                    }
                    writer.WriteEnd();

                    // todo: write sphere
                    writer.WritePropertyName("Radius");
                    writer.WriteValue(model.BoundingSphere.Radius + model.BoundingSphere.Center.Length());
                }
                writer.WriteEnd();
            }
        }
Ejemplo n.º 2
0
 public UcFlexibleModelCache(IFlexibleModel cgModel)
 {
     this.cgModel = cgModel;
     dirty        = true;
 }