10#include "glm/gtc/matrix_transform.hpp"
13#include "imgui_impl_glfw.h"
14#include "imgui_impl_opengl3.h"
38 void pan(glm::vec2 delta)
43 void zoom(
float factor, glm::vec2 mouse_world_pos_before_zoom)
52 float zoom_ratio =
zoom_level / old_zoom_level;
53 position = mouse_world_pos_before_zoom - (mouse_world_pos_before_zoom -
position) / zoom_ratio;
79 return glm::translate(glm::mat4(1.0f), glm::vec3(-
position.x, -
position.y, 0.0f));
86 return glm::ortho(-half_width, half_width, half_height, -half_height, -1.0f, 1.0f);
91 glm::vec4 world_homogeneous = glm::vec4(world_position.x, world_position.y, 0.0f, 1.0f);
96 glm::vec4 clip_coords = pv_matrix * world_homogeneous;
99 if (clip_coords.w != 0.0f)
101 ndc.x = clip_coords.x / clip_coords.w;
102 ndc.y = clip_coords.y / clip_coords.w;
106 return glm::vec2(NAN, NAN);
108 glm::vec2 fbo_pixel_top_left_origin;
109 fbo_pixel_top_left_origin.x = (ndc.x + 1.0f) * 0.5f *
fbo_dimensions.x;
110 fbo_pixel_top_left_origin.y = (1.0f - ndc.y) * 0.5f *
fbo_dimensions.y;
112 return fbo_pixel_top_left_origin;
118 ndc.x = (2.0f * fbo_pixel_top_left_origin.x) /
fbo_dimensions.x - 1.0f;
119 ndc.y = 1.0f - (2.0f * fbo_pixel_top_left_origin.y) /
fbo_dimensions.y;
126 glm::vec2 ndc =
fboToNdcPos(fbo_pixel_top_left_origin);
127 glm::vec4 ndc_homogeneous = glm::vec4(ndc.x, ndc.y, 0.0f, 1.0f);
129 glm::vec4 world_homogeneous = inverse_pv_matrix * ndc_homogeneous;
130 glm::vec2 world_position;
131 if (world_homogeneous.w != 0.0f)
133 world_position.x = world_homogeneous.x / world_homogeneous.w;
134 world_position.y = world_homogeneous.y / world_homogeneous.w;
138 return glm::vec2(NAN, NAN);
141 return world_position;
179 flecs::entity
createMarker(
const std::string& imageFilePath, GLuint textureId, glm::vec2 position, glm::vec2 size);
192 void panBoard(glm::vec2 currentMousePos);
200 flecs::entity
createBoard(std::string
board_name, std::string map_image_path, GLuint texture_id, glm::vec2 size);
263 void onUsernameChanged(
const std::string& uniqueId,
const std::string& newUsername);
flecs::entity grid_entity
void deleteMarker(flecs::entity markerEntity)
flecs::entity getEntityAtMousePosition(glm::vec2 mouse_position)
void renderBoard(VertexArray &va, IndexBuffer &ib, Shader &shader, Shader &grid_shader, Renderer &renderer)
void renderToolbar(const ImVec2 &window_position)
uint64_t generateUniqueId()
bool isEditWindowOpen() const
flecs::entity findBoardById(uint64_t boardId)
bool isMouseOverMarker(glm::vec2 mousePos)
flecs::entity edit_window_entity
void setShowEditWindow(bool show, flecs::entity edit_entity=flecs::entity())
bool getShowEditWindow() const
void saveActiveBoard(const std::string &filePath)
void sendEntityUpdate(flecs::entity entity)
bool canMoveMarker(const MarkerComponent *mc, flecs::entity markerEnt) const
void startMouseDrag(glm::vec2 mousePos, bool draggingMarker)
flecs::entity findEntityById(uint64_t target_id)
glm::vec2 mouse_current_world_pos
BoardImageData LoadTextureFromMemory(const unsigned char *bytes, size_t sizeBytes)
glm::vec2 getMouseStartPosition() const
glm::vec2 mouse_start_world_pos
void deleteFogOfWar(flecs::entity fogEntity)
BoardManager(flecs::world ecs, std::weak_ptr< NetworkManager > network_manager, std::shared_ptr< IdentityManager > identity_manager, std::shared_ptr< DirectoryWindow > map_directory, std::shared_ptr< DirectoryWindow > marker_directory)
Tool getCurrentTool() const
void renderCameraWindow()
void onUsernameChanged(const std::string &uniqueId, const std::string &newUsername)
std::shared_ptr< DirectoryWindow > marker_directory
void setActiveBoard(flecs::entity board_entity)
std::weak_ptr< NetworkManager > network_manager
glm::vec2 computeMarkerDrawSize_ARFit(const TextureComponent &tex, float basePx, float scale)
void setCurrentTool(Tool newTool)
void resnapAllMarkersToNearest(const Grid &grid)
flecs::entity createFogOfWar(glm::vec2 startPos, glm::vec2 size)
bool isCreatingFog() const
flecs::entity getActiveBoard() const
void killIfMouseUp(bool isMouseDown)
glm::vec2 snapToGrid(glm::vec2 raw_world_pos)
bool isDraggingMarker(bool local_drag_only=true)
flecs::entity createMarker(const std::string &imageFilePath, GLuint textureId, glm::vec2 position, glm::vec2 size)
flecs::entity active_board
std::shared_ptr< IdentityManager > identity_manager
bool shouldSendMarkerMove(uint64_t markerId) const
void loadActiveBoard(const std::string &filePath)
void handleFogCreation(glm::vec2 end_world_position)
void handleMarkerDragging(glm::vec2 mousePos)
std::shared_ptr< DirectoryWindow > map_directory
glm::vec2 mouse_start_screen_pos
void panBoard(glm::vec2 currentMousePos)
flecs::entity createBoard(std::string board_name, std::string map_image_path, GLuint texture_id, glm::vec2 size)
void zoom(float factor, glm::vec2 mouse_world_pos_before_zoom)
void setZoom(float newZoomLevel)
glm::mat4 getViewMatrix() const
glm::mat4 getProjectionMatrix() const
glm::vec2 fboToNdcPos(glm::vec2 fbo_pixel_top_left_origin) const
void setPosition(glm::vec2 newPosition)
glm::vec2 screenToWorldPosition(glm::vec2 fbo_pixel_top_left_origin) const
glm::vec2 getPosition() const
void setFboDimensions(glm::vec2 dims)
glm::vec2 worldToScreenPosition(glm::vec2 world_position) const
void pan(glm::vec2 delta)
BoardImageData(GLuint id, glm::vec2 s, std::string p)