263 lines
6.6 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"
#include "Entity.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
DXWindow * pWindow = static_cast<DXWindow *>((void *)GetWindowLongPtrA(pCBData->hwnd, GWLP_USERDATA));
ComPtr<ID3D12Device> device = pWindow->getDevice(); // device elkérése
SRTProps srtProps;
srtProps.translation = gCam.getViewParams().position;
// új geometria létrehozása
auto pTeapot = std::shared_ptr<Entity>(new Entity(device));
pTeapot->loadBinarySTL("assets/utahteapot.stl", ImportAdapters::IAD_SwapYZ_RH);
pTeapot->setEntitySRT(srtProps);
pTeapot->setColor(0.8f, 0.8f, 0.1f);
gDrawables.push_back(pTeapot);
}
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_RMouseDown });
// 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<Entity>(new Entity(win.getDevice()));
pGeo->setVertices(vertices);
pGeo->setIndices(indices);
auto pGeo2 = std::shared_ptr<Entity>(new Entity(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;
}