#region MIT License
/*
* Copyright (c) 2009 University of Jyväskylä, Department of Mathematical
* Information Technology.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#endregion
/*
* Authors: Tero Jäntti, Tomi Karppinen, Janne Nikkanen.
*/
using System;
using Physics2DDotNet;
using Physics2DDotNet.Shapes;
namespace Jypeli
{
public partial class PhysicsObject
{
private const double DefaultMass = 1.0;
private bool _momentOfInertiaSet = false;
///
/// Jos false, olio ei voi pyöriä.
///
public bool CanRotate
{
get { return !double.IsPositiveInfinity( MomentOfInertia ); }
set
{
if ( !value )
{
MomentOfInertia = double.PositiveInfinity;
_momentOfInertiaSet = true;
}
else
{
SetMassAndInertia( this.Mass );
_momentOfInertiaSet = false;
}
}
}
///
/// Olion massa. Mitä suurempi massa, sitä suurempi voima tarvitaan olion liikuttamiseksi.
///
///
/// Massan asettaminen muuttaa myös hitausmomenttia (MomentOfInertia).
///
public double Mass
{
get { return Body.Mass.Mass; }
set
{
// We change the moment of inertia as well. If the mass is changed from
// 1.0 to 100000.0 for example, it would look funny if a heavy object would
// spin wildly from a small touch.
if ( _momentOfInertiaSet )
{
// The moment of inertia has been set manually,
// let's keep it that way and just set the mass.
Body.Mass.Mass = value;
}
else
{
SetMassAndInertia( value );
}
}
}
///
/// Olion hitausmomentti. Mitä suurempi hitausmomentti, sitä enemmän vääntöä tarvitaan
/// olion pyörittämiseksi.
///
public double MomentOfInertia
{
get { return Body.Mass.MomentOfInertia; }
set
{
Body.Mass.MomentOfInertia = value;
_momentOfInertiaSet = true;
}
}
///
/// Tekee suorakulmaisen kappaleen, joka on staattinen (eli pysyy paikallaan).
///
/// Kappaleen leveys
/// Kappaleen korkeus
/// Fysiikkaolio
public static PhysicsObject CreateStaticObject( double width, double height )
{
PhysicsObject o = new PhysicsObject( width, height );
o.MakeStatic();
return o;
}
///
/// Tekee suorakulmaisen kappaleen, joka on staattinen (eli pysyy paikallaan).
/// Kappaleen koko ja ulkonäkö ladataan parametrina annetusta kuvasta.
///
/// Kappaleen leveys
/// Kappaleen korkeus
/// Fysiikkaolio
public static PhysicsObject CreateStaticObject( Image image )
{
PhysicsObject o = new PhysicsObject( image );
o.MakeStatic();
return o;
}
///
/// Tekee vapaamuotoisen kappaleen, joka on staattinen (eli pysyy paikallaan).
///
/// Kappaleen leveys
/// Kappaleen korkeus
/// Kappaleen muoto
/// Fysiikkaolio
public static PhysicsObject CreateStaticObject( double width, double height, Shape shape )
{
PhysicsObject o = new PhysicsObject( width, height, shape );
o.MakeStatic();
return o;
}
[Obsolete( "Use CollisionShapeParameters or the PhysicsTemplates class." )]
internal static PhysicsObject CreateStaticObject( double width, double height, Shape shape, CollisionShapeQuality quality )
{
PhysicsObject o = new PhysicsObject( width, height, shape );
o.MakeStatic();
return o;
}
public static PhysicsObject CreateStaticObject( double width, double height, Shape shape, CollisionShapeParameters parameters )
{
PhysicsObject o = new PhysicsObject( width, height, shape, parameters );
o.MakeStatic();
return o;
}
[Obsolete( "Use function with CollisionShapeParameters" )]
internal static PhysicsObject CreateStaticObject( double width, double height, Shape shape, double maxDistanceBetweenVertices, double gridSpacing )
{
PhysicsObject o = new PhysicsObject( width, height, shape, maxDistanceBetweenVertices, gridSpacing );
o.MakeStatic();
return o;
}
internal static PhysicsObject CreateStaticObject( double width, double height, Shape shape, IShape physicsShape )
{
PhysicsObject o = new PhysicsObject( width, height, shape, physicsShape );
o.MakeStatic();
return o;
}
///
/// Tekee oliosta staattisen. Staattinen olio ei liiku muiden olioiden törmäyksistä,
/// vaan ainoastaan muuttamalla suoraan sen paikkaa tai nopeutta.
///
public void MakeStatic()
{
Mass = double.PositiveInfinity;
CanRotate = false;
IgnoresGravity = true;
}
///
/// Olion hidastuminen. Hidastaa olion vauhtia, vaikka se ei
/// osuisi mihinkään. Vähän kuin väliaineen (esim. ilman tai veden)
/// vastus. Oletusarvo on 1.0, jolloin hidastumista ei ole. Mitä
/// pienempi arvo, sitä enemmän kappale hidastuu.
///
/// Yleensä kannattaa käyttää arvoja, jotka ovat lähellä ykköstä,
/// esim. 0.95.
///
public double LinearDamping
{
get { return Body.LinearDamping; }
set { Body.LinearDamping = value; }
}
///
/// Olion pyörimisen hidastuminen.
///
///
///
public double AngularDamping
{
get { return Body.AngularDamping; }
set { Body.AngularDamping = value; }
}
///
/// This updates the mass and momentOfInertia based on the new mass.
///
private void SetMassAndInertia( double mass )
{
Body.Mass = Body.GetMassInfo( mass, Body.Shape );
}
}
}