diff --git a/source/engine/datastream.c b/source/engine/datastream.c index ce10ada1..9da71369 100755 --- a/source/engine/datastream.c +++ b/source/engine/datastream.c @@ -7,16 +7,15 @@ #include "sound.h" #include #include "log.h" +#include "texture.h" struct mShader *vid_shader; -static void ds_update_texture(uint32_t unit, uint32_t texture, - plm_plane_t * plane) +static void ds_update_texture(uint32_t unit, uint32_t texture, plm_plane_t * plane) { glActiveTexture(unit); glBindTexture(GL_TEXTURE_2D, texture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, plane->width, plane->height, 0, - GL_RED, GL_UNSIGNED_BYTE, plane->data); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, plane->width, plane->height, 0, GL_RED, GL_UNSIGNED_BYTE, plane->data); } static void render_frame(plm_t * mpeg, plm_frame_t * frame, void *user) @@ -30,16 +29,25 @@ static void render_frame(plm_t * mpeg, plm_frame_t * frame, void *user) static void render_audio(plm_t * mpeg, plm_samples_t * samples, void *user) { - struct datastream *ds = (struct datastream *) user; + struct datastream *ds = user; int size = sizeof(float) * samples->count * 2; play_raw(ds->audio_device, samples->interleaved, size); } +struct Texture *ds_maketexture(struct datastream *ds) +{ + struct Texture *new = malloc(sizeof(*new)); + new->id = ds->texture_cb; + new->width = 500; + new->height = 500; + return new; +} + void ds_openvideo(struct datastream *ds, const char *video, const char *adriver) { - ds_stop(ds); + // ds_stop(ds); char buf[MAXPATH] = {'\0'}; - sprintf(buf, "%s%s", DATA_PATH, video); + sprintf(buf, "%s%s", "video/", video); ds->plm = plm_create_with_filename(buf); if (!ds->plm) { @@ -99,15 +107,14 @@ struct datastream *MakeDatastream() return newds; } -void ds_advance(struct datastream *ds, uint32_t ms) +void ds_advance(struct datastream *ds, double s) { if (ds->playing) { - double advanceTime = ms / 1000.f; - plm_decode(ds->plm, advanceTime); + plm_decode(ds->plm, s); } } -void ds_seek(struct datastream *ds, uint32_t time) +void ds_seek(struct datastream *ds, double time) { clear_raw(ds->audio_device); plm_seek(ds->plm, time, false); diff --git a/source/engine/datastream.h b/source/engine/datastream.h index c6081554..e226c957 100755 --- a/source/engine/datastream.h +++ b/source/engine/datastream.h @@ -15,11 +15,15 @@ struct datastream { uint32_t texture_cr; }; +struct Texture; + +extern struct mShader *vid_shader; + struct datastream *MakeDatastream(); -void ds_openvideo(struct datastream *ds, const char *path, - const char *adriver); -void ds_advance(struct datastream *ds, uint32_t ms); -void ds_seek(struct datastream *ds, uint32_t time); +void ds_openvideo(struct datastream *ds, const char *path, const char *adriver); +struct Texture *ds_maketexture(struct datastream*); +void ds_advance(struct datastream *ds, double); +void ds_seek(struct datastream *ds, double); void ds_advanceframes(struct datastream *ds, int frames); void ds_pause(struct datastream *ds); void ds_stop(struct datastream *ds); diff --git a/source/engine/font.c b/source/engine/font.c index 37e825e8..a03ee4e8 100755 --- a/source/engine/font.c +++ b/source/engine/font.c @@ -98,7 +98,6 @@ struct sFont *MakeFont(const char *fontfile, int height) newfont->Characters[c].Size[1] = h; newfont->Characters[c].Bearing[0] = x0; newfont->Characters[c].Bearing[1] = y0*-1; - printf("Y0 is %d for %c.\n", y0, c); } return newfont; diff --git a/source/engine/log.c b/source/engine/log.c index 8346adf3..62e3ee62 100755 --- a/source/engine/log.c +++ b/source/engine/log.c @@ -7,7 +7,7 @@ #include #include -#define logLevel 4 +#define logLevel 0 void mYughLog(int category, int priority, int line, const char *file, const char *message, ...) { diff --git a/source/engine/openglrender.c b/source/engine/openglrender.c index 6c04cece..677bf814 100755 --- a/source/engine/openglrender.c +++ b/source/engine/openglrender.c @@ -10,6 +10,7 @@ #include "window.h" #include "debugdraw.h" #include "log.h" +#include "datastream.h" int renderMode = 0; @@ -92,6 +93,31 @@ struct mSprite *tsprite = NULL; static unsigned int projUBO; +const char *textvert = +"#version 330 core\n" +"layout (location = 0) in vec4 vertex; \n" +"out vec2 TexCoords;\n" + +"uniform mat4 projection;\n" + +"void main() {\n" + " gl_Position = projection * vec4(vertex.xy, 0.0, 1.0);\n" +" TexCoords = vec2(vertex.z, 1.0 - vertex.w);\n" +"}\n"; + +const char *textfrag = +"#version 330 core\n" +"in vec2 TexCoords;\n" +"out vec4 color;\n" + +"uniform sampler2D text;\n" +"uniform vec3 textColor;\n" + +"void main() { \n" +" vec4 sampled = vec4(1.0, 1.0, 1.0, texture(text, TexCoords).r);\n" +" color = vec4(textColor, 1.0) * sampled;\n" +"}\n"; + void openglInit() { if (!mainwin) { @@ -104,6 +130,7 @@ void openglInit() spriteShader = MakeShader("spritevert.glsl", "spritefrag.glsl"); animSpriteShader = MakeShader("animspritevert.glsl", "animspritefrag.glsl"); textShader = MakeShader("textvert.glsl", "textfrag.glsl"); + //textShader = CreateShader(textverg, textfrag); shader_use(textShader); shader_setint(textShader, "text", 0); @@ -156,10 +183,7 @@ void openglRender(struct mSDLWindow *window, struct mCamera *mcamera) glBindBuffer(GL_UNIFORM_BUFFER, projUBO); glBufferSubData(GL_UNIFORM_BUFFER, 0, 64, projection); - - glColorMask(true, true, true, true); - - + shader_setmat4(vid_shader, "projection", projection); glEnable(GL_DEPTH_TEST); // Clear color and depth @@ -167,19 +191,15 @@ void openglRender(struct mSDLWindow *window, struct mCamera *mcamera) ////// TEXT && GUI - - - ///// Sprites glDepthFunc(GL_LESS); shader_use(spriteShader); sprite_draw_all(); - - glDepthFunc(GL_ALWAYS); shader_use(textShader); shader_setmat4(textShader, "projection", projection); + } diff --git a/source/engine/shader.c b/source/engine/shader.c index e17fd2fa..49509c1d 100755 --- a/source/engine/shader.c +++ b/source/engine/shader.c @@ -7,21 +7,26 @@ #include #include "log.h" #include "resources.h" +#include "vec.h" #define SHADER_BUF 10000 -struct mShader *mshaders[255]; -struct mShader **lastShader = mshaders; +struct vec shaders; struct mShader *MakeShader(const char *vertpath, const char *fragpath) { + if (shaders.data == NULL) shaders = vec_init(sizeof(struct mShader), 10); + struct mShader init = { 0, vertpath, fragpath }; - struct mShader *newshader = - (struct mShader *) malloc(sizeof(struct mShader)); - memcpy(newshader, &init, sizeof(*newshader)); - *lastShader++ = newshader; - shader_compile(newshader); - return newshader; + struct mShader *new = vec_add(&shaders, NULL); + memcpy(new, &init, sizeof(*new)); + shader_compile(new); + return new; +} + +struct mShader *CreateShader(const char *vert, const char *frag) +{ + return NULL; } int shader_compile_error(GLuint shader) @@ -75,8 +80,10 @@ GLuint load_shader_from_file(const char *path, int type) const char *code = buf; glShaderSource(id, 1, &code, NULL); glCompileShader(id); - if (shader_compile_error(id)) + if (shader_compile_error(id)) { + printf("Error with shader %s.\n", path); return 0; + } return id; } @@ -155,10 +162,5 @@ void shader_setUBO(struct mShader *shader, const char *name, unsigned int index) void shader_compile_all() { - struct mShader **curshader = mshaders; - do { - YughLog(0, LOG_INFO, "Compiled Shader %d", 1); - shader_compile(*curshader); - } while (++curshader != lastShader); - + vec_walk(&shaders, shader_compile); } diff --git a/source/engine/shader.h b/source/engine/shader.h index 10567c2f..3eadbc68 100755 --- a/source/engine/shader.h +++ b/source/engine/shader.h @@ -11,6 +11,7 @@ struct mShader { void shader_compile_all(); struct mShader *MakeShader(const char *vertpath, const char *fragpath); +struct mShader *CreateShader(const char *vert, const char *frag); void shader_compile(struct mShader *shader); void shader_use(struct mShader *shader); @@ -18,20 +19,13 @@ void shader_setbool(struct mShader *shader, const char *name, int val); void shader_setint(struct mShader *shader, const char *name, int val); void shader_setfloat(struct mShader *shader, const char *name, float val); -void shader_setvec2(struct mShader *shader, const char *name, - mfloat_t val[2]); -void shader_setvec3(struct mShader *shader, const char *name, - mfloat_t val[3]); -void shader_setvec4(struct mShader *shader, const char *name, - mfloat_t val[4]); -void shader_setmat2(struct mShader *shader, const char *name, - mfloat_t val[4]); -void shader_setmat3(struct mShader *shader, const char *name, - mfloat_t val[9]); -void shader_setmat4(struct mShader *shader, const char *name, - mfloat_t val[16]); +void shader_setvec2(struct mShader *shader, const char *name, mfloat_t val[2]); +void shader_setvec3(struct mShader *shader, const char *name, mfloat_t val[3]); +void shader_setvec4(struct mShader *shader, const char *name, mfloat_t val[4]); +void shader_setmat2(struct mShader *shader, const char *name, mfloat_t val[4]); +void shader_setmat3(struct mShader *shader, const char *name, mfloat_t val[9]); +void shader_setmat4(struct mShader *shader, const char *name, mfloat_t val[16]); -void shader_setUBO(struct mShader *shader, const char *name, - unsigned int index); +void shader_setUBO(struct mShader *shader, const char *name, unsigned int index); #endif diff --git a/source/engine/sound.c b/source/engine/sound.c index b499c7ec..0e90cbc1 100755 --- a/source/engine/sound.c +++ b/source/engine/sound.c @@ -12,34 +12,47 @@ ma_sound_group mus_grp; void data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount) { + printf("audio cb\n"); // In playback mode copy data to pOutput. In capture mode read data from pInput. In full-duplex mode, both // pOutput and pInput will be valid and you can move data from pInput into pOutput. Never process more than // frameCount frames. + ma_engine_read_pcm_frames(&engine, pOutput, frameCount, NULL); } void sound_init() { -/* + + ma_device_config cnf = ma_device_config_init(ma_device_type_playback); cnf.playback.format = ma_format_f32; - cnf.playback.channels = 0; - cnf.sampleRate = 0; + cnf.playback.channels = 2; + cnf.sampleRate = 48000; cnf.dataCallback = data_callback; + cnf.pUserData = mus_cur; ma_device device; - ma_device_init(NULL, &cnf, &device); + if (ma_device_init(NULL, &cnf, &device) != MA_SUCCESS) { + YughError("Did not initialize audio playback!!",0); + } - ma_device_start(&device); -*/ + if (ma_device_start(&device) != MA_SUCCESS) { + printf("Failed to start playback device.\n"); + } - ma_result result = ma_engine_init(NULL, &engine); + + + ma_engine_config enginecnf = ma_engine_config_init(); + enginecnf.pDevice = &device; + + ma_result result = ma_engine_init(&enginecnf, &engine); if (result != MA_SUCCESS) { YughError("Miniaudio did not start properly.",1); exit(1); } ma_sound_group_init(&engine, 0, NULL, &mus_grp); + } void audio_open(const char *device) diff --git a/source/engine/sprite.c b/source/engine/sprite.c index 18b64fd6..6b441f71 100755 --- a/source/engine/sprite.c +++ b/source/engine/sprite.c @@ -9,6 +9,7 @@ #include "datastream.h" #include "gameobject.h" #include +#include "vec.h" static struct mGameObject *gui_go = NULL; @@ -21,16 +22,16 @@ static struct mShader *animSpriteShader = NULL; struct TextureOptions TEX_SPRITE = { 1, 0, 0 }; -struct mSprite *sprites[100] = { NULL }; - -int numSprites = 0; +struct vec sprites; static uint32_t quadVAO; struct mSprite *MakeSprite(struct mGameObject *go) { - struct mSprite *sprite = malloc(sizeof(struct mSprite)); - sprites[numSprites++] = sprite; + // TODO: Init this once and never check again + if (sprites.data == NULL) sprites = vec_init(sizeof(struct mSprite), 10); + + struct mSprite *sprite = vec_add(&sprites, NULL); sprite->color[0] = 1.f; sprite->color[1] = 1.f; sprite->color[2] = 1.f; @@ -51,8 +52,7 @@ void sprite_init(struct mSprite *sprite, struct mGameObject *go) void sprite_draw_all() { shader_use(spriteShader); - for (int i = 0; i < numSprites; i++) - sprite_draw(sprites[i]); + vec_walk(&sprites, sprite_draw); } void sprite_loadtex(struct mSprite *sprite, const char *path) @@ -60,8 +60,7 @@ void sprite_loadtex(struct mSprite *sprite, const char *path) sprite->tex = texture_loadfromfile(path); } -void sprite_loadanim(struct mSprite *sprite, const char *path, - struct Anim2D anim) +void sprite_loadanim(struct mSprite *sprite, const char *path, struct Anim2D anim) { sprite->tex = texture_loadfromfile(path); sprite->anim = anim; @@ -171,7 +170,7 @@ void spriteanim_draw(struct mSprite *sprite) mat4_translate_vec2(model, sprite->pos); mfloat_t msize[2] = { sprite->size[0] * sprite->anim.dimensions[0], -sprite->size[1] * sprite->anim.dimensions[1] }; + sprite->size[1] * sprite->anim.dimensions[1] }; mat4_scale_vec2(model, msize); shader_setmat4(animSpriteShader, "model", model); @@ -189,15 +188,15 @@ sprite->size[1] * sprite->anim.dimensions[1] }; void video_draw(struct datastream *stream, mfloat_t position[2], mfloat_t size[2], float rotate, mfloat_t color[3]) { - shader_use(spriteShader); + shader_use(vid_shader); static mfloat_t model[16]; memcpy(model, UNITMAT4, sizeof(UNITMAT4)); mat4_translate_vec2(model, position); mat4_scale_vec2(model, size); - shader_setmat4(spriteShader, "model", model); - shader_setvec3(spriteShader, "spriteColor", color); + shader_setmat4(vid_shader, "model", model); + shader_setvec3(vid_shader, "spriteColor", color); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, stream->texture_y); @@ -207,9 +206,8 @@ void video_draw(struct datastream *stream, mfloat_t position[2], mfloat_t size[2 glBindTexture(GL_TEXTURE_2D, stream->texture_cr); // TODO: video bind VAO - //glBindVertexArray(stream->quadVAO); + glBindVertexArray(quadVAO); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - glBindVertexArray(0); } void gui_init() diff --git a/source/engine/sprite.h b/source/engine/sprite.h index 47e71c4c..3b5cfc52 100755 --- a/source/engine/sprite.h +++ b/source/engine/sprite.h @@ -29,9 +29,6 @@ struct mSprite { struct mGameObject *go; }; -extern struct mSprite *sprites[100]; -extern int numSprites; - struct mSprite *MakeSprite(struct mGameObject *go); void sprite_init(struct mSprite *sprite, struct mGameObject *go); void sprite_loadtex(struct mSprite *sprite, const char *path); diff --git a/source/engine/window.c b/source/engine/window.c index e1ce7a13..3ffb6a87 100755 --- a/source/engine/window.c +++ b/source/engine/window.c @@ -249,17 +249,15 @@ double frame_time() return glfwGetTime(); } -double elapsed_time() +int elapsed_time() { static double last_time; - static double elapsed; + double elapsed; elapsed = frame_time() - last_time; - return elapsed; -} - -int elapsed_time_ms() -{ - return elapsed_time() * 1000; + last_time = frame_time(); + //printf("Elapsed: %d.\n", elapsed); + return elapsed * 1000; } + diff --git a/source/engine/window.h b/source/engine/window.h index e696ca1c..c2d88a36 100755 --- a/source/engine/window.h +++ b/source/engine/window.h @@ -39,7 +39,6 @@ void window_seticon(struct mSDLWindow *w, struct Texture *icon); int window_hasfocus(struct mSDLWindow *w); double frame_time(); -double elapsed_time(); -int elapsed_time_ms(); +int elapsed_time(); #endif