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