9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-19 15:09:15 +00:00

改进entity renderer

This commit is contained in:
XiaoMoMi
2025-11-30 02:56:01 +08:00
parent ff920b74df
commit 12106c80c0
10 changed files with 262 additions and 147 deletions

View File

@@ -45,6 +45,14 @@ public class ItemBlockEntityElementConfig implements BlockEntityElementConfig<It
return new ItemBlockEntityElement(this, pos, previous.entityId1, previous.entityId2, !previous.config.position.equals(this.position)); return new ItemBlockEntityElement(this, pos, previous.entityId1, previous.entityId2, !previous.config.position.equals(this.position));
} }
@Override
public ItemBlockEntityElement createExact(World world, BlockPos pos, ItemBlockEntityElement previous) {
if (!previous.config.equals(this)) {
return null;
}
return new ItemBlockEntityElement(this, pos, previous.entityId1, previous.entityId2, false);
}
@Override @Override
public Class<ItemBlockEntityElement> elementClass() { public Class<ItemBlockEntityElement> elementClass() {
return ItemBlockEntityElement.class; return ItemBlockEntityElement.class;
@@ -62,6 +70,12 @@ public class ItemBlockEntityElementConfig implements BlockEntityElementConfig<It
return this.lazyMetadataPacket.apply(player); return this.lazyMetadataPacket.apply(player);
} }
@Override
public boolean equals(Object o) {
if (!(o instanceof ItemBlockEntityElementConfig that)) return false;
return this.position.equals(that.position);
}
public static class Factory implements BlockEntityElementConfigFactory { public static class Factory implements BlockEntityElementConfigFactory {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")

View File

@@ -1,5 +1,6 @@
package net.momirealms.craftengine.bukkit.block.entity.renderer.element; package net.momirealms.craftengine.bukkit.block.entity.renderer.element;
import com.google.common.base.Objects;
import net.momirealms.craftengine.bukkit.entity.data.ItemDisplayEntityData; import net.momirealms.craftengine.bukkit.entity.data.ItemDisplayEntityData;
import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.item.BukkitItemManager;
import net.momirealms.craftengine.core.block.entity.render.element.BlockEntityElement; import net.momirealms.craftengine.core.block.entity.render.element.BlockEntityElement;
@@ -87,6 +88,14 @@ public class ItemDisplayBlockEntityElementConfig implements BlockEntityElementCo
); );
} }
@Override
public ItemDisplayBlockEntityElement createExact(World world, BlockPos pos, ItemDisplayBlockEntityElement previous) {
if (!previous.config.equals(this)) {
return null;
}
return new ItemDisplayBlockEntityElement(this, pos, previous.entityId, false);
}
@Override @Override
public Class<ItemDisplayBlockEntityElement> elementClass() { public Class<ItemDisplayBlockEntityElement> elementClass() {
return ItemDisplayBlockEntityElement.class; return ItemDisplayBlockEntityElement.class;
@@ -140,6 +149,16 @@ public class ItemDisplayBlockEntityElementConfig implements BlockEntityElementCo
return this.lazyMetadataPacket.apply(player); return this.lazyMetadataPacket.apply(player);
} }
@Override
public boolean equals(Object o) {
if (!(o instanceof ItemDisplayBlockEntityElementConfig that)) return false;
return Float.compare(xRot, that.xRot) == 0 &&
Float.compare(yRot, that.yRot) == 0 &&
Objects.equal(position, that.position) &&
Objects.equal(translation, that.translation) &&
Objects.equal(rotation, that.rotation);
}
public static class Factory implements BlockEntityElementConfigFactory { public static class Factory implements BlockEntityElementConfigFactory {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")

View File

@@ -1,5 +1,6 @@
package net.momirealms.craftengine.bukkit.block.entity.renderer.element; package net.momirealms.craftengine.bukkit.block.entity.renderer.element;
import com.google.common.base.Objects;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.bukkit.entity.data.TextDisplayEntityData; import net.momirealms.craftengine.bukkit.entity.data.TextDisplayEntityData;
import net.momirealms.craftengine.bukkit.util.ComponentUtils; import net.momirealms.craftengine.bukkit.util.ComponentUtils;
@@ -75,6 +76,14 @@ public class TextDisplayBlockEntityElementConfig implements BlockEntityElementCo
); );
} }
@Override
public TextDisplayBlockEntityElement createExact(World world, BlockPos pos, TextDisplayBlockEntityElement previous) {
if (!previous.config.equals(this)) {
return null;
}
return new TextDisplayBlockEntityElement(this, pos, previous.entityId, false);
}
@Override @Override
public Class<TextDisplayBlockEntityElement> elementClass() { public Class<TextDisplayBlockEntityElement> elementClass() {
return TextDisplayBlockEntityElement.class; return TextDisplayBlockEntityElement.class;
@@ -116,6 +125,16 @@ public class TextDisplayBlockEntityElementConfig implements BlockEntityElementCo
return this.lazyMetadataPacket.apply(player); return this.lazyMetadataPacket.apply(player);
} }
@Override
public boolean equals(Object o) {
if (!(o instanceof TextDisplayBlockEntityElementConfig that)) return false;
return Float.compare(xRot, that.xRot) == 0 &&
Float.compare(yRot, that.yRot) == 0 &&
Objects.equal(position, that.position) &&
Objects.equal(translation, that.translation) &&
Objects.equal(rotation, that.rotation);
}
public static class Factory implements BlockEntityElementConfigFactory { public static class Factory implements BlockEntityElementConfigFactory {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")

View File

@@ -1382,8 +1382,8 @@ public class BukkitServerPlayer extends Player {
} }
@Override @Override
public VirtualCullableObject addTrackedBlockEntity(BlockPos blockPos, ConstantBlockEntityRenderer renderer) { public void addTrackedBlockEntity(BlockPos blockPos, ConstantBlockEntityRenderer renderer) {
return this.trackedBlockEntityRenderers.put(blockPos, new VirtualCullableObject(renderer)); this.trackedBlockEntityRenderers.put(blockPos, new VirtualCullableObject(renderer));
} }
@Override @Override

View File

@@ -1834,354 +1834,354 @@ templates:
state: ${base_block}[east=false,north=false,south=false,waterlogged=false,west=false] state: ${base_block}[east=false,north=false,south=false,waterlogged=false,west=false]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
east=true,north=false,south=false,waterlogged=false,west=false: east=true,north=false,south=false,waterlogged=false,west=false:
state: ${base_block}[east=true,north=false,south=false,waterlogged=false,west=false] state: ${base_block}[east=true,north=false,south=false,waterlogged=false,west=false]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 270 rotation: 270
east=false,north=true,south=false,waterlogged=false,west=false: east=false,north=true,south=false,waterlogged=false,west=false:
state: ${base_block}[east=false,north=true,south=false,waterlogged=false,west=false] state: ${base_block}[east=false,north=true,south=false,waterlogged=false,west=false]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 180 rotation: 180
east=false,north=false,south=true,waterlogged=false,west=false: east=false,north=false,south=true,waterlogged=false,west=false:
state: ${base_block}[east=false,north=false,south=true,waterlogged=false,west=false] state: ${base_block}[east=false,north=false,south=true,waterlogged=false,west=false]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 0 rotation: 0
east=false,north=false,south=false,waterlogged=false,west=true: east=false,north=false,south=false,waterlogged=false,west=true:
state: ${base_block}[east=false,north=false,south=false,waterlogged=false,west=true] state: ${base_block}[east=false,north=false,south=false,waterlogged=false,west=true]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 90 rotation: 90
east=true,north=true,south=false,waterlogged=false,west=false: east=true,north=true,south=false,waterlogged=false,west=false:
state: ${base_block}[east=true,north=true,south=false,waterlogged=false,west=false] state: ${base_block}[east=true,north=true,south=false,waterlogged=false,west=false]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 180 rotation: 180
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 270 rotation: 270
east=true,north=false,south=true,waterlogged=false,west=false: east=true,north=false,south=true,waterlogged=false,west=false:
state: ${base_block}[east=true,north=false,south=true,waterlogged=false,west=false] state: ${base_block}[east=true,north=false,south=true,waterlogged=false,west=false]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 0 rotation: 0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 270 rotation: 270
east=true,north=false,south=false,waterlogged=false,west=true: east=true,north=false,south=false,waterlogged=false,west=true:
state: ${base_block}[east=true,north=false,south=false,waterlogged=false,west=true] state: ${base_block}[east=true,north=false,south=false,waterlogged=false,west=true]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 90 rotation: 90
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 270 rotation: 270
east=false,north=true,south=true,waterlogged=false,west=false: east=false,north=true,south=true,waterlogged=false,west=false:
state: ${base_block}[east=false,north=true,south=true,waterlogged=false,west=false] state: ${base_block}[east=false,north=true,south=true,waterlogged=false,west=false]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 0 rotation: 0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 180 rotation: 180
east=false,north=true,south=false,waterlogged=false,west=true: east=false,north=true,south=false,waterlogged=false,west=true:
state: ${base_block}[east=false,north=true,south=false,waterlogged=false,west=true] state: ${base_block}[east=false,north=true,south=false,waterlogged=false,west=true]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 90 rotation: 90
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 180 rotation: 180
east=false,north=false,south=true,waterlogged=false,west=true: east=false,north=false,south=true,waterlogged=false,west=true:
state: ${base_block}[east=false,north=false,south=true,waterlogged=false,west=true] state: ${base_block}[east=false,north=false,south=true,waterlogged=false,west=true]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 0 rotation: 0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 90 rotation: 90
east=true,north=true,south=true,waterlogged=false,west=false: east=true,north=true,south=true,waterlogged=false,west=false:
state: ${base_block}[east=true,north=true,south=true,waterlogged=false,west=false] state: ${base_block}[east=true,north=true,south=true,waterlogged=false,west=false]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 0 rotation: 0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 180 rotation: 180
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 270 rotation: 270
east=true,north=true,south=false,waterlogged=false,west=true: east=true,north=true,south=false,waterlogged=false,west=true:
state: ${base_block}[east=true,north=true,south=false,waterlogged=false,west=true] state: ${base_block}[east=true,north=true,south=false,waterlogged=false,west=true]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 90 rotation: 90
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 180 rotation: 180
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 270 rotation: 270
east=true,north=false,south=true,waterlogged=false,west=true: east=true,north=false,south=true,waterlogged=false,west=true:
state: ${base_block}[east=true,north=false,south=true,waterlogged=false,west=true] state: ${base_block}[east=true,north=false,south=true,waterlogged=false,west=true]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 0 rotation: 0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 90 rotation: 90
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 270 rotation: 270
east=false,north=true,south=true,waterlogged=false,west=true: east=false,north=true,south=true,waterlogged=false,west=true:
state: ${base_block}[east=false,north=true,south=true,waterlogged=false,west=true] state: ${base_block}[east=false,north=true,south=true,waterlogged=false,west=true]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 0 rotation: 0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 90 rotation: 90
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 180 rotation: 180
east=true,north=true,south=true,waterlogged=false,west=true: east=true,north=true,south=true,waterlogged=false,west=true:
state: ${base_block}[east=true,north=true,south=true,waterlogged=false,west=true] state: ${base_block}[east=true,north=true,south=true,waterlogged=false,west=true]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 0 rotation: 0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 90 rotation: 90
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 180 rotation: 180
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 270 rotation: 270
east=false,north=false,south=false,waterlogged=true,west=false: east=false,north=false,south=false,waterlogged=true,west=false:
state: ${base_block}[east=false,north=false,south=false,waterlogged=true,west=false] state: ${base_block}[east=false,north=false,south=false,waterlogged=true,west=false]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
east=true,north=false,south=false,waterlogged=true,west=false: east=true,north=false,south=false,waterlogged=true,west=false:
state: ${base_block}[east=true,north=false,south=false,waterlogged=true,west=false] state: ${base_block}[east=true,north=false,south=false,waterlogged=true,west=false]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 270 rotation: 270
east=false,north=true,south=false,waterlogged=true,west=false: east=false,north=true,south=false,waterlogged=true,west=false:
state: ${base_block}[east=false,north=true,south=false,waterlogged=true,west=false] state: ${base_block}[east=false,north=true,south=false,waterlogged=true,west=false]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 180 rotation: 180
east=false,north=false,south=true,waterlogged=true,west=false: east=false,north=false,south=true,waterlogged=true,west=false:
state: ${base_block}[east=false,north=false,south=true,waterlogged=true,west=false] state: ${base_block}[east=false,north=false,south=true,waterlogged=true,west=false]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 0 rotation: 0
east=false,north=false,south=false,waterlogged=true,west=true: east=false,north=false,south=false,waterlogged=true,west=true:
state: ${base_block}[east=false,north=false,south=false,waterlogged=true,west=true] state: ${base_block}[east=false,north=false,south=false,waterlogged=true,west=true]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 90 rotation: 90
east=true,north=true,south=false,waterlogged=true,west=false: east=true,north=true,south=false,waterlogged=true,west=false:
state: ${base_block}[east=true,north=true,south=false,waterlogged=true,west=false] state: ${base_block}[east=true,north=true,south=false,waterlogged=true,west=false]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 180 rotation: 180
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 270 rotation: 270
east=true,north=false,south=true,waterlogged=true,west=false: east=true,north=false,south=true,waterlogged=true,west=false:
state: ${base_block}[east=true,north=false,south=true,waterlogged=true,west=false] state: ${base_block}[east=true,north=false,south=true,waterlogged=true,west=false]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 0 rotation: 0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 270 rotation: 270
east=true,north=false,south=false,waterlogged=true,west=true: east=true,north=false,south=false,waterlogged=true,west=true:
state: ${base_block}[east=true,north=false,south=false,waterlogged=true,west=true] state: ${base_block}[east=true,north=false,south=false,waterlogged=true,west=true]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 90 rotation: 90
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 270 rotation: 270
east=false,north=true,south=true,waterlogged=true,west=false: east=false,north=true,south=true,waterlogged=true,west=false:
state: ${base_block}[east=false,north=true,south=true,waterlogged=true,west=false] state: ${base_block}[east=false,north=true,south=true,waterlogged=true,west=false]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 0 rotation: 0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 180 rotation: 180
east=false,north=true,south=false,waterlogged=true,west=true: east=false,north=true,south=false,waterlogged=true,west=true:
state: ${base_block}[east=false,north=true,south=false,waterlogged=true,west=true] state: ${base_block}[east=false,north=true,south=false,waterlogged=true,west=true]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 90 rotation: 90
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 180 rotation: 180
east=false,north=false,south=true,waterlogged=true,west=true: east=false,north=false,south=true,waterlogged=true,west=true:
state: ${base_block}[east=false,north=false,south=true,waterlogged=true,west=true] state: ${base_block}[east=false,north=false,south=true,waterlogged=true,west=true]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 0 rotation: 0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 90 rotation: 90
east=true,north=true,south=true,waterlogged=true,west=false: east=true,north=true,south=true,waterlogged=true,west=false:
state: ${base_block}[east=true,north=true,south=true,waterlogged=true,west=false] state: ${base_block}[east=true,north=true,south=true,waterlogged=true,west=false]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 0 rotation: 0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 180 rotation: 180
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 270 rotation: 270
east=true,north=true,south=false,waterlogged=true,west=true: east=true,north=true,south=false,waterlogged=true,west=true:
state: ${base_block}[east=true,north=true,south=false,waterlogged=true,west=true] state: ${base_block}[east=true,north=true,south=false,waterlogged=true,west=true]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 90 rotation: 90
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 180 rotation: 180
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 270 rotation: 270
east=true,north=false,south=true,waterlogged=true,west=true: east=true,north=false,south=true,waterlogged=true,west=true:
state: ${base_block}[east=true,north=false,south=true,waterlogged=true,west=true] state: ${base_block}[east=true,north=false,south=true,waterlogged=true,west=true]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 0 rotation: 0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 90 rotation: 90
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 270 rotation: 270
east=false,north=true,south=true,waterlogged=true,west=true: east=false,north=true,south=true,waterlogged=true,west=true:
state: ${base_block}[east=false,north=true,south=true,waterlogged=true,west=true] state: ${base_block}[east=false,north=true,south=true,waterlogged=true,west=true]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 0 rotation: 0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 90 rotation: 90
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 180 rotation: 180
east=true,north=true,south=true,waterlogged=true,west=true: east=true,north=true,south=true,waterlogged=true,west=true:
state: ${base_block}[east=true,north=true,south=true,waterlogged=true,west=true] state: ${base_block}[east=true,north=true,south=true,waterlogged=true,west=true]
entity-renderer: entity-renderer:
- item: ${fence_post_item} - item: ${fence_post_item}
yaw: 180 rotation: 180
scale: 1.0003 scale: 1.0003
translation: 0,0.0001,0 translation: 0,0.0001,0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 0 rotation: 0
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 90 rotation: 90
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 180 rotation: 180
- item: ${fence_side_item} - item: ${fence_side_item}
yaw: 270 rotation: 270
variants: variants:
waterlogged=true: waterlogged=true:
settings: settings:

View File

@@ -11,5 +11,9 @@ public interface BlockEntityElementConfig<E extends BlockEntityElement> {
return null; return null;
} }
default E createExact(World world, BlockPos pos, E previous) {
return null;
}
Class<E> elementClass(); Class<E> elementClass();
} }

