public void SetMouseCursorVisibility(bool visible, bool changePosition = true) { if (m_oldMouseVisibilityState && visible != m_oldMouseVisibilityState) { //VRage.Trace.Trace.SendMsgLastCall(p.ToString()); //VRage.Trace.Trace.SendMsgLastCall(m_oldNonVisPos.ToString()); //VRage.Trace.Trace.SendMsgLastCall(m_oldVisPos.ToString()); m_oldVisPos = MyInput.Static.GetMousePosition(); m_oldMouseVisibilityState = visible; //m_oldNonVisPos = new Vector2(MySandboxGame.ScreenSizeHalf.X, MySandboxGame.ScreenSizeHalf.Y); // if (changePosition) // MyGuiInput.SetMousePosition((int)m_oldNonVisPos.X, (int)m_oldNonVisPos.Y); //MyGuiInput.SetMouseToScreenCenter(); } if (!m_oldMouseVisibilityState && visible != m_oldMouseVisibilityState) { //VRage.Trace.Trace.SendMsgLastCall(p.ToString()); //VRage.Trace.Trace.SendMsgLastCall(m_oldNonVisPos.ToString()); //VRage.Trace.Trace.SendMsgLastCall(m_oldVisPos.ToString()); m_oldNonVisPos = MyInput.Static.GetMousePosition(); m_oldMouseVisibilityState = visible; if (changePosition) MyInput.Static.SetMousePosition((int)m_oldVisPos.X, (int)m_oldVisPos.Y); } MySandboxGame.Static.SetMouseVisible(visible); }
internal void AddSprite(Vector2 clipOffset, Vector2 clipScale, Vector2 texOffset, Vector2 texScale, Byte4 color) { MySpritesRenderer.m_spriteInstanceList.Add(new MyVertexFormatSpritePositionTextureColor( new HalfVector4(clipOffset.X, clipOffset.Y, clipScale.X, clipScale.Y), new HalfVector4(texOffset.X, texOffset.Y, texScale.X, texScale.Y), color)); }
internal void AddSprite(Vector2 clipOffset, Vector2 clipScale, Vector2 texOffset, Vector2 texScale, Vector2 origin, Vector2 tangent, Byte4 color) { MySpritesRenderer.StackTop().m_instances.Add(new MyVertexFormatSpritePositionTextureRotationColor( new HalfVector4(clipOffset.X, clipOffset.Y, clipScale.X, clipScale.Y), new HalfVector4(texOffset.X, texOffset.Y, texScale.X, texScale.Y), new HalfVector4(origin.X, origin.Y, tangent.X, tangent.Y), color)); }
private static void InitInternal(Vector2[] vertsForMask) { m_VB = MyHwBuffers.CreateVertexBuffer(vertsForMask.Length, MyVertexFormat2DPosition.STRIDE, BindFlags.VertexBuffer, ResourceUsage.Dynamic, null, "MyStereoStencilMask.VB"); MyMapping mapping = MyMapping.MapDiscard(RC, m_VB.Buffer); mapping.WriteAndPosition(vertsForMask, 0, vertsForMask.Length); mapping.Unmap(); m_vs = MyShaders.CreateVs("Stereo/StereoStencilMask.hlsl"); m_ps = MyShaders.CreatePs("Stereo/StereoStencilMask.hlsl"); m_il = MyShaders.CreateIL(m_vs.BytecodeId, MyVertexLayouts.GetLayout(MyVertexInputComponentType.POSITION2)); }
public MyScreenshot(VRageMath.Vector2 sizeMultiplier, string saveToPath, bool ignoreSprites, bool showNotification) { MyRender.Log.WriteLine("MyScreenshot.Constructor() - START"); MyRender.Log.IncreaseIndent(); System.Diagnostics.Debug.Assert(sizeMultiplier.X > 0 && sizeMultiplier.Y > 0); m_sizeMultiplier = sizeMultiplier; IgnoreSprites = ignoreSprites; ShowNotification = showNotification; m_fullPathToSave = saveToPath; m_datetimePrefix = MyValueFormatter.GetFormatedDateTimeForFilename(DateTime.Now); MyRender.Log.DecreaseIndent(); MyRender.Log.WriteLine("MyScreenshot.Constructor() - END"); }
internal static void AddSingleSprite(string textureStr, Color color, Vector2 origin, Rectangle? sourceRect, RectangleF destinationRect) { Vector2 clipOffset; Vector2 clipScale; CalculateSpriteClipspace(destinationRect, MyRender.ViewportResolution, out clipOffset, out clipScale); var texture = MyTextureManager.GetTexture(textureStr); AddSingleSprite(texture, new MyVertexFormatSpritePositionTextureColor( new HalfVector4(clipOffset.X, clipOffset.Y, clipScale.X, clipScale.Y), new HalfVector4(0, 0, 1, 1), new Byte4(color.R, color.G, color.B, color.A))); }
internal static void AddSingleSprite(ShaderResourceView view, Vector2 textureSize, Color color, Vector2 origin, Vector2 tangent, Rectangle?sourceRect, RectangleF destinationRect) { if (StackTop().m_internalBatch.ScissorRectangle.HasValue) { RectangleF intersection; var scissor = StackTop().m_internalBatch.ScissorRectangle.Value; RectangleF.Intersect(ref scissor, ref destinationRect, out intersection); if (intersection.Size.X * intersection.Size.Y == 0) { return; } } Vector2 clipOffset; Vector2 targetResolution = StackTop().m_resolution ?? MyRender11.ResolutionF; clipOffset = destinationRect.Position / targetResolution * 2 - 1; clipOffset.Y = -clipOffset.Y; Vector2 texOffset = Vector2.Zero; Vector2 texScale = Vector2.One; Vector2 originOffset; if (sourceRect != null) { Vector2 leftTop = new Vector2(sourceRect.Value.Left, sourceRect.Value.Top); Vector2 size = new Vector2(sourceRect.Value.Width, sourceRect.Value.Height); texOffset = leftTop / textureSize; texScale = size / textureSize; originOffset = origin / new Vector2(sourceRect.Value.Width, sourceRect.Value.Height) - 0.5f; originOffset.Y *= -1; } else { originOffset = origin / textureSize - 0.5f; originOffset.Y *= -1; } AddSingleSprite(view, new MyVertexFormatSpritePositionTextureRotationColor( new HalfVector4(clipOffset.X, clipOffset.Y, destinationRect.Width, destinationRect.Height), new HalfVector4(texOffset.X, texOffset.Y, texScale.X, texScale.Y), new HalfVector4(originOffset.X, originOffset.Y, tangent.X, tangent.Y), new Byte4(color.R, color.G, color.B, color.A))); }
public void TakeScreenshot(string saveToPath = null, bool ignoreSprites = false, Vector2?sizeMultiplier = null, bool showNotification = true) { // Screenshot object survives only one DRAW after created. We delete it immediatelly. So if 'm_screenshot' // is not null we know we have to take screenshot and set it to null. //if (m_screenshot != null) // return; if (!sizeMultiplier.HasValue) { sizeMultiplier = new Vector2(MySandboxGame.Config.ScreenshotSizeMultiplier); } //var screenshot = new MyScreenShot(sizeMultiplier.Value, saveToPath, ignoreSprites, showNotification); VRageRender.MyRenderProxy.TakeScreenshot(sizeMultiplier.Value, saveToPath, false, ignoreSprites, showNotification); }
private static Vector2[] GetUndefinedMask() { // this offset represents percent of the screen, that are not displayed in the OpenVR float offset = 0.17f; Vector2 topLeft = new Vector2(-offset, 1); Vector2 topRight = new Vector2(offset, 1); Vector2 bottomLeft = new Vector2(-offset, -1); Vector2 bottomRight = new Vector2(offset, -1); Vector2[] verts = m_tmpInitUndefinedMaskVerts; verts[0] = topLeft; verts[1] = topRight; verts[2] = bottomLeft; verts[3] = bottomLeft; verts[4] = topRight; verts[5] = bottomRight; return(verts); }
private static Vector2[] GetUndefinedMask() { // this offset represents percent of the screen, that are not displayed in the OpenVR float offset = 0.17f; Vector2 topLeft = new Vector2(-offset, 1); Vector2 topRight = new Vector2(offset, 1); Vector2 bottomLeft = new Vector2(-offset, -1); Vector2 bottomRight = new Vector2(offset, -1); Vector2[] verts = m_tmpInitUndefinedMaskVerts; verts[0] = topLeft; verts[1] = topRight; verts[2] = bottomLeft; verts[3] = bottomLeft; verts[4] = topRight; verts[5] = bottomRight; return verts; }
internal static void AddSingleSprite(MyTexture2D texture, Vector2 position, Rectangle?sourceRectangle, float scale, Color color) { Vector2 clipOffset; Vector2 clipScale; RectangleF destination; if (sourceRectangle != null) { destination = new RectangleF(position.X, position.Y, scale * sourceRectangle.Value.Width, scale * sourceRectangle.Value.Height); } else { destination = new RectangleF(position.X, position.Y, scale, scale); } CalculateSpriteClipspace(destination, MyRender.ViewportResolution, out clipOffset, out clipScale); Vector2 texOffset = Vector2.Zero; Vector2 texScale = Vector2.One; if (sourceRectangle != null) { Vector2 textureSize = texture != null ? texture.Size : Vector2.Zero; Vector2 leftTop = new Vector2(sourceRectangle.Value.Left, sourceRectangle.Value.Top); Vector2 size = new Vector2(sourceRectangle.Value.Width, sourceRectangle.Value.Height); texOffset = leftTop / textureSize; texScale = size / textureSize; } AddSingleSprite(texture, new MyVertexFormatSpritePositionTextureColor( new HalfVector4(clipOffset.X, clipOffset.Y, clipScale.X, clipScale.Y), new HalfVector4(texOffset.X, texOffset.Y, texScale.X, texScale.Y), new Byte4(color.R, color.G, color.B, color.A))); }
internal static float DrawTextShadow(Vector2 screenCoord, StringBuilder text, VRageMath.Color color, float scale) { return MyRender.DebugFont.DrawString( screenCoord, color, text, scale); }
internal static void CalculateSpriteClipspace(RectangleF destination, Vector2 screenSize, out Vector2 clipOffset, out Vector2 clipScale) { Vector2 scale = destination.Size / screenSize; Vector2 translation = destination.Position / screenSize; clipScale = scale * 2; clipOffset = translation * 2 - 1; clipOffset.Y = -clipOffset.Y; clipOffset += new Vector2(0.5f, -0.5f) * clipScale; }
internal static void AddSingleSprite(MyTexture2D texture, Vector2 position, Rectangle? sourceRectangle, float scale, Color color) { Vector2 clipOffset; Vector2 clipScale; RectangleF destination; if (sourceRectangle != null) { destination = new RectangleF(position.X, position.Y, scale * sourceRectangle.Value.Width, scale * sourceRectangle.Value.Height); } else { destination = new RectangleF(position.X, position.Y, scale, scale); } CalculateSpriteClipspace(destination, MyRender.ViewportResolution, out clipOffset, out clipScale); Vector2 texOffset = Vector2.Zero; Vector2 texScale = Vector2.One; if (sourceRectangle != null) { Vector2 textureSize = texture != null ? texture.Size : Vector2.Zero; Vector2 leftTop = new Vector2(sourceRectangle.Value.Left, sourceRectangle.Value.Top); Vector2 size = new Vector2(sourceRectangle.Value.Width, sourceRectangle.Value.Height); texOffset = leftTop / textureSize; texScale = size / textureSize; } AddSingleSprite(texture, new MyVertexFormatSpritePositionTextureColor( new HalfVector4(clipOffset.X, clipOffset.Y, clipScale.X, clipScale.Y), new HalfVector4(texOffset.X, texOffset.Y, texScale.X, texScale.Y), new Byte4(color.R, color.G, color.B, color.A))); }
internal static float DrawText(Vector2 screenCoord, StringBuilder text, VRageMath.Color color, float scale, MyGuiDrawAlignEnum align = MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_TOP) { var font = MyRender11.DebugFont; return font.DrawString( MyUtils.GetCoordAligned(screenCoord, font.MeasureString(text, scale), align), color, text, scale); }
internal static void AddSingleSprite(ISrvBindable tex, Color color, Vector2 origin, Vector2 tangent, Rectangle? sourceRect, RectangleF destinationRect) { AddSingleSprite(tex, tex.Size, color, origin, tangent, sourceRect, destinationRect); }
internal static void AddSingleSprite(ShaderResourceView view, Vector2 textureSize, Color color, Vector2 origin, Vector2 tangent, Rectangle? sourceRect, RectangleF destinationRect) { if (StackTop().m_internalBatch.ScissorRectangle.HasValue) { RectangleF intersection; var scissor = StackTop().m_internalBatch.ScissorRectangle.Value; RectangleF.Intersect(ref scissor, ref destinationRect, out intersection); if (intersection.Size.X * intersection.Size.Y == 0) { return; } } Vector2 clipOffset; Vector2 targetResolution = StackTop().m_resolution ?? MyRender11.ResolutionF; clipOffset = destinationRect.Position / targetResolution * 2 - 1; clipOffset.Y = -clipOffset.Y; Vector2 texOffset = Vector2.Zero; Vector2 texScale = Vector2.One; Vector2 originOffset; if (sourceRect != null) { Vector2 leftTop = new Vector2(sourceRect.Value.Left, sourceRect.Value.Top); Vector2 size = new Vector2(sourceRect.Value.Width, sourceRect.Value.Height); texOffset = leftTop / textureSize; texScale = size / textureSize; originOffset = origin / new Vector2(sourceRect.Value.Width, sourceRect.Value.Height) - 0.5f; originOffset.Y *= -1; } else { originOffset = origin / textureSize - 0.5f; originOffset.Y *= -1; } AddSingleSprite(view, new MyVertexFormatSpritePositionTextureRotationColor( new HalfVector4(clipOffset.X, clipOffset.Y, destinationRect.Width, destinationRect.Height), new HalfVector4(texOffset.X, texOffset.Y, texScale.X, texScale.Y), new HalfVector4(originOffset.X, originOffset.Y, tangent.X, tangent.Y), new Byte4(color.R, color.G, color.B, color.A))); }
public void TakeScreenshot(string saveToPath = null, bool ignoreSprites = false, Vector2? sizeMultiplier = null, bool showNotification = true) { // Screenshot object survives only one DRAW after created. We delete it immediatelly. So if 'm_screenshot' // is not null we know we have to take screenshot and set it to null. //if (m_screenshot != null) // return; if (!sizeMultiplier.HasValue) sizeMultiplier = new Vector2(MySandboxGame.Config.ScreenshotSizeMultiplier); //var screenshot = new MyScreenShot(sizeMultiplier.Value, saveToPath, ignoreSprites, showNotification); VRageRender.MyRenderProxy.TakeScreenshot(sizeMultiplier.Value, saveToPath, false, ignoreSprites, showNotification); }
// Sends input (keyboard/mouse) to screen which has focus (top-most) public void HandleInputAfterSimulation() { if (MySession.Static != null) { bool cameraControllerMovementAllowed = MyScreenManager.GetScreenWithFocus() == MyGuiScreenGamePlay.Static && MyGuiScreenGamePlay.Static != null && !MyScreenManager.InputToNonFocusedScreens; bool lookAroundEnabled = MyInput.Static.IsGameControlPressed(MyControlsSpace.LOOKAROUND) || (MySession.Static.ControlledEntity != null && MySession.Static.ControlledEntity.PrimaryLookaround); //After respawn, the controlled object might be null bool shouldStopControlledObject = MySession.Static.ControlledEntity != null && (!cameraControllerMovementAllowed && m_cameraControllerMovementAllowed != cameraControllerMovementAllowed); bool movementAllowedInPause = MySession.Static.GetCameraControllerEnum() == MyCameraControllerEnum.Spectator || MySession.Static.GetCameraControllerEnum() == MyCameraControllerEnum.SpectatorDelta || MySession.Static.GetCameraControllerEnum() == MyCameraControllerEnum.SpectatorFixed; bool rotationAllowedInPause = movementAllowedInPause; //GK: consider removing if in the future is not different from movementAllowed bool devScreenFlag = MyScreenManager.GetScreenWithFocus() is MyGuiScreenDebugBase && !MyInput.Static.IsAnyAltKeyPressed(); MyCameraControllerEnum cce = MySession.Static.GetCameraControllerEnum(); float rollIndicator = MyInput.Static.GetRoll(); Vector2 rotationIndicator = MyInput.Static.GetRotation(); VRageMath.Vector3 moveIndicator = MyInput.Static.GetPositionDelta(); var focusScreen = MyScreenManager.GetScreenWithFocus(); if (MySandboxGame.IsPaused && focusScreen is MyGuiScreenGamePlay) { if (!movementAllowedInPause && !rotationAllowedInPause) { return; } if (!movementAllowedInPause) { moveIndicator = VRageMath.Vector3.Zero; } if (!rotationAllowedInPause || devScreenFlag) { rollIndicator = 0.0f; rotationIndicator = Vector2.Zero; } MySession.Static.CameraController.Rotate(rotationIndicator, rollIndicator); } else if (lookAroundEnabled) { if (cameraControllerMovementAllowed) { //Then move camera (because it can be dependent on control object) MySession.Static.CameraController.Rotate(rotationIndicator, rollIndicator); if (!m_lookAroundEnabled && shouldStopControlledObject) { MySession.Static.ControlledEntity.MoveAndRotateStopped(); } } if (shouldStopControlledObject) { MySession.Static.CameraController.RotateStopped(); } } //Hack to make spectators work until they are made entities else if (MySession.Static.CameraController is MySpectatorCameraController && MySpectatorCameraController.Static.SpectatorCameraMovement == MySpectatorCameraMovementEnum.ConstantDelta) { if (cameraControllerMovementAllowed) { MySpectatorCameraController.Static.MoveAndRotate(moveIndicator, rotationIndicator, rollIndicator); } } if (shouldStopControlledObject) { MySession.Static.ControlledEntity.MoveAndRotateStopped(); } m_cameraControllerMovementAllowed = cameraControllerMovementAllowed; m_lookAroundEnabled = lookAroundEnabled; } }
internal static void AddSingleSprite(ISrvBindable tex, Color color, Vector2 origin, Vector2 tangent, Rectangle?sourceRect, RectangleF destinationRect) { AddSingleSprite(tex, tex.Size, color, origin, tangent, sourceRect, destinationRect); }
public override void DebugDraw(VRageMath.Vector2 position, VRageMath.Vector2 size, List <MyBehaviorTreeNodeMemory> nodesMemory) { }
// viewport, render target internal unsafe static void Draw(IRtvBindable rtv, MyViewport viewport, IBlendState blendstate = null) { if (StackTop.m_internalBatch.Texture != null && StackTop.m_internalBatch.Count > 0) StackTop.m_internalBatch.Commit(); StackTop.m_internalBatch = new MySpritesBatch(); RC.SetPrimitiveTopology(PrimitiveTopology.TriangleStrip); RC.SetInputLayout(m_inputLayout); //RC.SetScreenViewport(); RC.SetViewport(viewport.OffsetX, viewport.OffsetY, viewport.Width, viewport.Height); RC.VertexShader.Set(m_vs); RC.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants); RC.AllShaderStages.SetConstantBuffer(MyCommon.PROJECTION_SLOT, MyCommon.GetObjectCB(64)); RC.PixelShader.Set(m_ps); RC.PixelShader.SetSamplers(0, MySamplerStateManager.StandardSamplers); //RC.BindDepthRT(null, DepthStencilAccess.DepthReadOnly, MyRender11.Backbuffer); // to reset state RC.SetRtv(rtv); RC.SetBlendState(blendstate == null ? MyBlendStateManager.BlendAlphaPremult : blendstate); RC.SetDepthStencilState(MyDepthStencilStateManager.IgnoreDepthStencil, 0); CheckBufferSize(StackTop.m_instances.Count); RC.SetVertexBuffer(0, m_VB.Buffer, m_VB.Stride); var mapping = MyMapping.MapDiscard(m_VB.Buffer); for (int i = 0; i < StackTop.m_instances.Count; i++) { var helper = StackTop.m_instances[i]; mapping.WriteAndPosition(ref helper); } mapping.Unmap(); mapping = MyMapping.MapDiscard(MyCommon.GetObjectCB(64)); var viewportSize = new Vector2(viewport.Width, viewport.Height); mapping.WriteAndPosition(ref viewportSize); mapping.Unmap(); foreach (var batch in StackTop.m_batches) { if(batch.ScissorRectangle.HasValue) { RC.SetRasterizerState(MyRasterizerStateManager.ScissorTestRasterizerState); var scissor = batch.ScissorRectangle.Value; RC.SetScissorRectangle((int)scissor.X, (int)scissor.Y, (int)(scissor.X + scissor.Width), (int)(scissor.Y + scissor.Height)); } else { RC.SetRasterizerState(MyRasterizerStateManager.NocullRasterizerState); } RC.PixelShader.SetSrv(0, batch.Texture); RC.DrawInstanced(4, batch.Count, 0, batch.Start); } RC.SetBlendState(null); RC.SetRasterizerState(null); RC.SetPrimitiveTopology(PrimitiveTopology.TriangleList); StackTop.m_instances.Clear(); StackTop.m_batches.Clear(); }
// viewport, render target internal unsafe static void Draw(IRtvBindable rtv, MyViewport viewport, IBlendState blendstate = null) { if (StackTop.m_internalBatch.Texture != null && StackTop.m_internalBatch.Count > 0) { StackTop.m_internalBatch.Commit(); } StackTop.m_internalBatch = new MySpritesBatch(); RC.SetPrimitiveTopology(PrimitiveTopology.TriangleStrip); RC.SetInputLayout(m_inputLayout); //RC.SetScreenViewport(); RC.SetViewport(viewport.OffsetX, viewport.OffsetY, viewport.Width, viewport.Height); RC.VertexShader.Set(m_vs); RC.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants); RC.AllShaderStages.SetConstantBuffer(MyCommon.PROJECTION_SLOT, MyCommon.GetObjectCB(64)); RC.PixelShader.Set(m_ps); RC.PixelShader.SetSamplers(0, MySamplerStateManager.StandardSamplers); //RC.BindDepthRT(null, DepthStencilAccess.DepthReadOnly, MyRender11.Backbuffer); // to reset state RC.SetRtv(rtv); RC.SetBlendState(blendstate == null ? MyBlendStateManager.BlendAlphaPremult : blendstate); RC.SetDepthStencilState(MyDepthStencilStateManager.IgnoreDepthStencil, 0); CheckBufferSize(StackTop.m_instances.Count); RC.SetVertexBuffer(0, m_VB); var mapping = MyMapping.MapDiscard(m_VB); for (int i = 0; i < StackTop.m_instances.Count; i++) { var helper = StackTop.m_instances[i]; mapping.WriteAndPosition(ref helper); } mapping.Unmap(); mapping = MyMapping.MapDiscard(MyCommon.GetObjectCB(64)); var viewportSize = new Vector2(viewport.Width, viewport.Height); mapping.WriteAndPosition(ref viewportSize); mapping.Unmap(); foreach (var batch in StackTop.m_batches) { if (batch.ScissorRectangle.HasValue) { RC.SetRasterizerState(MyRasterizerStateManager.ScissorTestRasterizerState); var scissor = batch.ScissorRectangle.Value; RC.SetScissorRectangle((int)scissor.X, (int)scissor.Y, (int)(scissor.X + scissor.Width), (int)(scissor.Y + scissor.Height)); } else { RC.SetRasterizerState(MyRasterizerStateManager.NocullRasterizerState); } RC.PixelShader.SetSrv(0, batch.Texture); RC.DrawInstanced(4, batch.Count, 0, batch.Start); } RC.SetBlendState(null); RC.SetRasterizerState(null); RC.SetPrimitiveTopology(PrimitiveTopology.TriangleList); StackTop.m_instances.Clear(); StackTop.m_batches.Clear(); }
// viewport, render target internal unsafe static void Draw(RenderTargetView rtv, MyViewport viewport) { if (StackTop().m_internalBatch.Texture != null && StackTop().m_internalBatch.Count > 0) StackTop().m_internalBatch.Commit(); StackTop().m_internalBatch = new MySpritesBatch(); RC.DeviceContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleStrip; RC.SetIL(m_inputLayout); //RC.SetupScreenViewport(); RC.DeviceContext.Rasterizer.SetViewport(viewport.OffsetX, viewport.OffsetY, viewport.Width, viewport.Height); RC.SetVS(m_vs); RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstants); RC.SetCB(MyCommon.PROJECTION_SLOT, MyCommon.GetObjectCB(64)); RC.SetPS(m_ps); RC.DeviceContext.PixelShader.SetSamplers(0, MyRender11.StandardSamplers); //RC.BindDepthRT(null, DepthStencilAccess.DepthReadOnly, MyRender11.Backbuffer); // to reset state RC.BindDepthRT(null, DepthStencilAccess.DepthReadOnly, null); RC.DeviceContext.OutputMerger.SetRenderTargets(rtv); RC.SetBS(MyRender11.BlendGui); CheckBufferSize(StackTop().m_instances.Count); RC.SetVB(0, m_VB.Buffer, m_VB.Stride); var mapping = MyMapping.MapDiscard(m_VB.Buffer); for (int i = 0; i < StackTop().m_instances.Count; i++) { var helper = StackTop().m_instances[i]; mapping.WriteAndPosition(ref helper); } mapping.Unmap(); mapping = MyMapping.MapDiscard(MyCommon.GetObjectCB(64)); var viewportSize = new Vector2(viewport.Width, viewport.Height); mapping.WriteAndPosition(ref viewportSize); mapping.Unmap(); foreach (var batch in StackTop().m_batches) { if(batch.ScissorRectangle.HasValue) { RC.SetRS(MyRender11.m_scissorTestRasterizerState); var scissor = batch.ScissorRectangle.Value; RC.DeviceContext.Rasterizer.SetScissorRectangle((int)scissor.X, (int)scissor.Y, (int)(scissor.X + scissor.Width), (int)(scissor.Y + scissor.Height)); } else { RC.SetRS(MyRender11.m_nocullRasterizerState); } RC.BindRawSRV(0, batch.Texture); RC.DeviceContext.DrawInstanced(4, batch.Count, 0, batch.Start); } RC.SetBS(null); RC.SetRS(null); StackTop().m_instances.Clear(); StackTop().m_batches.Clear(); }
static TexId RegisterTexture(string name, string contentPath, MyTextureEnum type, Resource resource, Vector2 size) { var nameKey = MyStringId.GetOrCompute(name); if (!NameIndex.ContainsKey(nameKey)) { var texId = NameIndex[nameKey] = new TexId { Index = Textures.Allocate() }; Textures.Data[texId.Index] = new MyTextureInfo { Name = name, ContentPath = contentPath, Type = type, Resource = resource, Size = size }; resource.DebugName = name; Views[texId.Index] = new ShaderResourceView(MyRender11.Device, resource); Views[texId.Index].DebugName = name; } else // reregistered after device reset { var id = NameIndex[nameKey]; if(Textures.Data[id.Index].Resource == null) { Textures.Data[id.Index].Resource = resource; resource.DebugName = name; Views[id.Index] = new ShaderResourceView(MyRender11.Device, resource); Views[id.Index].DebugName = name; } } return NameIndex[nameKey]; }
internal static void AddSingleSprite(TexId texId, Color color, Vector2 origin, Vector2 tangent, Rectangle?sourceRect, RectangleF destinationRect) { AddSingleSprite(MyTextures.Views[texId.Index], MyTextures.GetSize(texId), color, origin, tangent, sourceRect, destinationRect); }
internal static void PushState(Vector2 ? targetResolution = null) { FlushInternalBatch(); ++m_currentStackTop; if(m_contextsStack.Count == m_currentStackTop) { m_contextsStack.Add(new MySpritesContext()); } StackTop().m_resolution = targetResolution; }
// viewport, render target internal unsafe static void Draw(RenderTargetView rtv, MyViewport viewport) { if (StackTop().m_internalBatch.Texture != null && StackTop().m_internalBatch.Count > 0) { StackTop().m_internalBatch.Commit(); } StackTop().m_internalBatch = new MySpritesBatch(); RC.DeviceContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleStrip; RC.SetIL(m_inputLayout); //RC.SetupScreenViewport(); RC.DeviceContext.Rasterizer.SetViewport(viewport.OffsetX, viewport.OffsetY, viewport.Width, viewport.Height); RC.SetVS(m_vs); RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstants); RC.SetCB(MyCommon.PROJECTION_SLOT, MyCommon.GetObjectCB(64)); RC.SetPS(m_ps); RC.DeviceContext.PixelShader.SetSamplers(0, MyRender11.StandardSamplers); //RC.BindDepthRT(null, DepthStencilAccess.DepthReadOnly, MyRender11.Backbuffer); // to reset state RC.BindDepthRT(null, DepthStencilAccess.DepthReadOnly, null); RC.DeviceContext.OutputMerger.SetRenderTargets(rtv); RC.SetBS(MyRender11.BlendGui); CheckBufferSize(StackTop().m_instances.Count); RC.SetVB(0, m_VB.Buffer, m_VB.Stride); var mapping = MyMapping.MapDiscard(m_VB.Buffer); for (int i = 0; i < StackTop().m_instances.Count; i++) { var helper = StackTop().m_instances[i]; mapping.WriteAndPosition(ref helper); } mapping.Unmap(); mapping = MyMapping.MapDiscard(MyCommon.GetObjectCB(64)); var viewportSize = new Vector2(viewport.Width, viewport.Height); mapping.WriteAndPosition(ref viewportSize); mapping.Unmap(); foreach (var batch in StackTop().m_batches) { if (batch.ScissorRectangle.HasValue) { RC.SetRS(MyRender11.m_scissorTestRasterizerState); var scissor = batch.ScissorRectangle.Value; RC.DeviceContext.Rasterizer.SetScissorRectangle((int)scissor.X, (int)scissor.Y, (int)(scissor.X + scissor.Width), (int)(scissor.Y + scissor.Height)); } else { RC.SetRS(MyRender11.m_nocullRasterizerState); } RC.BindRawSRV(0, batch.Texture); RC.DeviceContext.DrawInstanced(4, batch.Count, 0, batch.Start); } RC.SetBS(null); RC.SetRS(null); StackTop().m_instances.Clear(); StackTop().m_batches.Clear(); }
internal static void AddSingleSprite(TexId texId, Color color, Vector2 origin, Vector2 tangent, Rectangle? sourceRect, RectangleF destinationRect) { AddSingleSprite(MyTextures.Views[texId.Index], MyTextures.GetSize(texId), color, origin, tangent, sourceRect, destinationRect); }
internal static void CalculateSpriteClipspace(RectangleF destination, Vector2 screenSize, out Vector2 clipOffset, out Vector2 clipScale) { Vector2 scale = destination.Size / screenSize; Vector2 translation = destination.Position / screenSize; clipScale = scale * 2; clipOffset = translation * 2 - 1; clipOffset.Y = -clipOffset.Y; //clipOffset += new Vector2(0.5f, -0.5f) * clipScale; }
public void TakeScreenshot(string saveToPath = null, bool ignoreSprites = false, Vector2? sizeMultiplier = null, bool showNotification = true) { }