minecraft: load per-world data
This commit is contained in:
parent
759006dd2f
commit
8102ad7870
23
include/minecraft/data.inc
Normal file
23
include/minecraft/data.inc
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
static const short index_buffer_configuration_offsets[] = {
|
||||||
|
0, 0, 6, 12, 24, 30, 42, 54,
|
||||||
|
72, 78, 90, 102, 120, 132, 150, 168,
|
||||||
|
192, 198, 210, 222, 240, 252, 270, 288,
|
||||||
|
312, 324, 342, 360, 384, 402, 426, 450,
|
||||||
|
480, 486, 498, 510, 528, 540, 558, 576,
|
||||||
|
600, 612, 630, 648, 672, 690, 714, 738,
|
||||||
|
768, 780, 798, 816, 840, 858, 882, 906,
|
||||||
|
936, 954, 978, 1002, 1032, 1056, 1086, 1116,
|
||||||
|
};
|
||||||
|
// generated from
|
||||||
|
static const struct {
|
||||||
|
short offset;
|
||||||
|
short count;
|
||||||
|
} index_buffer_custom_offsets[] = {
|
||||||
|
{1152, 3180}, // candle.obj
|
||||||
|
{4332, 1584}, // custom_mushroom.obj
|
||||||
|
{5916, 36}, // fence.obj
|
||||||
|
{5952, 24}, // slab.obj
|
||||||
|
{5976, 24}, // stair.obj
|
||||||
|
{6000, 12}, // tall_grass.obj
|
||||||
|
{6012, 2082}, // wall_torch.obj
|
||||||
|
};
|
||||||
@ -2,7 +2,9 @@
|
|||||||
|
|
||||||
#include "volk/volk.h"
|
#include "volk/volk.h"
|
||||||
|
|
||||||
namespace minecraft {
|
#include "minecraft/vulkan/per_world.h"
|
||||||
|
|
||||||
|
namespace minecraft::vulkan {
|
||||||
|
|
||||||
struct vulkan {
|
struct vulkan {
|
||||||
struct {
|
struct {
|
||||||
@ -31,11 +33,14 @@ namespace minecraft {
|
|||||||
VkShaderModule shaderModule;
|
VkShaderModule shaderModule;
|
||||||
VkPipeline pipeline;
|
VkPipeline pipeline;
|
||||||
|
|
||||||
|
per_world * worlds;
|
||||||
|
|
||||||
void init();
|
void init();
|
||||||
void load_vertex_index_buffer(char const * vertex_filename,
|
void load_vertex_index_buffer(char const * vertex_filename,
|
||||||
char const * index_filename);
|
char const * index_filename);
|
||||||
void load_shader();
|
void load_shader();
|
||||||
void create_pipeline();
|
void create_pipeline();
|
||||||
void draw();
|
void load_worlds();
|
||||||
|
void draw(VkCommandBuffer commandBuffer);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
27
include/minecraft/vulkan/per_world.h
Normal file
27
include/minecraft/vulkan/per_world.h
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "minecraft/world.h"
|
||||||
|
|
||||||
|
namespace minecraft::vulkan {
|
||||||
|
struct region {
|
||||||
|
VkBuffer vertexBuffer;
|
||||||
|
world::instance_cfg_entry * instanceCFG;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct per_world {
|
||||||
|
world::descriptor const * descriptor;
|
||||||
|
region * regions; // malloc region_count
|
||||||
|
VkDeviceMemory regionVertexMemory;
|
||||||
|
entry_table::global_entry_t * entry_table;
|
||||||
|
int entry_table_length;
|
||||||
|
|
||||||
|
void load_regions(VkDevice device,
|
||||||
|
VkPhysicalDeviceProperties const & physicalDeviceProperties,
|
||||||
|
VkPhysicalDeviceMemoryProperties const & physicalDeviceMemoryProperties,
|
||||||
|
world::descriptor const * const descriptor);
|
||||||
|
void load(VkDevice device,
|
||||||
|
VkPhysicalDeviceProperties const & physicalDeviceProperties,
|
||||||
|
VkPhysicalDeviceMemoryProperties const & physicalDeviceMemoryProperties,
|
||||||
|
world::descriptor const * const descriptor);
|
||||||
|
};
|
||||||
|
}
|
||||||
@ -26,28 +26,14 @@ namespace minecraft::world {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// also update index_buffer_custom_offsets in include/minecraft_data.inc
|
// also update index_buffer_custom_offsets in include/minecraft_data.inc
|
||||||
const int custom_block_types = 7;
|
constexpr int custom_block_types = 7;
|
||||||
const int instance_cfg_length = 64 + custom_block_types;
|
constexpr int instance_cfg_length = 64 + custom_block_types;
|
||||||
|
|
||||||
struct instance_cfg_entry {
|
struct instance_cfg_entry {
|
||||||
int count;
|
int count;
|
||||||
int offset;
|
int offset;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct region {
|
|
||||||
unsigned int per_instance_vertex_buffer;
|
|
||||||
instance_cfg_entry instance_cfg[instance_cfg_length];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct state {
|
|
||||||
world::descriptor const * descriptor;
|
|
||||||
world::region * region; // malloc region_count
|
|
||||||
entry_table::global_entry_t * entry_table;
|
|
||||||
unsigned int light_uniform_buffer;
|
|
||||||
int light_count;
|
|
||||||
int entry_table_length;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern descriptor const descriptors[];
|
extern descriptor const descriptors[];
|
||||||
extern int const descriptors_length;
|
extern int const descriptors_length;
|
||||||
}
|
}
|
||||||
|
|||||||
6
include/popcount.h
Normal file
6
include/popcount.h
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#include <intrin.h>
|
||||||
|
#define __builtin_popcount __popcnt
|
||||||
|
#endif
|
||||||
@ -7,10 +7,18 @@
|
|||||||
#include "file.h"
|
#include "file.h"
|
||||||
#include "check.h"
|
#include "check.h"
|
||||||
#include "vulkan_helper.h"
|
#include "vulkan_helper.h"
|
||||||
|
#include "new.h"
|
||||||
|
#include "popcount.h"
|
||||||
|
|
||||||
#include "minecraft/vulkan.h"
|
#include "minecraft/vulkan.h"
|
||||||
|
#include "minecraft/data.inc"
|
||||||
|
|
||||||
namespace minecraft {
|
namespace minecraft::vulkan {
|
||||||
|
|
||||||
|
static inline int popcount(int x)
|
||||||
|
{
|
||||||
|
return __builtin_popcount(x);
|
||||||
|
}
|
||||||
|
|
||||||
void vulkan::init()
|
void vulkan::init()
|
||||||
{
|
{
|
||||||
@ -253,19 +261,19 @@ namespace minecraft {
|
|||||||
.format = VK_FORMAT_R16_SINT,
|
.format = VK_FORMAT_R16_SINT,
|
||||||
.offset = 8,
|
.offset = 8,
|
||||||
},
|
},
|
||||||
{ // block id
|
{ // data
|
||||||
.location = 5,
|
.location = 5,
|
||||||
.binding = 1,
|
.binding = 1,
|
||||||
.format = VK_FORMAT_R16_SINT,
|
.format = VK_FORMAT_R16_SINT,
|
||||||
.offset = 10,
|
.offset = 10,
|
||||||
},
|
},
|
||||||
{ // block id
|
{ // texture id
|
||||||
.location = 6,
|
.location = 6,
|
||||||
.binding = 1,
|
.binding = 1,
|
||||||
.format = VK_FORMAT_R16_SINT,
|
.format = VK_FORMAT_R16_SINT,
|
||||||
.offset = 12,
|
.offset = 12,
|
||||||
},
|
},
|
||||||
{ // block id
|
{ // special
|
||||||
.location = 7,
|
.location = 7,
|
||||||
.binding = 1,
|
.binding = 1,
|
||||||
.format = VK_FORMAT_R16_SINT,
|
.format = VK_FORMAT_R16_SINT,
|
||||||
@ -302,12 +310,31 @@ namespace minecraft {
|
|||||||
VK_CHECK(vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, pipelineCreateInfos, nullptr, &pipeline));
|
VK_CHECK(vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, pipelineCreateInfos, nullptr, &pipeline));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
// load worlds
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void vulkan::load_worlds()
|
||||||
|
{
|
||||||
|
worlds = NewM<per_world>(minecraft::world::descriptors_length);
|
||||||
|
|
||||||
|
for (int i = 0; i < minecraft::world::descriptors_length; i++) {
|
||||||
|
worlds[i].load(device, physicalDeviceProperties, physicalDeviceMemoryProperties, &minecraft::world::descriptors[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
// draw
|
// draw
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void vulkan::draw()
|
void vulkan::draw(VkCommandBuffer commandBuffer)
|
||||||
{
|
{
|
||||||
|
vkCmdBindIndexBuffer(commandBuffer, vertexIndex.buffer, vertexIndex.indexOffset, VK_INDEX_TYPE_UINT16);
|
||||||
|
|
||||||
|
for (int configuration = 1; configuration < 64; configuration++) {
|
||||||
|
int element_count = 6 * popcount(configuration);
|
||||||
|
int index_offset = 2 * index_buffer_configuration_offsets[configuration];
|
||||||
|
int instance_count = worlds[;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user