File FreeLookCameraMode.c
File List > engine > src > gameframework > layers > Game2D > FreeLookCameraMode.c
Go to the documentation of this file
#include "FreeLookCameraMode.h"
#include "GameFramework.h"
#include <cglm/cglm.h>
#include "Game2DLayer.h"
#include "Camera2D.h"
#define FREE_LOOK_ZOOM_IN_BINDING_NAME "zoomIn"
#define FREE_LOOK_ZOOM_OUT_BINDING_NAME "zoomOut"
#define FREE_LOOK_XPOS_BINDING_NAME "moveRight"
#define FREE_LOOK_XNEG_BINDING_NAME "moveLeft"
#define FREE_LOOK_YPOS_BINDING_NAME "moveDown"
#define FREE_LOOK_YNEG_BINDING_NAME "moveUp"
#define FREE_LOOK_CURSOR_X_BINDING_NAME "CursorPosX"
#define FREE_LOOK_CURSOR_Y_BINDING_NAME "CursorPosY"
#define FREE_LOOK_CURSOR_SELECT_BINDING_NAME "select"
float gDebugWSX = 0;
float gDebugWSY = 0;
void FreeLookMode2DInput(struct GameFrameworkLayer* pLayer, InputContext* context)
{
struct GameLayer2DData* pData = pLayer->userData;
const float FREE_LOOK_ZOOM_FACTOR = 0.99;
const float FREE_LOOK_MOVEMENT_SPEED = 0.3;
bool bZoomIn = In_GetButtonValue(context, pData->freeLookCtrls.freeLookZoomInBinding);
bool bZoomOut = In_GetButtonValue(context, pData->freeLookCtrls.freeLookZoomOutBinding);
bool bXPos = In_GetButtonValue(context, pData->freeLookCtrls.freeLookZoomMoveXPosBinding);
bool bXNeg = In_GetButtonValue(context, pData->freeLookCtrls.freeLookZoomMoveXNegBinding);
bool bYPos = In_GetButtonValue(context, pData->freeLookCtrls.freeLookZoomMoveYPosBinding);
bool bYNeg = In_GetButtonValue(context, pData->freeLookCtrls.freeLookZoomMoveYNegBinding);
vec2 movementVector = { 0,0 };
if (bXPos)
{
vec2 dir = { 1,0 };
glm_vec2_add(movementVector, dir, movementVector);
}
if (bXNeg)
{
vec2 dir = { -1,0 };
glm_vec2_add(movementVector, dir, movementVector);
}
if (bYPos)
{
vec2 dir = { 0,-1 };
glm_vec2_add(movementVector, dir, movementVector);
}
if (bYNeg)
{
vec2 dir = { 0,1 };
glm_vec2_add(movementVector, dir, movementVector);
}
glm_vec2_normalize(movementVector);
movementVector[0] = movementVector[0] * FREE_LOOK_MOVEMENT_SPEED;
movementVector[1] = movementVector[1] * FREE_LOOK_MOVEMENT_SPEED;
glm_vec2_add(movementVector, pData->camera.position, pData->camera.position);
vec2 camcenter;
GetCamWorldspaceCenter(&pData->camera, pData->windowW, pData->windowH, camcenter);
if (bZoomOut)
{
pData->camera.scale[0] -= 0.1f;
pData->camera.scale[1] -= 0.1f;
CenterCameraAt(camcenter[0], camcenter[1], &pData->camera, pData->windowW, pData->windowH);
}
if (bZoomIn)
{
pData->camera.scale[0] += 0.1f;
pData->camera.scale[1] += 0.1f;
CenterCameraAt(camcenter[0], camcenter[1], &pData->camera, pData->windowW, pData->windowH);
}
// move around with mouse
bool bSelectVal = In_GetButtonValue(context, pData->freeLookCtrls.freeLookSelectButtonBinding);
static bool bLastSelect = false;
static ivec2 dragAnchorScreenSpace;
static vec2 dragAnchorWorldSpace;
if(bSelectVal && !bLastSelect)
{
//press
int screenX = In_GetAxisValue(context, pData->freeLookCtrls.freeLookCursorXAxisBinding);
int screenY = In_GetAxisValue(context, pData->freeLookCtrls.freeLookCursorYAxisBinding);
GetWorldspacePos(screenX, screenY, pData->windowW, pData->windowH, &pData->camera, dragAnchorWorldSpace);
gDebugWSX = dragAnchorWorldSpace[0];
gDebugWSY = dragAnchorWorldSpace[1];
dragAnchorScreenSpace[0] = screenX;
dragAnchorScreenSpace[1] = screenY;
//CenterCameraAt(gDebugWSX, gDebugWSY, &pData->camera, pData->windowW, pData->windowH); // to test
GetCamWorldspaceCenter(&pData->camera, pData->windowW, pData->windowH, dragAnchorWorldSpace);
}
if(bSelectVal)
{
// drag
ivec2 ss;
ivec2 sstrans;
vec2 sstransf;
vec2 wstrans;
vec2 camCenter;
ss[0] = In_GetAxisValue(context, pData->freeLookCtrls.freeLookCursorXAxisBinding);
ss[1] = In_GetAxisValue(context, pData->freeLookCtrls.freeLookCursorYAxisBinding);
glm_ivec2_sub(ss, dragAnchorScreenSpace, sstrans);
sstransf[0] = (float)sstrans[0];
sstransf[1] = (float)sstrans[1];
ScreenSpaceToWorldSpaceTransVector(sstransf, pData->windowW, pData->windowH, &pData->camera, wstrans);
glm_vec2_scale(wstrans, -1.0f, wstrans);
glm_vec2_add(dragAnchorWorldSpace, wstrans, camCenter);
CenterCameraAt(camCenter[0], camCenter[1], &pData->camera, pData->windowW, pData->windowH); // to test
}
bLastSelect = bSelectVal;
}
void BindFreeLookControls(InputContext* inputContext, struct GameLayer2DData* pData)
{
pData->freeLookCtrls.freeLookZoomInBinding = In_FindButtonMapping(inputContext, FREE_LOOK_ZOOM_IN_BINDING_NAME);
pData->freeLookCtrls.freeLookZoomOutBinding = In_FindButtonMapping(inputContext, FREE_LOOK_ZOOM_OUT_BINDING_NAME);
pData->freeLookCtrls.freeLookZoomMoveXPosBinding = In_FindButtonMapping(inputContext, FREE_LOOK_XPOS_BINDING_NAME);
pData->freeLookCtrls.freeLookZoomMoveXNegBinding = In_FindButtonMapping(inputContext, FREE_LOOK_XNEG_BINDING_NAME);
pData->freeLookCtrls.freeLookZoomMoveYPosBinding = In_FindButtonMapping(inputContext, FREE_LOOK_YPOS_BINDING_NAME);
pData->freeLookCtrls.freeLookZoomMoveYNegBinding = In_FindButtonMapping(inputContext, FREE_LOOK_YNEG_BINDING_NAME);
pData->freeLookCtrls.freeLookCursorXAxisBinding = In_FindAxisMapping(inputContext, FREE_LOOK_CURSOR_X_BINDING_NAME);
pData->freeLookCtrls.freeLookCursorYAxisBinding = In_FindAxisMapping(inputContext, FREE_LOOK_CURSOR_Y_BINDING_NAME);
pData->freeLookCtrls.freeLookSelectButtonBinding = In_FindButtonMapping(inputContext, FREE_LOOK_CURSOR_SELECT_BINDING_NAME);
In_ActivateButtonBinding(pData->freeLookCtrls.freeLookZoomInBinding, &pData->freeLookCtrls.freeLookInputsMask);
In_ActivateButtonBinding(pData->freeLookCtrls.freeLookZoomOutBinding, &pData->freeLookCtrls.freeLookInputsMask);
In_ActivateButtonBinding(pData->freeLookCtrls.freeLookZoomMoveXPosBinding, &pData->freeLookCtrls.freeLookInputsMask);
In_ActivateButtonBinding(pData->freeLookCtrls.freeLookZoomMoveXNegBinding, &pData->freeLookCtrls.freeLookInputsMask);
In_ActivateButtonBinding(pData->freeLookCtrls.freeLookZoomMoveYPosBinding, &pData->freeLookCtrls.freeLookInputsMask);
In_ActivateButtonBinding(pData->freeLookCtrls.freeLookZoomMoveYNegBinding, &pData->freeLookCtrls.freeLookInputsMask);
In_ActivateButtonBinding(pData->freeLookCtrls.freeLookSelectButtonBinding, &pData->freeLookCtrls.freeLookInputsMask);
In_ActivateAxisBinding(pData->freeLookCtrls.freeLookCursorXAxisBinding, &pData->freeLookCtrls.freeLookInputsMask);
In_ActivateAxisBinding(pData->freeLookCtrls.freeLookCursorYAxisBinding, &pData->freeLookCtrls.freeLookInputsMask);
}