0
This repository has been archived on 2025-04-25. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Minecraft-Overviewer/overviewer_core/src/block_class.c
Auron956 a3960bd419 Fix chest rendering by using 'type' property
Resolves an issue where chests with more than one adjacent chest would
fail to render. Instead of distinguishing double from single chests by
checking for the presence of adjacent chests, use the provided "type"
property of chests to determine if they are single or the left/right
part of a double chest.
2020-02-04 00:16:28 +00:00

272 lines
7.8 KiB
C

/*
* This file is part of the Minecraft Overviewer.
*
* Minecraft Overviewer is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* Minecraft Overviewer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with the Overviewer. If not, see <http://www.gnu.org/licenses/>.
*/
#include "block_class.h"
#include "utils.h"
#if defined(__i386__) || defined(__x86_64__)
#include <immintrin.h>
#endif
bool block_class_is_subset(
mc_block_t block,
const mc_block_t block_class[],
size_t block_class_len) {
size_t i = 0;
#ifdef __SSE2__
for (; i / 8 < block_class_len / 8; i += 8) {
const __m128i block_class_vec = _mm_loadu_si128(
(__m128i*)&block_class[i]);
const __m128i block_vec = _mm_set1_epi16(block);
const __m128i block_cmp = _mm_cmpeq_epi16(block_vec, block_class_vec);
if (_mm_movemask_epi8(block_cmp)) {
return true;
}
}
#endif
#ifdef __MMX__
for (; i / 4 < block_class_len / 4; i += 4) {
const __m64 block_class_vec = _mm_cvtsi64_m64(
*(uint64_t*)&block_class[i]);
const __m64 block_vec = _mm_set1_pi16(block);
const __m64 block_cmp = _mm_cmpeq_pi16(block_vec, block_class_vec);
if (_mm_cvtm64_si64(block_cmp)) {
return true;
}
}
#endif
for (; i < block_class_len; ++i) {
if (block == block_class[i]) {
return true;
}
}
return false;
}
const mc_block_t block_class_stair[] = {
block_oak_stairs,
block_brick_stairs,
block_stone_brick_stairs,
block_nether_brick_stairs,
block_sandstone_stairs,
block_spruce_stairs,
block_birch_stairs,
block_jungle_stairs,
block_quartz_stairs,
block_acacia_stairs,
block_dark_oak_stairs,
block_red_sandstone_stairs,
block_smooth_red_sandstone_stairs,
block_purpur_stairs,
block_prismarine_stairs,
block_dark_prismarine_stairs,
block_prismarine_brick_stairs,
block_mossy_cobblestone_stairs,
block_cobblestone_stairs,
block_smooth_quartz_stairs,
block_polished_granite_stairs,
block_polished_diorite_stairs,
block_polished_andesite_stairs,
block_stone_stairs,
block_granite_stairs,
block_diorite_stairs,
block_andesite_stairs,
block_end_stone_brick_stairs,
block_red_nether_brick_stairs,
block_mossy_stone_brick_stairs,
block_smooth_sandstone_stairs};
const size_t block_class_stair_len = COUNT_OF(block_class_stair);
const mc_block_t block_class_door[] = {
block_wooden_door,
block_iron_door,
block_spruce_door,
block_birch_door,
block_jungle_door,
block_acacia_door,
block_dark_oak_door};
const size_t block_class_door_len = COUNT_OF(block_class_door);
const mc_block_t block_class_fence[] = {
block_fence,
block_nether_brick_fence,
block_spruce_fence,
block_birch_fence,
block_jungle_fence,
block_dark_oak_fence,
block_acacia_fence};
const size_t block_class_fence_len = COUNT_OF(block_class_fence);
const mc_block_t block_class_fence_gate[] = {
block_fence_gate,
block_spruce_fence_gate,
block_birch_fence_gate,
block_jungle_fence_gate,
block_dark_oak_fence_gate,
block_acacia_fence_gate};
const size_t block_class_fence_gate_len = COUNT_OF(block_class_fence_gate);
const mc_block_t block_class_ancil[] = {
block_wooden_door,
block_iron_door,
block_spruce_door,
block_birch_door,
block_jungle_door,
block_acacia_door,
block_dark_oak_door,
block_oak_stairs,
block_brick_stairs,
block_stone_brick_stairs,
block_nether_brick_stairs,
block_sandstone_stairs,
block_spruce_stairs,
block_birch_stairs,
block_jungle_stairs,
block_quartz_stairs,
block_acacia_stairs,
block_dark_oak_stairs,
block_red_sandstone_stairs,
block_smooth_red_sandstone_stairs,
block_purpur_stairs,
block_prismarine_stairs,
block_dark_prismarine_stairs,
block_prismarine_brick_stairs,
block_cobblestone_stairs,
block_mossy_cobblestone_stairs,
block_mossy_stone_brick_stairs,
block_smooth_quartz_stairs,
block_polished_granite_stairs,
block_polished_diorite_stairs,
block_polished_andesite_stairs,
block_stone_stairs,
block_granite_stairs,
block_diorite_stairs,
block_andesite_stairs,
block_end_stone_brick_stairs,
block_red_nether_brick_stairs,
block_smooth_sandstone_stairs,
block_grass,
block_flowing_water,
block_water,
block_glass,
block_redstone_wire,
block_ice,
block_fence,
block_portal,
block_iron_bars,
block_glass_pane,
block_waterlily,
block_nether_brick_fence,
block_andesite_wall,
block_brick_wall,
block_cobblestone_wall,
block_diorite_wall,
block_end_stone_brick_wall,
block_granite_wall,
block_mossy_cobblestone_wall,
block_mossy_stone_brick_wall,
block_nether_brick_wall,
block_prismarine_wall,
block_red_nether_brick_wall,
block_red_sandstone_wall,
block_sandstone_wall,
block_stone_brick_wall,
block_double_plant,
block_stained_glass_pane,
block_stained_glass,
block_spruce_fence,
block_birch_fence,
block_jungle_fence,
block_dark_oak_fence,
block_acacia_fence};
const size_t block_class_ancil_len = COUNT_OF(block_class_ancil);
const mc_block_t block_class_alt_height[] = {
block_stone_slab,
block_oak_stairs,
block_brick_stairs,
block_stone_brick_stairs,
block_nether_brick_stairs,
block_sandstone_stairs,
block_spruce_stairs,
block_birch_stairs,
block_jungle_stairs,
block_quartz_stairs,
block_acacia_stairs,
block_dark_oak_stairs,
block_red_sandstone_stairs,
block_smooth_red_sandstone_stairs,
block_prismarine_stairs,
block_dark_prismarine_stairs,
block_prismarine_brick_stairs,
block_cobblestone_stairs,
block_mossy_cobblestone_stairs,
block_mossy_stone_brick_stairs,
block_smooth_quartz_stairs,
block_polished_granite_stairs,
block_polished_diorite_stairs,
block_polished_andesite_stairs,
block_stone_stairs,
block_granite_stairs,
block_diorite_stairs,
block_andesite_stairs,
block_end_stone_brick_stairs,
block_red_nether_brick_stairs,
block_smooth_sandstone_stairs,
block_prismarine_slab,
block_dark_prismarine_slab,
block_prismarine_brick_slab,
block_andesite_slab,
block_diorite_slab,
block_granite_slab,
block_polished_andesite_slab,
block_polished_diorite_slab,
block_polished_granite_slab,
block_red_nether_brick_slab,
block_smooth_sandstone_slab,
block_cut_sandstone_slab,
block_smooth_red_sandstone_slab,
block_cut_red_sandstone_slab,
block_end_stone_brick_slab,
block_mossy_cobblestone_slab,
block_mossy_stone_brick_slab,
block_smooth_quartz_slab,
block_smooth_stone_slab,
block_stone_slab2,
block_purpur_stairs,
block_purpur_slab,
block_wooden_slab};
const size_t block_class_alt_height_len = COUNT_OF(block_class_alt_height);
const mc_block_t block_class_wall[] = {
block_andesite_wall,
block_brick_wall,
block_cobblestone_wall,
block_diorite_wall,
block_end_stone_brick_wall,
block_granite_wall,
block_mossy_cobblestone_wall,
block_mossy_stone_brick_wall,
block_nether_brick_wall,
block_prismarine_wall,
block_red_nether_brick_wall,
block_red_sandstone_wall,
block_sandstone_wall,
block_stone_brick_wall};
const size_t block_class_wall_len = COUNT_OF(block_class_wall);