#include #include // 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 vertices = { // vertexek { -0.5f, -0.5f, 1.0f }, { 0.5f, -0.5f, 1.0f }, { 0.0f, 0.98f, 1.0f }, }; std::vector indices = { 0, 1, 2 }; // indexek auto pGeo = std::shared_ptr(new Geometry(win.getDevice())); pGeo->setVertices(vertices); pGeo->setIndices(indices); auto pGeo2 = std::shared_ptr(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; }