diff --git a/overviewer_core/src/block_class.c b/overviewer_core/src/block_class.c new file mode 100644 index 0000000..47b0e63 --- /dev/null +++ b/overviewer_core/src/block_class.c @@ -0,0 +1,136 @@ +/* + * 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 . + */ + +#include "block_class.h" +#include "utils.h" + + +bool block_class_is_subset( + mc_block_t block, + const mc_block_t block_class[], + size_t block_class_len +) +{ + size_t i; + for( i = 0; 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_stone_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_purpur_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_stone_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_purpur_stairs, + block_grass, + block_flowing_water, + block_water, + block_glass, + block_chest, + block_redstone_wire, + block_ice, + block_fence, + block_portal, + block_iron_bars, + block_glass_pane, + block_waterlily, + block_nether_brick_fence, + block_cobblestone_wall, + block_double_plant, + block_stained_glass_pane, + block_stained_glass, + block_trapped_chest, + 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); \ No newline at end of file diff --git a/overviewer_core/src/block_class.h b/overviewer_core/src/block_class.h new file mode 100644 index 0000000..b772035 --- /dev/null +++ b/overviewer_core/src/block_class.h @@ -0,0 +1,47 @@ +/* + * 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 . + */ + +#ifndef __BLOCK_CLASS_H_INCLUDED__ +#define __BLOCK_CLASS_H_INCLUDED__ + +#include +#include + +#include "mc_id.h" + +bool block_class_is_subset( + mc_block_t block, + const mc_block_t block_class[], + size_t block_class_len +); + +extern const mc_block_t block_class_stair[]; +extern const size_t block_class_stair_len; + +extern const mc_block_t block_class_door[]; +extern const size_t block_class_door_len; + +extern const mc_block_t block_class_fence[]; +extern const size_t block_class_fence_len; + +extern const mc_block_t block_class_fence_gate[]; +extern const size_t block_class_fence_gate_len; + +extern const mc_block_t block_class_ancil[]; +extern const size_t block_class_ancil_len; + +#endif \ No newline at end of file diff --git a/overviewer_core/src/iterate.c b/overviewer_core/src/iterate.c index 00a6ace..4af96e5 100644 --- a/overviewer_core/src/iterate.c +++ b/overviewer_core/src/iterate.c @@ -17,6 +17,7 @@ #include "overviewer.h" #include "mc_id.h" +#include "block_class.h" static PyObject *textures = NULL; @@ -244,32 +245,6 @@ check_adjacent_blocks(RenderState *state, int x,int y,int z, unsigned short bloc return pdata; } - -static int -is_stairs(int block) { - /* - * Determines if a block is stairs of any material - */ - switch (block) { - case block_oak_stairs: - case block_stone_stairs: - case block_brick_stairs: - case block_stone_brick_stairs: - case block_nether_brick_stairs: - case block_sandstone_stairs: - case block_spruce_stairs: - case block_birch_stairs: - case block_jungle_stairs: - case block_quartz_stairs: - case block_acacia_stairs: - case block_dark_oak_stairs: - case block_red_sandstone_stairs: - case block_purpur_stairs: - return 1; - } - return 0; -} - unsigned short generate_pseudo_data(RenderState *state, unsigned short ancilData) { /* @@ -302,8 +277,7 @@ generate_pseudo_data(RenderState *state, unsigned short ancilData) { } data = (check_adjacent_blocks(state, x, y, z, state->block) ^ 0x0f) | data; return (data << 4) | (ancilData & 0x0f); - } else if ((state->block == block_fence) || (state->block == block_spruce_fence) || (state->block == block_birch_fence) || - (state->block == block_jungle_fence) || (state->block == block_dark_oak_fence) || (state->block == block_acacia_fence)) { /* fences */ + } else if (block_class_is_subset(state->block,block_class_fence,block_class_fence_len)) { /* fences */ /* check for fences AND fence gates */ return check_adjacent_blocks(state, x, y, z, state->block) | check_adjacent_blocks(state, x, y, z, block_fence_gate) | check_adjacent_blocks(state, x, y, z, block_fence_gate) | check_adjacent_blocks(state, x, y, z, block_birch_fence_gate) | check_adjacent_blocks(state, x, y, z, block_jungle_fence_gate) | @@ -393,9 +367,7 @@ generate_pseudo_data(RenderState *state, unsigned short ancilData) { /* portal and nether brick fences */ return check_adjacent_blocks(state, x, y, z, state->block); - } else if ((state->block == block_wooden_door) || (state->block == block_iron_door) || (state->block == block_spruce_door) || - (state->block == block_birch_door) || (state->block == block_jungle_door) || (state->block == block_acacia_door) || - (state->block == block_dark_oak_door)) { + } else if (block_class_is_subset(state->block,block_class_door,block_class_door_len)) { /* use bottom block data format plus one bit for top/down * block (0x8) and one bit for hinge position (0x10) */ @@ -442,7 +414,7 @@ generate_pseudo_data(RenderState *state, unsigned short ancilData) { pr = pr * pr * 42317861 + pr * 11; rotation = 3 & (pr >> 16); return rotation; - } else if (is_stairs(state->block)) { /* stairs */ + } else if (block_class_is_subset(state->block,block_class_stair,block_class_stair_len)) { /* stairs */ /* 4 ancillary bits will be added to indicate which quarters of the block contain the * upper step. Regular stairs will have 2 bits set & corner stairs will have 1 or 3. * Southwest quarter is part of the upper step - 0x40 @@ -499,10 +471,10 @@ generate_pseudo_data(RenderState *state, unsigned short ancilData) { /* get block & data for neighbors in this order: east, north, west, south */ /* so we can rotate things easily */ - stairs[0] = stairs[4] = is_stairs(get_data(state, BLOCKS, x+1, y, z)); - stairs[1] = stairs[5] = is_stairs(get_data(state, BLOCKS, x, y, z-1)); - stairs[2] = stairs[6] = is_stairs(get_data(state, BLOCKS, x-1, y, z)); - stairs[3] = stairs[7] = is_stairs(get_data(state, BLOCKS, x, y, z+1)); + stairs[0] = stairs[4] = block_class_is_subset(get_data(state, BLOCKS, x+1, y, z),block_class_stair,block_class_stair_len); + stairs[1] = stairs[5] = block_class_is_subset(get_data(state, BLOCKS, x, y, z-1),block_class_stair,block_class_stair_len); + stairs[2] = stairs[6] = block_class_is_subset(get_data(state, BLOCKS, x-1, y, z),block_class_stair,block_class_stair_len); + stairs[3] = stairs[7] = block_class_is_subset(get_data(state, BLOCKS, x, y, z+1),block_class_stair,block_class_stair_len); neigh[0] = neigh[4] = FIX_ROT(get_data(state, DATA, x+1, y, z)); neigh[1] = neigh[5] = FIX_ROT(get_data(state, DATA, x, y, z-1)); neigh[2] = neigh[6] = FIX_ROT(get_data(state, DATA, x-1, y, z)); @@ -698,29 +670,7 @@ chunk_render(PyObject *self, PyObject *args) { * grass, water, glass, chest, restone wire, * ice, fence, portal, iron bars, glass panes, * trapped chests, stairs */ - if ((state.block == block_grass) || - (state.block == block_flowing_water) || (state.block == block_water) || - (state.block == block_glass) || (state.block == block_chest) || - (state.block == block_redstone_wire) || - /* doors */ - (state.block == block_wooden_door ) || - (state.block == block_iron_door ) || - (state.block == block_spruce_door ) || - (state.block == block_birch_door ) || - (state.block == block_jungle_door ) || - (state.block == block_acacia_door ) || - (state.block == block_dark_oak_door) || - /* end doors */ - (state.block == block_ice) || - (state.block == block_fence) || (state.block == block_portal) || - (state.block == block_iron_bars) || (state.block == block_glass_pane) || - (state.block == block_waterlily) || (state.block == block_nether_brick_fence) || - (state.block == block_cobblestone_wall) || (state.block == block_double_plant) || - (state.block == block_stained_glass_pane) || (state.block == block_stained_glass) || - (state.block == block_trapped_chest) || (state.block == block_spruce_fence) || - (state.block == block_birch_fence) || (state.block == block_jungle_fence) || - (state.block == block_dark_oak_fence) || (state.block == block_acacia_fence) || - is_stairs(state.block)) { + if (block_class_is_subset(state.block,block_class_ancil,block_class_ancil_len)) { ancilData = generate_pseudo_data(&state, ancilData); state.block_pdata = ancilData; } else { diff --git a/overviewer_core/src/utils.h b/overviewer_core/src/utils.h index 02108b5..4003e96 100644 --- a/overviewer_core/src/utils.h +++ b/overviewer_core/src/utils.h @@ -14,4 +14,7 @@ #define OV_BLEND(mask, in1, in2, tmp1, tmp2)\ (OV_MULDIV255(in1, 255 - mask, tmp1) + OV_MULDIV255(in2, mask, tmp2)) -#endif +#define count_of(array) \ + (sizeof(array) / sizeof(array[0])) + +#endif \ No newline at end of file diff --git a/setup.py b/setup.py index 4163147..b38c65a 100755 --- a/setup.py +++ b/setup.py @@ -175,7 +175,7 @@ for name in glob.glob("overviewer_core/src/primitives/*.c"): name = os.path.splitext(name)[0] primitives.append(name) -c_overviewer_files = ['main.c', 'composite.c', 'iterate.c', 'endian.c', 'rendermodes.c'] +c_overviewer_files = ['main.c', 'composite.c', 'iterate.c', 'endian.c', 'rendermodes.c', 'block_class.c'] c_overviewer_files += map(lambda mode: 'primitives/%s.c' % (mode,), primitives) c_overviewer_files += ['Draw.c'] c_overviewer_includes = ['overviewer.h', 'rendermodes.h']