mirror of
https://github.com/Jozufozu/Flywheel.git
synced 2024-12-27 07:26:48 +01:00
Now you see me
- Fix entities sometimes freezing when they first appear. - Fix bounding sphere calculation for multiple combined meshes. - Fix shadow bounding sphere transformer outputting incorrect radius.
This commit is contained in:
parent
57ae19403f
commit
1fb646e9ef
4 changed files with 15 additions and 4 deletions
|
@ -32,6 +32,9 @@ public class IndirectModel {
|
|||
public void write(long ptr) {
|
||||
MemoryUtil.memPutInt(ptr, 0); // instanceCount - to be incremented by the cull shader
|
||||
MemoryUtil.memPutInt(ptr + 4, baseInstance); // baseInstance
|
||||
boundingSphere.getToAddress(ptr + 8); // boundingSphere
|
||||
MemoryUtil.memPutFloat(ptr + 8, boundingSphere.x()); // boundingSphere
|
||||
MemoryUtil.memPutFloat(ptr + 12, boundingSphere.y());
|
||||
MemoryUtil.memPutFloat(ptr + 16, boundingSphere.z());
|
||||
MemoryUtil.memPutFloat(ptr + 20, boundingSphere.w());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -114,6 +114,7 @@ public final class ModelUtil {
|
|||
int baseVertex = 0;
|
||||
for (Mesh mesh : meshes) {
|
||||
vertexList.ptr(block.ptr() + (long) baseVertex * PosVertexView.STRIDE);
|
||||
vertexList.vertexCount(mesh.vertexCount());
|
||||
mesh.write(vertexList);
|
||||
baseVertex += mesh.vertexCount();
|
||||
}
|
||||
|
|
|
@ -45,9 +45,16 @@ public class EntityVisibilityTester {
|
|||
public boolean check(FrustumIntersection frustum) {
|
||||
AABB aabb = entity.getBoundingBoxForCulling();
|
||||
|
||||
boolean visible = adjustAndTestAABB(frustum, aabb);
|
||||
// If we've never seen the entity before assume its visible.
|
||||
// Fixes entities freezing when they first spawn.
|
||||
// There might be a more sound solution to that, but this works.
|
||||
boolean visible = lastVisibleAABB == null;
|
||||
|
||||
if (!visible && lastVisibleAABB != null && lastVisibleAABB != aabb) {
|
||||
if (!visible) {
|
||||
visible = adjustAndTestAABB(frustum, aabb);
|
||||
}
|
||||
|
||||
if (!visible && lastVisibleAABB != aabb) {
|
||||
// If the entity isn't visible, check the last visible AABB as well.
|
||||
// This is to avoid Entities freezing when the go offscreen.
|
||||
visible = adjustAndTestAABB(frustum, lastVisibleAABB);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
void flw_transformBoundingSphere(in FlwInstance i, inout vec3 center, inout float radius) {
|
||||
// We can just ignore the base center/radius.
|
||||
center = i.pos + vec3(i.size.x * 0.5, 0., i.size.y * 0.5);
|
||||
radius = max(i.size.x, i.size.y) * 0.5;
|
||||
radius = length(i.size) * 0.5;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue