bubel-ecs/demos/utils/source/ecs_utils/gfx/buffer.d
Dawid Masiukiewicz 024356df9b Common update:
-added multiple new function to allocate template and add entity
-updated README.md (complete initial version)
-empty components now don't take memory
-fixedd small bug with TestRunner
-added many new tests (HashMap, Vector, EntityMeta, ...)
-added default hashing function to HashMap
-fixed critical bug with adding entities
-fixed small bug with adding entity with remplacement components
-added asserts into code to better bug detection
-small performance improvement for events
-added ComponentRef structure which contain data pointer and componentID
-remove EntityID from Event structure
-now events are handled before removing entiteis
-fixed GDC compilation
-fixed rendering of rotated sprites
-added weapons as separate entities to space ship and others
-added Tower enemy to SpaceInvaders demo
-added Boss to SpaceInvaders demo (boss has four tower attached to it)
-Boss towers shoot multiple bullets upon death
-fixed critical bug with demos switching
-fixed critical bug related to adding/removing entities form inside onAdd/onRemove entity callback
-added animation support
-added particles sypport and particles for firing and explostions, and more
-multithreaded rendering now has same rendering order as singlethreaded
-application automaticallu detect host CPU threads count
-added upgrades to SPaceInvaders demo
-fixed texture memory freeing
-improved documentation
-improved multithreaded performance
-improve shader code
-fixed registration issue
-some additional performance improvements
-added depth and colors to rendering parameters
-jobs now has names corresponding to their systems
-change execute() -> willExecute()
-added EntityMeta structure to speedup getting fetching components form entity
-improved multithreading rendering
-added possibility tio change number of threads runtime
-added bullets collision detection in SpaceInvaders demo
-some CI changes
-added VBO batch rendering (current default, no render mode switch yet)
-fixed camera positioning calculation
-fixed buffer issue with WebGL
-added viewport scalling (at least 300 pixels height). Pixels are scalled if screen is bigger.
-center demos gameplay area
-added fullpage html template for Emscripten build
-added many new sprites to atlas
-fixed critical bug with CPU usage in multithreaded mode
-snake render tile coresponding to body part
-snake is destroyed after collision and emit some particles
-added some functionality to vectors
-fixed documentation issue in Manager.d
-more minor code changes and cleanup
2020-05-28 16:48:42 +00:00

134 lines
No EOL
3.6 KiB
D

module ecs_utils.gfx.buffer;
import bubel.ecs.std;
import glad.gl.gl;
import glad.gl.gles2;
extern(C):
struct Buffer
{
void create() nothrow
{
data = Mallocator.make!Data;
data.gl_handle = 0;
glGenBuffers(1,&data.gl_handle);
data.elem_size = 0;
}
//---------------------------------------------------------------------------------------------------------------------------------------------------
void destroy() nothrow
{
if(data.gl_handle)glDeleteBuffers(1,&data.gl_handle);
}
//---------------------------------------------------------------------------------------------------------------------------------------------------
void bind(BindTarget target) nothrow
{
//if(vbo != this)glBindBuffer(GL_ARRAY_BUFFER,data.gl_handle);
//vbo = this;
glBindBuffer(target,data.gl_handle);
}
void bindRange(BindTarget target, uint index, uint offset, uint size) nothrow
{
glBindBufferRange(target, index, data.gl_handle, offset, size);
}
//---------------------------------------------------------------------------------------------------------------------------------------------------
void bufferData(BindTarget target, uint size, uint count, uint usage, void* data) nothrow
{
bind(target);
this.data.elem_size = size;
glBufferData(target,size*count,data,usage);
}
/*void bufferStorage(uint size, uint count, void* data, uint flags = StorageFlagBits.write)
{
bind(BindTarget.array);
this.data.elem_size = size;
glBufferStorage(GL_ARRAY_BUFFER,size*count,data, flags);
}*/
void bufferSubData(BindTarget target, uint size, uint offset, void* data) nothrow
{
bind(target);
glBufferSubData(target,offset,size,data);
}
void map(BindTarget target) nothrow
{
bind(target);
data.map_ptr = glMapBuffer(target,GL_WRITE_ONLY);
}
void map(uint offset, uint size, BindTarget target, uint flags = MapFlagBits.write | MapFlagBits.flush_explict | MapFlagBits.invalidate_buffer) nothrow
{
bind(target);
data.map_ptr = glMapBufferRange(target,offset,size,flags);
}
void flush(uint offset, uint size, BindTarget target) nothrow
{
glFlushMappedBufferRange(target, offset, size);
}
void unmap(BindTarget target) nothrow
{
bind(target);
glUnmapBuffer(target);
data.map_ptr = null;
}
void* mappedPointer() nothrow
{
return data.map_ptr;
}
//---------------------------------------------------------------------------------------------------------------------------------------------------
static void unbind(BindTarget target) nothrow
{
//vbo = 0;
glBindBuffer(target,0);
}
enum BindTarget
{
array = GL_ARRAY_BUFFER,
element_array = GL_ELEMENT_ARRAY_BUFFER,
uniform = GL_UNIFORM_BUFFER,
//shader_storage = GL_SHADER_STORAGE_BUFFER,
//indirect = GL_DRAW_INDIRECT_BUFFER
}
enum MapFlagBits
{
write = GL_MAP_WRITE_BIT,
invalidate_buffer = GL_MAP_INVALIDATE_BUFFER_BIT,
flush_explict = GL_MAP_FLUSH_EXPLICIT_BIT,
//coherent = GL_MAP_COHERENT_BIT,
//persistent = GL_MAP_PERSISTENT_BIT
}
enum StorageFlagBits
{
write = GL_MAP_WRITE_BIT,
//coherent = GL_MAP_COHERENT_BIT,
//persistent = GL_MAP_PERSISTENT_BIT
}
struct Data
{
uint elem_size;
uint gl_handle;
void* map_ptr;
}
Data* data;
}