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/>.
24 #include "c3context.h"
25 #include "c3driver_geometry.h"
26 #include "c3driver_context.h"
31 const struct c3driver_geometry_t *d)
34 * If we're still attached to an object, detach
37 for (int oi = 0; oi < g->object->geometry.count; oi++)
38 if (g->object->geometry.e[oi] == g) {
39 c3geometry_array_delete(&g->object->geometry, oi, 1);
40 c3object_set_dirty(g->object, true);
46 c3vertex_array_free(&g->vertice);
47 c3vertex_array_free(&g->projected);
48 c3tex_array_free(&g->textures);
49 c3colorf_array_free(&g->colorf);
51 // C3_DRIVER_INHERITED(g, d, dispose);
57 const struct c3driver_geometry_t *d,
60 if (g->vertice.count) {
61 c3vertex_array_realloc(&g->projected, g->vertice.count);
62 g->projected.count = g->vertice.count;
63 for (int vi = 0; vi < g->vertice.count; vi++) {
64 g->projected.e[vi] = c3mat4_mulv3(m, g->vertice.e[vi]);
66 g->bbox.min = g->bbox.max = g->projected.e[vi];
68 g->bbox.max = c3vec3_min(g->bbox.min, g->projected.e[vi]);
69 g->bbox.max = c3vec3_max(g->bbox.max, g->projected.e[vi]);
74 if (g->object && g->object->context)
75 C3_DRIVER(g->object->context, geometry_project, g, m);
77 // C3_DRIVER_INHERITED(g, d, project);
83 const struct c3driver_geometry_t *d)
85 if (g->object && g->object->context)
86 C3_DRIVER(g->object->context, geometry_draw, g);
87 // C3_DRIVER_INHERITED(g, d, draw);
90 const c3driver_geometry_t c3geometry_driver = {
91 .dispose = _c3geometry_dispose,
92 .project = _c3geometry_project,
93 .draw = _c3geometry_draw,
98 c3geometry_type_t type,
99 c3object_p o /* = NULL */)
101 c3geometry_p res = malloc(sizeof(c3geometry_t));
102 return c3geometry_init(res, type, o);
108 c3geometry_type_t type,
109 struct c3object_t * o /* = NULL */)
111 memset(g, 0, sizeof(*g));
112 static const c3driver_geometry_t * list[] = {
113 &c3geometry_driver, NULL,
119 c3object_add_geometry(o, g);
124 c3geometry_get_custom(
128 return (c3driver_geometry_p)g->driver[0];
130 for (int di = 0; g->driver[di]; di++)
132 c3driver_geometry_p * newd = malloc(sizeof(c3driver_geometry_p) * (cnt + 2));
133 memcpy(&newd[1], g->driver, (cnt + 1) * sizeof(c3driver_geometry_p));
134 newd[0] = malloc(sizeof(c3driver_geometry_t));
135 memset(newd[0], 0, sizeof(c3driver_geometry_t));
137 g->driver = (typeof(g->driver))newd;
145 C3_DRIVER(g, dispose);
155 C3_DRIVER(g, project, m);