void SDFShadowDemo::BuildQuad() { // create a screen quad m_pQuad = GeometryPtr(new GeometryDX11()); const i32 NumVertexOfQuad = 4; // create the vertex element streams VertexElementDX11* pPositions = new VertexElementDX11(3, NumVertexOfQuad); pPositions->m_SemanticName = VertexElementDX11::PositionSemantic; pPositions->m_uiSemanticIndex = 0; pPositions->m_Format = DXGI_FORMAT_R32G32B32_FLOAT; pPositions->m_uiInputSlot = 0; pPositions->m_uiAlignedByteOffset = 0; pPositions->m_InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; pPositions->m_uiInstanceDataStepRate = 0; VertexElementDX11* pColors = new VertexElementDX11(4, NumVertexOfQuad); pColors->m_SemanticName = VertexElementDX11::ColorSemantic; pColors->m_uiSemanticIndex = 0; pColors->m_Format = DXGI_FORMAT_R32G32B32A32_FLOAT; pColors->m_uiInputSlot = 0; pColors->m_uiAlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; pColors->m_InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; pColors->m_uiInstanceDataStepRate = 0; m_pQuad->AddElement(pPositions); m_pQuad->AddElement(pColors); *pPositions->Get3f(0) = Vector3f(-1.0f, +1.0f, 0.0f); *pPositions->Get3f(1) = Vector3f(+1.0f, +1.0f, 0.0f); *pPositions->Get3f(2) = Vector3f(-1.0f, -1.0f, 0.0f); *pPositions->Get3f(3) = Vector3f(+1.0f, -1.0f, 0.0f); *pColors->Get4f(0) = Colors::White; *pColors->Get4f(1) = Colors::White; *pColors->Get4f(2) = Colors::White; *pColors->Get4f(3) = Colors::White; m_pQuad->AddFace(TriangleIndices(0, 1, 2)); m_pQuad->AddFace(TriangleIndices(1, 3, 2)); m_pQuad->LoadToBuffers(); }
void SDFShadowDemo::LoadGeometry() { // load mesh file Assimp::Importer imp; const aiScene* pScene = nullptr; const std::wstring meshFileNameW = L"testScene.obj"; const std::wstring meshFilePathW = FileSystem::getSingleton().GetModelsFolder(); const std::string meshFileFullPath = TextHelper::ToAscii(meshFilePathW + meshFileNameW); pScene = imp.ReadFile(meshFileFullPath, aiProcess_MakeLeftHanded | aiProcess_Triangulate | aiProcess_FlipWindingOrder); if (!pScene) { return; } auto count = pScene->mNumMeshes; if (count < 1) return; // load a scene into GeometryDX11 for (auto id = 0U; id < count; ++id) { auto pMesh = pScene->mMeshes[id]; auto pGeometry = GeometryPtr(new GeometryDX11()); const i32 NumVertexOfBox = pMesh->mNumVertices; // create the vertex element streams VertexElementDX11* pPositions = new VertexElementDX11(3, NumVertexOfBox); pPositions->m_SemanticName = VertexElementDX11::PositionSemantic; pPositions->m_uiSemanticIndex = 0; pPositions->m_Format = DXGI_FORMAT_R32G32B32_FLOAT; pPositions->m_uiInputSlot = 0; pPositions->m_uiAlignedByteOffset = 0; pPositions->m_InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; pPositions->m_uiInstanceDataStepRate = 0; VertexElementDX11* pColors = new VertexElementDX11(4, NumVertexOfBox); pColors->m_SemanticName = VertexElementDX11::ColorSemantic; pColors->m_uiSemanticIndex = 0; pColors->m_Format = DXGI_FORMAT_R32G32B32A32_FLOAT; pColors->m_uiInputSlot = 0; pColors->m_uiAlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; pColors->m_InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; pColors->m_uiInstanceDataStepRate = 0; pGeometry->AddElement(pPositions); pGeometry->AddElement(pColors); for (auto i = 0; i < NumVertexOfBox; ++i) { aiVector3D pos = pMesh->mVertices[i]; *pPositions->Get3f(i) = Vector3f(pos.x, pos.y, pos.z); *pColors->Get4f(i) = Colors::Green; } for (auto i = 0U; i < pMesh->mNumFaces; ++i) { aiFace face = pMesh->mFaces[i]; assert(face.mNumIndices == 3); pGeometry->AddFace(TriangleIndices(face.mIndices[0], face.mIndices[1], face.mIndices[2])); } pGeometry->LoadToBuffers(); m_vGeoms.push_back(pGeometry); } count = pScene->mRootNode->mNumChildren; for (auto i = 0U; i < count; ++i) { Matrix4f mat(true); aiNode* node = pScene->mRootNode->mChildren[i]; for (auto j = 0; j < 4; ++j) { aiMatrix4x4 trans = node->mTransformation; auto ptr = trans[j]; mat(j, 0) = ptr[0]; mat(j, 1) = ptr[1]; mat(j, 2) = ptr[2]; mat(j, 3) = ptr[3]; } mat = mat.Transpose(); m_vMats.push_back(mat); } SetupPipeline(); }