-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
198 lines
No EOL
4.3 KiB
D
198 lines
No EOL
4.3 KiB
D
module ecs_utils.gfx.material;
|
|
|
|
import bindbc.sdl;
|
|
|
|
import bubel.ecs.std;
|
|
|
|
import ecs_utils.gfx.shader;
|
|
|
|
import glad.gl.gl;
|
|
|
|
//import mutils.serializer.json;
|
|
|
|
struct Material
|
|
{
|
|
|
|
void create() nothrow
|
|
{
|
|
data = Mallocator.make!Data;
|
|
}
|
|
|
|
bool load(const char[] path) nothrow
|
|
{
|
|
struct LoadData
|
|
{
|
|
@("malloc") string blend_mode;
|
|
@("malloc") string vertex;
|
|
@("malloc") string fragment;
|
|
|
|
void dispose() nothrow
|
|
{
|
|
//if(blend_mode)Mallocator.instance.dispose(cast(char[])blend_mode);
|
|
//if(vertex)Mallocator.instance.dispose(cast(char[])vertex);
|
|
//if(fragment)Mallocator.instance.dispose(cast(char[])fragment);
|
|
}
|
|
}
|
|
|
|
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");
|
|
if(file)
|
|
{
|
|
size_t size = cast(size_t)SDL_RWsize(file);
|
|
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);*/
|
|
|
|
//if(__ecs_used_backend == Backend.opengl)
|
|
{
|
|
Shader vsh;
|
|
vsh.load(load_data.vertex);
|
|
vsh.compile();
|
|
|
|
Shader fsh;
|
|
fsh.load(load_data.fragment);
|
|
fsh.compile();
|
|
|
|
Material.ShaderModule[1] modules = [Material.ShaderModule(vsh,fsh)];
|
|
|
|
attachModules(modules);
|
|
}
|
|
|
|
SDL_RWclose(file);
|
|
load_data.dispose();
|
|
return true;
|
|
}
|
|
else return false;
|
|
}
|
|
|
|
void bind() nothrow
|
|
{
|
|
glUseProgram(data.modules[0].gl_handle);
|
|
}
|
|
|
|
enum BlendMode
|
|
{
|
|
opaque,
|
|
additive,
|
|
mixed
|
|
}
|
|
|
|
enum TransformMode
|
|
{
|
|
position,
|
|
matrix
|
|
}
|
|
|
|
struct ShaderModule
|
|
{
|
|
Shader fragment_shader;
|
|
Shader vertex_shader;
|
|
uint gl_handle;
|
|
}
|
|
|
|
void attachModules(scope ShaderModule[] modules) nothrow
|
|
{
|
|
data.modules = Mallocator.makeArray(modules);
|
|
}
|
|
|
|
bool compile() nothrow
|
|
{
|
|
foreach(ref module_;data.modules)
|
|
{
|
|
module_.gl_handle = glCreateProgram();
|
|
glAttachShader(module_.gl_handle, module_.vertex_shader.data.gl_handle);
|
|
glAttachShader(module_.gl_handle, module_.fragment_shader.data.gl_handle);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void bindAttribLocation(const char* name, uint location) nothrow
|
|
{
|
|
foreach(ref module_;data.modules)
|
|
{
|
|
glBindAttribLocation(module_.gl_handle, location, name);
|
|
}
|
|
}
|
|
|
|
bool link() nothrow
|
|
{
|
|
foreach(ref module_;data.modules)
|
|
{
|
|
glLinkProgram(module_.gl_handle);
|
|
|
|
GLint ok = 0;
|
|
glGetProgramiv(module_.gl_handle, GL_LINK_STATUS, &ok);
|
|
if(!ok)
|
|
{
|
|
SDL_Log("Program link error!");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
int getLocation(const char* name)
|
|
{
|
|
foreach(ref module_;data.modules)
|
|
{
|
|
int location = glGetUniformLocation(module_.gl_handle,name);
|
|
if(location != -1)return location;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
void pushBindings()
|
|
{
|
|
foreach(i;0..data.bindings.length)
|
|
{
|
|
glUniform1i(data.bindings[i],cast(int)i);
|
|
}
|
|
}
|
|
|
|
void pushUniforms(void* ptr)
|
|
{
|
|
foreach(ref Uniform uniform; data.uniforms)
|
|
{
|
|
void* local_ptr = ptr + uniform.offset;
|
|
glUniform4fv(uniform.location,1,cast(float*)local_ptr);
|
|
}
|
|
}
|
|
|
|
enum Type
|
|
{
|
|
float_,
|
|
float4
|
|
}
|
|
|
|
struct Uniform
|
|
{
|
|
Type type;
|
|
int location;
|
|
uint offset;
|
|
}
|
|
|
|
struct Data
|
|
{
|
|
BlendMode blend_mode = BlendMode.opaque;
|
|
|
|
ShaderModule[] modules;
|
|
|
|
TransformMode mode;
|
|
|
|
Uniform[] uniforms;
|
|
int[] bindings;
|
|
}
|
|
|
|
Data* data;
|
|
} |