Skip to content

Commit

Permalink
fix direct triggering and rename from angle triggering,
Browse files Browse the repository at this point in the history
add distance based direct triggering for close sections,
simplify section triggering to avoid return value
WIP: see GFNI doc comment
  • Loading branch information
douira committed Oct 26, 2023
1 parent 6a1047e commit 1099eb9
Show file tree
Hide file tree
Showing 6 changed files with 229 additions and 146 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -344,11 +344,10 @@ public void setPendingUpdate(@Nullable ChunkUpdateType type) {
this.pendingUpdateType = type;
}

public boolean prepareTrigger(boolean isAngleTrigger) {
if (this.translucentData != null) {
return this.translucentData.prepareTrigger(isAngleTrigger);
}
return false;
public void prepareTrigger(boolean isAngleTrigger) {

this.translucentData.prepareTrigger(isAngleTrigger);

}

public int getLastUploadFrame() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -492,7 +492,7 @@ public int getVisibleChunkCount() {
return sections;
}

public boolean scheduleSort(long sectionPos, boolean isAngleTrigger) {
public void scheduleSort(long sectionPos, boolean isAngleTrigger) {
// TODO: Does this need to invalidate the section cache?

RenderSection section = this.sectionByPosition.get(sectionPos);
Expand All @@ -505,13 +505,9 @@ public boolean scheduleSort(long sectionPos, boolean isAngleTrigger) {
pendingUpdate = ChunkUpdateType.getPromotionUpdateType(section.getPendingUpdate(), pendingUpdate);
if (pendingUpdate != null) {
section.setPendingUpdate(pendingUpdate);
return section.prepareTrigger(isAngleTrigger);
section.prepareTrigger(isAngleTrigger);
}
} else {
// remove unloaded sections from triggering
return true;
}
return false;
}

public void scheduleRebuild(int x, int y, int z, boolean important) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,11 @@
public class DynamicData extends MixedDirectionData {
private final TQuad[] quads;
boolean GFNITrigger = true;
boolean angleTrigger = false;
boolean turnAngleTriggerOn = false;
boolean directTrigger = false;
boolean turnGFNITriggerOff = false;
boolean turnDirectTriggerOn = false;
boolean turnDirectTriggerOff = false;
double directTriggerKey = -1;
private int consecutiveTopoSortFailures = 0;
private boolean pendingTriggerIsAngle;
private TranslucentGeometryCollector collector;
Expand All @@ -26,6 +28,8 @@ public class DynamicData extends MixedDirectionData {
private static final int MAX_TOPO_SORT_TIME_NS = 1_000_000;
private static final int MAX_FAILING_TOPO_SORT_TIME_NS = 750_000;
private static final int MAX_TOPO_SORT_PATIENT_TIME_NS = 250_000;
private static final int PATIENT_TOPO_ATTEMPTS = 5;
private static final int REGULAR_TOPO_ATTEMPTS = 2;

DynamicData(ChunkSectionPos sectionPos,
NativeBuffer buffer, VertexRange range, TQuad[] quads,
Expand All @@ -43,15 +47,8 @@ public SortType getSortType() {
}

@Override
public boolean prepareTrigger(boolean isAngleTrigger) {
// if an angle trigger was scheduled but isn't needed, return true to signal
// removal from angle triggering
if (isAngleTrigger && !this.angleTrigger) {
return true;
}

public void prepareTrigger(boolean isAngleTrigger) {
this.pendingTriggerIsAngle = isAngleTrigger;
return false;
}

@Override
Expand All @@ -66,20 +63,31 @@ private void turnGFNITriggerOff() {
}
}

private void turnAngleTriggerOn() {
if (!this.angleTrigger) {
this.angleTrigger = true;
this.turnAngleTriggerOn = true;
private void turnDirectTriggerOn() {
if (!this.directTrigger) {
this.directTrigger = true;
this.turnDirectTriggerOn = true;
}
}

private void turnDirectTriggerOff() {
if (this.directTrigger) {
this.directTrigger = false;
this.turnDirectTriggerOff = true;
}
}

private static int getAttemptsForTime(long ns) {
return ns <= MAX_TOPO_SORT_PATIENT_TIME_NS ? PATIENT_TOPO_ATTEMPTS : REGULAR_TOPO_ATTEMPTS;
}

private void sort(Vector3fc cameraPos, boolean isAngleTrigger) {
// uses a topo sort or a distance sort depending on what is enabled
IntBuffer indexBuffer = this.buffer.getDirectBuffer().asIntBuffer();

if (this.quads.length > MAX_TOPO_SORT_QUADS) {
turnGFNITriggerOff();
turnAngleTriggerOn();
turnDirectTriggerOn();
}

if (this.GFNITrigger && !isAngleTrigger) {
Expand All @@ -96,13 +104,12 @@ private void sort(Vector3fc cameraPos, boolean isAngleTrigger) {
? MAX_FAILING_TOPO_SORT_TIME_NS
: MAX_TOPO_SORT_TIME_NS)) {
turnGFNITriggerOff();
turnAngleTriggerOn();
turnDirectTriggerOn();
}

if (result) {
// disable distance sorting because topo sort seems to be possible.
// removal from angle triggering happens automatically by setting this to false.
this.angleTrigger = false;
turnDirectTriggerOff();
this.consecutiveTopoSortFailures = 0;
return;
} else {
Expand All @@ -112,26 +119,27 @@ private void sort(Vector3fc cameraPos, boolean isAngleTrigger) {
// topo sort on while the angle triggering is also active to maybe get a topo
// sort success from a different angle.
this.consecutiveTopoSortFailures++;
if (this.consecutiveTopoSortFailures >= (sortTime <= MAX_TOPO_SORT_PATIENT_TIME_NS ? 5 : 2)) {
if (this.consecutiveTopoSortFailures >= getAttemptsForTime(sortTime)) {
turnGFNITriggerOff();
}
turnAngleTriggerOn();
turnDirectTriggerOn();
}
}
if (this.angleTrigger) {
if (this.directTrigger) {
indexBuffer.rewind();
ComplexSorting.distanceSortDirect(indexBuffer, this.quads, cameraPos);
return;
}
}

public void clearTriggerChanges() {
this.turnAngleTriggerOn = false;
this.turnGFNITriggerOff = false;
this.turnDirectTriggerOn = false;
this.turnDirectTriggerOff = false;
}

public boolean hasTriggerChanges() {
return this.turnAngleTriggerOn || this.turnGFNITriggerOff;
return this.turnGFNITriggerOff || this.turnDirectTriggerOn || this.turnDirectTriggerOff;
}

TranslucentGeometryCollector getCollector() {
Expand Down
Loading

0 comments on commit 1099eb9

Please sign in to comment.