// could be method on Projector: void SetViewProjectionFromProjector(ProjectorCameraEnsemble.Projector projector) { // pick up view and projection for a given projector view = new SharpDX.Matrix(); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { view[i, j] = (float)projector.pose[i, j]; } } view.Invert(); view.Transpose(); var cameraMatrix = projector.cameraMatrix; float fx = (float)cameraMatrix[0, 0]; float fy = (float)cameraMatrix[1, 1]; float cx = (float)cameraMatrix[0, 2]; float cy = (float)cameraMatrix[1, 2]; float near = 0.1f; float far = 100.0f; float w = projector.width; float h = projector.height; projection = ProjectionMatrixFromCameraMatrix(fx, fy, cx, cy, w, h, near, far); projection.Transpose(); }
private void UpdateViewProjectionMatrix(RenderingContext renderingContext) { var camera = renderingContext.UsedCamera; var leftRightHandedCoordinateSystem = camera as ILeftRightHandedCoordinateSystem; if (leftRightHandedCoordinateSystem != null) { leftRightHandedCoordinateSystem.IsRightHandedCoordinateSystem = false; } // We also need to force the update of the camera - this will recalculate the matrices camera.Update(forceMatrixUpdate: true); // Now we can get the viewProjection matrix from the DXViewportView's camera _viewProjectionMatrix = camera.GetViewProjection(); // If the matrices in the shaders are written in default format, then we need to transpose them. // To remove the need for transpose we can define the matrices in HLSL as row_major (this is used in DXEngine's shaders, but here the original shader from SharpDX is preserved). _viewProjectionMatrix.Transpose(); // Set IsRightHandedCoordinateSystem back to standard DXEngine's settings if (leftRightHandedCoordinateSystem != null) { leftRightHandedCoordinateSystem.IsRightHandedCoordinateSystem = true; } camera.Update(forceMatrixUpdate: true); // Save frame number so we will not update _viewProjectionMatrix in this frame any more _viewProjectionMatrixFrameNumber = renderingContext.FrameNumber; }
public static void Draw(RenderContext11 renderContext, PositionColoredTextured[] points, int count, Texture11 texture, SharpDX.Direct3D.PrimitiveTopology primitiveType, float opacity = 1.0f) { if (VertexBuffer == null) { VertexBuffer = new Buffer(renderContext.Device, System.Runtime.InteropServices.Marshal.SizeOf(points[0]) * 2500, ResourceUsage.Dynamic, BindFlags.VertexBuffer, CpuAccessFlags.Write, ResourceOptionFlags.None, System.Runtime.InteropServices.Marshal.SizeOf(points[0])); VertexBufferBinding = new VertexBufferBinding(VertexBuffer, System.Runtime.InteropServices.Marshal.SizeOf((points[0])), 0); } renderContext.devContext.InputAssembler.PrimitiveTopology = primitiveType; renderContext.BlendMode = BlendMode.Alpha; renderContext.setRasterizerState(TriangleCullMode.Off); SharpDX.Matrix mat = (renderContext.World * renderContext.View * renderContext.Projection).Matrix11; mat.Transpose(); WarpOutputShader.MatWVP = mat; WarpOutputShader.Use(renderContext.devContext, texture != null, opacity); renderContext.SetVertexBuffer(VertexBufferBinding); DataBox box = renderContext.devContext.MapSubresource(VertexBuffer, 0, MapMode.WriteDiscard, MapFlags.None); Utilities.Write(box.DataPointer, points, 0, count); renderContext.devContext.UnmapSubresource(VertexBuffer, 0); if (texture != null) { renderContext.devContext.PixelShader.SetShaderResource(0, texture.ResourceView); } else { renderContext.devContext.PixelShader.SetShaderResource(0, null); } renderContext.devContext.Draw(count, 0); }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); // cache location etc for when we come out of fullscreen windowedLocation = Location; windowedSize = Size; // pick up view and projection for projector view = new SharpDX.Matrix(); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { view[i, j] = (float)projector.pose[i, j]; } } view.Invert(); view.Transpose(); var cameraMatrix = projector.cameraMatrix; float fx = (float)cameraMatrix[0, 0]; float fy = (float)cameraMatrix[1, 1]; float cx = (float)cameraMatrix[0, 2]; float cy = (float)cameraMatrix[1, 2]; float near = 0.1f; float far = 100.0f; float w = projector.width; float h = projector.height; projection = GraphicsTransforms.ProjectionMatrixFromCameraMatrix(fx, fy, cx, cy, w, h, near, far); projection.Transpose(); }
protected override void setupShader(RenderContext11 renderContext, Texture11 texture, float opacity) { SharpDX.Matrix mvp = (renderContext.World * renderContext.View * renderContext.Projection).Matrix11; mvp.Transpose(); float aspectRatio = renderContext.ViewPort.Width / renderContext.ViewPort.Height; Color4 color = new Color4(TintColor.Red, TintColor.Green, TintColor.Blue, TintColor.Alpha * opacity); // Set up the shader if (renderStrategy == RenderStrategy.GeometryShader) { PointSpriteShader11.WVPMatrix = mvp; PointSpriteShader11.Color = color; PointSpriteShader11.ViewportScale = new SharpDX.Vector2(1.0f, aspectRatio) * 0.001f; PointSpriteShader11.MinPointSize = MinPointSize; PointSpriteShader11.PointScaleFactors = PointScaleFactors; PointSpriteShader11.Use(renderContext.Device.ImmediateContext); } else { CompatibilityPointSpriteShader.WVPMatrix = mvp; CompatibilityPointSpriteShader.Color = color; CompatibilityPointSpriteShader.ViewportScale = new SharpDX.Vector2(1.0f, aspectRatio) * 0.001f; CompatibilityPointSpriteShader.PointScaleFactors = PointScaleFactors; CompatibilityPointSpriteShader.MinPointSize = MinPointSize; bool useInstancing = renderStrategy == RenderStrategy.Instanced; CompatibilityPointSpriteShader.Use(renderContext.Device.ImmediateContext, useInstancing); } // Set shader resources renderContext.Device.ImmediateContext.PixelShader.SetShaderResource(0, texture == null ? null : texture.ResourceView); }
void RenderLoop() { while (true) { lock (renderLock) { manipulator.Update(); // could just grab view matrix from manipulator rather than using event var deviceContext = device.ImmediateContext; deviceContext.InputAssembler.InputLayout = vertexInputLayout; deviceContext.InputAssembler.PrimitiveTopology = SharpDX.Direct3D.PrimitiveTopology.TriangleList; deviceContext.OutputMerger.SetTargets(depthStencilView, renderTargetView); deviceContext.OutputMerger.DepthStencilState = depthStencilState; deviceContext.Rasterizer.State = rasterizerState; deviceContext.Rasterizer.SetViewport(viewport); deviceContext.VertexShader.Set(depthAndColorVS2); deviceContext.VertexShader.SetConstantBuffer(0, constantBuffer); deviceContext.GeometryShader.Set(depthAndColorGS2); deviceContext.PixelShader.Set(depthAndColorPS2); deviceContext.PixelShader.SetSampler(0, colorSamplerState); deviceContext.ClearRenderTargetView(renderTargetView, Color4.Black); deviceContext.ClearDepthStencilView(depthStencilView, DepthStencilClearFlags.Depth, 1, 0); // render all cameras if (ensemble != null) { foreach (var camera in ensemble.cameras) { if (cameraDeviceResources.ContainsKey(camera)) { if (cameraDeviceResources[camera].renderEnabled && (camera.pose != null)) { var world = new SharpDX.Matrix(); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { world[i, j] = (float)camera.pose[i, j]; } } world.Transpose(); // view and projection matrix are post-multiply var worldViewProjection = world * view * projection; SetConstants(deviceContext, camera.calibration, worldViewProjection); cameraDeviceResources[camera].Render(deviceContext); } } } } swapChain.Present(1, PresentFlags.None); } } }
// here we update translations, scaling and rotations protected virtual void ApplyMatrix() { if (this.noMatrix) { return; } #if __SHARPDX__ Matrix4 m = Matrix4.Translation(-this.pivot.X, -this.pivot.Y, 0) * Matrix4.Scaling(this.scale.X, this.scale.Y, 1) * Matrix4.RotationZ(this.rotation) * Matrix4.Translation(this.position.X, this.position.Y, 0); #else // WARNING !!! OpenTK uses row-major while OpenGL uses column-major Matrix4 m = Matrix4.CreateTranslation(-this.pivot.X, -this.pivot.Y, 0) * #if !__MOBILE__ Matrix4.CreateScale(this.scale.X, this.scale.Y, 1) * #else Matrix4.Scale(this.scale.X, this.scale.Y, 1) * #endif Matrix4.CreateRotationZ(this.rotation) * // here we do not re-add the pivot, so translation is pivot based too Matrix4.CreateTranslation(this.position.X, this.position.Y, 0); #endif Matrix4 projectionMatrix = Window.Current.ProjectionMatrix; if (this.Camera != null) { m *= this.Camera.Matrix(); if (this.Camera.HasProjection) { projectionMatrix = this.Camera.ProjectionMatrix(); } } else if (Window.Current.CurrentCamera != null) { m *= Window.Current.CurrentCamera.Matrix(); if (Window.Current.CurrentCamera.HasProjection) { projectionMatrix = Window.Current.CurrentCamera.ProjectionMatrix(); } } Matrix4 mvp = m * projectionMatrix; #if __SHARPDX__ // transpose the matrix for DirectX mvp.Transpose(); #endif // pass the matrix to the shader this.shader.SetUniform("mvp", mvp); }
public override void Update(float timeTotal, float timeDelta) { //timeDelta; // Unused parameter. int width = (int)_renderTargetSize.Width; int height = (int)_renderTargetSize.Height; _view = Matrix.LookAtLH(new Vector3(0, 0, -5), new Vector3(0, 0, 0), Vector3.UnitY); _proj = Matrix.PerspectiveFovLH((float)Math.PI / 4.0f, width / (float)height, 0.1f, 100.0f); _viewProj = Matrix.Multiply(_view, _proj); _worldViewProj = Matrix.Scaling(1.0f) * Matrix.RotationX(timeTotal) * Matrix.RotationY(timeTotal * 2.0f) * Matrix.RotationZ(timeTotal * .7f) * _viewProj; _worldViewProj.Transpose(); }
public void Draw(RenderContext11 renderContext, float opacity, Color color) { if (glyphCache == null || glyphCache.Version > glyphVersion) { PrepareBatch(); } Color col = Color.FromArgb((int)(color.A * opacity), (int)(color.R * opacity), (int)(color.G * opacity), (int)(color.B * opacity)); SimpleGeometryShader11.Color = col; SharpDX.Matrix mat = (renderContext.World * renderContext.View * renderContext.Projection).Matrix11; mat.Transpose(); SimpleGeometryShader11.WVPMatrix = mat; renderContext.setRasterizerState(TriangleCullMode.CullCounterClockwise); BlendMode bm = renderContext.BlendMode; DepthStencilMode dm = renderContext.DepthStencilMode; //renderContext.DepthStencilMode = DepthStencilMode.ZReadOnly; renderContext.BlendMode = BlendMode.Alpha; SimpleGeometryShader11.Use(renderContext.devContext); renderContext.MainTexture = glyphCache.Texture; // Debug to get Glyhph textures and caches // SharpDX.Direct3D11.Texture2D.ToFile(renderContext.devContext, glyphCache.Texture.Texture, SharpDX.Direct3D11.ImageFileFormat.Png, "c:\\temp\\texture2.png"); renderContext.devContext.InputAssembler.PrimitiveTopology = SharpDX.Direct3D.PrimitiveTopology.TriangleList; renderContext.SetVertexBuffer(vertexBuffer); renderContext.devContext.Draw(vertexBuffer.Count, 0); renderContext.DepthStencilMode = dm; renderContext.BlendMode = bm; //dump cache // glyphCache.SaveToXML("c:\\temp\\glyphCache.xml"); }
void SetViewProjectionFromCamera(ProjectorCameraEnsemble.Camera camera) { view = new SharpDX.Matrix(); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { view[i, j] = (float)camera.pose[i, j]; } } view.Invert(); view.Transpose(); float aspect = (float)videoPanel1.Width / (float)videoPanel1.Height; projection = PerspectiveFov(35.0f / 180.0f * (float)Math.PI, aspect, 0.1f, 100.0f); projection.Transpose(); }
public override void Update(float timeTotal, float timeDelta) { //timeDelta; // Unused parameter. int width = (int)_renderTargetSize.Width; int height = (int)_renderTargetSize.Height; _view = Matrix.LookAtLH(new Vector3(0, 0, -5), new Vector3(0, 0, 0), Vector3.UnitY); _proj = Matrix.PerspectiveFovLH((float)Math.PI / 4.0f, width / (float)height, 0.1f, 100.0f); _viewProj = Matrix.Multiply(_view, _proj); _worldViewProj = Matrix.Scaling(1.0f) * Matrix.RotationX(timeTotal) * Matrix.RotationY(timeTotal * 2.0f) * Matrix.RotationZ(timeTotal * .7f) * _viewProj; _worldViewProj.Transpose(); }
void RenderLoop() { while (true) { lock (renderLock) { var deviceContext = device.ImmediateContext; // render user view deviceContext.ClearRenderTargetView(userViewRenderTargetView, Color4.Black); deviceContext.ClearDepthStencilView(userViewDepthStencilView, DepthStencilClearFlags.Depth, 1, 0); SharpDX.Vector3 headPosition = new SharpDX.Vector3(0f, 1.1f, -1.4f); // may need to change this default if (localHeadTrackingEnabled) { float distanceSquared = 0; lock (headCameraSpacePointLock) { headPosition = new SharpDX.Vector3(headCameraSpacePoint.X, headCameraSpacePoint.Y, headCameraSpacePoint.Z); float dx = handLeftCameraSpacePoint.X - handRightCameraSpacePoint.X; float dy = handLeftCameraSpacePoint.Y - handRightCameraSpacePoint.Y; float dz = handLeftCameraSpacePoint.Z - handRightCameraSpacePoint.Z; distanceSquared = dx * dx + dy * dy + dz * dz; } var transform = SharpDX.Matrix.RotationY((float)Math.PI) * SharpDX.Matrix.Translation(-0.25f, 0.45f, 0); headPosition = SharpDX.Vector3.TransformCoordinate(headPosition, transform); if (trackingValid && (distanceSquared < 0.02f) && (alpha > 1)) { alpha = 0; } //Console.WriteLine(distanceSquared); } var userView = GraphicsTransforms.LookAt(headPosition, headPosition + SharpDX.Vector3.UnitZ, SharpDX.Vector3.UnitY); userView.Transpose(); //Console.WriteLine("headPosition = " + headPosition); float aspect = (float)userViewTextureWidth / (float)userViewTextureHeight; var userProjection = GraphicsTransforms.PerspectiveFov(55.0f / 180.0f * (float)Math.PI, aspect, 0.001f, 1000.0f); userProjection.Transpose(); // smooth depth images foreach (var camera in ensemble.cameras) { var cameraDeviceResource = cameraDeviceResources[camera]; if (cameraDeviceResource.depthImageChanged) { fromUIntPS.Render(deviceContext, cameraDeviceResource.depthImageTextureRV, cameraDeviceResource.floatDepthImageRenderTargetView); for (int i = 0; i < 1; i++) { bilateralFilter.Render(deviceContext, cameraDeviceResource.floatDepthImageRV, cameraDeviceResource.floatDepthImageRenderTargetView2); bilateralFilter.Render(deviceContext, cameraDeviceResource.floatDepthImageRV2, cameraDeviceResource.floatDepthImageRenderTargetView); } cameraDeviceResource.depthImageChanged = false; } } // wobble effect if (wobbleEffectEnabled) { foreach (var camera in ensemble.cameras) { var cameraDeviceResource = cameraDeviceResources[camera]; var world = new SharpDX.Matrix(); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { world[i, j] = (float)camera.pose[i, j]; } } world.Transpose(); // view and projection matrix are post-multiply var userWorldViewProjection = world * userView * userProjection; depthAndColorShader.SetConstants(deviceContext, camera.calibration, userWorldViewProjection); depthAndColorShader.Render(deviceContext, cameraDeviceResource.floatDepthImageRV, cameraDeviceResource.colorImageTextureRV, cameraDeviceResource.vertexBuffer, userViewRenderTargetView, userViewDepthStencilView, userViewViewport); } } // 3d object if (threeDObjectEnabled) { var world = SharpDX.Matrix.Scaling(1.0f) * SharpDX.Matrix.RotationY(90.0f / 180.0f * (float)Math.PI) * SharpDX.Matrix.RotationX(-40.0f / 180.0f * (float)Math.PI) * SharpDX.Matrix.Translation(0, 0.7f, 0.0f); var pointLight = new PointLight(); pointLight.position = new Vector3(0, 2, 0); pointLight.Ia = new Vector3(0.1f, 0.1f, 0.1f); meshShader.SetVertexShaderConstants(deviceContext, world, userView * userProjection, pointLight.position); meshShader.Render(deviceContext, meshDeviceResources, pointLight, userViewRenderTargetView, userViewDepthStencilView, userViewViewport); } // wobble effect if (wobbleEffectEnabled) { alpha += 0.05f; if (alpha > 1) { radialWobbleShader.SetConstants(deviceContext, 0); } else { radialWobbleShader.SetConstants(deviceContext, alpha); } radialWobbleShader.Render(deviceContext, userViewSRV, filteredUserViewRenderTargetView); } // desktop duplication if (desktopDuplicationEnabled) { var outputDuplicateFrameInformation = default(OutputDuplicateFrameInformation); SharpDX.DXGI.Resource resource = null; outputDuplication.AcquireNextFrame(1000, out outputDuplicateFrameInformation, out resource); var texture = resource.QueryInterface <Texture2D>(); var rect = new RECT(); GetWindowRect(windowPtr, out rect); var sourceRegion = new ResourceRegion() { Left = rect.Left + leftNudge, Right = rect.Right + rightNudge, Top = rect.Top + topNudge, Bottom = rect.Bottom + bottomNudge, Front = 0, Back = 1, }; deviceContext.CopySubresourceRegion(texture, 0, sourceRegion, desktopTexture, 0); texture.Dispose(); } // render user view to seperate form passThroughShader.viewport = new Viewport(0, 0, userViewForm.Width, userViewForm.Height); // TODO: clean this up by simply using a pointer to the userViewSRV if (threeDObjectEnabled) { passThroughShader.Render(deviceContext, userViewSRV, userViewForm.renderTargetView); } if (wobbleEffectEnabled) { passThroughShader.Render(deviceContext, filteredUserViewSRV, userViewForm.renderTargetView); } if (desktopDuplicationEnabled) { passThroughShader.Render(deviceContext, desktopTextureSRV, userViewForm.renderTargetView); } userViewForm.swapChain.Present(0, PresentFlags.None); // projection puts x and y in [-1,1]; adjust to obtain texture coordinates [0,1] // TODO: put this in SetContants? userProjection[0, 0] /= 2; userProjection[1, 1] /= -2; // y points down userProjection[2, 0] += 0.5f; userProjection[2, 1] += 0.5f; // projection mapping for each projector foreach (var form in projectorForms) { deviceContext.ClearRenderTargetView(form.renderTargetView, Color4.Black); deviceContext.ClearDepthStencilView(form.depthStencilView, DepthStencilClearFlags.Depth, 1, 0); foreach (var camera in ensemble.cameras) { var cameraDeviceResource = cameraDeviceResources[camera]; var world = new SharpDX.Matrix(); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { world[i, j] = (float)camera.pose[i, j]; } } world.Transpose(); var projectorWorldViewProjection = world * form.view * form.projection; var userWorldViewProjection = world * userView * userProjection; projectiveTexturingShader.SetConstants(deviceContext, userWorldViewProjection, projectorWorldViewProjection); // TODO: clean this up by simply using a pointer to the userViewSRV if (wobbleEffectEnabled) { projectiveTexturingShader.Render(deviceContext, cameraDeviceResource.floatDepthImageRV, filteredUserViewSRV, cameraDeviceResource.vertexBuffer, form.renderTargetView, form.depthStencilView, form.viewport); } if (threeDObjectEnabled) { projectiveTexturingShader.Render(deviceContext, cameraDeviceResource.floatDepthImageRV, userViewSRV, cameraDeviceResource.vertexBuffer, form.renderTargetView, form.depthStencilView, form.viewport); } if (desktopDuplicationEnabled) { projectiveTexturingShader.Render(deviceContext, cameraDeviceResource.floatDepthImageRV, desktopTextureSRV, cameraDeviceResource.vertexBuffer, form.renderTargetView, form.depthStencilView, form.viewport); } } form.swapChain.Present(1, PresentFlags.None); } if (desktopDuplicationEnabled) { outputDuplication.ReleaseFrame(); } Console.WriteLine(stopwatch.ElapsedMilliseconds); stopwatch.Restart(); } } }
/// <summary> /// The Least-Squares Conformal Mapping method, see (Levy et al. 2002) /// Performs linear mapping with free boundary /// </summary> /// <param name="meshIn">input mesh, after solving its texture coordinates in vertex traits will be adjusted</param> /// <param name="meshOut">an flattened output mesh with only X,Y coordinates set, Z is set to 0</param> private void LSCM(TriangleMesh meshin, out TriangleMesh meshout) { /// copy mesh for output meshout = meshin.Copy(); /// provide uv's for fixed 2 points var b = new double[] { this.P1UV.X, this.P1UV.Y, // u1,v1 this.P2UV.X, this.P2UV.Y, // u2,v2 }; /// get counts int n = meshout.Vertices.Count; int m = meshout.Faces.Count; /// output uv-coordinates var bu = new double[n]; var bv = new double[n]; var b0 = new double[n]; var A1 = new TripletMatrix(2 * m, 2 * n - 4, 6 * 2 * m); var A2 = new TripletMatrix(2 * m, 4, 4 * 2 * m); foreach (var face in meshin.Faces) { var v1_global = face.Vertices.ElementAt(0).Traits.Position; var v2_global = face.Vertices.ElementAt(1).Traits.Position; var v3_global = face.Vertices.ElementAt(2).Traits.Position; var xDir = v2_global - v1_global; var skewedZDir = v3_global - v1_global; var yDir = Vector3.Cross(xDir, skewedZDir); xDir.Normalize(); yDir.Normalize(); var zDir = Vector3.Cross(yDir, xDir); var transform = new Matrix(new[] { xDir.X, xDir.Y, xDir.Z, 0, yDir.X, yDir.Y, yDir.Z, 0, zDir.X, zDir.Y, zDir.Z, 0, 0, 0, 0, 1, }); transform.Transpose(); var v1 = Vector3.Transform(v1_global, transform); var v2 = Vector3.Transform(v2_global, transform); var v3 = Vector3.Transform(v3_global, transform); var areaTriangle = ((double)v1.X * v2.Z - (double)v1.Z * v2.X) + ((double)v2.X * v3.Z - (double)v2.Z * v3.X) + ((double)v3.X * v1.Z - (double)v3.Z * v1.X); var mImaginary = new Vector3(v3.Z - v2.Z, v1.Z - v3.Z, v2.Z - v1.Z) * (float)(1d / areaTriangle); var mReal = new Vector3(v3.X - v2.X, v1.X - v3.X, v2.X - v1.X) * (float)(1d / areaTriangle); var subIndex = 0; // Expected x layout : u1 v1 u2 v2...ui vi ui+2 vi+2...uj vj uj+2 vj+2...un vn foreach (var vertex in face.Vertices) { if (vertex.Index == P1Index || vertex.Index == P2Index) { var entryIndex = vertex.Index == P1Index ? 0 : 1; // -R*MT * u (dx,dy) A2.Entry(2 * face.Index, 2 * entryIndex, -mReal[subIndex]); A2.Entry(2 * face.Index + 1, 2 * entryIndex, -mImaginary[subIndex]); // MT * v (dx,dy) A2.Entry(2 * face.Index, 2 * entryIndex + 1, mImaginary[subIndex]); A2.Entry(2 * face.Index + 1, 2 * entryIndex + 1, -mReal[subIndex]); } else { var entryIndex = AdaptedIndexFor(vertex.Index); // -R*MT * u (dx,dy) A1.Entry(2 * face.Index, 2 * entryIndex, mReal[subIndex]); A1.Entry(2 * face.Index + 1, 2 * entryIndex, mImaginary[subIndex]); // MT * v (dx,dy) A1.Entry(2 * face.Index, 2 * entryIndex + 1, -mImaginary[subIndex]); A1.Entry(2 * face.Index + 1, 2 * entryIndex + 1, mReal[subIndex]); } subIndex++; } } double[] bPrime; A2.Compress().Ax(b, out bPrime); var solver = QR.Create(A1.Compress()); solver.Solve(bPrime); for (var vertIndex = 0; vertIndex < n; vertIndex++) { if (vertIndex == P1Index) { bu[vertIndex] = P1UV[0]; bv[vertIndex] = P1UV[1]; } else if (vertIndex == P2Index) { bu[vertIndex] = P2UV[0]; bv[vertIndex] = P2UV[1]; } else { var adaptedIndex = AdaptedIndexFor(vertIndex); bu[vertIndex] = bPrime[2 * adaptedIndex]; bv[vertIndex] = bPrime[2 * adaptedIndex + 1]; } } /// update mesh positions and uv's MeshLaplacian.UpdateMesh(meshout, bu, bv, b0, bu, bv); MeshLaplacian.UpdateMesh(meshin, bu, bv); }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); // cache location etc for when we come out of fullscreen windowedLocation = Location; windowedSize = Size; // pick up view and projection for projector view = new SharpDX.Matrix(); for (int i = 0; i < 4; i++) for (int j = 0; j < 4; j++) view[i, j] = (float)projector.pose[i, j]; view.Invert(); view.Transpose(); var cameraMatrix = projector.cameraMatrix; float fx = (float)cameraMatrix[0, 0]; float fy = (float)cameraMatrix[1, 1]; float cx = (float)cameraMatrix[0, 2]; float cy = (float)cameraMatrix[1, 2]; float near = 0.1f; float far = 100.0f; float w = projector.width; float h = projector.height; projection = GraphicsTransforms.ProjectionMatrixFromCameraMatrix(fx, fy, cx, cy, w, h, near, far); projection.Transpose(); }
void RenderLoop() { while (true) { lock (renderLock) { var deviceContext = device.ImmediateContext; // render user view deviceContext.ClearDepthStencilView(userViewDepthStencilView, DepthStencilClearFlags.Depth, 1, 0); SharpDX.Vector3 headPosition = new SharpDX.Vector3(0f, 1.1f, -1.4f); // may need to change this default var userView = GraphicsTransforms.LookAt(headPosition, headPosition + SharpDX.Vector3.UnitZ, SharpDX.Vector3.UnitY); userView.Transpose(); float aspect = (float)userViewTextureWidth / (float)userViewTextureHeight; var userProjection = GraphicsTransforms.PerspectiveFov(55.0f / 180.0f * (float)Math.PI, aspect, 0.001f, 1000.0f); userProjection.Transpose(); // smooth depth images foreach (var camera in ensemble.cameras) { var cameraDeviceResource = cameraDeviceResources[camera]; if (cameraDeviceResource.depthImageChanged) { fromUIntPS.Render(deviceContext, cameraDeviceResource.depthImageTextureRV, cameraDeviceResource.floatDepthImageRenderTargetView); bilateralFilter.Render(deviceContext, cameraDeviceResource.floatDepthImageRV, cameraDeviceResource.floatDepthImageRenderTargetView2); bilateralFilter.Render(deviceContext, cameraDeviceResource.floatDepthImageRV2, cameraDeviceResource.floatDepthImageRenderTargetView); cameraDeviceResource.depthImageChanged = false; } } // projection puts x and y in [-1,1]; adjust to obtain texture coordinates [0,1] // TODO: put this in SetContants? userProjection[0, 0] /= 2; userProjection[1, 1] /= -2; // y points down userProjection[2, 0] += 0.5f; userProjection[2, 1] += 0.5f; // projection mapping for each projector foreach (var form in projectorForms) { deviceContext.ClearRenderTargetView(form.renderTargetView, Color4.Black); deviceContext.ClearDepthStencilView(form.depthStencilView, DepthStencilClearFlags.Depth, 1, 0); foreach (var camera in ensemble.cameras) { var cameraDeviceResource = cameraDeviceResources[camera]; // Copy camera pose var world = new SharpDX.Matrix(); for (int i = 0; i < 4; i++) for (int j = 0; j < 4; j++) world[i, j] = (float)camera.pose[i, j]; world.Transpose(); var projectorWorldViewProjection = world * form.view * form.projection; var userWorldViewProjection = world * userView * userProjection; projectiveTexturingShader.SetConstants(deviceContext, userWorldViewProjection, projectorWorldViewProjection, clock.Elapsed); projectiveTexturingShader.Render(deviceContext, cameraDeviceResource.floatDepthImageRV, cameraDeviceResource.vertexBuffer, form.renderTargetView, form.depthStencilView, form.viewport); } form.swapChain.Present(1, PresentFlags.None); } //Console.WriteLine(stopwatch.ElapsedMilliseconds); stopwatch.Restart(); } } }
void RenderLoop() { while (true) { lock (renderLock) { var deviceContext = device.ImmediateContext; // render user view deviceContext.ClearRenderTargetView(userViewRenderTargetView, Color4.Black); deviceContext.ClearDepthStencilView(userViewDepthStencilView, DepthStencilClearFlags.Depth, 1, 0); SharpDX.Vector3 headPosition = new SharpDX.Vector3(0f, 1.1f, -1.4f); // may need to change this default if (localHeadTrackingEnabled) { float distanceSquared = 0; lock (headCameraSpacePointLock) { headPosition = new SharpDX.Vector3(headCameraSpacePoint.X, headCameraSpacePoint.Y, headCameraSpacePoint.Z); float dx = handLeftCameraSpacePoint.X - handRightCameraSpacePoint.X; float dy = handLeftCameraSpacePoint.Y - handRightCameraSpacePoint.Y; float dz = handLeftCameraSpacePoint.Z - handRightCameraSpacePoint.Z; distanceSquared = dx * dx + dy * dy + dz * dz; } var transform = SharpDX.Matrix.RotationY((float)Math.PI) * SharpDX.Matrix.Translation(0, 0.45f, 0); headPosition = SharpDX.Vector3.TransformCoordinate(headPosition, transform); if (trackingValid && (distanceSquared < 0.02f) && (alpha > 1)) { alpha = 0; } //Console.WriteLine(distanceSquared); } var userView = GraphicsTransforms.LookAt(headPosition, headPosition + SharpDX.Vector3.UnitZ, SharpDX.Vector3.UnitY); userView.Transpose(); //Console.WriteLine("headPosition = " + headPosition); float aspect = (float)userViewTextureWidth / (float)userViewTextureHeight; var userProjection = GraphicsTransforms.PerspectiveFov(55.0f / 180.0f * (float)Math.PI, aspect, 0.001f, 1000.0f); userProjection.Transpose(); // smooth depth images foreach (var camera in ensemble.cameras) { var cameraDeviceResource = cameraDeviceResources[camera]; if (cameraDeviceResource.depthImageChanged) { fromUIntPS.Render(deviceContext, cameraDeviceResource.depthImageTextureRV, cameraDeviceResource.floatDepthImageRenderTargetView); for (int i = 0; i < 1; i++) { bilateralFilter.Render(deviceContext, cameraDeviceResource.floatDepthImageRV, cameraDeviceResource.floatDepthImageRenderTargetView2); bilateralFilter.Render(deviceContext, cameraDeviceResource.floatDepthImageRV2, cameraDeviceResource.floatDepthImageRenderTargetView); } cameraDeviceResource.depthImageChanged = false; } } // wobble effect if (wobbleEffectEnabled) { foreach (var camera in ensemble.cameras) { var cameraDeviceResource = cameraDeviceResources[camera]; var world = new SharpDX.Matrix(); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { world[i, j] = (float)camera.pose[i, j]; } } world.Transpose(); // view and projection matrix are post-multiply var userWorldViewProjection = world * userView * userProjection; depthAndColorShader.SetConstants(deviceContext, camera.calibration, userWorldViewProjection); depthAndColorShader.Render(deviceContext, cameraDeviceResource.floatDepthImageRV, cameraDeviceResource.colorImageTextureRV, cameraDeviceResource.vertexBuffer, userViewRenderTargetView, userViewDepthStencilView, userViewViewport); } } // 3d object if (threeDObjectEnabled) { var world = SharpDX.Matrix.Scaling(1.0f) * SharpDX.Matrix.RotationY(90.0f / 180.0f * (float)Math.PI) * SharpDX.Matrix.RotationX(-40.0f / 180.0f * (float)Math.PI) * SharpDX.Matrix.Translation(0, 0.7f, 0.0f); var pointLight = new PointLight(); pointLight.position = new Vector3(0, 2, 0); pointLight.Ia = new Vector3(0.1f, 0.1f, 0.1f); meshShader.SetVertexShaderConstants(deviceContext, world, userView * userProjection, pointLight.position); meshShader.Render(deviceContext, meshDeviceResources, pointLight, userViewRenderTargetView, userViewDepthStencilView, userViewViewport); } // wobble effect if (wobbleEffectEnabled) { alpha += 0.05f; if (alpha > 1) { radialWobbleShader.SetConstants(deviceContext, 0); } else { radialWobbleShader.SetConstants(deviceContext, alpha); } radialWobbleShader.Render(deviceContext, userViewSRV, filteredUserViewRenderTargetView); } // desktop duplication if (desktopDuplicationEnabled) { // update the desktop texture; this will block until there is some change var outputDuplicateFrameInformation = default(OutputDuplicateFrameInformation); SharpDX.DXGI.Resource resource = null; outputDuplication.AcquireNextFrame(1000, out outputDuplicateFrameInformation, out resource); var texture = resource.QueryInterface <Texture2D>(); // pick up the window under the cursor var cursorPos = new POINT(); GetCursorPos(out cursorPos); var hwnd = WindowFromPoint(cursorPos); var rect = new RECT(); GetWindowRect(hwnd, out rect); // adjust bounds so falls within source texture if (rect.Left < 0) { rect.Left = 0; } if (rect.Top < 0) { rect.Top = 0; } if (rect.Right > texture.Description.Width - 1) { rect.Right = texture.Description.Width; } if (rect.Bottom > texture.Description.Height - 1) { rect.Bottom = texture.Description.Height; } int width = rect.Right - rect.Left; int height = rect.Bottom - rect.Top; // resize our texture if necessary if ((desktopTexture == null) || (desktopTexture.Description.Width != width) || (desktopTexture.Description.Height != height)) { if (desktopTexture != null) { desktopTextureSRV.Dispose(); desktopTexture.Dispose(); } var desktopTextureDesc = new Texture2DDescription() { Width = width, Height = height, MipLevels = 1, // revisit this; we may benefit from mipmapping? ArraySize = 1, Format = SharpDX.DXGI.Format.B8G8R8A8_UNorm, SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0), Usage = ResourceUsage.Default, BindFlags = BindFlags.ShaderResource, CpuAccessFlags = CpuAccessFlags.None, }; desktopTexture = new Texture2D(device, desktopTextureDesc); desktopTextureSRV = new ShaderResourceView(device, desktopTexture); } // copy the winodw region into our texture var sourceRegion = new ResourceRegion() { Left = rect.Left, Right = rect.Right, Top = rect.Top, Bottom = rect.Bottom, Front = 0, Back = 1, }; deviceContext.CopySubresourceRegion(texture, 0, sourceRegion, desktopTexture, 0); texture.Dispose(); } // render user view to seperate form passThroughShader.viewport = new Viewport(0, 0, userViewForm.videoPanel1.Width, userViewForm.videoPanel1.Height); // TODO: clean this up by simply using a pointer to the userViewSRV if (threeDObjectEnabled) { passThroughShader.Render(deviceContext, userViewSRV, userViewForm.renderTargetView); } if (wobbleEffectEnabled) { passThroughShader.Render(deviceContext, filteredUserViewSRV, userViewForm.renderTargetView); } if (desktopDuplicationEnabled) { passThroughShader.Render(deviceContext, desktopTextureSRV, userViewForm.renderTargetView); } userViewForm.swapChain.Present(0, PresentFlags.None); // projection puts x and y in [-1,1]; adjust to obtain texture coordinates [0,1] // TODO: put this in SetContants? userProjection[0, 0] /= 2; userProjection[1, 1] /= -2; // y points down userProjection[2, 0] += 0.5f; userProjection[2, 1] += 0.5f; // projection mapping for each projector foreach (var form in projectorForms) { deviceContext.ClearRenderTargetView(form.renderTargetView, Color4.Black); deviceContext.ClearDepthStencilView(form.depthStencilView, DepthStencilClearFlags.Depth, 1, 0); foreach (var camera in ensemble.cameras) { var cameraDeviceResource = cameraDeviceResources[camera]; var world = new SharpDX.Matrix(); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { world[i, j] = (float)camera.pose[i, j]; } } world.Transpose(); var projectorWorldViewProjection = world * form.view * form.projection; var userWorldViewProjection = world * userView * userProjection; projectiveTexturingShader.SetConstants(deviceContext, userWorldViewProjection, projectorWorldViewProjection); // TODO: clean this up by simply using a pointer to the userViewSRV if (wobbleEffectEnabled) { projectiveTexturingShader.Render(deviceContext, cameraDeviceResource.floatDepthImageRV, filteredUserViewSRV, cameraDeviceResource.vertexBuffer, form.renderTargetView, form.depthStencilView, form.viewport); } if (threeDObjectEnabled) { projectiveTexturingShader.Render(deviceContext, cameraDeviceResource.floatDepthImageRV, userViewSRV, cameraDeviceResource.vertexBuffer, form.renderTargetView, form.depthStencilView, form.viewport); } if (desktopDuplicationEnabled) { projectiveTexturingShader.Render(deviceContext, cameraDeviceResource.floatDepthImageRV, desktopTextureSRV, cameraDeviceResource.vertexBuffer, form.renderTargetView, form.depthStencilView, form.viewport); } } form.swapChain.Present(1, PresentFlags.None); } if (desktopDuplicationEnabled) { outputDuplication.ReleaseFrame(); } //Console.WriteLine(stopwatch.ElapsedMilliseconds); stopwatch.Restart(); } } }
void RenderLoop() { while (true) { lock (renderLock) { var deviceContext = device.ImmediateContext; // render user view deviceContext.ClearDepthStencilView(userViewDepthStencilView, DepthStencilClearFlags.Depth, 1, 0); SharpDX.Vector3 headPosition = new SharpDX.Vector3(0f, 1.1f, -1.4f); // may need to change this default var userView = GraphicsTransforms.LookAt(headPosition, headPosition + SharpDX.Vector3.UnitZ, SharpDX.Vector3.UnitY); userView.Transpose(); float aspect = (float)userViewTextureWidth / (float)userViewTextureHeight; var userProjection = GraphicsTransforms.PerspectiveFov(55.0f / 180.0f * (float)Math.PI, aspect, 0.001f, 1000.0f); userProjection.Transpose(); // smooth depth images foreach (var camera in ensemble.cameras) { var cameraDeviceResource = cameraDeviceResources[camera]; if (cameraDeviceResource.depthImageChanged) { fromUIntPS.Render(deviceContext, cameraDeviceResource.depthImageTextureRV, cameraDeviceResource.floatDepthImageRenderTargetView); bilateralFilter.Render(deviceContext, cameraDeviceResource.floatDepthImageRV, cameraDeviceResource.floatDepthImageRenderTargetView2); bilateralFilter.Render(deviceContext, cameraDeviceResource.floatDepthImageRV2, cameraDeviceResource.floatDepthImageRenderTargetView); cameraDeviceResource.depthImageChanged = false; } } // projection puts x and y in [-1,1]; adjust to obtain texture coordinates [0,1] // TODO: put this in SetContants? userProjection[0, 0] /= 2; userProjection[1, 1] /= -2; // y points down userProjection[2, 0] += 0.5f; userProjection[2, 1] += 0.5f; // projection mapping for each projector foreach (var form in projectorForms) { deviceContext.ClearRenderTargetView(form.renderTargetView, Color4.Black); deviceContext.ClearDepthStencilView(form.depthStencilView, DepthStencilClearFlags.Depth, 1, 0); foreach (var camera in ensemble.cameras) { var cameraDeviceResource = cameraDeviceResources[camera]; // Copy camera pose var world = new SharpDX.Matrix(); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { world[i, j] = (float)camera.pose[i, j]; } } world.Transpose(); var projectorWorldViewProjection = world * form.view * form.projection; var userWorldViewProjection = world * userView * userProjection; projectiveTexturingShader.SetConstants(deviceContext, userWorldViewProjection, projectorWorldViewProjection, clock.Elapsed); projectiveTexturingShader.Render(deviceContext, cameraDeviceResource.floatDepthImageRV, cameraDeviceResource.vertexBuffer, form.renderTargetView, form.depthStencilView, form.viewport); } form.swapChain.Present(1, PresentFlags.None); } //Console.WriteLine(stopwatch.ElapsedMilliseconds); stopwatch.Restart(); } } }