Skip to content

Commit

Permalink
feat: [BveTypes]自列車の車体の揺れに関するメンバーを追加
Browse files Browse the repository at this point in the history
  • Loading branch information
automatic9045 committed Aug 23, 2023
1 parent 068cfbf commit b1d3ed7
Show file tree
Hide file tree
Showing 7 changed files with 414 additions and 0 deletions.
3 changes: 3 additions & 0 deletions Libs/BveTypes/BveTypes.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@
<Compile Include="ClassWrappers\Helpers\DoorSide.cs" />
<Compile Include="ClassWrappers\Helpers\ReverserPosition.cs" />
<Compile Include="ClassWrappers\Helpers\TiltOptions.cs" />
<Compile Include="ClassWrappers\Public\AirSpring.cs" />
<Compile Include="ClassWrappers\Public\AirSupplement.cs" />
<Compile Include="ClassWrappers\Public\AssistantText.cs" />
<Compile Include="ClassWrappers\Public\AssistantTextBase.cs" />
Expand Down Expand Up @@ -103,7 +104,9 @@
<Compile Include="ClassWrappers\Public\MyTrack.cs" />
<Compile Include="ClassWrappers\Public\Passenger.cs" />
<Compile Include="ClassWrappers\Public\SideDoorSet.cs" />
<Compile Include="ClassWrappers\Public\SixDof.cs" />
<Compile Include="ClassWrappers\Public\SoundSet.cs" />
<Compile Include="ClassWrappers\Public\Spring.cs" />
<Compile Include="ClassWrappers\Public\Transform.cs" />
<Compile Include="ClassWrappers\Public\VehicleBogieWheel.cs" />
<Compile Include="ClassWrappers\Public\VehicleElectricity.cs" />
Expand Down
39 changes: 39 additions & 0 deletions Libs/BveTypes/ClassWrappers/Public/AirSpring.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using FastMember;
using TypeWrapping;

namespace BveTypes.ClassWrappers
{
/// <summary>
/// 空気ばねのモデルを表します。
/// </summary>
public class AirSpring : Spring
{
[InitializeClassWrapper]
private static void Initialize(BveTypeSet bveTypes)
{
ClassMemberSet members = bveTypes.GetClassInfoOf<AirSpring>();
}

/// <summary>
/// オリジナル オブジェクトから <see cref="AirSpring"/> クラスの新しいインスタンスを初期化します。
/// </summary>
/// <param name="src">ラップするオリジナル オブジェクト。</param>
protected AirSpring(object src) : base(src)
{
}

/// <summary>
/// オリジナル オブジェクトからラッパーのインスタンスを生成します。
/// </summary>
/// <param name="src">ラップするオリジナル オブジェクト。</param>
/// <returns>オリジナル オブジェクトをラップした <see cref="AirSpring"/> クラスのインスタンス。</returns>
[CreateClassWrapperFromSource]
public static new AirSpring FromSource(object src) => src is null ? null : new AirSpring(src);
}
}
139 changes: 139 additions & 0 deletions Libs/BveTypes/ClassWrappers/Public/SixDof.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using FastMember;
using TypeWrapping;

