daily update on 20240513 by nitload youmu, instancing render added
This commit is contained in:
@@ -0,0 +1,138 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StgSharp.Math
|
||||
{
|
||||
public static partial class GeometryScaler
|
||||
{
|
||||
internal const float DegToRad = 180 / Scaler.Pi;
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Degree ToDegree(float value)
|
||||
{
|
||||
return new Degree(value);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static float Sin(Radius r)
|
||||
{
|
||||
return MathF.Sin(r._radius);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static float Tan(Radius r)
|
||||
{
|
||||
return MathF.Tan(r._radius);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static float Cos(Radius r)
|
||||
{
|
||||
return MathF.Cos(r._radius);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static float Sin(Degree r)
|
||||
{
|
||||
return MathF.Sin(r._degree/DegToRad);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static float Tan(Degree r)
|
||||
{
|
||||
return MathF.Tan(r._degree / DegToRad);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static float Cos(Degree r)
|
||||
{
|
||||
return MathF.Cos(r._degree / DegToRad);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public struct Degree
|
||||
{
|
||||
internal float _degree;
|
||||
|
||||
internal Degree(float dgree)
|
||||
{
|
||||
_degree = dgree;
|
||||
}
|
||||
|
||||
public static implicit operator Radius(Degree d)
|
||||
{
|
||||
return new Radius(d._degree / GeometryScaler.DegToRad);
|
||||
}
|
||||
}
|
||||
|
||||
public struct Radius
|
||||
{
|
||||
internal float _radius;
|
||||
|
||||
public static Radius Zero
|
||||
{
|
||||
get =>new Radius(0);
|
||||
}
|
||||
|
||||
public Radius(float radius)
|
||||
{
|
||||
_radius = radius;
|
||||
}
|
||||
|
||||
[Obsolete("Unsafe, you may forget this is radius.",true)]
|
||||
public Radius() { }
|
||||
|
||||
public static implicit operator Degree(Radius r)
|
||||
{
|
||||
return new Degree(r._radius * 180 / Scaler.Pi);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Radius operator -(Radius r)
|
||||
{
|
||||
return new Radius(-r._radius);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Radius operator -(Radius left, Radius Right)
|
||||
{
|
||||
return new Radius(left._radius - Right._radius);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Radius operator +(Radius left, Radius Right)
|
||||
{
|
||||
return new Radius(left._radius + Right._radius);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Radius operator *(Radius left, float right)
|
||||
{
|
||||
return new Radius(left._radius * right);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static Radius operator /(Radius left, float right)
|
||||
{
|
||||
return new Radius(left._radius / right);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static bool operator ==(Radius left, Radius right)
|
||||
{
|
||||
return left._radius == right._radius;
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static bool operator !=(Radius left, Radius right)
|
||||
{
|
||||
return left._radius != right._radius;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
using StgSharp.Math;
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
|
||||
namespace StgSharp.Geometries
|
||||
{
|
||||
public delegate vec3d GeometryMotionDelegate(TimeSpanProvider timeSource, out float rotation);
|
||||
|
||||
public class GeometryMotion
|
||||
{
|
||||
private bool isIncrementMode;
|
||||
private bool sourceIsStatic;
|
||||
private TimeSpanProvider time;
|
||||
private GeometryMotionDelegate movement;
|
||||
private IntPtr handle;
|
||||
|
||||
public static GeometryMotion DefaultMotion
|
||||
{
|
||||
get
|
||||
{
|
||||
return new GeometryMotion
|
||||
(
|
||||
true,
|
||||
null,
|
||||
null
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private static vec3d defaultMotion(TimeSpanProvider provider, out float rotation)
|
||||
{
|
||||
rotation = 0;
|
||||
return Vec3d.Zero;
|
||||
}
|
||||
|
||||
public unsafe GeometryMotion(
|
||||
bool isIncreament,
|
||||
TimeSpanProvider timeSource,
|
||||
GeometryMotionDelegate motionDelegate
|
||||
)
|
||||
{
|
||||
isIncrementMode = isIncreament;
|
||||
time = timeSource;
|
||||
if (motionDelegate == null)
|
||||
{
|
||||
handle = (IntPtr)(delegate*<TimeSpanProvider, out float, vec3d>)&defaultMotion;
|
||||
movement = defaultMotion;
|
||||
}
|
||||
else if (motionDelegate.Method.IsStatic)
|
||||
{
|
||||
sourceIsStatic = true;
|
||||
handle = Marshal.GetFunctionPointerForDelegate(motionDelegate);
|
||||
movement = motionDelegate;
|
||||
}
|
||||
else
|
||||
{
|
||||
movement = motionDelegate;
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsIncrement
|
||||
{
|
||||
get => isIncrementMode;
|
||||
|
||||
}
|
||||
|
||||
public unsafe void RunMotion(ref vec3d coord, ref float rotation)
|
||||
{
|
||||
float rot = 0;
|
||||
|
||||
if (sourceIsStatic)
|
||||
{
|
||||
|
||||
}
|
||||
vec3d vec = ((delegate*<TimeSpanProvider, out float, vec3d>)handle)(time, out rot);
|
||||
|
||||
if (isIncrementMode)
|
||||
{
|
||||
coord += vec;
|
||||
rotation += rot;
|
||||
}
|
||||
else
|
||||
{
|
||||
coord = vec.XYZ;
|
||||
rotation = rot;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user