-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
122 lines
No EOL
3 KiB
D
122 lines
No EOL
3 KiB
D
module ecs_utils.gfx.texture;
|
|
|
|
import bindbc.sdl;
|
|
|
|
import bubel.ecs.std;
|
|
|
|
import ecs_utils.math.vector;
|
|
|
|
import glad.gl.gl;
|
|
|
|
extern(C):
|
|
|
|
struct Texture
|
|
{
|
|
|
|
void create()
|
|
{
|
|
data = Mallocator.make!Data;
|
|
}
|
|
|
|
bool load(const char[] path)
|
|
{
|
|
char[] cpath = (cast(char*)alloca(path.length+1))[0..path.length+1];
|
|
cpath[0..$-1] = path[0..$];
|
|
cpath[$-1] = 0;
|
|
|
|
return __load(this, cpath);
|
|
}
|
|
|
|
/*static bool __load_sdl(ref Texture this_, const char[] path)
|
|
{
|
|
import ecs_utils.gfx.renderer;
|
|
SDL_Surface* surf = IMG_Load(path.ptr);
|
|
if(!surf)return false;
|
|
|
|
this_.data.size = ivec2(surf.w,surf.h);
|
|
|
|
this_.data.texture = SDL_CreateTextureFromSurface(Renderer.main_sdl_renderer,surf);
|
|
if(!this_.data.texture)return false;
|
|
//this_.data.texture = surf;
|
|
|
|
return true;
|
|
}*/
|
|
|
|
static bool __load_gl(ref Texture this_, const char[] path)
|
|
{
|
|
SDL_Surface* surf = IMG_Load(path.ptr);
|
|
if(!surf)return false;
|
|
|
|
with(this_)
|
|
{
|
|
data.size = ivec2(surf.w,surf.h);
|
|
data.bpp = surf.format.BytesPerPixel;
|
|
data.data = Mallocator.makeArray!ubyte(surf.w*surf.h*surf.format.BytesPerPixel);
|
|
data.data[0..$] = (cast(ubyte*)surf.pixels)[0..data.data.length];
|
|
|
|
SDL_FreeSurface(surf);
|
|
|
|
glGenTextures(1, &data.gl_handle);
|
|
glActiveTexture(GL_TEXTURE0);
|
|
glBindTexture(GL_TEXTURE_2D,data.gl_handle);
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
|
|
if(data.bpp == 3)glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,surf.w,surf.h,0,GL_RGB,GL_UNSIGNED_BYTE,data.data.ptr);
|
|
else if(data.bpp == 4)glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,surf.w,surf.h,0,GL_RGBA,GL_UNSIGNED_BYTE,data.data.ptr);
|
|
else return false;
|
|
}
|
|
|
|
|
|
return true;
|
|
}
|
|
|
|
void bind()
|
|
{
|
|
glActiveTexture(GL_TEXTURE0);
|
|
glBindTexture(GL_TEXTURE_2D, data.gl_handle);
|
|
}
|
|
|
|
void destory() @nogc nothrow
|
|
{
|
|
if(data)
|
|
{
|
|
glDeleteTextures(1, &data.gl_handle);
|
|
if(data.data)Mallocator.dispose(data.data);
|
|
Mallocator.dispose(data);
|
|
data = null;
|
|
}
|
|
}
|
|
|
|
__gshared bool function(ref Texture this_, const char[] path) __load;
|
|
|
|
struct Data
|
|
{
|
|
ubyte[] data;
|
|
|
|
ivec2 size;
|
|
uint bpp;
|
|
|
|
union
|
|
{
|
|
SDL_Texture* texture;
|
|
uint gl_handle;
|
|
}
|
|
}
|
|
|
|
static void __loadBackend()
|
|
{
|
|
__load = &__load_gl;
|
|
/*switch(backend)
|
|
{
|
|
case Backend.opengl:__load = &__load_gl;break;
|
|
case Backend.sdl:__load = &__load_sdl;break;
|
|
default:goto case(Backend.opengl);
|
|
}*/
|
|
}
|
|
|
|
Data* data;
|
|
} |