1/*
2	Copyright 1999, Be Incorporated.   All Rights Reserved.
3	This file may be used under the terms of the Be Sample Code License.
4*/
5
6#include <stdio.h>
7#include <new>
8
9#include <Catalog.h>
10#include <InterfaceKit.h>
11#include <Point.h>
12#include <Rect.h>
13
14#include "TeapotWindow.h"
15
16#undef B_TRANSLATION_CONTEXT
17#define B_TRANSLATION_CONTEXT "TeapotWindow"
18
19TeapotWindow::TeapotWindow(BRect rect, const char* name, window_type wt,
20	ulong something)
21	:
22	BDirectWindow(rect, name, wt, something)
23{
24	GLenum type = BGL_RGB | BGL_DEPTH | BGL_DOUBLE;
25
26	Lock();
27	BRect bounds = Bounds();
28	bounds.bottom = bounds.top + 14;
29	BMenuBar* menuBar = new BMenuBar(bounds, "main menu");
30
31	BMenu* menu;
32	BMessage msg(kMsgAddModel);
33
34	menuBar->AddItem(menu = new BMenu(B_TRANSLATE_SYSTEM_NAME("GLTeapot")));
35	AddChild(menuBar);
36
37	menuBar->ResizeToPreferred();
38
39	bounds = Bounds();
40	bounds.top = menuBar->Bounds().bottom + 1;
41	BView *subView = new BView(bounds, "subview", B_FOLLOW_ALL, 0);
42	AddChild(subView);
43
44	bounds = subView->Bounds();
45	fObjectView = new(std::nothrow) ObjectView(bounds, "objectView",
46		B_FOLLOW_ALL_SIDES, type);
47	subView->AddChild(fObjectView);
48
49	BMenuItem*	item;
50	msg.AddInt32("num", 256);
51	menu->AddItem(item = new BMenuItem(B_TRANSLATE("Add a teapot"),
52		new BMessage(msg), 'N'));
53	item->SetTarget(fObjectView);
54	menu->AddSeparatorItem();
55	menu->AddItem(item = new BMenuItem(B_TRANSLATE("Quit"),
56		new BMessage(B_QUIT_REQUESTED), 'Q'));
57	item->SetTarget(be_app);
58	msg.RemoveName("num");
59	menuBar->AddItem(menu = new BMenu(B_TRANSLATE("Settings")));
60	menu->AddItem(item = new BMenuItem(B_TRANSLATE("Perspective"),
61		new BMessage(kMsgPerspective)));
62	item->SetTarget(fObjectView);
63	item->SetMarked(false);
64	menu->AddItem(item = new BMenuItem(B_TRANSLATE("FPS display"),
65		new BMessage(kMsgFPS)));
66	item->SetTarget(fObjectView);
67	item->SetMarked(true);
68	menu->AddItem(item = new BMenuItem(B_TRANSLATE("Filled polygons"),
69		new BMessage(kMsgFilled)));
70	item->SetTarget(fObjectView);
71	item->SetMarked(true);
72	menu->AddItem(item = new BMenuItem(B_TRANSLATE("Lighting"),
73		new BMessage(kMsgLighting)));
74	item->SetTarget(fObjectView);
75	item->SetMarked(true);
76	menu->AddItem(item = new BMenuItem(B_TRANSLATE("Backface culling"),
77		new BMessage(kMsgCulling)));
78	item->SetTarget(fObjectView);
79	item->SetMarked(true);
80	menu->AddItem(item = new BMenuItem(B_TRANSLATE("Z-buffered"),
81		new BMessage(kMsgZBuffer)));
82	item->SetTarget(fObjectView);
83	item->SetMarked(true);
84	menu->AddItem(item = new BMenuItem(B_TRANSLATE("Gouraud shading"),
85		new BMessage(kMsgGouraud)));
86	item->SetTarget(fObjectView);
87	item->SetMarked(true);
88//	menu->AddItem(item = new BMenuItem("Texture mapped", new BMessage(kMsgTextured)));
89//	item->SetTarget(fObjectView);
90	menu->AddItem(item = new BMenuItem(B_TRANSLATE("Fog"),
91		new BMessage(kMsgFog)));
92	item->SetTarget(fObjectView);
93	menu->AddSeparatorItem();
94	menu->AddItem(item = new BMenuItem(B_TRANSLATE("Limit FPS to refresh rate"),
95		new BMessage(kMsgLimitFps)));
96	item->SetTarget(fObjectView);
97	item->SetMarked(true);
98
99	BMenu *subMenu;
100	menuBar->AddItem(menu = new BMenu(B_TRANSLATE("Lights")));
101	msg.what = kMsgLights;
102
103	msg.AddInt32("num", 1);
104	menu->AddItem(item = new BMenuItem(subMenu =
105		new BMenu(B_TRANSLATE("Upper center")), NULL));
106	item->SetTarget(fObjectView);
107	msg.AddInt32("color", lightNone);
108	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Off"),
109		new BMessage(msg)));
110	item->SetTarget(fObjectView);
111	subMenu->AddSeparatorItem();
112	msg.ReplaceInt32("color", lightWhite);
113	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("White"),
114		new BMessage(msg)));
115	item->SetTarget(fObjectView);
116	item->SetMarked(true);
117	msg.ReplaceInt32("color", lightYellow);
118	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Yellow"),
119		new BMessage(msg)));
120	item->SetTarget(fObjectView);
121	msg.ReplaceInt32("color", lightBlue);
122	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Blue"),
123		new BMessage(msg)));
124	item->SetTarget(fObjectView);
125	msg.ReplaceInt32("color", lightRed);
126	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Red"),
127		new BMessage(msg)));
128	item->SetTarget(fObjectView);
129	msg.ReplaceInt32("color", lightGreen);
130	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Green"),
131		new BMessage(msg)));
132	item->SetTarget(fObjectView);
133
134	msg.RemoveName("color");
135
136	msg.ReplaceInt32("num", 2);
137	menu->AddItem(item = new BMenuItem(subMenu =
138		new BMenu(B_TRANSLATE("Lower left")), NULL));
139	item->SetTarget(fObjectView);
140	msg.AddInt32("color", lightNone);
141	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Off"),
142		new BMessage(msg)));
143	item->SetTarget(fObjectView);
144	subMenu->AddSeparatorItem();
145	msg.ReplaceInt32("color", lightWhite);
146	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("White"),
147		new BMessage(msg)));
148	item->SetTarget(fObjectView);
149	msg.ReplaceInt32("color", lightYellow);
150	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Yellow"),
151		new BMessage(msg)));
152	item->SetTarget(fObjectView);
153	msg.ReplaceInt32("color", lightBlue);
154	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Blue"),
155		new BMessage(msg)));
156	item->SetTarget(fObjectView);
157	item->SetMarked(true);
158	msg.ReplaceInt32("color", lightRed);
159	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Red"),
160		new BMessage(msg)));
161	item->SetTarget(fObjectView);
162	msg.ReplaceInt32("color", lightGreen);
163	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Green"),
164		new BMessage(msg)));
165	item->SetTarget(fObjectView);
166
167	msg.RemoveName("color");
168
169	msg.ReplaceInt32("num", 3);
170	menu->AddItem(item = new BMenuItem(subMenu =
171		new BMenu(B_TRANSLATE("Right")), NULL));
172	item->SetTarget(fObjectView);
173	msg.AddInt32("color", lightNone);
174	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Off"),
175		new BMessage(msg)));
176	item->SetTarget(fObjectView);
177	item->SetMarked(true);
178	subMenu->AddSeparatorItem();
179	msg.ReplaceInt32("color", lightWhite);
180	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("White"),
181		new BMessage(msg)));
182	item->SetTarget(fObjectView);
183	msg.ReplaceInt32("color", lightYellow);
184	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Yellow"),
185		new BMessage(msg)));
186	item->SetTarget(fObjectView);
187	msg.ReplaceInt32("color", lightBlue);
188	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Blue"),
189		new BMessage(msg)));
190	item->SetTarget(fObjectView);
191	msg.ReplaceInt32("color", lightRed);
192	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Red"),
193		new BMessage(msg)));
194	item->SetTarget(fObjectView);
195	msg.ReplaceInt32("color", lightGreen);
196	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Green"),
197		new BMessage(msg)));
198	item->SetTarget(fObjectView);
199
200	float f = menuBar->Bounds().IntegerHeight() + 1;
201	SetSizeLimits(32, 1024, 32 + f, 1024 + f);
202			//TODO: verify, adding an height to x seems strange
203	Unlock();
204}
205
206
207bool
208TeapotWindow::QuitRequested()
209{
210	if (fObjectView != NULL)
211		fObjectView->EnableDirectMode(false);
212
213	be_app->PostMessage(B_QUIT_REQUESTED);
214	return true;
215}
216
217
218void
219TeapotWindow::DirectConnected(direct_buffer_info* info)
220{
221	// TODO: Direct rendering causes the mouse to flicker due
222	// to the lack of a Hardware Cursor, however without
223	// it the teapot freezes on mouse move. (bug?)
224	#if 1
225	if (fObjectView != NULL) {
226		fObjectView->DirectConnected(info);
227		fObjectView->EnableDirectMode(true);
228	}
229	#endif
230}
231
232
233void
234TeapotWindow::MessageReceived(BMessage* msg)
235{
236//	msg->PrintToStream();
237	switch (msg->what) {
238		default:
239			BDirectWindow::MessageReceived(msg);
240	}
241}
242