89 lines
2.1 KiB
C++

//
// Created by Epagris on 2020. 03. 19..
//
#include "Entity.h"
eg3d::Entity::Entity(const ComPtr<ID3D12Device> &device) : Geometry(device) {
createConstantBuffer();
loadDefaults();
}
eg3d::Entity::Entity(const Entity& other): Geometry(other.device)
{
createConstantBuffer();
setEntitySRT(other.getEntitySRT());
}
void eg3d::Entity::loadDefaults() {
mConstBuf.color = { 1.0f, 1.0f, 1.0f, 1.0f };
XMStoreFloat4x4(&mConstBuf.worldMatrix, XMMatrixIdentity()); // egységmátrix betöltése a világ-mátrixba
mSRTProps.loadDefaults();
constructWorldMatrix();
}
void eg3d::Entity::setEntitySRT(const eg3d::SRTProps &srtProps) {
mSRTProps = srtProps;
constructWorldMatrix();
}
eg3d::SRTProps eg3d::Entity::getEntitySRT() const {
return mSRTProps;
}
void eg3d::Entity::draw(ComPtr<ID3D12GraphicsCommandList> commandList) const
{
// TODO konstansbuffer becsatolása
commandList->SetGraphicsRootConstantBufferView(1, mConstBufRes->GetGPUVirtualAddress());
Geometry::draw(commandList);
}
void eg3d::Entity::constructWorldMatrix() {
// TODO (Cam alapján)
auto scaling = mSRTProps.scaling;
auto rotation = mSRTProps.rotation;
auto translation = mSRTProps.translation;
XMMATRIX w = XMMatrixTranslation(translation.x, translation.y, translation.z) *
XMMatrixRotationX(rotation.x) * XMMatrixRotationY(rotation.y) * XMMatrixRotationZ(rotation.z) *
XMMatrixScaling(scaling.x, scaling.y, scaling.z);
w = XMMatrixTranspose(w);
XMStoreFloat4x4(&mConstBuf.worldMatrix, w);
// konstansbuffer felmásolása a videokártyára
updateConstantBuffer();
}
void eg3d::Entity::createConstantBuffer()
{
mConstBufRes = createBuffer_UH(device, calc256AlignedSize(sizeof(CB_Entity)));
}
void eg3d::Entity::updateConstantBuffer()
{
bufferMapCopy(mConstBufRes, static_cast<void*>(&mConstBuf), sizeof(CB_Entity));
}
void eg3d::Entity::setColor(float r, float g, float b)
{
mConstBuf.color = { r, g, b, 1.0f };
updateConstantBuffer();
}
// ----------------------
eg3d::SRTProps::SRTProps() {
loadDefaults();
}
void eg3d::SRTProps::loadDefaults() {
scaling = { 1.0f, 1.0f, 1.0f };
rotation = { 0.0f, 0.0f, 0.0f };
translation = {0.0f, 0.0f, 0.0f };
}