#include #include "directxmath/directxmath.h" //size_t __builtin_wasm_memory_grow(int, size_t); //size_t __builtin_wasm_memory_size(int); extern char __heap_base[]; extern char __heap_end[]; static size_t heap_pages = 0; static size_t alloc_index = 0; extern "C" { size_t mem_size(); size_t mem_alloc(size_t length); size_t node_alloc(int count); void node_init_translation(size_t handle, int index, float x, float y, float z); }; static inline size_t memory_heap_base() { return (size_t)&__heap_base[0]; } static inline size_t align(size_t n, size_t m) { return (n + (m - 1)) & (~(m - 1)); } static inline void memory_grow(size_t npages) { __builtin_wasm_memory_grow(0, npages); } size_t mem_size() { return __builtin_wasm_memory_size(0); } size_t mem_alloc(size_t length) { size_t base = memory_heap_base(); size_t heap_end = (heap_pages << 16); size_t address = alloc_index; alloc_index += align(length, 16); if (heap_end < alloc_index) { size_t npages = align(alloc_index - heap_end, 65536) >> 16; memory_grow(npages); heap_pages += npages; } return base + address; } size_t node_alloc(int count) { return mem_alloc((sizeof (XMFLOAT4X4)) * count); } void node_init_translation(size_t handle, int index, float x, float y, float z) { XMFLOAT4X4 * nodes = reinterpret_cast(handle); //XMMATRIX XMLoadFloat4x4(&nodes[index]); XMMATRIX mat = XMMatrixTranslation(x, y, z); XMStoreFloat4x4(&nodes[index], mat); }