c3context: Added a view draw callback
[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         c3mat4          projection;                             // projection matrix
43
44         c3geometry_array_t      projected;
45         struct {
46                 c3f min, max;
47         } z;
48 } c3context_view_t, *c3context_view_p;
49
50 DECLARE_C_ARRAY(c3context_view_t, c3context_view_array, 4);
51
52 //! c3context_t is a container for a 'scene' to be drawn
53 /*!
54  * A c3context_t holds a root object, a list of already cached projected
55  * version of the geometry, and a driver that can be customized to draw it.
56  *
57  * This is a wrapper around a "top level object", the list of projected
58  * geometries is kept, purged and resorted if the root object becomes
59  * dirty
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 #endif /* __C3CONTEXT_H___ */