View File

@@ -207,7 +207,7 @@ public abstract class Player extends AbstractEntity implements NetWorkUser {
public abstract void addTrackedBlockEntities(Map<BlockPos, ConstantBlockEntityRenderer> renders); public abstract void addTrackedBlockEntities(Map<BlockPos, ConstantBlockEntityRenderer> renders);
public abstract VirtualCullableObject addTrackedBlockEntity(BlockPos blockPos, ConstantBlockEntityRenderer renderer); public abstract void addTrackedBlockEntity(BlockPos blockPos, ConstantBlockEntityRenderer renderer);
public abstract VirtualCullableObject getTrackedBlockEntity(BlockPos blockPos); public abstract VirtualCullableObject getTrackedBlockEntity(BlockPos blockPos);

View File

@@ -153,6 +153,12 @@ public class CEChunk {
if (previous != null) { if (previous != null) {
// 由于entity-render的体量基本都很小所以考虑一个特殊情况即前后都是1个renderer对此情况进行简化和优化 // 由于entity-render的体量基本都很小所以考虑一个特殊情况即前后都是1个renderer对此情况进行简化和优化
BlockEntityElement[] previousElements = previous.elements().clone(); BlockEntityElement[] previousElements = previous.elements().clone();
/*
*
* 1 对 1命中率最高
*
*/
if (previousElements.length == 1 && renderers.length == 1) { if (previousElements.length == 1 && renderers.length == 1) {
BlockEntityElement previousElement = previousElements[0]; BlockEntityElement previousElement = previousElements[0];
BlockEntityElementConfig<? extends BlockEntityElement> config = renderers[0]; BlockEntityElementConfig<? extends BlockEntityElement> config = renderers[0];
@@ -162,18 +168,19 @@ public class CEChunk {
if (element != null) { if (element != null) {
elements[0] = element; elements[0] = element;
if (hasTrackedBy) { if (hasTrackedBy) {
// 如果启用实体剔除,那么只对已经渲染的进行变换
if (Config.enableEntityCulling()) {
for (Player player : trackedBy) { for (Player player : trackedBy) {
VirtualCullableObject trackedBlockEntity = player.addTrackedBlockEntity(pos, renderer); // 如果启用剔除,则暂时保留原先可见度,因为大概率可见度不发生变化
if (trackedBlockEntity == null || trackedBlockEntity.isShown()) { if (Config.enableEntityCulling()) {
VirtualCullableObject trackedBlockEntity = player.getTrackedBlockEntity(pos);
if (trackedBlockEntity == null || trackedBlockEntity.isShown) {
element.transform(player); element.transform(player);
} }
if (trackedBlockEntity != null) {
trackedBlockEntity.setCullable(renderer);
} else {
player.addTrackedBlockEntity(pos, renderer);
} }
} } else {
// 否则直接变换
else {
for (Player player : trackedBy) {
element.transform(player); element.transform(player);
} }
} }
@@ -184,47 +191,56 @@ public class CEChunk {
BlockEntityElement element = config.create(wrappedWorld, pos); BlockEntityElement element = config.create(wrappedWorld, pos);
elements[0] = element; elements[0] = element;
if (hasTrackedBy) { if (hasTrackedBy) {
// 如果启用实体剔除,那么只添加记录
if (Config.enableEntityCulling()) {
for (Player player : trackedBy) { for (Player player : trackedBy) {
VirtualCullableObject trackedBlockEntity = player.addTrackedBlockEntity(pos, renderer); if (Config.enableEntityCulling()) {
if (trackedBlockEntity != null && trackedBlockEntity.isShown()) { VirtualCullableObject trackedBlockEntity = player.getTrackedBlockEntity(pos);
if (trackedBlockEntity != null) {
if (trackedBlockEntity.isShown) {
trackedBlockEntity.setShown(player, false); trackedBlockEntity.setShown(player, false);
} }
trackedBlockEntity.setCullable(renderer);
} else {
player.addTrackedBlockEntity(pos, renderer);
} }
} } else {
// 否则直接显示
else {
for (Player player : trackedBy) {
previousElement.hide(player); previousElement.hide(player);
element.show(player); element.show(player);
} }
} }
} }
} }
} else { }
/*
*
* 1 对 多, 多 对 多
*
*/
else {
VirtualCullableObject[] previousObjects = hasTrackedBy ? new VirtualCullableObject[trackedBy.size()] : null;
if (hasTrackedBy) {
for (int j = 0; j < previousObjects.length; j++) {
previousObjects[j] = trackedBy.get(j).getTrackedBlockEntity(pos);
}
}
outer: for (int i = 0; i < elements.length; i++) { outer: for (int i = 0; i < elements.length; i++) {
BlockEntityElementConfig<? extends BlockEntityElement> config = renderers[i]; BlockEntityElementConfig<? extends BlockEntityElement> config = renderers[i];
/*
* 严格可变换部分
*/
for (int j = 0; j < previousElements.length; j++) { for (int j = 0; j < previousElements.length; j++) {
BlockEntityElement previousElement = previousElements[j]; BlockEntityElement previousElement = previousElements[j];
if (previousElement != null && config.elementClass().isInstance(previousElement)) { if (previousElement != null && config.elementClass().isInstance(previousElement)) {
BlockEntityElement newElement = ((BlockEntityElementConfig) config).create(wrappedWorld, pos, previousElement); BlockEntityElement newElement = ((BlockEntityElementConfig) config).createExact(wrappedWorld, pos, previousElement);
if (newElement != null) { if (newElement != null) {
previousElements[j] = null; previousElements[j] = null;
elements[i] = newElement; elements[i] = newElement;
if (hasTrackedBy) { if (hasTrackedBy) {
// 如果启用实体剔除,那么只对已经渲染的进行变换 for (int k = 0; k < trackedBy.size(); k++) {
if (Config.enableEntityCulling()) { Player player = trackedBy.get(k);
for (Player player : trackedBy) { VirtualCullableObject cullableObject = previousObjects[k];
VirtualCullableObject trackedBlockEntity = player.addTrackedBlockEntity(pos, renderer); if (cullableObject == null || cullableObject.isShown) {
if (trackedBlockEntity == null || trackedBlockEntity.isShown()) {
newElement.transform(player);
}
}
}
// 否则直接变换
else {
for (Player player : trackedBy) {
newElement.transform(player); newElement.transform(player);
} }
} }
@@ -233,21 +249,48 @@ public class CEChunk {
} }
} }
} }
/*
* 可变换部分
*/
for (int j = 0; j < previousElements.length; j++) {
BlockEntityElement previousElement = previousElements[j];
if (previousElement != null && config.elementClass().isInstance(previousElement)) {
BlockEntityElement newElement = ((BlockEntityElementConfig) config).create(wrappedWorld, pos, previousElement);
if (newElement != null) {
previousElements[j] = null;
elements[i] = newElement;
if (hasTrackedBy) {
for (int k = 0; k < trackedBy.size(); k++) {
Player player = trackedBy.get(k);
VirtualCullableObject cullableObject = previousObjects[k];
if (cullableObject == null || cullableObject.isShown) {
newElement.transform(player);
}
}
}
continue outer;
}
}
}
/*
* 不可变换的直接生成
*/
BlockEntityElement newElement = config.create(wrappedWorld, pos); BlockEntityElement newElement = config.create(wrappedWorld, pos);
elements[i] = newElement; elements[i] = newElement;
if (hasTrackedBy) { if (hasTrackedBy) {
if (Config.enableEntityCulling()) { for (int k = 0; k < trackedBy.size(); k++) {
for (Player player : trackedBy) { Player player = trackedBy.get(k);
player.addTrackedBlockEntity(pos, renderer); VirtualCullableObject cullableObject = previousObjects[k];
} if (cullableObject == null || cullableObject.isShown) {
} else {
for (Player player : trackedBy) {
newElement.show(player); newElement.show(player);
} }
} }
} }
} }
if (hasTrackedBy) { if (hasTrackedBy) {
/*
* 未能完成变化的,需要直接删除
*/
for (int i = 0; i < previousElements.length; i++) { for (int i = 0; i < previousElements.length; i++) {
BlockEntityElement previousElement = previousElements[i]; BlockEntityElement previousElement = previousElements[i];
if (previousElement != null) { if (previousElement != null) {
@@ -256,19 +299,31 @@ public class CEChunk {
} }
} }
} }
// 添加 track
for (int i = 0; i < previousObjects.length; i++) {
VirtualCullableObject previousObject = previousObjects[i];
if (previousObject != null) {
previousObject.setCullable(renderer);
} else {
trackedBy.get(i).addTrackedBlockEntity(pos, renderer);
}
}
} }
} }
} else { } else {
/*
*
* 全新方块实体
*
*/
for (int i = 0; i < elements.length; i++) { for (int i = 0; i < elements.length; i++) {
elements[i] = renderers[i].create(wrappedWorld, pos); elements[i] = renderers[i].create(wrappedWorld, pos);
} }
if (hasTrackedBy) { if (hasTrackedBy) {
for (Player player : trackedBy) {
if (Config.enableEntityCulling()) { if (Config.enableEntityCulling()) {
for (Player player : trackedBy) {
player.addTrackedBlockEntity(pos, renderer); player.addTrackedBlockEntity(pos, renderer);
}
} else { } else {
for (Player player : trackedBy) {
renderer.show(player); renderer.show(player);
} }
} }

View File

@@ -4,7 +4,7 @@ import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.world.Cullable; import net.momirealms.craftengine.core.world.Cullable;
public class VirtualCullableObject { public class VirtualCullableObject {
public final Cullable cullable; public Cullable cullable;
public boolean isShown; public boolean isShown;
public VirtualCullableObject(Cullable cullable) { public VirtualCullableObject(Cullable cullable) {
@@ -12,6 +12,10 @@ public class VirtualCullableObject {
this.isShown = false; this.isShown = false;
} }
public void setCullable(Cullable cullable) {
this.cullable = cullable;
}
public Cullable cullable() { public Cullable cullable() {
return cullable; return cullable;
} }

View File

@@ -1,7 +1,7 @@
org.gradle.jvmargs=-Xmx1G org.gradle.jvmargs=-Xmx1G
# Project settings # Project settings
project_version=0.0.65.14 project_version=0.0.65.15
config_version=60 config_version=60
lang_version=41 lang_version=41
project_group=net.momirealms project_group=net.momirealms