using System.Runtime.InteropServices;
namespace XFEEDToolBox.Plugin;
internal static unsafe partial class Navigation
{
internal static uint ReferenceGeometrySelfTest()
{
var memory=NativeMemory.AllocZeroed(96*1024*1024);if(memory==null)return 0;
var beforeImage=image;image=(nuint)memory;
try
{
var fsd=image+4096;var pose=image+8192;var service=image+12288;var resource=image+16384;
var star=image+20480;var planet=image+24576;var station=image+28672;var transforms=image+32768;
var systemTable=image+36864;var systemNode=image+36928;var bodyTable=image+37376;
var starNode=image+37440;var planetNode=image+37504;var stationNode=image+37568;
var serviceTable=image+38912;var poseTable=image+39936;var starTable=image+40960;var planetTable=image+41984;
const ulong world=(73UL<<55)|1,planetId=(11UL<<55)|1;
static void Ptr(nuint at,nuint value)=>Write(at,value);
static void Number(nuint at,ulong value)=>Write(at,value);
static void Integer(nuint at,uint value)=>Write(at,value);
static void Scalar(nuint at,float value)=>Write(at,value);
static void Affine(nuint at,AffinePose value){Write(at,value.right);Write(at+0x20,value.up);Write(at+0x40,value.forward);Write(at+0x60,value.position);}
AffinePose identity=new(new(1,0,0),new(0,1,0),new(0,0,1),default);
Ptr(fsd+0x6A0,service);Ptr(fsd+0x50,image+43008);Scalar(image+43008+0x44,1.01f);
Ptr(service,serviceTable);Ptr(serviceTable+0x60,image+BodyLookup);Ptr(service-8,image+44032);
Scalar(image+44032+0x3C,1);Scalar(image+44032+0x44,1.1f);
Ptr(service-0x58+0x278,systemTable);Number(service-0x58+0x280,1);Ptr(systemTable,systemNode);Ptr(systemNode,systemTable);Number(systemNode+8,1);Ptr(systemNode+24,resource);
Integer(resource+4,5);Integer(resource+0x90,1);Ptr(resource+0x140,bodyTable);Number(resource+0x148,1);Ptr(resource+0x388,transforms);
Ptr(bodyTable,starNode);Ptr(starNode,planetNode);Ptr(planetNode,stationNode);Ptr(stationNode,bodyTable);
Number(starNode+8,1);Ptr(starNode+16,star);Number(planetNode+8,planetId);Ptr(planetNode+16,planet);Number(stationNode+8,world);Ptr(stationNode+16,station);
Ptr(star,starTable);Ptr(starTable+0x10,image+0x271B230);Scalar(star+0x428,1000);Integer(star+0x448,4);
Ptr(planet,planetTable);Ptr(planetTable+0x10,image+0x3CF26B0);Write(planet+0x710,500d);
Ptr(station,image+0x553F960);Ptr(image+0x553F960+0x10,image+0x3CF2660);Write(station+0x410,3050.25d);
foreach(var body in new[]{star,planet,station})Ptr(body+0x378,resource);
Number(star+0x18,1);Integer(star+0x20,1);Integer(star+0x384,0);
Number(planet+0x18,planetId);Integer(planet+0x20,2);Integer(planet+0x384,1);
Number(station+0x18,world);Integer(station+0x20,6);Integer(station+0x384,2);
Affine(transforms+0x100,identity);
Affine(transforms+0x180+0x100,new(new(1,0,0),new(0,1,0),new(0,0,1),new(10000,20000,28000)));
Affine(transforms+2*0x180+0x100,new(new(0,1,0),new(-1,0,0),new(0,0,1),new(10000,20000,30000)));
Ptr(pose,poseTable);Ptr(poseTable+0x60,image+0x2D9C200);Number(pose+0xE8,world);
Affine(pose+0xF8,new(new(1,0,0),new(0,1,0),new(0,0,1),new(5,6,7)));
Write(pose+0x110,double.NaN);
Snapshot frame=new(){entity=42,fsd=fsd,transform=pose,referenceWorld=world};
GeometryObservation value=default;uint passed=0;
static bool HasPlanet(GeometryObservation value,ulong id,double radius)
{for(var i=0;i<value.bodyCount;i++)if(value.bodies[i].address==id&&value.bodies[i].centre.z==28000&&value.bodies[i].exclusionRadius==radius)return true;return false;}
bool HasOnlyVerifiedStarsAndPlanet(GeometryObservation sample)=>sample.unifiedReference&&sample.bodyCount==2&&sample.unverifiedStationEnvelopes==1
&&sample.bodyAddress==1&&sample.exclusionRadius==1000&&HasPlanet(sample,planetId,550)
&&!Enumerable.Range(0,(int)sample.bodyCount).Any(index=>sample.bodies[index].address==world);
if(SampleReferenceGeometry(frame,&value)&&value.unifiedReference&&value.referenceBodyKind==6&&value.bodyCount==3)passed|=1;
if(value.position.x==9994&&value.position.y==20005&&value.position.z==30007&&value.right.y==1&&value.up.x==-1)passed|=2;
if(value.bodyAddress==1&&value.exclusionRadius==1000&&HasPlanet(value,planetId,550))passed|=4;
for(var i=0;i<value.bodyCount;i++)if(value.bodies[i].address==world&&value.bodies[i].kind==6
&&value.bodies[i].exclusionRadius==3050.25&&value.bodies[i].centre.x==10000&&value.bodies[i].centre.y==20000&&value.bodies[i].centre.z==30000)passed|=8192;
Ptr(station,starTable);if(SampleReferenceGeometry(frame,&value)&&HasOnlyVerifiedStarsAndPlanet(value))passed|=16384;Ptr(station,image+0x553F960);
Ptr(image+0x553F960+0x10,image+0x3CF26B0);if(SampleReferenceGeometry(frame,&value)&&HasOnlyVerifiedStarsAndPlanet(value))passed|=32768;
Number(planet+0x18,planetId+1);if(!SampleReferenceGeometry(frame,&value))passed|=131072;Number(planet+0x18,planetId);
Ptr(image+0x553F960+0x10,image+0x3CF2660);
Write(station+0x410,double.NaN);var nanRejected=SampleReferenceGeometry(frame,&value)&&HasOnlyVerifiedStarsAndPlanet(value);Write(station+0x410,0d);
if(nanRejected&&SampleReferenceGeometry(frame,&value)&&HasOnlyVerifiedStarsAndPlanet(value))passed|=65536;Write(station+0x410,3050.25d);
frame.referenceWorld++;if(!SampleReferenceGeometry(frame,&value))passed|=8;frame.referenceWorld=world;
Integer(star+0x20,2);if(!SampleReferenceGeometry(frame,&value))passed|=16;Integer(star+0x20,1);
Ptr(planet+0x378,0);if(!SampleReferenceGeometry(frame,&value))passed|=32;Ptr(planet+0x378,resource);
Integer(station+0x384,4096);if(!SampleReferenceGeometry(frame,&value))passed|=64;Integer(station+0x384,2);
Number(resource+0x148,65537);if(!SampleReferenceGeometry(frame,&value))passed|=128;Number(resource+0x148,1);
Ptr(stationNode,stationNode);if(!SampleReferenceGeometry(frame,&value))passed|=256;Ptr(stationNode,bodyTable);
Affine(transforms+2*0x180+0x100,new(new(0,2,0),new(-1,0,0),new(0,0,1),new(10000,20000,30000)));
if(!SampleReferenceGeometry(frame,&value))passed|=512;
Affine(transforms+2*0x180+0x100,new(new(0,1,0),new(-1,0,0),new(0,0,1),new(10000,20000,30000)));
Ptr(planetTable+0x10,image+0x3CF2650);Write(planet+0x490,5000d);
if(SampleReferenceGeometry(frame,&value)&&HasPlanet(value,planetId,5500))passed|=1024;
Ptr(planetTable+0x10,image+0x3CF26F1);if(!SampleReferenceGeometry(frame,&value))passed|=2048;
Ptr(planetTable+0x10,image+0x3CF2650);Write(planet+0x490,0d);
if(!SampleReferenceGeometry(frame,&value))passed|=4096;
// Preserve the real primary-star translation before reducing the
// geometry. A ship input pose is not the affine-frame origin.
Ptr(planetTable+0x10,image+0x3CF26B0);Write(planet+0x710,500d);
var globalOrigin=new Vector(1e11,-2e11,3e11);
Affine(transforms+0x100,new(new(1,0,0),new(0,1,0),new(0,0,1),globalOrigin));
Affine(transforms+0x180+0x100,new(new(1,0,0),new(0,1,0),new(0,0,1),Add(globalOrigin,new(10000,20000,28000))));
Affine(transforms+2*0x180+0x100,new(new(0,1,0),new(-1,0,0),new(0,0,1),Add(globalOrigin,new(10000,20000,30000))));
if(SampleReferenceGeometry(frame,&value)&&value.referenceOriginVerified&&value.sourceUtcMilliseconds>0&&value.worldAddress==world&&value.entity==42
&&value.referenceOrigin.x==globalOrigin.x&&value.referenceOrigin.y==globalOrigin.y&&value.referenceOrigin.z==globalOrigin.z)
for(var i=0;i<value.bodyCount;i++)if(value.bodies[i].address==world)
{
var restored=Add(value.referenceOrigin,value.bodies[i].centre);
if(restored.x==globalOrigin.x+10000&&restored.y==globalOrigin.y+20000&&restored.z==globalOrigin.z+30000)passed|=262144;
}
return passed;
}
finally{image=beforeImage;NativeMemory.Free(memory);}
}
}
using System.Runtime.InteropServices;
namespace XFEEDToolBox.Plugin;
internal static unsafe partial class Navigation
{
internal static uint ReferenceGeometrySelfTest()
{
var memory=NativeMemory.AllocZeroed(96*1024*1024);if(memory==null)return 0;
var beforeImage=image;image=(nuint)memory;
try
{
var fsd=image+4096;var pose=image+8192;var service=image+12288;var resource=image+16384;
var star=image+20480;var planet=image+24576;var station=image+28672;var transforms=image+32768;
var systemTable=image+36864;var systemNode=image+36928;var bodyTable=image+37376;
var starNode=image+37440;var planetNode=image+37504;var stationNode=image+37568;
var serviceTable=image+38912;var poseTable=image+39936;var starTable=image+40960;var planetTable=image+41984;
const ulong world=(73UL<<55)|1,planetId=(11UL<<55)|1;
static void Ptr(nuint at,nuint value)=>Write(at,value);
static void Number(nuint at,ulong value)=>Write(at,value);
static void Integer(nuint at,uint value)=>Write(at,value);
static void Scalar(nuint at,float value)=>Write(at,value);
static void Affine(nuint at,AffinePose value){Write(at,value.right);Write(at+0x20,value.up);Write(at+0x40,value.forward);Write(at+0x60,value.position);}
AffinePose identity=new(new(1,0,0),new(0,1,0),new(0,0,1),default);
Ptr(fsd+0x6A0,service);Ptr(fsd+0x50,image+43008);Scalar(image+43008+0x44,1.01f);
Ptr(service,serviceTable);Ptr(serviceTable+0x60,image+BodyLookup);Ptr(service-8,image+44032);
Scalar(image+44032+0x3C,1);Scalar(image+44032+0x44,1.1f);
Ptr(service-0x58+0x278,systemTable);Number(service-0x58+0x280,1);Ptr(systemTable,systemNode);Ptr(systemNode,systemTable);Number(systemNode+8,1);Ptr(systemNode+24,resource);
Integer(resource+4,5);Integer(resource+0x90,1);Ptr(resource+0x140,bodyTable);Number(resource+0x148,1);Ptr(resource+0x388,transforms);
Ptr(bodyTable,starNode);Ptr(starNode,planetNode);Ptr(planetNode,stationNode);Ptr(stationNode,bodyTable);
Number(starNode+8,1);Ptr(starNode+16,star);Number(planetNode+8,planetId);Ptr(planetNode+16,planet);Number(stationNode+8,world);Ptr(stationNode+16,station);
Ptr(star,starTable);Ptr(starTable+0x10,image+0x271B230);Scalar(star+0x428,1000);Integer(star+0x448,4);
Ptr(planet,planetTable);Ptr(planetTable+0x10,image+0x3CF26B0);Write(planet+0x710,500d);
Ptr(station,image+0x553F960);Ptr(image+0x553F960+0x10,image+0x3CF2660);Write(station+0x410,3050.25d);
foreach(var body in new[]{star,planet,station})Ptr(body+0x378,resource);
Number(star+0x18,1);Integer(star+0x20,1);Integer(star+0x384,0);
Number(planet+0x18,planetId);Integer(planet+0x20,2);Integer(planet+0x384,1);
Number(station+0x18,world);Integer(station+0x20,6);Integer(station+0x384,2);
Affine(transforms+0x100,identity);
Affine(transforms+0x180+0x100,new(new(1,0,0),new(0,1,0),new(0,0,1),new(10000,20000,28000)));
Affine(transforms+2*0x180+0x100,new(new(0,1,0),new(-1,0,0),new(0,0,1),new(10000,20000,30000)));
Ptr(pose,poseTable);Ptr(poseTable+0x60,image+0x2D9C200);Number(pose+0xE8,world);
Affine(pose+0xF8,new(new(1,0,0),new(0,1,0),new(0,0,1),new(5,6,7)));
Write(pose+0x110,double.NaN);
Snapshot frame=new(){entity=42,fsd=fsd,transform=pose,referenceWorld=world};
GeometryObservation value=default;uint passed=0;
static bool HasPlanet(GeometryObservation value,ulong id,double radius)
{for(var i=0;i<value.bodyCount;i++)if(value.bodies[i].address==id&&value.bodies[i].centre.z==28000&&value.bodies[i].exclusionRadius==radius)return true;return false;}
bool HasOnlyVerifiedStarsAndPlanet(GeometryObservation sample)=>sample.unifiedReference&&sample.bodyCount==2&&sample.unverifiedStationEnvelopes==1
&&sample.bodyAddress==1&&sample.exclusionRadius==1000&&HasPlanet(sample,planetId,550)
&&!Enumerable.Range(0,(int)sample.bodyCount).Any(index=>sample.bodies[index].address==world);
if(SampleReferenceGeometry(frame,&value)&&value.unifiedReference&&value.referenceBodyKind==6&&value.bodyCount==3)passed|=1;
if(value.position.x==9994&&value.position.y==20005&&value.position.z==30007&&value.right.y==1&&value.up.x==-1)passed|=2;
if(value.bodyAddress==1&&value.exclusionRadius==1000&&HasPlanet(value,planetId,550))passed|=4;
for(var i=0;i<value.bodyCount;i++)if(value.bodies[i].address==world&&value.bodies[i].kind==6
&&value.bodies[i].exclusionRadius==3050.25&&value.bodies[i].centre.x==10000&&value.bodies[i].centre.y==20000&&value.bodies[i].centre.z==30000)passed|=8192;
Ptr(station,starTable);if(SampleReferenceGeometry(frame,&value)&&HasOnlyVerifiedStarsAndPlanet(value))passed|=16384;Ptr(station,image+0x553F960);
Ptr(image+0x553F960+0x10,image+0x3CF26B0);if(SampleReferenceGeometry(frame,&value)&&HasOnlyVerifiedStarsAndPlanet(value))passed|=32768;
Number(planet+0x18,planetId+1);if(!SampleReferenceGeometry(frame,&value))passed|=131072;Number(planet+0x18,planetId);
Ptr(image+0x553F960+0x10,image+0x3CF2660);
Write(station+0x410,double.NaN);var nanRejected=SampleReferenceGeometry(frame,&value)&&HasOnlyVerifiedStarsAndPlanet(value);Write(station+0x410,0d);
if(nanRejected&&SampleReferenceGeometry(frame,&value)&&HasOnlyVerifiedStarsAndPlanet(value))passed|=65536;Write(station+0x410,3050.25d);
frame.referenceWorld++;if(!SampleReferenceGeometry(frame,&value))passed|=8;frame.referenceWorld=world;
Integer(star+0x20,2);if(!SampleReferenceGeometry(frame,&value))passed|=16;Integer(star+0x20,1);
Ptr(planet+0x378,0);if(!SampleReferenceGeometry(frame,&value))passed|=32;Ptr(planet+0x378,resource);
Integer(station+0x384,4096);if(!SampleReferenceGeometry(frame,&value))passed|=64;Integer(station+0x384,2);
Number(resource+0x148,65537);if(!SampleReferenceGeometry(frame,&value))passed|=128;Number(resource+0x148,1);
Ptr(stationNode,stationNode);if(!SampleReferenceGeometry(frame,&value))passed|=256;Ptr(stationNode,bodyTable);
Affine(transforms+2*0x180+0x100,new(new(0,2,0),new(-1,0,0),new(0,0,1),new(10000,20000,30000)));
if(!SampleReferenceGeometry(frame,&value))passed|=512;
Affine(transforms+2*0x180+0x100,new(new(0,1,0),new(-1,0,0),new(0,0,1),new(10000,20000,30000)));
Ptr(planetTable+0x10,image+0x3CF2650);Write(planet+0x490,5000d);
if(SampleReferenceGeometry(frame,&value)&&HasPlanet(value,planetId,5500))passed|=1024;
Ptr(planetTable+0x10,image+0x3CF26F1);if(!SampleReferenceGeometry(frame,&value))passed|=2048;
Ptr(planetTable+0x10,image+0x3CF2650);Write(planet+0x490,0d);
if(!SampleReferenceGeometry(frame,&value))passed|=4096;
// Preserve the real primary-star translation before reducing the
// geometry. A ship input pose is not the affine-frame origin.
Ptr(planetTable+0x10,image+0x3CF26B0);Write(planet+0x710,500d);
var globalOrigin=new Vector(1e11,-2e11,3e11);
Affine(transforms+0x100,new(new(1,0,0),new(0,1,0),new(0,0,1),globalOrigin));
Affine(transforms+0x180+0x100,new(new(1,0,0),new(0,1,0),new(0,0,1),Add(globalOrigin,new(10000,20000,28000))));
Affine(transforms+2*0x180+0x100,new(new(0,1,0),new(-1,0,0),new(0,0,1),Add(globalOrigin,new(10000,20000,30000))));
if(SampleReferenceGeometry(frame,&value)&&value.referenceOriginVerified&&value.sourceUtcMilliseconds>0&&value.worldAddress==world&&value.entity==42
&&value.referenceOrigin.x==globalOrigin.x&&value.referenceOrigin.y==globalOrigin.y&&value.referenceOrigin.z==globalOrigin.z)
for(var i=0;i<value.bodyCount;i++)if(value.bodies[i].address==world)
{
var restored=Add(value.referenceOrigin,value.bodies[i].centre);
if(restored.x==globalOrigin.x+10000&&restored.y==globalOrigin.y+20000&&restored.z==globalOrigin.z+30000)passed|=262144;
}
return passed;
}
finally{image=beforeImage;NativeMemory.Free(memory);}
}
}