From 3bf902fd105f854cf2f55aa77cf4c26ee48656c8 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Fri, 13 Oct 2023 00:54:52 +0300 Subject: [PATCH] transitions for both shapes --- src/game.c | 6 +++--- src/metaobj.c | 60 +++++++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/src/game.c b/src/game.c index 88d8d1a..65f7668 100644 --- a/src/game.c +++ b/src/game.c @@ -82,9 +82,9 @@ int game_init(void) num_mobj = NUM_OBJ; mobjects = malloc(num_mobj * sizeof *mobj); - mobjects[0] = metaobj_sgi(); - mobjects[1] = metaobj_sflake(); - cur_obj = 1; + mobjects[0] = metaobj_sflake(); + mobjects[1] = metaobj_sgi(); + cur_obj = 0; mobj = mobjects[cur_obj]; return 0; } diff --git a/src/metaobj.c b/src/metaobj.c index aee79b4..1ac8dd7 100644 --- a/src/metaobj.c +++ b/src/metaobj.c @@ -96,8 +96,8 @@ static void update(struct mobject *mobj, float tsec) } if(mobj->state != MOBJ_HELD) { for(i=0; iidlepos[i].x = sin(tsec * mobj->mot[i].x + mobj->mot[i].y) * mobj->mot[i].z * 3.0f; - mobj->idlepos[i].z = cos(tsec * mobj->mot[i].z + mobj->mot[i].y) * mobj->mot[i].x * 3.0f; + mobj->idlepos[i].x = sin(tsec * mobj->mot[i].x + mobj->mot[i].y) * mobj->mot[i].z * 4.0f; + mobj->idlepos[i].z = cos(tsec * mobj->mot[i].z + mobj->mot[i].y) * mobj->mot[i].x * 4.0f; mobj->idlepos[i].y = -BBOX_YSZ * 0.45f; } } @@ -298,30 +298,56 @@ struct mobject *metaobj_sgi(void) } mobj->swstate = swstate; + mobj->upd_caps = upd_sgi_caps; return mobj; } +#define LOGOSCALE 0.55f static void upd_sgi_caps(struct mobject *mobj, struct mcapsule *caps, float tsec, float t) { - int i; - float mat[16]; - cgm_vec3 vpos[NUM_SGI_VERTS]; + int idx0, idx1; + cgm_vec3 pos[2]; + static cgm_vec3 prev_pos; - cgm_mcopy(mat, sgimat); - cgm_mrotate_y(mat, t); - cgm_mtranslate(mat, mobj->pos.x, mobj->pos.y, mobj->pos.z); + idx0 = caps - mobj->caps; + idx1 = idx0 >= mobj->num_caps - 1 ? 0 : idx0 + 1; - for(i=0; istate) { + case MOBJ_DROPPING: + t = 1.0f - t; + case MOBJ_GRABING: + if(idx0 == 0) { + pos[0] = sgiv[idx0]; + cgm_vscale(pos, LOGOSCALE); + cgm_vmul_m4v3(pos, mobj->xform); + cgm_vlerp(caps->end, mobj->idlepos + idx0, pos, t); + } else { + caps->end[0] = prev_pos; + } + pos[1] = sgiv[idx1]; + cgm_vscale(pos + 1, LOGOSCALE); + cgm_vmul_m4v3(pos + 1, mobj->xform); + cgm_vlerp(caps->end + 1, mobj->idlepos + idx1, pos + 1, t); + prev_pos = caps->end[1]; + /*caps->energy = cgm_lerp(mobj->mot[idx].w, sfsph[idx].w, t);*/ + break; - for(i=0; icaps[i].end[0] = vpos[i]; - mobj->caps[i].end[1] = vpos[(i + 1) % NUM_SGI_VERTS]; - mobj->caps[i].len = cgm_vdist(mobj->caps[i].end, mobj->caps[i].end + 1); + case MOBJ_HELD: + if(idx0 == 0) { + pos[0] = sgiv[idx0]; + cgm_vscale(pos, LOGOSCALE); + cgm_vmul_m4v3(pos, mobj->xform); + caps->end[0] = pos[0]; + } else { + caps->end[0] = prev_pos; + } + pos[1] = sgiv[idx0]; + cgm_vscale(pos + 1, LOGOSCALE); + cgm_vmul_m4v3(pos + 1, mobj->xform); + prev_pos = caps->end[1] = pos[1]; + break; } + caps->len = cgm_vdist(caps->end, caps->end + 1); } static float capsule_distsq(struct mcapsule *c, cgm_vec3 *pos) -- 1.7.10.4