248 lines
6.0 KiB
C++
248 lines
6.0 KiB
C++
#include <iostream>
|
|
|
|
#include <Windows.h>
|
|
|
|
// mátrixok transzponálása be
|
|
#define MT_ON
|
|
|
|
#include "utils.h"
|
|
|
|
#include "Logger.h"
|
|
|
|
#include "DXWindow.h"
|
|
|
|
#include "Timer.h"
|
|
#include "Geometry.h"
|
|
|
|
// FPS-mérés
|
|
size_t gFrames = 0;
|
|
std::string gFPS_FT_msg = "";
|
|
void CB_FPSaux(eg3d::Timer *pTimer, const double *pTrigTimeElapsed, void *ptr) {
|
|
// TODO képkockaidő és FPS kiszámítása; képkockaszámláló nullázása; eredmények kiírása
|
|
|
|
double fps = gFrames / *pTrigTimeElapsed;
|
|
gFrames = 0;
|
|
|
|
gFPS_FT_msg = std::to_string(1 / fps * 1000) + " ms, " + std::to_string(fps) + " FPS";
|
|
}
|
|
|
|
using namespace eg3d;
|
|
|
|
Cam gCam; // virtuális kamera
|
|
DrawablePool gDrawables; // geometriák halmaza
|
|
|
|
// ÁLLAPOTVÁLTOZÓK
|
|
bool gMoveForward = false;
|
|
bool gMoveBackward = false;
|
|
bool gStrafeLeft = false;
|
|
bool gStrafeRight = false;
|
|
|
|
void keyCB(EventHandlerCBData * pCBData)
|
|
{
|
|
std::string message = "Switching projection to ";
|
|
|
|
ProjParams projParams = gCam.getProjParams();
|
|
|
|
if (projParams.projType == ProjectionType::PERSPECTIVE) {
|
|
projParams.projType = ProjectionType::ORTHOGRAPHIC;
|
|
projParams.FOV_ViewHeight = 1000.0f;
|
|
message += "orthographic!";
|
|
} else
|
|
{
|
|
projParams.projType = ProjectionType::PERSPECTIVE;
|
|
projParams.FOV_ViewHeight = XM_PIDIV2; // 90°
|
|
message += "perspectivic!";
|
|
}
|
|
|
|
gCam.setProjParams(projParams);
|
|
|
|
LOG(message);
|
|
}
|
|
|
|
void resetCam_H(EventHandlerCBData * pCBData)
|
|
{
|
|
gCam.setViewParams(ViewParams());
|
|
|
|
LOG("Cam reset!");
|
|
}
|
|
|
|
void mouseCB(EventHandlerCBData * pCBData)
|
|
{
|
|
LOG("Mouse clicked!");
|
|
|
|
// TODO új entitás behozása a kamera pozíciójára
|
|
}
|
|
|
|
void moveForward_H(EventHandlerCBData * pCBData)
|
|
{
|
|
if (pCBData->eventType == ET_KeyDown)
|
|
{
|
|
gMoveForward = true;
|
|
} else if(pCBData->eventType == ET_KeyUp)
|
|
{
|
|
gMoveForward = false;
|
|
}
|
|
}
|
|
|
|
void moveBackward_H(EventHandlerCBData * pCBData)
|
|
{
|
|
if (pCBData->eventType == ET_KeyDown)
|
|
{
|
|
gMoveBackward = true;
|
|
}
|
|
else if (pCBData->eventType == ET_KeyUp)
|
|
{
|
|
gMoveBackward = false;
|
|
}
|
|
}
|
|
|
|
void strafeLeft_H(EventHandlerCBData * pCBData)
|
|
{
|
|
if (pCBData->eventType == ET_KeyDown)
|
|
{
|
|
gStrafeLeft = true;
|
|
}
|
|
else if (pCBData->eventType == ET_KeyUp)
|
|
{
|
|
gStrafeLeft = false;
|
|
}
|
|
}
|
|
|
|
void strafeRight_H(EventHandlerCBData * pCBData)
|
|
{
|
|
if (pCBData->eventType == ET_KeyDown)
|
|
{
|
|
gStrafeRight = true;
|
|
}
|
|
else if (pCBData->eventType == ET_KeyUp)
|
|
{
|
|
gStrafeRight = false;
|
|
}
|
|
}
|
|
|
|
void regEventHandlers(EventHandler * pEH)
|
|
{
|
|
pEH->regKeyCB('P', keyCB, nullptr, { ET_KeyDown });
|
|
|
|
// kattintás
|
|
pEH->regMouseCB(mouseCB, nullptr, { ET_LMouseDown });
|
|
|
|
// mozgás
|
|
pEH->regKeyCB('W', moveForward_H, nullptr, { ET_KeyDown, ET_KeyUp }); // előre
|
|
pEH->regKeyCB('S', moveBackward_H, nullptr, { ET_KeyDown, ET_KeyUp }); // hátra
|
|
pEH->regKeyCB('A', strafeLeft_H, nullptr, { ET_KeyDown, ET_KeyUp }); // balra
|
|
pEH->regKeyCB('D', strafeRight_H, nullptr, { ET_KeyDown, ET_KeyUp }); // jobbra
|
|
|
|
// kamera visszahelyezése az origóba
|
|
pEH->regKeyCB('R', resetCam_H, nullptr, { ET_KeyDown });
|
|
}
|
|
|
|
int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgs, int nWinMode) {
|
|
|
|
eg3d::DXWindow win; // megjelenítés be, alapértelmezett window procedure használata
|
|
win.setTitle("Keretszöveg"); // keretszöveg beállítása
|
|
|
|
// TODO eseménykezelő létrehozása és ablakhoz rendelése
|
|
EventHandler eventHandler;
|
|
win.setEventHandler(&eventHandler);
|
|
regEventHandlers(&eventHandler);
|
|
|
|
win.setCam(&gCam);
|
|
|
|
// vetítési paraméterek beállítása
|
|
ProjParams projParams;
|
|
projParams.projType = ProjectionType::PERSPECTIVE;
|
|
projParams.AspectRatio = win.getAspectRatio();
|
|
projParams.FOV_ViewHeight = XM_PIDIV2;
|
|
projParams.FarPlane = 10000;
|
|
projParams.NearPlane = 0.5;
|
|
|
|
gCam.setProjParams(projParams);
|
|
|
|
// FPS-mérő callback-függvény regisztrálása
|
|
TimerCallbackData timerCBData;
|
|
timerCBData.callBackFn = CB_FPSaux;
|
|
timerCBData.ptr = nullptr;
|
|
gTmr1s.reg(timerCBData);
|
|
|
|
std::vector<Vertex> vertices = { // vertexek
|
|
{ -0.5f, -0.5f, 1.0f },
|
|
{ 0.5f, -0.5f, 1.0f },
|
|
{ 0.0f, 0.98f, 1.0f },
|
|
};
|
|
|
|
std::vector<uint32_t> indices = { 0, 1, 2 }; // indexek
|
|
|
|
auto pGeo = std::shared_ptr<Geometry>(new Geometry(win.getDevice()));
|
|
pGeo->setVertices(vertices);
|
|
pGeo->setIndices(indices);
|
|
|
|
auto pGeo2 = std::shared_ptr<Geometry>(new Geometry(win.getDevice()));
|
|
pGeo2->loadBinarySTL("assets/dust2.stl", ImportAdapters::IAD_SwapYZ_RH);
|
|
|
|
(*pGeo) += (*pGeo2);
|
|
|
|
gDrawables.push_back(pGeo); // pGeo geometria hozzáadása
|
|
//drawables.push_back(pGeo);
|
|
|
|
|
|
// ------------------------------------
|
|
|
|
const float cCamVelocity = 10.0f;
|
|
const float cAngularVelocity = 0.001f;
|
|
|
|
MSG msg = { };
|
|
|
|
while (msg.message != WM_QUIT)
|
|
{
|
|
if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
} else
|
|
{
|
|
Sleep(15);
|
|
|
|
/*MouseDisplacement md = eventHandler.getMouseDisplacement();
|
|
LOG(std::string("(") + std::to_string(md.dx) + ", " + std::to_string(md.dy) + ")");*/
|
|
|
|
//LOG(std::string("forward: ") + std::to_string(gMoveForward) + ", backward: " + std::to_string(gMoveBackward));
|
|
|
|
// KAMERA MOZGATÁSA
|
|
if (gMoveForward == true) {
|
|
gCam.walk(cCamVelocity);
|
|
} else if (gMoveBackward == true) {
|
|
gCam.walk(-cCamVelocity);
|
|
}
|
|
|
|
if (gStrafeLeft == true) {
|
|
gCam.strafe(-cCamVelocity);
|
|
} else if (gStrafeRight == true) {
|
|
gCam.strafe(cCamVelocity);
|
|
}
|
|
|
|
MouseDisplacement md = eventHandler.getMouseDisplacement();
|
|
if (eventHandler.isMouseLocked()) {
|
|
gCam.pitch(md.dy * cAngularVelocity);
|
|
gCam.yaw(md.dx * cAngularVelocity);
|
|
}
|
|
|
|
auto viewParams = gCam.getViewParams();
|
|
auto position = viewParams.position;
|
|
auto pitch = viewParams.pitch * 180.0f / XM_PI;
|
|
auto yaw = viewParams.yaw * 180.0f / XM_PI;
|
|
|
|
std::string winTitle = "Open world game - P: (" + std::to_string(position.x) + "; " + std::to_string(position.y) + "; " + std::to_string(position.z) + "), " +
|
|
"yaw: " + std::to_string(yaw) + "°, pitch: " +std::to_string(pitch) + "° ---- " + gFPS_FT_msg;
|
|
win.setTitle(winTitle);
|
|
win.Draw(gDrawables); // kirajzolás
|
|
|
|
gFrames++; // képkockaszám léptetése
|
|
}
|
|
|
|
gTmr1s.tick();
|
|
}
|
|
|
|
return msg.wParam;
|
|
}
|