3D Caching for procedural streams

This commit is contained in:
Daniel Mills 2021-08-02 01:13:07 -04:00
parent 0d90c1d960
commit 93675d90bb
2 changed files with 64 additions and 0 deletions

View File

@ -262,6 +262,10 @@ public interface ProceduralStream<T> extends ProceduralLayer, Interpolated<T> {
return new CachedStream2D<T>(this, maxSize);
}
default ProceduralStream<T> cache3D(int maxSize) {
return new CachedStream3D<T>(this, maxSize);
}
default <V> ProceduralStream<V> convert(Function<T, V> converter) {
return new ConversionStream<T, V>(this, converter);
}

View File

@ -0,0 +1,60 @@
/*
* Iris is a World Generator for Minecraft Bukkit Servers
* Copyright (c) 2021 Arcane Arts (Volmit Software)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.volmit.iris.engine.stream.utility;
import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap;
import com.volmit.iris.engine.cache.Cache;
import com.volmit.iris.engine.stream.BasicStream;
import com.volmit.iris.engine.stream.ProceduralStream;
import com.volmit.iris.util.math.BlockPosition;
public class CachedStream3D<T> extends BasicStream<T> implements ProceduralStream<T> {
private final ProceduralStream<T> stream;
private final ConcurrentLinkedHashMap<BlockPosition, T> cache;
public CachedStream3D(ProceduralStream<T> stream, int size) {
super();
this.stream = stream;
cache = new ConcurrentLinkedHashMap.Builder<BlockPosition, T>()
.initialCapacity(size)
.maximumWeightedCapacity(size)
.concurrencyLevel(32)
.build();
}
@Override
public double toDouble(T t) {
return stream.toDouble(t);
}
@Override
public T fromDouble(double d) {
return stream.fromDouble(d);
}
@Override
public T get(double x, double z) {
return cache.compute(new BlockPosition((int)x, -1, (int)z), (k, v) -> v != null ? v : stream.get((int) x, (int) z));
}
@Override
public T get(double x, double y, double z) {
return cache.compute(new BlockPosition((int)x, (int)y, (int)z), (k, v) -> v != null ? v : stream.get((int) x, (int) y, (int) z));
}
}