Fix grid drawing; add energy efficient editing; add input down detection
This commit is contained in:
parent
e78e673576
commit
acecf2fde9
10
Makefile
10
Makefile
|
@ -22,12 +22,11 @@ endif
|
|||
|
||||
ifeq ($(DBG),1)
|
||||
CFLAGS += -g
|
||||
INFO += dbg
|
||||
INFO += _dbg
|
||||
LDFLAGS += -g
|
||||
else
|
||||
CFLAGS += -DNDEBUG
|
||||
LDFLAGS += -s
|
||||
INFO += rel
|
||||
endif
|
||||
|
||||
ifeq ($(OPT),small)
|
||||
|
@ -80,13 +79,13 @@ else
|
|||
ifeq ($(UNAME), Linux)
|
||||
LDFLAGS += -pthread -rdynamic
|
||||
LDLIBS += GL pthread c m dl X11 Xi Xcursor EGL asound
|
||||
PLAT = linux-$(ARCH)
|
||||
PLAT = linux-$(ARCH)$(INFO)
|
||||
endif
|
||||
|
||||
ifeq ($(UNAME), Darwin)
|
||||
ifeq ($(PLATFORM), macosx)
|
||||
LDLIBS += Coca QuartzCore OpenGL
|
||||
PLAT = mac-$(ARCH)
|
||||
PLAT = mac-$(ARCH)$(INFO)
|
||||
else ifeq ($(PLATFORM), iphoneos)
|
||||
LDLIBS += Foundation UIKit OpenGLES GLKit
|
||||
endif
|
||||
|
@ -133,7 +132,6 @@ DESTDIR ?= ~/.bin
|
|||
|
||||
install: $(DISTDIR)/$(DIST)
|
||||
@echo Unpacking $(DIST) in $(DESTDIR)
|
||||
# @unzip $(DISTDIR)/$(DIST) -d $(DESTDIR)
|
||||
@$(UNZIP)
|
||||
|
||||
$(BIN)/$(NAME): $(BIN)/libengine.a $(BIN)/libquickjs.a
|
||||
|
@ -146,7 +144,7 @@ $(DISTDIR)/$(DIST): $(BIN)/$(NAME) source/shaders/* $(SCRIPTS) assets/*
|
|||
@mkdir -p $(DISTDIR)
|
||||
@cp -rf assets/* $(BIN)
|
||||
@cp -rf source/shaders $(BIN)
|
||||
@cp -r source/scripts $(BIN)
|
||||
@cp -rf source/scripts $(BIN)
|
||||
@$(PKGCMD)
|
||||
|
||||
$(BIN)/libengine.a: $(OBJS)
|
||||
|
|
|
@ -8,13 +8,17 @@ unsigned long long triCount = 0;
|
|||
|
||||
void prof_start(struct d_prof *prof)
|
||||
{
|
||||
#ifndef NDEBUG
|
||||
prof->lap = stm_now();
|
||||
#endif
|
||||
}
|
||||
|
||||
void prof(struct d_prof *prof)
|
||||
{
|
||||
#ifndef NDEBUG
|
||||
uint64_t t = stm_since(prof->lap);
|
||||
arrput(prof->ms, stm_sec(t));
|
||||
#endif
|
||||
}
|
||||
|
||||
void resetTriangles()
|
||||
|
|
|
@ -278,8 +278,9 @@ void debugdraw_init()
|
|||
grid_shader = sg_compile_shader("shaders/gridvert.glsl", "shaders/gridfrag.glsl", &(sg_shader_desc){
|
||||
.vs.uniform_blocks[0] = projection_ubo,
|
||||
.vs.uniform_blocks[1] = {
|
||||
.size = sizeof(float)*2,
|
||||
.uniforms = { [0] = { .name = "offset", .type = SG_UNIFORMTYPE_FLOAT2 } } },
|
||||
.size = sizeof(float)*4,
|
||||
.uniforms = { [0] = { .name = "offset", .type = SG_UNIFORMTYPE_FLOAT2 },
|
||||
[1] = { .name = "dimen", .type = SG_UNIFORMTYPE_FLOAT2 } } },
|
||||
.fs.uniform_blocks[0] = {
|
||||
.size = sizeof(float)*6,
|
||||
.uniforms = {
|
||||
|
@ -566,24 +567,30 @@ void draw_arrow(struct cpVect start, struct cpVect end, struct rgba color, int c
|
|||
draw_cppoint(end, capsize, color);
|
||||
}
|
||||
|
||||
void draw_grid(int width, int span, struct rgba color)
|
||||
void draw_grid(float width, float span, struct rgba color)
|
||||
{
|
||||
cpVect offset = cam_pos();
|
||||
offset.x -= mainwin.width/2;
|
||||
offset.y -= mainwin.height/2;
|
||||
offset = cpvmult(offset, 1/cam_zoom());
|
||||
|
||||
float ubo[4];
|
||||
ubo[0] = offset.x;
|
||||
ubo[1] = offset.y;
|
||||
ubo[2] = mainwin.width;
|
||||
ubo[3] = mainwin.height;
|
||||
|
||||
sg_apply_pipeline(grid_pipe);
|
||||
sg_apply_bindings(&grid_bind);
|
||||
|
||||
float col[4] = { color.r/255.0 ,color.g/255.0 ,color.b/255.0 ,color.a/255.0 };
|
||||
|
||||
float fubo[6];
|
||||
fubo[0] = 1;
|
||||
fubo[0] = (float)width;
|
||||
fubo[1] = span;
|
||||
memcpy(&fubo[2], col, sizeof(float)*4);
|
||||
sg_apply_uniforms(SG_SHADERSTAGE_VS, 0, SG_RANGE_REF(projection));
|
||||
sg_apply_uniforms(SG_SHADERSTAGE_VS, 1, SG_RANGE_REF(offset));
|
||||
sg_apply_uniforms(SG_SHADERSTAGE_VS, 1, SG_RANGE_REF(ubo));
|
||||
sg_apply_uniforms(SG_SHADERSTAGE_FS, 0, SG_RANGE_REF(fubo));
|
||||
sg_draw(0,4,1);
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ void draw_circle(cpVect c, float radius, float pixels, struct rgba color, float
|
|||
void draw_box(cpVect c, cpVect wh, struct rgba color);
|
||||
void draw_poly(cpVect *points, int n, struct rgba color);
|
||||
|
||||
void draw_grid(int width, int span, struct rgba color);
|
||||
void draw_grid(float width, float span, struct rgba color);
|
||||
|
||||
void debug_flush(HMM_Mat4 *view);
|
||||
void debug_newframe();
|
||||
|
|
|
@ -600,11 +600,11 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv)
|
|||
break;
|
||||
|
||||
case 5:
|
||||
renderMS = js2number(argv[1]);
|
||||
// renderMS = js2number(argv[1]);
|
||||
break;
|
||||
|
||||
case 6:
|
||||
updateMS = js2number(argv[1]);
|
||||
// updateMS = js2number(argv[1]);
|
||||
break;
|
||||
|
||||
case 7:
|
||||
|
@ -770,7 +770,7 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv)
|
|||
return JS_NULL;
|
||||
|
||||
case 47:
|
||||
draw_grid(js2int(argv[1]), js2int(argv[2]), js2color(argv[3]));
|
||||
draw_grid(js2number(argv[1]), js2number(argv[2]), js2color(argv[3]));
|
||||
return JS_NULL;
|
||||
|
||||
case 48:
|
||||
|
@ -1214,6 +1214,10 @@ JSValue duk_sys_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *ar
|
|||
case 9: /* Clear the level out */
|
||||
new_level();
|
||||
break;
|
||||
|
||||
case 10:
|
||||
render_dirty = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
return JS_NULL;
|
||||
|
|
|
@ -342,10 +342,12 @@ const char *keyname_extd(int key) {
|
|||
}
|
||||
|
||||
void call_input_down(int *key) {
|
||||
JSValue argv[2];
|
||||
argv[0] = input2js(keyname_extd(*key));
|
||||
argv[1] = jsinputstate[4];
|
||||
script_callee(pawn_callee, 2, argv);
|
||||
JSValue argv[3];
|
||||
argv[0] = JS_NewString(js, "emacs");
|
||||
argv[1] = input2js(keyname_extd(*key));
|
||||
argv[2] = jsinputstate[4];
|
||||
script_callee(pawn_callee, 3, argv);
|
||||
JS_FreeValue(js, argv[0]);
|
||||
}
|
||||
|
||||
/* This is called once every frame - or more if we want it more! */
|
||||
|
@ -354,8 +356,8 @@ void input_poll(double wait) {
|
|||
mouseWheelX = 0;
|
||||
mouseWheelY = 0;
|
||||
|
||||
// for (int i = 0; i < arrlen(downkeys); i++)
|
||||
// call_input_down(&downkeys[i]);
|
||||
for (int i = 0; i < arrlen(downkeys); i++)
|
||||
call_input_down(&downkeys[i]);
|
||||
}
|
||||
|
||||
int key_is_num(int key) {
|
||||
|
|
|
@ -65,15 +65,10 @@ static struct d_prof prof_update;
|
|||
static struct d_prof prof_input;
|
||||
static struct d_prof prof_physics;
|
||||
|
||||
int physOn = 0;
|
||||
|
||||
double renderlag = 0;
|
||||
double physlag = 0;
|
||||
double updatelag = 0;
|
||||
int render_dirty = 0;
|
||||
|
||||
double renderMS = 1 / 165.f;
|
||||
double physMS = 1 / 165.f;
|
||||
double updateMS = 1 / 165.f;
|
||||
double physMS = 1 / 60.f;
|
||||
|
||||
static int phys_step = 0;
|
||||
|
||||
|
@ -87,7 +82,6 @@ static float timescale = 1.f;
|
|||
|
||||
static int sim_play = SIM_PLAY;
|
||||
|
||||
|
||||
#ifdef __TINYC__
|
||||
int backtrace(void **buffer, int size) {
|
||||
extern uint64_t *__libc_stack_end;
|
||||
|
@ -149,8 +143,6 @@ void c_init() {
|
|||
render_init();
|
||||
|
||||
script_evalf("initialize();");
|
||||
|
||||
|
||||
}
|
||||
|
||||
int frame_fps() {
|
||||
|
@ -162,7 +154,7 @@ void c_frame()
|
|||
double elapsed = sapp_frame_duration();
|
||||
appTime += elapsed;
|
||||
|
||||
input_poll(fmax(0, renderMS-elapsed));
|
||||
input_poll(0);
|
||||
|
||||
if (sim_play == SIM_PLAY || sim_play == SIM_STEP) {
|
||||
prof_start(&prof_update);
|
||||
|
@ -181,29 +173,29 @@ void c_frame()
|
|||
phys_step = 0;
|
||||
prof(&prof_physics);
|
||||
}
|
||||
|
||||
if (sim_play == SIM_STEP) {
|
||||
sim_pause();
|
||||
render_dirty = 1;
|
||||
}
|
||||
}
|
||||
|
||||
renderlag += elapsed;
|
||||
|
||||
// if (renderlag >= renderMS) {
|
||||
// renderlag -= renderMS;
|
||||
if (sim_play == SIM_PLAY || render_dirty) {
|
||||
prof_start(&prof_draw);
|
||||
window_render(&mainwin);
|
||||
prof(&prof_draw);
|
||||
// }
|
||||
|
||||
gameobjects_cleanup();
|
||||
|
||||
render_dirty = 0;
|
||||
}
|
||||
|
||||
gameobjects_cleanup();
|
||||
}
|
||||
|
||||
void c_clean()
|
||||
{
|
||||
void c_clean() {};
|
||||
|
||||
}
|
||||
|
||||
void c_event(const sapp_event *e)
|
||||
{
|
||||
render_dirty = 1;
|
||||
switch (e->type) {
|
||||
case SAPP_EVENTTYPE_MOUSE_MOVE:
|
||||
input_mouse_move(e->mouse_x, e->mouse_y, e->mouse_dx, e->mouse_dy);
|
||||
|
@ -277,10 +269,7 @@ void sim_pause() {
|
|||
int phys_stepping() { return sim_play == SIM_STEP; }
|
||||
|
||||
void sim_step() {
|
||||
if (sim_paused()) {
|
||||
YughInfo("Step");
|
||||
sim_play = SIM_STEP;
|
||||
}
|
||||
sim_play = SIM_STEP;
|
||||
}
|
||||
|
||||
void set_timescale(float val) {
|
||||
|
@ -349,7 +338,7 @@ sapp_desc sokol_main(int argc, char **argv) {
|
|||
script_dofile("scripts/engine.js");
|
||||
|
||||
int argsize = 0;
|
||||
for (int i = 1; i < argc; i++) {
|
||||
for (int i = 0; i < argc; i++) {
|
||||
argsize += strlen(argv[i]);
|
||||
if (argc > i+1) argsize++;
|
||||
}
|
||||
|
|
|
@ -20,5 +20,6 @@ extern double appTime;
|
|||
extern double renderMS;
|
||||
extern double physMS;
|
||||
extern double updateMS;
|
||||
extern int render_dirty;
|
||||
|
||||
#endif
|
||||
|
|
|
@ -66,6 +66,7 @@ var Debug = {
|
|||
|
||||
line(points, color, type, thickness) {
|
||||
thickness ??= 1;
|
||||
|
||||
if (!type)
|
||||
type = 0;
|
||||
|
||||
|
|
|
@ -895,7 +895,7 @@ var editor = {
|
|||
gui_img("icons/icons8-lock-16.png", world2screen(obj.pos));
|
||||
});
|
||||
|
||||
Debug.draw_grid(1, editor_config.grid_size/editor_camera.zoom, editor_config.grid_color);
|
||||
Debug.draw_grid(2, editor_config.grid_size/editor_camera.zoom, editor_config.grid_color);
|
||||
var startgrid = screen2world([-20,Window.height]).map(function(x) { return Math.snap(x, editor_config.grid_size); }, this);
|
||||
var endgrid = screen2world([Window.width, 0]);
|
||||
|
||||
|
@ -2542,3 +2542,6 @@ Debug.register_call(editor.ed_debug, editor);
|
|||
if (IO.exists("editor.config"))
|
||||
load_configs("editor.config");
|
||||
editor.edit_level = Level.create();
|
||||
|
||||
Game.stop();
|
||||
Game.render();
|
||||
|
|
|
@ -962,6 +962,8 @@ var Player = {
|
|||
case 'released':
|
||||
fn = pawn.inputs[cmd].released;
|
||||
break;
|
||||
case 'down':
|
||||
fn = pawn.inputs[cmd].down;
|
||||
}
|
||||
|
||||
if (typeof fn === 'function')
|
||||
|
@ -1046,7 +1048,7 @@ var Register = {
|
|||
|
||||
unregister_obj(obj) {
|
||||
Register.registries.forEach(function(x) {
|
||||
x.clear();
|
||||
x.unregister_obj(obj);
|
||||
});
|
||||
Player.uncontrol(obj);
|
||||
},
|
||||
|
@ -1071,11 +1073,19 @@ var Register = {
|
|||
var entries = [];
|
||||
var n = {};
|
||||
n.register = function(fn, obj) {
|
||||
if (!obj) {
|
||||
Log.warn("Refusing to register a function without a destroying object.");
|
||||
return;
|
||||
}
|
||||
entries.push([fn, obj ? obj : null]);
|
||||
}
|
||||
|
||||
n.unregister = function(fn) {
|
||||
entries = entries.filter(function(f) { return fn === f; });
|
||||
entries = entries.filter(function(f) { return fn !== f; });
|
||||
}
|
||||
|
||||
n.unregister_obj = function(obj) {
|
||||
entries = entries.filter(function(o) { return o !== obj; });
|
||||
}
|
||||
|
||||
n.broadcast = function(...args) {
|
||||
|
@ -1322,6 +1332,8 @@ var Game = {
|
|||
sys_cmd(4);
|
||||
},
|
||||
|
||||
render() { sys_cmd(10); },
|
||||
|
||||
playing() { return sys_cmd(5); },
|
||||
paused() { return sys_cmd(6); },
|
||||
stepping() {
|
||||
|
@ -1547,6 +1559,8 @@ var Level = {
|
|||
Game.register_obj(newobj);
|
||||
newobj.setup?.();
|
||||
newobj.start?.();
|
||||
if (newobj.update)
|
||||
Register.update.register(newobj.update, newobj);
|
||||
return newobj;
|
||||
},
|
||||
|
||||
|
|
|
@ -8,12 +8,13 @@ layout (std140) uniform Projection {
|
|||
};
|
||||
|
||||
uniform vec2 offset;
|
||||
uniform vec2 dimen;
|
||||
|
||||
void main()
|
||||
{
|
||||
// vec4 ipos = inverse(projection) * vec4(pos, 0.f, 1.f);
|
||||
apos = pos * vec2(600, 360);
|
||||
apos += offset;
|
||||
apos = pos * dimen;
|
||||
// apos += offset;
|
||||
// apos = pos + offset;
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue