summaryrefslogtreecommitdiff
path: root/include/GLView.h
blob: 8d9d25bb1cbfd97bf031ca9fc3e46fd1211c2b4b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
/*******************************************************************************
/
/	File:		GLView.h
/
/	Copyright 1993-98, Be Incorporated, All Rights Reserved.
/
*******************************************************************************/

#ifndef BGLVIEW_H
#define BGLVIEW_H

#include <GL/gl.h>

#define BGL_RGB			0
#define BGL_INDEX		1 
#define BGL_SINGLE		0
#define BGL_DOUBLE		2
#define BGL_DIRECT		0
#define BGL_INDIRECT	4
#define BGL_ACCUM		8
#define BGL_ALPHA		16
#define BGL_DEPTH		32
#define BGL_OVERLAY		64
#define BGL_UNDERLAY	128
#define BGL_STENCIL		512

#ifdef __cplusplus


#include <AppKit.h>
#include <interface/Window.h>
#include <interface/View.h>
#include <interface/Bitmap.h>
#include <game/WindowScreen.h>
#include <game/DirectWindow.h>

class BGLView : public BView {
public:

					BGLView(BRect rect, char *name,
						ulong resizingMode, ulong mode,
						ulong options);
virtual 			~BGLView();

		void		LockGL();
		void		UnlockGL();
		void		SwapBuffers();
		void		SwapBuffers( bool vSync );
		BView *     EmbeddedView();
		status_t    CopyPixelsOut(BPoint source, BBitmap *dest);
		status_t    CopyPixelsIn(BBitmap *source, BPoint dest);
virtual	void        ErrorCallback(unsigned long errorCode); 	// Mesa's GLenum is uint where Be's ones was ulong!
		
virtual	void		Draw(BRect updateRect);

virtual void		AttachedToWindow();
virtual void        AllAttached();
virtual void        DetachedFromWindow();
virtual void        AllDetached();
 
virtual void		FrameResized(float width, float height);
virtual status_t    Perform(perform_code d, void *arg);

	/* The public methods below, for the moment,
	   are just pass-throughs to BView */

virtual status_t    Archive(BMessage *data, bool deep = true) const;

virtual void        MessageReceived(BMessage *msg);
virtual void        SetResizingMode(uint32 mode);

virtual void        Show();
virtual void        Hide();

virtual BHandler   *ResolveSpecifier(BMessage *msg, int32 index,
							BMessage *specifier, int32 form,
							const char *property);
virtual status_t    GetSupportedSuites(BMessage *data);

/* New public functions */
		void		DirectConnected( direct_buffer_info *info );
		void		EnableDirectMode( bool enabled );

		void *		getGC()	{ return m_gc; }
		
private:

virtual void        _ReservedGLView1();
virtual void        _ReservedGLView2(); 
virtual void        _ReservedGLView3(); 
virtual void        _ReservedGLView4(); 
virtual void        _ReservedGLView5(); 
virtual void        _ReservedGLView6(); 
virtual void        _ReservedGLView7(); 
virtual void        _ReservedGLView8(); 

					BGLView(const BGLView &);
					BGLView     &operator=(const BGLView &);

		void        dither_front();
		bool        confirm_dither();
		void        draw(BRect r);
		
		void *		m_gc;
		uint32		m_options;
		uint32      m_ditherCount;
		BLocker		m_drawLock;
		BLocker     m_displayLock;
		void *		m_clip_info;
		void *     	_Unused1;

		BBitmap *   m_ditherMap;
		BRect       m_bounds;
		int16 *     m_errorBuffer[2];
		uint64      _reserved[8];

	/* Direct Window stuff */
private:	
		void 		drawScanline( int x1, int x2, int y, void *data );
static 	void 		scanlineHandler(struct rasStateRec *state, GLint x1, GLint x2);

		void		lock_draw();
		void		unlock_draw();
		bool		validateView();
};



class BGLScreen : public BWindowScreen {
public:
	BGLScreen(char *name,
			ulong screenMode, ulong options,
			status_t *error, bool debug=false);
	~BGLScreen();

	void		LockGL();
	void		UnlockGL();
	void		SwapBuffers();
	virtual void        ErrorCallback(GLenum errorCode);

	virtual void		ScreenConnected(bool connected);
	virtual void		FrameResized(float width, float height);
	virtual status_t    Perform(perform_code d, void *arg);

	/* The public methods below, for the moment,
	   are just pass-throughs to BWindowScreen */

	virtual status_t    Archive(BMessage *data, bool deep = true) const;
	virtual void        MessageReceived(BMessage *msg);

	virtual void        Show();
	virtual void        Hide();

	virtual BHandler   *ResolveSpecifier(BMessage *msg,
                        int32 index,
						BMessage *specifier,
						int32 form,
						const char *property);
	virtual status_t    GetSupportedSuites(BMessage *data);

private:

	virtual void        _ReservedGLScreen1();
	virtual void        _ReservedGLScreen2();
	virtual void        _ReservedGLScreen3();
	virtual void        _ReservedGLScreen4();
	virtual void        _ReservedGLScreen5();
	virtual void        _ReservedGLScreen6();
	virtual void        _ReservedGLScreen7();
	virtual void        _ReservedGLScreen8(); 

	BGLScreen(const BGLScreen &);
	BGLScreen   &operator=(const BGLScreen &);

	void *		m_gc;
	long		m_options;
	BLocker		m_drawLock;
		
	int32		m_colorSpace;
	uint32		m_screen_mode;
		
	uint64      _reserved[7];
};

#endif	// __cplusplus

#endif	// BGLVIEW_H