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("File")));
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
94	BMenu *subMenu;
95	menuBar->AddItem(menu = new BMenu(B_TRANSLATE("Lights")));
96	msg.what = kMsgLights;
97
98	msg.AddInt32("num", 1);
99	menu->AddItem(item = new BMenuItem(subMenu =
100		new BMenu(B_TRANSLATE("Upper center")), NULL));
101	item->SetTarget(fObjectView);
102	msg.AddInt32("color", lightNone);
103	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Off"),
104		new BMessage(msg)));
105	item->SetTarget(fObjectView);
106	subMenu->AddSeparatorItem();
107	msg.ReplaceInt32("color", lightWhite);
108	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("White"),
109		new BMessage(msg)));
110	item->SetTarget(fObjectView);
111	item->SetMarked(true);
112	msg.ReplaceInt32("color", lightYellow);
113	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Yellow"),
114		new BMessage(msg)));
115	item->SetTarget(fObjectView);
116	msg.ReplaceInt32("color", lightBlue);
117	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Blue"),
118		new BMessage(msg)));
119	item->SetTarget(fObjectView);
120	msg.ReplaceInt32("color", lightRed);
121	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Red"),
122		new BMessage(msg)));
123	item->SetTarget(fObjectView);
124	msg.ReplaceInt32("color", lightGreen);
125	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Green"),
126		new BMessage(msg)));
127	item->SetTarget(fObjectView);
128
129	msg.RemoveName("color");
130
131	msg.ReplaceInt32("num", 2);
132	menu->AddItem(item = new BMenuItem(subMenu =
133		new BMenu(B_TRANSLATE("Lower left")), NULL));
134	item->SetTarget(fObjectView);
135	msg.AddInt32("color", lightNone);
136	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Off"),
137		new BMessage(msg)));
138	item->SetTarget(fObjectView);
139	subMenu->AddSeparatorItem();
140	msg.ReplaceInt32("color", lightWhite);
141	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("White"),
142		new BMessage(msg)));
143	item->SetTarget(fObjectView);
144	msg.ReplaceInt32("color", lightYellow);
145	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Yellow"),
146		new BMessage(msg)));
147	item->SetTarget(fObjectView);
148	msg.ReplaceInt32("color", lightBlue);
149	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Blue"),
150		new BMessage(msg)));
151	item->SetTarget(fObjectView);
152	item->SetMarked(true);
153	msg.ReplaceInt32("color", lightRed);
154	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Red"),
155		new BMessage(msg)));
156	item->SetTarget(fObjectView);
157	msg.ReplaceInt32("color", lightGreen);
158	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Green"),
159		new BMessage(msg)));
160	item->SetTarget(fObjectView);
161
162	msg.RemoveName("color");
163
164	msg.ReplaceInt32("num", 3);
165	menu->AddItem(item = new BMenuItem(subMenu =
166		new BMenu(B_TRANSLATE("Right")), NULL));
167	item->SetTarget(fObjectView);
168	msg.AddInt32("color", lightNone);
169	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Off"),
170		new BMessage(msg)));
171	item->SetTarget(fObjectView);
172	item->SetMarked(true);
173	subMenu->AddSeparatorItem();
174	msg.ReplaceInt32("color", lightWhite);
175	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("White"),
176		new BMessage(msg)));
177	item->SetTarget(fObjectView);
178	msg.ReplaceInt32("color", lightYellow);
179	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Yellow"),
180		new BMessage(msg)));
181	item->SetTarget(fObjectView);
182	msg.ReplaceInt32("color", lightBlue);
183	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Blue"),
184		new BMessage(msg)));
185	item->SetTarget(fObjectView);
186	msg.ReplaceInt32("color", lightRed);
187	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Red"),
188		new BMessage(msg)));
189	item->SetTarget(fObjectView);
190	msg.ReplaceInt32("color", lightGreen);
191	subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Green"),
192		new BMessage(msg)));
193	item->SetTarget(fObjectView);
194
195	float f = menuBar->Bounds().IntegerHeight() + 1;
196	SetSizeLimits(32, 1024, 32 + f, 1024 + f);
197			//TODO: verify, adding an height to x seems strange
198	Unlock();
199}
200
201
202bool
203TeapotWindow::QuitRequested()
204{
205	if (fObjectView != NULL)
206		fObjectView->EnableDirectMode(false);
207
208	be_app->PostMessage(B_QUIT_REQUESTED);
209	return true;
210}
211
212
213void
214TeapotWindow::DirectConnected(direct_buffer_info* info)
215{
216	// TODO: Direct rendering causes the mouse to flicker due
217	// to the lack of a Hardware Cursor, however without
218	// it the teapot freezes on mouse move. (bug?)
219	#if 1
220	if (fObjectView != NULL) {
221		fObjectView->DirectConnected(info);
222		fObjectView->EnableDirectMode(true);
223	}
224	#endif
225}
226
227
228void
229TeapotWindow::MessageReceived(BMessage* msg)
230{
231//	msg->PrintToStream();
232	switch (msg->what) {
233		default:
234			BDirectWindow::MessageReceived(msg);
235	}
236}
237