public static bool StreamBVector <TDoc, TCursor>(this IO.TagElementStream <TDoc, TCursor, string> s , string xmlName, ref BVector vector , bool isOptional = true, IO.TagElementNodeType xmlSource = XML.XmlUtil.kSourceElement) where TDoc : class where TCursor : class { Contract.Requires(xmlSource.RequiresName() == (xmlName != XML.XmlUtil.kNoXmlName)); string string_value = null; bool was_streamed = true; const bool to_lower = false; if (s.IsReading) { if (isOptional) { was_streamed = s.StreamStringOpt(xmlName, ref string_value, to_lower, xmlSource); } else { s.StreamString(xmlName, ref string_value, to_lower, xmlSource); } if (was_streamed) { var parse_result = PhxUtil.ParseBVectorString(string_value); if (!parse_result.HasValue) { s.ThrowReadException(new System.IO.InvalidDataException(string.Format( "Failed to parse value (hint: {0}) as vector: {1}", xmlSource.RequiresName() ? xmlName : "ElementText", string_value))); } vector = parse_result.Value; } } else if (s.IsWriting) { if (isOptional && PhxPredicates.IsZero(vector)) { was_streamed = false; return(was_streamed); } string_value = vector.ToBVectorString(); if (isOptional) { s.StreamStringOpt(xmlName, ref string_value, to_lower, xmlSource); } else { s.StreamString(xmlName, ref string_value, to_lower, xmlSource); } } return(was_streamed); }
static string VectorToString(uint offset, int length, XmbVariantMemoryPool pool) { float x = 0, y = 0, z = 0, w = 0; switch (length) { case 1: { x = pool.GetSingle(offset); } break; case 2: { var v = pool.GetVector2D(offset); x = v.X; y = v.Y; } break; case 3: { var v = pool.GetVector3D(offset); x = v.X; y = v.Y; z = v.Z; } break; case 4: { var v = pool.GetVector4D(offset); x = v.X; y = v.Y; z = v.Z; w = v.W; } break; default: throw new ArgumentOutOfRangeException("length", length.ToString()); } var vector = new BVector(x, y, z, w); return(vector.ToBVectorString(length)); }