diff options
author | Vito Caputo <vcaputo@pengaru.com> | 2018-06-09 16:53:12 -0700 |
---|---|---|
committer | Vito Caputo <vcaputo@pengaru.com> | 2018-06-09 16:53:12 -0700 |
commit | 5caa894a3612b8bc090271f5c26daa556237dd97 (patch) | |
tree | 0db69c29a6985054f1e35f3c9319435081234faf | |
parent | b243bf632251042bc8554b2303925a8942aebfe2 (diff) |
libstage: add stage_node_set_static()
Static nodes are unaffected by stage movement, or if later there's a
hierarchy in the stage, this would probably escape all ancestral influence.
The anticipated use case is overlays like consoles, HUDs, and scores etc.
Things which don't move with the dynamic game field.
-rw-r--r-- | src/stage.c | 15 | ||||
-rw-r--r-- | src/stage.h | 1 |
2 files changed, 13 insertions, 3 deletions
diff --git a/src/stage.c b/src/stage.c index 70c5424..280536a 100644 --- a/src/stage.c +++ b/src/stage.c @@ -43,6 +43,7 @@ struct stage_node_t { double angle; /* angle for the texture when composited */ unsigned active:1; /* node is active */ unsigned locked:1; /* node is locked */ + unsigned statik:1; /* node is static */ stage_render_func_t render; /* render object into a texture */ stage_free_func_t free; /* free object */ @@ -229,6 +230,12 @@ void stage_node_set_locked(const stage_t *stage, stage_node_t *node, int locked) } +/* set a node to static (isn't influenced by external position/origin/aabb changes, solely its own positin/origin/aabb) */ +void stage_node_set_static(const stage_t *stage, stage_node_t *node, int statik) +{ + /* I deliberately spelled statik to avoid language keyword collision */ + node->statik = statik; +} /* set a node's layer */ @@ -371,9 +378,11 @@ static void node_to_rect(const stage_t *stage, const stage_node_t *node, const S res_rect->x = stage_rect->x + floorf((float)stage_rect->w * .5f); res_rect->y = stage_rect->y + floorf((float)stage_rect->h * .5f); - /* apply stage->position (scaled relative to stage_rect) */ - res_rect->x += floorf(stage->position.x * .5f * (float)stage_rect->w); - res_rect->y += -floorf(stage->position.y * .5f * (float)stage_rect->h); + if (!node->statik) { + /* apply stage->position (scaled relative to stage_rect) */ + res_rect->x += floorf(stage->position.x * .5f * (float)stage_rect->w); + res_rect->y += -floorf(stage->position.y * .5f * (float)stage_rect->h); + } /* apply node->position (scaled relative to stage_rect) */ res_rect->x += floorf(node->position.x * .5f * (float)stage_rect->w); diff --git a/src/stage.h b/src/stage.h index f5d38e6..f157653 100644 --- a/src/stage.h +++ b/src/stage.h @@ -56,6 +56,7 @@ void stage_node_set_origin(const stage_t *stage, stage_node_t *node, v2f_t *orig void stage_node_get_origin(const stage_t *stage, const stage_node_t *node, v2f_t *res_origin); void stage_node_set_active(const stage_t *stage, stage_node_t *node, int active); void stage_node_set_locked(const stage_t *stage, stage_node_t *node, int locked); +void stage_node_set_static(const stage_t *stage, stage_node_t *node, int stationary); void stage_node_set_layer(stage_t *stage, stage_node_t *node, int layer); void stage_node_set_angle(const stage_t *stage, stage_node_t *node, double angle); void stage_node_get_angle(const stage_t *stage, stage_node_t *node, double *res_angle); |