96 lines
2.4 KiB
C++

//
// Created by Epagris on 2020. 03. 16..
//
#include "Cam.h"
#include "utils.h"
eg3d::Cam::Cam() {
}
void eg3d::Cam::loadDefaults() {
mProjParams.loadDefaults();
mViewParams.loadDefaults();
}
const XMFLOAT4X4 &eg3d::Cam::getViewMatrix() const {
return mMView;
}
const XMFLOAT4X4 &eg3d::Cam::getProjMatrix() const {
return mMProj;
}
void eg3d::Cam::constructViewMatrix() {
XMMATRIX r = XMMatrixRotationX(mViewParams.pitch) * XMMatrixRotationY(mViewParams.yaw); // forgatások (yaw, pitch)
XMMATRIX t = XMMatrixTranslation(mViewParams.position.x, mViewParams.position.y, mViewParams.position.z); // eltolás
XMStoreFloat4x4(&mMView, MT(t*r)); // view mátrix letárolása
XMVECTOR dir = XMVectorSet(0.0f, 0.0f, -1.0f, 0.0f); // (0,0,-1) irányba néz alapból a kamera
XMStoreFloat3(&mVViewDirection, XMVector3Transform(dir, r)); // forgatott vektor kiszámítása és letárolása
}
void eg3d::Cam::constructProjMatrix() {
XMMATRIX p = XMMatrixPerspectiveFovLH(mProjParams.FOV, mProjParams.AspectRatio, mProjParams.NearPlane, mProjParams.FarPlane);
XMStoreFloat4x4(&mMProj, MT(p));
}
void eg3d::Cam::setProjParams(const eg3d::ProjParams &pp) {
mProjParams = pp;
constructProjMatrix(); // projekciós mátrix újragenerálása
}
eg3d::ProjParams eg3d::Cam::getProjParams() const {
return mProjParams;
}
void eg3d::Cam::setViewParams(const eg3d::ViewParams &vp) {
mViewParams = vp;
constructViewMatrix();
}
eg3d::ViewParams eg3d::Cam::getViewParams() const {
return mViewParams;
}
void eg3d::Cam::advance(float ds) {
XMVECTOR s = XMLoadFloat3(&mViewParams.position);
XMVECTOR dir = XMLoadFloat3(&mVViewDirection);
s = XMVectorAdd(s, XMVectorScale(dir, ds));
XMStoreFloat3(&mViewParams.position, s);
constructViewMatrix();
}
void eg3d::Cam::yaw(float dphi) {
mViewParams.yaw += dphi;
constructViewMatrix();
}
void eg3d::Cam::pitch(float drho) {
mViewParams.pitch += drho;
constructViewMatrix();
}
// -----------------------------
eg3d::ProjParams::ProjParams() {
loadDefaults();
}
void eg3d::ProjParams::loadDefaults() {
FOV = XM_PIDIV2; // 90 fokos látószög
AspectRatio = 1.0f; // 1:1-es képarány
NearPlane = 1.0f; // közeli sík
FarPlane = 10.0f;
}
eg3d::ViewParams::ViewParams() {}
void eg3d::ViewParams::loadDefaults() {
position.x = position.y = position.z = 0.0f; // (0,0,0), origó
yaw = 0.0f; // nincs forgatás
pitch = 0.0f; // nincs billentés
}