From 8b67a40e55caec9da4e50572a5a7498e46059a55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Wiesner?= Date: Fri, 10 Apr 2020 17:10:29 +0200 Subject: [PATCH] =?UTF-8?q?grafika-color=20kezd=C5=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DXWindow.cpp | 5 +++-- DXWindow.h | 2 +- Entity.cpp | 27 ++++++++++++++++++++++++--- Entity.h | 5 ++++- RUNTIME/shaders/basic_shader.hlsl | 8 ++++++-- const_bufs.h | 2 +- main.cpp | 19 ++++++++++++++++--- 7 files changed, 55 insertions(+), 13 deletions(-) diff --git a/DXWindow.cpp b/DXWindow.cpp index 98c2b5e..043dd24 100644 --- a/DXWindow.cpp +++ b/DXWindow.cpp @@ -388,14 +388,15 @@ namespace eg3d { void DXWindow::createRootSignature() { // root paraméterek létrehozása - CD3DX12_ROOT_PARAMETER slotParams[1]; + CD3DX12_ROOT_PARAMETER slotParams[2]; // TODO worldMatrix konstansbufferének hozzáadása // konstansbuffer-TÍPUS beállítása slotParams[0].InitAsConstantBufferView(0); + slotParams[1].InitAsConstantBufferView(1); - CD3DX12_ROOT_SIGNATURE_DESC rsD(1, &slotParams[0], 0, nullptr, D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT); + CD3DX12_ROOT_SIGNATURE_DESC rsD(2, &slotParams[0], 0, nullptr, D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT); ComPtr serializedRS = nullptr, errorBlob = nullptr; if (FAILED(D3D12SerializeRootSignature(&rsD, D3D_ROOT_SIGNATURE_VERSION_1, serializedRS.GetAddressOf(), errorBlob.GetAddressOf()))) diff --git a/DXWindow.h b/DXWindow.h index d2a35cd..20b48e2 100644 --- a/DXWindow.h +++ b/DXWindow.h @@ -82,7 +82,7 @@ namespace eg3d { // TODO konstansbuffer példány és DX-objektum ComPtr cbResource; // konstansbuffer DX-objektuma - ConstantBuffer constantBuffer; // konstansbuffer + CB_Frame constantBuffer; // konstansbuffer // virtuális kamera Cam * pCam; diff --git a/Entity.cpp b/Entity.cpp index 193ad24..22e38d2 100644 --- a/Entity.cpp +++ b/Entity.cpp @@ -5,17 +5,20 @@ #include "Entity.h" eg3d::Entity::Entity(const ComPtr &device) : Geometry(device) { + createConstantBuffer(); loadDefaults(); } eg3d::Entity::Entity(const Entity& other): Geometry(other.device) { + createConstantBuffer(); setEntitySRT(other.getEntitySRT()); } void eg3d::Entity::loadDefaults() { - XMStoreFloat4x4(&mWorldMatrix, XMMatrixIdentity()); // egységmátrix betöltése a világ-mátrixba + 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) { @@ -30,16 +33,34 @@ eg3d::SRTProps eg3d::Entity::getEntitySRT() const { void eg3d::Entity::draw(ComPtr commandList) const { // TODO konstansbuffer becsatolása + commandList->SetGraphicsRootConstantBufferView(1, mConstBufRes->GetGPUVirtualAddress()); + + Geometry::draw(commandList); } void eg3d::Entity::constructWorldMatrix() { // TODO (Cam alapján) - // XMMATRIX w = s * r * t - // XMStoreFloat4x4(...) + 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 + bufferMapCopy(mConstBufRes, static_cast(&mConstBuf), sizeof(CB_Entity)); } +void eg3d::Entity::createConstantBuffer() +{ + mConstBufRes = createBuffer_UH(device, calc256AlignedSize(sizeof(CB_Entity))); +} // ---------------------- diff --git a/Entity.h b/Entity.h index eeea6fb..8d0aa6b 100644 --- a/Entity.h +++ b/Entity.h @@ -7,6 +7,7 @@ #include "Geometry.h" #include "IHasDefault.h" +#include "const_bufs.h" namespace eg3d { @@ -22,12 +23,14 @@ namespace eg3d { class Entity : public Geometry, public IHasDefault { private: - DirectX::XMFLOAT4X4 mWorldMatrix; // világ-mátrix + ComPtr mConstBufRes; // konstansbuffer erőforrás a videokártyán + CB_Entity mConstBuf; // konstansbuffer SRTProps mSRTProps; // STR-tulajdonságok void constructWorldMatrix(); // világ-mátrix újragenerálása // TODO konstansbuffer létrehozása, feltöltése + void createConstantBuffer(); // konstansbuffer létrehozása public: Entity(const ComPtr &device); explicit Entity(const Entity& other); // másolókonstruktor diff --git a/RUNTIME/shaders/basic_shader.hlsl b/RUNTIME/shaders/basic_shader.hlsl index 0e535f9..e2171d0 100644 --- a/RUNTIME/shaders/basic_shader.hlsl +++ b/RUNTIME/shaders/basic_shader.hlsl @@ -10,18 +10,22 @@ struct VSOutput // vertex shader kimeneti strukt float3 color : COLOR; }; -cbuffer CBuf : register(b0) +cbuffer CFrame : register(b0) { float4x4 transformMatrix; float4x4 viewMatrix; float4x4 projMatrix; }; +cbuffer CEntity : register(b1) +{ + float4x4 worldMatrix; +} VSOutput vs_main(VSInput input) { VSOutput output; // vertex shader kimenete - output.position_H = mul(float4(input.position_D, 1.0), mul(viewMatrix, projMatrix)); + output.position_H = mul(float4(input.position_D, 1.0), mul(worldMatrix, mul(viewMatrix, projMatrix))); output.color = float3(1.0, 1.0, 1.0); return output; diff --git a/const_bufs.h b/const_bufs.h index b71a42c..ab5fe6b 100644 --- a/const_bufs.h +++ b/const_bufs.h @@ -9,7 +9,7 @@ // konstansbuffer struktúrája // TODO refactor! -struct ConstantBuffer +struct CB_Frame { DirectX::XMFLOAT4X4 transformMatrix; DirectX::XMFLOAT4X4 viewMatrix; // nézet-mátrix diff --git a/main.cpp b/main.cpp index cd0fe6a..1b13491 100644 --- a/main.cpp +++ b/main.cpp @@ -13,6 +13,7 @@ #include "Timer.h" #include "Geometry.h" +#include "Entity.h" // FPS-mĂ©rĂ©s size_t gFrames = 0; @@ -71,6 +72,18 @@ void mouseCB(EventHandlerCBData * pCBData) LOG("Mouse clicked!"); // TODO Ăşj entitás behozása a kamera pozĂ­ciĂłjára + DXWindow * pWindow = static_cast((void *)GetWindowLongPtrA(pCBData->hwnd, GWLP_USERDATA)); + ComPtr device = pWindow->getDevice(); // device elkĂ©rĂ©se + + SRTProps srtProps; + srtProps.translation = gCam.getViewParams().position; + + // Ăşj geometria lĂ©trehozása + auto pTeapot = std::shared_ptr(new Entity(device)); + pTeapot->loadBinarySTL("assets/utahteapot.stl", ImportAdapters::IAD_SwapYZ_RH); + pTeapot->setEntitySRT(srtProps); + + gDrawables.push_back(pTeapot); } void moveForward_H(EventHandlerCBData * pCBData) @@ -125,7 +138,7 @@ void regEventHandlers(EventHandler * pEH) pEH->regKeyCB('P', keyCB, nullptr, { ET_KeyDown }); // kattintás - pEH->regMouseCB(mouseCB, nullptr, { ET_LMouseDown }); + pEH->regMouseCB(mouseCB, nullptr, { ET_RMouseDown }); // mozgás pEH->regKeyCB('W', moveForward_H, nullptr, { ET_KeyDown, ET_KeyUp }); // elĹ‘re @@ -173,11 +186,11 @@ int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszA std::vector indices = { 0, 1, 2 }; // indexek - auto pGeo = std::shared_ptr(new Geometry(win.getDevice())); + auto pGeo = std::shared_ptr(new Entity(win.getDevice())); pGeo->setVertices(vertices); pGeo->setIndices(indices); - auto pGeo2 = std::shared_ptr(new Geometry(win.getDevice())); + auto pGeo2 = std::shared_ptr(new Entity(win.getDevice())); pGeo2->loadBinarySTL("assets/dust2.stl", ImportAdapters::IAD_SwapYZ_RH); (*pGeo) += (*pGeo2);