-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
121 lines
No EOL
3.7 KiB
D
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;
|
|
} |