reprap: c3 update
[simavr] / examples / board_reprap / src / c3 / c3geometry.c
1 /*
2         c3geometry.c
3
4         Copyright 2008-2012 Michel Pollet <buserror@gmail.com>
5
6         This file is part of simavr.
7
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.
12
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.
17
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/>.
20  */
21
22
23 #include "c3/c3object.h"
24 #include "c3/c3context.h"
25 #include "c3/c3driver_geometry.h"
26 #include "c3/c3driver_context.h"
27
28 static void
29 _c3geometry_dispose(
30                 c3geometry_p  g,
31                 const struct c3driver_geometry_t *d)
32 {
33         /*
34          * If we're still attached to an object, detach
35          */
36         if (g->object) {
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);
41                                 break;
42                         }
43                 g->object = NULL;
44         }
45         str_free(g->name);
46         c3vertex_array_free(&g->vertice);
47         c3vertex_array_free(&g->projected);
48         c3tex_array_free(&g->textures);
49         c3colorf_array_free(&g->colorf);
50         free(g);
51 //      C3_DRIVER_INHERITED(g, d, dispose);
52 }
53
54 static void
55 _c3geometry_prepare(
56                 c3geometry_p g,
57                 const struct c3driver_geometry_t *d)
58 {
59
60         if (g->object && g->object->context)
61                 C3_DRIVER(g->object->context, geometry_prepare, g);
62         g->dirty = 0;
63 //      C3_DRIVER_INHERITED(g, d, prepare);
64 }
65
66 static void
67 _c3geometry_draw(
68                 c3geometry_p g,
69                 const struct c3driver_geometry_t *d)
70 {
71         if (g->object && g->object->context)
72                 C3_DRIVER(g->object->context, geometry_draw, g);
73 //      C3_DRIVER_INHERITED(g, d, draw);
74 }
75
76 const  c3driver_geometry_t c3geometry_driver = {
77         .dispose = _c3geometry_dispose,
78         .prepare = _c3geometry_prepare,
79         .draw = _c3geometry_draw,
80 };
81
82 c3geometry_p
83 c3geometry_new(
84                 c3geometry_type_t type,
85                 c3object_p o /* = NULL */)
86 {
87         c3geometry_p res = malloc(sizeof(c3geometry_t));
88         return c3geometry_init(res, type, o);
89 }
90
91 c3geometry_p
92 c3geometry_init(
93                 c3geometry_p g,
94                 c3geometry_type_t type,
95                 struct c3object_t * o /* = NULL */)
96 {
97         memset(g, 0, sizeof(*g));
98         static const c3driver_geometry_t * list[] = {
99                         &c3geometry_driver, NULL,
100         };
101         g->driver = list;
102         g->type = type;
103         g->dirty = 1;
104         if (o)
105                 c3object_add_geometry(o, g);
106         return g;
107 }
108
109 c3driver_geometry_p
110 c3geometry_get_custom(
111                 c3geometry_p g )
112 {
113         if (g->custom)
114                 return (c3driver_geometry_p)g->driver[0];
115         int cnt = 0;
116         for (int di = 0; g->driver[di]; di++)
117                 cnt++;
118         c3driver_geometry_p * newd = malloc(sizeof(c3driver_geometry_p) * (cnt + 2));
119         memcpy(&newd[1], g->driver, (cnt + 1) * sizeof(c3driver_geometry_p));
120         newd[0] = malloc(sizeof(c3driver_geometry_t));
121         memset(newd[0], 0, sizeof(c3driver_geometry_t));
122         g->custom = 1;
123         g->driver = (typeof(g->driver))newd;
124         return newd[0];
125 }
126
127 void
128 c3geometry_dispose(
129                 c3geometry_p g)
130 {
131         C3_DRIVER(g, dispose);
132 }
133
134 void
135 c3geometry_prepare(
136                 c3geometry_p g )
137 {
138         if (!g->dirty)
139                 return;
140         C3_DRIVER(g, prepare);
141 }
142
143 void
144 c3geometry_draw(
145                 c3geometry_p g )
146 {
147         C3_DRIVER(g, draw);
148 }