void VRender() override { // Set up the input assembler mRenderer->VSetPrimitiveType(GPU_PRIMITIVE_TYPE_TRIANGLE); DX3D11Renderer* dxRenderer = static_cast<DX3D11Renderer*>(mRenderer); ID3D11DeviceContext* deviceContext = dxRenderer->GetDeviceContext(); deviceContext->RSSetViewports(1, &dxRenderer->GetViewport()); switch (mBlurType) { case Rig3DSampleScene::BLUR_TYPE_NONE: RenderNoBlur(); break; case Rig3DSampleScene::BLUR_TYPE_GAUSSIAN: RenderGuassianBlur(); break; case Rig3DSampleScene::BLUR_TYPE_MOTION: RenderMotionBlur(); break; default: break; } mRenderer->VSwapBuffers(); }
void VInitialize() override { mRenderer = &DX3D11Renderer::SharedInstance(); mRenderer->SetDelegate(this); mDevice = mRenderer->GetDevice(); mDeviceContext = mRenderer->GetDeviceContext(); mBezier.p0 = vec4f(-4, -4, 0, 0); mBezier.p1 = vec4f(-4, 4, 0, 0); mBezier.p2 = vec4f(4, -4, 0, 0); mBezier.p3 = vec4f(4, 4, 0, 0); VOnResize(); InitializeGeometry(); InitializeShaders(); InitializeCamera(); }
void VRender() override { float color[4] = { 0.2f, 0.2f, 0.2f, 1.0f }; // Set up the input assembler mDeviceContext->IASetInputLayout(mInputLayout); mRenderer->VSetPrimitiveType(GPU_PRIMITIVE_TYPE_TRIANGLE); mDeviceContext->RSSetViewports(1, &mRenderer->GetViewport()); mDeviceContext->OMSetRenderTargets(1, mRenderer->GetRenderTargetView(), mRenderer->GetDepthStencilView()); mDeviceContext->ClearRenderTargetView(*mRenderer->GetRenderTargetView(), color); mDeviceContext->ClearDepthStencilView( mRenderer->GetDepthStencilView(), D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0); mDeviceContext->VSSetShader(mVertexShader, NULL, 0); mDeviceContext->PSSetShader(mPixelShader, NULL, 0); mDeviceContext->UpdateSubresource( mConstantBuffer, 0, NULL, &mMatrixBuffer, 0, 0); mDeviceContext->VSSetConstantBuffers( 0, 1, &mConstantBuffer); // Bezier mDeviceContext->UpdateSubresource(static_cast<DX11Mesh*>(mBezierMesh)->mVertexBuffer, 0, NULL, &mBezierVertices, 0, 0); mRenderer->VSetPrimitiveType(GPU_PRIMITIVE_TYPE_LINE); mRenderer->VBindMesh(mBezierMesh); mRenderer->VDrawIndexed(0, mBezierMesh->GetIndexCount()); // Handles mDeviceContext->UpdateSubresource(static_cast<DX11Mesh*>(mHandlesMesh)->mVertexBuffer, 0, NULL, &mHandlesVertices, 0, 0); mRenderer->VSetPrimitiveType(GPU_PRIMITIVE_TYPE_LINE); mRenderer->VBindMesh(mHandlesMesh); mRenderer->VDrawIndexed(0, mHandlesMesh->GetIndexCount()); // Circles mRenderer->VSetPrimitiveType(GPU_PRIMITIVE_TYPE_TRIANGLE); for (size_t i = 0; i < 4; i++) { mMatrixBuffer.mWorld = (mat4f::scale(mCircleScale) * mat4f::translate(mBezier.p[i])).transpose(); mDeviceContext->UpdateSubresource(mConstantBuffer, 0, NULL, &mMatrixBuffer, 0, 0); mRenderer->VBindMesh(mCircleMesh); mRenderer->VDrawIndexed(0, mCircleMesh->GetIndexCount()); } mRenderer->VSwapBuffers(); }
void InitializeGeometry() { // ---- Bezier // allocate a sizeof BEZIER_VERTEX_COUNT * 2 to simplify our upcoming loop. uint16_t bezierIndices[BEZIER_VERTEX_COUNT * 2]; for (size_t i = 0, j = 0; i < BEZIER_VERTEX_COUNT; i++, j += 2) { mBezierVertices[i].mColor = { 1.0f, 1.0f, 0.0f }; mBezierVertices[i].mPosition = vec3f(); bezierIndices[j] = i; bezierIndices[j + 1] = i + 1; } mMeshLibrary.NewMesh(&mBezierMesh, mRenderer); mRenderer->VSetMeshVertexBufferData(mBezierMesh, mBezierVertices, sizeof(BezierVertex) * BEZIER_VERTEX_COUNT, sizeof(BezierVertex), GPU_MEMORY_USAGE_DEFAULT); mRenderer->VSetMeshIndexBufferData(mBezierMesh, bezierIndices, BEZIER_INDEX_COUNT, GPU_MEMORY_USAGE_DEFAULT); // -- Handles uint16_t handlesIndices[HANDLES_INDEX_COUNT]; for (size_t i = 0; i < HANDLES_VERTEX_COUNT; i++) { mHandlesVertices[i].mColor = { 0.5f, 0.5f, 0.5f }; mHandlesVertices[i].mPosition = vec3f(1); handlesIndices[i] = i; } mMeshLibrary.NewMesh(&mHandlesMesh, mRenderer); mRenderer->VSetMeshVertexBufferData(mHandlesMesh, mHandlesVertices, sizeof(BezierVertex) * HANDLES_VERTEX_COUNT, sizeof(BezierVertex), GPU_MEMORY_USAGE_DEFAULT); mRenderer->VSetMeshIndexBufferData(mHandlesMesh, handlesIndices, HANDLES_INDEX_COUNT, GPU_MEMORY_USAGE_DEFAULT); // -- Circle BezierVertex circleVertices[CIRCLE_VERTEX_COUNT]; uint16_t circleIndices[CIRCLE_INDEX_COUNT]; circleVertices[0].mColor = { 0.6f, 0.6f, 0.6f }; circleVertices[0].mPosition = vec3f(); float t; auto index = 0; for (size_t i = 1; i < CIRCLE_VERTEX_COUNT; i++) { t = -static_cast<float>(i) * 2 * PI / (CIRCLE_VERTEX_COUNT - 1); circleVertices[i].mColor = { 0.6f, 0.6f, 0.6f }; circleVertices[i].mPosition = { cos(t), sin(t), 0.0f }; circleIndices[index++] = 0; circleIndices[index++] = i; circleIndices[index++] = i + 1; } circleIndices[index - 1] = 1; mMeshLibrary.NewMesh(&mCircleMesh, mRenderer); mRenderer->VSetMeshVertexBufferData(mCircleMesh, circleVertices, sizeof(BezierVertex) * CIRCLE_VERTEX_COUNT, sizeof(BezierVertex), GPU_MEMORY_USAGE_DEFAULT); mRenderer->VSetMeshIndexBufferData(mCircleMesh, circleIndices, CIRCLE_INDEX_COUNT, GPU_MEMORY_USAGE_DEFAULT); }