namespace BveTypes.ClassWrappers
{
/// <summary>
/// 6DoF (3 次元における剛体の運動の自由度) を表します。
/// </summary>
/// <remarks>
/// このクラスのオリジナル型は構造体であることに注意してください。
/// </remarks>
public class SixDof : ClassWrapperBase
{
private static Type OriginalType;

[InitializeClassWrapper]
private static void Initialize(BveTypeSet bveTypes)
{
ClassMemberSet members = bveTypes.GetClassInfoOf<SixDof>();

OriginalType = members.OriginalType;

XField = members.GetSourceFieldOf(nameof(X));
YField = members.GetSourceFieldOf(nameof(Y));
ZField = members.GetSourceFieldOf(nameof(Z));
RotationXField = members.GetSourceFieldOf(nameof(RotationX));
RotationYField = members.GetSourceFieldOf(nameof(RotationY));
RotationZField = members.GetSourceFieldOf(nameof(RotationZ));

AddMethod = members.GetSourceMethodOf(nameof(Add));
MultiplyMethod = members.GetSourceMethodOf(nameof(Multiply));
}

/// <summary>
/// オリジナル オブジェクトから <see cref="SixDof"/> クラスの新しいインスタンスを初期化します。
/// </summary>
/// <param name="src">ラップするオリジナル オブジェクト。</param>
protected SixDof(object src) : base(src)
{
}

/// <summary>
/// オリジナル オブジェクトからラッパーのインスタンスを生成します。
/// </summary>
/// <param name="src">ラップするオリジナル オブジェクト。</param>
/// <returns>オリジナル オブジェクトをラップした <see cref="SixDof"/> クラスのインスタンス。</returns>
[CreateClassWrapperFromSource]
public static SixDof FromSource(object src) => src is null ? null : new SixDof(src);

public static SixDof operator +(SixDof x, SixDof y) => Add(x, y);
public static SixDof operator *(double x, SixDof y) => Multiply(x, y);

/// <summary>
/// 座標、回転を指定して <see cref="SixDof"/> クラスの新しいインスタンスを初期化します。
/// </summary>
/// <param name="x">X 座標。</param>
/// <param name="y">Y 座標。</param>
/// <param name="z">Z 座標。</param>
/// <param name="rotationX">X 軸まわりの回転 (ピッチ)。</param>
/// <param name="rotationY">Y 軸まわりの回転 (ヨー)。</param>
/// <param name="rotationZ">Z 軸まわりの回転 (ロール)。</param>
public SixDof(double x, double y, double z, double rotationX, double rotationY, double rotationZ)
: this(Activator.CreateInstance(OriginalType, x, y, z, rotationX, rotationY, rotationZ))
{
}

private static FastField XField;
/// <summary>
/// X 座標を取得・設定します。
/// </summary>
public double X
{
get => XField.GetValue(Src);
set => XField.SetValue(Src, value);
}

private static FastField YField;
/// <summary>
/// Y 座標を取得・設定します。
/// </summary>
public double Y
{
get => YField.GetValue(Src);
set => YField.SetValue(Src, value);
}

private static FastField ZField;
/// <summary>
/// Z 座標を取得・設定します。
/// </summary>
public double Z
{
get => ZField.GetValue(Src);
set => ZField.SetValue(Src, value);
}

private static FastField RotationXField;
/// <summary>
/// X 軸まわりの回転 (ピッチ) を取得・設定します。
/// </summary>
public double RotationX
{
get => RotationXField.GetValue(Src);
set => RotationXField.SetValue(Src, value);
}

private static FastField RotationYField;
/// <summary>
/// Y 軸まわりの回転 (ヨー) を取得・設定します。
/// </summary>
public double RotationY
{
get => RotationYField.GetValue(Src);
set => RotationYField.SetValue(Src, value);
}

private static FastField RotationZField;
/// <summary>
/// Z 軸まわりの回転 (ロール) を取得・設定します。
/// </summary>
public double RotationZ
{
get => RotationZField.GetValue(Src);
set => RotationZField.SetValue(Src, value);
}

private static FastMethod AddMethod;
private static SixDof Add(SixDof x, SixDof y) => SixDof.FromSource(AddMethod.Invoke(null, new object[] { x.Src, y.Src }));

private static FastMethod MultiplyMethod;
private static SixDof Multiply(double x, SixDof y) => SixDof.FromSource(MultiplyMethod.Invoke(null, new object[] { x, y.Src }));
}
}
67 changes: 67 additions & 0 deletions Libs/BveTypes/ClassWrappers/Public/Spring.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using FastMember;
using TypeWrapping;

namespace BveTypes.ClassWrappers
{
/// <summary>
/// ばねのモデルを表します。
/// </summary>
public class Spring : ClassWrapperBase
{
[InitializeClassWrapper]
private static void Initialize(BveTypeSet bveTypes)
{
ClassMemberSet members = bveTypes.GetClassInfoOf<Spring>();

UpperPositionGetMethod = members.GetSourcePropertyGetterOf(nameof(UpperPosition));
UpperPositionSetMethod = members.GetSourcePropertySetterOf(nameof(UpperPosition));

UpperSpeedGetMethod = members.GetSourcePropertyGetterOf(nameof(UpperSpeed));
UpperSpeedSetMethod = members.GetSourcePropertySetterOf(nameof(UpperSpeed));
}

/// <summary>
/// オリジナル オブジェクトから <see cref="Spring"/> クラスの新しいインスタンスを初期化します。
/// </summary>
/// <param name="src">ラップするオリジナル オブジェクト。</param>
protected Spring(object src) : base(src)
{
}

/// <summary>
/// オリジナル オブジェクトからラッパーのインスタンスを生成します。
/// </summary>
/// <param name="src">ラップするオリジナル オブジェクト。</param>
/// <returns>オリジナル オブジェクトをラップした <see cref="Spring"/> クラスのインスタンス。</returns>
[CreateClassWrapperFromSource]
public static Spring FromSource(object src) => src is null ? null : new Spring(src);

private static FastMethod UpperPositionGetMethod;
private static FastMethod UpperPositionSetMethod;
/// <summary>
/// ばね上端の位置 [m] を取得・設定します。
/// </summary>
public double UpperPosition
{
get => UpperPositionGetMethod.Invoke(Src, null);
set => UpperPositionSetMethod.Invoke(Src, new object[] { value });
}

private static FastMethod UpperSpeedGetMethod;
private static FastMethod UpperSpeedSetMethod;
/// <summary>
/// ばね上端の速度 [m/s] を取得・設定します。
/// </summary>
public double UpperSpeed
{
get => UpperSpeedGetMethod.Invoke(Src, null);
set => UpperSpeedSetMethod.Invoke(Src, new object[] { value });
}
}
}
76 changes: 76 additions & 0 deletions Libs/BveTypes/ClassWrappers/Public/VehicleVibrationManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
using FastMember;
using TypeWrapping;

