Merge branch 'master' into python3-fun-times
This commit is contained in:
212
overviewer_core/src/block_class.c
Normal file
212
overviewer_core/src/block_class.c
Normal file
@@ -0,0 +1,212 @@
|
||||
/*
|
||||
* 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_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_prismarine_stairs,
|
||||
block_dark_prismarine_stairs,
|
||||
block_prismarine_brick_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_prismarine_stairs,
|
||||
block_dark_prismarine_stairs,
|
||||
block_prismarine_brick_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);
|
||||
|
||||
const mc_block_t block_class_alt_height[] = {
|
||||
block_stone_slab,
|
||||
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_prismarine_stairs,
|
||||
block_dark_prismarine_stairs,
|
||||
block_prismarine_brick_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);
|
||||
|
||||
51
overviewer_core/src/block_class.h
Normal file
51
overviewer_core/src/block_class.h
Normal file
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
#ifndef __BLOCK_CLASS_H_INCLUDED__
|
||||
#define __BLOCK_CLASS_H_INCLUDED__
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#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;
|
||||
|
||||
extern const mc_block_t block_class_alt_height[];
|
||||
extern const size_t block_class_alt_height_len;
|
||||
|
||||
#endif
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
*/
|
||||
|
||||
#include "overviewer.h"
|
||||
#include "mc_id.h"
|
||||
#include "block_class.h"
|
||||
|
||||
static PyObject *textures = NULL;
|
||||
|
||||
@@ -242,32 +244,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 53: /* oak wood stairs */
|
||||
case 67: /* cobblestone stairs */
|
||||
case 108: /* brick stairs */
|
||||
case 109: /* stone brick stairs */
|
||||
case 114: /* nether brick stairs */
|
||||
case 128: /* sandstone stairs */
|
||||
case 134: /* spruce wood stairs */
|
||||
case 135: /* birch wood stairs */
|
||||
case 136: /* jungle wood stairs */
|
||||
case 156: /* quartz stairs */
|
||||
case 163: /* acacia wood stairs */
|
||||
case 164: /* dark wood stairs */
|
||||
case 180: /* red sandstone stairs */
|
||||
case 203: /* purpur stairs */
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned short
|
||||
generate_pseudo_data(RenderState *state, unsigned short ancilData) {
|
||||
/*
|
||||
@@ -277,18 +253,18 @@ generate_pseudo_data(RenderState *state, unsigned short ancilData) {
|
||||
int x = state->x, y = state->y, z = state->z;
|
||||
unsigned short data = 0;
|
||||
|
||||
if (state->block == 2) { /* grass */
|
||||
if (state->block == block_grass) { /* grass */
|
||||
/* return 0x10 if grass is covered in snow */
|
||||
if (get_data(state, BLOCKS, x, y+1, z) == 78)
|
||||
return 0x10;
|
||||
return ancilData;
|
||||
} else if (state->block == 8 || state->block == 9) { /* water */
|
||||
} else if (block_class_is_subset(state->block, (mc_block_t[]){block_flowing_water,block_water}, 2)) { /* water */
|
||||
data = check_adjacent_blocks(state, x, y, z, state->block) ^ 0x0f;
|
||||
/* an aditional bit for top is added to the 4 bits of check_adjacent_blocks */
|
||||
if (get_data(state, BLOCKS, x, y+1, z) != state->block)
|
||||
data |= 0x10;
|
||||
return data;
|
||||
} else if ((state->block == 20) || (state->block == 79) || (state->block == 95)) { /* glass and ice and stained glass*/
|
||||
} else if (block_class_is_subset(state->block, (mc_block_t[]){block_glass,block_ice,block_stained_glass}, 3)) { /* glass and ice and stained glass*/
|
||||
/* an aditional bit for top is added to the 4 bits of check_adjacent_blocks
|
||||
* Note that stained glass encodes 16 colors using 4 bits. this pushes us over the 8-bits of an unsigned char,
|
||||
* forcing us to use an unsigned short to hold 16 bits of pseudo ancil data
|
||||
@@ -300,14 +276,13 @@ 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 == 85) || (state->block == 188) || (state->block == 189) ||
|
||||
(state->block == 190) || (state->block == 191) || (state->block == 192)) { /* 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, 107) |
|
||||
check_adjacent_blocks(state, x, y, z, 183) | check_adjacent_blocks(state, x, y, z, 184) | check_adjacent_blocks(state, x, y, z, 185) |
|
||||
check_adjacent_blocks(state, x, y, z, 186) | check_adjacent_blocks(state, x, y, z, 187);
|
||||
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) |
|
||||
check_adjacent_blocks(state, x, y, z, block_dark_oak_fence_gate) | check_adjacent_blocks(state, x, y, z, block_acacia_fence_gate);
|
||||
|
||||
} else if (state->block == 55) { /* redstone */
|
||||
} else if (state->block == block_redstone_wire) { /* redstone */
|
||||
/* three addiotional bit are added, one for on/off state, and
|
||||
* another two for going-up redstone wire in the same block
|
||||
* (connection with the level y+1) */
|
||||
@@ -341,7 +316,7 @@ generate_pseudo_data(RenderState *state, unsigned short ancilData) {
|
||||
}
|
||||
return final_data;
|
||||
|
||||
} else if (state->block == 54 || state->block == 146) { /* normal chests and trapped chests */
|
||||
} else if (block_class_is_subset(state->block, (mc_block_t[]){block_chest,block_trapped_chest}, 2)) {
|
||||
/* Orientation is given by ancilData, pseudo data needed to
|
||||
* choose from single or double chest and the correct half of
|
||||
* the chest. */
|
||||
@@ -378,7 +353,7 @@ generate_pseudo_data(RenderState *state, unsigned short ancilData) {
|
||||
}
|
||||
return final_data;
|
||||
|
||||
} else if ((state->block == 101) || (state->block == 102) || (state->block == 160)) {
|
||||
} else if (block_class_is_subset(state->block, (mc_block_t[]){block_iron_bars,block_glass_pane, block_stained_glass_pane},3)) {
|
||||
/* iron bars and glass panes:
|
||||
* they seem to stick to almost everything but air,
|
||||
* not sure yet! Still a TODO! */
|
||||
@@ -387,13 +362,11 @@ generate_pseudo_data(RenderState *state, unsigned short ancilData) {
|
||||
data = (check_adjacent_blocks(state, x, y, z, 0) ^ 0x0f);
|
||||
return (data << 4) | (ancilData & 0xf);
|
||||
|
||||
} else if ((state->block == 90) || (state->block == 113)) {
|
||||
} else if (block_class_is_subset(state->block, (mc_block_t[]){block_portal,block_nether_brick_fence}, 2)) {
|
||||
/* portal and nether brick fences */
|
||||
return check_adjacent_blocks(state, x, y, z, state->block);
|
||||
|
||||
} else if ((state->block == 64) || (state->block == 71) || (state->block == 193) ||
|
||||
(state->block == 194) || (state->block == 195) || (state->block == 196) ||
|
||||
(state->block ==197)) {
|
||||
} 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)
|
||||
*/
|
||||
@@ -419,14 +392,14 @@ generate_pseudo_data(RenderState *state, unsigned short ancilData) {
|
||||
|
||||
}
|
||||
return data;
|
||||
} else if (state->block == 139) { /* cobblestone and mossy cobbleston wall */
|
||||
} else if (state->block == block_cobblestone_wall) {
|
||||
/* check for walls and add one bit with the type of wall (mossy or cobblestone)*/
|
||||
if (ancilData == 0x1) {
|
||||
return check_adjacent_blocks(state, x, y, z, state->block) | 0x10;
|
||||
} else {
|
||||
return check_adjacent_blocks(state, x, y, z, state->block);
|
||||
}
|
||||
} else if (state->block == 111) { /* lilypads */
|
||||
} else if (state->block == block_waterlily) {
|
||||
int wx,wz,wy,rotation;
|
||||
long pr;
|
||||
/* calculate the global block coordinates of this position */
|
||||
@@ -440,7 +413,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
|
||||
@@ -497,10 +470,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));
|
||||
@@ -546,11 +519,11 @@ generate_pseudo_data(RenderState *state, unsigned short ancilData) {
|
||||
}
|
||||
|
||||
return ancilData;
|
||||
} else if (state->block == 175) { /* doublePlants */
|
||||
} else if (state->block == block_double_plant) { /* doublePlants */
|
||||
/* use bottom block data format plus one bit for top
|
||||
* block (0x8)
|
||||
*/
|
||||
if( get_data(state, BLOCKS, x, y-1, z) == 175 ) {
|
||||
if( get_data(state, BLOCKS, x, y-1, z) == block_double_plant ) {
|
||||
data = get_data(state, DATA, x, y-1, z) | 0x8;
|
||||
} else {
|
||||
data = ancilData;
|
||||
@@ -662,10 +635,9 @@ chunk_render(PyObject *self, PyObject *args) {
|
||||
unsigned short ancilData;
|
||||
|
||||
state.imgy -= 12;
|
||||
|
||||
/* get blockid */
|
||||
state.block = getArrayShort3D(blocks_py, state.x, state.y, state.z);
|
||||
if (state.block == 0 || render_mode_hidden(rendermode, state.x, state.y, state.z)) {
|
||||
if (state.block == block_air || render_mode_hidden(rendermode, state.x, state.y, state.z)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -697,25 +669,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 == 2) ||
|
||||
(state.block == 8) || (state.block == 9) ||
|
||||
(state.block == 20) || (state.block == 54) ||
|
||||
(state.block == 55) ||
|
||||
/* doors */
|
||||
(state.block == 64) || (state.block == 193) ||
|
||||
(state.block == 194) || (state.block == 195) ||
|
||||
(state.block == 196) || (state.block == 197) ||
|
||||
(state.block == 71) || /* end doors */
|
||||
(state.block == 79) ||
|
||||
(state.block == 85) || (state.block == 90) ||
|
||||
(state.block == 101) || (state.block == 102) ||
|
||||
(state.block == 111) || (state.block == 113) ||
|
||||
(state.block == 139) || (state.block == 175) ||
|
||||
(state.block == 160) || (state.block == 95) ||
|
||||
(state.block == 146) || (state.block == 188) ||
|
||||
(state.block == 189) || (state.block == 190) ||
|
||||
(state.block == 191) || (state.block == 192) ||
|
||||
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 {
|
||||
@@ -737,7 +691,7 @@ chunk_render(PyObject *self, PyObject *args) {
|
||||
if (t != NULL && t != Py_None)
|
||||
{
|
||||
PyObject *src, *mask, *mask_light;
|
||||
int do_rand = (state.block == 31 /*|| state.block == 38 || state.block == 175*/);
|
||||
int do_rand = (state.block == block_tallgrass /*|| state.block == block_red_flower || state.block == block_double_plant*/);
|
||||
int randx = 0, randy = 0;
|
||||
src = PyTuple_GetItem(t, 0);
|
||||
mask = PyTuple_GetItem(t, 0);
|
||||
@@ -761,7 +715,7 @@ chunk_render(PyObject *self, PyObject *args) {
|
||||
state.imgx -= randx;
|
||||
state.imgy -= randy;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
502
overviewer_core/src/mc_id.h
Normal file
502
overviewer_core/src/mc_id.h
Normal file
@@ -0,0 +1,502 @@
|
||||
#ifndef __MC_ID_H_INCLUDED__
|
||||
#define __MC_ID_H_INCLUDED__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
enum mc_block_id
|
||||
{
|
||||
block_air = 0,
|
||||
block_stone = 1,
|
||||
block_grass = 2,
|
||||
block_dirt = 3,
|
||||
block_cobblestone = 4,
|
||||
block_planks = 5,
|
||||
block_sapling = 6,
|
||||
block_bedrock = 7,
|
||||
block_flowing_water = 8,
|
||||
block_water = 9,
|
||||
block_flowing_lava = 10,
|
||||
block_lava = 11,
|
||||
block_sand = 12,
|
||||
block_gravel = 13,
|
||||
block_gold_ore = 14,
|
||||
block_iron_ore = 15,
|
||||
block_coal_ore = 16,
|
||||
block_log = 17,
|
||||
block_leaves = 18,
|
||||
block_sponge = 19,
|
||||
block_glass = 20,
|
||||
block_lapis_ore = 21,
|
||||
block_lapis_block = 22,
|
||||
block_dispenser = 23,
|
||||
block_sandstone = 24,
|
||||
block_noteblock = 25,
|
||||
block_bed = 26,
|
||||
block_golden_rail = 27,
|
||||
block_detector_rail = 28,
|
||||
block_sticky_piston = 29,
|
||||
block_web = 30,
|
||||
block_tallgrass = 31,
|
||||
block_deadbush = 32,
|
||||
block_piston = 33,
|
||||
block_piston_head = 34,
|
||||
block_wool = 35,
|
||||
block_yellow_flower = 37,
|
||||
block_red_flower = 38,
|
||||
block_brown_mushroom = 39,
|
||||
block_red_mushroom = 40,
|
||||
block_gold_block = 41,
|
||||
block_iron_block = 42,
|
||||
block_double_stone_slab = 43,
|
||||
block_stone_slab = 44,
|
||||
block_brick_block = 45,
|
||||
block_tnt = 46,
|
||||
block_bookshelf = 47,
|
||||
block_mossy_cobblestone = 48,
|
||||
block_obsidian = 49,
|
||||
block_torch = 50,
|
||||
block_fire = 51,
|
||||
block_mob_spawner = 52,
|
||||
block_oak_stairs = 53,
|
||||
block_chest = 54,
|
||||
block_redstone_wire = 55,
|
||||
block_diamond_ore = 56,
|
||||
block_diamond_block = 57,
|
||||
block_crafting_table = 58,
|
||||
block_wheat = 59,
|
||||
block_farmland = 60,
|
||||
block_furnace = 61,
|
||||
block_lit_furnace = 62,
|
||||
block_standing_sign = 63,
|
||||
block_wooden_door = 64,
|
||||
block_ladder = 65,
|
||||
block_rail = 66,
|
||||
block_stone_stairs = 67,
|
||||
block_wall_sign = 68,
|
||||
block_lever = 69,
|
||||
block_stone_pressure_plate = 70,
|
||||
block_iron_door = 71,
|
||||
block_wooden_pressure_plate = 72,
|
||||
block_redstone_ore = 73,
|
||||
block_lit_redstone_ore = 74,
|
||||
block_unlit_redstone_torch = 75,
|
||||
block_redstone_torch = 76,
|
||||
block_stone_button = 77,
|
||||
block_snow_layer = 78,
|
||||
block_ice = 79,
|
||||
block_snow = 80,
|
||||
block_cactus = 81,
|
||||
block_clay = 82,
|
||||
block_reeds = 83,
|
||||
block_jukebox = 84,
|
||||
block_fence = 85,
|
||||
block_pumpkin = 86,
|
||||
block_netherrack = 87,
|
||||
block_soul_sand = 88,
|
||||
block_glowstone = 89,
|
||||
block_portal = 90,
|
||||
block_lit_pumpkin = 91,
|
||||
block_cake = 92,
|
||||
block_unpowered_repeater = 93,
|
||||
block_powered_repeater = 94,
|
||||
block_stained_glass = 95,
|
||||
block_trapdoor = 96,
|
||||
block_monster_egg = 97,
|
||||
block_stonebrick = 98,
|
||||
block_brown_mushroom_block = 99,
|
||||
block_red_mushroom_block = 100,
|
||||
block_iron_bars = 101,
|
||||
block_glass_pane = 102,
|
||||
block_melon_block = 103,
|
||||
block_pumpkin_stem = 104,
|
||||
block_melon_stem = 105,
|
||||
block_vine = 106,
|
||||
block_fence_gate = 107,
|
||||
block_brick_stairs = 108,
|
||||
block_stone_brick_stairs = 109,
|
||||
block_mycelium = 110,
|
||||
block_waterlily = 111,
|
||||
block_nether_brick = 112,
|
||||
block_nether_brick_fence = 113,
|
||||
block_nether_brick_stairs = 114,
|
||||
block_nether_wart = 115,
|
||||
block_enchanting_table = 116,
|
||||
block_brewing_stand = 117,
|
||||
block_cauldron = 118,
|
||||
block_end_portal = 119,
|
||||
block_end_portal_frame = 120,
|
||||
block_end_stone = 121,
|
||||
block_dragon_egg = 122,
|
||||
block_redstone_lamp = 123,
|
||||
block_lit_redstone_lamp = 124,
|
||||
block_double_wooden_slab = 125,
|
||||
block_wooden_slab = 126,
|
||||
block_cocoa = 127,
|
||||
block_sandstone_stairs = 128,
|
||||
block_emerald_ore = 129,
|
||||
block_ender_chest = 130,
|
||||
block_tripwire_hook = 131,
|
||||
block_tripwire_wire = 132,
|
||||
block_emerald_block = 133,
|
||||
block_spruce_stairs = 134,
|
||||
block_birch_stairs = 135,
|
||||
block_jungle_stairs = 136,
|
||||
block_command_block = 137,
|
||||
block_beacon = 138,
|
||||
block_cobblestone_wall = 139,
|
||||
block_flower_pot = 140,
|
||||
block_carrots = 141,
|
||||
block_potatoes = 142,
|
||||
block_wooden_button = 143,
|
||||
block_skull = 144,
|
||||
block_anvil = 145,
|
||||
block_trapped_chest = 146,
|
||||
block_light_weighted_pressure_plate = 147,
|
||||
block_heavy_weighted_pressure_plate = 148,
|
||||
block_unpowered_comparator = 149,
|
||||
block_powered_comparator = 150,
|
||||
block_daylight_detector = 151,
|
||||
block_redstone_block = 152,
|
||||
block_quartz_ore = 153,
|
||||
block_hopper = 154,
|
||||
block_quartz_block = 155,
|
||||
block_quartz_stairs = 156,
|
||||
block_activator_rail = 157,
|
||||
block_dropper = 158,
|
||||
block_stained_hardened_clay = 159,
|
||||
block_stained_glass_pane = 160,
|
||||
block_leaves2 = 161,
|
||||
block_log2 = 162,
|
||||
block_acacia_stairs = 163,
|
||||
block_dark_oak_stairs = 164,
|
||||
block_slime = 165,
|
||||
block_barrier = 166,
|
||||
block_iron_trapdoor = 167,
|
||||
block_prismarine = 168,
|
||||
block_sea_lantern = 169,
|
||||
block_hay_block = 170,
|
||||
block_carpet = 171,
|
||||
block_hardened_clay = 172,
|
||||
block_coal_block = 173,
|
||||
block_packed_ice = 174,
|
||||
block_double_plant = 175,
|
||||
block_standing_banner = 176,
|
||||
block_wall_banner = 177,
|
||||
block_daylight_detector_inverted = 178,
|
||||
block_red_sandstone = 179,
|
||||
block_red_sandstone_stairs = 180,
|
||||
block_double_stone_slab2 = 181,
|
||||
block_stone_slab2 = 182,
|
||||
block_spruce_fence_gate = 183,
|
||||
block_birch_fence_gate = 184,
|
||||
block_jungle_fence_gate = 185,
|
||||
block_dark_oak_fence_gate = 186,
|
||||
block_acacia_fence_gate = 187,
|
||||
block_spruce_fence = 188,
|
||||
block_birch_fence = 189,
|
||||
block_jungle_fence = 190,
|
||||
block_dark_oak_fence = 191,
|
||||
block_acacia_fence = 192,
|
||||
block_spruce_door = 193,
|
||||
block_birch_door = 194,
|
||||
block_jungle_door = 195,
|
||||
block_acacia_door = 196,
|
||||
block_dark_oak_door = 197,
|
||||
block_end_rod = 198,
|
||||
block_chorus_plant = 199,
|
||||
block_chorus_flower = 200,
|
||||
block_purpur_block = 201,
|
||||
block_purpur_pillar = 202,
|
||||
block_purpur_stairs = 203,
|
||||
block_purpur_double_slab = 204,
|
||||
block_purpur_slab = 205,
|
||||
block_end_bricks = 206,
|
||||
block_beetroots = 207,
|
||||
block_grass_path = 208,
|
||||
block_end_gateway = 209,
|
||||
block_repeating_command_block = 210,
|
||||
block_chain_command_block = 211,
|
||||
block_frosted_ice = 212,
|
||||
block_magma = 213,
|
||||
block_nether_wart_block = 214,
|
||||
block_red_nether_brick = 215,
|
||||
block_bone_block = 216,
|
||||
block_structure_void = 217,
|
||||
block_observer = 218,
|
||||
block_white_shulker_box = 219,
|
||||
block_orange_shulker_box = 220,
|
||||
block_magenta_shulker_box = 221,
|
||||
block_light_blue_shulker_box = 222,
|
||||
block_yellow_shulker_box = 223,
|
||||
block_lime_shulker_box = 224,
|
||||
block_pink_shulker_box = 225,
|
||||
block_gray_shulker_box = 226,
|
||||
block_silver_shulker_box = 227,
|
||||
block_cyan_shulker_box = 228,
|
||||
block_purple_shulker_box = 229,
|
||||
block_blue_shulker_box = 230,
|
||||
block_brown_shulker_box = 231,
|
||||
block_green_shulker_box = 232,
|
||||
block_red_shulker_box = 233,
|
||||
block_black_shulker_box = 234,
|
||||
block_white_glazed_terracotta = 235,
|
||||
block_orange_glazed_terracotta = 236,
|
||||
block_magenta_glazed_terracotta = 237,
|
||||
block_light_blue_glazed_terracotta = 238,
|
||||
block_yellow_glazed_terracotta = 239,
|
||||
block_lime_glazed_terracotta = 240,
|
||||
block_pink_glazed_terracotta = 241,
|
||||
block_gray_glazed_terracotta = 242,
|
||||
block_light_gray_glazed_terracotta = 243,
|
||||
block_cyan_glazed_terracotta = 244,
|
||||
block_purple_glazed_terracotta = 245,
|
||||
block_blue_glazed_terracotta = 246,
|
||||
block_brown_glazed_terracotta = 247,
|
||||
block_green_glazed_terracotta = 248,
|
||||
block_red_glazed_terracotta = 249,
|
||||
block_black_glazed_terracotta = 250,
|
||||
block_concrete = 251,
|
||||
block_concrete_powder = 252,
|
||||
block_structure_block = 255,
|
||||
block_prismarine_stairs = 11337,
|
||||
block_dark_prismarine_stairs = 11338,
|
||||
block_prismarine_brick_stairs = 11339,
|
||||
block_prismarine_slab = 11340,
|
||||
block_dark_prismarine_slab = 11341,
|
||||
block_prismarine_brick_slab = 11342,
|
||||
block_andesite_slab = 11343,
|
||||
block_diorite_slab = 11344,
|
||||
block_granite_slab = 11345,
|
||||
block_polished_andesite_slab = 11346,
|
||||
block_polished_diorite_slab = 11347,
|
||||
block_polished_granite_slab = 11348,
|
||||
block_red_nether_brick_slab = 11349,
|
||||
block_smooth_sandstone_slab = 11350,
|
||||
block_cut_sandstone_slab = 11351,
|
||||
block_smooth_red_sandstone_slab = 11352,
|
||||
block_cut_red_sandstone_slab = 11353,
|
||||
block_end_stone_brick_slab = 11354,
|
||||
block_mossy_cobblestone_slab = 11355,
|
||||
block_mossy_stone_brick_slab = 11356,
|
||||
block_smooth_quartz_slab = 11357,
|
||||
block_smooth_stone_slab = 11358,
|
||||
};
|
||||
|
||||
typedef uint16_t mc_block_t;
|
||||
|
||||
|
||||
enum mc_item_id
|
||||
{
|
||||
item_iron_shovel = 256,
|
||||
item_iron_pickaxe = 257,
|
||||
item_iron_axe = 258,
|
||||
item_flint_and_steel = 259,
|
||||
item_apple = 260,
|
||||
item_bow = 261,
|
||||
item_arrow = 262,
|
||||
item_coal = 263,
|
||||
item_diamond = 264,
|
||||
item_iron_ingot = 265,
|
||||
item_gold_ingot = 266,
|
||||
item_iron_sword = 267,
|
||||
item_wooden_sword = 268,
|
||||
item_wooden_shovel = 269,
|
||||
item_wooden_pickaxe = 270,
|
||||
item_wooden_axe = 271,
|
||||
item_stone_sword = 272,
|
||||
item_stone_shovel = 273,
|
||||
item_stone_pickaxe = 274,
|
||||
item_stone_axe = 275,
|
||||
item_diamond_sword = 276,
|
||||
item_diamond_shovel = 277,
|
||||
item_diamond_pickaxe = 278,
|
||||
item_diamond_axe = 279,
|
||||
item_stick = 280,
|
||||
item_bowl = 281,
|
||||
item_mushroom_stew = 282,
|
||||
item_golden_sword = 283,
|
||||
item_golden_shovel = 284,
|
||||
item_golden_pickaxe = 285,
|
||||
item_golden_axe = 286,
|
||||
item_string = 287,
|
||||
item_feather = 288,
|
||||
item_gunpowder = 289,
|
||||
item_wooden_hoe = 290,
|
||||
item_stone_hoe = 291,
|
||||
item_iron_hoe = 292,
|
||||
item_diamond_hoe = 293,
|
||||
item_golden_hoe = 294,
|
||||
item_wheat_seeds = 295,
|
||||
item_wheat = 296,
|
||||
item_bread = 297,
|
||||
item_leather_helmet = 298,
|
||||
item_leather_chestplate = 299,
|
||||
item_leather_leggings = 300,
|
||||
item_leather_boots = 301,
|
||||
item_chainmail_helmet = 302,
|
||||
item_chainmail_chestplate = 303,
|
||||
item_chainmail_leggings = 304,
|
||||
item_chainmail_boots = 305,
|
||||
item_iron_helmet = 306,
|
||||
item_iron_chestplate = 307,
|
||||
item_iron_leggings = 308,
|
||||
item_iron_boots = 309,
|
||||
item_diamond_helmet = 310,
|
||||
item_diamond_chestplate = 311,
|
||||
item_diamond_leggings = 312,
|
||||
item_diamond_boots = 313,
|
||||
item_golden_helmet = 314,
|
||||
item_golden_chestplate = 315,
|
||||
item_golden_leggings = 316,
|
||||
item_golden_boots = 317,
|
||||
item_flint = 318,
|
||||
item_porkchop = 319,
|
||||
item_cooked_porkchop = 320,
|
||||
item_painting = 321,
|
||||
item_golden_apple = 322,
|
||||
item_sign = 323,
|
||||
item_wooden_door = 324,
|
||||
item_bucket = 325,
|
||||
item_water_bucket = 326,
|
||||
item_lava_bucket = 327,
|
||||
item_minecart = 328,
|
||||
item_saddle = 329,
|
||||
item_iron_door = 330,
|
||||
item_redstone = 331,
|
||||
item_snowball = 332,
|
||||
item_boat = 333,
|
||||
item_leather = 334,
|
||||
item_milk_bucket = 335,
|
||||
item_brick = 336,
|
||||
item_clay_ball = 337,
|
||||
item_reeds = 338,
|
||||
item_paper = 339,
|
||||
item_book = 340,
|
||||
item_slime_ball = 341,
|
||||
item_chest_minecart = 342,
|
||||
item_furnace_minecart = 343,
|
||||
item_egg = 344,
|
||||
item_compass = 345,
|
||||
item_fishing_rod = 346,
|
||||
item_clock = 347,
|
||||
item_glowstone_dust = 348,
|
||||
item_fish = 349,
|
||||
item_cooked_fish = 350,
|
||||
item_dye = 351,
|
||||
item_bone = 352,
|
||||
item_sugar = 353,
|
||||
item_cake = 354,
|
||||
item_bed = 355,
|
||||
item_repeater = 356,
|
||||
item_cookie = 357,
|
||||
item_filled_map = 358,
|
||||
item_shears = 359,
|
||||
item_melon = 360,
|
||||
item_pumpkin_seeds = 361,
|
||||
item_melon_seeds = 362,
|
||||
item_beef = 363,
|
||||
item_cooked_beef = 364,
|
||||
item_chicken = 365,
|
||||
item_cooked_chicken = 366,
|
||||
item_rotten_flesh = 367,
|
||||
item_ender_pearl = 368,
|
||||
item_blaze_rod = 369,
|
||||
item_ghast_tear = 370,
|
||||
item_gold_nugget = 371,
|
||||
item_nether_wart = 372,
|
||||
item_potion = 373,
|
||||
item_glass_bottle = 374,
|
||||
item_spider_eye = 375,
|
||||
item_fermented_spider_eye = 376,
|
||||
item_blaze_powder = 377,
|
||||
item_magma_cream = 378,
|
||||
item_brewing_stand = 379,
|
||||
item_cauldron = 380,
|
||||
item_ender_eye = 381,
|
||||
item_speckled_melon = 382,
|
||||
item_spawn_egg = 383,
|
||||
item_experience_bottle = 384,
|
||||
item_fire_charge = 385,
|
||||
item_writable_book = 386,
|
||||
item_written_book = 387,
|
||||
item_emerald = 388,
|
||||
item_item_frame = 389,
|
||||
item_flower_pot = 390,
|
||||
item_carrot = 391,
|
||||
item_potato = 392,
|
||||
item_baked_potato = 393,
|
||||
item_poisonous_potato = 394,
|
||||
item_map = 395,
|
||||
item_golden_carrot = 396,
|
||||
item_skull = 397,
|
||||
item_carrot_on_a_stick = 398,
|
||||
item_nether_star = 399,
|
||||
item_pumpkin_pie = 400,
|
||||
item_fireworks = 401,
|
||||
item_firework_charge = 402,
|
||||
item_enchanted_book = 403,
|
||||
item_comparator = 404,
|
||||
item_netherbrick = 405,
|
||||
item_quartz = 406,
|
||||
item_tnt_minecart = 407,
|
||||
item_hopper_minecart = 408,
|
||||
item_prismarine_shard = 409,
|
||||
item_prismarine_crystals = 410,
|
||||
item_rabbit = 411,
|
||||
item_cooked_rabbit = 412,
|
||||
item_rabbit_stew = 413,
|
||||
item_rabbit_foot = 414,
|
||||
item_rabbit_hide = 415,
|
||||
item_armor_stand = 416,
|
||||
item_iron_horse_armor = 417,
|
||||
item_golden_horse_armor = 418,
|
||||
item_diamond_horse_armor = 419,
|
||||
item_lead = 420,
|
||||
item_name_tag = 421,
|
||||
item_command_block_minecart = 422,
|
||||
item_mutton = 423,
|
||||
item_cooked_mutton = 424,
|
||||
item_banner = 425,
|
||||
item_end_crystal = 426,
|
||||
item_spruce_door = 427,
|
||||
item_birch_door = 428,
|
||||
item_jungle_door = 429,
|
||||
item_acacia_door = 430,
|
||||
item_dark_oak_door = 431,
|
||||
item_chorus_fruit = 432,
|
||||
item_popped_chorus_fruit = 433,
|
||||
item_beetroot = 434,
|
||||
item_beetroot_seeds = 435,
|
||||
item_beetroot_soup = 436,
|
||||
item_dragon_breath = 437,
|
||||
item_splash_potion = 438,
|
||||
item_spectral_arrow = 439,
|
||||
item_tipped_arrow = 440,
|
||||
item_lingering_potion = 441,
|
||||
item_shield = 442,
|
||||
item_elytra = 443,
|
||||
item_spruce_boat = 444,
|
||||
item_birch_boat = 445,
|
||||
item_jungle_boat = 446,
|
||||
item_acacia_boat = 447,
|
||||
item_dark_oak_boat = 448,
|
||||
item_totem_of_undying = 449,
|
||||
item_shulker_shell = 450,
|
||||
item_iron_nugget = 452,
|
||||
item_knowledge_book = 453,
|
||||
item_record_13 = 2256,
|
||||
item_record_cat = 2257,
|
||||
item_record_blocks = 2258,
|
||||
item_record_chirp = 2259,
|
||||
item_record_far = 2260,
|
||||
item_record_mall = 2261,
|
||||
item_record_mellohi = 2262,
|
||||
item_record_stal = 2263,
|
||||
item_record_strad = 2264,
|
||||
item_record_ward = 2265,
|
||||
item_record_11 = 2266,
|
||||
item_record_wait = 2267
|
||||
};
|
||||
|
||||
typedef uint16_t mc_item_t;
|
||||
#endif
|
||||
@@ -33,7 +33,7 @@
|
||||
|
||||
// increment this value if you've made a change to the c extesion
|
||||
// and want to force users to rebuild
|
||||
#define OVERVIEWER_EXTENSION_VERSION 57
|
||||
#define OVERVIEWER_EXTENSION_VERSION 62
|
||||
|
||||
/* Python PIL, and numpy headers */
|
||||
#include <Python.h>
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
*/
|
||||
|
||||
#include "../overviewer.h"
|
||||
#include "../mc_id.h"
|
||||
#include "../block_class.h"
|
||||
#include "biomes.h"
|
||||
|
||||
typedef struct {
|
||||
@@ -75,7 +77,7 @@ base_draw(void *data, RenderState *state, PyObject *src, PyObject *mask, PyObjec
|
||||
PrimitiveBase *self = (PrimitiveBase *)data;
|
||||
|
||||
/* in order to detect top parts of doublePlant grass & ferns */
|
||||
unsigned char below_block = get_data(state, BLOCKS, state->x, state->y-1, state->z);
|
||||
unsigned short below_block = get_data(state, BLOCKS, state->x, state->y-1, state->z);
|
||||
unsigned char below_data = get_data(state, DATA, state->x, state->y-1, state->z);
|
||||
|
||||
/* draw the block! */
|
||||
@@ -93,24 +95,25 @@ base_draw(void *data, RenderState *state, PyObject *src, PyObject *mask, PyObjec
|
||||
* biome-compliant ones! The tinting is now all done here.
|
||||
*/
|
||||
if (/* grass, but not snowgrass */
|
||||
(state->block == 2 && get_data(state, BLOCKS, state->x, state->y+1, state->z) != 78) ||
|
||||
/* water */
|
||||
state->block == 8 || state->block == 9 ||
|
||||
/* leaves */
|
||||
state->block == 18 || state->block == 161 ||
|
||||
(state->block == block_grass && get_data(state, BLOCKS, state->x, state->y+1, state->z) != 78) ||
|
||||
block_class_is_subset(state->block, (mc_block_t[]){
|
||||
block_vine,
|
||||
block_waterlily,
|
||||
block_flowing_water,
|
||||
block_water,
|
||||
block_leaves,
|
||||
block_leaves2
|
||||
},
|
||||
6) ||
|
||||
/* tallgrass, but not dead shrubs */
|
||||
(state->block == 31 && state->block_data != 0) ||
|
||||
(state->block == block_tallgrass && state->block_data != 0) ||
|
||||
/* pumpkin/melon stem, not fully grown. Fully grown stems
|
||||
* get constant brown color (see textures.py) */
|
||||
(((state->block == 104) || (state->block == 105)) && (state->block_data != 7)) ||
|
||||
/* vines */
|
||||
state->block == 106 ||
|
||||
/* lily pads */
|
||||
state->block == 111 ||
|
||||
(((state->block == block_pumpkin_stem) || (state->block == block_melon_stem)) && (state->block_data != 7)) ||
|
||||
/* doublePlant grass & ferns */
|
||||
(state->block == 175 && (state->block_data == 2 || state->block_data == 3)) ||
|
||||
(state->block == block_double_plant && (state->block_data == 2 || state->block_data == 3)) ||
|
||||
/* doublePlant grass & ferns tops */
|
||||
(state->block == 175 && below_block == 175 && (below_data == 2 || below_data == 3)) )
|
||||
(state->block == block_double_plant && below_block == block_double_plant && (below_data == 2 || below_data == 3)) )
|
||||
{
|
||||
/* do the biome stuff! */
|
||||
PyObject *facemask = mask;
|
||||
@@ -118,24 +121,29 @@ base_draw(void *data, RenderState *state, PyObject *src, PyObject *mask, PyObjec
|
||||
PyObject *color_table = NULL;
|
||||
unsigned char flip_xy = 0;
|
||||
|
||||
if (state->block == 2) {
|
||||
if (state->block == block_grass) {
|
||||
/* grass needs a special facemask */
|
||||
facemask = self->grass_texture;
|
||||
}
|
||||
|
||||
switch (state->block) {
|
||||
case 2:
|
||||
/* grass */
|
||||
if(block_class_is_subset(state->block, (mc_block_t[]){
|
||||
block_grass,
|
||||
block_tallgrass,
|
||||
block_pumpkin_stem,
|
||||
block_melon_stem,
|
||||
block_vine,
|
||||
block_waterlily,
|
||||
block_double_plant
|
||||
},7)) {
|
||||
color_table = self->grasscolor;
|
||||
break;
|
||||
case 8:
|
||||
case 9:
|
||||
/* water */
|
||||
}
|
||||
else if(block_class_is_subset(state->block, (mc_block_t[]){
|
||||
block_flowing_water,block_water
|
||||
},2)) {
|
||||
color_table = self->watercolor;
|
||||
break;
|
||||
case 18:
|
||||
case 161:
|
||||
/* leaves */
|
||||
}
|
||||
else if(block_class_is_subset(state->block, (mc_block_t[]){
|
||||
block_leaves,block_leaves2
|
||||
},2)) {
|
||||
color_table = self->foliagecolor;
|
||||
if (state->block_data == 2)
|
||||
{
|
||||
@@ -143,34 +151,7 @@ base_draw(void *data, RenderState *state, PyObject *src, PyObject *mask, PyObjec
|
||||
birch foliage color is flipped XY-ways */
|
||||
flip_xy = 1;
|
||||
}
|
||||
break;
|
||||
case 31:
|
||||
/* tall grass */
|
||||
color_table = self->grasscolor;
|
||||
break;
|
||||
case 104:
|
||||
/* pumpkin stem */
|
||||
color_table = self->grasscolor;
|
||||
break;
|
||||
case 105:
|
||||
/* melon stem */
|
||||
color_table = self->grasscolor;
|
||||
break;
|
||||
case 106:
|
||||
/* vines */
|
||||
color_table = self->grasscolor;
|
||||
break;
|
||||
case 111:
|
||||
/* lily pads */
|
||||
color_table = self->grasscolor;
|
||||
break;
|
||||
case 175:
|
||||
/* doublePlant grass & ferns */
|
||||
color_table = self->grasscolor;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
}
|
||||
|
||||
if (color_table) {
|
||||
unsigned char biome;
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
*/
|
||||
|
||||
#include "../overviewer.h"
|
||||
#include "../mc_id.h"
|
||||
#include "../block_class.h"
|
||||
|
||||
typedef struct {
|
||||
float opacity;
|
||||
@@ -34,16 +36,17 @@ edge_lines_draw(void *data, RenderState *state, PyObject *src, PyObject *mask, P
|
||||
PrimitiveEdgeLines *self = (PrimitiveEdgeLines *)data;
|
||||
|
||||
/* Draw some edge lines! */
|
||||
if (state->block == 44 || state->block == 78 || !is_transparent(state->block)) {
|
||||
if (block_class_is_subset(state->block, (mc_block_t[]){block_stone_slab,block_snow_layer}, 2)
|
||||
|| !is_transparent(state->block)) {
|
||||
Imaging img_i = imaging_python_to_c(state->img);
|
||||
unsigned char ink[] = {0, 0, 0, 255 * self->opacity};
|
||||
unsigned short side_block;
|
||||
int x = state->x, y = state->y, z = state->z;
|
||||
|
||||
int increment=0;
|
||||
if ((state->block == 44 || state->block == 126) && ((state->block_data & 0x8) == 0 )) // half-steps BUT no upsidown half-steps
|
||||
if (block_class_is_subset(state->block, (mc_block_t[]){block_wooden_slab,block_stone_slab}, 2) && ((state->block_data & 0x8) == 0 )) // half-steps BUT no upsidown half-steps
|
||||
increment=6;
|
||||
else if ((state->block == 78) || (state->block == 93) || (state->block == 94)) // snow, redstone repeaters (on and off)
|
||||
else if (block_class_is_subset(state->block, (mc_block_t[]){block_snow_layer,block_unpowered_repeater,block_powered_repeater}, 3)) // snow, redstone repeaters (on and off)
|
||||
increment=9;
|
||||
|
||||
/* +X side */
|
||||
@@ -51,9 +54,9 @@ edge_lines_draw(void *data, RenderState *state, PyObject *src, PyObject *mask, P
|
||||
if (side_block != state->block && (is_transparent(side_block) || render_mode_hidden(state->rendermode, x+1, y, z)) &&
|
||||
/* WARNING: ugly special case approaching */
|
||||
/* if the block is a slab and the side block is a stair don't draw anything, it can give very ugly results */
|
||||
!((state->block == 44 || state->block == 126) && ((side_block == 53) || (side_block == 67) || (side_block == 108) ||
|
||||
(side_block == 109) || (side_block == 114) || (side_block == 128) || (side_block == 134) || (side_block == 135) ||
|
||||
(side_block == 136)))) {
|
||||
!(block_class_is_subset(state->block, (mc_block_t[]){block_wooden_slab, block_stone_slab}, 2)
|
||||
&& (block_class_is_subset(side_block, block_class_stair, block_class_stair_len))
|
||||
)) {
|
||||
ImagingDrawLine(img_i, state->imgx+12, state->imgy+1+increment, state->imgx+22+1, state->imgy+5+1+increment, &ink, 1);
|
||||
ImagingDrawLine(img_i, state->imgx+12, state->imgy+increment, state->imgx+22+1, state->imgy+5+increment, &ink, 1);
|
||||
}
|
||||
@@ -63,9 +66,10 @@ edge_lines_draw(void *data, RenderState *state, PyObject *src, PyObject *mask, P
|
||||
if (side_block != state->block && (is_transparent(side_block) || render_mode_hidden(state->rendermode, x, y, z-1)) &&
|
||||
/* WARNING: ugly special case approaching */
|
||||
/* if the block is a slab and the side block is a stair don't draw anything, it can give very ugly results */
|
||||
!((state->block == 44 || state->block == 126) && ((side_block == 53) || (side_block == 67) || (side_block == 108) ||
|
||||
(side_block == 109) || (side_block == 114) || (side_block == 128) || (side_block == 134) || (side_block == 135) ||
|
||||
(side_block == 136)))) {
|
||||
!(
|
||||
block_class_is_subset(state->block, (mc_block_t[]){block_stone_slab,block_wooden_slab}, 2)
|
||||
&& (block_class_is_subset(side_block, block_class_stair, block_class_stair_len))
|
||||
)) {
|
||||
ImagingDrawLine(img_i, state->imgx, state->imgy+6+1+increment, state->imgx+12+1, state->imgy+1+increment, &ink, 1);
|
||||
ImagingDrawLine(img_i, state->imgx, state->imgy+6+increment, state->imgx+12+1, state->imgy+increment, &ink, 1);
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
*/
|
||||
|
||||
#include "../overviewer.h"
|
||||
#include "../mc_id.h"
|
||||
|
||||
struct HideRule {
|
||||
unsigned short blockid;
|
||||
@@ -90,7 +91,7 @@ hide_hidden(void *data, RenderState *state, int x, int y, int z) {
|
||||
return 0;
|
||||
|
||||
block = get_data(state, BLOCKS, x, y, z);
|
||||
for (i = 0; self->rules[i].blockid != 0; i++) {
|
||||
for (i = 0; self->rules[i].blockid != block_air; i++) {
|
||||
if (block == self->rules[i].blockid) {
|
||||
unsigned char data;
|
||||
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
*/
|
||||
|
||||
#include "../overviewer.h"
|
||||
#include "../mc_id.h"
|
||||
#include "../block_class.h"
|
||||
#include "lighting.h"
|
||||
#include <math.h>
|
||||
|
||||
@@ -100,7 +102,8 @@ estimate_blocklevel(RenderPrimitiveLighting *self, RenderState *state,
|
||||
int x, int y, int z, int *authoratative) {
|
||||
|
||||
/* placeholders for later data arrays, coordinates */
|
||||
unsigned char block, blocklevel;
|
||||
unsigned short block;
|
||||
unsigned char blocklevel;
|
||||
unsigned int average_count = 0, average_gather = 0, coeff = 0;
|
||||
|
||||
/* defaults to "guess" until told otherwise */
|
||||
@@ -138,7 +141,7 @@ estimate_blocklevel(RenderPrimitiveLighting *self, RenderState *state,
|
||||
blocklevel = get_data(state, BLOCKLIGHT, x, y, z);
|
||||
|
||||
/* no longer a guess */
|
||||
if (!(block == 44 || block == 53 || block == 67 || block == 108 || block == 109 || block == 180 || block == 182 || block == 205) && authoratative) {
|
||||
if (!block_class_is_subset(block, block_class_alt_height, block_class_alt_height_len) && authoratative) {
|
||||
*authoratative = 1;
|
||||
}
|
||||
|
||||
@@ -151,7 +154,8 @@ get_lighting_color(RenderPrimitiveLighting *self, RenderState *state,
|
||||
unsigned char *r, unsigned char *g, unsigned char *b) {
|
||||
|
||||
/* placeholders for later data arrays, coordinates */
|
||||
unsigned char block, skylevel, blocklevel;
|
||||
unsigned short block;
|
||||
unsigned char skylevel, blocklevel;
|
||||
|
||||
block = get_data(state, BLOCKS, x, y, z);
|
||||
skylevel = get_data(state, SKYLIGHT, x, y, z);
|
||||
@@ -159,9 +163,7 @@ get_lighting_color(RenderPrimitiveLighting *self, RenderState *state,
|
||||
|
||||
/* special half-step handling, stairs handling */
|
||||
/* Anvil also needs to be here, blockid 145 */
|
||||
if (block == 44 || block == 53 || block == 67 || block == 108 || block == 109 || block == 114 ||
|
||||
block == 128 || block == 134 || block == 135 || block == 136 || block == 145 || block == 156 ||
|
||||
block == 163 || block == 164 || block == 180 || block == 182 || block == 203 || block == 205) {
|
||||
if ( block_class_is_subset(block, block_class_alt_height, block_class_alt_height_len) || block == block_anvil) {
|
||||
unsigned int upper_block;
|
||||
|
||||
/* stairs and half-blocks take the skylevel from the upper block if it's transparent */
|
||||
@@ -170,10 +172,7 @@ get_lighting_color(RenderPrimitiveLighting *self, RenderState *state,
|
||||
do {
|
||||
upper_counter++;
|
||||
upper_block = get_data(state, BLOCKS, x, y + upper_counter, z);
|
||||
} while (upper_block == 44 || upper_block == 53 || upper_block == 67 || upper_block == 108 ||
|
||||
upper_block == 109 || upper_block == 114 || upper_block == 128 || upper_block == 134 ||
|
||||
upper_block == 135 || upper_block == 136 || upper_block == 156 || upper_block == 163 ||
|
||||
upper_block == 164 || upper_block == 180 || upper_block == 182 || upper_block == 203 || upper_block == 205);
|
||||
} while (block_class_is_subset(upper_block, block_class_alt_height, block_class_alt_height_len));
|
||||
if (is_transparent(upper_block)) {
|
||||
skylevel = get_data(state, SKYLIGHT, x, y + upper_counter, z);
|
||||
} else {
|
||||
@@ -186,7 +185,7 @@ get_lighting_color(RenderPrimitiveLighting *self, RenderState *state,
|
||||
|
||||
}
|
||||
|
||||
if (block == 10 || block == 11) {
|
||||
if (block_class_is_subset(block, (mc_block_t[]){block_flowing_lava,block_lava}, 2)) {
|
||||
/* lava blocks should always be lit! */
|
||||
*r = 255;
|
||||
*g = 255;
|
||||
@@ -305,7 +304,7 @@ lighting_draw(void *data, RenderState *state, PyObject *src, PyObject *mask, PyO
|
||||
self = (RenderPrimitiveLighting *)data;
|
||||
x = state->x, y = state->y, z = state->z;
|
||||
|
||||
if ((state->block == 8) || (state->block == 9)) { /* special case for water */
|
||||
if (block_class_is_subset(state->block, (mc_block_t[]){block_flowing_water,block_water}, 2)) { /* special case for water */
|
||||
/* looks like we need a new case for lighting, there are
|
||||
* blocks that are transparent for occlusion calculations and
|
||||
* need per-face shading if the face is drawn. */
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
*/
|
||||
|
||||
#include "../overviewer.h"
|
||||
#include "../mc_id.h"
|
||||
#include "../block_class.h"
|
||||
#include "nether.h"
|
||||
|
||||
static void
|
||||
@@ -26,16 +28,16 @@ walk_chunk(RenderState *state, RenderPrimitiveNether *data) {
|
||||
for (x = -1; x < WIDTH + 1; x++) {
|
||||
for (z = -1; z < DEPTH + 1; z++) {
|
||||
id = get_data(state, BLOCKS, x, NETHER_ROOF - (state->chunky * 16), z);
|
||||
if (id == 7) {
|
||||
if (id == block_bedrock) {
|
||||
data->remove_block[x+1][NETHER_ROOF][z+1] = 1;
|
||||
id = get_data(state, BLOCKS, x, (NETHER_ROOF + 1) - (state->chunky * 16), z);
|
||||
if (id == 39 || id == 40)
|
||||
if (id == block_brown_mushroom || id == block_red_mushroom)
|
||||
data->remove_block[x+1][NETHER_ROOF + 1][z+1] = 1;
|
||||
}
|
||||
|
||||
for (y = NETHER_ROOF-1; y>=0; y--) {
|
||||
id = get_data(state, BLOCKS, x, y - (state->chunky * 16), z);
|
||||
if (id == 7 || id == 87 || id == 153 || id == 11)
|
||||
if (block_class_is_subset(id, (mc_block_t[]){block_bedrock,block_netherrack,block_quartz_ore,block_lava}, 4))
|
||||
data->remove_block[x+1][y][z+1] = 1;
|
||||
else
|
||||
break;
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
*/
|
||||
|
||||
#include "overlay.h"
|
||||
#include "../mc_id.h"
|
||||
|
||||
typedef struct {
|
||||
/* inherits from overlay */
|
||||
@@ -31,17 +32,17 @@ struct MineralColor {
|
||||
|
||||
/* put more valuable ores first -- they take precedence */
|
||||
static struct MineralColor default_minerals[] = {
|
||||
{48 /* Mossy Stone */, 31, 153, 9},
|
||||
{block_mossy_cobblestone, 31, 153, 9},
|
||||
|
||||
{56 /* Diamond Ore */, 32, 230, 220},
|
||||
{block_diamond_ore, 32, 230, 220},
|
||||
|
||||
{21 /* Lapis Lazuli */, 0, 23, 176},
|
||||
{14 /* Gold Ore */, 255, 234, 0},
|
||||
{block_lapis_ore, 0, 23, 176},
|
||||
{block_gold_ore, 255, 234, 0},
|
||||
|
||||
{15 /* Iron Ore */, 204, 204, 204},
|
||||
{73 /* Redstone */, 186, 0, 0},
|
||||
{74 /* Lit Redstone */, 186, 0, 0},
|
||||
{16 /* Coal Ore */, 54, 54, 54},
|
||||
{block_iron_ore, 204, 204, 204},
|
||||
{block_redstone_ore, 186, 0, 0},
|
||||
{block_lit_redstone_ore, 186, 0, 0},
|
||||
{block_coal_ore, 54, 54, 54},
|
||||
|
||||
/* end of list marker */
|
||||
{0, 0, 0, 0}
|
||||
@@ -61,7 +62,7 @@ static void get_color(void *data, RenderState *state,
|
||||
int i, tmp;
|
||||
unsigned short blockid = get_data(state, BLOCKS, x, y, z);
|
||||
|
||||
for (i = 0; (max_i == -1 || i < max_i) && minerals[i].blockid != 0; i++) {
|
||||
for (i = 0; (max_i == -1 || i < max_i) && minerals[i].blockid != block_air; i++) {
|
||||
if (minerals[i].blockid == blockid) {
|
||||
*r = minerals[i].r;
|
||||
*g = minerals[i].g;
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
*/
|
||||
|
||||
#include "overlay.h"
|
||||
#include "../mc_id.h"
|
||||
|
||||
typedef enum { false, true } bool;
|
||||
|
||||
@@ -28,7 +29,7 @@ typedef struct {
|
||||
|
||||
struct Condition{
|
||||
int relx, rely, relz;
|
||||
unsigned char block;
|
||||
unsigned short block;
|
||||
};
|
||||
|
||||
struct Color {
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
*/
|
||||
|
||||
#include "overlay.h"
|
||||
#include "../mc_id.h"
|
||||
|
||||
static void get_color(void *data, RenderState *state,
|
||||
unsigned char *r, unsigned char *g, unsigned char *b, unsigned char *a) {
|
||||
@@ -85,9 +86,9 @@ overlay_draw(void *data, RenderState *state, PyObject *src, PyObject *mask, PyOb
|
||||
|
||||
// exactly analogous to edge-line code for these special blocks
|
||||
int increment=0;
|
||||
if (state->block == 44) // half-step
|
||||
if (state->block == block_stone_slab) // half-step
|
||||
increment=6;
|
||||
else if (state->block == 78) // snow
|
||||
else if (state->block == block_snow_layer) // snow
|
||||
increment=9;
|
||||
|
||||
/* skip rendering the overlay if we can't see it */
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
*/
|
||||
|
||||
#include "../overviewer.h"
|
||||
#include "../mc_id.h"
|
||||
#include "../block_class.h"
|
||||
#include "lighting.h"
|
||||
#include <math.h>
|
||||
|
||||
@@ -218,7 +220,9 @@ smooth_lighting_draw(void *data, RenderState *state, PyObject *src, PyObject *ma
|
||||
|
||||
/* special case for leaves, water 8, water 9, ice 79
|
||||
-- these are also smooth-lit! */
|
||||
if (state->block != 18 && state->block != 8 && state->block != 9 && state->block != 79 && is_transparent(state->block))
|
||||
if (!block_class_is_subset(state->block, (mc_block_t[]){
|
||||
block_leaves,block_flowing_water,block_water,block_ice
|
||||
}, 4) && is_transparent(state->block))
|
||||
{
|
||||
/* transparent blocks are rendered as usual, with flat lighting */
|
||||
primitive_lighting.draw(data, state, src, mask, mask_light);
|
||||
@@ -228,7 +232,7 @@ smooth_lighting_draw(void *data, RenderState *state, PyObject *src, PyObject *ma
|
||||
/* non-transparent blocks get the special smooth treatment */
|
||||
|
||||
/* special code for water */
|
||||
if (state->block == 9)
|
||||
if (state->block == block_water)
|
||||
{
|
||||
if (!(state->block_pdata & (1 << 4)))
|
||||
light_top = 0;
|
||||
|
||||
@@ -14,4 +14,7 @@
|
||||
#define OV_BLEND(mask, in1, in2, tmp1, tmp2)\
|
||||
(OV_MULDIV255(in1, 255 - mask, tmp1) + OV_MULDIV255(in2, mask, tmp2))
|
||||
|
||||
#define COUNT_OF(array) \
|
||||
(sizeof(array) / sizeof(array[0]))
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user