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