void OnEnable()
    {
        Boyancy boyancy = target as Boyancy;

        presetPath = Application.dataPath + "/Ocean/Editor/_OceanPresets";

        rrig = boyancy.GetComponent <Rigidbody>();
        if (rrig == null)
        {
            Debug.Log("Object requires a Rigidbody");
        }

        presetPath = Application.dataPath + "/Ocean/Editor/_OceanPresets";

        col = boyancy.GetComponent <BoxCollider>();
        if (col == null)
        {
            Debug.Log("Object requires a Box Collider");
        }
    }
    public override void OnInspectorGUI()
    {
        Boyancy boyancy = target as Boyancy;

        DrawSeparator();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Render Queue", GUILayout.MaxWidth(130));
        boyancy.renderQueue = EditorGUILayout.IntField(boyancy.renderQueue);
        GUILayout.Space(175);
        if (GUILayout.Button("?", GUILayout.MaxWidth(20)))
        {
            EditorUtility.DisplayDialog("Material Render Queue", "Set the object's material render queue to something that suits you. Useful for not showing shore lines under boat.", "OK");
        }

        EditorGUILayout.EndHorizontal();
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("More Accurate", GUILayout.MaxWidth(130));
        boyancy.moreAccurate = EditorGUILayout.Toggle(boyancy.moreAccurate);
        GUILayout.Space(175);
        if (GUILayout.Button("?", GUILayout.MaxWidth(20)))
        {
            EditorUtility.DisplayDialog("More accurate Calculation", "If a more accurate function of the Water height function should be used.\n\nIt is however 2.5x times slower.", "OK");
        }
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Use FixedUpdate", GUILayout.MaxWidth(130));
        boyancy.useFixedUpdate = EditorGUILayout.Toggle(boyancy.useFixedUpdate);
        GUILayout.Space(175);
        if (GUILayout.Button("?", GUILayout.MaxWidth(20)))
        {
            EditorUtility.DisplayDialog("Use FixedUpdate()", "If this object should be simulated in the FixedUpdate function. Can be better timed but it is more accurate if unchecked.", "OK");
        }
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Buoyancy");
        GUILayout.Space(-100);
        boyancy.magnitude = EditorGUILayout.Slider(boyancy.magnitude, 0, 20);
        if (GUILayout.Button("?", GUILayout.MaxWidth(20)))
        {
            EditorUtility.DisplayDialog("Buoyancy magnitude", "The amount of the buoyant forces applied to this vessel.", "OK");
        }
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Y offset");
        GUILayout.Space(-100);
        boyancy.ypos = EditorGUILayout.Slider(boyancy.ypos, -30f, 30f);
        if (GUILayout.Button("?", GUILayout.MaxWidth(20)))
        {
            EditorUtility.DisplayDialog("Y offset", "How many units the boat will float above the calculated position.", "OK");
        }
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Center of Mass");
        GUILayout.Space(-100);
        boyancy.CenterOfMassOffset = EditorGUILayout.Slider(boyancy.CenterOfMassOffset, -20f, 20f);
        if (GUILayout.Button("?", GUILayout.MaxWidth(20)))
        {
            EditorUtility.DisplayDialog("Center of Mass offset", "Offsets the height of the center of mass of the rigidbody.", "OK");
        }
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Damp Coeff");
        GUILayout.Space(-100);
        boyancy.dampCoeff = EditorGUILayout.Slider(boyancy.dampCoeff, 0f, 2f);
        if (GUILayout.Button("?", GUILayout.MaxWidth(20)))
        {
            EditorUtility.DisplayDialog("Damp Coefficient", "The damp coefficient of the buoyancy.", "OK");
        }
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Slices X");
        GUILayout.Space(-100);
        boyancy.SlicesX = (int)EditorGUILayout.Slider(boyancy.SlicesX, 2, 20);
        if (GUILayout.Button("?", GUILayout.MaxWidth(20)))
        {
            EditorUtility.DisplayDialog("Slices X dimension", "The slicing of the bounds of the box collider in the X dimension.", "OK");
        }
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Slices Z");
        GUILayout.Space(-100);
        boyancy.SlicesZ = (int)EditorGUILayout.Slider(boyancy.SlicesZ, 2, 20);
        if (GUILayout.Button("?", GUILayout.MaxWidth(20)))
        {
            EditorUtility.DisplayDialog("Slices Z dimension", "The slicing of the bounds of the box collider in the Z dimension.", "OK");
        }
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Interpolation");
        GUILayout.Space(-100);
        boyancy.interpolation = (int)EditorGUILayout.Slider(boyancy.interpolation, 0, 20);
        if (GUILayout.Button("?", GUILayout.MaxWidth(20)))
        {
            EditorUtility.DisplayDialog("Buoyancy Interpolation", "How many cycles will be used to average/interpolate the final buoynacy.\n\nKeep this as small as you can since it adds overhead.", "OK");
        }
        EditorGUILayout.EndHorizontal();

        GUILayout.Space(5);
        DrawSeparator();
        GUILayout.Space(5);

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Choppyness influence", GUILayout.MaxWidth(130));
        boyancy.ChoppynessAffectsPosition = EditorGUILayout.Toggle(boyancy.ChoppynessAffectsPosition);
        GUILayout.Space(175);
        EditorGUILayout.LabelField("ifIsVisible", GUILayout.MaxWidth(60));
        boyancy.cvisible = EditorGUILayout.Toggle(boyancy.cvisible);
        if (GUILayout.Button("?", GUILayout.MaxWidth(20)))
        {
            EditorUtility.DisplayDialog("Choppyness affects boat", "If the choppyness of the waves affect the boat's position and rotation.\n\nThis will be skipped if the boat has reached a high speed.", "OK");
        }
        EditorGUILayout.EndHorizontal();

        GUILayout.Space(5);

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Choppyness factor", GUILayout.MinWidth(100));
        GUILayout.Space(-80);
        boyancy.ChoppynessFactor = EditorGUILayout.Slider(boyancy.ChoppynessFactor, 0, 10f);
        if (GUILayout.Button("?", GUILayout.MaxWidth(20)))
        {
            EditorUtility.DisplayDialog("Choppyness Factor", "The amount of choppyness that will influence the boat.", "OK");
        }
        EditorGUILayout.EndHorizontal();

        GUILayout.Space(5);

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Wind affects boat", GUILayout.MaxWidth(130));
        boyancy.WindAffectsPosition = EditorGUILayout.Toggle(boyancy.WindAffectsPosition);
        GUILayout.Space(175);
        EditorGUILayout.LabelField("ifIsVisible", GUILayout.MaxWidth(60));
        boyancy.wvisible = EditorGUILayout.Toggle(boyancy.wvisible);
        if (GUILayout.Button("?", GUILayout.MaxWidth(20)))
        {
            EditorUtility.DisplayDialog("Wind affects boat", "If the Ocean wind affect the boat's position and rotation.\n\nThis will be skipped if the boat has reached a high speed.\n\n" +
                                        "If ifIsVisible is checked the calculations will take place only if the objects renderer is visible.", "OK");
        }
        EditorGUILayout.EndHorizontal();

        GUILayout.Space(5);

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Wind factor", GUILayout.MinWidth(100));
        GUILayout.Space(-80);
        boyancy.WindFactor = EditorGUILayout.Slider(boyancy.WindFactor, 0, 5f);
        if (GUILayout.Button("?", GUILayout.MaxWidth(20)))
        {
            EditorUtility.DisplayDialog("Wind Factor", "The amount of wind that will influence the boat.", "OK");
        }
        EditorGUILayout.EndHorizontal();

        GUILayout.Space(5);

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Slope sliding", GUILayout.MaxWidth(130));
        boyancy.xAngleAddsSliding = EditorGUILayout.Toggle(boyancy.xAngleAddsSliding);
        GUILayout.Space(175);
        EditorGUILayout.LabelField("ifIsVisible", GUILayout.MaxWidth(60));
        boyancy.svisible = EditorGUILayout.Toggle(boyancy.svisible);
        if (GUILayout.Button("?", GUILayout.MaxWidth(20)))
        {
            EditorUtility.DisplayDialog("Slope sliding", "If the boat faces stormy waves, sliding forces will be applied to it.\n\n" +
                                        "If ifIsVisible is checked the calculations will take place only if the objects renderer is visible.", "OK");
        }
        EditorGUILayout.EndHorizontal();

        GUILayout.Space(5);

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Slide factor", GUILayout.MinWidth(100));
        GUILayout.Space(-80);
        boyancy.slideFactor = EditorGUILayout.Slider(boyancy.slideFactor, 0, 10f);
        if (GUILayout.Button("?", GUILayout.MaxWidth(20)))
        {
            EditorUtility.DisplayDialog("Slope sliding Factor", "The amount of sliding force applied to the boat.", "OK");
        }
        EditorGUILayout.EndHorizontal();

        GUILayout.Space(10);

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Visible Renderer", GUILayout.MinWidth(130));
        GUILayout.Space(-150);
        boyancy._renderer = (Renderer)EditorGUILayout.ObjectField(boyancy._renderer, typeof(Renderer), true, GUILayout.MinWidth(120));
        if (GUILayout.Button("?", GUILayout.MaxWidth(20)))
        {
            EditorUtility.DisplayDialog("Renderer", "The object's renderer to make visibilty checks against it.", "OK");
        }
        EditorGUILayout.EndHorizontal();

        DrawSeparator();

        GUILayout.Space(8);

        EditorGUILayout.BeginHorizontal();
        if (GUILayout.Button("Save preset"))
        {
            savePreset(boyancy);
        }
        if (GUILayout.Button("Load preset"))
        {
            loadPreset(boyancy);
        }

        EditorGUILayout.EndHorizontal();

        GUILayout.Space(8);

        DrawSeparator();

        if (GUI.changed)
        {
            EditorUtility.SetDirty(boyancy);
        }
    }
    //loads a buoyancy preset (and boat controller settings if available)
    public static bool loadPreset(Boyancy boyancy)
    {
        string preset = EditorUtility.OpenFilePanel("Load Ocean preset", presetPath, "buoyancy");

        if (!Application.isPlaying)
        {
            if (preset != null)
            {
                if (preset.Length > 0)
                {
                    if (File.Exists(preset))
                    {
                        using (BinaryReader br = new BinaryReader(File.Open(preset, FileMode.Open))){
                            bool hasrigidbody = false, hascollider = false;

                            if (br.BaseStream.Position != br.BaseStream.Length)
                            {
                                hasrigidbody = br.ReadBoolean();
                            }

                            if (hasrigidbody)
                            {
                                float mass = 1, drag = 1, andrag = 1;
                                bool  usegrav = true;
                                if (br.BaseStream.Position != br.BaseStream.Length)
                                {
                                    mass = br.ReadSingle();
                                }
                                if (br.BaseStream.Position != br.BaseStream.Length)
                                {
                                    drag = br.ReadSingle();
                                }
                                if (br.BaseStream.Position != br.BaseStream.Length)
                                {
                                    andrag = br.ReadSingle();
                                }
                                if (br.BaseStream.Position != br.BaseStream.Length)
                                {
                                    usegrav = br.ReadBoolean();
                                }
                                if (rrig != null)
                                {
                                    rrig.mass = mass; rrig.drag = drag; rrig.angularDrag = andrag; rrig.useGravity = usegrav;
                                }
                                else
                                {
                                    Debug.Log("No rigid body found");
                                }
                            }

                            if (br.BaseStream.Position != br.BaseStream.Length)
                            {
                                hascollider = br.ReadBoolean();
                            }

                            if (hascollider)
                            {
                                float x = 0, y = 0, z = 0, sx = 1, sy = 1, sz = 1;
                                if (br.BaseStream.Position != br.BaseStream.Length)
                                {
                                    x = br.ReadSingle();
                                }
                                if (br.BaseStream.Position != br.BaseStream.Length)
                                {
                                    y = br.ReadSingle();
                                }
                                if (br.BaseStream.Position != br.BaseStream.Length)
                                {
                                    z = br.ReadSingle();
                                }
                                if (br.BaseStream.Position != br.BaseStream.Length)
                                {
                                    sx = br.ReadSingle();
                                }
                                if (br.BaseStream.Position != br.BaseStream.Length)
                                {
                                    sy = br.ReadSingle();
                                }
                                if (br.BaseStream.Position != br.BaseStream.Length)
                                {
                                    sz = br.ReadSingle();
                                }

                                if (col != null)
                                {
                                    col.center = new Vector3(x, y, z);
                                    col.size   = new Vector3(sx / boyancy.transform.localScale.x, sy / boyancy.transform.localScale.y, sz / boyancy.transform.localScale.z);
                                }
                                else
                                {
                                    Debug.Log("No Box Collider found");
                                }
                            }

                            if (br.BaseStream.Position != br.BaseStream.Length)
                            {
                                boyancy.magnitude = br.ReadSingle();
                            }
                            if (br.BaseStream.Position != br.BaseStream.Length)
                            {
                                boyancy.ypos = br.ReadSingle();
                            }
                            if (br.BaseStream.Position != br.BaseStream.Length)
                            {
                                boyancy.CenterOfMassOffset = br.ReadSingle();
                            }
                            if (br.BaseStream.Position != br.BaseStream.Length)
                            {
                                boyancy.dampCoeff = br.ReadSingle();
                            }
                            if (br.BaseStream.Position != br.BaseStream.Length)
                            {
                                boyancy.SlicesX = br.ReadInt32();
                            }
                            if (br.BaseStream.Position != br.BaseStream.Length)
                            {
                                boyancy.SlicesZ = br.ReadInt32();
                            }
                            if (br.BaseStream.Position != br.BaseStream.Length)
                            {
                                boyancy.interpolation = br.ReadInt32();
                            }
                            if (br.BaseStream.Position != br.BaseStream.Length)
                            {
                                boyancy.ChoppynessAffectsPosition = br.ReadBoolean();
                            }
                            if (br.BaseStream.Position != br.BaseStream.Length)
                            {
                                boyancy.cvisible = br.ReadBoolean();
                            }
                            if (br.BaseStream.Position != br.BaseStream.Length)
                            {
                                boyancy.ChoppynessFactor = br.ReadSingle();
                            }
                            if (br.BaseStream.Position != br.BaseStream.Length)
                            {
                                boyancy.WindAffectsPosition = br.ReadBoolean();
                            }
                            if (br.BaseStream.Position != br.BaseStream.Length)
                            {
                                boyancy.wvisible = br.ReadBoolean();
                            }
                            if (br.BaseStream.Position != br.BaseStream.Length)
                            {
                                boyancy.WindFactor = br.ReadSingle();
                            }
                            if (br.BaseStream.Position != br.BaseStream.Length)
                            {
                                boyancy.xAngleAddsSliding = br.ReadBoolean();
                            }
                            if (br.BaseStream.Position != br.BaseStream.Length)
                            {
                                boyancy.svisible = br.ReadBoolean();
                            }
                            if (br.BaseStream.Position != br.BaseStream.Length)
                            {
                                boyancy.slideFactor = br.ReadSingle();
                            }
                            if (br.BaseStream.Position != br.BaseStream.Length)
                            {
                                boyancy.moreAccurate = br.ReadBoolean();
                            }
                            if (br.BaseStream.Position != br.BaseStream.Length)
                            {
                                boyancy.useFixedUpdate = br.ReadBoolean();
                            }
                            bool hasBoatController = false;
                            if (br.BaseStream.Position != br.BaseStream.Length)
                            {
                                hasBoatController = br.ReadBoolean();
                                if (hasBoatController)
                                {
                                    float res = 0;
                                    var   bc  = boyancy.GetComponent <BoatController>();
                                    res = br.ReadSingle(); if (bc)
                                    {
                                        bc.m_FinalSpeed = res;
                                    }
                                    res = br.ReadSingle(); if (bc)
                                    {
                                        bc.m_accelerationTorqueFactor = res;
                                    }
                                    res = br.ReadSingle(); if (bc)
                                    {
                                        bc.m_InertiaFactor = res;
                                    }
                                    res = br.ReadSingle(); if (bc)
                                    {
                                        bc.m_turningFactor = res;
                                    }
                                    res = br.ReadSingle(); if (bc)
                                    {
                                        bc.m_turningTorqueFactor = res;
                                    }
                                }
                            }

                            if (br.BaseStream.Position != br.BaseStream.Length)
                            {
                                boyancy.renderQueue = br.ReadInt32();
                            }

                            //try to asign a renderer for visibility checks if there is none assigned in the boyancy inspector.
                            if (boyancy._renderer == null)
                            {
                                boyancy._renderer = boyancy.GetComponent <Renderer>();
                                if (!boyancy._renderer)
                                {
                                    boyancy._renderer = boyancy.GetComponentInChildren <Renderer>();
                                }
                            }

                            EditorUtility.SetDirty(boyancy);
                            if (hasBoatController)
                            {
                                var bc = boyancy.GetComponent <BoatController>();
                                EditorUtility.SetDirty(bc);
                            }

                            return(true);
                        }
                    }
                    else
                    {
                        Debug.Log(preset + " does not exist..."); return(false);
                    }
                }
            }
        }
        else
        {
            Debug.Log("Cannot load this on runtime");
        }

        return(false);
    }
    //saves a buoyancy preset
    public static void savePreset(Boyancy boyancy)
    {
        if (!Directory.Exists(presetPath))
        {
            Directory.CreateDirectory(presetPath);
        }
        string preset = EditorUtility.SaveFilePanel("Save buoyancy preset", presetPath, "", "buoyancy");

        if (preset != null)
        {
            if (preset.Length > 0)
            {
                using (BinaryWriter swr = new BinaryWriter(File.Open(preset, FileMode.Create))) {
                    //rigidbody parameters
                    if (rrig != null)
                    {
                        swr.Write((byte)1);                        //has Rigidbody
                        swr.Write((float)rrig.mass);               //float
                        swr.Write((float)rrig.drag);               //float
                        swr.Write((float)rrig.angularDrag);        //float
                        swr.Write((bool)rrig.useGravity);          //bool
                    }

                    //box collider parameters
                    if (col != null)
                    {
                        swr.Write((byte)1);                                     //has Boxcollider
                        swr.Write(col.center.x);                                //float
                        swr.Write(col.center.y);                                //float
                        swr.Write(col.center.z);                                //float
                        swr.Write(col.size.x * boyancy.transform.localScale.x); //float
                        swr.Write(col.size.y * boyancy.transform.localScale.y); //float
                        swr.Write(col.size.z * boyancy.transform.localScale.z); //float
                    }

                    //buoyancy parameters
                    swr.Write(boyancy.magnitude);                 //float
                    swr.Write(boyancy.ypos);                      //float
                    swr.Write(boyancy.CenterOfMassOffset);        //float
                    swr.Write(boyancy.dampCoeff);                 //float
                    swr.Write(boyancy.SlicesX);                   //int
                    swr.Write(boyancy.SlicesZ);                   //int
                    swr.Write(boyancy.interpolation);             //int
                    swr.Write(boyancy.ChoppynessAffectsPosition); //bool
                    swr.Write(boyancy.cvisible);                  //bool
                    swr.Write(boyancy.ChoppynessFactor);          //float
                    swr.Write(boyancy.WindAffectsPosition);       //bool
                    swr.Write(boyancy.wvisible);                  //bool
                    swr.Write(boyancy.WindFactor);                //float
                    swr.Write(boyancy.xAngleAddsSliding);         //bool
                    swr.Write(boyancy.svisible);                  //bool
                    swr.Write(boyancy.slideFactor);               //float
                    swr.Write(boyancy.moreAccurate);              //bool
                    swr.Write(boyancy.useFixedUpdate);            //bool

                    var bc = boyancy.GetComponent <BoatController>();

                    //If the object has a boat controller attached write the properties.
                    //This is useful, because if you change the buoynacy settings the speed
                    //settings of the boat controller need tweaking again.
                    if (bc != null)
                    {
                        swr.Write(true);                          //bool
                        swr.Write(bc.m_FinalSpeed);               //float
                        swr.Write(bc.m_accelerationTorqueFactor); //float
                        swr.Write(bc.m_InertiaFactor);            //float
                        swr.Write(bc.m_turningFactor);            //float
                        swr.Write(bc.m_turningTorqueFactor);      //float
                    }
                    else
                    {
                        swr.Write(false);                        //bool
                    }

                    swr.Write(boyancy.renderQueue);                    //int
                }
            }
        }
    }
	//loads a buoyancy preset (and boat controller settings if available)
	public static bool loadPreset(Boyancy boyancy) {

		string preset = EditorUtility.OpenFilePanel("Load Ocean preset",presetPath,"buoyancy");
		if(!Application.isPlaying) {
			if (preset != null) {
				if (preset.Length > 0) {

					if(File.Exists(preset)) {
						using (BinaryReader br = new BinaryReader(File.Open(preset, FileMode.Open))){

							bool hasrigidbody = false, hascollider = false;

							if(br.BaseStream.Position != br.BaseStream.Length) hasrigidbody = br.ReadBoolean();

							if(hasrigidbody) {
								float mass=1, drag=1, andrag=1;
								bool usegrav=true;
								if(br.BaseStream.Position != br.BaseStream.Length) mass = br.ReadSingle();
								if(br.BaseStream.Position != br.BaseStream.Length) drag = br.ReadSingle();
								if(br.BaseStream.Position != br.BaseStream.Length) andrag = br.ReadSingle();
								if(br.BaseStream.Position != br.BaseStream.Length) usegrav = br.ReadBoolean();
								if(rrig != null) {
									rrig.mass = mass; rrig.drag = drag; rrig.angularDrag = andrag; rrig.useGravity = usegrav;
								} else { Debug.Log("No rigid body found"); }
							}

							if(br.BaseStream.Position != br.BaseStream.Length) hascollider = br.ReadBoolean();

							if(hascollider) {
								float x=0, y=0, z=0, sx=1, sy=1, sz=1;
								if(br.BaseStream.Position != br.BaseStream.Length) x = br.ReadSingle();
								if(br.BaseStream.Position != br.BaseStream.Length) y = br.ReadSingle();
								if(br.BaseStream.Position != br.BaseStream.Length) z = br.ReadSingle();
								if(br.BaseStream.Position != br.BaseStream.Length) sx = br.ReadSingle();
								if(br.BaseStream.Position != br.BaseStream.Length) sy = br.ReadSingle();
								if(br.BaseStream.Position != br.BaseStream.Length) sz = br.ReadSingle();

								if(col != null) {
									
									col.center = new Vector3(x, y, z);
									col.size = new Vector3(sx/boyancy.transform.localScale.x, sy/boyancy.transform.localScale.y, sz/boyancy.transform.localScale.z);

								} else { Debug.Log("No Box Collider found"); }
							}

							if(br.BaseStream.Position != br.BaseStream.Length) boyancy.magnitude = br.ReadSingle();
							if(br.BaseStream.Position != br.BaseStream.Length) boyancy.ypos = br.ReadSingle();
							if(br.BaseStream.Position != br.BaseStream.Length) boyancy.CenterOfMassOffset = br.ReadSingle();
							if(br.BaseStream.Position != br.BaseStream.Length) boyancy.dampCoeff = br.ReadSingle();
							if(br.BaseStream.Position != br.BaseStream.Length) boyancy.SlicesX = br.ReadInt32();
							if(br.BaseStream.Position != br.BaseStream.Length) boyancy.SlicesZ = br.ReadInt32();
							if(br.BaseStream.Position != br.BaseStream.Length) boyancy.interpolation = br.ReadInt32();
							if(br.BaseStream.Position != br.BaseStream.Length) boyancy.ChoppynessAffectsPosition = br.ReadBoolean();
							if(br.BaseStream.Position != br.BaseStream.Length) boyancy.cvisible = br.ReadBoolean();
							if(br.BaseStream.Position != br.BaseStream.Length) boyancy.ChoppynessFactor = br.ReadSingle();
							if(br.BaseStream.Position != br.BaseStream.Length) boyancy.WindAffectsPosition = br.ReadBoolean();
							if(br.BaseStream.Position != br.BaseStream.Length) boyancy.wvisible = br.ReadBoolean();
							if(br.BaseStream.Position != br.BaseStream.Length) boyancy.WindFactor = br.ReadSingle();
							if(br.BaseStream.Position != br.BaseStream.Length) boyancy.xAngleAddsSliding = br.ReadBoolean();
							if(br.BaseStream.Position != br.BaseStream.Length) boyancy.svisible = br.ReadBoolean();
							if(br.BaseStream.Position != br.BaseStream.Length) boyancy.slideFactor = br.ReadSingle();
							if(br.BaseStream.Position != br.BaseStream.Length) boyancy.moreAccurate = br.ReadBoolean();
							if(br.BaseStream.Position != br.BaseStream.Length) boyancy.useFixedUpdate = br.ReadBoolean();
							bool hasBoatController = false;
							if(br.BaseStream.Position != br.BaseStream.Length) {
								hasBoatController = br.ReadBoolean();
								if(hasBoatController) {
									float res=0;
									var bc = boyancy.GetComponent<BoatController>();
									res=br.ReadSingle(); if(bc) bc.m_FinalSpeed = res;
									res=br.ReadSingle(); if(bc) bc.m_accelerationTorqueFactor = res;
									res=br.ReadSingle(); if(bc) bc.m_InertiaFactor = res;
									res=br.ReadSingle(); if(bc) bc.m_turningFactor = res;
									res=br.ReadSingle(); if(bc) bc.m_turningTorqueFactor= res;
								}
							}
							
							if(br.BaseStream.Position != br.BaseStream.Length) boyancy.renderQueue = br.ReadInt32();

							//try to asign a renderer for visibility checks if there is none assigned in the boyancy inspector.
							if(boyancy._renderer == null) {
								boyancy._renderer = boyancy.GetComponent<Renderer>();
								if(!boyancy._renderer) {
									boyancy._renderer = boyancy.GetComponentInChildren<Renderer>();
								}
							}

							EditorUtility.SetDirty(boyancy);
							if(hasBoatController){
								var bc = boyancy.GetComponent<BoatController>();
								EditorUtility.SetDirty(bc);
							}

							return true;
							
						}
					} else {Debug.Log(preset+" does not exist..."); return false;}

				}
			} 
		} else { Debug.Log("Cannot load this on runtime"); }

		return false;
	}
	//saves a buoyancy preset
	public static void savePreset(Boyancy boyancy) {
		if (!Directory.Exists(presetPath)) Directory.CreateDirectory(presetPath);
		string preset = EditorUtility.SaveFilePanel("Save buoyancy preset", presetPath,"","buoyancy");

		if (preset != null) {
			if (preset.Length > 0) {
				using (BinaryWriter swr = new BinaryWriter(File.Open(preset, FileMode.Create))) {
					//rigidbody parameters
					if(rrig != null) {
						swr.Write((byte)1);//has Rigidbody
						swr.Write((float)rrig.mass);//float
						swr.Write((float)rrig.drag);//float
						swr.Write((float)rrig.angularDrag);//float
						swr.Write((bool)rrig.useGravity);//bool
					}

					//box collider parameters
					if(col != null) {
						swr.Write((byte)1);//has Boxcollider
						swr.Write(col.center.x);//float
						swr.Write(col.center.y);//float
						swr.Write(col.center.z);//float
						swr.Write(col.size.x * boyancy.transform.localScale.x);//float
						swr.Write(col.size.y * boyancy.transform.localScale.y);//float
						swr.Write(col.size.z * boyancy.transform.localScale.z);//float
					}

					//buoyancy parameters
					swr.Write(boyancy.magnitude);//float
					swr.Write(boyancy.ypos);//float
					swr.Write(boyancy.CenterOfMassOffset);//float
					swr.Write(boyancy.dampCoeff);//float
					swr.Write(boyancy.SlicesX);//int
					swr.Write(boyancy.SlicesZ);//int
					swr.Write(boyancy.interpolation);//int
					swr.Write(boyancy.ChoppynessAffectsPosition);//bool
					swr.Write(boyancy.cvisible);//bool
					swr.Write(boyancy.ChoppynessFactor);//float
					swr.Write(boyancy.WindAffectsPosition);//bool
					swr.Write(boyancy.wvisible);//bool
					swr.Write(boyancy.WindFactor);//float
					swr.Write(boyancy.xAngleAddsSliding);//bool
					swr.Write(boyancy.svisible);//bool
					swr.Write(boyancy.slideFactor);//float
					swr.Write(boyancy.moreAccurate);//bool
					swr.Write(boyancy.useFixedUpdate);//bool

					var bc = boyancy.GetComponent<BoatController>();

					//If the object has a boat controller attached write the properties.
					//This is useful, because if you change the buoynacy settings the speed
					//settings of the boat controller need tweaking again.
					if(bc!= null) {
						swr.Write(true);//bool
						swr.Write(bc.m_FinalSpeed);//float
						swr.Write(bc.m_accelerationTorqueFactor);//float
						swr.Write(bc.m_InertiaFactor);//float
						swr.Write(bc.m_turningFactor);//float
						swr.Write(bc.m_turningTorqueFactor);//float
					} else {
						swr.Write(false);//bool
					}

					swr.Write(boyancy.renderQueue);//int
				}

			}
		}
	}