bubel-ecs/demos/utils/source/ecs_utils/gfx/mesh.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

121 lines
No EOL
3.7 KiB
D

module ecs_utils.gfx.mesh;
import bindbc.sdl;
import bubel.ecs.std;
import ecs_utils.gfx.buffer;
import glad.gl.gl;
//import mutils.serializer.json;
extern(C):
struct Mesh
{
bool load(const char[] path) nothrow
{
struct LoadData
{
/*struct Vertex
{
struct Binding
{
@("malloc") string type;
uint stride;
}
@("malloc") Binding[] bindings;
}
Vertex vertex;*/
@("malloc") ushort[] indices;
@("malloc") float[] vertices;
//int i;
void dispose() nothrow
{
if(indices)Mallocator.dispose(indices);
if(vertices)Mallocator.dispose(vertices);
/*foreach(binding; vertex.bindings)Mallocator.instance.dispose(cast(char[])binding.type);
if(vertex.bindings)Mallocator.instance.dispose(vertex.bindings);*/
}
}
char[] cpath = (cast(char*)alloca(path.length+1))[0..path.length+1];
cpath[0..$-1] = path[0..$];
cpath[$-1] = 0;
SDL_RWops* file = SDL_RWFromFile(cpath.ptr,"r");//SDL_LoadFile(cpath.ptr,);
if(file)
{
size_t size = cast(size_t)SDL_RWsize(file);
//data.code = Mallocator.instance.makeArray!char(size);
//data.code[$-1] = 0;
char[] buffer = Mallocator.makeArray!char(size);
SDL_RWread(file,buffer.ptr,size,1);
LoadData load_data;
scope(exit)load_data.dispose();
/*JSONSerializer serializer = Mallocator.make!JSONSerializer;
scope(exit)Mallocator.dispose(serializer);
serializer.serialize!(Load.yes, true)(load_data,buffer);*/
indices = Mallocator.makeArray(load_data.indices);
/*vertex.create();
Vertex.Binding[] bindings = (cast(Vertex.Binding*)alloca(Vertex.Binding.sizeof*load_data.vertex.bindings.length))[0..load_data.vertex.bindings.length];
uint vertex_size = 0;
uint alignment = 4;
foreach(i, binding;load_data.vertex.bindings)
{
uint new_size = binding.stride;
bindings[i].stride = binding.stride;
if(binding.type == "float_rg")
{
bindings[i].type = Vertex.Type.float_rg;
new_size += 8;
}
if(new_size > vertex_size)vertex_size = new_size;
//new_size = new_size + (3 - (new_size)%alignment)
}
vertex.data.size = vertex_size;
vertex.attachBindings(bindings);*/
vertices = Mallocator.makeArray(load_data.vertices);
/*vertices = Mallocator.instance.makeArray!ubyte(vertex_size * load_data.vertices.length);
{
foreach()
}*/
SDL_RWclose(file);
load_data.dispose();
return true;
}
else return false;
}
void uploadData() nothrow
{
vbo.create();
vbo.bufferData(Buffer.BindTarget.array,16,cast(uint)vertices.length,GL_STATIC_DRAW,vertices.ptr);
ibo.create();
ibo.bufferData(Buffer.BindTarget.element_array,2,cast(uint)indices.length,GL_STATIC_DRAW,indices.ptr);
}
void bind() nothrow
{
vbo.bind(Buffer.BindTarget.array);
ibo.bind(Buffer.BindTarget.element_array);
glVertexAttribPointer(0,2,GL_FLOAT,false,16,null);
glVertexAttribPointer(1,2,GL_FLOAT,false,16,cast(void*)8);
}
float[] vertices;
ushort[] indices;
Buffer vbo;
Buffer ibo;
//Vertex vertex;
}