reprap: c3 update etc
[simavr] / examples / shared / libc3 / src / c3geometry.h
1 /*
2         c3geometry.h
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  * c3geometry is a structure containing one set of vertices and various
24  * bits related to it. Ultimately it contains a pre-cached projected
25  * version of the vertices that the drawing code can use directly.
26  * c3geometry is aways attached to a c3object as a parent.
27  */
28
29 #ifndef __C3GEOMETRY_H___
30 #define __C3GEOMETRY_H___
31
32 #include "c3algebra.h"
33 #include "c_utils.h"
34
35 typedef c3vec3 c3vertex, *c3vertex_p;
36 typedef c3vec4 c3colorf, *c3colorf_p;
37 typedef c3vec2 c3tex, *c3tex_p;
38
39 struct c3object_t;
40 struct c3pixels_t;
41
42 DECLARE_C_ARRAY(c3vertex, c3vertex_array, 16);
43 DECLARE_C_ARRAY(c3tex, c3tex_array, 16);
44 DECLARE_C_ARRAY(c3colorf, c3colorf_array, 16);
45
46 //! Geometry material. TODO: Beef up. Add vertex/fragment programs..
47 typedef struct c3material_t {
48         c3colorf        color;
49         struct c3pixels_t * texture;
50 //      uint32_t        texmode;
51         struct {
52                 uint32_t src, dst;
53         } blend;
54         struct {
55                 uint32_t pid;
56         } program;
57 } c3material_t;
58
59 //! Bounding box. TODO: Move to a separate file?
60 typedef struct c3bbox_t {
61         c3vec3  min, max;
62 } c3bbox_t;
63
64 //! Generic geometry type
65 enum {
66         C3_RAW_TYPE = 0,
67         C3_LINES_TYPE,
68         C3_TRIANGLE_TYPE,
69         C3_TEXTURE_TYPE,
70 };
71
72 /*!
73  * geometry type.
74  * The type is used as non-opengl description of what the geometry
75  * contains, like "texture", and the subtype can be used to store the
76  * real format of the vertices. like GL_LINES etc
77  */
78 typedef union c3geometry_type_t {
79         struct  { uint32_t type : 16, subtype : 16; };
80         uint32_t value;
81 } c3geometry_type_t;
82
83 /*!
84  * Geometry object. Describes a set of vertices, texture coordinates,
85  * normals, colors and material
86  * The projection is not set here, a geometry is always attached to a
87  * c3object that has the projection
88  */
89 typedef struct c3geometry_t {
90         c3geometry_type_t       type;   // C3_TRIANGLE_TYPE, GL_LINES etc
91         int                                     dirty : 1,
92                                                 custom : 1;             // has a custom driver
93         str_p                           name;   // optional
94         c3material_t            mat;
95         struct c3object_t * object;
96         const struct c3driver_geometry_t ** driver;
97
98         c3vertex_array_t        vertice;
99         c3tex_array_t           textures;
100         c3colorf_array_t        colorf;
101         c3vertex_array_t        normals;
102
103         // projected version of the vertice
104         c3vertex_array_t        projected;
105         c3bbox_t                        bbox;
106
107         /*
108          * Some shared attributes
109          */
110         union {
111                 struct {
112                         float width;
113                 } line;
114         };
115 } c3geometry_t, *c3geometry_p;
116
117 DECLARE_C_ARRAY(c3geometry_p, c3geometry_array, 4);
118
119 //! Allocates a new geometry, init it, and attached it to parent 'o' (optional)
120 c3geometry_p
121 c3geometry_new(
122                 c3geometry_type_t type,
123                 struct c3object_t * o /* = NULL */);
124 //! Init an existing new geometry, and attached it to parent 'o' (optional)
125 c3geometry_p
126 c3geometry_init(
127                 c3geometry_p g,
128                 c3geometry_type_t type,
129                 struct c3object_t * o /* = NULL */);
130 //! Disposes (via the driver interface) the geometry
131 void
132 c3geometry_dispose(
133                 c3geometry_p g);
134
135 //! Prepares a geometry. 
136 /*!
137  * The project phase is called only when the container object is 'dirty'
138  * for example if it's projection has changed.
139  * The project call is responsible for reprojecting the geometry and that
140  * sort of things
141  */
142 void
143 c3geometry_project(
144                 c3geometry_p g,
145                 c3mat4p m);
146
147 //! Draw the geometry
148 /*
149  * Called when drawing the context. Typicaly this calls the geometry 
150  * driver, which in turn will call the 'context' draw method, and the 
151  * application to draw this particular geometry
152  */
153 void
154 c3geometry_draw(
155                 c3geometry_p g );
156
157
158 //! allocate (if not there) and return a custom driver for this geometry
159 /*!
160  * Geometries come with a default, read only driver stack.. It is a constant
161  * global to save memory for each of the 'generic' object.
162  * This call will duplicate that stack and allocate (if not there) a read/write
163  * empty driver that the application can use to put their own, per object,
164  * callback. For example you can add your own project() or draw() function
165  * and have it called first
166  */
167 struct c3driver_geometry_t *
168 c3geometry_get_custom(
169                 c3geometry_p g );
170
171 IMPLEMENT_C_ARRAY(c3geometry_array);
172 IMPLEMENT_C_ARRAY(c3vertex_array);
173 IMPLEMENT_C_ARRAY(c3tex_array);
174 IMPLEMENT_C_ARRAY(c3colorf_array);
175
176 static inline c3geometry_type_t
177 c3geometry_type(int type, int subtype)
178 {
179         c3geometry_type_t r;// = { .type = type, .subtype = subtype }; // older gcc <4.6 doesn't like this
180         r.type = type; r.subtype = subtype;
181         return r;
182 }
183
184 #endif /* __C3GEOMETRY_H___ */