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"
24 #include "c3/c3driver_object.h"
29 const c3driver_object_t * d)
31 for (int oi = 0; oi < o->transform.count; oi++) {
32 o->transform.e[oi]->object = NULL;
33 c3transform_dispose(o->transform.e[oi]);
35 for (int oi = 0; oi < o->geometry.count; oi++) {
36 o->geometry.e[oi]->object = NULL; // don't try to detach
37 c3geometry_dispose(o->geometry.e[oi]);
39 for (int oi = 0; oi < o->objects.count; oi++) {
40 o->objects.e[oi]->parent = NULL; // don't try to detach
41 c3object_dispose(o->objects.e[oi]);
43 c3object_array_free(&o->objects);
44 c3geometry_array_free(&o->geometry);
45 c3transform_array_free(&o->transform);
51 const c3driver_object_t * d)
54 for (int oi = 0; oi < o->parent->objects.count; oi++)
55 if (o->parent->objects.e[oi] == o) {
56 c3object_array_delete(&o->parent->objects, oi, 1);
57 c3object_set_dirty(o->parent, true);
62 //C3O_DRIVER_INHERITED(dispose, d);
67 _c3object_get_geometry(
69 const c3driver_object_t * d,
70 c3geometry_array_p out)
72 for (int oi = 0; oi < o->geometry.count; oi++)
73 c3geometry_array_add(out, o->geometry.e[oi]);
74 for (int oi = 0; oi < o->objects.count; oi++)
75 c3object_get_geometry(o->objects.e[oi], out);
81 const c3driver_object_t * d,
87 // c3mat4 identity = identity3D();
89 for (int pi = 0; pi < o->transform.count; pi++)
90 p = c3mat4_mul(&p, &o->transform.e[pi]->matrix);
91 // bool is_identity = c3mat4_equal(m, &identity);
93 for (int gi = 0; gi < o->geometry.count; gi++) {
94 c3geometry_p g = o->geometry.e[gi];
95 c3vertex_array_clear(&g->projected);
97 g->bbox.min = g->bbox.max = c3vec3f(0,0,0);
98 c3geometry_prepare(g);
100 /* 'prepare' might have done something ? */
101 if (g->vertice.count && !g->projected.count) {
102 c3vertex_array_realloc(&g->projected, g->vertice.count);
103 g->projected.count = g->vertice.count;
104 for (int vi = 0; vi < g->vertice.count; vi++) {
105 g->projected.e[vi] = c3mat4_mulv3(&p, g->vertice.e[vi]);
107 g->bbox.min = g->bbox.max = g->projected.e[vi];
109 g->bbox.max = c3vec3_min(g->bbox.min, g->projected.e[vi]);
110 g->bbox.max = c3vec3_max(g->bbox.max, g->projected.e[vi]);
115 for (int oi = 0; oi < o->objects.count; oi++)
116 c3object_project(o->objects.e[oi], &p);
120 const c3driver_object_t c3object_driver = {
121 .clear = _c3object_clear,
122 .dispose = _c3object_dispose,
123 .get_geometry = _c3object_get_geometry,
124 .project = _c3object_project,
130 c3object_p o /* = NULL */,
133 memset(o, 0, sizeof(*o));
135 static const c3driver_object_t * list[] =
136 { &c3object_driver, NULL };
139 c3object_array_add(&parent->objects, o);
140 o->context = parent->context;
147 c3object_p o /* = NULL */)
149 c3object_p res = malloc(sizeof(*o));
150 return c3object_init(res, o);
165 C3_DRIVER(o, dispose);
179 for (int oi = 0; oi < o->objects.count; oi++)
180 if (o->objects.e[oi]->dirty)
181 c3object_set_dirty(o->objects.e[oi], false);
191 if (sub->parent == o)
194 for (int oi = 0; oi < sub->parent->objects.count; oi++) {
195 if (sub->parent->objects.e[oi] == sub) {
196 c3object_array_delete(&sub->parent->objects, oi, 1);
197 c3object_set_dirty(sub->parent, true);
205 c3object_array_add(&o->objects, sub);
206 c3object_set_dirty(o, true);
211 c3object_add_geometry(
218 for (int oi = 0; oi < g->object->geometry.count; oi++) {
219 if (g->object->geometry.e[oi] == g) {
220 c3geometry_array_delete(&g->object->geometry, oi, 1);
221 c3object_set_dirty(g->object, true);
229 c3geometry_array_add(&o->geometry, g);
230 c3object_set_dirty(o, true);
235 c3object_get_geometry(
237 c3geometry_array_p array )
239 C3_DRIVER(o, get_geometry, array);
247 C3_DRIVER(o, project, m);