mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-01-20 20:54:46 +00:00
538 lines
15 KiB
C++
538 lines
15 KiB
C++
//-----------------------------------------------------------------------------
|
|
// Copyright (c) 2012 GarageGames, LLC
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
// of this software and associated documentation files (the "Software"), to
|
|
// deal in the Software without restriction, including without limitation the
|
|
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
// sell copies of the Software, and to permit persons to whom the Software is
|
|
// furnished to do so, subject to the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included in
|
|
// all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
// IN THE SOFTWARE.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#include "console/console.h"
|
|
#include "windowManager/platformWindowMgr.h"
|
|
#include "unit/test.h"
|
|
#include "core/util/tVector.h"
|
|
#include "gfx/gfxStructs.h"
|
|
#include "core/util/journal/process.h"
|
|
#include "gfx/gfxInit.h"
|
|
|
|
using namespace UnitTesting;
|
|
|
|
CreateUnitTest(TestWinMgrQueries, "WindowManager/BasicQueries")
|
|
{
|
|
void run()
|
|
{
|
|
PlatformWindowManager *pwm = CreatePlatformWindowManager();
|
|
|
|
// Check out the primary desktop area...
|
|
RectI primary = pwm->getPrimaryDesktopArea();
|
|
|
|
Con::printf("Primary desktop area is (%d,%d) (%d,%d)",
|
|
primary.point.x, primary.point.y, primary.extent.x, primary.extent.y);
|
|
|
|
test(primary.isValidRect(), "Got some sort of invalid rect from the window manager!");
|
|
|
|
// Now try to get info about all the monitors.
|
|
Vector<RectI> monitorRects;
|
|
pwm->getMonitorRegions(monitorRects);
|
|
|
|
test(monitorRects.size() > 0, "Should get at least one monitor rect back from getMonitorRegions!");
|
|
|
|
// This test is here just to detect overflow/runaway situations. -- BJG
|
|
test(monitorRects.size() < 64, "Either something's wrong, or you have a lot of monitors...");
|
|
|
|
for(S32 i=0; i<monitorRects.size(); i++)
|
|
{
|
|
Con::printf(" Monitor #%d region is (%d,%d) (%d,%d)", i,
|
|
monitorRects[i].point.x, monitorRects[i].point.y, monitorRects[i].extent.x, monitorRects[i].extent.y);
|
|
|
|
test(monitorRects[i].isValidRect(), "Got an invalid rect for this monitor - no good.");
|
|
}
|
|
}
|
|
};
|
|
|
|
CreateInteractiveTest(TestWinMgrCreate, "WindowManager/CreateAWindow")
|
|
{
|
|
void handleMouseEvent(WindowId,U32,S32 x,S32 y, bool isRelative)
|
|
{
|
|
Con::printf("Mouse at %d, %d %s", x, y, isRelative ? "(relative)" : "(absolute)");
|
|
}
|
|
|
|
void handleAppEvent(WindowId, S32 event)
|
|
{
|
|
if(event == WindowClose)
|
|
Process::requestShutdown();
|
|
}
|
|
|
|
void run()
|
|
{
|
|
PlatformWindowManager *pwm = CreatePlatformWindowManager();
|
|
|
|
GFXVideoMode vm;
|
|
vm.resolution.x = 800;
|
|
vm.resolution.y = 600;
|
|
|
|
PlatformWindow *pw = pwm->createWindow(NULL, vm);
|
|
|
|
test(pw, "Didn't get a window back from the window manager, no good.");
|
|
if(!pw)
|
|
return;
|
|
|
|
// Setup our events.
|
|
pw->mouseEvent.notify(this, &TestWinMgrCreate::handleMouseEvent);
|
|
pw->appEvent.notify(this, &TestWinMgrCreate::handleAppEvent);
|
|
|
|
// And, go on our way.
|
|
while(Process::processEvents())
|
|
;
|
|
|
|
SAFE_DELETE(pw);
|
|
}
|
|
};
|
|
|
|
CreateInteractiveTest(TestWinMgrGFXInit, "WindowManager/SimpleGFX")
|
|
{
|
|
PlatformWindow *mWindow;
|
|
GFXDevice *mDevice;
|
|
|
|
void handleDrawEvent(WindowId id)
|
|
{
|
|
mDevice->beginScene();
|
|
mDevice->setActiveRenderTarget(mWindow->getGFXTarget());
|
|
mDevice->clear( GFXClearZBuffer | GFXClearStencil | GFXClearTarget, ColorI( 255, 255, 0 ), 1.0f, 0 );
|
|
mDevice->endScene();
|
|
mWindow->getGFXTarget()->present();
|
|
}
|
|
|
|
void forceDraw()
|
|
{
|
|
handleDrawEvent(0);
|
|
}
|
|
|
|
void handleAppEvent(WindowId, S32 event)
|
|
{
|
|
if(event == WindowClose)
|
|
Process::requestShutdown();
|
|
}
|
|
|
|
void run()
|
|
{
|
|
PlatformWindowManager *pwm = CreatePlatformWindowManager();
|
|
|
|
// Create a device.
|
|
GFXAdapter a;
|
|
a.mType = Direct3D9;
|
|
a.mIndex = 0;
|
|
|
|
mDevice = GFXInit::createDevice(&a);
|
|
test(mDevice, "Unable to create d3d9 device #0.");
|
|
|
|
// Initialize the window...
|
|
GFXVideoMode vm;
|
|
vm.resolution.x = 400;
|
|
vm.resolution.y = 400;
|
|
|
|
mWindow = pwm->createWindow(mDevice, vm);
|
|
|
|
test(mWindow, "Didn't get a window back from the window manager, no good.");
|
|
if(!mWindow)
|
|
return;
|
|
|
|
// Setup our events.
|
|
mWindow->displayEvent.notify(this, &TestWinMgrGFXInit::handleDrawEvent);
|
|
mWindow->idleEvent.notify(this, &TestWinMgrGFXInit::forceDraw);
|
|
mWindow->appEvent.notify(this, &TestWinMgrGFXInit::handleAppEvent);
|
|
|
|
// And, go on our way.
|
|
while(Process::processEvents())
|
|
;
|
|
|
|
mWindow->displayEvent.remove(this, &TestWinMgrGFXInit::handleDrawEvent);
|
|
mWindow->idleEvent.remove(this, &TestWinMgrGFXInit::forceDraw);
|
|
mWindow->appEvent.remove(this, &TestWinMgrGFXInit::handleAppEvent);
|
|
|
|
// Clean up!
|
|
SAFE_DELETE(mDevice);
|
|
SAFE_DELETE(mWindow);
|
|
}
|
|
};
|
|
|
|
CreateInteractiveTest(TestWinMgrGFXInitMultiWindow, "WindowManager/GFXMultiWindow")
|
|
{
|
|
enum {
|
|
NumWindows = 4,
|
|
};
|
|
|
|
PlatformWindowManager *mWindowManager;
|
|
PlatformWindow *mWindows[NumWindows];
|
|
GFXDevice *mDevice;
|
|
|
|
void handleDrawEvent(WindowId id)
|
|
{
|
|
// Which window are we getting this event on?
|
|
PlatformWindow *w = mWindowManager->getWindowById(id);
|
|
|
|
mDevice->beginScene();
|
|
mDevice->setActiveRenderTarget(w->getGFXTarget());
|
|
|
|
// Vary clear color by window to discern which window is which.
|
|
mDevice->clear( GFXClearTarget,
|
|
ColorI( 255 - (id * 50), 255, id * 100 ), 1.0f, 0 );
|
|
mDevice->endScene();
|
|
|
|
// Call swap on the window's render target.
|
|
((GFXWindowTarget*)w->getGFXTarget())->present();
|
|
}
|
|
|
|
void handleAppEvent(WindowId, S32 event)
|
|
{
|
|
if(event == WindowClose)
|
|
Process::requestShutdown();
|
|
}
|
|
|
|
void handleIdleEvent()
|
|
{
|
|
for(S32 i=0; i<NumWindows; i++)
|
|
handleDrawEvent(mWindows[i]->getWindowId());
|
|
}
|
|
|
|
void run()
|
|
{
|
|
mWindowManager = CreatePlatformWindowManager();
|
|
|
|
// Create a device.
|
|
GFXAdapter a;
|
|
a.mType = Direct3D9;
|
|
a.mIndex = 0;
|
|
|
|
mDevice = GFXInit::createDevice(&a);
|
|
test(mDevice, "Unable to create d3d9 device #0.");
|
|
|
|
// Initialize the windows...
|
|
GFXVideoMode vm;
|
|
vm.resolution.x = 400;
|
|
vm.resolution.y = 400;
|
|
|
|
for(S32 i=0; i<NumWindows; i++)
|
|
{
|
|
mWindows[i] = mWindowManager->createWindow(mDevice, vm);
|
|
|
|
test(mWindows[i], "Didn't get a window back from the window manager, no good.");
|
|
if(!mWindows[i])
|
|
continue;
|
|
|
|
// Setup our events.
|
|
mWindows[i]->displayEvent.notify(this, &TestWinMgrGFXInitMultiWindow::handleDrawEvent);
|
|
mWindows[i]->appEvent.notify(this, &TestWinMgrGFXInitMultiWindow::handleAppEvent);
|
|
mWindows[i]->idleEvent.notify(this, &TestWinMgrGFXInitMultiWindow::handleIdleEvent);
|
|
}
|
|
|
|
// And, go on our way.
|
|
while(Process::processEvents())
|
|
;
|
|
|
|
SAFE_DELETE(mWindowManager);
|
|
SAFE_DELETE(mDevice);
|
|
}
|
|
};
|
|
|
|
CreateInteractiveTest(TestJournaledMultiWindowGFX, "WindowManager/GFXJournaledMultiWindow")
|
|
{
|
|
enum {
|
|
NumWindows = 2,
|
|
};
|
|
|
|
PlatformWindowManager *mWindowManager;
|
|
PlatformWindow *mWindows[NumWindows];
|
|
GFXDevice *mDevice;
|
|
|
|
S32 mNumDraws;
|
|
S32 mNumResize;
|
|
|
|
void drawToWindow(PlatformWindow *win)
|
|
{
|
|
// Do some simple checks to make sure we draw the same number of times
|
|
// on both runs.
|
|
if(Journal::IsPlaying())
|
|
mNumDraws--;
|
|
else
|
|
mNumDraws++;
|
|
|
|
// Render!
|
|
mDevice->beginScene();
|
|
mDevice->setActiveRenderTarget(win->getGFXTarget());
|
|
|
|
// Vary clear color by window to discern which window is which.
|
|
static S32 timeVariance = 0;
|
|
|
|
mDevice->clear( GFXClearTarget,
|
|
ColorI( 0xFF - (++timeVariance * 5), 0xFF, win->getWindowId() * 0x0F ), 1.0f, 0 );
|
|
|
|
mDevice->endScene();
|
|
|
|
// Call swap on the window's render target.
|
|
win->getGFXTarget()->present();
|
|
|
|
}
|
|
|
|
void handleDrawEvent(WindowId id)
|
|
{
|
|
// Which window are we getting this event on?
|
|
PlatformWindow *w = mWindowManager->getWindowById(id);
|
|
|
|
drawToWindow(w);
|
|
}
|
|
|
|
void handleAppEvent(WindowId, S32 event)
|
|
{
|
|
if(event == WindowClose)
|
|
Process::requestShutdown();
|
|
}
|
|
|
|
void handleIdleEvent()
|
|
{
|
|
for(S32 i=0; i<NumWindows; i++)
|
|
drawToWindow(mWindows[i]);
|
|
}
|
|
|
|
void handleResizeEvent(WindowId id, S32 width, S32 height)
|
|
{
|
|
// Do some simple checks to make sure we resize the same number of times
|
|
// on both runs.
|
|
|
|
if(Journal::IsPlaying())
|
|
{
|
|
// If we're playing back, APPLY the resize event...
|
|
mWindowManager->getWindowById(id)->setSize(Point2I(width, height));
|
|
|
|
mNumResize--;
|
|
}
|
|
else
|
|
{
|
|
// If we're not playing back, do nothing except note it.
|
|
mNumResize++;
|
|
}
|
|
|
|
// Which window are we getting this event on?
|
|
PlatformWindow *w = mWindowManager->getWindowById(id);
|
|
|
|
drawToWindow(w);
|
|
}
|
|
|
|
/// The mainloop of our app - we'll run this twice, once to create
|
|
/// a journal and again to play it back.
|
|
void mainLoop()
|
|
{
|
|
mWindowManager = CreatePlatformWindowManager();
|
|
|
|
// Create a device.
|
|
GFXAdapter a;
|
|
a.mType = Direct3D9;
|
|
a.mIndex = 0;
|
|
|
|
mDevice = GFXInit::createDevice(&a);
|
|
test(mDevice, "Unable to create ogl device #0.");
|
|
|
|
// Initialize the windows...
|
|
GFXVideoMode vm;
|
|
vm.resolution.x = 400;
|
|
vm.resolution.y = 400;
|
|
|
|
for(S32 i=0; i<NumWindows; i++)
|
|
{
|
|
mWindows[i] = mWindowManager->createWindow(mDevice, vm);
|
|
|
|
test(mWindows[i], "Didn't get a window back from the window manager, no good.");
|
|
if(!mWindows[i])
|
|
continue;
|
|
|
|
// Setup our events.
|
|
mWindows[i]->displayEvent.notify(this, &TestJournaledMultiWindowGFX::handleDrawEvent);
|
|
mWindows[i]->appEvent.notify(this, &TestJournaledMultiWindowGFX::handleAppEvent);
|
|
mWindows[i]->resizeEvent.notify(this, &TestJournaledMultiWindowGFX::handleResizeEvent);
|
|
|
|
// Only subscribe to the first idle event.
|
|
if(i==0)
|
|
mWindows[i]->idleEvent.notify(this, &TestJournaledMultiWindowGFX::handleIdleEvent);
|
|
}
|
|
|
|
// And, go on our way.
|
|
while(Process::processEvents())
|
|
;
|
|
|
|
// Finally, clean up.
|
|
for(S32 i=0; i<NumWindows; i++)
|
|
SAFE_DELETE(mWindows[i]);
|
|
|
|
SAFE_DELETE(mDevice);
|
|
SAFE_DELETE(mWindowManager);
|
|
}
|
|
|
|
|
|
void run()
|
|
{
|
|
return;
|
|
|
|
// CodeReview: this should be deleted or enabled.
|
|
#if 0
|
|
mNumDraws = 0;
|
|
mNumResize = 0;
|
|
|
|
// Record a run of the main loop.
|
|
Journal::Record("multiwindow.jrn");
|
|
mainLoop();
|
|
Journal::Stop();
|
|
|
|
test(mNumDraws > 0, "No draws occurred!");
|
|
test(mNumResize > 0, "No resizes occurred!");
|
|
|
|
// And play it back.
|
|
Journal::Play("multiwindow.jrn");
|
|
mainLoop();
|
|
Journal::Stop();
|
|
|
|
test(mNumDraws == 0, "Failed to play journal back with same number of draws.");
|
|
test(mNumResize == 0, "Failed to play journal back with same number of resizes.");
|
|
#endif
|
|
}
|
|
};
|
|
|
|
CreateInteractiveTest(GFXTestFullscreenToggle, "GFX/TestFullscreenToggle")
|
|
{
|
|
enum Constants
|
|
{
|
|
NumWindows = 1,
|
|
};
|
|
|
|
PlatformWindowManager *mWindowManager;
|
|
PlatformWindow *mWindows[NumWindows];
|
|
GFXDevice *mDevice;
|
|
|
|
void drawToWindow(PlatformWindow *win)
|
|
{
|
|
// Render!
|
|
mDevice->beginScene();
|
|
mDevice->setActiveRenderTarget(win->getGFXTarget());
|
|
|
|
// Vary clear color by window to discern which window is which.
|
|
static S32 timeVariance = 0;
|
|
|
|
mDevice->clear( GFXClearZBuffer | GFXClearStencil | GFXClearTarget,
|
|
ColorI( 0xFF - (++timeVariance * 5), 0xFF, win->getWindowId() * 0x40 ), 1.0f, 0 );
|
|
|
|
mDevice->endScene();
|
|
|
|
// Call swap on the window's render target.
|
|
win->getGFXTarget()->present();
|
|
}
|
|
|
|
void handleDrawEvent(WindowId id)
|
|
{
|
|
// Which window are we getting this event on?
|
|
PlatformWindow *w = mWindowManager->getWindowById(id);
|
|
|
|
drawToWindow(w);
|
|
}
|
|
|
|
void handleAppEvent(WindowId, S32 event)
|
|
{
|
|
if(event == WindowClose)
|
|
Process::requestShutdown();
|
|
}
|
|
|
|
void handleIdleEvent()
|
|
{
|
|
// Redraw everything.
|
|
for(S32 i=0; i<NumWindows; i++)
|
|
drawToWindow(mWindows[i]);
|
|
|
|
// Don't monopolize the CPU.
|
|
Platform::sleep(10);
|
|
}
|
|
|
|
void handleButtonEvent(WindowId did,U32 modifier,U32 action,U16 button)
|
|
{
|
|
// Only respond to button down
|
|
if(action != IA_MAKE)
|
|
return;
|
|
|
|
// Get the window...
|
|
PlatformWindow *win = mWindowManager->getWindowById(did);
|
|
GFXVideoMode winVm = win->getVideoMode();
|
|
|
|
// If the window is not full screen, make it full screen 800x600x32
|
|
if(winVm.fullScreen == false)
|
|
{
|
|
winVm.fullScreen = true;
|
|
winVm.resolution.set(800,600);
|
|
}
|
|
else
|
|
{
|
|
// If the window is full screen, then bump it to 400x400x32
|
|
winVm.fullScreen = false;
|
|
winVm.resolution.set(400,400);
|
|
}
|
|
|
|
win->setVideoMode(winVm);
|
|
}
|
|
|
|
void run()
|
|
{
|
|
mWindowManager = CreatePlatformWindowManager();
|
|
|
|
// Create a device.
|
|
GFXAdapter a;
|
|
a.mType = Direct3D9;
|
|
a.mIndex = 0;
|
|
|
|
mDevice = GFXInit::createDevice(&a);
|
|
test(mDevice, "Unable to create d3d9 device #0.");
|
|
|
|
// Initialize the windows...
|
|
GFXVideoMode vm;
|
|
vm.resolution.x = 400;
|
|
vm.resolution.y = 400;
|
|
|
|
for(S32 i=0; i<NumWindows; i++)
|
|
{
|
|
mWindows[i] = mWindowManager->createWindow(mDevice, vm);
|
|
|
|
test(mWindows[i], "Didn't get a window back from the window manager, no good.");
|
|
if(!mWindows[i])
|
|
continue;
|
|
|
|
// Setup our events.
|
|
mWindows[i]->appEvent.notify(this, &GFXTestFullscreenToggle::handleAppEvent);
|
|
mWindows[i]->buttonEvent.notify(this, &GFXTestFullscreenToggle::handleButtonEvent);
|
|
mWindows[i]->displayEvent.notify(this, &GFXTestFullscreenToggle::handleDrawEvent);
|
|
|
|
// Only subscribe to the first idle event.
|
|
if(i==0)
|
|
mWindows[i]->idleEvent.notify(this, &GFXTestFullscreenToggle::handleIdleEvent);
|
|
}
|
|
|
|
// And, go on our way.
|
|
while(Process::processEvents())
|
|
;
|
|
|
|
// Finally, clean up.
|
|
for(S32 i=0; i<NumWindows; i++)
|
|
SAFE_DELETE(mWindows[i]);
|
|
|
|
mDevice->preDestroy();
|
|
SAFE_DELETE(mDevice);
|
|
SAFE_DELETE(mWindowManager);
|
|
}
|
|
}; |