SDcmWeb/webassembly/camera.h
2025-10-12 00:17:30 +09:00

76 lines
2.3 KiB
C++

//
// Camera - pan, zoom, and window resizing
//
#ifdef __EMSCRIPTEN__
#include "nlohmann/json.hpp" // 라이브러리 경로에 맞게 수정
#include <string>
#include <vector>
#endif
struct Rect { int width, height; };
struct Vec2 { GLfloat x, y; };
class Camera
{
public:
Camera();
void reset();
bool updated();
bool windowResized();
Rect& windowSize() { return mWindowSize; }
void setWindowSize (int width, int height);
GLfloat* viewport() { return (GLfloat*)&mViewport; }
GLfloat* pan() { return (GLfloat*)&mPan; }
GLfloat zoom() { return mZoom; }
GLfloat aspect() { return mAspect; }
void setPan (Vec2 pan) { mPan = pan; mCameraUpdated = true; }
void setPanDelta (Vec2 panDelta) { mPan.x += panDelta.x; mPan.y += panDelta.y; mCameraUpdated = true; }
void setZoom (GLfloat zoom) { mZoom = clamp(zoom, cZoomMin, cZoomMax); mCameraUpdated = true; }
void setZoomDelta (GLfloat zoomDelta) { mZoom = clamp(mZoom + zoomDelta, cZoomMin, cZoomMax); mCameraUpdated = true; }
void setAspect (GLfloat aspect) { mAspect = aspect; mCameraUpdated = true; }
Vec2& basePan() { return mBasePan; }
void setBasePan () { mBasePan = mPan; }
void normWindowToDeviceCoords (float normWinX, float normWinY, float& deviceX, float& deviceY);
void windowToDeviceCoords (int winX, int winY, float& deviceX, float& deviceY);
void deviceToWorldCoords (float deviceX, float deviceY, float& worldX, float& worldY);
void windowToWorldCoords (int winX, int winY, float& worldX, float& worldY);
void normWindowToWorldCoords (float normWinX, float normWinY, float& worldX, float& worldY);
//void Camera::toJson(emscripten::val& json)
void toJson(nlohmann::json& json_obj) const;
void fromString(const char* pStrDumpJson);
private:
float clamp (float val, float lo, float hi);
bool mCameraUpdated;
bool mWindowResized;
Rect mWindowSize;
Vec2 mViewport;
const GLfloat cZoomMin, cZoomMax;
Vec2 mBasePan, mPan;
GLfloat mZoom, mAspect;
};
inline Camera::Camera()
: mCameraUpdated (false)
, mWindowResized (false)
, mWindowSize ({})
, mViewport ({})
, cZoomMin (0.1f), cZoomMax (10.0f)
, mBasePan ({0.0f, 0.0f})
, mPan ({0.0f, 0.0f})
, mZoom (1.0f)
, mAspect (1.0f)
{
setWindowSize(640, 480);
}