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

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;
}