Measure per-feature ore parity
This commit is contained in:
parent
a24ffb98f3
commit
8e73993adf
2 changed files with 99 additions and 0 deletions
|
|
@ -232,6 +232,98 @@ func TestRegionOreBiomeOrderDiagnostic(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRegionOreFeatureContributionDiagnostic(t *testing.T) {
|
||||||
|
if os.Getenv("REGIONIO_ORE_FEATURE_DIAGNOSTIC") != "1" {
|
||||||
|
t.Skip("set REGIONIO_ORE_FEATURE_DIAGNOSTIC=1 to measure individual ore features")
|
||||||
|
}
|
||||||
|
fixtures, seed := loadOreFixtureChunks(t)
|
||||||
|
od, err := worldgen.LoadOverworldFinalDensity(seed)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
fluidPicker := worldgen.OverworldFluidPicker(od.SeaLevel)
|
||||||
|
veins := worldgen.NewOreVeinifier(od)
|
||||||
|
carver, err := worldgen.NewCarver(od, seed)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
initCarverReplaceable(carver.ReplaceableBlocks())
|
||||||
|
set := mustFeatureSet(t)
|
||||||
|
steps, err := set.FeatureSteps(possibleBiomeOrder())
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
for featureIndex, feature := range steps[undergroundOresStage] {
|
||||||
|
placed := set.Placed[feature]
|
||||||
|
if set.Configured[placed.Feature].Type != "minecraft:ore" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
generated := make(map[uint16]int)
|
||||||
|
matching := make(map[uint16]int)
|
||||||
|
columnMatching := make(map[uint16]int)
|
||||||
|
for _, fixture := range fixtures {
|
||||||
|
var chunks []*Chunk
|
||||||
|
for cx := fixture.x - 1; cx <= fixture.x+1; cx++ {
|
||||||
|
for cz := fixture.z - 1; cz <= fixture.z+1; cz++ {
|
||||||
|
chunks = append(chunks, generateVanillaWithoutDecoration(od, fluidPicker, veins, carver, seed, cx, cz))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
region, err := newDecorationRegion(chunks)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if err := region.setSource(fixture.x, fixture.z); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
chunk := region.chunks[[2]int32{fixture.x, fixture.z}]
|
||||||
|
base := make([]uint16, len(fixture.blocks))
|
||||||
|
for index := range base {
|
||||||
|
y := MinY + index/(16*16)
|
||||||
|
column := index % (16 * 16)
|
||||||
|
z, x := column/16, column%16
|
||||||
|
base[index] = chunk.GetBlock(x, y, z)
|
||||||
|
}
|
||||||
|
if err := region.placeScheduledOresFiltered(seed, possibleBiomeOrder(), 0, map[string]bool{feature: true}); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
vanillaColumns := make(map[[3]int]bool)
|
||||||
|
for index, state := range fixture.blocks {
|
||||||
|
column := index % (16 * 16)
|
||||||
|
z, x := column/16, column%16
|
||||||
|
vanillaColumns[[3]int{int(state), x, z}] = true
|
||||||
|
}
|
||||||
|
for index, want := range fixture.blocks {
|
||||||
|
y := MinY + index/(16*16)
|
||||||
|
column := index % (16 * 16)
|
||||||
|
z, x := column/16, column%16
|
||||||
|
got := chunk.GetBlock(x, y, z)
|
||||||
|
if got != base[index] {
|
||||||
|
generated[got]++
|
||||||
|
if got == want {
|
||||||
|
matching[got]++
|
||||||
|
}
|
||||||
|
if vanillaColumns[[3]int{int(got), x, z}] {
|
||||||
|
columnMatching[got]++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var total, exact, columns, oreTotal, oreExact, oreColumns int
|
||||||
|
for state, count := range generated {
|
||||||
|
total += count
|
||||||
|
exact += matching[state]
|
||||||
|
columns += columnMatching[state]
|
||||||
|
if isOreState(state) {
|
||||||
|
oreTotal += count
|
||||||
|
oreExact += matching[state]
|
||||||
|
oreColumns += columnMatching[state]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
t.Logf("%s index=%d changed=%d exact=%d same_column=%d generated_ore=%d ore_exact=%d ore_same_column=%d",
|
||||||
|
feature, featureIndex, total, exact, columns, oreTotal, oreExact, oreColumns)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type oreFixtureChunk struct {
|
type oreFixtureChunk struct {
|
||||||
x, z int32
|
x, z int32
|
||||||
blocks []uint16
|
blocks []uint16
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,10 @@ func (r *decorationRegion) placeScheduledOresAtOffset(seed int64, featureIndexOf
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *decorationRegion) placeScheduledOresWithOrder(seed int64, biomeOrder []string, featureIndexOffset int) error {
|
func (r *decorationRegion) placeScheduledOresWithOrder(seed int64, biomeOrder []string, featureIndexOffset int) error {
|
||||||
|
return r.placeScheduledOresFiltered(seed, biomeOrder, featureIndexOffset, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *decorationRegion) placeScheduledOresFiltered(seed int64, biomeOrder []string, featureIndexOffset int, include map[string]bool) error {
|
||||||
set, err := worldgen.LoadFeatureSet()
|
set, err := worldgen.LoadFeatureSet()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -25,6 +29,9 @@ func (r *decorationRegion) placeScheduledOresWithOrder(seed int64, biomeOrder []
|
||||||
random, decorationSeed := worldgen.DecorationRandom(seed, int(r.sourceX), int(r.sourceZ))
|
random, decorationSeed := worldgen.DecorationRandom(seed, int(r.sourceX), int(r.sourceZ))
|
||||||
origin := worldgen.FeaturePosition{X: int(r.sourceX) << 4, Y: MinY, Z: int(r.sourceZ) << 4}
|
origin := worldgen.FeaturePosition{X: int(r.sourceX) << 4, Y: MinY, Z: int(r.sourceZ) << 4}
|
||||||
for _, scheduled := range schedule {
|
for _, scheduled := range schedule {
|
||||||
|
if include != nil && !include[scheduled.Name] {
|
||||||
|
continue
|
||||||
|
}
|
||||||
placed := set.Placed[scheduled.Name]
|
placed := set.Placed[scheduled.Name]
|
||||||
configured := set.Configured[placed.Feature]
|
configured := set.Configured[placed.Feature]
|
||||||
if configured.Type != "minecraft:ore" {
|
if configured.Type != "minecraft:ore" {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue