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 * 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.
29 #ifndef __C3GEOMETRY_H___
30 #define __C3GEOMETRY_H___
32 #include "c3algebra.h"
35 typedef c3vec3 c3vertex, *c3vertex_p;
36 typedef c3vec4 c3colorf, *c3colorf_p;
37 typedef c3vec2 c3tex, *c3tex_p;
43 DECLARE_C_ARRAY(c3vertex, c3vertex_array, 16, uint32_t bid);
44 DECLARE_C_ARRAY(c3tex, c3tex_array, 16, uint32_t bid);
45 DECLARE_C_ARRAY(c3colorf, c3colorf_array, 16, uint32_t bid);
47 //! Geometry material. TODO: Beef up. Add vertex/fragment programs..
48 typedef struct c3material_t {
50 struct c3pixels_t * texture;
51 struct c3program_t * program;
57 //! Bounding box. TODO: Move to a separate file?
58 typedef struct c3bbox_t {
62 //! Generic geometry type
72 * The type is used as non-opengl description of what the geometry
73 * contains, like "texture", and the subtype can be used to store the
74 * real format of the vertices. like GL_LINES etc
76 typedef union c3geometry_type_t {
77 struct { uint32_t type : 16, subtype : 16; };
82 * Geometry object. Describes a set of vertices, texture coordinates,
83 * normals, colors and material
84 * The projection is not set here, a geometry is always attached to a
85 * c3object that has the projection
87 typedef struct c3geometry_t {
88 c3geometry_type_t type; // C3_TRIANGLE_TYPE, GL_LINES etc
90 custom : 1; // has a custom driver
91 str_p name; // optional
93 struct c3object_t * object;
94 const struct c3driver_geometry_t ** driver;
96 c3vertex_array_t vertice;
97 c3tex_array_t textures;
98 c3colorf_array_t colorf;
99 c3vertex_array_t normals;
101 // projected version of the vertice
102 c3vertex_array_t projected;
106 * Some shared attributes
113 } c3geometry_t, *c3geometry_p;
115 DECLARE_C_ARRAY(c3geometry_p, c3geometry_array, 4);
117 //! Allocates a new geometry, init it, and attached it to parent 'o' (optional)
120 c3geometry_type_t type,
121 struct c3object_t * o /* = NULL */);
122 //! Init an existing new geometry, and attached it to parent 'o' (optional)
126 c3geometry_type_t type,
127 struct c3object_t * o /* = NULL */);
128 //! Disposes (via the driver interface) the geometry
133 //! Prepares a geometry.
135 * The project phase is called only when the container object is 'dirty'
136 * for example if it's projection has changed.
137 * The project call is responsible for reprojecting the geometry and that
145 //! Draw the geometry
147 * Called when drawing the context. Typicaly this calls the geometry
148 * driver, which in turn will call the 'context' draw method, and the
149 * application to draw this particular geometry
156 //! allocate (if not there) and return a custom driver for this geometry
158 * Geometries come with a default, read only driver stack.. It is a constant
159 * global to save memory for each of the 'generic' object.
160 * This call will duplicate that stack and allocate (if not there) a read/write
161 * empty driver that the application can use to put their own, per object,
162 * callback. For example you can add your own project() or draw() function
163 * and have it called first
165 struct c3driver_geometry_t *
166 c3geometry_get_custom(
169 IMPLEMENT_C_ARRAY(c3geometry_array);
170 IMPLEMENT_C_ARRAY(c3vertex_array);
171 IMPLEMENT_C_ARRAY(c3tex_array);
172 IMPLEMENT_C_ARRAY(c3colorf_array);
174 static inline c3geometry_type_t
175 c3geometry_type(int type, int subtype)
177 c3geometry_type_t r;// = { .type = type, .subtype = subtype }; // older gcc <4.6 doesn't like this
178 r.type = type; r.subtype = subtype;
182 #endif /* __C3GEOMETRY_H___ */