src/behavior.c

Wed, 02 Jul 2025 23:21:17 +0200

author
Mike Becker <universe@uap-core.de>
date
Wed, 02 Jul 2025 23:21:17 +0200
changeset 174
0009b982bc7d
parent 162
d3598c834f9b
child 176
cb2f60f48337
permissions
-rw-r--r--

resolve TODOs regarding input.h

a) mouse position must be integer, because it can be negative (though rarely)
b) we should not trade "access complexity" for space in the scancodes array

108
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 * Copyright 2025 Mike Becker. All rights reserved.
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 *
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 * Redistribution and use in source and binary forms, with or without
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * modification, are permitted provided that the following conditions are met:
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 *
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 * 1. Redistributions of source code must retain the above copyright
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * notice, this list of conditions and the following disclaimer.
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 *
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 * 2. Redistributions in binary form must reproduce the above copyright
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * notice, this list of conditions and the following disclaimer in the
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * documentation and/or other materials provided with the distribution.
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 *
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * POSSIBILITY OF SUCH DAMAGE.
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 */
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28 #include "ascension/behavior.h"
148
9f030f402699 implement interval for behaviors - fixes #383
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
29 #include "ascension/context.h"
112
3e956c96dd6c extract execution of behaviors from draw function
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
30 #include "ascension/scene.h"
108
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
31
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
32 #include <cx/array_list.h>
112
3e956c96dd6c extract execution of behaviors from draw function
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
33 #include <cx/tree.h>
108
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
34
162
d3598c834f9b improve NULL-safety - fixes #690
Mike Becker <universe@uap-core.de>
parents: 148
diff changeset
35 #include <assert.h>
d3598c834f9b improve NULL-safety - fixes #690
Mike Becker <universe@uap-core.de>
parents: 148
diff changeset
36
108
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
37 static void asc_behavior_destroy(void *b) {
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
38 AscBehavior *behavior = b;
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
39 if (behavior->destroy_func) {
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
40 behavior->destroy_func(behavior);
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
41 }
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
42 }
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
43
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
44 static CxList *asc_behavior_new_list(void) {
113
71ba88258ea0 change node's free function to a destroy function
Mike Becker <universe@uap-core.de>
parents: 112
diff changeset
45 // TODO: add comparator when we know how to identify behaviors in order to remove them
108
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
46 CxList *list = cxArrayListCreate(NULL, NULL, sizeof(AscBehavior), 4);
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
47 cxDefineDestructor(list, asc_behavior_destroy);
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
48 return list;
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
49 }
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
50
111
ee4b58dfcf7f change naming convention for functions that are hidden behind macros
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
51 AscBehavior *asc_behavior_add_(AscSceneNode *node, struct asc_behavior_create_args args) {
108
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
52 if (node->behaviors == NULL) {
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
53 node->behaviors = asc_behavior_new_list();
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
54 }
109
08548799ae4a use new UCX 3.2 cxListEmplace()
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
55 AscBehavior *behavior = cxListEmplace(node->behaviors);
162
d3598c834f9b improve NULL-safety - fixes #690
Mike Becker <universe@uap-core.de>
parents: 148
diff changeset
56 assert(behavior != NULL);
112
3e956c96dd6c extract execution of behaviors from draw function
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
57 behavior->enabled = true;
109
08548799ae4a use new UCX 3.2 cxListEmplace()
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
58 behavior->node = node;
08548799ae4a use new UCX 3.2 cxListEmplace()
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
59 behavior->func = args.func;
08548799ae4a use new UCX 3.2 cxListEmplace()
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
60 behavior->destroy_func = args.destroy_func;
08548799ae4a use new UCX 3.2 cxListEmplace()
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
61 behavior->data = args.data;
148
9f030f402699 implement interval for behaviors - fixes #383
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
62 behavior->interval = args.interval;
9f030f402699 implement interval for behaviors - fixes #383
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
63 behavior->last_execution = 0;
109
08548799ae4a use new UCX 3.2 cxListEmplace()
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
64 return behavior;
108
d619bf7dd87b add AscBehavior - prepares resolution of issue #646
Mike Becker <universe@uap-core.de>
parents:
diff changeset
65 }
148
9f030f402699 implement interval for behaviors - fixes #383
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
66
9f030f402699 implement interval for behaviors - fixes #383
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
67 void asc_behavior_trigger(AscBehavior *behavior) {
9f030f402699 implement interval for behaviors - fixes #383
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
68 if (!behavior->enabled) return;
9f030f402699 implement interval for behaviors - fixes #383
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
69 if (behavior->last_execution + behavior->interval > asc_context.total_nanos) return;
9f030f402699 implement interval for behaviors - fixes #383
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
70
9f030f402699 implement interval for behaviors - fixes #383
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
71 behavior->func(behavior);
9f030f402699 implement interval for behaviors - fixes #383
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
72 behavior->last_execution = asc_context.total_nanos;
9f030f402699 implement interval for behaviors - fixes #383
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
73 }

mercurial