93514cf264914ec8e5d89395567e4c9a77308acf
[simavr] / examples / shared / libc3 / src / c3context.h
1 /*
2         c3context.h
3
4         Copyright 2008-2012 Michel Pollet <buserror@gmail.com>
5
6         This file is part of libc3.
7
8         libc3 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         libc3 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 libc3.  If not, see <http://www.gnu.org/licenses/>.
20  */
21
22
23 #ifndef __C3CONTEXT_H___
24 #define __C3CONTEXT_H___
25
26 #include "c3algebra.h"
27 #include "c3geometry.h"
28 #include "c3pixels.h"
29 #include "c3program.h"
30 #include "c3camera.h"
31
32 enum {
33         C3_CONTEXT_VIEW_EYE = 0,
34         C3_CONTEXT_VIEW_LIGHT
35 };
36
37 typedef struct c3context_view_t {
38         int                     type : 4,       // C3_CONTEXT_VIEW_EYE...
39                                 dirty : 1;
40         c3vec2          size;                                   // in pixels. for fbo/textures/window
41         c3cam_t         cam;
42
43         c3geometry_array_t      projected;
44         struct {
45                 c3f min, max;
46         } z;
47 } c3context_view_t, *c3context_view_p;
48
49 DECLARE_C_ARRAY(c3context_view_t, c3context_view_array, 4);
50
51 //! c3context_t is a container for a 'scene' to be drawn
52 /*!
53  * A c3context_t holds a root object, a list of already cached projected
54  * version of the geometry, and a driver that can be customized to draw it.
55  *
56  * This is a wrapper around a "top level object", the list of projected
57  * geometries is kept, purged and resorted if the root object becomes
58  * dirty
59  * TODO: Add the camera/eye/arcball control there
60  */
61 typedef struct c3context_t {
62         int     current;
63         c3context_view_array_t  views;
64
65         struct c3object_t * root;       // root object
66
67         c3pixels_array_t        pixels; // pixels, textures...
68         c3program_array_t       programs;       // fragment, vertex, geometry shaders
69
70         const struct c3driver_context_t ** driver;
71 } c3context_t, *c3context_p;
72
73 //! Allocates a new context of size w=width, h=height
74 c3context_p
75 c3context_new(
76                 int w,
77                 int h);
78
79 //! Initializes a new context 'c' of size w=width, h=height
80 c3context_p
81 c3context_init(
82                 c3context_p c,
83                 int w,
84                 int h);
85
86 //! Disposes the context, and everything underneath
87 void
88 c3context_dispose(
89                 c3context_p c);
90
91 //! Reproject geometry for dirty objects
92 void
93 c3context_project(
94                 c3context_p c);
95 //! Draws the context
96 void
97 c3context_draw(
98                 c3context_p c);
99
100 IMPLEMENT_C_ARRAY(c3context_view_array);
101
102 /*
103  * Set and get the current view, this is done
104  * before projecting and drawing
105  */
106 static inline c3context_view_p
107 c3context_view_get(
108                 c3context_p c )
109 {
110         return &c->views.e[c->current];
111 }
112
113 static inline c3context_view_p
114 c3context_view_get_at(
115                 c3context_p c,
116                 int view)
117 {
118         if (view < c->views.count)
119                 return &c->views.e[view];
120         return NULL;
121 }
122
123 static inline void
124 c3context_view_set(
125                 c3context_p c,
126                 int view)
127 {
128         if (view < c->views.count)
129                 c->current = view;
130 }
131
132
133 #endif /* __C3CONTEXT_H___ */