I've had it with LowOverheadCaches

Benchmarking showed that using LOC gave a whopping 5% speed advantage at
the cost of terrible readability. In the worst case. Decided that having
clear, laconic and Java-style code is worth the drop in performance.
This commit is contained in:
OLEGSHA 2020-11-27 23:54:41 +03:00
parent 44de6a86f7
commit 2d322e83bc
29 changed files with 151 additions and 362 deletions

View File

@ -23,7 +23,6 @@ import glm.vec._2.Vec2;
import glm.vec._3.Vec3; import glm.vec._3.Vec3;
import ru.windcorp.progressia.client.graphics.model.ShapeRenderProgram.VertexBuilder; import ru.windcorp.progressia.client.graphics.model.ShapeRenderProgram.VertexBuilder;
import ru.windcorp.progressia.client.graphics.texture.Texture; import ru.windcorp.progressia.client.graphics.texture.Texture;
import ru.windcorp.progressia.common.util.Vectors;
import ru.windcorp.progressia.common.world.block.BlockFace; import ru.windcorp.progressia.common.world.block.BlockFace;
public class Faces { public class Faces {
@ -41,47 +40,37 @@ public class Faces {
) { ) {
VertexBuilder builder = program.getVertexBuilder(); VertexBuilder builder = program.getVertexBuilder();
Vec3 pos = Vectors.grab3(); builder.addVertex(
Vec2 texCoords = Vectors.grab2(); origin,
colorMultiplier,
new Vec2(0, 0)
).addVertex(
origin.add_(height),
colorMultiplier,
new Vec2(0, 1)
).addVertex(
origin.add_(width),
colorMultiplier,
new Vec2(1, 0)
).addVertex(
origin.add_(width).add(height),
colorMultiplier,
new Vec2(1, 1)
);
try { ShortBuffer buffer = flip ? ShortBuffer.wrap(new short[] {
0, 1, 3,
0, 3, 2
}) : ShortBuffer.wrap(new short[] {
3, 1, 0,
2, 3, 0
});
builder.addVertex( return new Face(
origin, texture,
colorMultiplier, builder.assemble(),
texCoords.set(0, 0) buffer
).addVertex( );
pos.set(origin).add(height),
colorMultiplier,
texCoords.set(0, 1)
).addVertex(
pos.set(origin).add(width),
colorMultiplier,
texCoords.set(1, 0)
).addVertex(
pos.add(height),
colorMultiplier,
texCoords.set(1, 1)
);
ShortBuffer buffer = flip ? ShortBuffer.wrap(new short[] {
0, 1, 3,
0, 3, 2
}) : ShortBuffer.wrap(new short[] {
3, 1, 0,
2, 3, 0
});
return new Face(
texture,
builder.assemble(),
buffer
);
} finally {
Vectors.release(pos);
Vectors.release(texCoords);
}
} }
public static Face createBlockFace( public static Face createBlockFace(
@ -94,22 +83,15 @@ public class Faces {
) { ) {
BlockFaceVectors vectors = BlockFaceVectors.get(inner); BlockFaceVectors vectors = BlockFaceVectors.get(inner);
Vec3 origin = Vec3 origin = blockCenter.add_(vectors.getOrigin(face));
Vectors.grab3().set(blockCenter).add(vectors.getOrigin(face)); Vec3 width = vectors.getWidth(face);
try { Vec3 height = vectors.getHeight(face);
Vec3 width = vectors.getWidth(face); return createRectangle(
Vec3 height = vectors.getHeight(face); program, texture, colorMultiplier,
origin, width, height,
return createRectangle( inner
program, texture, colorMultiplier, );
origin, width, height,
inner
);
} finally {
Vectors.release(origin);
}
} }
} }

View File

