xref: /haiku/src/apps/glteapot/TeapotWindow.cpp (revision cb9c3e9cede30851ba29be2e955fb8cfcecef7ac)
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 <InterfaceKit.h>
8 #include <Rect.h>
9 #include <Point.h>
10 #include <new>
11 
12 #include "TeapotWindow.h"
13 
14 TeapotWindow::TeapotWindow(BRect rect, const char* name, window_type wt,
15 	ulong something)
16 	:
17 	BDirectWindow(rect, name, wt, something)
18 {
19 	GLenum type = BGL_RGB | BGL_DEPTH | BGL_DOUBLE;
20 
21 	Lock();
22 	BRect bounds = Bounds();
23 	bounds.bottom = bounds.top + 14;
24 	BMenuBar* menuBar = new BMenuBar(bounds, "main menu");
25 
26 	BMenu* menu;
27 	BMessage msg(kMsgAddModel);
28 
29 	menuBar->AddItem(menu = new BMenu("File"));
30 	AddChild(menuBar);
31 
32 	menuBar->ResizeToPreferred();
33 
34 	bounds = Bounds();
35 	bounds.top = menuBar->Bounds().bottom + 1;
36 	BView *subView = new BView(bounds, "subview", B_FOLLOW_ALL, 0);
37 	AddChild(subView);
38 
39 	bounds = subView->Bounds();
40 	fObjectView = new(std::nothrow) ObjectView(bounds, "objectView", B_FOLLOW_ALL_SIDES, type);
41 	subView->AddChild(fObjectView);
42 
43 	BMenuItem*	item;
44 	msg.AddInt32("num", 256);
45 	menu->AddItem(item = new BMenuItem("Add a teapot", new BMessage(msg), 'N'));
46 	item->SetTarget(fObjectView);
47 	menu->AddSeparatorItem();
48 	menu->AddItem(item = new BMenuItem("Quit", new BMessage(B_QUIT_REQUESTED), 'Q'));
49 	item->SetTarget(be_app);
50 	msg.RemoveName("num");
51 	menuBar->AddItem(menu = new BMenu("Options"));
52 	menu->AddItem(item = new BMenuItem("Perspective", new BMessage(kMsgPerspective)));
53 	item->SetTarget(fObjectView);
54 	item->SetMarked(false);
55 	menu->AddItem(item = new BMenuItem("FPS display", new BMessage(kMsgFPS)));
56 	item->SetTarget(fObjectView);
57 	item->SetMarked(true);
58 	menu->AddItem(item = new BMenuItem("Filled polygons", new BMessage(kMsgFilled)));
59 	item->SetTarget(fObjectView);
60 	item->SetMarked(true);
61 	menu->AddItem(item = new BMenuItem("Lighting", new BMessage(kMsgLighting)));
62 	item->SetTarget(fObjectView);
63 	item->SetMarked(true);
64 	menu->AddItem(item = new BMenuItem("Backface culling", new BMessage(kMsgCulling)));
65 	item->SetTarget(fObjectView);
66 	item->SetMarked(true);
67 	menu->AddItem(item = new BMenuItem("Z-buffered", new BMessage(kMsgZBuffer)));
68 	item->SetTarget(fObjectView);
69 	item->SetMarked(true);
70 	menu->AddItem(item = new BMenuItem("Gouraud shading", new BMessage(kMsgGouraud)));
71 	item->SetTarget(fObjectView);
72 	item->SetMarked(true);
73 //	menu->AddItem(item = new BMenuItem("Texture mapped", new BMessage(kMsgTextured)));
74 //	item->SetTarget(fObjectView);
75 	menu->AddItem(item = new BMenuItem("Fog", new BMessage(kMsgFog)));
76 	item->SetTarget(fObjectView);
77 
78 	BMenu *subMenu;
79 	menuBar->AddItem(menu = new BMenu("Lights"));
80 	msg.what = kMsgLights;
81 
82 	msg.AddInt32("num", 1);
83 	menu->AddItem(item = new BMenuItem(subMenu = new BMenu("Upper center"), NULL));
84 	item->SetTarget(fObjectView);
85 	msg.AddInt32("color", lightNone);
86 	subMenu->AddItem(item = new BMenuItem("Off", new BMessage(msg)));
87 	item->SetTarget(fObjectView);
88 	subMenu->AddSeparatorItem();
89 	msg.ReplaceInt32("color", lightWhite);
90 	subMenu->AddItem(item = new BMenuItem("White", new BMessage(msg)));
91 	item->SetTarget(fObjectView);
92 	item->SetMarked(true);
93 	msg.ReplaceInt32("color", lightYellow);
94 	subMenu->AddItem(item = new BMenuItem("Yellow", new BMessage(msg)));
95 	item->SetTarget(fObjectView);
96 	msg.ReplaceInt32("color", lightBlue);
97 	subMenu->AddItem(item = new BMenuItem("Blue", new BMessage(msg)));
98 	item->SetTarget(fObjectView);
99 	msg.ReplaceInt32("color", lightRed);
100 	subMenu->AddItem(item = new BMenuItem("Red", new BMessage(msg)));
101 	item->SetTarget(fObjectView);
102 	msg.ReplaceInt32("color", lightGreen);
103 	subMenu->AddItem(item = new BMenuItem("Green", new BMessage(msg)));
104 	item->SetTarget(fObjectView);
105 
106 	msg.RemoveName("color");
107 
108 	msg.ReplaceInt32("num", 2);
109 	menu->AddItem(item = new BMenuItem(subMenu = new BMenu("Lower left"), NULL));
110 	item->SetTarget(fObjectView);
111 	msg.AddInt32("color", lightNone);
112 	subMenu->AddItem(item = new BMenuItem("Off", new BMessage(msg)));
113 	item->SetTarget(fObjectView);
114 	subMenu->AddSeparatorItem();
115 	msg.ReplaceInt32("color", lightWhite);
116 	subMenu->AddItem(item = new BMenuItem("White", new BMessage(msg)));
117 	item->SetTarget(fObjectView);
118 	msg.ReplaceInt32("color", lightYellow);
119 	subMenu->AddItem(item = new BMenuItem("Yellow", new BMessage(msg)));
120 	item->SetTarget(fObjectView);
121 	msg.ReplaceInt32("color", lightBlue);
122 	subMenu->AddItem(item = new BMenuItem("Blue", new BMessage(msg)));
123 	item->SetTarget(fObjectView);
124 	item->SetMarked(true);
125 	msg.ReplaceInt32("color", lightRed);
126 	subMenu->AddItem(item = new BMenuItem("Red", new BMessage(msg)));
127 	item->SetTarget(fObjectView);
128 	msg.ReplaceInt32("color", lightGreen);
129 	subMenu->AddItem(item = new BMenuItem("Green", new BMessage(msg)));
130 	item->SetTarget(fObjectView);
131 
132 	msg.RemoveName("color");
133 
134 	msg.ReplaceInt32("num", 3);
135 	menu->AddItem(item = new BMenuItem(subMenu = new BMenu("Right"), NULL));
136 	item->SetTarget(fObjectView);
137 	msg.AddInt32("color", lightNone);
138 	subMenu->AddItem(item = new BMenuItem("Off", new BMessage(msg)));
139 	item->SetTarget(fObjectView);
140 	item->SetMarked(true);
141 	subMenu->AddSeparatorItem();
142 	msg.ReplaceInt32("color", lightWhite);
143 	subMenu->AddItem(item = new BMenuItem("White", new BMessage(msg)));
144 	item->SetTarget(fObjectView);
145 	msg.ReplaceInt32("color", lightYellow);
146 	subMenu->AddItem(item = new BMenuItem("Yellow", new BMessage(msg)));
147 	item->SetTarget(fObjectView);
148 	msg.ReplaceInt32("color", lightBlue);
149 	subMenu->AddItem(item = new BMenuItem("Blue", new BMessage(msg)));
150 	item->SetTarget(fObjectView);
151 	msg.ReplaceInt32("color", lightRed);
152 	subMenu->AddItem(item = new BMenuItem("Red", new BMessage(msg)));
153 	item->SetTarget(fObjectView);
154 	msg.ReplaceInt32("color", lightGreen);
155 	subMenu->AddItem(item = new BMenuItem("Green", new BMessage(msg)));
156 	item->SetTarget(fObjectView);
157 
158 	float f = menuBar->Bounds().IntegerHeight() + 1;
159 	SetSizeLimits(32, 1024, 32 + f, 1024 + f);
160 			//TODO: verify, adding an height to x seems strange
161 	Unlock();
162 }
163 
164 
165 bool
166 TeapotWindow::QuitRequested()
167 {
168 	if (fObjectView != NULL)
169 		fObjectView->EnableDirectMode(false);
170 
171 	be_app->PostMessage(B_QUIT_REQUESTED);
172 	return true;
173 }
174 
175 
176 void
177 TeapotWindow::DirectConnected(direct_buffer_info* info)
178 {
179 	if (fObjectView != NULL) {
180 		fObjectView->DirectConnected(info);
181 		fObjectView->EnableDirectMode(true);
182 	}
183 }
184 
185 
186 void
187 TeapotWindow::MessageReceived(BMessage* msg)
188 {
189 //	msg->PrintToStream();
190 	switch (msg->what) {
191 		default:
192 			BDirectWindow::MessageReceived(msg);
193 	}
194 }
195