From 5a52afc2fd49eded8e6c8d7af734aa821d8d0707 Mon Sep 17 00:00:00 2001 From: John Alanbrook Date: Wed, 20 Mar 2024 16:48:03 -0500 Subject: [PATCH] simplify camera --- scripts/camera2d.jso | 14 +------------- scripts/editor.js | 10 ++-------- scripts/engine.js | 16 ++++++---------- scripts/physics.js | 2 +- source/engine/debug/debugdraw.c | 6 +++--- source/engine/jsffi.c | 8 +------- source/engine/render.c | 32 ++++++++++++++------------------ source/engine/render.h | 10 +++++----- source/engine/sprite.c | 4 ++-- 9 files changed, 35 insertions(+), 67 deletions(-) diff --git a/scripts/camera2d.jso b/scripts/camera2d.jso index ebf8ff0..f191428 100644 --- a/scripts/camera2d.jso +++ b/scripts/camera2d.jso @@ -8,16 +8,4 @@ this.right = function() { return this.pos.x + (window.rendersize.x/2); } this.left = function() { return this.pos.x - (window.rendersize.x/2); } -this.mixin({ - get zoom() { -// var z = game.native.y / window.dimensions.y; - return render.get_zoom(); // /z - }, - - set zoom(x) { - x = Math.clamp(x,0.1,10); -// var z = game.native.y / window.dimensions.y; -// z *= x; - render.add_zoom(x); - }, -}); \ No newline at end of file +this.zoom = 1; diff --git a/scripts/editor.js b/scripts/editor.js index 0ec18fe..3ae4e94 100644 --- a/scripts/editor.js +++ b/scripts/editor.js @@ -31,8 +31,6 @@ var editor = { get_this() { return this.edit_level; }, - get_that() { return this.selectlist.length === 1 ? this.selectlist[0] : this.get_this(); }, - try_select() { /* nullify true if it should set selected to null if it doesn't find an object */ var go = physics.pos_query(Mouse.worldpos()); return this.do_select(go); @@ -237,13 +235,9 @@ var editor = { this.selectlist = []; editor.camera = world.spawn("scripts/camera2d.jso"); editor.camera._ed.selectable = false; - game.view_camera(editor.camera); + game.camera = editor.camera; }, - - end_debug() { - - }, - + openpanel(panel) { if (this.curpanel) { this.curpanel.close(); diff --git a/scripts/engine.js b/scripts/engine.js index 8ad4b74..5fe924b 100644 --- a/scripts/engine.js +++ b/scripts/engine.js @@ -188,7 +188,10 @@ function process() prosperon.physupdate(phys_step*timescale); } - prosperon.window_render(); + if (!game.camera) + prosperon.window_render(world, 1); + else + prosperon.window_render(game.camera, game.camera.zoom); render.sprites(); render.models(); render.emitters(); @@ -221,7 +224,6 @@ game.doc.stop = "Stop game simulation. This does the same thing as 'pause', and game.doc.play = "Resume or start game simulation."; game.doc.editor_mode = "Set to true for the game to only update on input; otherwise the game updates every frame."; game.doc.dt = "Current frame dt."; -game.doc.view_camera = "Set the camera for the current view."; game.doc.camera = "Current camera."; prosperon.semver = {}; @@ -433,17 +435,11 @@ function world_start() { world.ur = "world"; world.kill = function() { this.clear(); }; world.phys = 2; - var cam = world.spawn("scripts/camera2d.jso"); - game.view_camera(cam); + world.zoom = 1; + game.cam = world; } global.mixin("scripts/physics.js"); -game.view_camera = function(cam) -{ - game.camera = cam; - render.cam_body(game.camera); -} - window.title = `Prosperon v${prosperon.version}`; window.size = [500,500]; diff --git a/scripts/physics.js b/scripts/physics.js index 1b83ea7..8f5f791 100644 --- a/scripts/physics.js +++ b/scripts/physics.js @@ -1,7 +1,7 @@ /* On collisions, entities are sent a 'hit' object, which looks like this: var HIT = { normal: "The normal of the collision point.", - hit: "The gameobject of the object that collided.", + obj: "The gameobject of the object that collided.", sensor: "Boolean for if the colliding object was a sensor.", velocity: "Velocity of the contact.", pos: "Position in world space of the contact.", diff --git a/source/engine/debug/debugdraw.c b/source/engine/debug/debugdraw.c index d4af277..0e8536f 100644 --- a/source/engine/debug/debugdraw.c +++ b/source/engine/debug/debugdraw.c @@ -546,8 +546,8 @@ void draw_box(HMM_Vec2 c, HMM_Vec2 wh, struct rgba color) void draw_grid(float width, float span, struct rgba color) { - HMM_Vec2 offset = (HMM_Vec2)cam_pos(); - offset = HMM_MulV2F(offset, 1/cam_zoom()); + HMM_Vec2 offset = campos; + offset = HMM_MulV2F(offset, 1/camzoom); float ubo[4]; ubo[0] = offset.x; @@ -562,7 +562,7 @@ void draw_grid(float width, float span, struct rgba color) fs_params_t pt; pt.thickness = (float)width; - pt.span = span/cam_zoom(); + pt.span = span/camzoom; memcpy(&pt.color, col, sizeof(float)*4); sg_apply_uniforms(SG_SHADERSTAGE_VS, 0, SG_RANGE_REF(ubo)); sg_apply_uniforms(SG_SHADERSTAGE_FS, 0, SG_RANGE_REF(pt)); diff --git a/source/engine/jsffi.c b/source/engine/jsffi.c index 0358269..27b3789 100644 --- a/source/engine/jsffi.c +++ b/source/engine/jsffi.c @@ -844,16 +844,10 @@ JSC_CCALL(render_commit, sg_commit(); debug_newframe();) JSC_SCALL(render_text_size, ret = bb2js(text_bb(str, js2number(argv[1]), js2number(argv[2]), 1))) JSC_SCALL(render_gif_times, ret = ints2js(gif_delays(str))) JSC_SCALL(render_gif_frames, ret = number2js(gif_nframes(str))) -JSC_CCALL(render_cam_body, set_cam_body(js2gameobject(argv[0])->body)) -JSC_CCALL(render_add_zoom, add_zoom(js2number(argv[0]))) -JSC_CCALL(render_get_zoom, return number2js(cam_zoom())) JSC_CCALL(render_world2screen, return vec22js(world2screen(js2vec2(argv[0])))) JSC_CCALL(render_screen2world, return vec22js(screen2world(js2vec2(argv[0])))) static const JSCFunctionListEntry js_render_funcs[] = { - MIST_FUNC_DEF(render,cam_body, 1), - MIST_FUNC_DEF(render,add_zoom,1), - MIST_FUNC_DEF(render,get_zoom,0), MIST_FUNC_DEF(render,world2screen,1), MIST_FUNC_DEF(render,screen2world,1), MIST_FUNC_DEF(render,gif_frames,1), @@ -982,7 +976,7 @@ static const JSCFunctionListEntry js_input_funcs[] = { JSC_CCALL(prosperon_emitters_step, emitters_step(js2number(argv[0]))) JSC_CCALL(prosperon_phys2d_step, phys2d_update(js2number(argv[0]))) -JSC_CCALL(prosperon_window_render, openglRender(&mainwin)) +JSC_CCALL(prosperon_window_render, openglRender(&mainwin, js2gameobject(argv[0]), js2number(argv[1]))) static const JSCFunctionListEntry js_prosperon_funcs[] = { MIST_FUNC_DEF(prosperon, emitters_step, 1), diff --git a/source/engine/render.c b/source/engine/render.c index b431dd6..eae4306 100644 --- a/source/engine/render.c +++ b/source/engine/render.c @@ -26,6 +26,9 @@ #include "msf_gif.h" +HMM_Vec2 campos = {0,0}; +float camzoom = 1; + static struct { sg_swapchain swap; sg_pipeline pipe; @@ -356,18 +359,10 @@ void render_init() { } -static cpBody *camera = NULL; -void set_cam_body(cpBody *body) { camera = body; } -cpVect cam_pos() { return camera ? cpBodyGetPosition(camera) : cpvzero; } - -static float zoom = 1.f; -float cam_zoom() { return zoom; } -void add_zoom(float val) { zoom = val; } - HMM_Vec2 world2screen(HMM_Vec2 pos) { - pos = HMM_SubV2(pos, HMM_V2(cam_pos().x, cam_pos().y)); - pos = HMM_ScaleV2(pos, 1.0/zoom); + pos = HMM_SubV2(pos, campos); + pos = HMM_ScaleV2(pos, 1.0/camzoom); pos = HMM_AddV2(pos, HMM_ScaleV2(mainwin.size,0.5)); return pos; } @@ -376,8 +371,8 @@ HMM_Vec2 screen2world(HMM_Vec2 pos) { pos = HMM_ScaleV2(pos, 1/mainwin.dpi); pos = HMM_SubV2(pos, HMM_ScaleV2(mainwin.size, 0.5)); - pos = HMM_ScaleV2(pos, zoom); - pos = HMM_AddV2(pos, HMM_V2(cam_pos().x, cam_pos().y)); + pos = HMM_ScaleV2(pos, camzoom); + pos = HMM_AddV2(pos, campos); return pos; } @@ -415,7 +410,7 @@ void full_3d_pass(struct window *window) sg_apply_uniforms(SG_SHADERSTAGE_VS, 0, SG_RANGE_REF(subo)); } -void openglRender(struct window *window) { +void openglRender(struct window *window, gameobject *cam, float zoom) { sg_swapchain sch = sglue_swapchain(); sg_begin_pass(&(sg_pass){ .action = pass_action, @@ -450,13 +445,14 @@ void openglRender(struct window *window) { } // 2D projection - cpVect pos = cam_pos(); + campos = go_pos(cam); + camzoom = zoom; projection = HMM_Orthographic_LH_NO( - pos.x - zoom * usesize.x / 2, - pos.x + zoom * usesize.x / 2, - pos.y - zoom * usesize.y / 2, - pos.y + zoom * usesize.y / 2, -10000.f, 10000.f); + campos.x - camzoom * usesize.x / 2, + campos.x + camzoom * usesize.x / 2, + campos.y - camzoom * usesize.y / 2, + campos.y + camzoom * usesize.y / 2, -10000.f, 10000.f); hudproj = HMM_Orthographic_LH_ZO(0, usesize.x, 0, usesize.y, -1.f, 1.f); diff --git a/source/engine/render.h b/source/engine/render.h index ac8dd01..c1baf0a 100644 --- a/source/engine/render.h +++ b/source/engine/render.h @@ -14,6 +14,7 @@ #include "sokol/sokol_gfx.h" #include "HandmadeMath.h" +#include "gameobject.h" #define RGBA_MAX 255 @@ -52,17 +53,16 @@ enum RenderMode { }; void render_init(); -void openglRender(struct window *window); +extern HMM_Vec2 campos; +extern float camzoom; + +void openglRender(struct window *window, gameobject *cam, float zoom); void opengl_rendermode(enum RenderMode r); void openglInit3d(struct window *window); void openglRender3d(struct window *window, camera3d *camera); void capture_screen(int x, int y, int w, int h, const char *path); -void set_cam_body(cpBody *body); -cpVect cam_pos(); -float cam_zoom(); -void add_zoom(float val); HMM_Vec2 world2screen(HMM_Vec2 pos); HMM_Vec2 screen2world(HMM_Vec2 pos); diff --git a/source/engine/sprite.c b/source/engine/sprite.c index f6193a1..af8e6c1 100644 --- a/source/engine/sprite.c +++ b/source/engine/sprite.c @@ -207,8 +207,8 @@ void sprite_draw(struct sprite *sprite) { if (!sprite->go) t = t2d_unit; else t = go2t(sprite->go); - t.pos.x += (cam_pos().x - (cam_pos().x/sprite->parallax)); - t.pos.y += (cam_pos().y - (cam_pos().y/sprite->parallax)); + t.pos.x += (campos.x - (campos.x/sprite->parallax)); + t.pos.y += (campos.y - (campos.y/sprite->parallax)); HMM_Mat3 m = transform2d2mat(t); HMM_Mat3 sm = transform2d2mat(sprite2t(sprite)); tex_draw(sprite->tex, HMM_MulM3(m,sm), sprite->frame, sprite->color, sprite->drawmode, (HMM_Vec2){0,0}, sprite->scale, sprite->emissive, sprite->parallax);