@ -22,7 +22,6 @@ import java.util.Map;
import glm.vec._3.Vec3; import glm.vec._3.Vec3;
import ru.windcorp.progressia.client.graphics.backend.Usage; import ru.windcorp.progressia.client.graphics.backend.Usage;
import ru.windcorp.progressia.client.graphics.texture.Texture; import ru.windcorp.progressia.client.graphics.texture.Texture;
import ru.windcorp.progressia.common.util.Vectors;
import ru.windcorp.progressia.common.world.block.BlockFace; import ru.windcorp.progressia.common.world.block.BlockFace;
public class Shapes { public class Shapes {
@ -48,14 +47,11 @@ public class Shapes {
boolean flip boolean flip
) { ) {
Vec3 faceOrigin = Vectors.grab3();
Vec3 faceWidth = Vectors.grab3();
Face top = Faces.createRectangle( Face top = Faces.createRectangle(
program, program,
topTexture, colorMultiplier, topTexture, colorMultiplier,
faceOrigin.set(origin).add(height).add(width), origin.add_(height).add(width),
faceWidth.set(width).negate(), width.negate_(),
depth, depth,
flip flip
); );
@ -72,7 +68,7 @@ public class Shapes {
Face north = Faces.createRectangle( Face north = Faces.createRectangle(
program, program,
northTexture, colorMultiplier, northTexture, colorMultiplier,
faceOrigin.set(origin).add(depth), origin.add_(depth),
width, width,
height, height,
flip flip
@ -81,8 +77,8 @@ public class Shapes {
Face south = Faces.createRectangle( Face south = Faces.createRectangle(
program, program,
southTexture, colorMultiplier, southTexture, colorMultiplier,
faceOrigin.set(origin).add(width), origin.add_(width),
faceWidth.set(width).negate(), width.negate_(),
height, height,
flip flip
); );
@ -99,8 +95,8 @@ public class Shapes {
Face west = Faces.createRectangle( Face west = Faces.createRectangle(
program, program,
westTexture, colorMultiplier, westTexture, colorMultiplier,
faceOrigin.set(origin).add(width).add(depth), origin.add_(width).add(depth),
faceWidth.set(depth).negate(), depth.negate_(),
height, height,
flip flip
); );
@ -111,9 +107,6 @@ public class Shapes {
top, bottom, north, south, east, west top, bottom, north, south, east, west
); );
Vectors.release(faceOrigin);
Vectors.release(faceWidth);
return result; return result;
} }

View File

@ -28,7 +28,6 @@ import glm.mat._4.Mat4;
import glm.vec._3.Vec3; import glm.vec._3.Vec3;
import ru.windcorp.progressia.client.graphics.backend.GraphicsInterface; import ru.windcorp.progressia.client.graphics.backend.GraphicsInterface;
import ru.windcorp.progressia.client.graphics.world.Camera.Anchor.Mode; import ru.windcorp.progressia.client.graphics.world.Camera.Anchor.Mode;
import ru.windcorp.progressia.common.util.Vectors;
public class Camera { public class Camera {
@ -133,14 +132,12 @@ public class Camera {
Mat4 matrix = helper.pushViewTransform(); Mat4 matrix = helper.pushViewTransform();
Vec3 offset = Vectors.grab3(); Vec3 offset = new Vec3();
mode.getCameraOffset(offset); mode.getCameraOffset(offset);
offset.negate(); offset.negate();
matrix.translate(offset); matrix.translate(offset);
Vectors.release(offset);
mode.applyCameraRotation(matrix); mode.applyCameraRotation(matrix);
} }
@ -168,15 +165,12 @@ public class Camera {
} }
private void applyPosition(WorldRenderHelper helper) { private void applyPosition(WorldRenderHelper helper) {
Vec3 v = Vectors.grab3(); Vec3 v = new Vec3();
anchor.getCameraPosition(v); anchor.getCameraPosition(v);
this.lastAnchorPosition.set(v); this.lastAnchorPosition.set(v);
v.negate(); v.negate();
helper.pushViewTransform().translate(v); helper.pushViewTransform().translate(v);
Vectors.release(v);
} }
private void cacheCameraTransform(WorldRenderHelper helper) { private void cacheCameraTransform(WorldRenderHelper helper) {

View File

@ -4,7 +4,6 @@ import glm.vec._2.Vec2;
import glm.vec._3.Vec3; import glm.vec._3.Vec3;
import glm.vec._3.i.Vec3i; import glm.vec._3.i.Vec3i;
import ru.windcorp.progressia.client.world.WorldRender; import ru.windcorp.progressia.client.world.WorldRender;
import ru.windcorp.progressia.common.util.Vectors;
import ru.windcorp.progressia.common.world.BlockRay; import ru.windcorp.progressia.common.world.BlockRay;
import ru.windcorp.progressia.common.world.block.BlockFace; import ru.windcorp.progressia.common.world.block.BlockFace;
import ru.windcorp.progressia.common.world.entity.EntityData; import ru.windcorp.progressia.common.world.entity.EntityData;
@ -21,8 +20,8 @@ public class Selection {
private BlockRay ray = new BlockRay(); private BlockRay ray = new BlockRay();
public void update(WorldRender world, EntityData player) { public void update(WorldRender world, EntityData player) {
Vec3 direction = Vectors.grab3(); Vec3 direction = new Vec3();
Vec3 start = Vectors.grab3(); Vec3 start = new Vec3();
player.getLookingAtVector(direction); player.getLookingAtVector(direction);
world.getEntityRenderable(player).getViewPoint(start); world.getEntityRenderable(player).getViewPoint(start);
@ -44,9 +43,6 @@ public class Selection {
} }
ray.end(); ray.end();
Vectors.release(direction);
Vectors.release(start);
} }
public Vec3i getBlock() { public Vec3i getBlock() {

View File

@ -38,7 +38,6 @@ import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizerSupplier;
import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizers; import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizers;
import ru.windcorp.progressia.client.world.tile.TileRender; import ru.windcorp.progressia.client.world.tile.TileRender;
import ru.windcorp.progressia.client.world.tile.TileRenderRegistry; import ru.windcorp.progressia.client.world.tile.TileRenderRegistry;
import ru.windcorp.progressia.common.util.Vectors;
import ru.windcorp.progressia.common.world.ChunkData; import ru.windcorp.progressia.common.world.ChunkData;
import ru.windcorp.progressia.common.world.block.BlockFace; import ru.windcorp.progressia.common.world.block.BlockFace;
import ru.windcorp.progressia.common.world.tile.TileData; import ru.windcorp.progressia.common.world.tile.TileData;
@ -216,16 +215,13 @@ public class ChunkRender {
) { ) {
// TODO implement // TODO implement
Vec3 pos = Vectors.grab3().set(cursor.x, cursor.y, cursor.z); Vec3 pos = new Vec3(cursor.x, cursor.y, cursor.z);
optimizers.forEach(cro -> cro.processTile(tile, cursor, face)); optimizers.forEach(cro -> cro.processTile(tile, cursor, face));
if (!tile.needsOwnRenderable()) { if (!tile.needsOwnRenderable()) return;
Vectors.release(pos);
return;
}
Vec3 offset = Vectors.grab3().set( Vec3 offset = new Vec3(
face.getVector().x, face.getVector().y, face.getVector().z face.getVector().x, face.getVector().y, face.getVector().z
); );
@ -235,9 +231,6 @@ public class ChunkRender {
tile.createRenderable(face), tile.createRenderable(face),
new Mat4().identity().translate(pos) new Mat4().identity().translate(pos)
); );
Vectors.release(pos);
Vectors.release(offset);
} }
} }

View File

@ -36,7 +36,6 @@ import ru.windcorp.progressia.client.graphics.world.WorldRenderProgram;
import ru.windcorp.progressia.client.world.ChunkRender; import ru.windcorp.progressia.client.world.ChunkRender;
import ru.windcorp.progressia.client.world.block.BlockRender; import ru.windcorp.progressia.client.world.block.BlockRender;
import ru.windcorp.progressia.client.world.tile.TileRender; import ru.windcorp.progressia.client.world.tile.TileRender;
import ru.windcorp.progressia.common.util.Vectors;
import ru.windcorp.progressia.common.world.block.BlockFace; import ru.windcorp.progressia.common.world.block.BlockFace;
public class ChunkRenderOptimizerCube extends ChunkRenderOptimizer { public class ChunkRenderOptimizerCube extends ChunkRenderOptimizer {
@ -173,16 +172,11 @@ public class ChunkRenderOptimizerCube extends ChunkRenderOptimizer {
Vec3i cursor, Vec3i cursor,
Consumer<Face> output Consumer<Face> output
) { ) {
Vec3 faceOrigin = Vectors.grab3();
Vec3 offset = Vectors.grab3();
for (BlockFace face : BlockFace.getFaces()) { for (BlockFace face : BlockFace.getFaces()) {
if (!shouldRenderOuterFace(cursor, face)) continue; if (!shouldRenderOuterFace(cursor, face)) continue;
faceOrigin.set(cursor.x, cursor.y, cursor.z); Vec3 faceOrigin = new Vec3(cursor.x, cursor.y, cursor.z);
offset Vec3 offset = new Vec3(face.getVector().x, face.getVector().y, face.getVector().z).mul(1f / 128);
.set(face.getVector().x, face.getVector().y, face.getVector().z)
.mul(1f / 128);
FaceInfo info = getFace(cursor, face); FaceInfo info = getFace(cursor, face);
@ -215,9 +209,6 @@ public class ChunkRenderOptimizerCube extends ChunkRenderOptimizer {
faceOrigin.add(offset); faceOrigin.add(offset);
} }
} }
Vectors.release(offset);
Vectors.release(faceOrigin);
} }
private void addFace( private void addFace(

View File

@ -14,8 +14,6 @@ import ru.windcorp.progressia.client.graphics.backend.GraphicsInterface;
import ru.windcorp.progressia.client.graphics.model.Renderable; import ru.windcorp.progressia.client.graphics.model.Renderable;
import ru.windcorp.progressia.client.graphics.model.ShapeRenderHelper; import ru.windcorp.progressia.client.graphics.model.ShapeRenderHelper;
import ru.windcorp.progressia.common.Units; import ru.windcorp.progressia.common.Units;
import ru.windcorp.progressia.common.util.Matrices;
import ru.windcorp.progressia.common.util.Vectors;
import ru.windcorp.progressia.common.world.entity.EntityData; import ru.windcorp.progressia.common.world.entity.EntityData;
public abstract class NPedModel extends EntityRenderable { public abstract class NPedModel extends EntityRenderable {
@ -162,8 +160,7 @@ public abstract class NPedModel extends EntityRenderable {
} }
private void accountForVelocity() { private void accountForVelocity() {
Vec3 horizontal = Vectors.grab3(); Vec3 horizontal = new Vec3(getData().getVelocity());
horizontal.set(getData().getVelocity());
horizontal.z = 0; horizontal.z = 0;
velocity = horizontal.length(); velocity = horizontal.length();
@ -176,7 +173,6 @@ public abstract class NPedModel extends EntityRenderable {
bodyYaw += velocityParameter * normalizeAngle( bodyYaw += velocityParameter * normalizeAngle(
(float) (atan2(horizontal.y, horizontal.x) - bodyYaw) (float) (atan2(horizontal.y, horizontal.x) - bodyYaw)
) * min(1, GraphicsInterface.getFrameLength() * 10); ) * min(1, GraphicsInterface.getFrameLength() * 10);
Vectors.release(horizontal);
} }
private void evaluateVelocityCoeff() { private void evaluateVelocityCoeff() {
@ -189,8 +185,8 @@ public abstract class NPedModel extends EntityRenderable {
@Override @Override
public void getViewPoint(Vec3 output) { public void getViewPoint(Vec3 output) {
Mat4 m = Matrices.grab4(); Mat4 m = new Mat4();
Vec4 v = Vectors.grab4(); Vec4 v = new Vec4();
m.identity() m.identity()
.scale(scale) .scale(scale)
@ -203,9 +199,6 @@ public abstract class NPedModel extends EntityRenderable {
m.mul(v); m.mul(v);
output.set(v.x, v.y, v.z); output.set(v.x, v.y, v.z);
Vectors.release(v);
Matrices.release(m);
} }
public Body getBody() { public Body getBody() {

View File

@ -9,7 +9,6 @@ import ru.windcorp.progressia.client.graphics.model.Renderable;
import ru.windcorp.progressia.client.graphics.texture.Texture; import ru.windcorp.progressia.client.graphics.texture.Texture;
import ru.windcorp.progressia.client.graphics.world.WorldRenderProgram; import ru.windcorp.progressia.client.graphics.world.WorldRenderProgram;
import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizerCube.OpaqueTile; import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizerCube.OpaqueTile;
import ru.windcorp.progressia.common.util.Vectors;
import ru.windcorp.progressia.common.world.block.BlockFace; import ru.windcorp.progressia.common.world.block.BlockFace;
public class TileRenderGrass extends TileRender implements OpaqueTile { public class TileRenderGrass extends TileRender implements OpaqueTile {
@ -40,21 +39,13 @@ public class TileRenderGrass extends TileRender implements OpaqueTile {
public Renderable createRenderable(BlockFace face) { public Renderable createRenderable(BlockFace face) {
ShapeRenderProgram program = WorldRenderProgram.getDefault(); ShapeRenderProgram program = WorldRenderProgram.getDefault();
Vec3 color = Vectors.grab3().set(1, 1, 1); return new Shape(
Vec3 center = Vectors.grab3().set(0, 0, 0); Usage.STATIC, WorldRenderProgram.getDefault(),
Faces.createBlockFace(
try { program, getTexture(face), new Vec3(1, 1, 1),
return new Shape( new Vec3(0, 0, 0), face, false
Usage.STATIC, WorldRenderProgram.getDefault(), )
Faces.createBlockFace( );
program, getTexture(face), color,
center, face, false
)
);
} finally {
Vectors.release(color);
Vectors.release(center);
}
} }
@Override @Override

View File

@ -9,7 +9,6 @@ import ru.windcorp.progressia.client.graphics.model.Renderable;
import ru.windcorp.progressia.client.graphics.texture.Texture; import ru.windcorp.progressia.client.graphics.texture.Texture;
import ru.windcorp.progressia.client.graphics.world.WorldRenderProgram; import ru.windcorp.progressia.client.graphics.world.WorldRenderProgram;
import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizerCube.OpaqueTile; import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizerCube.OpaqueTile;
import ru.windcorp.progressia.common.util.Vectors;
import ru.windcorp.progressia.common.world.block.BlockFace; import ru.windcorp.progressia.common.world.block.BlockFace;
public class TileRenderSimple extends TileRender implements OpaqueTile { public class TileRenderSimple extends TileRender implements OpaqueTile {
@ -35,21 +34,13 @@ public class TileRenderSimple extends TileRender implements OpaqueTile {
public Renderable createRenderable(BlockFace face) { public Renderable createRenderable(BlockFace face) {
ShapeRenderProgram program = WorldRenderProgram.getDefault(); ShapeRenderProgram program = WorldRenderProgram.getDefault();
Vec3 color = Vectors.grab3().set(1, 1, 1); return new Shape(
Vec3 center = Vectors.grab3().set(0, 0, 0); Usage.STATIC, WorldRenderProgram.getDefault(),
Faces.createBlockFace(
try { program, getTexture(face), new Vec3(1, 1, 1),
return new Shape( new Vec3(0, 0, 0), face, false
Usage.STATIC, WorldRenderProgram.getDefault(), )
Faces.createBlockFace( );
program, getTexture(face), color,
center, face, false
)
);
} finally {
Vectors.release(color);
Vectors.release(center);
}
} }
@Override @Override

View File

@ -5,8 +5,7 @@ import glm.mat._4.Mat4;
import glm.mat._4.d.Mat4d; import glm.mat._4.d.Mat4d;
/** /**
* A set of caches for GLM matrix objects. Use this instead of allocating new * A set of caches for GLM matrix objects.
* matrices when the objects are effectively local.
* <p> * <p>
* All {@code grab}bed objects must be {@code release}d as soon as possible. * All {@code grab}bed objects must be {@code release}d as soon as possible.
* Ideally, user code should be: * Ideally, user code should be:

View File

@ -8,8 +8,7 @@ import glm.vec._4.Vec4;
import glm.vec._4.i.Vec4i; import glm.vec._4.i.Vec4i;
/** /**
* A set of caches for GLM vector objects. Use this instead of allocating new * A set of caches for GLM vector objects.
* vectors when the objects are effectively local.
* <p> * <p>
* All {@code grab}bed objects must be {@code release}d as soon as possible. * All {@code grab}bed objects must be {@code release}d as soon as possible.
* Ideally, user code should be: * Ideally, user code should be:

View File

@ -34,7 +34,6 @@ import glm.vec._3.i.Vec3i;
import ru.windcorp.progressia.client.world.tile.TileLocation; import ru.windcorp.progressia.client.world.tile.TileLocation;
import ru.windcorp.progressia.common.util.SizeLimitedList; import ru.windcorp.progressia.common.util.SizeLimitedList;
import ru.windcorp.progressia.common.util.VectorUtil; import ru.windcorp.progressia.common.util.VectorUtil;
import ru.windcorp.progressia.common.util.Vectors;
import ru.windcorp.progressia.common.world.block.BlockData; import ru.windcorp.progressia.common.world.block.BlockData;
import ru.windcorp.progressia.common.world.block.BlockDataRegistry; import ru.windcorp.progressia.common.world.block.BlockDataRegistry;
import ru.windcorp.progressia.common.world.block.BlockFace; import ru.windcorp.progressia.common.world.block.BlockFace;
@ -219,9 +218,7 @@ public class ChunkData {
List<TileData> secondaryList = Lists.reverse(primaryList); List<TileData> secondaryList = Lists.reverse(primaryList);
Vec3i cursor = new Vec3i(blockInChunk.x, blockInChunk.y, blockInChunk.z);
Vec3i cursor = Vectors.grab3i()
.set(blockInChunk.x, blockInChunk.y, blockInChunk.z);
face = face.getPrimaryAndMoveCursor(cursor); face = face.getPrimaryAndMoveCursor(cursor);
setTiles(cursor, face, primaryList); setTiles(cursor, face, primaryList);

View File

@ -60,6 +60,8 @@ public class Coordinates {
Vec3i blockInWorld, Vec3i blockInWorld,
Vec3i output Vec3i output
) { ) {
if (output == null) output = new Vec3i();
output.x = convertInWorldToChunk(blockInWorld.x); output.x = convertInWorldToChunk(blockInWorld.x);
output.y = convertInWorldToChunk(blockInWorld.y); output.y = convertInWorldToChunk(blockInWorld.y);
output.z = convertInWorldToChunk(blockInWorld.z); output.z = convertInWorldToChunk(blockInWorld.z);
@ -94,6 +96,8 @@ public class Coordinates {
Vec3i blockInWorld, Vec3i blockInWorld,
Vec3i output Vec3i output
) { ) {
if (output == null) output = new Vec3i();
output.x = convertInWorldToInChunk(blockInWorld.x); output.x = convertInWorldToInChunk(blockInWorld.x);
output.y = convertInWorldToInChunk(blockInWorld.y); output.y = convertInWorldToInChunk(blockInWorld.y);
output.z = convertInWorldToInChunk(blockInWorld.z); output.z = convertInWorldToInChunk(blockInWorld.z);
@ -130,6 +134,8 @@ public class Coordinates {
Vec3i chunk, Vec3i blockInChunk, Vec3i chunk, Vec3i blockInChunk,
Vec3i output Vec3i output
) { ) {
if (output == null) output = new Vec3i();
output.x = getInWorld(chunk.x, blockInChunk.x); output.x = getInWorld(chunk.x, blockInChunk.x);
output.y = getInWorld(chunk.y, blockInChunk.y); output.y = getInWorld(chunk.y, blockInChunk.y);
output.z = getInWorld(chunk.z, blockInChunk.z); output.z = getInWorld(chunk.z, blockInChunk.z);

View File

@ -27,7 +27,6 @@ import gnu.trove.map.TLongObjectMap;
import gnu.trove.map.hash.TLongObjectHashMap; import gnu.trove.map.hash.TLongObjectHashMap;
import ru.windcorp.progressia.common.collision.CollisionModel; import ru.windcorp.progressia.common.collision.CollisionModel;
import ru.windcorp.progressia.common.util.CoordinatePacker; import ru.windcorp.progressia.common.util.CoordinatePacker;
import ru.windcorp.progressia.common.util.Vectors;
import ru.windcorp.progressia.common.world.block.BlockData; import ru.windcorp.progressia.common.world.block.BlockData;
import ru.windcorp.progressia.common.world.entity.EntityData; import ru.windcorp.progressia.common.world.entity.EntityData;
@ -102,22 +101,14 @@ public class WorldData {
} }
public ChunkData getChunkByBlock(Vec3i blockInWorld) { public ChunkData getChunkByBlock(Vec3i blockInWorld) {
Vec3i chunkPos = Vectors.grab3i(); return getChunk(Coordinates.convertInWorldToChunk(blockInWorld, null));
Coordinates.convertInWorldToChunk(blockInWorld, chunkPos);
ChunkData result = getChunk(chunkPos);
Vectors.release(chunkPos);
return result;
} }
public BlockData getBlock(Vec3i blockInWorld) { public BlockData getBlock(Vec3i blockInWorld) {
ChunkData chunk = getChunkByBlock(blockInWorld); ChunkData chunk = getChunkByBlock(blockInWorld);
if (chunk == null) return null; if (chunk == null) return null;
Vec3i blockInChunk = Vectors.grab3i(); return chunk.getBlock(Coordinates.convertInWorldToInChunk(blockInWorld, null));
Coordinates.convertInWorldToInChunk(blockInWorld, blockInChunk);
BlockData result = chunk.getBlock(blockInChunk);
return result;
} }
public void setBlock(Vec3i blockInWorld, BlockData block, boolean notify) { public void setBlock(Vec3i blockInWorld, BlockData block, boolean notify) {
@ -129,9 +120,7 @@ public class WorldData {
+ "do not belong to a loaded chunk" + "do not belong to a loaded chunk"
); );
Vec3i blockInChunk = Vectors.grab3i(); chunk.setBlock(Coordinates.convertInWorldToInChunk(blockInWorld, null), block, notify);
Coordinates.convertInWorldToInChunk(blockInWorld, blockInChunk);
chunk.setBlock(blockInChunk, block, notify);
} }
public Collection<ChunkData> getChunks() { public Collection<ChunkData> getChunks() {
@ -158,11 +147,7 @@ public class WorldData {
ChunkData chunk = getChunkByBlock(blockInWorld); ChunkData chunk = getChunkByBlock(blockInWorld);
if (chunk == null) return null; if (chunk == null) return null;
Vec3i blockInChunk = Vectors.grab3i(); BlockData block = chunk.getBlock(Coordinates.convertInWorldToInChunk(blockInWorld, null));
Coordinates.convertInWorldToInChunk(blockInWorld, blockInChunk);
BlockData block = chunk.getBlock(blockInChunk);
Vectors.release(blockInChunk);
if (block == null) return null; if (block == null) return null;
return block.getCollisionModel(); return block.getCollisionModel();
} }

View File

@ -5,7 +5,6 @@ import glm.vec._3.Vec3;
import ru.windcorp.progressia.common.collision.Collideable; import ru.windcorp.progressia.common.collision.Collideable;
import ru.windcorp.progressia.common.collision.CollisionModel; import ru.windcorp.progressia.common.collision.CollisionModel;
import ru.windcorp.progressia.common.state.StatefulObject; import ru.windcorp.progressia.common.state.StatefulObject;
import ru.windcorp.progressia.common.util.Vectors;
public class EntityData extends StatefulObject implements Collideable { public class EntityData extends StatefulObject implements Collideable {
@ -29,10 +28,7 @@ public class EntityData extends StatefulObject implements Collideable {
} }
public void setPosition(Vec3 position) { public void setPosition(Vec3 position) {
Vec3 displacement = Vectors.grab3(); move(position.sub_(getPosition()));
displacement.set(position).sub(getPosition());
move(displacement);
Vectors.release(displacement);
} }
public void move(Vec3 displacement) { public void move(Vec3 displacement) {

View File

@ -12,7 +12,6 @@ import com.google.common.collect.Lists;
import glm.vec._3.i.Vec3i; import glm.vec._3.i.Vec3i;
import ru.windcorp.progressia.client.world.tile.TileLocation; import ru.windcorp.progressia.client.world.tile.TileLocation;
import ru.windcorp.progressia.common.util.Vectors;
import ru.windcorp.progressia.common.world.ChunkData; import ru.windcorp.progressia.common.world.ChunkData;
import ru.windcorp.progressia.common.world.Coordinates; import ru.windcorp.progressia.common.world.Coordinates;
import ru.windcorp.progressia.common.world.block.BlockFace; import ru.windcorp.progressia.common.world.block.BlockFace;
@ -53,12 +52,10 @@ public class ChunkLogic {
BlockLogic block = getBlock(blockInChunk); BlockLogic block = getBlock(blockInChunk);
if (block instanceof TickableBlock) { if (block instanceof TickableBlock) {
Vec3i blockInWorld = Vectors.grab3i(); blockTickContext.init(
Coordinates.getInWorld(getData().getPosition(), blockInChunk, blockInWorld); getWorld().getServer(),
Coordinates.getInWorld(getData().getPosition(), blockInChunk, null)
blockTickContext.init(getWorld().getServer(), blockInWorld); );
Vectors.release(blockInWorld);
if (((TickableBlock) block).doesTickRegularly(blockTickContext)) { if (((TickableBlock) block).doesTickRegularly(blockTickContext)) {
tickingBlocks.add(new Vec3i(blockInChunk)); tickingBlocks.add(new Vec3i(blockInChunk));
@ -70,12 +67,12 @@ public class ChunkLogic {
TileLogic tile = TileLogicRegistry.getInstance().get(tileData.getId()); TileLogic tile = TileLogicRegistry.getInstance().get(tileData.getId());
if (tile instanceof TickableTile) { if (tile instanceof TickableTile) {
Vec3i blockInWorld = Vectors.grab3i(); tileTickContext.init(
Coordinates.getInWorld(getData().getPosition(), loc.pos, blockInWorld); getWorld().getServer(),
Coordinates.getInWorld(getData().getPosition(), loc.pos, null),
tileTickContext.init(getWorld().getServer(), blockInWorld, loc.face, loc.layer); loc.face,
loc.layer
Vectors.release(blockInWorld); );
if (((TickableTile) tile).doesTickRegularly(tileTickContext)) { if (((TickableTile) tile).doesTickRegularly(tileTickContext)) {
tickingTiles.add(new TileLocation(loc)); tickingTiles.add(new TileLocation(loc));

View File

@ -1,8 +1,6 @@
package ru.windcorp.progressia.server.world; package ru.windcorp.progressia.server.world;
import glm.vec._3.i.Vec3i; import glm.vec._3.i.Vec3i;
import ru.windcorp.progressia.common.util.Vectors;
import ru.windcorp.progressia.common.world.Coordinates;
import ru.windcorp.progressia.server.Server; import ru.windcorp.progressia.server.Server;
import ru.windcorp.progressia.server.world.block.BlockTickContext; import ru.windcorp.progressia.server.world.block.BlockTickContext;
@ -20,11 +18,7 @@ implements BlockTickContext {
public void setCoordsInWorld(Vec3i blockInWorld) { public void setCoordsInWorld(Vec3i blockInWorld) {
getBlockInWorld().set(blockInWorld.x, blockInWorld.y, blockInWorld.z); getBlockInWorld().set(blockInWorld.x, blockInWorld.y, blockInWorld.z);
setChunk(getWorld().getChunkByBlock(blockInWorld));
Vec3i chunk = Vectors.grab3i();
Coordinates.convertInWorldToChunk(blockInWorld, chunk);
setChunk(getWorld().getChunk(chunk));
Vectors.release(chunk);
} }
@Override @Override

View File

@ -3,7 +3,6 @@ package ru.windcorp.progressia.server.world;
import java.util.List; import java.util.List;
import glm.vec._3.i.Vec3i; import glm.vec._3.i.Vec3i;
import ru.windcorp.progressia.common.util.LowOverheadCache;
import ru.windcorp.progressia.common.util.crash.CrashReports; import ru.windcorp.progressia.common.util.crash.CrashReports;
import ru.windcorp.progressia.common.world.block.BlockFace; import ru.windcorp.progressia.common.world.block.BlockFace;
import ru.windcorp.progressia.server.Server; import ru.windcorp.progressia.server.Server;
@ -18,12 +17,6 @@ import ru.windcorp.progressia.server.world.tile.UpdateableTile;
public class TickAndUpdateUtil { public class TickAndUpdateUtil {
private static final LowOverheadCache<MutableBlockTickContext> JAVAPONY_S_ULTIMATE_BLOCK_TICK_CONTEXT_SUPPLY =
new LowOverheadCache<>(MutableBlockTickContext::new);
private static final LowOverheadCache<MutableTileTickContext> JAVAPONY_S_ULTIMATE_TILE_TICK_CONTEXT_SUPPLY =
new LowOverheadCache<>(MutableTileTickContext::new);
public static void tickBlock(TickableBlock block, BlockTickContext context) { public static void tickBlock(TickableBlock block, BlockTickContext context) {
try { try {
block.tick(context); block.tick(context);
@ -36,9 +29,8 @@ public class TickAndUpdateUtil {
BlockLogic block = world.getBlock(blockInWorld); BlockLogic block = world.getBlock(blockInWorld);
if (!(block instanceof TickableBlock)) return; // also checks nulls if (!(block instanceof TickableBlock)) return; // also checks nulls
BlockTickContext tickContext = grabBlockTickContext(world.getServer(), blockInWorld); BlockTickContext tickContext = getBlockTickContext(world.getServer(), blockInWorld);
tickBlock((TickableBlock) block, tickContext); tickBlock((TickableBlock) block, tickContext);
releaseTickContext(tickContext);
} }
public static void tickTile(TickableTile tile, TileTickContext context) { public static void tickTile(TickableTile tile, TileTickContext context) {
@ -53,16 +45,15 @@ public class TickAndUpdateUtil {
TileLogic tile = world.getTile(blockInWorld, face, layer); TileLogic tile = world.getTile(blockInWorld, face, layer);
if (!(tile instanceof TickableTile)) return; if (!(tile instanceof TickableTile)) return;
TileTickContext tickContext = grabTileTickContext(world.getServer(), blockInWorld, face, layer); TileTickContext tickContext = getTileTickContext(world.getServer(), blockInWorld, face, layer);
tickTile((TickableTile) tile, tickContext); tickTile((TickableTile) tile, tickContext);
releaseTickContext(tickContext);
} }
public static void tickTiles(WorldLogic world, Vec3i blockInWorld, BlockFace face) { public static void tickTiles(WorldLogic world, Vec3i blockInWorld, BlockFace face) {
List<TileLogic> tiles = world.getTilesOrNull(blockInWorld, face); List<TileLogic> tiles = world.getTilesOrNull(blockInWorld, face);
if (tiles == null || tiles.isEmpty()) return; if (tiles == null || tiles.isEmpty()) return;
MutableTileTickContext tickContext = JAVAPONY_S_ULTIMATE_TILE_TICK_CONTEXT_SUPPLY.grab(); MutableTileTickContext tickContext = new MutableTileTickContext();
for (int layer = 0; layer < tiles.size(); ++layer) { for (int layer = 0; layer < tiles.size(); ++layer) {
TileLogic tile = tiles.get(layer); TileLogic tile = tiles.get(layer);
@ -71,8 +62,6 @@ public class TickAndUpdateUtil {
tickContext.init(world.getServer(), blockInWorld, face, layer); tickContext.init(world.getServer(), blockInWorld, face, layer);
tickTile((TickableTile) tile, tickContext); tickTile((TickableTile) tile, tickContext);
} }
JAVAPONY_S_ULTIMATE_TILE_TICK_CONTEXT_SUPPLY.release(tickContext);
} }
public static void updateBlock(UpdateableBlock block, BlockTickContext context) { public static void updateBlock(UpdateableBlock block, BlockTickContext context) {
@ -87,9 +76,8 @@ public class TickAndUpdateUtil {
BlockLogic block = world.getBlock(blockInWorld); BlockLogic block = world.getBlock(blockInWorld);
if (!(block instanceof UpdateableBlock)) return; // also checks nulls if (!(block instanceof UpdateableBlock)) return; // also checks nulls
BlockTickContext tickContext = grabBlockTickContext(world.getServer(), blockInWorld); BlockTickContext tickContext = getBlockTickContext(world.getServer(), blockInWorld);
updateBlock((UpdateableBlock) block, tickContext); updateBlock((UpdateableBlock) block, tickContext);
releaseTickContext(tickContext);
} }
public static void updateTile(UpdateableTile tile, TileTickContext context) { public static void updateTile(UpdateableTile tile, TileTickContext context) {
@ -104,16 +92,15 @@ public class TickAndUpdateUtil {
TileLogic tile = world.getTile(blockInWorld, face, layer); TileLogic tile = world.getTile(blockInWorld, face, layer);
if (!(tile instanceof UpdateableTile)) return; if (!(tile instanceof UpdateableTile)) return;
TileTickContext tickContext = grabTileTickContext(world.getServer(), blockInWorld, face, layer); TileTickContext tickContext = getTileTickContext(world.getServer(), blockInWorld, face, layer);
updateTile((UpdateableTile) tile, tickContext); updateTile((UpdateableTile) tile, tickContext);
releaseTickContext(tickContext);
} }
public static void updateTiles(WorldLogic world, Vec3i blockInWorld, BlockFace face) { public static void updateTiles(WorldLogic world, Vec3i blockInWorld, BlockFace face) {
List<TileLogic> tiles = world.getTilesOrNull(blockInWorld, face); List<TileLogic> tiles = world.getTilesOrNull(blockInWorld, face);
if (tiles == null || tiles.isEmpty()) return; if (tiles == null || tiles.isEmpty()) return;
MutableTileTickContext tickContext = JAVAPONY_S_ULTIMATE_TILE_TICK_CONTEXT_SUPPLY.grab(); MutableTileTickContext tickContext = new MutableTileTickContext();
for (int layer = 0; layer < tiles.size(); ++layer) { for (int layer = 0; layer < tiles.size(); ++layer) {
TileLogic tile = tiles.get(layer); TileLogic tile = tiles.get(layer);
@ -122,42 +109,28 @@ public class TickAndUpdateUtil {
tickContext.init(world.getServer(), blockInWorld, face, layer); tickContext.init(world.getServer(), blockInWorld, face, layer);
updateTile((UpdateableTile) tile, tickContext); updateTile((UpdateableTile) tile, tickContext);
} }
JAVAPONY_S_ULTIMATE_TILE_TICK_CONTEXT_SUPPLY.release(tickContext);
} }
public static BlockTickContext grabBlockTickContext( public static BlockTickContext getBlockTickContext(
Server server, Server server,
Vec3i blockInWorld Vec3i blockInWorld
) { ) {
MutableBlockTickContext result = JAVAPONY_S_ULTIMATE_BLOCK_TICK_CONTEXT_SUPPLY.grab(); MutableBlockTickContext result = new MutableBlockTickContext();
result.init(server, blockInWorld); result.init(server, blockInWorld);
return result; return result;
} }
public static TileTickContext grabTileTickContext( public static TileTickContext getTileTickContext(
Server server, Server server,
Vec3i blockInWorld, Vec3i blockInWorld,
BlockFace face, BlockFace face,
int layer int layer
) { ) {
MutableTileTickContext result = JAVAPONY_S_ULTIMATE_TILE_TICK_CONTEXT_SUPPLY.grab(); MutableTileTickContext result = new MutableTileTickContext();
result.init(server, blockInWorld, face, layer); result.init(server, blockInWorld, face, layer);
return result; return result;
} }
public static void releaseTickContext(BlockTickContext context) {
JAVAPONY_S_ULTIMATE_BLOCK_TICK_CONTEXT_SUPPLY.release(
(MutableBlockTickContext) context
);
}
public static void releaseTickContext(TileTickContext context) {
JAVAPONY_S_ULTIMATE_TILE_TICK_CONTEXT_SUPPLY.release(
(MutableTileTickContext) context
);
}
private TickAndUpdateUtil() {} private TickAndUpdateUtil() {}
} }

View File

@ -6,7 +6,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import glm.vec._3.i.Vec3i; import glm.vec._3.i.Vec3i;
import ru.windcorp.progressia.common.util.Vectors;
import ru.windcorp.progressia.common.world.ChunkData; import ru.windcorp.progressia.common.world.ChunkData;
import ru.windcorp.progressia.common.world.ChunkDataListener; import ru.windcorp.progressia.common.world.ChunkDataListener;
import ru.windcorp.progressia.common.world.ChunkDataListeners; import ru.windcorp.progressia.common.world.ChunkDataListeners;
@ -48,10 +47,7 @@ public class WorldLogic {
public void onChunkBlockChanged( public void onChunkBlockChanged(
ChunkData chunk, Vec3i blockInChunk, BlockData previous, BlockData current ChunkData chunk, Vec3i blockInChunk, BlockData previous, BlockData current
) { ) {
Vec3i blockInWorld = Vectors.grab3i(); getServer().getWorldAccessor().triggerUpdates(Coordinates.getInWorld(chunk.getPosition(), blockInChunk, null));
Coordinates.getInWorld(chunk.getPosition(), blockInChunk, blockInWorld);
getServer().getWorldAccessor().triggerUpdates(blockInWorld);
Vectors.release(blockInWorld);
} }
@Override @Override
@ -59,10 +55,7 @@ public class WorldLogic {
ChunkData chunk, Vec3i blockInChunk, BlockFace face, TileData tile, ChunkData chunk, Vec3i blockInChunk, BlockFace face, TileData tile,
boolean wasAdded boolean wasAdded
) { ) {
Vec3i blockInWorld = Vectors.grab3i(); getServer().getWorldAccessor().triggerUpdates(Coordinates.getInWorld(chunk.getPosition(), blockInChunk, null), face);
Coordinates.getInWorld(chunk.getPosition(), blockInChunk, blockInWorld);
getServer().getWorldAccessor().triggerUpdates(blockInWorld, face);
Vectors.release(blockInWorld);
} }
})); }));
} }
@ -84,22 +77,14 @@ public class WorldLogic {
} }
public ChunkLogic getChunkByBlock(Vec3i blockInWorld) { public ChunkLogic getChunkByBlock(Vec3i blockInWorld) {
Vec3i chunkPos = Vectors.grab3i(); return getChunk(Coordinates.convertInWorldToChunk(blockInWorld, null));
Coordinates.convertInWorldToChunk(blockInWorld, chunkPos);
ChunkLogic result = getChunk(chunkPos);
Vectors.release(chunkPos);
return result;
} }
public BlockLogic getBlock(Vec3i blockInWorld) { public BlockLogic getBlock(Vec3i blockInWorld) {
ChunkLogic chunk = getChunkByBlock(blockInWorld); ChunkLogic chunk = getChunkByBlock(blockInWorld);
if (chunk == null) return null; if (chunk == null) return null;
Vec3i blockInChunk = Vectors.grab3i(); return chunk.getBlock(Coordinates.convertInWorldToInChunk(blockInWorld, null));
Coordinates.convertInWorldToInChunk(blockInWorld, blockInChunk);
BlockLogic result = chunk.getBlock(blockInChunk);
Vectors.release(blockInChunk);
return result;
} }
public List<TileLogic> getTiles(Vec3i blockInWorld, BlockFace face) { public List<TileLogic> getTiles(Vec3i blockInWorld, BlockFace face) {
@ -114,16 +99,13 @@ public class WorldLogic {
ChunkLogic chunk = getChunkByBlock(blockInWorld); ChunkLogic chunk = getChunkByBlock(blockInWorld);
if (chunk == null) return null; if (chunk == null) return null;
Vec3i blockInChunk = Vectors.grab3i(); Vec3i blockInChunk = Coordinates.convertInWorldToInChunk(blockInWorld, null);
Coordinates.convertInWorldToInChunk(blockInWorld, blockInChunk);
List<TileLogic> result = List<TileLogic> result =
createIfMissing createIfMissing
? chunk.getTiles(blockInChunk, face) ? chunk.getTiles(blockInChunk, face)
: chunk.getTilesOrNull(blockInChunk, face); : chunk.getTilesOrNull(blockInChunk, face);
Vectors.release(blockInChunk);
return result; return result;
} }

View File

@ -4,7 +4,6 @@ import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
import glm.vec._3.i.Vec3i; import glm.vec._3.i.Vec3i;
import ru.windcorp.progressia.common.util.Vectors;
import ru.windcorp.progressia.common.world.Coordinates; import ru.windcorp.progressia.common.world.Coordinates;
import ru.windcorp.progressia.common.world.WorldData; import ru.windcorp.progressia.common.world.WorldData;
import ru.windcorp.progressia.common.world.block.BlockFace; import ru.windcorp.progressia.common.world.block.BlockFace;
@ -38,18 +37,15 @@ class AddOrRemoveTile extends CachedWorldChange {
@Override @Override
protected void affectCommon(WorldData world) { protected void affectCommon(WorldData world) {
Vec3i blockInChunk = Vectors.grab3i(); List<TileData> tiles = world
Coordinates.convertInWorldToInChunk(blockInWorld, blockInChunk); .getChunkByBlock(blockInWorld)
.getTiles(Coordinates.convertInWorldToInChunk(blockInWorld, null), face);
List<TileData> tiles = world.getChunkByBlock(blockInWorld).getTiles(blockInChunk, face);
if (shouldAdd) { if (shouldAdd) {
tiles.add(tile); tiles.add(tile);
} else { } else {
tiles.remove(tile); tiles.remove(tile);
} }
Vectors.release(blockInChunk);
} }
@Override @Override

View File

@ -3,7 +3,6 @@ package ru.windcorp.progressia.server.world.tasks;
import java.util.function.Consumer; import java.util.function.Consumer;
import glm.vec._3.i.Vec3i; import glm.vec._3.i.Vec3i;
import ru.windcorp.progressia.common.util.Vectors;
import ru.windcorp.progressia.common.world.Coordinates; import ru.windcorp.progressia.common.world.Coordinates;
import ru.windcorp.progressia.common.world.block.BlockFace; import ru.windcorp.progressia.common.world.block.BlockFace;
import ru.windcorp.progressia.server.Server; import ru.windcorp.progressia.server.Server;
@ -20,8 +19,7 @@ class BlockTriggeredUpdate extends CachedEvaluation {
@Override @Override
public void evaluate(Server server) { public void evaluate(Server server) {
Vec3i cursor = Vectors.grab3i(); Vec3i cursor = new Vec3i(blockInWorld.x, blockInWorld.y, blockInWorld.z);
cursor.set(blockInWorld.x, blockInWorld.y, blockInWorld.z);
WorldLogic world = server.getWorld(); WorldLogic world = server.getWorld();
@ -31,8 +29,6 @@ class BlockTriggeredUpdate extends CachedEvaluation {
TickAndUpdateUtil.updateBlock(world, cursor); TickAndUpdateUtil.updateBlock(world, cursor);
cursor.sub(face.getVector()); cursor.sub(face.getVector());
} }
Vectors.release(cursor);
} }
public void init(Vec3i blockInWorld) { public void init(Vec3i blockInWorld) {

View File

@ -3,7 +3,6 @@ package ru.windcorp.progressia.server.world.tasks;
import java.util.function.Consumer; import java.util.function.Consumer;
import glm.vec._3.i.Vec3i; import glm.vec._3.i.Vec3i;
import ru.windcorp.progressia.common.util.Vectors;
import ru.windcorp.progressia.common.world.Coordinates; import ru.windcorp.progressia.common.world.Coordinates;
import ru.windcorp.progressia.common.world.WorldData; import ru.windcorp.progressia.common.world.WorldData;
import ru.windcorp.progressia.common.world.block.BlockData; import ru.windcorp.progressia.common.world.block.BlockData;
@ -27,12 +26,9 @@ class SetBlock extends CachedWorldChange {
@Override @Override
protected void affectCommon(WorldData world) { protected void affectCommon(WorldData world) {
Vec3i blockInChunk = Vectors.grab3i(); world
Coordinates.convertInWorldToInChunk(blockInWorld, blockInChunk); .getChunkByBlock(blockInWorld)
.setBlock(Coordinates.convertInWorldToInChunk(blockInWorld, null), block, true);
world.getChunkByBlock(blockInWorld).setBlock(blockInChunk, block, true);
Vectors.release(blockInChunk);
} }
@Override @Override

View File

@ -3,7 +3,6 @@ package ru.windcorp.progressia.server.world.tasks;
import java.util.function.Consumer; import java.util.function.Consumer;
import glm.vec._3.i.Vec3i; import glm.vec._3.i.Vec3i;
import ru.windcorp.progressia.common.util.Vectors;
import ru.windcorp.progressia.common.world.Coordinates; import ru.windcorp.progressia.common.world.Coordinates;
import ru.windcorp.progressia.common.world.block.BlockFace; import ru.windcorp.progressia.common.world.block.BlockFace;
import ru.windcorp.progressia.server.Server; import ru.windcorp.progressia.server.Server;
@ -21,8 +20,7 @@ class TileTriggeredUpdate extends CachedEvaluation {
@Override @Override
public void evaluate(Server server) { public void evaluate(Server server) {
Vec3i cursor = Vectors.grab3i(); Vec3i cursor = new Vec3i(blockInWorld.x, blockInWorld.y, blockInWorld.z);
cursor.set(blockInWorld.x, blockInWorld.y, blockInWorld.z);
WorldLogic world = server.getWorld(); WorldLogic world = server.getWorld();
@ -30,8 +28,6 @@ class TileTriggeredUpdate extends CachedEvaluation {
TickAndUpdateUtil.tickBlock(world, cursor); // Tick block on one side TickAndUpdateUtil.tickBlock(world, cursor); // Tick block on one side
cursor.add(face.getVector()); cursor.add(face.getVector());
TickAndUpdateUtil.tickBlock(world, cursor); // Tick block on the other side TickAndUpdateUtil.tickBlock(world, cursor); // Tick block on the other side
Vectors.release(cursor);
} }
public void init(Vec3i blockInWorld, BlockFace face) { public void init(Vec3i blockInWorld, BlockFace face) {

View File

@ -20,15 +20,8 @@ public class EdgeTileLogic extends TileLogic implements UpdateableTile {
@Override @Override
public boolean canOccupyFace(TileTickContext context) { public boolean canOccupyFace(TileTickContext context) {
boolean canOccupy = false; boolean canOccupy = false;
canOccupy ^= canOccupyFace(context, context.getCurrentFace(), context.getCurrentBlockContext());
BlockTickContext currentTickContext = context.grabCurrentBlockContext(); canOccupy ^= canOccupyFace(context, context.getCounterFace(), context.getCounterBlockContext());
canOccupy ^= canOccupyFace(context, context.getCurrentFace(), currentTickContext);
context.release(currentTickContext);
BlockTickContext counterTickContext = context.grabCounterBlockContext();
canOccupy ^= canOccupyFace(context, context.getCounterFace(), counterTickContext);
context.release(counterTickContext);
return canOccupy; return canOccupy;
} }

View File

@ -3,7 +3,6 @@ package ru.windcorp.progressia.server.world.tile;
import java.util.List; import java.util.List;
import glm.vec._3.i.Vec3i; import glm.vec._3.i.Vec3i;
import ru.windcorp.progressia.common.util.Vectors;
import ru.windcorp.progressia.common.world.ChunkData; import ru.windcorp.progressia.common.world.ChunkData;
import ru.windcorp.progressia.common.world.Coordinates; import ru.windcorp.progressia.common.world.Coordinates;
import ru.windcorp.progressia.common.world.block.BlockData; import ru.windcorp.progressia.common.world.block.BlockData;
@ -62,35 +61,31 @@ public interface TileTickContext extends TickContext {
} }
default List<TileLogic> getTiles() { default List<TileLogic> getTiles() {
Vec3i blockInChunk = Vectors.grab3i(); return getCurrentChunk().getTiles(
Coordinates.convertInWorldToInChunk(getCurrentBlockInWorld(), blockInChunk); Coordinates.convertInWorldToInChunk(getCurrentBlockInWorld(), null),
List<TileLogic> result = getCurrentChunk().getTiles(blockInChunk, getCurrentFace()); getCurrentFace()
Vectors.release(blockInChunk); );
return result;
} }
default List<TileLogic> getTilesOrNull() { default List<TileLogic> getTilesOrNull() {
Vec3i blockInChunk = Vectors.grab3i(); return getCurrentChunk().getTilesOrNull(
Coordinates.convertInWorldToInChunk(getCurrentBlockInWorld(), blockInChunk); Coordinates.convertInWorldToInChunk(getCurrentBlockInWorld(), null),
List<TileLogic> result = getCurrentChunk().getTilesOrNull(blockInChunk, getCurrentFace()); getCurrentFace()
Vectors.release(blockInChunk); );
return result;
} }
default List<TileData> getTileDataList() { default List<TileData> getTileDataList() {
Vec3i blockInChunk = Vectors.grab3i(); return getCurrentChunkData().getTiles(
Coordinates.convertInWorldToInChunk(getCurrentBlockInWorld(), blockInChunk); Coordinates.convertInWorldToInChunk(getCurrentBlockInWorld(), null),
List<TileData> result = getCurrentChunkData().getTiles(blockInChunk, getCurrentFace()); getCurrentFace()
Vectors.release(blockInChunk); );
return result;
} }
default List<TileData> getTileDataListOrNull() { default List<TileData> getTileDataListOrNull() {
Vec3i blockInChunk = Vectors.grab3i(); return getCurrentChunkData().getTilesOrNull(
Coordinates.convertInWorldToInChunk(getCurrentBlockInWorld(), blockInChunk); Coordinates.convertInWorldToInChunk(getCurrentBlockInWorld(), null),
List<TileData> result = getCurrentChunkData().getTilesOrNull(blockInChunk, getCurrentFace()); getCurrentFace()
Vectors.release(blockInChunk); );
return result;
} }
/* /*
@ -113,8 +108,8 @@ public interface TileTickContext extends TickContext {
return getWorldData().getBlock(getCurrentBlockInWorld()); return getWorldData().getBlock(getCurrentBlockInWorld());
} }
default BlockTickContext grabCurrentBlockContext() { default BlockTickContext getCurrentBlockContext() {
return TickAndUpdateUtil.grabBlockTickContext(getServer(), getCurrentBlockInWorld()); return TickAndUpdateUtil.getBlockTickContext(getServer(), getCurrentBlockInWorld());
} }
/* /*
@ -137,8 +132,8 @@ public interface TileTickContext extends TickContext {
return getWorldData().getBlock(getCounterBlockInWorld()); return getWorldData().getBlock(getCounterBlockInWorld());
} }
default BlockTickContext grabCounterBlockContext() { default BlockTickContext getCounterBlockContext() {
return TickAndUpdateUtil.grabBlockTickContext(getServer(), getCounterBlockInWorld()); return TickAndUpdateUtil.getBlockTickContext(getServer(), getCounterBlockInWorld());
} }
/* /*
@ -149,12 +144,4 @@ public interface TileTickContext extends TickContext {
getAccessor().removeTile(getCurrentBlockInWorld(), getCurrentFace(), getTileData()); getAccessor().removeTile(getCurrentBlockInWorld(), getCurrentFace(), getTileData());
} }
/*
* Misc
*/
default void release(BlockTickContext context) {
TickAndUpdateUtil.releaseTickContext(context);
}
} }

View File

@ -11,7 +11,6 @@ import ru.windcorp.progressia.client.graphics.world.WorldRenderProgram;
import ru.windcorp.progressia.common.collision.AABBoid; import ru.windcorp.progressia.common.collision.AABBoid;
import ru.windcorp.progressia.common.collision.CollisionModel; import ru.windcorp.progressia.common.collision.CollisionModel;
import ru.windcorp.progressia.common.collision.CompoundCollisionModel; import ru.windcorp.progressia.common.collision.CompoundCollisionModel;
import ru.windcorp.progressia.common.util.Vectors;
public class CollisionModelRenderer { public class CollisionModelRenderer {
@ -30,15 +29,13 @@ public class CollisionModelRenderer {
private static void renderAABBoid(AABBoid aabb, ShapeRenderHelper helper) { private static void renderAABBoid(AABBoid aabb, ShapeRenderHelper helper) {
Mat4 mat = helper.pushTransform(); Mat4 mat = helper.pushTransform();
Vec3 tmp = Vectors.grab3(); Vec3 tmp = new Vec3();
aabb.getOrigin(tmp); aabb.getOrigin(tmp);
mat.translate(tmp); mat.translate(tmp);
aabb.getSize(tmp); aabb.getSize(tmp);
mat.scale(tmp); mat.scale(tmp);
Vectors.release(tmp);
CUBE.render(helper); CUBE.render(helper);
helper.popTransform(); helper.popTransform();
} }

View File

@ -22,7 +22,6 @@ import ru.windcorp.progressia.common.collision.AABB;
import ru.windcorp.progressia.common.collision.CollisionModel; import ru.windcorp.progressia.common.collision.CollisionModel;
import ru.windcorp.progressia.common.comms.controls.*; import ru.windcorp.progressia.common.comms.controls.*;
import ru.windcorp.progressia.common.state.StatefulObjectRegistry.Factory; import ru.windcorp.progressia.common.state.StatefulObjectRegistry.Factory;
import ru.windcorp.progressia.common.util.Vectors;
import ru.windcorp.progressia.common.world.ChunkData; import ru.windcorp.progressia.common.world.ChunkData;
import ru.windcorp.progressia.common.world.block.*; import ru.windcorp.progressia.common.world.block.*;
import ru.windcorp.progressia.common.world.entity.*; import ru.windcorp.progressia.common.world.entity.*;
@ -226,13 +225,9 @@ public class TestContent {
} }
private static void onBlockPlaceTrigger(ControlData control) { private static void onBlockPlaceTrigger(ControlData control) {
Vec3i blockInWorld = Vectors.grab3i(); ((ControlPlaceBlockData) control).setBlockInWorld(
Vec3i selectedBlock = getSelection().getBlock(); getSelection().getBlock().add_(getSelection().getSurface().getVector())
);
blockInWorld.set(selectedBlock.x, selectedBlock.y, selectedBlock.z).add(getSelection().getSurface().getVector());
((ControlPlaceBlockData) control).setBlockInWorld(blockInWorld);
Vectors.release(blockInWorld);
} }
private static void onBlockPlaceReceived(Server server, PacketControl packet, ru.windcorp.progressia.server.comms.Client client) { private static void onBlockPlaceReceived(Server server, PacketControl packet, ru.windcorp.progressia.server.comms.Client client) {

View File

@ -16,8 +16,6 @@ import ru.windcorp.progressia.client.graphics.input.bus.Input;
import ru.windcorp.progressia.client.graphics.world.LocalPlayer; import ru.windcorp.progressia.client.graphics.world.LocalPlayer;
import ru.windcorp.progressia.common.Units; import ru.windcorp.progressia.common.Units;
import ru.windcorp.progressia.common.util.FloatMathUtils; import ru.windcorp.progressia.common.util.FloatMathUtils;
import ru.windcorp.progressia.common.util.Matrices;
import ru.windcorp.progressia.common.util.Vectors;
import ru.windcorp.progressia.common.world.entity.EntityData; import ru.windcorp.progressia.common.world.entity.EntityData;
public class TestPlayerControls { public class TestPlayerControls {
@ -67,13 +65,9 @@ public class TestPlayerControls {
} }
EntityData player = getEntity(); EntityData player = getEntity();
Mat3 angMat = Matrices.grab3();
angMat.identity().rotateZ(player.getYaw()); Mat3 angMat = new Mat3().identity().rotateZ(player.getYaw());
Vec3 movement = new Vec3(movementForward, -movementRight, 0);
Vec3 movement = Vectors.grab3();
movement.set(movementForward, -movementRight, 0);
if (movementForward != 0 && movementRight != 0) { if (movementForward != 0 && movementRight != 0) {
movement.normalize(); movement.normalize();
@ -94,9 +88,6 @@ public class TestPlayerControls {
} }
player.getVelocity().add(movement); player.getVelocity().add(movement);
Matrices.release(angMat);
Vectors.release(movement);
} }
public void handleInput(Input input) { public void handleInput(Input input) {

View File

@ -1,7 +1,6 @@
package ru.windcorp.progressia.test; package ru.windcorp.progressia.test;
import glm.vec._3.i.Vec3i; import glm.vec._3.i.Vec3i;
import ru.windcorp.progressia.common.util.Vectors;
import ru.windcorp.progressia.common.world.block.BlockFace; import ru.windcorp.progressia.common.world.block.BlockFace;
import ru.windcorp.progressia.server.Server; import ru.windcorp.progressia.server.Server;
import ru.windcorp.progressia.server.world.TickAndUpdateUtil; import ru.windcorp.progressia.server.world.TickAndUpdateUtil;
@ -17,21 +16,12 @@ public class TestTileLogicGrass extends EdgeTileLogic {
} }
private boolean isBlockAboveTransparent(Server server, Vec3i blockInWorld) { private boolean isBlockAboveTransparent(Server server, Vec3i blockInWorld) {
Vec3i blockAboveCoords = Vectors.grab3i(); BlockTickContext blockAboveContext = TickAndUpdateUtil.getBlockTickContext(server, blockInWorld.add_(BlockFace.TOP.getVector()));
blockAboveCoords.set(blockInWorld.x, blockInWorld.y, blockInWorld.z);
blockAboveCoords.add(BlockFace.TOP.getVector());
BlockTickContext blockAboveContext = TickAndUpdateUtil.grabBlockTickContext(server, blockAboveCoords); BlockLogic blockAbove = blockAboveContext.getBlock();
if (blockAbove == null) return true;
try { return blockAbove.isTransparent(blockAboveContext);
BlockLogic blockAbove = blockAboveContext.getBlock();
if (blockAbove == null) return true;
return blockAbove.isTransparent(blockAboveContext);
} finally {
TickAndUpdateUtil.releaseTickContext(blockAboveContext);
Vectors.release(blockAboveCoords);
}
} }
@Override @Override