src/scene.c

changeset 45
18de2af03531
parent 44
b3da4096c607
child 47
44457f6cb0a2
     1.1 --- a/src/scene.c	Tue Mar 26 20:37:21 2024 +0100
     1.2 +++ b/src/scene.c	Thu Mar 28 23:30:21 2024 +0100
     1.3 @@ -123,12 +123,18 @@
     1.4              node->update_func(node);
     1.5          }
     1.6          if (node->need_transform_update) {
     1.7 -            assert(node->transform_update_func != NULL);
     1.8              node->need_transform_update = false;
     1.9 -            asc_transform_identity(node->local_transform);
    1.10 -            asc_transform_copy(node->world_transform, node->parent->world_transform);
    1.11 -            node->transform_update_func(node);
    1.12 -            asc_mat4f_mulst(node->final_transform, node->local_transform, node->world_transform);
    1.13 +            asc_transform_from_parts(
    1.14 +                    node->transform,
    1.15 +                    node->position,
    1.16 +                    node->scale,
    1.17 +                    node->rotation
    1.18 +            );
    1.19 +            asc_mat4f_mulst(
    1.20 +                    node->world_transform,
    1.21 +                    node->transform,
    1.22 +                    node->parent->world_transform
    1.23 +            );
    1.24          }
    1.25  
    1.26          // add to render group
    1.27 @@ -174,7 +180,7 @@
    1.28          // Sprites
    1.29          // -------
    1.30          // TODO: see if we can really always ignore the view matrix
    1.31 -        shader = &asc_context.active_window->glctx.shader.sprite;
    1.32 +        shader = &asc_context.active_window->glctx.shader.sprite.base;
    1.33          glUseProgram(shader->id);
    1.34          glUniformMatrix4fv(shader->projection, 1,
    1.35                             GL_FALSE, camera->projection);
    1.36 @@ -192,9 +198,8 @@
    1.37  AscSceneNode *asc_scene_node_empty(void) {
    1.38      AscSceneNode *node = calloc(1, sizeof(AscSceneNode));
    1.39      node->free_func = (asc_scene_free_func) free;
    1.40 -    asc_transform_identity(node->local_transform);
    1.41 +    asc_transform_identity(node->transform);
    1.42      asc_transform_identity(node->world_transform);
    1.43 -    asc_transform_identity(node->final_transform);
    1.44      return node;
    1.45  }
    1.46  
    1.47 @@ -260,9 +265,12 @@
    1.48      );
    1.49  }
    1.50  
    1.51 -void asc_node_update_transform(AscSceneNode *node) {
    1.52 +void asc_update_transform(AscSceneNode *node) {
    1.53 +    if (node->need_transform_update) return;
    1.54 +
    1.55      CxTreeIterator iter = asc_scene_node_iterator(node, false);
    1.56      cx_foreach(AscSceneNode*, n, iter) {
    1.57 +        // TODO: break/continue when subtree is already marked for update
    1.58          n->need_transform_update = true;
    1.59      }
    1.60 -}
    1.61 \ No newline at end of file
    1.62 +}

mercurial