diff options
Diffstat (limited to 'Assets/ProFlares/Editor/FlareJson.cs')
-rw-r--r-- | Assets/ProFlares/Editor/FlareJson.cs | 1163 |
1 files changed, 0 insertions, 1163 deletions
diff --git a/Assets/ProFlares/Editor/FlareJson.cs b/Assets/ProFlares/Editor/FlareJson.cs deleted file mode 100644 index f49d17f..0000000 --- a/Assets/ProFlares/Editor/FlareJson.cs +++ /dev/null @@ -1,1163 +0,0 @@ -using System; -using System.Collections; -using System.Text; -using System.Collections.Generic; -using UnityEngine; - -// Source: UIToolkit -- https://github.com/prime31/UIToolkit/blob/master/Assets/Plugins/MiniJSON.cs - -// Based on the JSON parser from -// http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html - -/// <summary> -/// This class encodes and decodes JSON strings. -/// Spec. details, see http://www.json.org/ -/// -/// JSON uses Arrays and Objects. These correspond here to the datatypes ArrayList and Hashtable. -/// All numbers are parsed to doubles. -/// </summary> - -public class FlareJson -{ - private const int TOKEN_NONE = 0; - private const int TOKEN_CURLY_OPEN = 1; - private const int TOKEN_CURLY_CLOSE = 2; - private const int TOKEN_SQUARED_OPEN = 3; - private const int TOKEN_SQUARED_CLOSE = 4; - private const int TOKEN_COLON = 5; - private const int TOKEN_COMMA = 6; - private const int TOKEN_STRING = 7; - private const int TOKEN_NUMBER = 8; - private const int TOKEN_TRUE = 9; - private const int TOKEN_FALSE = 10; - private const int TOKEN_NULL = 11; - private const int BUILDER_CAPACITY = 2000; - - /// <summary> - /// On decoding, this value holds the position at which the parse failed (-1 = no error). - /// </summary> - protected static int lastErrorIndex = -1; - protected static string lastDecode = ""; - - public static Color decodeColor(Hashtable table){ - - float r = float.Parse(table["r"].ToString()); - float g = float.Parse(table["g"].ToString()); - float b = float.Parse(table["b"].ToString()); - float a = float.Parse(table["a"].ToString()); - - return new Color(r,g,b,a); - } - - public static Vector4 decodeVector4(Hashtable table){ - - float r = float.Parse(table["r"].ToString()); - float g = float.Parse(table["g"].ToString()); - float b = float.Parse(table["b"].ToString()); - float a = float.Parse(table["a"].ToString()); - - return new Vector4(r,g,b,a); - } - - public static Vector3 decodeVector3(Hashtable table){ - - float r = float.Parse(table["r"].ToString()); - float g = float.Parse(table["g"].ToString()); - float b = float.Parse(table["b"].ToString()); - - return new Vector4(r,g,b); - } - - public static Vector2 decodeVector2(Hashtable table){ - - float x = float.Parse(table["x"].ToString()); - float y = float.Parse(table["y"].ToString()); - - return new Vector2(x,y); - } - - - public static AnimationCurve decodeAnimCurve(Hashtable table){ - - AnimationCurve curve = new AnimationCurve (); - - - foreach (System.Collections.DictionaryEntry key in table) { - - - Hashtable keyTable = (Hashtable)table [key.Key]; - - - float time = float.Parse(keyTable["time"].ToString()); - float value = float.Parse(keyTable["value"].ToString()); - float _in = float.Parse(keyTable["in"].ToString()); - float _out = float.Parse(keyTable["out"].ToString()); -// float tangentMode = float.Parse(keyTable["tangentMode"].ToString()); - - Keyframe newKey = new Keyframe(time,value,_in,_out); - // newKey.tangentMode = tangentMode; - - curve.AddKey(newKey); - - } - - return curve; - } - - public static bool decodeBool(string str){ - - int num = int.Parse(str); - if(num == 1) - return true; - else - return false; - } - - public static void LoadFlareData (ProFlare flare, TextAsset asset) - { - - string jsonString = asset.text; - -// Debug.Log ("LoadFlareData"); - - Hashtable decodedHash = jsonDecode (jsonString) as Hashtable; - - if (decodedHash == null) { - Debug.LogWarning ("Unable to parse Json file: " + asset.name); - return; - } - - Hashtable meta = (Hashtable)decodedHash["meta"]; - - flare.GlobalScale = float.Parse(meta["GlobalScale"].ToString()); - - flare.GlobalBrightness = float.Parse(meta["GlobalBrightness"].ToString()); - - flare.GlobalTintColor = FlareJson.decodeColor((Hashtable)meta["GlobalTintColor"]); - - flare.MultiplyScaleByTransformScale = FlareJson.decodeBool(meta["MultiplyScaleByTransformScale"].ToString()); - - //Distance Fall off - flare.useMaxDistance = FlareJson.decodeBool(meta["useMaxDistance"].ToString()); - - flare.useDistanceScale = FlareJson.decodeBool(meta["useDistanceScale"].ToString()); - - flare.useDistanceFade = FlareJson.decodeBool(meta["useDistanceFade"].ToString()); - - flare.GlobalMaxDistance = float.Parse(meta["GlobalMaxDistance"].ToString()); - - - //Angle Culling Properties - flare.UseAngleLimit = FlareJson.decodeBool(meta["UseAngleLimit"].ToString()); - - flare.maxAngle = float.Parse(meta["maxAngle"].ToString()); - - flare.UseAngleScale = FlareJson.decodeBool(meta["UseAngleScale"].ToString()); - - flare.UseAngleBrightness = FlareJson.decodeBool(meta["UseAngleBrightness"].ToString()); - - flare.UseAngleCurve = FlareJson.decodeBool(meta["UseAngleCurve"].ToString()); - - flare.AngleCurve = FlareJson.decodeAnimCurve ((Hashtable)meta ["AngleCurve"]); - - // public LayerMask mask = 1; - - flare.RaycastPhysics = FlareJson.decodeBool(meta["RaycastPhysics"].ToString()); - - flare.OffScreenFadeDist = float.Parse(meta["OffScreenFadeDist"].ToString()); - - flare.useDynamicEdgeBoost = FlareJson.decodeBool(meta["useDynamicEdgeBoost"].ToString()); - - flare.DynamicEdgeBoost = float.Parse(meta["DynamicEdgeBoost"].ToString()); - - flare.DynamicEdgeBrightness = float.Parse(meta["DynamicEdgeBrightness"].ToString()); - - flare.DynamicEdgeRange = float.Parse(meta["DynamicEdgeRange"].ToString()); - - flare.DynamicEdgeBias = float.Parse(meta["DynamicEdgeBias"].ToString()); - - flare.DynamicEdgeCurve = FlareJson.decodeAnimCurve ((Hashtable)meta ["DynamicEdgeCurve"]); - - flare.useDynamicCenterBoost = FlareJson.decodeBool(meta["useDynamicCenterBoost"].ToString()); - - flare.DynamicCenterBoost = float.Parse(meta["DynamicCenterBoost"].ToString()); - - flare.DynamicCenterBrightness = float.Parse(meta["DynamicCenterBrightness"].ToString()); - - flare.DynamicCenterRange = float.Parse(meta["DynamicCenterRange"].ToString()); - - flare.DynamicCenterBias = float.Parse(meta["DynamicCenterBias"].ToString()); - - flare.neverCull = FlareJson.decodeBool(meta["neverCull"].ToString()); - - flare.Elements.Clear (); - - Hashtable elements = (Hashtable)meta["Elements"]; - - foreach (System.Collections.DictionaryEntry item in elements) { - - Hashtable element = (Hashtable)elements[item.Key]; - - ProFlareElement elementNew = new ProFlareElement(); - - elementNew.Editing = FlareJson.decodeBool(element["Editing"].ToString()); - - elementNew.Visible = FlareJson.decodeBool(element["Visible"].ToString()); - - elementNew.SpriteName = element["SpriteName"].ToString(); - - elementNew.flare = flare; - - elementNew.flareAtlas = flare._Atlas; - - elementNew.Brightness = float.Parse(element["Brightness"].ToString()); - - elementNew.Scale = float.Parse(element["Scale"].ToString()); - - elementNew.ScaleRandom = float.Parse(element["ScaleRandom"].ToString()); - - elementNew.ScaleFinal = float.Parse(element["ScaleFinal"].ToString()); - - elementNew.RandomColorAmount = FlareJson.decodeVector4((Hashtable)element["RandomColorAmount"]); - -// //Element OffSet Properties - elementNew.position = float.Parse(element["position"].ToString()); - - elementNew.useRangeOffset = FlareJson.decodeBool(element["useRangeOffset"].ToString()); - - elementNew.SubElementPositionRange_Min = float.Parse(element["SubElementPositionRange_Min"].ToString()); - - elementNew.SubElementPositionRange_Max = float.Parse(element["SubElementPositionRange_Max"].ToString()); - - elementNew.SubElementAngleRange_Min = float.Parse(element["SubElementAngleRange_Min"].ToString()); - - elementNew.SubElementAngleRange_Max = float.Parse(element["SubElementAngleRange_Max"].ToString()); - - elementNew.OffsetPosition = FlareJson.decodeVector3((Hashtable)element["OffsetPosition"]); - - elementNew.Anamorphic = FlareJson.decodeVector3((Hashtable)element["Anamorphic"]); - - elementNew.OffsetPostion = FlareJson.decodeVector3((Hashtable)element["OffsetPostion"]); - -// //Element Rotation Properties - elementNew.angle = float.Parse(element["angle"].ToString()); - - elementNew.useRandomAngle = FlareJson.decodeBool(element["useRandomAngle"].ToString()); - - elementNew.useStarRotation = FlareJson.decodeBool(element["useStarRotation"].ToString()); - - elementNew.AngleRandom_Min = float.Parse(element["AngleRandom_Min"].ToString()); - - elementNew.AngleRandom_Max = float.Parse(element["AngleRandom_Max"].ToString()); - - elementNew.OrientToSource = FlareJson.decodeBool(element["OrientToSource"].ToString()); - - elementNew.rotateToFlare = FlareJson.decodeBool(element["rotateToFlare"].ToString()); - - elementNew.rotationSpeed = float.Parse(element["rotationSpeed"].ToString()); - - elementNew.rotationOverTime = float.Parse(element["rotationOverTime"].ToString()); - -// //Colour Properties, - elementNew.useColorRange = FlareJson.decodeBool(element["useColorRange"].ToString()); - - elementNew.OffsetPosition = FlareJson.decodeVector3((Hashtable)element["OffsetPosition"]); - - elementNew.ElementTint = FlareJson.decodeColor((Hashtable)element["ElementTint"]); - - elementNew.SubElementColor_Start = FlareJson.decodeColor((Hashtable)element["SubElementColor_Start"]); - - elementNew.SubElementColor_End = FlareJson.decodeColor((Hashtable)element["SubElementColor_End"]); - -// //Scale Curve - elementNew.useScaleCurve = FlareJson.decodeBool(element["useScaleCurve"].ToString()); - - elementNew.ScaleCurve = FlareJson.decodeAnimCurve ((Hashtable)element ["ScaleCurve"]); - -// //Override Properties - elementNew.OverrideDynamicEdgeBoost = FlareJson.decodeBool(element["OverrideDynamicEdgeBoost"].ToString()); - - elementNew.DynamicEdgeBoostOverride = float.Parse(element["DynamicEdgeBoostOverride"].ToString()); - - elementNew.OverrideDynamicCenterBoost = FlareJson.decodeBool(element["OverrideDynamicCenterBoost"].ToString()); - - elementNew.DynamicCenterBoostOverride = float.Parse(element["DynamicCenterBoostOverride"].ToString()); - - elementNew.OverrideDynamicEdgeBrightness = FlareJson.decodeBool(element["OverrideDynamicEdgeBrightness"].ToString()); - - elementNew.DynamicEdgeBrightnessOverride = float.Parse(element["DynamicEdgeBrightnessOverride"].ToString()); - - elementNew.OverrideDynamicCenterBrightness = FlareJson.decodeBool(element["OverrideDynamicCenterBrightness"].ToString()); - - elementNew.DynamicCenterBrightnessOverride = float.Parse(element["DynamicCenterBrightnessOverride"].ToString()); - - elementNew.type = (ProFlareElement.Type)(int.Parse(element["type"].ToString())); - - - elementNew.size = FlareJson.decodeVector2((Hashtable)element["size"]); - - Hashtable subElements = (Hashtable)element["subElements"]; - - if(subElements != null) - foreach (System.Collections.DictionaryEntry subItem in subElements) { - - Hashtable subElement = (Hashtable)subElements[subItem.Key]; - - SubElement subElementNew = new SubElement(); - - subElementNew.color = FlareJson.decodeColor((Hashtable)subElement["color"]); - - subElementNew.position = float.Parse(subElement["position"].ToString()); - - subElementNew.offset = FlareJson.decodeVector3((Hashtable)subElement["offset"]); - - subElementNew.angle = float.Parse(subElement["angle"].ToString()); - - subElementNew.scale = float.Parse(subElement["scale"].ToString()); - - subElementNew.random = float.Parse(subElement["random"].ToString()); - - subElementNew.random2 = float.Parse(subElement["random2"].ToString()); - - subElementNew.RandomScaleSeed = float.Parse(subElement["RandomScaleSeed"].ToString()); - - subElementNew.RandomColorSeedR = float.Parse(subElement["RandomColorSeedR"].ToString()); - - subElementNew.RandomColorSeedG = float.Parse(subElement["RandomColorSeedG"].ToString()); - - subElementNew.RandomColorSeedB = float.Parse(subElement["RandomColorSeedB"].ToString()); - - subElementNew.RandomColorSeedA = float.Parse(subElement["RandomColorSeedA"].ToString()); - - elementNew.subElements.Add(subElementNew); - } - - bool Found = false; - - for(int i2 = 0; i2 < flare._Atlas.elementsList.Count; i2++){ - if(elementNew.SpriteName == flare._Atlas.elementsList[i2].name){ - Found = true; - elementNew.elementTextureID = i2; - } - } - - if(Found) - flare.Elements.Add(elementNew); - else - Debug.LogWarning("ProFlares - Flare Element Missing From Atlas Not Adding - "+elementNew.SpriteName); - - } - - foreach (ProFlareBatch batch in flare.FlareBatches) { - batch.dirty = true; - } - } - /// <summary> - /// Parse the specified JSon file, loading sprite information for the specified atlas. - /// </summary> - - public static void LoadSpriteData (ProFlareAtlas atlas, TextAsset asset) - { - if (asset == null || atlas == null) return; - - string jsonString = asset.text; - - Hashtable decodedHash = jsonDecode(jsonString) as Hashtable; - - if (decodedHash == null) - { - Debug.LogWarning("Unable to parse Json file: " + asset.name); - return; - } - List<ProFlareAtlas.Element> oldElements = atlas.elementsList; - - atlas.elementsList = new List<ProFlareAtlas.Element>(); - - Vector2 TextureScale = Vector2.one; - - //Find Texture Size - Hashtable meta = (Hashtable)decodedHash["meta"]; - foreach (System.Collections.DictionaryEntry item in meta) - { - if(item.Key.ToString() == "size"){ - Hashtable sizeTable = (Hashtable)item.Value; - - TextureScale.x = int.Parse(sizeTable["w"].ToString()); - TextureScale.y = int.Parse(sizeTable["h"].ToString()); - } - } - - //Debug.LogError(TextureScale); - - Hashtable frames = (Hashtable)decodedHash["frames"]; - foreach (System.Collections.DictionaryEntry item in frames) - { - ProFlareAtlas.Element newElement = new ProFlareAtlas.Element(); - newElement.name = item.Key.ToString(); - - bool exists = false; - - // Check to see if this sprite exists - foreach (ProFlareAtlas.Element oldSprite in oldElements) - { - if (oldSprite.name.Equals(newElement.name, StringComparison.OrdinalIgnoreCase)) - { - exists = true; - break; - } - } - - if (!exists) - { - newElement.name = newElement.name.Replace(".png", ""); - newElement.name = newElement.name.Replace(".tga", ""); - newElement.name = newElement.name.Replace(".psd", ""); - newElement.name = newElement.name.Replace(".PSD", ""); - } - - Hashtable table = (Hashtable)item.Value; - Hashtable frame = (Hashtable)table["frame"]; - - int frameX = int.Parse(frame["x"].ToString()); - int frameY = int.Parse(frame["y"].ToString()); - int frameW = int.Parse(frame["w"].ToString()); - int frameH = int.Parse(frame["h"].ToString()); - - Rect finalUVs = new Rect(frameX, frameY, frameW, frameH); - - Rect rect = new Rect(frameX, frameY, frameW, frameH); - - float width = TextureScale.x; - float height = TextureScale.y; - - if (width != 0f && height != 0f) - { - finalUVs.xMin = rect.xMin / width; - finalUVs.xMax = rect.xMax / width; - finalUVs.yMin = 1f - rect.yMax / height; - finalUVs.yMax = 1f - rect.yMin / height; - } - - newElement.UV = finalUVs; - newElement.Imported = true; - - - - atlas.elementsList.Add(newElement); - } - - foreach (ProFlareAtlas.Element oldSprite in oldElements) - { - if (!oldSprite.Imported) - { - atlas.elementsList.Add(oldSprite); - } - } - - // Sort imported sprites alphabetically - - atlas.elementsList.Sort(CompareSprites); - - Debug.Log("PROFLARES - Imported " + atlas.elementsList.Count + " Elements"); - - // Unload the asset - asset = null; - Resources.UnloadUnusedAssets(); - } - - /// <summary> - /// Sprite comparison function for sorting. - /// </summary> - - static int CompareSprites (ProFlareAtlas.Element a, ProFlareAtlas.Element b) { return a.name.CompareTo(b.name); } - - /// <summary> - /// Copy the inner rectangle from one sprite to another. - /// </summary> - /* - static void CopyInnerRect (ProFlareAtlas.Element oldSprite, ProFlareAtlas.Element newElement) - { - float offsetX = oldSprite.inner.xMin - oldSprite.outer.xMin; - float offsetY = oldSprite.inner.yMin - oldSprite.outer.yMin; - float sizeX = oldSprite.inner.width; - float sizeY = oldSprite.inner.height; - - if (Mathf.Approximately(newElement.outer.width, oldSprite.outer.width)) - { - // The sprite has not been rotated or it's a square - newElement.inner = new Rect(newElement.outer.xMin + offsetX, newElement.outer.yMin + offsetY, sizeX, sizeY); - } - else if (Mathf.Approximately(newElement.outer.width, oldSprite.outer.height)) - { - // The sprite was rotated since the last time it was imported - newElement.inner = new Rect(newElement.outer.xMin + offsetY, newElement.outer.yMin + offsetX, sizeY, sizeX); - } - } - */ - /// <summary> - /// Parses the string json into a value - /// </summary> - /// <param name="json">A JSON string.</param> - /// <returns>An ArrayList, a Hashtable, a double, a string, null, true, or false</returns> - public static object jsonDecode( string json ) - { - // save the string for debug information - FlareJson.lastDecode = json; - - if( json != null ) - { - char[] charArray = json.ToCharArray(); - int index = 0; - bool success = true; - object value = FlareJson.parseValue( charArray, ref index, ref success ); - - if( success ){ - Debug.Log("jsonDecode success"); - FlareJson.lastErrorIndex = -1; - } - else{ - - FlareJson.lastErrorIndex = index; - } - return value; - } - else - { - return null; - } - } - - - /// <summary> - /// Converts a Hashtable / ArrayList / Dictionary(string,string) object into a JSON string - /// </summary> - /// <param name="json">A Hashtable / ArrayList</param> - /// <returns>A JSON encoded string, or null if object 'json' is not serializable</returns> - public static string jsonEncode( object json ) - { - var builder = new StringBuilder( BUILDER_CAPACITY ); - var success = FlareJson.serializeValue( json, builder ); - - return ( success ? builder.ToString() : null ); - } - - - /// <summary> - /// On decoding, this function returns the position at which the parse failed (-1 = no error). - /// </summary> - /// <returns></returns> - public static bool lastDecodeSuccessful() - { - return ( FlareJson.lastErrorIndex == -1 ); - } - - - /// <summary> - /// On decoding, this function returns the position at which the parse failed (-1 = no error). - /// </summary> - /// <returns></returns> - public static int getLastErrorIndex() - { - return FlareJson.lastErrorIndex; - } - - - /// <summary> - /// If a decoding error occurred, this function returns a piece of the JSON string - /// at which the error took place. To ease debugging. - /// </summary> - /// <returns></returns> - public static string getLastErrorSnippet() - { - if( FlareJson.lastErrorIndex == -1 ) - { - return ""; - } - else - { - int startIndex = FlareJson.lastErrorIndex - 5; - int endIndex = FlareJson.lastErrorIndex + 15; - if( startIndex < 0 ) - startIndex = 0; - - if( endIndex >= FlareJson.lastDecode.Length ) - endIndex = FlareJson.lastDecode.Length - 1; - - return FlareJson.lastDecode.Substring( startIndex, endIndex - startIndex + 1 ); - } - } - - - #region Parsing - - protected static Hashtable parseObject( char[] json, ref int index ) - { - Hashtable table = new Hashtable(); - int token; - - // { - nextToken( json, ref index ); - - bool done = false; - while( !done ) - { - token = lookAhead( json, index ); - if( token == FlareJson.TOKEN_NONE ) - { - return null; - } - else if( token == FlareJson.TOKEN_COMMA ) - { - nextToken( json, ref index ); - } - else if( token == FlareJson.TOKEN_CURLY_CLOSE ) - { - nextToken( json, ref index ); - return table; - } - else - { - // name - string name = parseString( json, ref index ); - if( name == null ) - { - return null; - } - - // : - token = nextToken( json, ref index ); - if( token != FlareJson.TOKEN_COLON ) - return null; - - // value - bool success = true; - object value = parseValue( json, ref index, ref success ); - if( !success ) - return null; - - table[name] = value; - } - } - - return table; - } - - - protected static ArrayList parseArray( char[] json, ref int index ) - { - ArrayList array = new ArrayList(); - - // [ - nextToken( json, ref index ); - - bool done = false; - while( !done ) - { - int token = lookAhead( json, index ); - if( token == FlareJson.TOKEN_NONE ) - { - return null; - } - else if( token == FlareJson.TOKEN_COMMA ) - { - nextToken( json, ref index ); - } - else if( token == FlareJson.TOKEN_SQUARED_CLOSE ) - { - nextToken( json, ref index ); - break; - } - else - { - bool success = true; - object value = parseValue( json, ref index, ref success ); - if( !success ) - return null; - - array.Add( value ); - } - } - - return array; - } - - - protected static object parseValue( char[] json, ref int index, ref bool success ) - { - switch( lookAhead( json, index ) ) - { - case FlareJson.TOKEN_STRING: - return parseString( json, ref index ); - case FlareJson.TOKEN_NUMBER: - return parseNumber( json, ref index ); - case FlareJson.TOKEN_CURLY_OPEN: - return parseObject( json, ref index ); - case FlareJson.TOKEN_SQUARED_OPEN: - return parseArray( json, ref index ); - case FlareJson.TOKEN_TRUE: - nextToken( json, ref index ); - return Boolean.Parse( "TRUE" ); - case FlareJson.TOKEN_FALSE: - nextToken( json, ref index ); - return Boolean.Parse( "FALSE" ); - case FlareJson.TOKEN_NULL: - nextToken( json, ref index ); - return null; - case FlareJson.TOKEN_NONE: - break; - } - - success = false; - return null; - } - - - protected static string parseString( char[] json, ref int index ) - { - string s = ""; - char c; - - eatWhitespace( json, ref index ); - - // " - c = json[index++]; - - bool complete = false; - while( !complete ) - { - if( index == json.Length ) - break; - - c = json[index++]; - if( c == '"' ) - { - complete = true; - break; - } - else if( c == '\\' ) - { - if( index == json.Length ) - break; - - c = json[index++]; - if( c == '"' ) - { - s += '"'; - } - else if( c == '\\' ) - { - s += '\\'; - } - else if( c == '/' ) - { - s += '/'; - } - else if( c == 'b' ) - { - s += '\b'; - } - else if( c == 'f' ) - { - s += '\f'; - } - else if( c == 'n' ) - { - s += '\n'; - } - else if( c == 'r' ) - { - s += '\r'; - } - else if( c == 't' ) - { - s += '\t'; - } - else if( c == 'u' ) - { - int remainingLength = json.Length - index; - if( remainingLength >= 4 ) - { - char[] unicodeCharArray = new char[4]; - Array.Copy( json, index, unicodeCharArray, 0, 4 ); - - // Drop in the HTML markup for the unicode character - s += "&#x" + new string( unicodeCharArray ) + ";"; - - /* -uint codePoint = UInt32.Parse(new string(unicodeCharArray), NumberStyles.HexNumber); -// convert the integer codepoint to a unicode char and add to string -s += Char.ConvertFromUtf32((int)codePoint); -*/ - - // skip 4 chars - index += 4; - } - else - { - break; - } - - } - } - else - { - s += c; - } - - } - - if( !complete ) - return null; - - return s; - } - - - protected static double parseNumber( char[] json, ref int index ) - { - eatWhitespace( json, ref index ); - - int lastIndex = getLastIndexOfNumber( json, index ); - int charLength = ( lastIndex - index ) + 1; - char[] numberCharArray = new char[charLength]; - - Array.Copy( json, index, numberCharArray, 0, charLength ); - index = lastIndex + 1; - return Double.Parse( new string( numberCharArray ) ); // , CultureInfo.InvariantCulture); - } - - - protected static int getLastIndexOfNumber( char[] json, int index ) - { - int lastIndex; - for( lastIndex = index; lastIndex < json.Length; lastIndex++ ) - if( "0123456789+-.eE".IndexOf( json[lastIndex] ) == -1 ) - { - break; - } - return lastIndex - 1; - } - - - protected static void eatWhitespace( char[] json, ref int index ) - { - for( ; index < json.Length; index++ ) - if( " \t\n\r".IndexOf( json[index] ) == -1 ) - { - break; - } - } - - - protected static int lookAhead( char[] json, int index ) - { - int saveIndex = index; - return nextToken( json, ref saveIndex ); - } - - - protected static int nextToken( char[] json, ref int index ) - { - eatWhitespace( json, ref index ); - - if( index == json.Length ) - { - return FlareJson.TOKEN_NONE; - } - - char c = json[index]; - index++; - switch( c ) - { - case '{': - return FlareJson.TOKEN_CURLY_OPEN; - case '}': - return FlareJson.TOKEN_CURLY_CLOSE; - case '[': - return FlareJson.TOKEN_SQUARED_OPEN; - case ']': - return FlareJson.TOKEN_SQUARED_CLOSE; - case ',': - return FlareJson.TOKEN_COMMA; - case '"': - return FlareJson.TOKEN_STRING; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '-': - return FlareJson.TOKEN_NUMBER; - case ':': - return FlareJson.TOKEN_COLON; - } - index--; - - int remainingLength = json.Length - index; - - // false - if( remainingLength >= 5 ) - { - if( json[index] == 'f' && - json[index + 1] == 'a' && - json[index + 2] == 'l' && - json[index + 3] == 's' && - json[index + 4] == 'e' ) - { - index += 5; - return FlareJson.TOKEN_FALSE; - } - } - - // true - if( remainingLength >= 4 ) - { - if( json[index] == 't' && - json[index + 1] == 'r' && - json[index + 2] == 'u' && - json[index + 3] == 'e' ) - { - index += 4; - return FlareJson.TOKEN_TRUE; - } - } - - // null - if( remainingLength >= 4 ) - { - if( json[index] == 'n' && - json[index + 1] == 'u' && - json[index + 2] == 'l' && - json[index + 3] == 'l' ) - { - index += 4; - return FlareJson.TOKEN_NULL; - } - } - - return FlareJson.TOKEN_NONE; - } - - #endregion - - - #region Serialization - - protected static bool serializeObjectOrArray( object objectOrArray, StringBuilder builder ) - { - if( objectOrArray is Hashtable ) - { - return serializeObject( (Hashtable)objectOrArray, builder ); - } - else if( objectOrArray is ArrayList ) - { - return serializeArray( (ArrayList)objectOrArray, builder ); - } - else - { - return false; - } - } - - - protected static bool serializeObject( Hashtable anObject, StringBuilder builder ) - { - builder.Append( "{" ); - - IDictionaryEnumerator e = anObject.GetEnumerator(); - bool first = true; - while( e.MoveNext() ) - { - string key = e.Key.ToString(); - object value = e.Value; - - if( !first ) - { - builder.Append( ", " ); - } - - serializeString( key, builder ); - builder.Append( ":" ); - if( !serializeValue( value, builder ) ) - { - return false; - } - - first = false; - } - - builder.Append( "}" ); - return true; - } - - - protected static bool serializeDictionary( Dictionary<string,string> dict, StringBuilder builder ) - { - builder.Append( "{" ); - - bool first = true; - foreach( var kv in dict ) - { - if( !first ) - builder.Append( ", " ); - - serializeString( kv.Key, builder ); - builder.Append( ":" ); - serializeString( kv.Value, builder ); - - first = false; - } - - builder.Append( "}" ); - return true; - } - - - protected static bool serializeArray( ArrayList anArray, StringBuilder builder ) - { - builder.Append( "[" ); - - bool first = true; - for( int i = 0; i < anArray.Count; i++ ) - { - object value = anArray[i]; - - if( !first ) - { - builder.Append( ", " ); - } - - if( !serializeValue( value, builder ) ) - { - return false; - } - - first = false; - } - - builder.Append( "]" ); - return true; - } - - - protected static bool serializeValue( object value, StringBuilder builder ) - { - // Type t = value.GetType(); - // Debug.Log("type: " + t.ToString() + " isArray: " + t.IsArray); - - if( value == null ) - { - builder.Append( "null" ); - } - else if( value.GetType().IsArray ) - { - serializeArray( new ArrayList( (ICollection)value ), builder ); - } - else if( value is string ) - { - serializeString( (string)value, builder ); - } - else if( value is Char ) - { - serializeString( Convert.ToString( (char)value ), builder ); - } - else if( value is Hashtable ) - { - serializeObject( (Hashtable)value, builder ); - } - else if( value is Dictionary<string,string> ) - { - serializeDictionary( (Dictionary<string,string>)value, builder ); - } - else if( value is ArrayList ) - { - serializeArray( (ArrayList)value, builder ); - } - else if( ( value is Boolean ) && ( (Boolean)value == true ) ) - { - builder.Append( "true" ); - } - else if( ( value is Boolean ) && ( (Boolean)value == false ) ) - { - builder.Append( "false" ); - } - else if( value.GetType().IsPrimitive ) - { - serializeNumber( Convert.ToDouble( value ), builder ); - } - else - { - return false; - } - - return true; - } - - - protected static void serializeString( string aString, StringBuilder builder ) - { - builder.Append( "\"" ); - - char[] charArray = aString.ToCharArray(); - for( int i = 0; i < charArray.Length; i++ ) - { - char c = charArray[i]; - if( c == '"' ) - { - builder.Append( "\\\"" ); - } - else if( c == '\\' ) - { - builder.Append( "\\\\" ); - } - else if( c == '\b' ) - { - builder.Append( "\\b" ); - } - else if( c == '\f' ) - { - builder.Append( "\\f" ); - } - else if( c == '\n' ) - { - builder.Append( "\\n" ); - } - else if( c == '\r' ) - { - builder.Append( "\\r" ); - } - else if( c == '\t' ) - { - builder.Append( "\\t" ); - } - else - { - int codepoint = Convert.ToInt32( c ); - if( ( codepoint >= 32 ) && ( codepoint <= 126 ) ) - { - builder.Append( c ); - } - else - { - builder.Append( "\\u" + Convert.ToString( codepoint, 16 ).PadLeft( 4, '0' ) ); - } - } - } - - builder.Append( "\"" ); - } - - - protected static void serializeNumber( double number, StringBuilder builder ) - { - builder.Append( Convert.ToString( number ) ); // , CultureInfo.InvariantCulture)); - } - - #endregion - -} |