diff --git a/docs/editor.md b/docs/editor.md index 5b0a550..cc19c78 100644 --- a/docs/editor.md +++ b/docs/editor.md @@ -4,6 +4,8 @@ The main editor view is made up of objects. Each object can have a number of components attached to it. When an object is selected, its name, position, and list of components are listed. +The editor edits either entities or components. When it is started, there is no edited level. + ## Basic controls |Ctrl-Z|Undo| |Ctrl-Shift-Z|Redo| diff --git a/source/engine/ffi.c b/source/engine/ffi.c index 3f03ef1..49c64d2 100644 --- a/source/engine/ffi.c +++ b/source/engine/ffi.c @@ -1127,6 +1127,9 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) str = JS_ToCString(js, argv[1]); gif_rec_end(str); break; + case 133: + ret = JS_NewFloat64(js, appTime); + break; } if (str) diff --git a/source/scripts/debug.js b/source/scripts/debug.js index a8fbeea..e5e88be 100644 --- a/source/scripts/debug.js +++ b/source/scripts/debug.js @@ -100,8 +100,10 @@ var Debug = { GUI.text(x.fullpath(), world2screen(x.pos).add([0,32]), 1, [84,110,255]); }); - if (Debug.Options.gif.rec) + if (Debug.Options.gif.rec) { gui_text("REC", [0,40], 1); + gui_text(Time.seconds_to_timecode(Time.time - Debug.Options.gif.start_time, Debug.Options.gif.fps), [0,30], 1); + } gui_text(Game.playing() ? "PLAYING" : Game.stepping() ? @@ -246,22 +248,45 @@ DebugControls.inputs.f4 = function() { DebugControls.inputs.f4.doc = "Toggle drawing gizmos and names of objects."; Debug.Options.gif = { - w: 640, - h: 480, + w: 640, /* Max width */ + h: 480, /* Max height */ + stretch: false, /* True if you want to stretch */ cpf: 2, depth: 8, file: "out.gif", rec: false, + secs: 6, + start_time: 0, + fps: 0, + start() { + var w = this.w; + var h = this.h; + if (!this.stretch) { + var win = Window.height / Window.width; + var gif = h/w; + if (gif > win) + h = w * win; + else + w = h / win; + } + + cmd(131, w, h, this.cpf, this.depth); + this.rec = true; + this.fps = (1/this.cpf)*100; + this.start_time = Time.time; + + timer.oneshot(this.stop.bind(this), this.secs, this); + }, + + stop() { + if (!this.rec) return; + cmd(132, this.file); + this.rec = false; + }, }; -DebugControls.inputs.f8 = function() { - var gif = Debug.Options.gif; - cmd(131, gif.w, gif.h, gif.cpf, gif.depth); - gif.rec = true; -}; -DebugControls.inputs.f9 = function() { - cmd(132, Debug.Options.gif.file); - Debug.Options.gif.rec = false; -}; + +DebugControls.inputs.f8 = Debug.Options.gif.start.bind(Debug.Options.gif); +DebugControls.inputs.f9 = Debug.Options.gif.stop.bind(Debug.Options.gif); DebugControls.inputs.f10 = function() { Time.timescale = 0.1; }; DebugControls.inputs.f10.doc = "Toggle timescale to 1/10."; @@ -284,6 +309,16 @@ var Time = { set physMS(x) { cmd(7, x); }, set renderMS(x) { cmd(5, x); }, + get time() { return cmd(133); }, + + seconds_to_timecode(secs, fps) + { + var s = Math.trunc(secs); + secs -= s; + var f = Math.trunc(fps * secs); + return `${s}:${f}`; + }, + pause() { Time.timescale = 0; }, diff --git a/source/shaders/box.glsl b/source/shaders/box.glsl new file mode 100644 index 0000000..5bd1669 --- /dev/null +++ b/source/shaders/box.glsl @@ -0,0 +1,11 @@ +#version 330 core +in vec2 TexCoords; + +out vec4 frag_color; + +uniform sampler2D diffuse_texture; + +void main() +{ + frag_color = texture(diffuse_texture, TexCoords); +}