standalone: VoxelForgeCore library -- the fast generator behind a clean C++20 API, output unchanged
- Standalone/Core: public header VoxelForgeCore.h (no Unreal types), static library target, ResolvedWorldSnapshot (from the schema-v1 JSON), World (compile, generateTile, density/sign, point/segment solid, classifyBox), host-supplied JobScheduler (the core starts no threads), sequenced, idempotent EditTransaction returning affected tiles per LOD. - The viewer, benchmarks, edits and audits run on Core; StreamingWorld stays host code. - Same as round 11: 11 hash rows at W1 and W8, routes 5642/5642, look/passage/far audits pass, bad-shell control fails, six fixed captures byte-identical; cold W8 1.025 s vs 1.041 s reference. - SHARED_CPP_LIBRARY_PLAN.md rewritten for a UBT module compiling the same sources via shims. Open issue before Unreal: Core's implementation still compiles the Compat stand-ins named like Unreal types (TArray, FVector...); inside a UE binary that is an ODR clash. Must be namespaced. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
This commit is contained in:
1 parent
631dd57eb4
commit
557f6aac30
22 files changed
+6185
-5063
No files matched your search
@@ -1,5 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "VoxelForgeCore/VoxelForgeCore.h"
|
||||
|
||||
// Standalone-only proof that far meshes retain the owner's strata-boundary shells and
|
||||
// generated far-parent connectors. This deliberately compares the dense source field with
|
||||
// vertical/radial intersections against the triangles that were actually emitted.
|
||||
@@ -31,7 +33,7 @@ struct FFarSurvivalAudit
|
||||
uint64 CorruptedTriangles=0;
|
||||
};
|
||||
|
||||
FFarSurvivalAudit(FStandaloneOwnerWorld& InWorld,const FStandaloneShapeWorld& InShape,
|
||||
FFarSurvivalAudit(FStandaloneOwnerWorld& InWorld,const VoxelForgeCore::World& InShape,
|
||||
const std::vector<FVoxelTileKey>& DesiredTiles,bool bInDropOneShell)
|
||||
:World(InWorld),Shape(InShape),bDropOneShell(bInDropOneShell)
|
||||
{
|
||||
@@ -257,7 +259,7 @@ private:
|
||||
|
||||
void BuildConnectorSamples(const std::vector<FVoxelTileKey>& DesiredTiles)
|
||||
{
|
||||
const auto& Connectors=Shape.GetFarConnectorSegments();
|
||||
const auto Connectors=Shape.farConnectorSegments();
|
||||
ConnectorInView.assign(Connectors.size(),0);
|
||||
ConnectorHasSamples.assign(Connectors.size(),0);
|
||||
ConnectorHasGoodSample.assign(Connectors.size(),0);
|
||||
@@ -267,9 +269,10 @@ private:
|
||||
for(size_t I=0;I<Connectors.size();++I)
|
||||
{
|
||||
const auto& Connector=Connectors[I];
|
||||
const V3 A=ToV3(Connector.Start),B=ToV3(Connector.End);
|
||||
const V3 A{static_cast<float>(Connector.start.x),static_cast<float>(Connector.start.y),static_cast<float>(Connector.start.z)};
|
||||
const V3 B{static_cast<float>(Connector.end.x),static_cast<float>(Connector.end.y),static_cast<float>(Connector.end.z)};
|
||||
const V3 Delta=Sub(B,A);const float Length=LengthV(Delta);
|
||||
if(Length<=2.0f*Connector.Radius)continue;
|
||||
if(Length<=2.0f*Connector.radius)continue;
|
||||
const V3 Axis=MulV(Delta,1.0f/Length);
|
||||
V3 U=Cross(Axis,{0,0,1});
|
||||
if(LengthV(U)<0.1f)U=Cross(Axis,{0,1,0});
|
||||
@@ -286,12 +289,12 @@ private:
|
||||
bInsideView=true;
|
||||
uint8 Mask=0;
|
||||
const V3 Directions[4]={U,MulV(U,-1.0f),V,MulV(V,-1.0f)};
|
||||
const double RayLength=Connector.Radius*2.0+32.0;
|
||||
const double RayLength=Connector.radius*2.0+32.0;
|
||||
for(int32 D=0;D<4;++D)
|
||||
if(Contains(Key,AddV(Center,MulV(Directions[D],static_cast<float>(RayLength)))))
|
||||
Mask|=static_cast<uint8>(1u<<D);
|
||||
if(!Mask)continue;
|
||||
ConnectorSamples[Key].push_back({I,Center,U,V,Connector.Radius,Mask});
|
||||
ConnectorSamples[Key].push_back({I,Center,U,V,Connector.radius,Mask});
|
||||
ConnectorHasSamples[I]=1;break;
|
||||
}
|
||||
}
|
||||
@@ -324,20 +327,20 @@ private:
|
||||
std::vector<double> Crossings;
|
||||
if(ZMax<=ZMin)return Crossings;
|
||||
double PreviousZ=ZMin;
|
||||
bool PreviousSolid=Shape.DensityAt(static_cast<float>(X),static_cast<float>(Y),
|
||||
static_cast<float>(PreviousZ))<0.0f;
|
||||
bool PreviousSolid=Shape.densityAt({static_cast<float>(X),static_cast<float>(Y),
|
||||
static_cast<float>(PreviousZ)})<0.0f;
|
||||
for(double Z=std::min(ZMin+Stride,ZMax);Z<=ZMax+1.0e-6;Z=std::min(Z+Stride,ZMax))
|
||||
{
|
||||
const bool Solid=Shape.DensityAt(static_cast<float>(X),static_cast<float>(Y),
|
||||
static_cast<float>(Z))<0.0f;
|
||||
const bool Solid=Shape.densityAt({static_cast<float>(X),static_cast<float>(Y),
|
||||
static_cast<float>(Z)})<0.0f;
|
||||
if(Solid!=PreviousSolid)
|
||||
{
|
||||
double Lo=PreviousZ,Hi=Z;const bool LoSolid=PreviousSolid;
|
||||
for(int32 I=0;I<6;++I)
|
||||
{
|
||||
const double Mid=(Lo+Hi)*0.5;
|
||||
const bool MidSolid=Shape.DensityAt(static_cast<float>(X),static_cast<float>(Y),
|
||||
static_cast<float>(Mid))<0.0f;
|
||||
const bool MidSolid=Shape.densityAt({static_cast<float>(X),static_cast<float>(Y),
|
||||
static_cast<float>(Mid)})<0.0f;
|
||||
if(MidSolid==LoSolid)Lo=Mid;else Hi=Mid;
|
||||
}
|
||||
Crossings.push_back((Lo+Hi)*0.5);
|
||||
@@ -451,12 +454,12 @@ private:
|
||||
{
|
||||
std::vector<double> Crossings;
|
||||
double PreviousDistance=0.0;
|
||||
bool PreviousSolid=Shape.DensityAt(Start.X,Start.Y,Start.Z)<0.0f;
|
||||
bool PreviousSolid=Shape.densityAt({Start.X,Start.Y,Start.Z})<0.0f;
|
||||
constexpr double Stride=2.0;
|
||||
for(double Distance=Stride;Distance<=Length+1.0e-6;Distance=std::min(Distance+Stride,Length))
|
||||
{
|
||||
const V3 P=AddV(Start,MulV(Direction,static_cast<float>(Distance)));
|
||||
const bool Solid=Shape.DensityAt(P.X,P.Y,P.Z)<0.0f;
|
||||
const bool Solid=Shape.densityAt({P.X,P.Y,P.Z})<0.0f;
|
||||
if(Solid!=PreviousSolid)
|
||||
{
|
||||
double Lo=PreviousDistance,Hi=Distance;
|
||||
@@ -464,7 +467,7 @@ private:
|
||||
{
|
||||
const double Mid=(Lo+Hi)*0.5;
|
||||
const V3 M=AddV(Start,MulV(Direction,static_cast<float>(Mid)));
|
||||
const bool MidSolid=Shape.DensityAt(M.X,M.Y,M.Z)<0.0f;
|
||||
const bool MidSolid=Shape.densityAt({M.X,M.Y,M.Z})<0.0f;
|
||||
if(MidSolid==PreviousSolid)Lo=Mid;else Hi=Mid;
|
||||
}
|
||||
Crossings.push_back((Lo+Hi)*0.5);
|
||||
@@ -511,7 +514,7 @@ private:
|
||||
}
|
||||
|
||||
FStandaloneOwnerWorld& World;
|
||||
const FStandaloneShapeWorld& Shape;
|
||||
const VoxelForgeCore::World& Shape;
|
||||
static constexpr int32 AuditMinLevel=6;
|
||||
bool bDropOneShell=false,bCorruptionApplied=false;
|
||||
std::vector<FBoundary> Boundaries;
|
||||
|
||||
Reference in new issue
Block a user