| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- //-----------------------------------------------------------------------------
- // 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 <string>
- #include <vector>
- #include "npWebGamePlugin.h"
- #include "../../common/webCommon.h"
- NPWebGamePlugin* NPWebGamePlugin::sInstance = NULL;
- // we use a timer to update the Torque 3D game loop (tick) and handle rendering
- VOID CALLBACK MyTimerProc( HWND hwnd, // handle to window for timer messages
- UINT message, // WM_TIMER message
- UINT idTimer, // timer identifier
- DWORD dwTime) // current system time
- {
- static bool reentrant = false;
- if (!reentrant)
- {
- reentrant = true;
- torque_enginetick();
- reentrant = false;
- }
- }
- // custom window proc for our plugin's rendering window
- static LRESULT CALLBACK NPWebGamePluginWinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
- {
- NPWebGamePlugin* plugin = (NPWebGamePlugin*)GetWindowLongPtr(hWnd, GWL_USERDATA);
- if (plugin)
- {
- switch (msg)
- {
- case WM_MOUSEACTIVATE:
- break;
- case WM_SIZE:
- // handle resize of browser (sub)window updating our Torque 3D child window accordingly
- int width = (int) LOWORD( lParam );
- int height = (int) HIWORD( lParam );
- torque_resizewindow(width,height);
- break;
- }
- return CallWindowProc((WNDPROC)plugin->mOriginalWinProc, hWnd, msg, wParam, lParam);
- }
- else
- {
- return DefWindowProc(hWnd, msg, wParam, lParam);
- }
- }
- // DLL Entry Point
- extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
- {
- WebCommon::gPluginModule = (HMODULE) hInstance;
- return TRUE;
- }
- NPWebGamePlugin::NPWebGamePlugin(NPP aInstance)
- {
- mOpen = FALSE;
- mInstance = aInstance;
- sInstance = this;
- mOriginalWinProc = NULL;
- mHwnd = NULL;
- }
- NPWebGamePlugin::~NPWebGamePlugin()
- {
- Close();
- sInstance = NULL;
- }
- NPBool NPWebGamePlugin::Open(NPWindow* aWindow)
- {
- if (mOpen)
- {
- return TRUE; //firefox tries to open 2x
- }
- if (!aWindow)
- return FALSE;
- void* platformWindow = NULL;
- mHwnd = (HWND)aWindow->window;
- if (!mHwnd)
- return FALSE;
- platformWindow = mHwnd;
- // replace our plugin window proc with a custom one (for handling resizing,etc)
- mOriginalWinProc = SetWindowLongPtr(mHwnd, GWLP_WNDPROC, (LONG_PTR)NPWebGamePluginWinProc);
- LONG lStyle = GetWindowLong(mHwnd, GWL_STYLE);
- SetWindowLong(mHwnd, GWL_STYLE, lStyle | WS_CLIPCHILDREN);
- SetWindowLongPtr(mHwnd, GWL_USERDATA, (LONG_PTR)this);
- // load up the Torque 3D shared library and initialize it
- if (!WebCommon::InitTorque3D(platformWindow))
- return false;
- mOpen = true;
- // fire up our tick/update timer
- SetTimer( mHwnd, 1, // timer identifier
- 1, // 1 millisecond
- (TIMERPROC) MyTimerProc); // timer callback
- return mOpen;
- }
- void NPWebGamePlugin::Close()
- {
- if (!mOpen)
- return;
- if (mOriginalWinProc)
- {
- // restore original window proc
- SetWindowLongPtr(mHwnd, GWLP_WNDPROC, mOriginalWinProc);
- mOriginalWinProc = NULL;
- }
- if (mHwnd)
- {
- // no more ticks please
- KillTimer( mHwnd, 1);
- }
- mHwnd = NULL;
- // shutdown and unload the Torque 3D DLL
- WebCommon::ShutdownTorque3D();
- mOpen = false;
- }
- NPBool NPWebGamePlugin::IsOpen()
- {
- return mOpen;
- }
|