private void DrawingTool(DeviceContext context) { if (_renderingType == ToolRenderingType.Voxel && (_toolVoxelInstance == null || _toolVoxelModel == null || !_toolVoxelModel.Initialized)) { return; } context.ClearDepthStencilView(_d3dEngine.DepthStencilTarget, DepthStencilClearFlags.Depth, 1.0f, 0); RenderStatesRepo.ApplyStates(context, DXStates.Rasters.Default, DXStates.Blenders.Disabled, DXStates.DepthStencils.DepthReadWriteEnabled); float scale; if (_renderingType == ToolRenderingType.Cube) { scale = 0.75f; } else { var voxelBB = _toolVoxelInstance.State.BoundingBox.GetSize(); scale = MathHelper.Min(1.0f, 16 / MathHelper.Max(MathHelper.Max(voxelBB.X, voxelBB.Y), voxelBB.Z)); scale *= 1.20f; } var screenPosition = Matrix.RotationQuaternion(_animationRotation) * Matrix.RotationX(MathHelper.Pi / 8) * Matrix.Scaling(scale) * Matrix.Translation(new Vector3(1.0f, -1, -0.2f) + _animationOffset) * Matrix.Invert(_camManager.ActiveCamera.View_focused) * Matrix.Translation(_camManager.ActiveCamera.LookAt.ValueInterp * 1.8f); if (_renderingType == ToolRenderingType.Cube) { _cubeRenderer.Render(context, Matrix.Translation(0.3f, 0.3f, 0.3f) * screenPosition, _camManager.ActiveCamera.ViewProjection3D_focused, _lightColor.ValueInterp ); } if (_renderingType == ToolRenderingType.Voxel && _toolVoxelModel != null) { _voxelModelEffect.Begin(context); _voxelModelEffect.CBPerFrame.Values.ViewProjection = Matrix.Transpose(_camManager.ActiveCamera.ViewProjection3D_focused); _voxelModelEffect.CBPerFrame.IsDirty = true; _toolVoxelInstance.World = Matrix.Scaling(1f / 16) * screenPosition; _toolVoxelInstance.LightColor = _lightColor.ValueInterp; _toolVoxelModel.Draw(context, _voxelModelEffect, _toolVoxelInstance); } }
public override void Draw(SharpDX.Direct3D11.DeviceContext context, int index) { if (Display && Transform.HasValue && _toolVoxelModel != null) { RenderStatesRepo.ApplyStates(context, DXStates.Rasters.Default, DXStates.Blenders.Enabled, DXStates.DepthStencils.DepthReadEnabled); _voxelModelEffect.Begin(context); _voxelModelEffect.CBPerFrame.Values.ViewProjection = Matrix.Transpose(_cameraManager.ActiveCamera.ViewProjection3D); _voxelModelEffect.CBPerFrame.IsDirty = true; _toolVoxelInstance.World = Matrix.Scaling(1f / 16) * Transform.Value; _toolVoxelInstance.LightColor = new Color3(0.0f, 0.0f, 1f); _toolVoxelInstance.Alpha = _alpha; _toolVoxelModel.Draw(context, _voxelModelEffect, _toolVoxelInstance); } }
public Texture2D CreateVoxelIcon(VisualVoxelModel visualVoxelModel, Size2 iconSize, VoxelModelState state = null, DeviceContext context = null, Matrix transform = default(Matrix)) { if (context == null) { context = _d3DEngine.ImmediateContext; } //Create the render texture var texture = ToDispose(new RenderedTexture2D(_d3DEngine, iconSize.Width, iconSize.Height, Format.R8G8B8A8_UNorm) { BackGroundColor = new Color4(0, 0, 0, 0) }); float aspectRatio = IconSize / IconSize; Matrix projection; var fov = (float)Math.PI / 3.6f; Matrix.PerspectiveFovLH(fov, aspectRatio, 0.5f, 100f, out projection); Matrix view = Matrix.LookAtLH(new Vector3(0, 0, -1.9f), Vector3.Zero, Vector3.UnitY); texture.Begin(context); RenderStatesRepo.ApplyStates(context, DXStates.Rasters.Default, DXStates.Blenders.Enabled, DXStates.DepthStencils.DepthReadWriteEnabled); _voxelEffect.Begin(context); _voxelEffect.CBPerFrame.Values.LightDirection = Vector3.Zero; _voxelEffect.CBPerFrame.Values.ViewProjection = Matrix.Transpose(view * projection); _voxelEffect.CBPerFrame.IsDirty = true; var instance = visualVoxelModel.VoxelModel.CreateInstance(); if (state == null) { var iconState = visualVoxelModel.VoxelModel.States.FirstOrDefault(s => string.Equals(s.Name, "Icon", StringComparison.CurrentCultureIgnoreCase)); state = iconState ?? visualVoxelModel.VoxelModel.GetMainState(); } instance.SetState(state); var sphere = BoundingSphere.FromBox(state.BoundingBox); var rMax = 2f * Math.Sin(fov / 2); var size = state.BoundingBox.GetSize(); var offset = -size / 2 - state.BoundingBox.Minimum; var scale = (float)rMax / sphere.Radius; // Math.Min(scaleFactor / size.X, Math.Min(scaleFactor / size.Y, scaleFactor / size.Z)); if (transform == default(Matrix)) { instance.World = Matrix.Translation(offset) * Matrix.Scaling(scale) * Matrix.RotationY(MathHelper.Pi + MathHelper.PiOver4) * Matrix.RotationX(-MathHelper.Pi / 5); } else { instance.World = transform; } visualVoxelModel.Draw(context, _voxelEffect, instance); texture.End(context, false); var tex2D = texture.CloneTexture(context, ResourceUsage.Default); tex2D = DrawOuterShadow(context, texture, tex2D, iconSize.Width); _d3DEngine.SetRenderTargetsAndViewPort(context); return(tex2D); }