geode/loader/include/Geode/cocos/platform/win32/CCEGLView.h

237 lines
7.5 KiB
C
Raw Normal View History

2022-07-30 12:24:03 -04:00
/****************************************************************************
Copyright (c) 2010 cocos2d-x.org
http://www.cocos2d-x.org
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.
****************************************************************************/
#ifndef __CC_EGLVIEW_WIN32_H__
#define __CC_EGLVIEW_WIN32_H__
#include "CCStdC.h"
#include "../CCCommon.h"
#include "../../cocoa/CCGeometry.h"
#include "../CCEGLViewProtocol.h"
2022-07-30 12:24:03 -04:00
#include "../../robtop/glfw/glfw3.h"
2022-07-30 12:24:03 -04:00
NS_CC_BEGIN
typedef LRESULT (*CUSTOM_WND_PROC)(UINT message, WPARAM wParam, LPARAM lParam, BOOL* pProcessed);
class CCEGL;
class CC_DLL CCEGLView : public CCEGLViewProtocol RT_ADD(, public CCObject)
{
GEODE_FRIEND_MODIFY
protected:
RT_ADD( virtual ~CCEGLView(); )
public:
CCEGLView();
CCEGLView(geode::ZeroConstructorType, size_t fill) :
CCEGLViewProtocol(geode::ZeroConstructor, fill),
CCObject(geode::ZeroConstructor, fill - sizeof(CCEGLViewProtocol)) {}
CCEGLView(geode::ZeroConstructorType) :
CCEGLViewProtocol(geode::ZeroConstructor, sizeof(CCEGLView)),
CCObject(geode::ZeroConstructor, sizeof(CCEGLView) - sizeof(CCEGLViewProtocol)) {}
CCEGLView(geode::CutoffConstructorType, size_t fill) : CCEGLView() {}
2022-07-30 12:24:03 -04:00
RT_REMOVE( virtual ~CCEGLView(); )
/* override functions */
virtual bool isOpenGLReady();
virtual void end();
virtual void swapBuffers();
virtual void setFrameSize(float width, float height);
RT_REMOVE( virtual void setEditorFrameSize(float width, float height,HWND hWnd); )
virtual void setIMEKeyboardState(bool bOpen);
void updateWindow(int width, int height);
void pollEvents(void);
void setMenuResource(LPCWSTR menu);
void setWndProc(CUSTOM_WND_PROC proc);
protected:
RT_REMOVE( virtual bool Create(); )
2023-03-23 12:01:10 -04:00
void setupWindow(cocos2d::CCRect rect);
2023-06-05 08:45:12 -04:00
RT_ADD(bool initGlew();)
2023-03-23 12:01:10 -04:00
2022-07-30 12:24:03 -04:00
public:
2023-06-05 08:45:12 -04:00
RT_REMOVE(bool initGL();)
RT_REMOVE(void destroyGL();)
2022-07-30 12:24:03 -04:00
RT_REMOVE( virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam); )
void setHWnd(HWND hWnd);
// win32 platform function
RT_REMOVE( HWND getHWnd(); )
RT_REMOVE( virtual void resize(int width, int height); )
RT_ADD( void resizeWindow(int width, int height); )
/*
* Set zoom factor for frame. This method is for debugging big resolution (e.g.new ipad) app on desktop.
*/
void setFrameZoomFactor(float fZoomFactor);
float getFrameZoomFactor();
RT_REMOVE( virtual void centerWindow(); )
RT_ADD( void centerWindow(); )
2023-06-11 18:50:10 -04:00
RT_ADD( bool windowShouldClose(); )
2022-07-30 12:24:03 -04:00
RT_ADD( void showCursor(bool state); )
typedef void (*LPFN_ACCELEROMETER_KEYHOOK)( UINT message,WPARAM wParam, LPARAM lParam );
void setAccelerometerKeyHook( LPFN_ACCELEROMETER_KEYHOOK lpfnAccelerometerKeyHook );
virtual void setViewPortInPoints(float x , float y , float w , float h);
virtual void setScissorInPoints(float x , float y , float w , float h);
// static function
/**
@brief get the shared main open gl window
*/
static CCEGLView* sharedOpenGLView();
/**
* @note Geode addition
*/
static GEODE_DLL CCEGLView* get();
/**
* @note RobTop addition
*/
static CCEGLView* create(const gd::string&);
2022-07-30 12:24:03 -04:00
2024-01-17 12:09:08 -05:00
static cocos2d::CCEGLView* createWithFullScreen(gd::string const&, bool);
static cocos2d::CCEGLView* createWithFullScreen(gd::string const&, bool, GLFWvidmode const&, GLFWmonitor*);
2023-12-20 21:14:53 -05:00
static cocos2d::CCEGLView* createWithRect(gd::string const&, cocos2d::CCRect, float);
/**
* @note Geode addition
*/
inline CCPoint getMousePosition() { return { m_fMouseX, m_fMouseY }; }
2022-07-30 12:24:03 -04:00
/**
* @note RobTop addition
*/
2024-01-17 12:09:08 -05:00
void toggleFullScreen(bool fullscreen, bool borderless);
2022-07-30 12:24:03 -04:00
/**
* @note RobTop addition
*/
GLFWwindow* getWindow(void) const;
/**
* @note RobTop addition
*/
CCSize getDisplaySize();
2022-07-30 12:24:03 -04:00
2023-12-20 21:14:53 -05:00
void capture();
void checkErrorGL(char const*);
void enableRetina(bool);
bool getCursorLocked() const;
bool getGameplayActive() const;
2024-01-17 12:09:08 -05:00
bool getIsBorderless() const;
2023-12-20 21:14:53 -05:00
bool getIsFullscreen() const;
int getRetinaFactor() const;
bool getShouldHideCursor() const;
void iconify();
2024-01-17 12:09:08 -05:00
bool initWithFullScreen(gd::string const&, bool);
bool initWithFullscreen(gd::string const&, bool, GLFWvidmode const&, GLFWmonitor*);
2023-12-20 21:14:53 -05:00
bool initWithRect(gd::string const&, cocos2d::CCRect, float);
bool isRetinaEnabled() const;
void onGLFWWindowCloseFunCallback(GLFWwindow*);
void releaseCapture();
void showMessage(gd::string);
void toggleGameplayActive(bool);
void toggleLockCursor(bool);
void updateDesignSize(int, int);
void updateFrameSize();
2022-07-30 12:24:03 -04:00
protected:
static CCEGLView* s_pEglView;
bool m_bCaptured;
RT_REMOVE(
HWND m_hWnd;
HDC m_hDC;
HGLRC m_hRC;
LPFN_ACCELEROMETER_KEYHOOK m_lpfnAccelerometerKeyHook;
)
bool m_bSupportTouch;
RT_ADD(
bool m_bInRetinaMonitor;
bool m_bRetinaEnabled;
int m_nRetinaFactor;
bool m_bCursorHidden;
)
RT_REMOVE(
LPCWSTR m_menu;
CUSTOM_WND_PROC m_wndproc;
)
float m_fFrameZoomFactor;
RT_ADD(
GLFWwindow* m_pMainWindow;
GLFWmonitor* m_pPrimaryMonitor;
2023-06-01 16:00:48 -04:00
)
public:
RT_ADD(
CC_SYNTHESIZE_NV(CCSize, m_obWindowedSize, WindowedSize);
)
2023-06-11 18:50:10 -04:00
2023-06-01 16:00:48 -04:00
RT_ADD(
2022-07-30 12:24:03 -04:00
float m_fMouseX;
float m_fMouseY;
bool m_bIsFullscreen;
2024-05-14 02:22:47 -04:00
bool m_bIsBorderless;
2022-07-30 12:24:03 -04:00
bool m_bShouldHideCursor;
2024-05-14 02:22:47 -04:00
bool m_bCursorLocked;
2022-07-30 12:24:03 -04:00
bool m_bShouldCallGLFinish;
)
2023-06-11 18:50:10 -04:00
protected:
2022-07-30 12:24:03 -04:00
RT_ADD(
void onGLFWCharCallback(GLFWwindow* window, unsigned int entered);
void onGLFWCursorEnterFunCallback(GLFWwindow* window, int entered);
void onGLFWDeviceChangeFunCallback(GLFWwindow* window);
void onGLFWError(int code, const char* description);
void onGLFWframebuffersize(GLFWwindow* window, int width, int height);
void onGLFWMouseMoveCallBack(GLFWwindow* window, double x, double y);
void onGLFWMouseCallBack(GLFWwindow* window, int button, int action, int mods);
void onGLFWKeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods);
void onGLFWMouseScrollCallback(GLFWwindow* window, double xoffset, double yoffset);
void onGLFWWindowIconifyFunCallback(GLFWwindow* window, int iconified);
void onGLFWWindowPosCallback(GLFWwindow* window, int x, int y);
void onGLFWWindowSizeFunCallback(GLFWwindow* window, int width, int height);
)
};
NS_CC_END
#endif // end of __CC_EGLVIEW_WIN32_H__