4 Copyright 2008-2012 Michel Pollet <buserror@gmail.com>
6 This file is part of simavr.
8 simavr is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 simavr is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with simavr. If not, see <http://www.gnu.org/licenses/>.
23 #include "c3/c3object.h"
29 c3object_p o = d->object;
30 for (int oi = 0; oi < o->transform.count; oi++) {
31 o->transform.e[oi]->object = NULL;
32 c3transform_dispose(o->transform.e[oi]);
34 for (int oi = 0; oi < o->geometry.count; oi++) {
35 o->geometry.e[oi]->object = NULL; // don't try to detach
36 c3geometry_dispose(o->geometry.e[oi]);
38 for (int oi = 0; oi < o->objects.count; oi++) {
39 o->objects.e[oi]->parent = NULL; // don't try to detach
40 c3object_dispose(o->objects.e[oi]);
42 c3object_array_free(&o->objects);
43 c3geometry_array_free(&o->geometry);
44 c3transform_array_free(&o->transform);
51 c3object_p o = d->object;
53 for (int oi = 0; oi < o->parent->objects.count; oi++)
54 if (o->parent->objects.e[oi] == o) {
55 c3object_array_delete(&o->parent->objects, oi, 1);
56 c3object_set_dirty(o->parent, true);
61 //C3O_DRIVER_INHERITED(dispose, d);
63 * free the driver chain
65 c3object_driver_p driver = o->driver;
67 c3object_driver_p n = driver->next;
75 _c3object_get_geometry(
77 c3geometry_array_p out)
79 c3object_p o = d->object;
80 for (int oi = 0; oi < o->geometry.count; oi++)
81 c3geometry_array_add(out, o->geometry.e[oi]);
82 for (int oi = 0; oi < o->objects.count; oi++)
83 c3object_get_geometry(o->objects.e[oi], out);
91 c3object_p o = d->object;
95 c3mat4 identity = identity3D();
97 for (int pi = 0; pi < o->transform.count; pi++)
98 p = c3mat4_mul(&p, &o->transform.e[pi]->matrix);
99 bool is_identity = c3mat4_equal(m, &identity);
101 for (int gi = 0; gi < o->geometry.count; gi++) {
102 c3geometry_p g = o->geometry.e[gi];
103 c3vertex_array_clear(&g->projected);
105 c3vertex_array_realloc(&g->projected, g->vertice.count);
106 g->projected.count = g->vertice.count;
107 for (int vi = 0; vi < g->vertice.count; vi++)
108 g->projected.e[vi] = c3mat4_mulv3(&p, g->vertice.e[vi]);
111 for (int oi = 0; oi < o->objects.count; oi++)
112 c3object_project(o->objects.e[oi], &p);
116 const c3object_driver_t c3object_base_driver = {
117 .clear = _c3object_clear,
118 .dispose = _c3object_dispose,
119 .get_geometry = _c3object_get_geometry,
120 .project = _c3object_project,
125 c3object_p o /* = NULL */,
128 memset(o, 0, sizeof(*o));
130 o->driver = malloc(sizeof(c3object_driver_t));
131 *o->driver = c3object_base_driver;
132 o->driver->object = o;
134 c3object_array_add(&parent->objects, o);
140 c3object_p o /* = NULL */)
142 c3object_p res = malloc(sizeof(*o));
143 return c3object_init(res, o);
150 C3O_DRIVER(o, clear);
158 C3O_DRIVER(o, dispose);
172 for (int oi = 0; oi < o->objects.count; oi++)
173 if (o->objects.e[oi]->dirty)
174 c3object_set_dirty(o->objects.e[oi], false);
184 if (sub->parent == o)
187 for (int oi = 0; oi < sub->parent->objects.count; oi++) {
188 if (sub->parent->objects.e[oi] == sub) {
189 c3object_array_delete(&sub->parent->objects, oi, 1);
190 c3object_set_dirty(sub->parent, true);
198 c3object_array_add(&o->objects, sub);
199 c3object_set_dirty(o, true);
204 c3object_add_geometry(
211 for (int oi = 0; oi < g->object->geometry.count; oi++) {
212 if (g->object->geometry.e[oi] == g) {
213 c3geometry_array_delete(&g->object->geometry, oi, 1);
214 c3object_set_dirty(g->object, true);
222 c3geometry_array_add(&o->geometry, g);
223 c3object_set_dirty(o, true);
228 c3object_get_geometry(
230 c3geometry_array_p array )
232 C3O_DRIVER(o, get_geometry, array);
240 C3O_DRIVER(o, project, m);