Panda3D
showBase.cxx
Go to the documentation of this file.
1 /**
2  * PANDA 3D SOFTWARE
3  * Copyright (c) Carnegie Mellon University. All rights reserved.
4  *
5  * All use of this software is subject to the terms of the revised BSD
6  * license. You should have received a copy of this license along
7  * with this source code in a file named "LICENSE."
8  *
9  * @file showBase.cxx
10  * @author shochet
11  * @date 2000-02-02
12  */
13 
14 #ifdef __APPLE__
15 // We have to include this before we include any Panda libraries, because one
16 // of the things we pick up in Panda defines a macro for TCP_NODELAY and
17 // friends, causing heartaches for the header files picked up here.
18 #include <Carbon/Carbon.h>
19 extern "C" { void CPSEnableForegroundOperation(ProcessSerialNumber* psn); }
20 #endif
21 
22 #include "showBase.h"
23 
24 #include "throw_event.h"
25 #include "graphicsWindow.h"
26 #include "renderBuffer.h"
27 #include "camera.h"
28 #include "graphicsPipeSelection.h"
29 
30 #ifdef WIN32
31 #include <windows.h> // For SystemParametersInfo()
32 STICKYKEYS g_StartupStickyKeys = {sizeof(STICKYKEYS), 0};
33 TOGGLEKEYS g_StartupToggleKeys = {sizeof(TOGGLEKEYS), 0};
34 FILTERKEYS g_StartupFilterKeys = {sizeof(FILTERKEYS), 0};
35 #endif
36 
37 using std::max;
38 using std::min;
39 
40 #if !defined(CPPPARSER) && !defined(LINK_ALL_STATIC) && !defined(BUILDING_DIRECT_SHOWBASE)
41  #error Buildsystem error: BUILDING_DIRECT_SHOWBASE not defined
42 #endif
43 
44 ConfigureDef(config_showbase);
45 ConfigureFn(config_showbase) {
46 }
47 
48 ConfigVariableSearchPath particle_path
49 ("particle-path",
50  PRC_DESC("The directories to search for particle files to be loaded."));
51 
53 get_particle_path() {
54  return particle_path;
55 }
56 
57 // Throw the "NewFrame" event in the C++ world. Some of the lerp code depends
58 // on receiving this.
59 void
60 throw_new_frame() {
61  throw_event("NewFrame");
62 }
63 
64 // Initialize the application for making a Gui-based app, such as wx. At the
65 // moment, this is a no-op except on Mac.
66 void
67 init_app_for_gui() {
68 #ifdef IS_OSX
69  // Rudely bring the application to the foreground. This is particularly
70  // important when running wx via the plugin, since the plugin app is seen as
71  // separate from the browser app, even though the user sees them as the same
72  // thing. We need to bring the plugin app to the foreground to make its wx
73  // windows visible.
74  activate_osx_application();
75 #endif
76 
77  // We don't appear need to do the following, however, if we launch the
78  // plugin correctly from its own bundle.
79  /*
80  static bool initted_for_gui = false;
81  if (!initted_for_gui) {
82  initted_for_gui = true;
83 #ifdef IS_OSX
84  ProcessSerialNumber psn;
85 
86  GetCurrentProcess(&psn);
87  CPSEnableForegroundOperation(&psn);
88  SetFrontProcess(&psn);
89 #endif // IS_OSX
90  }
91  */
92 }
93 
94 // klunky interface since we cant pass array from python->C++ to use
95 // verify_window_sizes directly
96 static int num_fullscreen_testsizes = 0;
97 #define MAX_FULLSCREEN_TESTS 10
98 static int fullscreen_testsizes[MAX_FULLSCREEN_TESTS * 2];
99 
100 void
101 add_fullscreen_testsize(int xsize, int ysize) {
102  if ((xsize == 0) && (ysize == 0)) {
103  num_fullscreen_testsizes = 0;
104  return;
105  }
106 
107  // silently fail if maxtests exceeded
108  if (num_fullscreen_testsizes < MAX_FULLSCREEN_TESTS) {
109  fullscreen_testsizes[num_fullscreen_testsizes * 2] = xsize;
110  fullscreen_testsizes[num_fullscreen_testsizes * 2 + 1] = ysize;
111  num_fullscreen_testsizes++;
112  }
113 }
114 
115 void
116 runtest_fullscreen_sizes(GraphicsWindow *win) {
117  win->verify_window_sizes(num_fullscreen_testsizes, fullscreen_testsizes);
118 }
119 
120 bool
121 query_fullscreen_testresult(int xsize, int ysize) {
122  // stupid linear search that works ok as long as total tests are small
123  int i;
124  for (i=0; i < num_fullscreen_testsizes; i++) {
125  if((fullscreen_testsizes[i * 2] == xsize) &&
126  (fullscreen_testsizes[i * 2 + 1] == ysize))
127  return true;
128  }
129  return false;
130 }
131 
132 void
133 store_accessibility_shortcut_keys() {
134 #ifdef WIN32
135  SystemParametersInfo(SPI_GETSTICKYKEYS, sizeof(STICKYKEYS), &g_StartupStickyKeys, 0);
136  SystemParametersInfo(SPI_GETTOGGLEKEYS, sizeof(TOGGLEKEYS), &g_StartupToggleKeys, 0);
137  SystemParametersInfo(SPI_GETFILTERKEYS, sizeof(FILTERKEYS), &g_StartupFilterKeys, 0);
138 #endif
139 }
140 
141 void
142 allow_accessibility_shortcut_keys(bool allowKeys) {
143 #ifdef WIN32
144  if( allowKeys )
145  {
146  // Restore StickyKeysetc to original state and enable Windows key
147  SystemParametersInfo(SPI_SETSTICKYKEYS, sizeof(STICKYKEYS), &g_StartupStickyKeys, 0);
148  SystemParametersInfo(SPI_SETTOGGLEKEYS, sizeof(TOGGLEKEYS), &g_StartupToggleKeys, 0);
149  SystemParametersInfo(SPI_SETFILTERKEYS, sizeof(FILTERKEYS), &g_StartupFilterKeys, 0);
150  } else {
151  // Disable StickyKeysetc shortcuts but if the accessibility feature is on,
152  // then leave the settings alone as its probably being usefully used
153 
154  STICKYKEYS skOff = g_StartupStickyKeys;
155  if( (skOff.dwFlags & SKF_STICKYKEYSON) == 0 )
156  {
157  // Disable the hotkey and the confirmation
158  skOff.dwFlags &= ~SKF_HOTKEYACTIVE;
159  skOff.dwFlags &= ~SKF_CONFIRMHOTKEY;
160 
161  SystemParametersInfo(SPI_SETSTICKYKEYS, sizeof(STICKYKEYS), &skOff, 0);
162  }
163 
164  TOGGLEKEYS tkOff = g_StartupToggleKeys;
165  if( (tkOff.dwFlags & TKF_TOGGLEKEYSON) == 0 )
166  {
167  // Disable the hotkey and the confirmation
168  tkOff.dwFlags &= ~TKF_HOTKEYACTIVE;
169  tkOff.dwFlags &= ~TKF_CONFIRMHOTKEY;
170 
171  SystemParametersInfo(SPI_SETTOGGLEKEYS, sizeof(TOGGLEKEYS), &tkOff, 0);
172  }
173 
174  FILTERKEYS fkOff = g_StartupFilterKeys;
175  if( (fkOff.dwFlags & FKF_FILTERKEYSON) == 0 )
176  {
177  // Disable the hotkey and the confirmation
178  fkOff.dwFlags &= ~FKF_HOTKEYACTIVE;
179  fkOff.dwFlags &= ~FKF_CONFIRMHOTKEY;
180 
181  SystemParametersInfo(SPI_SETFILTERKEYS, sizeof(FILTERKEYS), &fkOff, 0);
182  }
183  }
184 #endif
185 }
186 
187 #if 0
188 int TempGridZoneManager::
189 add_grid_zone(unsigned int x,
190  unsigned int y,
191  unsigned int width,
192  unsigned int height,
193  unsigned int zoneBase,
194  unsigned int xZoneResolution,
195  unsigned int yZoneResolution) {
196  // zoneBase is the first zone in the grid (e.g. the upper left)
197  // zoneResolution is the number of cells on each axsis. returns the next
198  // available zoneBase (i.e. zoneBase+xZoneResolution*yZoneResolution)
199  std::cerr<<"adding grid zone with a zoneBase of "<<zoneBase<<" and a zoneResolution of "<<zoneResolution;
200  _grids.append(TempGridZoneManager::GridZone(x, y, width, height, zoneBase, xZoneResolution, yZoneResolution));
201  return zoneBase+xZoneResolution*yZoneResolution;
202 }
203 
204 void TempGridZoneManager::GridZone
205 GridZone(unsigned int x,
206  unsigned int y,
207  unsigned int width,
208  unsigned int height,
209  unsigned int zoneBase,
210  unsigned int xZoneResolution,
211  unsigned int yZoneResolution) {
212  _x=x;
213  _y=y;
214  _width=width;
215  _height=heigth;
216  _zoneBase=zoneBase;
217  _xZoneResolution=xZoneResolution;
218  _yZoneResolution=yZoneResolution;
219 
220  // The cellVis is the number of cells radius that can be seen, including the
221  // center cell. So, for a 5 x 5 visible area, the cellVis is 3.
222  const float cellVis=3.0;
223  unsigned int xMargine=(unsigned int)((float)width/(float)xZoneResolution*cellVis+0.5);
224  unsigned int yMargine=(unsigned int)((float)height/(float)yZoneResolution*cellVis+0.5);
225  _xMinVis=x-xMargine;
226  _yMinVis=y-yMargine;
227  _xMaxVis=x+width+xMargine;
228  _yMaxVis=y+height+yMargine;
229 }
230 
231 void TempGridZoneManager::
232 get_grids(int x, int y) {
233  TempGridZoneManager::ZoneSet canSee;
234  TempGridZoneManager::GridSet::const_iterator i=_grids.begin();
235  for (; i!=_grids.end(); ++i) {
236  if (x >= i._xMinVis && x < i._xMaxVis && y >= i._yMinVis && y < i._yMaxVis) {
237  add_to_zone_list(i, x, y, canSee);
238  }
239  }
240 }
241 
242 void TempGridZoneManager::
243 add_to_zone_list(const TempGridZoneManager::GridZone &gridZone,
244  unsigned int x,
245  unsigned int y,
246  TempGridZoneManager::ZoneSet &zoneSet) {
247  unsigned int xRes=gridZone._xZoneResolution;
248  unsigned int yRes=gridZone._yZoneResolution;
249  float xP=((float)(x-gridZone._x))/gridZone._width;
250  float yP=((float)(y-gridZone._y))/gridZone._height;
251  int xCell=(int)(xP*xRes);
252  int yCell=(int)(yP*yRes);
253 
254  // range is how many cells can be seen in each direction:
255  const int range=2;
256  int yBegin=max(0, yCell-range);
257  int yEnd=min(yRes, yCell+range);
258  int xBegin=max(0, xCell-range);
259  int xEnd=min(xRes, xCell+range);
260  unsigned int zone=gridZone._zoneBase+yBegin*xRes+xBegin;
261 
262  for (yCell=yBegin; yCell < yEnd; ++yCell) {
263  for (xCell=xBegin; xCell < xEnd; ++xCell) {
264  zoneSet.append(zone+xCell);
265  }
266  zone+=xRes;
267  }
268 }
269 
270 int TempGridZoneManager::
271 get_zone_list(int x, int y, int resolution) {
272  // x is a float in the range 0.0 to 1.0 y is a float in the range 0.0 to 1.0
273  // resolution is the number of cells on each axsis. returns a list of zone
274  // ids. Create a box of cell numbers, while clipping to the edges of the
275  // set of cells.
276  if (x < 0.0 || x > 1.0 || y < 0.0 || y > 1.0) {
277  return 0;
278  }
279  std::cerr<<"resolution="<<resolution;
280  xCell=min(int(x*resolution), resolution-1)
281  yCell=min(int(y*resolution), resolution-1)
282  cell=yCell*resolution+xCell
283  print "cell", cell,
284  zone=zoneBase+cell
285  print "zone", zone
286 
287  zone=zone-2*resolution
288  endZone=zone+5*resolution
289  yCell=yCell-2
290  while zone < endZone:
291  if yCell >= 0 and yCell < resolution:
292  if xCell > 1:
293  zoneList.append(zone-2)
294  zoneList.append(zone-1)
295  elif xCell > 0:
296  zoneList.append(zone-1)
297  r.append(zone)
298  if xCell < resolution-2:
299  zoneList.append(zone+1)
300  zoneList.append(zone+2)
301  elif xCell < resolution-1:
302  zoneList.append(zone+1)
303  yCell+=1
304  zone+=resolution
305  return zoneList
306  return 5;
307 }
308 #endif
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
This is similar to a ConfigVariableList, but it returns its list as a DSearchPath,...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
A window, fullscreen or on a desktop, into which a graphics device sends its output for interactive d...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
virtual int verify_window_sizes(int numsizes, int *dimen)
Determines which of the indicated window sizes are supported by available hardware (e....
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.