using BveTypes.ClassWrappers.Extensions;

namespace BveTypes.ClassWrappers
{
/// <summary>
Expand All @@ -19,7 +21,22 @@ private static void Initialize(BveTypeSet bveTypes)
{
ClassMemberSet members = bveTypes.GetClassInfoOf<VehicleVibrationManager>();

CarBodyTransformGetMethod = members.GetSourcePropertyGetterOf(nameof(CarBodyTransform));

CarBodyDisplacementGetMethod = members.GetSourcePropertyGetterOf(nameof(CarBodyDisplacement));

PositionerGetMethod = members.GetSourcePropertyGetterOf(nameof(Positioner));

SpringHeightGetMethod = members.GetSourcePropertyGetterOf(nameof(SpringHeight));
SpringHeightSetMethod = members.GetSourcePropertySetterOf(nameof(SpringHeight));

ViewPointGetMethod = members.GetSourcePropertyGetterOf(nameof(ViewPoint));
ViewPointSetMethod = members.GetSourcePropertySetterOf(nameof(ViewPoint));

VerticalSpringsField = members.GetSourceFieldOf(nameof(VerticalSprings));

TickMethod = members.GetSourceMethodOf(nameof(Tick));
UpdateCarBodyTransformMethod = members.GetSourceMethodOf(nameof(UpdateCarBodyTransform));
}

/// <summary>
Expand All @@ -38,10 +55,69 @@ protected VehicleVibrationManager(object src) : base(src)
[CreateClassWrapperFromSource]
public static VehicleVibrationManager FromSource(object src) => src is null ? null : new VehicleVibrationManager(src);

private static FastMethod CarBodyTransformGetMethod;
/// <summary>
/// 車体中心から運転士を取得します。
/// </summary>
public Transform CarBodyTransform => Transform.FromSource(CarBodyTransformGetMethod.Invoke(Src, null));

private static FastMethod CarBodyDisplacementGetMethod;
/// <summary>
/// 車体中心から運転士を取得します。
/// </summary>
public SixDof CarBodyDisplacement => SixDof.FromSource(CarBodyDisplacementGetMethod.Invoke(Src, null));

private static FastMethod PositionerGetMethod;
/// <summary>
/// 自列車をマップ上に配置するための機能を提供する <see cref="VehiclePositioner"/> を取得します。
/// </summary>
public VehiclePositioner Positioner => VehiclePositioner.FromSource(PositionerGetMethod.Invoke(Src, null));

private static FastMethod SpringHeightGetMethod;
private static FastMethod SpringHeightSetMethod;
/// <summary>
/// を取得・設定します。
/// </summary>
public double SpringHeight
{
get => SpringHeightGetMethod.Invoke(Src, null);
set => SpringHeightSetMethod.Invoke(Src, new object[] { value });
}

private static FastMethod ViewPointGetMethod;
private static FastMethod ViewPointSetMethod;
/// <summary>
/// を取得・設定します。
/// </summary>
public SixDof ViewPoint
{
get => SixDof.FromSource(ViewPointGetMethod.Invoke(Src, null));
set => ViewPointSetMethod.Invoke(Src, new object[] { value.Src });
}

private static FastField VerticalSpringsField;
/// <summary>
/// 空気ばねの縦 (Y) 方向モデルを取得・設定します。
/// </summary>
/// <remarks>
/// 右前、左前、右後、左後の順番で格納されています。
/// </remarks>
public WrappedArray<AirSpring> VerticalSprings
{
get => WrappedArray<AirSpring>.FromSource(VerticalSpringsField.GetValue(Src));
set => VerticalSpringsField.SetValue(Src, value.Src);
}

private static FastMethod TickMethod;
/// <summary>
/// 毎フレーム呼び出されます。
/// </summary>
public void Tick(double elapsedSeconds) => TickMethod.Invoke(Src, new object[] { elapsedSeconds });

private static FastMethod UpdateCarBodyTransformMethod;
/// <summary>
/// 車両
/// </summary>
public void UpdateCarBodyTransform() => UpdateCarBodyTransformMethod.Invoke(Src, null);
}
}
Loading

0 comments on commit b1d3ed7

Please sign in to comment.