internal void PlatformApplyState(GraphicsDevice device) { if (_state == null) { // Build the description. var desc = new SharpDX.Direct3D11.BlendStateDescription(); _targetBlendState[0].GetState(ref desc.RenderTarget[0]); _targetBlendState[1].GetState(ref desc.RenderTarget[1]); _targetBlendState[2].GetState(ref desc.RenderTarget[2]); _targetBlendState[3].GetState(ref desc.RenderTarget[3]); desc.IndependentBlendEnable = _independentBlendEnable; // This is a new DX11 feature we should consider // exposing as part of the extended MonoGame API. desc.AlphaToCoverageEnable = false; // Create the state. _state = new SharpDX.Direct3D11.BlendState(GraphicsDevice._d3dDevice, desc); } Debug.Assert(GraphicsDevice == device, "The state was created for a different device!"); // NOTE: We make the assumption here that the caller has // locked the d3dContext for us to use. // Apply the state! var blendFactor = new SharpDX.Color4(_blendFactor.R / 255.0f, _blendFactor.G / 255.0f, _blendFactor.B / 255.0f, _blendFactor.A / 255.0f); device._d3dContext.OutputMerger.SetBlendState(_state, blendFactor); }
public override bool Format(string str, out object value) { value = null; SharpDX.Color4 color; if (str.StartsWith("#")) { if (GetSharpColor(str.Substring(1), out color)) { value = color; return(true); } } else { try { var c = ColorTranslator.FromHtml(str); color = new SharpDX.Color4(c.R / 255f, c.G / 255f, c.B / 255f, c.A / 255f); value = color; return(true); } catch { if (GetSharpColor(str, out color)) { value = color; return(true); } } } return(false); }
/// <summary> /// Set a four-component color that contains floating-point data. /// </summary> /// <param name="value">A reference to the first component. </param> /// <returns>Returns one of the following {{Direct3D 10 Return Codes}}. </returns> /// <unmanaged>HRESULT ID3D11EffectVectorVariable::SetFloatVector([In] float* pData)</unmanaged> public void Set(SharpDX.Color4 value) { unsafe { SetRawValue(new IntPtr(&value), 0, Utilities.SizeOf <SharpDX.Color4>()); } }
internal void ApplyState(GraphicsDevice device) { if (_state == null) { // We're now bound to a device... no one should // be changing the state of this object now! GraphicsDevice = device; // Build the description. var desc = new SharpDX.Direct3D11.BlendStateDescription(); _targetBlendState[0].GetState(ref desc.RenderTarget[0]); _targetBlendState[1].GetState(ref desc.RenderTarget[1]); _targetBlendState[2].GetState(ref desc.RenderTarget[2]); _targetBlendState[3].GetState(ref desc.RenderTarget[3]); desc.IndependentBlendEnable = _independentBlendEnable; // This is a new DX11 feature we should consider // exposing as part of the extended MonoGame API. desc.AlphaToCoverageEnable = false; // Create the state. _state = new SharpDX.Direct3D11.BlendState(GraphicsDevice._d3dDevice, desc); } Debug.Assert(GraphicsDevice == device, "The state was created for a different device!"); // NOTE: We make the assumption here that the caller has // locked the d3dContext for us to use. // Apply the state! var blendFactor = new SharpDX.Color4(_blendFactor.R / 255.0f, _blendFactor.G / 255.0f, _blendFactor.B / 255.0f, _blendFactor.A / 255.0f); device._d3dContext.OutputMerger.SetBlendState(_state, blendFactor); }
private void InitializeTriangle() { triangleVertexBuffer = SharpDX.Direct3D11.Buffer.Create <SharpDX.Vector3>(d3dDevice, SharpDX.Direct3D11.BindFlags.VertexBuffer, vertices); idexBuffer = SharpDX.Direct3D11.Buffer.Create <int>(d3dDevice, SharpDX.Direct3D11.BindFlags.IndexBuffer, indexes); constBuffer = new SharpDX.Direct3D11.Buffer(d3dDevice, SharpDX.Utilities.SizeOf <SharpDX.Color4>(), SharpDX.Direct3D11.ResourceUsage.Default, SharpDX.Direct3D11.BindFlags.ConstantBuffer, SharpDX.Direct3D11.CpuAccessFlags.None, SharpDX.Direct3D11.ResourceOptionFlags.None, 0); SharpDX.Color4 color = new SharpDX.Color4(1f, 0f, 1f, 1); d3dDeviceContext.UpdateSubresource(ref color, constBuffer); }
public void setFont(Color fontColor, string fontName, float fontSize) { this.fontColor = fontColor; this.fontName = fontName; this.fontSize = fontSize; InitFont(); }
public static string ColorToString(SharpDX.Color4 color) { var rgba = color.ToRgba(); var r = (rgba) & 255; var g = (rgba >> 8) & 255; var b = (rgba >> 16) & 255; var hex = $"#{r:X2}{g:X2}{b:X2}"; return(hex); }
public FontData(string text, RenderTarget renderTarget, Color fontColor, int x = 0, int y = 0, float fontSize = 28, string fontName = "font.ttf") { this.renderTarget = renderTarget; this.text = text; this.fontName = fontName; base.x = x; base.y = y; setFont(fontColor, fontName, fontSize); }
public Brush GetBrush(SharpDX.Color4 color) { if (this.cachedBrush == null || this.cachedBrush.IsDisposed) { this.cachedBrush = new SolidColorBrush(this.D2DRenderTarget, color); } else { this.cachedBrush.Color = color; } return(this.cachedBrush); }
private void Render(DX11RenderContext context, DX11RenderSettings settings) { if (this.spreadMax == 0) { return; } if (this.FInEnabled[0]) { float w = (float)settings.RenderWidth; float h = (float)settings.RenderHeight; SharpDX.Direct3D11.DeviceContext shaprdxContext = new SharpDX.Direct3D11.DeviceContext(context.CurrentDeviceContext.ComPointer); FontWrapper fw = this.FTextRenderer.IsConnected ? this.FTextRenderer[0][context].FontWrapper : FontWrapperFactory.GetWrapper(context, this.dwFactory); var sView = settings.View; var sProj = settings.Projection; SharpDX.Matrix view = *(SharpDX.Matrix *) & sView; SharpDX.Matrix projection = *(SharpDX.Matrix *) & sProj; var objectsettings = this.objectSettings[context]; objectsettings.IterationCount = 1; objectsettings.Geometry = null; for (int i = 0; i < this.textCache.objects.Length; i++) { SharpDX.Matrix mat = SharpDX.Matrix.Scaling(1.0f, -1.0f, 1.0f); mat = SharpDX.Matrix.Multiply(mat, view); mat = SharpDX.Matrix.Multiply(mat, projection); objectsettings.DrawCallIndex = i; objectsettings.WorldTransform = *(SlimDX.Matrix *) & mat; if (settings.ValidateObject(objectsettings)) { SlimDX.Color4 color = this.textCache.objects[i].Color; color.Alpha *= SharpDX.MathUtil.Clamp(settings.LayerOpacity, 0.0f, 1.0f); SharpDX.Color4 sdxColor = *(SharpDX.Color4 *) & color; fw.DrawTextLayout(shaprdxContext, new SharpDX.DirectWrite.TextLayout(this.textCache.objects[i].TextLayout.ComPointer), SharpDX.Vector2.Zero, mat, sdxColor, TextFlags.None); } } //Apply old states back context.RenderStateStack.Apply(); context.CleanShaderStages(); } }
public void Clear(Color color) { if (currentColorTargets == null) { throw new InvalidOperationException("No render target set for color."); } var clearColor = new SharpDX.Color4(color.R, color.G, color.B, color.A); for (int i = 0; i < currentColorTargets.Length; i++) { Context.ClearRenderTargetView(currentColorTargets[i], clearColor); } }
public static IEnumerable <Color4> GetGradients(Color4 start, Color4 end, int steps) { float stepA = ((end.Alpha - start.Alpha) / (steps - 1)); float stepR = ((end.Red - start.Red) / (steps - 1)); float stepG = ((end.Green - start.Green) / (steps - 1)); float stepB = ((end.Blue - start.Blue) / (steps - 1)); for (int i = 0; i < steps; i++) { yield return(new Color4((start.Red + (stepR * i)), (start.Green + (stepG * i)), (start.Blue + (stepB * i)), (start.Alpha + (stepA * i)))); } }
public void Apply(TextLayout layout) { if (Enabled) { var factory = FontWrapperFactory.GetFactory(); var sc = this.Color; SharpDX.Color4 c = *(SharpDX.Color4 *) & sc; colorStyle = factory.CreateColor(c); SharpDX.DirectWrite.TextLayout tl = new SharpDX.DirectWrite.TextLayout(layout.ComPointer); tl.SetDrawingEffect(colorStyle.NativePointer, new SharpDX.DirectWrite.TextRange(Range.StartPosition, Range.Length)); Marshal.Release(colorStyle.NativePointer); } }
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value == DependencyProperty.UnsetValue) { return("binding error"); } SharpDX.Color4 SharpDXColor = (SharpDX.Color4)value; var br = new SolidColorBrush(Color.FromScRgb(SharpDXColor.Alpha, SharpDXColor.Red, SharpDXColor.Green, SharpDXColor.Blue)); br.Freeze(); return(br); }
private void Build3DImage(object sender, RoutedEventArgs e) { if(_3dwindow == null) { _3dwindow = new Image3DWindow(); _3dwindow.Show(); } else { if(_3dwindow.IsVisible) _3dwindow.Close(); _3dwindow = new Image3DWindow(); _3dwindow.Show(); } _3dwindow.ResetPoints(); ColorImage image = null; if(_imageControl.ImageSource != null) { image = new ColorImage(); image.FromBitmapSource(_imageControl.ImageSource); } foreach(var point in Points3D) { SharpDX.Vector3 pos = new SharpDX.Vector3((float)point.Real.X, (float)point.Real.Y, (float)point.Real.Z); SharpDX.Color4 color = new SharpDX.Color4(1.0f); if(image != null) { if(!(point.Cam1Img.X < 0.0 || point.Cam1Img.X > image.ColumnCount || point.Cam1Img.Y < 0.0 || point.Cam1Img.Y > image.RowCount)) { color = new SharpDX.Color4( (float)image[(int)point.Cam1Img.Y, (int)point.Cam1Img.X, RGBChannel.Red], (float)image[(int)point.Cam1Img.Y, (int)point.Cam1Img.X, RGBChannel.Green], (float)image[(int)point.Cam1Img.Y, (int)point.Cam1Img.X, RGBChannel.Blue], 1.0f); } } _3dwindow.AddPointCube(pos, color); } }
public UcAlphaViewModel(Viewport3DX viewport, ServoMovedEventHandler servoMovedEventHandler = null) { this.viewport = viewport; this.servoMovedEventHandler = servoMovedEventHandler; Background = new LinearGradientBrush(Colors.Black, Colors.DarkBlue, 90); BackgroundColor = new SharpDX.Color4(0, 0, 0, 0); this.Camera = new PerspectiveCamera { LookDirection = new Media3D.Vector3D(-5.059, 1.949, -23.856), UpDirection = new Media3D.Vector3D(0.067, 0.946, 0.319), Position = new Media3D.Point3D(3.648, 5.954, 23.353) }; RenderTechniquesManager = new DefaultRenderTechniquesManager(); EffectsManager = new DefaultEffectsManager(RenderTechniquesManager); this.ModelTransform = new Media3D.TranslateTransform3D(0, 0, 0); this.ModelGeometry = new Element3DCollection(); }
private bool GetSharpColor(string str, out SharpDX.Color4 color) { color = new SharpDX.Color4(); try { int a, r, g, b; switch (str.Length) { case 3: r = int.Parse(str.Substring(0, 1), NumberStyles.HexNumber); g = int.Parse(str.Substring(1, 1), NumberStyles.HexNumber); b = int.Parse(str.Substring(2, 1), NumberStyles.HexNumber); color = new SharpDX.Color4(r / 255f, g / 255f, b / 255f, 1f); return(true); case 6: r = int.Parse(str.Substring(0, 2), NumberStyles.HexNumber); g = int.Parse(str.Substring(2, 2), NumberStyles.HexNumber); b = int.Parse(str.Substring(4, 2), NumberStyles.HexNumber); color = new SharpDX.Color4(r / 255f, g / 255f, b / 255f, 1f); return(true); case 8: a = int.Parse(str.Substring(0, 2), NumberStyles.HexNumber); r = int.Parse(str.Substring(2, 2), NumberStyles.HexNumber); g = int.Parse(str.Substring(4, 2), NumberStyles.HexNumber); b = int.Parse(str.Substring(6, 2), NumberStyles.HexNumber); color = new SharpDX.Color4(r / 255f, g / 255f, b / 255f, a / 255f); return(true); default: return(false); } } catch { return(false); } }
public void Apply(TextLayout layout) { if (Enabled) { var sc = this.Color; SharpDX.Color4 c = *(SharpDX.Color4 *) & sc; if (colorStyle == null) { var factory = FontWrapperFactory.GetFactory(); colorStyle = factory.CreateColor(c); } else { colorStyle.SetColor(c.Red, c.Green, c.Blue, c.Alpha); } SharpDX.DirectWrite.TextLayout tl = new SharpDX.DirectWrite.TextLayout(layout.ComPointer); tl.SetDrawingEffect(colorStyle.NativePointer, new SharpDX.DirectWrite.TextRange(Range.StartPosition, Range.Length)); } }
// アプリのメインループ private void Run(object sender, EventArgs e) { Application.Idle -= this.Run; // イベントが複数発生する場合があるのでそれを回避。 // シーンの描画には「現在時刻」が必要であるため、タイマを準備します。 var timer = Stopwatch.StartNew(); // FPSを計測するクラスを生成します(任意)。 var fps = new MikuMikuFlex3.Utility.FPS(); // メインループを開始します。 SharpDX.Windows.RenderLoop.Run(this, () => { // FPS を計測し、デバッグ表示します(任意)。 if (fps.FPSをカウントする()) { Debug.WriteLine($"{fps.現在のFPS} fps"); } // 既定のレンダーターゲットと既定の深度ステンシルをクリアします。 var 背景色 = new SharpDX.Color4(0.2f, 0.4f, 0.8f, 1.0f); this._D3D11Device.ImmediateContext.ClearRenderTargetView(this._既定のD3D11RenderTargetView, 背景色); this._D3D11Device.ImmediateContext.ClearDepthStencilView(this._既定のD3D11DepthStencilView, SharpDX.Direct3D11.DepthStencilClearFlags.Depth | SharpDX.Direct3D11.DepthStencilClearFlags.Stencil, 1f, 0); // 時刻を指定して、シーンを描画します。 var 現在時刻sec = timer.ElapsedMilliseconds / 1000.0; this._シーン.描画する(現在時刻sec, this._D3D11Device.ImmediateContext); // スワップチェーンを表示します。 this._DXGISwapChain.Present(0, SharpDX.DXGI.PresentFlags.None); }); }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value == null) { return((Color)ColorConverter.ConvertFromString("#00000000")); } if (value is SharpDX.Color4) { SharpDX.Color4 sdx_color = (SharpDX.Color4)value; return(new System.Windows.Media.Color { A = (byte)(sdx_color.Alpha * 255), R = (byte)(sdx_color.Red * 255), G = (byte)(sdx_color.Green * 255), B = (byte)(sdx_color.Blue * 255) }); } else { return((Color)ColorConverter.ConvertFromString("#00000000")); } }
/// <summary> /// Creates a new <see cref="SharpDX.Direct2D1.SolidColorBrush"/> that has the specified color and opacity. /// </summary> /// <param name="renderTarget">an instance of <see cref = "SharpDX.Direct2D1.RenderTarget" /></param> /// <param name="color">The red, green, blue, and alpha values of the brush's color.</param> /// <param name="brushProperties">The base opacity of the brush.</param> public SolidColorBrush(RenderTarget renderTarget, SharpDX.Color4 color, SharpDX.Direct2D1.BrushProperties?brushProperties) : base(IntPtr.Zero) { renderTarget.CreateSolidColorBrush(color, brushProperties, this); }
/// <summary> /// Creates a new <see cref="SharpDX.Direct2D1.SolidColorBrush"/> that has the specified color and opacity. /// </summary> /// <param name="renderTarget">an instance of <see cref = "SharpDX.Direct2D1.RenderTarget" /></param> /// <param name="color">The red, green, blue, and alpha values of the brush's color.</param> public SolidColorBrush(RenderTarget renderTarget, SharpDX.Color4 color) : this(renderTarget, color, null) { }
private void Render(DX11RenderContext context, DX11RenderSettings settings) { if (this.spreadMax == 0) { return; } if (this.FInEnabled[0]) { float w = (float)settings.RenderWidth; float h = (float)settings.RenderHeight; SharpDX.Direct3D11.DeviceContext shaprdxContext = new SharpDX.Direct3D11.DeviceContext(context.CurrentDeviceContext.ComPointer); FontWrapper fw = this.FTextRenderer.IsConnected ? this.FTextRenderer[0][context].FontWrapper : FontWrapperFactory.GetWrapper(context, this.dwFactory); var renderStates = fw.RenderStates; float *rawMatPtr; int transformCount; this.transformIn.GetMatrixPointer(out transformCount, out rawMatPtr); SharpDX.Matrix *matrixPointer = (SharpDX.Matrix *)rawMatPtr; SlimDX.Matrix * slimDxmatrixPointer = (SlimDX.Matrix *)rawMatPtr; bool applyState = this.FStateIn.IsConnected; var sView = settings.View; var sProj = settings.Projection; SharpDX.Matrix view = *(SharpDX.Matrix *) & sView; SharpDX.Matrix projection = *(SharpDX.Matrix *) & sProj; var objectsettings = this.objectSettings[context]; var orderedobjectsettings = this.orderedObjectSettings[context]; objectsettings.IterationCount = 1; objectsettings.Geometry = null; bool doOrder = false; List <int> orderedSlices = null; if (settings.LayerOrder != null && settings.LayerOrder.Enabled) { orderedobjectsettings.Clear(); for (int i = 0; i < this.spreadMax; i++) { DX11ObjectRenderSettings objSettings = new DX11ObjectRenderSettings(); objSettings.DrawCallIndex = i; objSettings.Geometry = null; objSettings.IterationCount = 1; objSettings.IterationIndex = 0; objSettings.WorldTransform = slimDxmatrixPointer[i % transformCount]; objSettings.RenderStateTag = null; orderedobjectsettings.Add(objSettings); } orderedSlices = settings.LayerOrder.Reorder(settings, orderedobjectsettings); doOrder = true; } int drawCount = doOrder ? orderedSlices.Count : this.spreadMax; for (int drawIdx = 0; drawIdx < drawCount; drawIdx++) { int idx = doOrder ? orderedSlices[drawIdx] : drawIdx; SharpDX.Matrix preScale = SharpDX.Matrix.Scaling(1.0f, -1.0f, 1.0f); SharpDX.Matrix sm = matrixPointer[idx % transformCount]; SharpDX.Matrix mat = SharpDX.Matrix.Multiply(preScale, sm); mat = SharpDX.Matrix.Multiply(mat, view); mat = SharpDX.Matrix.Multiply(mat, projection); SlimDX.Color4 color = this.FInColor[idx]; color.Alpha *= SharpDX.MathUtil.Clamp(settings.LayerOpacity, 0.0f, 1.0f); SharpDX.Color4 sdxColor = *(SharpDX.Color4 *) & color; objectsettings.DrawCallIndex = idx; objectsettings.WorldTransform = *(SlimDX.Matrix *) & mat; if (settings.ValidateObject(objectsettings)) { if (applyState) { var textLayout = this.FLayout[idx]; if (textLayout != null) { renderStates.SetStates(shaprdxContext, 0); context.RenderStateStack.Push(this.FStateIn[idx]); fw.DrawTextLayout(shaprdxContext, new SharpDX.DirectWrite.TextLayout(textLayout.ComPointer), SharpDX.Vector2.Zero, mat, sdxColor, TextFlags.StatePrepared); context.RenderStateStack.Pop(); } } else { var textLayout = this.FLayout[idx]; if (textLayout != null) { fw.DrawTextLayout(shaprdxContext, new SharpDX.DirectWrite.TextLayout(textLayout.ComPointer), SharpDX.Vector2.Zero, mat, sdxColor, TextFlags.None); } } } } //Apply old states back context.RenderStateStack.Apply(); context.CleanShaderStages(); } }
private void Render(DX11RenderContext context, DX11RenderSettings settings) { if (this.spreadMax == 0) { return; } if (this.FInEnabled[0]) { float w = (float)settings.RenderWidth; float h = (float)settings.RenderHeight; if (shaprdxContext == null) { shaprdxContext = new SharpDX.Direct3D11.DeviceContext(context.CurrentDeviceContext.ComPointer); } FontWrapper fw = this.FTextRenderer.IsConnected ? this.FTextRenderer[0][context].FontWrapper : FontWrapperFactory.GetWrapper(context, this.dwFactory); var renderStates = fw.RenderStates; float *rawMatPtr; int transformCount; this.transformIn.GetMatrixPointer(out transformCount, out rawMatPtr); SharpDX.Matrix *matrixPointer = (SharpDX.Matrix *)rawMatPtr; bool applyState = this.FStateIn.IsConnected; var sView = settings.View; var sProj = settings.Projection; SharpDX.Matrix view = *(SharpDX.Matrix *) & sView; SharpDX.Matrix projection = *(SharpDX.Matrix *) & sProj; var objectsettings = this.objectSettings[context]; objectsettings.IterationCount = 1; objectsettings.Geometry = null; for (int i = 0; i < this.spreadMax; i++) { SharpDX.Matrix preScale = SharpDX.Matrix.Scaling(1.0f, -1.0f, 1.0f); switch (this.FNormalizeInput[i].Index) { case 1: preScale = SharpDX.Matrix.Scaling(1.0f / w, -1.0f / w, 1.0f); break; case 2: preScale = SharpDX.Matrix.Scaling(1.0f / h, -1.0f / h, 1.0f); break; case 3: preScale = SharpDX.Matrix.Scaling(1.0f / w, -1.0f / h, 1.0f); break; } SharpDX.Matrix sm = matrixPointer[i % transformCount]; SharpDX.Matrix mat = SharpDX.Matrix.Multiply(preScale, sm); mat = SharpDX.Matrix.Multiply(mat, view); mat = SharpDX.Matrix.Multiply(mat, projection); objectsettings.DrawCallIndex = i; objectsettings.WorldTransform = *(SlimDX.Matrix *) & mat; if (settings.ValidateObject(objectsettings)) { SlimDX.Color4 color = this.FInColor[i]; color.Alpha *= SharpDX.MathUtil.Clamp(settings.LayerOpacity, 0.0f, 1.0f); SharpDX.Color4 sdxColor = *(SharpDX.Color4 *) & color; TextFlags flag = TextFlags.NoWordWrapping; if (this.FHorizontalAlignInput[i].Index == 0) { flag |= TextFlags.Left; } else if (this.FHorizontalAlignInput[i].Index == 1) { flag |= TextFlags.Center; } else if (this.FHorizontalAlignInput[i].Index == 2) { flag |= TextFlags.Right; } if (this.FVerticalAlignInput[i].Index == 0) { flag |= TextFlags.Top; } else if (this.FVerticalAlignInput[i].Index == 1) { flag |= TextFlags.VerticalCenter; } else if (this.FVerticalAlignInput[i].Index == 2) { flag |= TextFlags.Bottom; } string font = this.FFontInput[i].Name; if (applyState) { renderStates.SetStates(shaprdxContext, 0); context.RenderStateStack.Push(this.FStateIn[i]); fw.DrawString(shaprdxContext, this.FInString[i], font, this.FInSize[i], mat, sdxColor, flag | TextFlags.StatePrepared); context.RenderStateStack.Pop(); } else { fw.DrawString(shaprdxContext, this.FInString[i], font, this.FInSize[i], mat, sdxColor, flag); } } } //Apply old states back context.RenderStateStack.Apply(); context.CleanShaderStages(); } }
public FontData(string text, RenderTarget renderTarget, FontCollection fontCollection, Color fontColor, int x = 0, int y = 0, float fontSize = 28, string fontName = "font.ttf") { this.fontCollection = fontCollection; textBox = new RawRectangleF(x, y, 1280, 720); this.renderTarget = renderTarget; this.text = text; this.fontName = fontName; base.x = x; base.y = y; setFont(fontColor, fontName, fontSize); }
/// <summary> /// Creates a color formatter /// </summary> /// <param name="color">Initial color</param> /// <returns>Color formatter</returns> public ColorRGBA CreateColor(ref SharpDX.Color4 color) { return(this.CreateColor(color.ToRgba())); }
private static void ProcessMessageInternal(IMyRenderMessage message) { switch (message.MessageType) { case MyRenderMessageEnum.SetCameraViewMatrix: { var rMessage = (MyRenderMessageSetCameraViewMatrix)message; SetupCameraMatrices(rMessage); break; } case MyRenderMessageEnum.DrawScene: { var rMessage = (IMyRenderMessage)message; m_drawQueue.Enqueue(rMessage); m_messageTracker.Clear(); break; } case MyRenderMessageEnum.RebuildCullingStructure: { break; } #region Profiler case MyRenderMessageEnum.RenderProfiler: { var profMessage = (MyRenderMessageRenderProfiler)message; MyRenderProfiler.HandleInput(profMessage.Command, profMessage.Index); break; } #endregion #region Characters case MyRenderMessageEnum.CreateRenderCharacter: { var rMessage = (MyRenderMessageCreateRenderCharacter)message; var actor = MyActorFactory.CreateCharacter(); Matrix worldMatrixF = rMessage.WorldMatrix; //actor.GetRenderable().SetModel(MyAssetsLoader.GetModel(rMessage.Model)); actor.GetRenderable().SetModel(MyMeshes.GetMeshId(X.TEXT(rMessage.Model))); actor.SetMatrix(ref worldMatrixF); if (rMessage.ColorMaskHSV.HasValue) { var color = ColorFromMask(rMessage.ColorMaskHSV.Value); actor.GetRenderable().SetKeyColor(new Vector4(color, 1)); } actor.SetID(rMessage.ID); //var entity = MyComponents.CreateEntity(rMessage.ID); //MyComponents.CreateRenderable( // entity, // MyMeshes.GetMeshId(X.TEXT(rMessage.Model)), // rMessage.ColorMaskHSV.HasValue ? rMessage.ColorMaskHSV.Value : Vector3.One); //MyComponents.SetMatrix(entity, ref rMessage.WorldMatrix); break; } case MyRenderMessageEnum.SetCharacterSkeleton: { var rMessage = (MyRenderMessageSetCharacterSkeleton)message; var actor = MyIDTracker <MyActor> .FindByID(rMessage.CharacterID); if (actor != null) { actor.GetSkinning().SetSkeleton(rMessage.SkeletonBones, rMessage.SkeletonIndices); } //var entity = MyComponents.GetEntity(rMessage.CharacterID); //MyComponents.SetSkeleton(entity, rMessage.SkeletonBones, rMessage.SkeletonIndices); break; }; case MyRenderMessageEnum.SetCharacterTransforms: { var rMessage = (MyRenderMessageSetCharacterTransforms)message; var actor = MyIDTracker <MyActor> .FindByID(rMessage.CharacterID); if (actor != null) { actor.GetSkinning().SetAnimationBones(rMessage.RelativeBoneTransforms); } //var entity = MyComponents.GetEntity(rMessage.CharacterID); //MyComponents.SetAnimation(entity, rMessage.RelativeBoneTransforms); break; } case MyRenderMessageEnum.UpdateRenderEntity: { var rMessage = (MyRenderMessageUpdateRenderEntity)message; var actor = MyIDTracker <MyActor> .FindByID(rMessage.ID); if (actor != null && actor.GetRenderable() != null) { if (rMessage.ColorMaskHSV.HasValue) { actor.GetRenderable().SetKeyColor(new Vector4(ColorFromMask(rMessage.ColorMaskHSV.Value), 1)); } actor.GetRenderable().SetDithering(rMessage.Dithering); if (rMessage.Dithering < 0) { } } break; } case MyRenderMessageEnum.ChangeModelMaterial: { var rMessage = (MyRenderMessageChangeModelMaterial)message; //var matId = MyMeshMaterialId.NULL; //if (rMessage.Material.ToLower().Contains("debug")) //{ // matId = MyMeshMaterials1.DebugMaterialId; //} //else //{ // matId = MyMeshMaterials1.GetMaterialId(rMessage.Material); //} //MyAssetsLoader.GetModel(rMessage.Model).SetMaterial_SLOW(MyMeshMaterials1.GetProxyId(matId)); break; } #endregion #region Render objects case MyRenderMessageEnum.CreateRenderEntity: { var rMessage = (MyRenderMessageCreateRenderEntity)message; Matrix m = (Matrix)rMessage.WorldMatrix; var actor = MyActorFactory.CreateSceneObject(); if (rMessage.Model != null) { var model = MyAssetsLoader.ModelRemap.Get(rMessage.Model, rMessage.Model); actor.GetRenderable().SetModel(MyMeshes.GetMeshId(X.TEXT(model))); //if (MyDestructionMesh.ModelsDictionary.ContainsKey(model)) //{ // //actor.GetRenderable().SetModel(MyDestructionMesh.ModelsDictionary.Get(model)); // actor.GetRenderable().SetModel(MyMeshes.GetMeshId(X.TEXT(model))); //} //else //{ // //actor.GetRenderable().SetModel(MyAssetsLoader.GetModel(model)); // actor.GetRenderable().SetModel(MyMeshes.GetMeshId(X.TEXT(model))); //} } actor.SetID(rMessage.ID); actor.SetMatrix(ref m); break; } case MyRenderMessageEnum.CreateRenderVoxelDebris: { var rMessage = (MyRenderMessageCreateRenderVoxelDebris)message; Matrix m = (Matrix)rMessage.WorldMatrix; var actor = MyActorFactory.CreateSceneObject(); if (rMessage.Model != null) { actor.GetRenderable().SetModel(MyMeshes.GetMeshId(X.TEXT(rMessage.Model))); } actor.SetID(rMessage.ID); actor.SetMatrix(ref m); MyRenderableComponent.DebrisEntityVoxelMaterial[rMessage.ID] = rMessage.VoxelMaterialIndex; break; } case MyRenderMessageEnum.UpdateRenderObject: { var rMessage = (MyRenderMessageUpdateRenderObject)message; var actor = MyIDTracker <MyActor> .FindByID(rMessage.ID); if (actor != null) { Matrix m = (Matrix)rMessage.WorldMatrix; actor.SetMatrix(ref m); if (rMessage.AABB.HasValue) { actor.SetAabb((BoundingBox)rMessage.AABB.Value); } } var entity = MyComponents.GetEntity(rMessage.ID); if (entity != EntityId.NULL) { MyComponents.SetMatrix(entity, ref rMessage.WorldMatrix); if (rMessage.AABB.HasValue) { var aabb = rMessage.AABB.Value; MyComponents.SetAabb(entity, ref aabb); } } break; } case MyRenderMessageEnum.RemoveRenderObject: { var rMessage = (MyRenderMessageRemoveRenderObject)message; var actor = MyIDTracker <MyActor> .FindByID(rMessage.ID); if (actor != null) { if (actor.GetRenderable() != null && actor.GetRenderable().GetModel().Info.Dynamic) { MyMeshes.RemoveMesh(actor.GetRenderable().GetModel()); } actor.Destruct(); } var instancing = MyInstancing.Get(rMessage.ID); if (instancing != InstancingId.NULL) { MyInstancing.Remove(rMessage.ID, instancing); } var light = MyLights.Get(rMessage.ID); if (light != LightId.NULL) { MyLights.Remove(rMessage.ID, light); } var clipmap = MyClipmapFactory.ClipmapByID.Get(rMessage.ID); if (clipmap != null) { clipmap.RemoveFromUpdate(); } break; } case MyRenderMessageEnum.UpdateRenderObjectVisibility: { var rMessage = (MyRenderMessageUpdateRenderObjectVisibility)message; var actor = MyIDTracker <MyActor> .FindByID(rMessage.ID); if (actor != null) { actor.SetVisibility(rMessage.Visible); } break; } case MyRenderMessageEnum.CreateRenderInstanceBuffer: { var rMessage = (MyRenderMessageCreateRenderInstanceBuffer)message; //var instancing = MyComponentFactory<MyInstancingComponent>.Create(); //instancing.SetID(rMessage.ID); //instancing.Init(rMessage.Type); //instancing.SetDebugName(rMessage.DebugName); MyInstancing.Create(rMessage.ID, rMessage.Type, rMessage.DebugName); break; } case MyRenderMessageEnum.UpdateRenderInstanceBuffer: { var rMessage = (MyRenderMessageUpdateRenderInstanceBuffer)message; //var instancing = MyIDTracker<MyInstancingComponent>.FindByID(rMessage.ID); //if(instancing != null) //{ // instancing.UpdateGeneric(rMessage.InstanceData, rMessage.Capacity); //} MyInstancing.UpdateGeneric(MyInstancing.Get(rMessage.ID), rMessage.InstanceData, rMessage.Capacity); rMessage.InstanceData.Clear(); break; } case MyRenderMessageEnum.UpdateRenderCubeInstanceBuffer: { var rMessage = (MyRenderMessageUpdateRenderCubeInstanceBuffer)message; //var instancing = MyIDTracker<MyInstancingComponent>.FindByID(rMessage.ID); //if (instancing != null) //{ // instancing.UpdateCube(rMessage.InstanceData, rMessage.Capacity); //} MyInstancing.UpdateCube(MyInstancing.Get(rMessage.ID), rMessage.InstanceData, rMessage.Capacity); rMessage.InstanceData.Clear(); break; } case MyRenderMessageEnum.SetInstanceBuffer: { var rMessage = (MyRenderMessageSetInstanceBuffer)message; var actor = MyIDTracker <MyActor> .FindByID(rMessage.ID); //var instancing = MyIDTracker<MyInstancingComponent>.FindByID(rMessage.InstanceBufferId); if (actor != null) { //if (actor.GetComponent(MyActorComponentEnum.Instancing) != instancing) //{ // actor.AddComponent(instancing); //} //actor.SetLocalAabb(rMessage.LocalAabb); //actor.GetRenderable().SetInstancingCounters(rMessage.InstanceCount, rMessage.InstanceStart); actor.GetRenderable().SetInstancing(MyInstancing.Get(rMessage.InstanceBufferId)); actor.SetLocalAabb(rMessage.LocalAabb); actor.GetRenderable().SetInstancingCounters(rMessage.InstanceCount, rMessage.InstanceStart); } break; } case MyRenderMessageEnum.CreateManualCullObject: { var rMessage = (MyRenderMessageCreateManualCullObject)message; var actor = MyActorFactory.CreateGroup(); actor.SetID(rMessage.ID); Matrix m = (Matrix)rMessage.WorldMatrix; actor.SetMatrix(ref m); break; } case MyRenderMessageEnum.SetParentCullObject: { var rMessage = (MyRenderMessageSetParentCullObject)message; var child = MyIDTracker <MyActor> .FindByID(rMessage.ID); var parent = MyIDTracker <MyActor> .FindByID(rMessage.CullObjectID); if (child != null && parent != null && parent.GetGroupRoot() != null && child.GetGroupLeaf() == null) { child.SetRelativeTransform(rMessage.ChildToParent); parent.GetGroupRoot().Add(child); } break; } case MyRenderMessageEnum.CreateLineBasedObject: { var rMessage = (MyRenderMessageCreateLineBasedObject)message; var actor = MyActorFactory.CreateSceneObject(); //actor.GetRenderable().SetModel(new MyDynamicMesh()); actor.SetID(rMessage.ID); actor.SetMatrix(ref Matrix.Identity); MyMeshMaterials1.GetMaterialId("__ROPE_MATERIAL", null, "Textures/rope_cm.dds", "Textures/rope_ng.dds", "Textures/rope_add.dds", MyMesh.DEFAULT_MESH_TECHNIQUE); actor.GetRenderable().SetModel(MyMeshes.CreateRuntimeMesh(X.TEXT("LINE" + rMessage.ID), 1, true)); break; } case MyRenderMessageEnum.UpdateLineBasedObject: { var rMessage = (MyRenderMessageUpdateLineBasedObject)message; var actor = MyIDTracker <MyActor> .FindByID(rMessage.ID); if (actor != null) { //var mesh = actor.GetRenderable().GetMesh() as MyDynamicMesh; MyVertexFormatPositionH4 [] stream0; MyVertexFormatTexcoordNormalTangent [] stream1; MyLineHelpers.GenerateVertexData(ref rMessage.WorldPointA, ref rMessage.WorldPointB, out stream0, out stream1); var indices = MyLineHelpers.GenerateIndices(stream0.Length); var sections = new MySectionInfo[] { new MySectionInfo { TriCount = indices.Length / 3, IndexStart = 0, MaterialName = "__ROPE_MATERIAL" } }; MyMeshes.UpdateRuntimeMesh(MyMeshes.GetMeshId(X.TEXT("LINE" + rMessage.ID)), indices, stream0, stream1, sections, (BoundingBox)MyLineHelpers.GetBoundingBox(ref rMessage.WorldPointA, ref rMessage.WorldPointB)); //actor.SetAabb((BoundingBox)MyLineHelpers.GetBoundingBox(ref rMessage.WorldPointA, ref rMessage.WorldPointB)); actor.MarkRenderDirty(); var matrix = Matrix.CreateTranslation((Vector3)(rMessage.WorldPointA + rMessage.WorldPointB) * 0.5f); actor.SetMatrix(ref matrix); } break; } case MyRenderMessageEnum.SetRenderEntityData: { var rMessage = (MyRenderMessageSetRenderEntityData)message; Debug.Assert(false, "MyRenderMessageSetRenderEntityData is deprecated!"); break; } case MyRenderMessageEnum.AddRuntimeModel: { var rMessage = (MyRenderMessageAddRuntimeModel)message; //MyDestructionMesh mesh = MyDestructionMesh.ModelsDictionary.Get(rMessage.Name); //if (mesh == null) //{ //mesh = new MyDestructionMesh(rMessage.Name); //ProfilerShort.Begin("LoadBuffers"); //mesh.Fill(rMessage.ModelData.Indices, rMessage.ModelData.Positions, rMessage.ModelData.Normals, rMessage.ModelData.Tangents, rMessage.ModelData.TexCoords, rMessage.ModelData.Sections, rMessage.ModelData.AABB); //ProfilerShort.End(); if (!MyMeshes.Exists(rMessage.Name)) { { ushort[] indices = new ushort[rMessage.ModelData.Indices.Count]; for (int i = 0; i < rMessage.ModelData.Indices.Count; i++) { indices[i] = (ushort)rMessage.ModelData.Indices[i]; } var verticesNum = rMessage.ModelData.Positions.Count; MyVertexFormatPositionH4[] stream0 = new MyVertexFormatPositionH4[verticesNum]; MyVertexFormatTexcoordNormalTangent[] stream1 = new MyVertexFormatTexcoordNormalTangent[verticesNum]; for (int i = 0; i < verticesNum; i++) { stream0[i] = new MyVertexFormatPositionH4(rMessage.ModelData.Positions[i]); stream1[i] = new MyVertexFormatTexcoordNormalTangent( rMessage.ModelData.TexCoords[i], rMessage.ModelData.Normals[i], rMessage.ModelData.Tangents[i]); } var id = MyMeshes.CreateRuntimeMesh(X.TEXT(rMessage.Name), rMessage.ModelData.Sections.Count, false); MyMeshes.UpdateRuntimeMesh(id, indices, stream0, stream1, rMessage.ModelData.Sections.ToArray(), rMessage.ModelData.AABB); } if (rMessage.ReplacedModel != null) { //MyAssetsLoader.ModelRemap[rMessage.ReplacedModel] = rMessage.Name; MyAssetsLoader.ModelRemap[rMessage.Name] = rMessage.ReplacedModel; } //if (MyAssetsLoader.LOG_MESH_STATISTICS) //{ // mesh.DebugWriteInfo(); //} } break; } case MyRenderMessageEnum.UpdateModelProperties: { var rMessage = (MyRenderMessageUpdateModelProperties)message; var actor = MyIDTracker <MyActor> .FindByID(rMessage.ID); if (actor != null) { var key = new MyEntityMaterialKey { LOD = rMessage.LOD, Material = X.TEXT(rMessage.MaterialName) }; if (rMessage.Enabled.HasValue) { if (!MyScene.EntityDisabledMaterials.ContainsKey(rMessage.ID)) { MyScene.EntityDisabledMaterials.Add(rMessage.ID, new HashSet <MyEntityMaterialKey>()); } if (!rMessage.Enabled.Value) { MyScene.EntityDisabledMaterials[rMessage.ID].Add(key); } else { MyScene.EntityDisabledMaterials[rMessage.ID].Remove(key); } } var r = actor.GetRenderable(); if ((rMessage.Emissivity.HasValue || rMessage.DiffuseColor.HasValue) && !r.ModelProperties.ContainsKey(key)) { r.ModelProperties[key] = new MyModelProperties(); } if (rMessage.Emissivity.HasValue) { r.ModelProperties[key].Emissivity = rMessage.Emissivity.Value; } if (rMessage.DiffuseColor.HasValue) { r.ModelProperties[key].ColorMul = rMessage.DiffuseColor.Value; } actor.MarkRenderDirty(); } break; } case MyRenderMessageEnum.PreloadModel: { var rMessage = (MyRenderMessagePreloadModel)message; //MyAssetsLoader.GetModel(rMessage.Name); MyMeshes.GetMeshId(X.TEXT(rMessage.Name)); break; } case MyRenderMessageEnum.ChangeMaterialTexture: { var rMessage = (MyRenderMessageChangeMaterialTexture)message; var actor = MyIDTracker <MyActor> .FindByID(rMessage.RenderObjectID); if (actor != null) { var r = actor.GetRenderable(); var key = new MyEntityMaterialKey { LOD = 0, Material = X.TEXT(rMessage.MaterialName) }; if (!r.ModelProperties.ContainsKey(key)) { r.ModelProperties[key] = new MyModelProperties(); } r.ModelProperties[key].TextureSwap = new MyMaterialTextureSwap { TextureName = X.TEXT(rMessage.TextureName) }; r.FreeCustomRenderTextures(key); actor.MarkRenderDirty(); } break; } case MyRenderMessageEnum.DrawTextToMaterial: { var rMessage = (MyRenderMessageDrawTextToMaterial)message; //rMessage.EntityId //rMessage.FontColor //rMessage.MaterialName //rMessage.Text; //rMessage.TextScale; var actor = MyIDTracker <MyActor> .FindByID(rMessage.RenderObjectID); if (actor != null) { var r = actor.GetRenderable(); var key = new MyEntityMaterialKey { LOD = 0, Material = X.TEXT(rMessage.MaterialName) }; if (!r.ModelProperties.ContainsKey(key)) { r.ModelProperties[key] = new MyModelProperties(); } else { r.ModelProperties[key].TextureSwap = null; } RwTexId handle = r.ModelProperties[key].CustomRenderedTexture; if (handle == RwTexId.NULL && MyModelProperties.CustomTextures < MyModelProperties.MaxCustomTextures) { handle = MyRwTextures.CreateRenderTarget(rMessage.TextureResolution * rMessage.TextureAspectRatio, rMessage.TextureResolution, SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, true); r.ModelProperties[key].CustomRenderedTexture = handle; ++MyModelProperties.CustomTextures; } if (handle != RwTexId.NULL) { var clearColor = new SharpDX.Color4(rMessage.BackgroundColor.PackedValue); clearColor.Alpha = 0; MyRender11.ImmediateContext.ClearRenderTargetView(handle.Rtv, clearColor); // my sprites renderer -> push state MySpritesRenderer.PushState(new Vector2(rMessage.TextureResolution * rMessage.TextureAspectRatio, rMessage.TextureResolution)); MySpritesRenderer.DrawText(Vector2.Zero, new StringBuilder(rMessage.Text), rMessage.FontColor, rMessage.TextScale); // render text with fonts to rt // update texture of proxy MySpritesRenderer.Draw(handle.Rtv, new MyViewport(rMessage.TextureResolution * rMessage.TextureAspectRatio, rMessage.TextureResolution)); // render to rt // my sprites renderer -> pop state MySpritesRenderer.PopState(); MyRender11.ImmediateContext.GenerateMips(handle.ShaderView); actor.MarkRenderDirty(); } else { MyRenderProxy.TextNotDrawnToTexture(rMessage.EntityId); } } else { MyRenderProxy.TextNotDrawnToTexture(rMessage.EntityId); } break; } case MyRenderMessageEnum.PreloadMaterials: { var rMessage = (MyRenderMessagePreloadMaterials)message; //MyAssetsLoader.GetMaterials(rMessage.Name); MyMeshes.GetMeshId(X.TEXT(rMessage.Name)); break; } #endregion #region Voxels case MyRenderMessageEnum.CreateClipmap: { var rMessage = (MyRenderMessageCreateClipmap)message; var clipmap = new MyClipmapHandler(rMessage.ClipmapId, rMessage.ScaleGroup, rMessage.WorldMatrix, rMessage.SizeLod0); MyClipmapFactory.ClipmapByID[rMessage.ClipmapId] = clipmap; clipmap.Base.LoadContent(); break; } case MyRenderMessageEnum.UpdateClipmapCell: { var rMessage = (MyRenderMessageUpdateClipmapCell)message; var clipmap = MyClipmapFactory.ClipmapByID.Get(rMessage.ClipmapId); if (clipmap != null) { clipmap.Base.UpdateCell(rMessage); } rMessage.Batches.Clear(); break; } case MyRenderMessageEnum.InvalidateClipmapRange: { var rMessage = (MyRenderMessageInvalidateClipmapRange)message; var clipmap = MyClipmapFactory.ClipmapByID.Get(rMessage.ClipmapId); if (clipmap != null) { clipmap.Base.InvalidateRange(rMessage.MinCellLod0, rMessage.MaxCellLod0); } break; } case MyRenderMessageEnum.CreateRenderVoxelMaterials: { var rMessage = (MyRenderMessageCreateRenderVoxelMaterials)message; Debug.Assert(MyVoxelMaterials1.CheckIndices(rMessage.Materials)); MyVoxelMaterials1.Set(rMessage.Materials); rMessage.Materials = null; break; } #endregion #region Lights case MyRenderMessageEnum.CreateRenderLight: { var rMessage = (MyRenderMessageCreateRenderLight)message; //MyLight.Create(rMessage.ID); MyLights.Create(rMessage.ID); break; } case MyRenderMessageEnum.UpdateRenderLight: { var rMessage = (MyRenderMessageUpdateRenderLight)message; var light = MyLights.Get(rMessage.ID); if (light != LightId.NULL) { var lightInfo = new MyLightInfo { Position = rMessage.Position, PositionWithOffset = rMessage.Position + rMessage.Offset * rMessage.Range * rMessage.ReflectorDirection, CastsShadows = rMessage.CastShadows, ShadowsDistance = rMessage.ShadowDistance, ParentGID = rMessage.ParentID, UsedInForward = rMessage.UseInForwardRender }; MyLights.UpdateEntity(light, ref lightInfo); if ((rMessage.Type & LightTypeEnum.PointLight) > 0) { MyLights.UpdatePointlight(light, rMessage.LightOn, rMessage.Range, new Vector3(rMessage.Color.R, rMessage.Color.G, rMessage.Color.B) / 255.0f * rMessage.Intensity, rMessage.Falloff); } if ((rMessage.Type & LightTypeEnum.Hemisphere) > 0) { //rMessage.Color; //rMessage.Falloff; //rMessage.Intensity; //rMessage.LightOn; //rMessage.ReflectorDirection; //rMessage.ReflectorUp; } if ((rMessage.Type & LightTypeEnum.Spotlight) > 0) { // because it's so in dx9... float coneMaxAngleCos = 1 - rMessage.ReflectorConeMaxAngleCos; coneMaxAngleCos = (float)Math.Min(Math.Max(coneMaxAngleCos, 0.01), 0.99f); MyLights.UpdateSpotlight(light, rMessage.ReflectorOn, rMessage.ReflectorDirection, rMessage.ReflectorRange, coneMaxAngleCos, rMessage.ReflectorUp, new Vector3(rMessage.ReflectorColor.R, rMessage.ReflectorColor.G, rMessage.ReflectorColor.B) / 255.0f * rMessage.Intensity, rMessage.ReflectorFalloff, MyTextures.GetTexture(rMessage.ReflectorTexture, MyTextureEnum.CUSTOM)); } if (rMessage.GlareOn) { MyLights.UpdateGlare(light, new MyGlareDesc { Enabled = rMessage.GlareOn, Material = X.TEXT(rMessage.GlareMaterial), Intensity = rMessage.GlareIntensity, QuerySize = rMessage.GlareQuerySize, Type = rMessage.GlareType, Size = rMessage.GlareSize, MaxDistance = rMessage.GlareMaxDistance, Color = rMessage.Color, Direction = rMessage.ReflectorDirection, Range = rMessage.Range }); } } break; } case MyRenderMessageEnum.SetLightShadowIgnore: { var rMessage = (MyRenderMessageSetLightShadowIgnore)message; var light = MyLights.Get(rMessage.ID); var actor = MyIDTracker <MyActor> .FindByID(rMessage.ID2); if (light != LightId.NULL && actor != null) { if (!MyLights.IgnoredEntitites.ContainsKey(light)) { MyLights.IgnoredEntitites[light] = new HashSet <uint>(); } MyLights.IgnoredEntitites[light].Add(rMessage.ID2); } break; } case MyRenderMessageEnum.ClearLightShadowIgnore: { var rMessage = (MyRenderMessageClearLightShadowIgnore)message; var light = MyLights.Get(rMessage.ID); if (light != LightId.NULL) { MyLights.IgnoredEntitites.Remove(light); } break; } case MyRenderMessageEnum.UpdateFogSettings: { var rMessage = (MyRenderMessageUpdateFogSettings)message; MyEnvironment.FogSettings = rMessage.Settings; break; } case MyRenderMessageEnum.UpdateRenderEnvironment: { var rMessage = (MyRenderMessageUpdateRenderEnvironment)message; MyEnvironment.DirectionalLightDir = VRageMath.Vector3.Normalize(rMessage.SunDirection); MyEnvironment.DirectionalLightIntensity = rMessage.SunIntensity * rMessage.SunColor.ToVector3(); MyEnvironment.DirectionalLightEnabled = rMessage.SunLightOn; MyEnvironment.DayTime = (float)(rMessage.DayTime - Math.Truncate(rMessage.DayTime)); MyEnvironment.SunDistance = rMessage.DistanceToSun; MyEnvironment.SunColor = rMessage.SunColor; MyEnvironment.SunMaterial = rMessage.SunMaterial; MyEnvironment.SunSizeMultiplier = rMessage.SunSizeMultiplier; var skybox = rMessage.BackgroundTexture; m_resetEyeAdaptation = m_resetEyeAdaptation || rMessage.ResetEyeAdaptation; break; } case MyRenderMessageEnum.UpdateEnvironmentMap: { break; } case MyRenderMessageEnum.UpdatePostprocessSettings: { var rMessage = (MyRenderMessageUpdatePostprocessSettings)message; m_postprocessSettings = rMessage.Settings; break; } case MyRenderMessageEnum.UpdateSSAOSettings: { var rMessage = (MyRenderMessageUpdateSSAOSettings)message; MySSAO.Params.MinRadius = rMessage.MinRadius; MySSAO.Params.MaxRadius = rMessage.MaxRadius; MySSAO.Params.RadiusGrow = rMessage.RadiusGrowZScale; MySSAO.Params.RadiusBias = rMessage.Bias; MySSAO.Params.Falloff = rMessage.Falloff; MySSAO.Params.Normalization = rMessage.NormValue; MySSAO.Params.Contrast = rMessage.Contrast; break; } #endregion #region Sprites case MyRenderMessageEnum.DrawSprite: case MyRenderMessageEnum.DrawSpriteNormalized: case MyRenderMessageEnum.DrawSpriteAtlas: case MyRenderMessageEnum.SpriteScissorPush: case MyRenderMessageEnum.SpriteScissorPop: { m_drawQueue.Enqueue(message); break; } #endregion #region Fonts and text case MyRenderMessageEnum.CreateFont: { var createFontMessage = message as MyRenderMessageCreateFont; Debug.Assert(createFontMessage != null); var renderFont = new MyRenderFont(createFontMessage.FontPath); renderFont.LoadContent(); AddFont(createFontMessage.FontId, renderFont, createFontMessage.IsDebugFont); break; } case MyRenderMessageEnum.DrawString: { m_drawQueue.Enqueue(message); break; } #endregion #region Textures case MyRenderMessageEnum.PreloadTextures: { var preloadMsg = message as MyRenderMessagePreloadTextures; //MyTextureManager.PreloadTextures(preloadMsg.InDirectory, preloadMsg.Recursive); //MyTextures.UnloadTexture(texMessage.Texture); break; } case MyRenderMessageEnum.UnloadTexture: { var texMessage = (MyRenderMessageUnloadTexture)message; //MyTextureManager.UnloadTexture(texMessage.Texture); MyTextures.UnloadTexture(texMessage.Texture); break; } case MyRenderMessageEnum.ReloadTextures: { var reloadMsg = (MyRenderMessageReloadTextures)message; MyVoxelMaterials1.InvalidateMaterials(); MyMeshMaterials1.InvalidateMaterials(); MyTextures.ReloadAssetTextures(); //MyTextureManager.UnloadTextures(); //MyMaterialProxyFactory.ReloadTextures(); break; } case MyRenderMessageEnum.ReloadModels: { var reloadMsg = (MyRenderMessageReloadModels)message; //MyMaterials.Clear(); MyAssetsLoader.ReloadMeshes(); MyRenderableComponent.MarkAllDirty(); break; } #endregion case MyRenderMessageEnum.TakeScreenshot: { var rMessage = (MyRenderMessageTakeScreenshot)message; m_screenshot = new MyScreenshot(rMessage.PathToSave, rMessage.SizeMultiplier, rMessage.IgnoreSprites); break; } case MyRenderMessageEnum.ReloadEffects: { m_reloadShaders = true; //MyShaderBundleFactory.ClearCache(); //MyShaderMaterial.ClearCache(); //MyShaderPass.ClearCache(); MyShaders.Recompile(); MyMaterialShaders.Recompile(); MyRenderableComponent.MarkAllDirty(); foreach (var f in MyComponentFactory <MyFoliageComponent> .GetAll()) { f.Dispose(); } break; } case MyRenderMessageEnum.PlayVideo: { var rMessage = (MyRenderMessagePlayVideo)message; MyVideoFactory.Create(rMessage.ID, rMessage.VideoFile); var video = MyVideoFactory.Videos.Get(rMessage.ID); if (video != null) { video.Volume = rMessage.Volume; } break; } case MyRenderMessageEnum.CloseVideo: { var rMessage = (MyRenderMessageCloseVideo)message; var video = MyVideoFactory.Videos.Get(rMessage.ID); if (video != null) { video.Stop(); video.Dispose(); MyVideoFactory.Videos.Remove(rMessage.ID); } break; } case MyRenderMessageEnum.DrawVideo: { var rMessage = (MyRenderMessageDrawVideo)message; var video = MyVideoFactory.Videos.Get(rMessage.ID); if (video != null) { video.Draw(rMessage.Rectangle, rMessage.Color, rMessage.FitMode); } break; } case MyRenderMessageEnum.UpdateVideo: { var rMessage = (MyRenderMessageUpdateVideo)message; var video = MyVideoFactory.Videos.Get(rMessage.ID); if (video != null) { video.Update(); } break; } case MyRenderMessageEnum.SetVideoVolume: { var rMessage = (MyRenderMessageSetVideoVolume)message; var video = MyVideoFactory.Videos.Get(rMessage.ID); if (video != null) { video.Volume = rMessage.Volume; } break; } case MyRenderMessageEnum.VideoAdaptersRequest: { MyRenderProxy.SendVideoAdapters(GetAdaptersList()); break; } case MyRenderMessageEnum.SwitchDeviceSettings: { MyRenderProxy.RenderThread.SwitchSettings((message as MyRenderMessageSwitchDeviceSettings).Settings); break; } case MyRenderMessageEnum.SwitchRenderSettings: break; // Can be ignored as we're handling newer version of the message. case MyRenderMessageEnum.SwitchRenderSettings1: { UpdateRenderSettings((message as MyRenderMessageSwitchRenderSettings1).Settings); break; } case MyRenderMessageEnum.UnloadData: { MyRender11.UnloadData(); break; } case MyRenderMessageEnum.CollectGarbage: { GC.Collect(); break; } #region Debug draw case MyRenderMessageEnum.DebugDrawPoint: case MyRenderMessageEnum.DebugDrawLine3D: case MyRenderMessageEnum.DebugDrawLine2D: case MyRenderMessageEnum.DebugDrawSphere: case MyRenderMessageEnum.DebugDrawAABB: case MyRenderMessageEnum.DebugDrawAxis: case MyRenderMessageEnum.DebugDrawOBB: case MyRenderMessageEnum.DebugDrawCone: case MyRenderMessageEnum.DebugDrawTriangle: case MyRenderMessageEnum.DebugDrawCapsule: case MyRenderMessageEnum.DebugDrawText2D: case MyRenderMessageEnum.DebugDrawText3D: case MyRenderMessageEnum.DebugDrawModel: case MyRenderMessageEnum.DebugDrawTriangles: case MyRenderMessageEnum.DebugDrawPlane: case MyRenderMessageEnum.DebugDrawCylinder: { m_debugDrawMessages.Enqueue(message); } break; case MyRenderMessageEnum.DebugCrashRenderThread: { throw new InvalidOperationException("Forced exception"); } #endregion } }
public static IEnumerable <Color4> GetGradients(Color4 start, Color4 mid, Color4 end, int steps) { return(GetGradients(start, mid, steps / 2).Concat(GetGradients(mid, end, steps / 2))); }
internal void ApplyState(GraphicsDevice device) { if (_state == null) { // We're now bound to a device... no one should // be changing the state of this object now! GraphicsDevice = device; // Build the description. var desc = new SharpDX.Direct3D11.BlendStateDescription(); var targetDesc = new SharpDX.Direct3D11.RenderTargetBlendDescription(); // We're blending if we're not in the opaque state. targetDesc.IsBlendEnabled = !( ColorSourceBlend == Opaque.ColorSourceBlend && ColorDestinationBlend == Opaque.ColorDestinationBlend && AlphaSourceBlend == Opaque.AlphaSourceBlend && AlphaDestinationBlend == Opaque.AlphaDestinationBlend); targetDesc.BlendOperation = GetBlendOperation(ColorBlendFunction); targetDesc.SourceBlend = GetBlendOption(ColorSourceBlend, false); targetDesc.DestinationBlend = GetBlendOption(ColorDestinationBlend, false); targetDesc.AlphaBlendOperation = GetBlendOperation(AlphaBlendFunction); targetDesc.SourceAlphaBlend = GetBlendOption(AlphaSourceBlend, true); targetDesc.DestinationAlphaBlend = GetBlendOption(AlphaDestinationBlend, true); // Set the first 4 targets to the same settings. desc.RenderTarget[0] = targetDesc; desc.RenderTarget[1] = targetDesc; desc.RenderTarget[2] = targetDesc; desc.RenderTarget[3] = targetDesc; // Set the color write controls per-target. desc.RenderTarget[0].RenderTargetWriteMask = GetColorWriteMask(ColorWriteChannels); desc.RenderTarget[1].RenderTargetWriteMask = GetColorWriteMask(ColorWriteChannels1); desc.RenderTarget[2].RenderTargetWriteMask = GetColorWriteMask(ColorWriteChannels2); desc.RenderTarget[3].RenderTargetWriteMask = GetColorWriteMask(ColorWriteChannels3); // These are new DX11 features we should consider exposing // as part of the extended MonoGame API. desc.AlphaToCoverageEnable = false; desc.IndependentBlendEnable = false; // Create the state. _state = new SharpDX.Direct3D11.BlendState(GraphicsDevice._d3dDevice, desc); } Debug.Assert(GraphicsDevice == device, "The state was created for a different device!"); // NOTE: We make the assumption here that the caller has // locked the d3dContext for us to use. // Apply the state! var blendFactor = new SharpDX.Color4(BlendFactor.R / 255.0f, BlendFactor.G / 255.0f, BlendFactor.B / 255.0f, BlendFactor.A / 255.0f); device._d3dContext.OutputMerger.SetBlendState(_state, blendFactor); }
private static void ProcessMessageInternal(IMyRenderMessage message) { switch (message.MessageType) { case MyRenderMessageEnum.SetCameraViewMatrix: { var rMessage = (MyRenderMessageSetCameraViewMatrix)message; SetupCameraMatrices(rMessage); break; } case MyRenderMessageEnum.DrawScene: { var rMessage = (IMyRenderMessage)message; m_drawQueue.Enqueue(rMessage); m_messageTracker.Clear(); break; } case MyRenderMessageEnum.RebuildCullingStructure: { break; } #region Profiler case MyRenderMessageEnum.RenderProfiler: { var profMessage = (MyRenderMessageRenderProfiler)message; MyRenderProfiler.HandleInput(profMessage.Command, profMessage.Index); break; } #endregion #region Characters case MyRenderMessageEnum.CreateRenderCharacter: { var rMessage = (MyRenderMessageCreateRenderCharacter)message; var actor = MyActorFactory.CreateCharacter(); //actor.GetRenderable().SetModel(MyAssetsLoader.GetModel(rMessage.Model)); actor.GetRenderable().SetModel(MyMeshes.GetMeshId(X.TEXT(rMessage.Model))); actor.SetMatrix(ref rMessage.WorldMatrix); if (rMessage.ColorMaskHSV.HasValue) { var color = ColorFromMask(rMessage.ColorMaskHSV.Value); actor.GetRenderable().SetKeyColor(new Vector4(color, 1)); } actor.SetID(rMessage.ID); //var entity = MyComponents.CreateEntity(rMessage.ID); //MyComponents.CreateRenderable( // entity, // MyMeshes.GetMeshId(X.TEXT(rMessage.Model)), // rMessage.ColorMaskHSV.HasValue ? rMessage.ColorMaskHSV.Value : Vector3.One); //MyComponents.SetMatrix(entity, ref rMessage.WorldMatrix); break; } case MyRenderMessageEnum.SetCharacterSkeleton: { var rMessage = (MyRenderMessageSetCharacterSkeleton)message; var actor = MyIDTracker<MyActor>.FindByID(rMessage.CharacterID); if (actor != null) { actor.GetSkinning().SetSkeleton(rMessage.SkeletonBones, rMessage.SkeletonIndices); } //var entity = MyComponents.GetEntity(rMessage.CharacterID); //MyComponents.SetSkeleton(entity, rMessage.SkeletonBones, rMessage.SkeletonIndices); break; }; case MyRenderMessageEnum.SetCharacterTransforms: { var rMessage = (MyRenderMessageSetCharacterTransforms)message; var actor = MyIDTracker<MyActor>.FindByID(rMessage.CharacterID); if (actor != null) { actor.GetSkinning().SetAnimationBones(rMessage.RelativeBoneTransforms); } //var entity = MyComponents.GetEntity(rMessage.CharacterID); //MyComponents.SetAnimation(entity, rMessage.RelativeBoneTransforms); break; } case MyRenderMessageEnum.UpdateRenderEntity: { var rMessage = (MyRenderMessageUpdateRenderEntity)message; var actor = MyIDTracker<MyActor>.FindByID(rMessage.ID); if (actor != null && actor.GetRenderable() != null) { if(rMessage.ColorMaskHSV.HasValue) { actor.GetRenderable().SetKeyColor(new Vector4(ColorFromMask(rMessage.ColorMaskHSV.Value), 0)); } actor.GetRenderable().SetDithering(rMessage.Dithering); } break; } case MyRenderMessageEnum.ChangeModel: { var rMessage = (MyRenderMessageChangeModel)message; var actor = MyIDTracker<MyActor>.FindByID(rMessage.ID); if (actor != null && actor.GetRenderable() != null) { var r = actor.GetRenderable(); var modelId = MyMeshes.GetMeshId(X.TEXT(rMessage.Model)); if(r.GetModel() != modelId) { r.SetModel(modelId); } } break; } case MyRenderMessageEnum.ChangeModelMaterial: { var rMessage = (MyRenderMessageChangeModelMaterial)message; //var matId = MyMeshMaterialId.NULL; //if (rMessage.Material.ToLower().Contains("debug")) //{ // matId = MyMeshMaterials1.DebugMaterialId; //} //else //{ // matId = MyMeshMaterials1.GetMaterialId(rMessage.Material); //} //MyAssetsLoader.GetModel(rMessage.Model).SetMaterial_SLOW(MyMeshMaterials1.GetProxyId(matId)); break; } #endregion #region Render objects case MyRenderMessageEnum.CreateRenderEntity: { var rMessage = (MyRenderMessageCreateRenderEntity)message; Matrix m = (Matrix)rMessage.WorldMatrix; var actor = MyActorFactory.CreateSceneObject(); if (rMessage.Model != null) { var model = MyAssetsLoader.ModelRemap.Get(rMessage.Model, rMessage.Model); actor.GetRenderable().SetModel(MyMeshes.GetMeshId(X.TEXT(model))); //if (MyDestructionMesh.ModelsDictionary.ContainsKey(model)) //{ // //actor.GetRenderable().SetModel(MyDestructionMesh.ModelsDictionary.Get(model)); // actor.GetRenderable().SetModel(MyMeshes.GetMeshId(X.TEXT(model))); //} //else //{ // //actor.GetRenderable().SetModel(MyAssetsLoader.GetModel(model)); // actor.GetRenderable().SetModel(MyMeshes.GetMeshId(X.TEXT(model))); //} } actor.SetID(rMessage.ID); actor.SetMatrix(ref rMessage.WorldMatrix); break; } case MyRenderMessageEnum.UpdateCockpitGlass: { var rMessage = (MyRenderMessageUpdateCockpitGlass)message; //if (MyEnvironment.CockpitGlass == null) //{ // MyEnvironment.CockpitGlass = MyActorFactory.CreateSceneObject(); //} //MyEnvironment.CockpitGlass.GetRenderable().SetModel(MyMeshes.GetMeshId(X.TEXT(rMessage.Model))); //MyEnvironment.CockpitGlass.SetVisibility(rMessage.Visible); //MyEnvironment.CockpitGlass.MarkRenderDirty(); //var matrix = (Matrix)rMessage.WorldMatrix; //MyEnvironment.CockpitGlass.SetMatrix(ref matrix); break; } case MyRenderMessageEnum.CreateRenderVoxelDebris: { var rMessage = (MyRenderMessageCreateRenderVoxelDebris)message; Matrix m = (Matrix)rMessage.WorldMatrix; var actor = MyActorFactory.CreateSceneObject(); if (rMessage.Model != null) { actor.GetRenderable().SetModel(MyMeshes.GetMeshId(X.TEXT(rMessage.Model))); } actor.SetID(rMessage.ID); actor.SetMatrix(ref rMessage.WorldMatrix); MyRenderableComponent.DebrisEntityVoxelMaterial[rMessage.ID] = rMessage.VoxelMaterialIndex; break; } case MyRenderMessageEnum.CreateScreenDecal: { var rMessage = (MyRenderMessageCreateScreenDecal)message; MyScreenDecals.AddDecal(rMessage.ID, rMessage.ParentID, rMessage.LocalOBB, rMessage.DecalMaterial); break; } case MyRenderMessageEnum.CreateRenderEntityAtmosphere: { var rMessage = (MyRenderMessageCreateRenderEntityAtmosphere)message; if (rMessage.Technique == VRage.Import.MyMeshDrawTechnique.ATMOSPHERE) { //rMessage = (rMessage.AtmosphereRadius - rMessage.PlanetRadius) * 5 + rMessage.PlanetRadius; //rMessage.AtmosphereRadius *= 1.5f; //rMessage.WorldMatrix = MatrixD.CreateScale(1.5, 1.5, 1.5) * rMessage.WorldMatrix; float rescaleFactor = (rMessage.AtmosphereRadius - rMessage.PlanetRadius) / (6420 - 6360); // ratio of planet to earth radius Vector3 rayleighScattering = new Vector3(1.8e-3f, 1.35e-2f, 3.31e-2f) / rescaleFactor; Vector3 mieScattering = new Vector3(4e-3f, 4e-3f, 4e-3f) / rescaleFactor; float rayleighHeightScale = 8 * rescaleFactor; float mieHeightScale = 1.2f * rescaleFactor; MyAtmosphereRenderer.CreateAtmosphere(rMessage.ID, rMessage.WorldMatrix, rMessage.PlanetRadius, rMessage.AtmosphereRadius, rayleighScattering, rayleighHeightScale, mieScattering, mieHeightScale); } break; } case MyRenderMessageEnum.RemoveDecal: { var rMessage = (MyRenderMessageRemoveDecal)message; MyScreenDecals.RemoveDecal(rMessage.ID); break; } case MyRenderMessageEnum.RegisterDecalsMaterials: { var rMessage = (MyRenderMessageRegisterScreenDecalsMaterials)message; MyScreenDecals.RegisterMaterials(rMessage.MaterialsNames, rMessage.MaterialsDescriptions); break; } case MyRenderMessageEnum.UpdateRenderObject: { var rMessage = (MyRenderMessageUpdateRenderObject)message; var actor = MyIDTracker<MyActor>.FindByID(rMessage.ID); if (actor != null) { actor.SetMatrix(ref rMessage.WorldMatrix); if(rMessage.AABB.HasValue) { actor.SetAabb(rMessage.AABB.Value); } } else { if (MyClipmapFactory.ClipmapByID.ContainsKey(rMessage.ID)) { MyClipmapFactory.ClipmapByID[rMessage.ID].UpdateWorldMatrix(ref rMessage.WorldMatrix); } } //var entity = MyComponents.GetEntity(rMessage.ID); //if(entity != EntityId.NULL) //{ // MyComponents.SetMatrix(entity, ref rMessage.WorldMatrix); // if (rMessage.AABB.HasValue) // { // var aabb = rMessage.AABB.Value; // MyComponents.SetAabb(entity, ref aabb); // } //} break; } case MyRenderMessageEnum.RemoveRenderObject: { var rMessage = (MyRenderMessageRemoveRenderObject)message; var actor = MyIDTracker<MyActor>.FindByID(rMessage.ID); if (actor != null) { if (actor.GetRenderable() != null && actor.GetRenderable().GetModel().Info.Dynamic) { MyMeshes.RemoveMesh(actor.GetRenderable().GetModel()); } actor.Destruct(); MyScreenDecals.RemoveEntityDecals(rMessage.ID); break; } var instancing = MyInstancing.Get(rMessage.ID); if(instancing != InstancingId.NULL) { MyInstancing.Remove(rMessage.ID, instancing); break; } var light = MyLights.Get(rMessage.ID); if(light != LightId.NULL) { MyLights.Remove(rMessage.ID, light); break; } var clipmap = MyClipmapFactory.ClipmapByID.Get(rMessage.ID); if(clipmap != null) { clipmap.RemoveFromUpdate(); break; } MyAtmosphereRenderer.RemoveAtmosphere(rMessage.ID); break; } case MyRenderMessageEnum.UpdateRenderObjectVisibility: { var rMessage = (MyRenderMessageUpdateRenderObjectVisibility)message; var actor = MyIDTracker<MyActor>.FindByID(rMessage.ID); if (actor != null) { actor.SetVisibility(rMessage.Visible); //if(rMessage.NearFlag) //{ // actor.GetRenderable().m_additionalFlags = MyRenderableProxyFlags.InvertFaceCulling; // actor.MarkRenderDirty(); //} //else //{ // actor.GetRenderable().m_additionalFlags = 0; // actor.MarkRenderDirty(); //} } break; } case MyRenderMessageEnum.CreateRenderInstanceBuffer: { var rMessage = (MyRenderMessageCreateRenderInstanceBuffer)message; //var instancing = MyComponentFactory<MyInstancingComponent>.Create(); //instancing.SetID(rMessage.ID); //instancing.Init(rMessage.Type); //instancing.SetDebugName(rMessage.DebugName); MyInstancing.Create(rMessage.ID, rMessage.Type, rMessage.DebugName); break; } case MyRenderMessageEnum.UpdateRenderInstanceBuffer: { var rMessage = (MyRenderMessageUpdateRenderInstanceBuffer)message; //var instancing = MyIDTracker<MyInstancingComponent>.FindByID(rMessage.ID); //if(instancing != null) //{ // instancing.UpdateGeneric(rMessage.InstanceData, rMessage.Capacity); //} var handle = MyInstancing.Get(rMessage.ID); if (handle != InstancingId.NULL) { MyInstancing.UpdateGeneric(handle, rMessage.InstanceData, rMessage.Capacity); } else { Debug.Assert(handle != InstancingId.NULL, "No instance buffer with ID " + rMessage.ID); } rMessage.InstanceData.Clear(); break; } case MyRenderMessageEnum.UpdateRenderCubeInstanceBuffer: { var rMessage = (MyRenderMessageUpdateRenderCubeInstanceBuffer)message; //var instancing = MyIDTracker<MyInstancingComponent>.FindByID(rMessage.ID); //if (instancing != null) //{ // instancing.UpdateCube(rMessage.InstanceData, rMessage.Capacity); //} var handle = MyInstancing.Get(rMessage.ID); if (handle != InstancingId.NULL) { MyInstancing.UpdateCube(MyInstancing.Get(rMessage.ID), rMessage.InstanceData, rMessage.Capacity); } else { Debug.Assert(handle != InstancingId.NULL, "No instance buffer with ID " + rMessage.ID); } rMessage.InstanceData.Clear(); break; } case MyRenderMessageEnum.SetInstanceBuffer: { var rMessage = (MyRenderMessageSetInstanceBuffer)message; var actor = MyIDTracker<MyActor>.FindByID(rMessage.ID); //var instancing = MyIDTracker<MyInstancingComponent>.FindByID(rMessage.InstanceBufferId); if (actor != null) { //if (actor.GetComponent(MyActorComponentEnum.Instancing) != instancing) //{ // actor.AddComponent(instancing); //} //actor.SetLocalAabb(rMessage.LocalAabb); //actor.GetRenderable().SetInstancingCounters(rMessage.InstanceCount, rMessage.InstanceStart); actor.GetRenderable().SetInstancing(MyInstancing.Get(rMessage.InstanceBufferId)); actor.SetLocalAabb(rMessage.LocalAabb); actor.GetRenderable().SetInstancingCounters(rMessage.InstanceCount, rMessage.InstanceStart); } break; } case MyRenderMessageEnum.CreateManualCullObject: { var rMessage = (MyRenderMessageCreateManualCullObject)message; var actor = MyActorFactory.CreateGroup(); actor.SetID(rMessage.ID); Matrix m = (Matrix)rMessage.WorldMatrix; actor.SetMatrix(ref rMessage.WorldMatrix); break; } case MyRenderMessageEnum.SetParentCullObject: { var rMessage = (MyRenderMessageSetParentCullObject)message; var child = MyIDTracker<MyActor>.FindByID(rMessage.ID); var parent = MyIDTracker<MyActor>.FindByID(rMessage.CullObjectID); if (child != null && parent != null && parent.GetGroupRoot() != null && child.GetGroupLeaf() == null) { child.SetRelativeTransform(rMessage.ChildToParent); parent.GetGroupRoot().Add(child); } break; } case MyRenderMessageEnum.CreateLineBasedObject: { var rMessage = (MyRenderMessageCreateLineBasedObject)message; var actor = MyActorFactory.CreateSceneObject(); //actor.GetRenderable().SetModel(new MyDynamicMesh()); actor.SetID(rMessage.ID); actor.SetMatrix(ref MatrixD.Identity); MyMeshMaterials1.GetMaterialId("__ROPE_MATERIAL", null, rMessage.ColorMetalTexture, rMessage.NormalGlossTexture, rMessage.ExtensionTexture, MyMesh.DEFAULT_MESH_TECHNIQUE); actor.GetRenderable().SetModel(MyMeshes.CreateRuntimeMesh(X.TEXT("LINE" + rMessage.ID), 1, true)); break; } case MyRenderMessageEnum.UpdateLineBasedObject: { var rMessage = (MyRenderMessageUpdateLineBasedObject)message; var actor = MyIDTracker<MyActor>.FindByID(rMessage.ID); if (actor != null) { //var mesh = actor.GetRenderable().GetMesh() as MyDynamicMesh; MyVertexFormatPositionH4 [] stream0; MyVertexFormatTexcoordNormalTangent [] stream1; MyLineHelpers.GenerateVertexData(ref rMessage.WorldPointA, ref rMessage.WorldPointB, out stream0, out stream1); var indices = MyLineHelpers.GenerateIndices(stream0.Length); var sections = new MySectionInfo[] { new MySectionInfo { TriCount = indices.Length / 3, IndexStart = 0, MaterialName = "__ROPE_MATERIAL" } }; MyMeshes.UpdateRuntimeMesh(MyMeshes.GetMeshId(X.TEXT("LINE" + rMessage.ID)), indices, stream0, stream1, sections, (BoundingBox)MyLineHelpers.GetBoundingBox(ref rMessage.WorldPointA, ref rMessage.WorldPointB)); //actor.SetAabb((BoundingBox)MyLineHelpers.GetBoundingBox(ref rMessage.WorldPointA, ref rMessage.WorldPointB)); actor.MarkRenderDirty(); var matrix = MatrixD.CreateTranslation((Vector3)(rMessage.WorldPointA + rMessage.WorldPointB) * 0.5f); actor.SetMatrix(ref matrix); } break; } case MyRenderMessageEnum.SetRenderEntityData: { var rMessage = (MyRenderMessageSetRenderEntityData)message; Debug.Assert(false, "MyRenderMessageSetRenderEntityData is deprecated!"); break; } case MyRenderMessageEnum.AddRuntimeModel: { var rMessage = (MyRenderMessageAddRuntimeModel)message; //MyDestructionMesh mesh = MyDestructionMesh.ModelsDictionary.Get(rMessage.Name); //if (mesh == null) //{ //mesh = new MyDestructionMesh(rMessage.Name); //ProfilerShort.Begin("LoadBuffers"); //mesh.Fill(rMessage.ModelData.Indices, rMessage.ModelData.Positions, rMessage.ModelData.Normals, rMessage.ModelData.Tangents, rMessage.ModelData.TexCoords, rMessage.ModelData.Sections, rMessage.ModelData.AABB); //ProfilerShort.End(); if(!MyMeshes.Exists(rMessage.Name)) { { ushort[] indices = new ushort[rMessage.ModelData.Indices.Count]; for (int i = 0; i < rMessage.ModelData.Indices.Count; i++) { indices[i] = (ushort)rMessage.ModelData.Indices[i]; } var verticesNum = rMessage.ModelData.Positions.Count; MyVertexFormatPositionH4[] stream0 = new MyVertexFormatPositionH4[verticesNum]; MyVertexFormatTexcoordNormalTangent[] stream1 = new MyVertexFormatTexcoordNormalTangent[verticesNum]; for (int i = 0; i < verticesNum; i++) { stream0[i] = new MyVertexFormatPositionH4(rMessage.ModelData.Positions[i]); stream1[i] = new MyVertexFormatTexcoordNormalTangent( rMessage.ModelData.TexCoords[i], rMessage.ModelData.Normals[i], rMessage.ModelData.Tangents[i]); } var id = MyMeshes.CreateRuntimeMesh(X.TEXT(rMessage.Name), rMessage.ModelData.Sections.Count, false); MyMeshes.UpdateRuntimeMesh(id, indices, stream0, stream1, rMessage.ModelData.Sections.ToArray(), rMessage.ModelData.AABB); } if (rMessage.ReplacedModel != null) { //MyAssetsLoader.ModelRemap[rMessage.ReplacedModel] = rMessage.Name; MyAssetsLoader.ModelRemap[rMessage.Name] = rMessage.ReplacedModel; } //if (MyAssetsLoader.LOG_MESH_STATISTICS) //{ // mesh.DebugWriteInfo(); //} } break; } case MyRenderMessageEnum.UpdateModelProperties: { var rMessage = (MyRenderMessageUpdateModelProperties)message; var actor = MyIDTracker<MyActor>.FindByID(rMessage.ID); if (actor != null) { // careful, lod is ignored after all (properties apply to all lods) var key = new MyEntityMaterialKey { LOD = rMessage.LOD, Material = X.TEXT(rMessage.MaterialName) }; if(rMessage.Enabled.HasValue) { if (!MyScene.EntityDisabledMaterials.ContainsKey(rMessage.ID)) { MyScene.EntityDisabledMaterials.Add(rMessage.ID, new HashSet<MyEntityMaterialKey>()); } if (!rMessage.Enabled.Value) { MyScene.EntityDisabledMaterials[rMessage.ID].Add(key); } else { MyScene.EntityDisabledMaterials[rMessage.ID].Remove(key); } } var r = actor.GetRenderable(); if ((rMessage.Emissivity.HasValue || rMessage.DiffuseColor.HasValue) && !r.ModelProperties.ContainsKey(key)) { r.ModelProperties[key] = new MyModelProperties(); } if(rMessage.Emissivity.HasValue) { r.ModelProperties[key].Emissivity = rMessage.Emissivity.Value; } if(rMessage.DiffuseColor.HasValue) { r.ModelProperties[key].ColorMul = rMessage.DiffuseColor.Value; } actor.MarkRenderDirty(); } break; } case MyRenderMessageEnum.PreloadModel: { var rMessage = (MyRenderMessagePreloadModel) message; //MyAssetsLoader.GetModel(rMessage.Name); MyMeshes.GetMeshId(X.TEXT(rMessage.Name)); break; } case MyRenderMessageEnum.ChangeMaterialTexture: { var rMessage = (MyRenderMessageChangeMaterialTexture)message; var actor = MyIDTracker<MyActor>.FindByID(rMessage.RenderObjectID); if (actor != null) { var r = actor.GetRenderable(); var key = new MyEntityMaterialKey { LOD = 0, Material = X.TEXT(rMessage.MaterialName) }; if (!r.ModelProperties.ContainsKey(key)) { r.ModelProperties[key] = new MyModelProperties(); } if (r.ModelProperties[key].TextureSwaps == null) { r.ModelProperties[key].TextureSwaps = new List<MyMaterialTextureSwap>(); foreach(var s in rMessage.Changes) { r.ModelProperties[key].TextureSwaps.Add(new MyMaterialTextureSwap { TextureName = X.TEXT(s.TextureName), MaterialSlot = s.MaterialSlot }); } } else { foreach (var s in rMessage.Changes) { bool swapped = false; for(int i=0; i<r.ModelProperties[key].TextureSwaps.Count; ++i) { if(r.ModelProperties[key].TextureSwaps[i].MaterialSlot == s.MaterialSlot) { r.ModelProperties[key].TextureSwaps[i] = new MyMaterialTextureSwap { TextureName = X.TEXT(s.TextureName), MaterialSlot = s.MaterialSlot }; swapped = true; break; } } if(!swapped) { r.ModelProperties[key].TextureSwaps.Add(new MyMaterialTextureSwap { TextureName = X.TEXT(s.TextureName), MaterialSlot = s.MaterialSlot }); } } } r.FreeCustomRenderTextures(key); actor.MarkRenderDirty(); } rMessage.Changes.Clear(); break; } case MyRenderMessageEnum.DrawTextToMaterial: { var rMessage = (MyRenderMessageDrawTextToMaterial)message; //rMessage.EntityId //rMessage.FontColor //rMessage.MaterialName //rMessage.Text; //rMessage.TextScale; var actor = MyIDTracker<MyActor>.FindByID(rMessage.RenderObjectID); if (actor != null) { var r = actor.GetRenderable(); var key = new MyEntityMaterialKey { LOD = 0, Material = X.TEXT(rMessage.MaterialName) }; if (!r.ModelProperties.ContainsKey(key)) { r.ModelProperties[key] = new MyModelProperties(); } else { r.ModelProperties[key].TextureSwaps = null; } RwTexId handle = r.ModelProperties[key].CustomRenderedTexture; if (handle == RwTexId.NULL && MyModelProperties.CustomTextures < MyModelProperties.MaxCustomTextures) { handle = MyRwTextures.CreateRenderTarget(rMessage.TextureResolution * rMessage.TextureAspectRatio, rMessage.TextureResolution, SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, true); r.ModelProperties[key].CustomRenderedTexture = handle; ++MyModelProperties.CustomTextures; } if (handle != RwTexId.NULL) { var clearColor = new SharpDX.Color4(rMessage.BackgroundColor.PackedValue); clearColor.Alpha = 0; MyRender11.ImmediateContext.ClearRenderTargetView(handle.Rtv, clearColor); // my sprites renderer -> push state MySpritesRenderer.PushState(new Vector2(rMessage.TextureResolution * rMessage.TextureAspectRatio, rMessage.TextureResolution)); MySpritesRenderer.DrawText(Vector2.Zero, new StringBuilder(rMessage.Text), rMessage.FontColor, rMessage.TextScale); // render text with fonts to rt // update texture of proxy MySpritesRenderer.Draw(handle.Rtv, new MyViewport(rMessage.TextureResolution * rMessage.TextureAspectRatio, rMessage.TextureResolution)); // render to rt // my sprites renderer -> pop state MySpritesRenderer.PopState(); MyRender11.ImmediateContext.GenerateMips(handle.ShaderView); actor.MarkRenderDirty(); } else { MyRenderProxy.TextNotDrawnToTexture(rMessage.EntityId); } } else { MyRenderProxy.TextNotDrawnToTexture(rMessage.EntityId); } break; } case MyRenderMessageEnum.PreloadMaterials: { var rMessage = (MyRenderMessagePreloadMaterials)message; //MyAssetsLoader.GetMaterials(rMessage.Name); MyMeshes.GetMeshId(X.TEXT(rMessage.Name)); break; } #endregion #region Voxels case MyRenderMessageEnum.CreateClipmap: { var rMessage = (MyRenderMessageCreateClipmap)message; var clipmap = new MyClipmapHandler(rMessage.ClipmapId, rMessage.ScaleGroup, rMessage.WorldMatrix, rMessage.SizeLod0); MyClipmapFactory.ClipmapByID[rMessage.ClipmapId] = clipmap; clipmap.Base.LoadContent(); break; } case MyRenderMessageEnum.UpdateClipmapCell: { var rMessage = (MyRenderMessageUpdateClipmapCell)message; var clipmap = MyClipmapFactory.ClipmapByID.Get(rMessage.ClipmapId); if(clipmap != null) { clipmap.Base.UpdateCell(rMessage); } rMessage.Batches.Clear(); break; } case MyRenderMessageEnum.InvalidateClipmapRange: { var rMessage = (MyRenderMessageInvalidateClipmapRange)message; var clipmap = MyClipmapFactory.ClipmapByID.Get(rMessage.ClipmapId); if (clipmap != null) { clipmap.Base.InvalidateRange(rMessage.MinCellLod0, rMessage.MaxCellLod0); } break; } case MyRenderMessageEnum.CreateRenderVoxelMaterials: { var rMessage = (MyRenderMessageCreateRenderVoxelMaterials)message; Debug.Assert(MyVoxelMaterials1.CheckIndices(rMessage.Materials)); MyVoxelMaterials1.Set(rMessage.Materials); rMessage.Materials = null; break; } #endregion #region Lights case MyRenderMessageEnum.CreateRenderLight: { var rMessage = (MyRenderMessageCreateRenderLight)message; //MyLight.Create(rMessage.ID); MyLights.Create(rMessage.ID); break; } case MyRenderMessageEnum.UpdateRenderLight: { var rMessage = (MyRenderMessageUpdateRenderLight)message; var light = MyLights.Get(rMessage.ID); if(light != LightId.NULL) { var lightInfo = new MyLightInfo { Position = rMessage.Position, PositionWithOffset = rMessage.Position + rMessage.Offset * rMessage.Range * rMessage.ReflectorDirection, CastsShadows = rMessage.CastShadows, ShadowsDistance = rMessage.ShadowDistance, ParentGID = rMessage.ParentID, UsedInForward = rMessage.UseInForwardRender }; MyLights.UpdateEntity(light, ref lightInfo); if ((rMessage.Type & LightTypeEnum.PointLight) > 0) { MyLights.UpdatePointlight(light, rMessage.LightOn, rMessage.Range, new Vector3(rMessage.Color.R, rMessage.Color.G, rMessage.Color.B) / 255.0f * rMessage.Intensity, rMessage.Falloff); } if ((rMessage.Type & LightTypeEnum.Hemisphere) > 0) { //rMessage.Color; //rMessage.Falloff; //rMessage.Intensity; //rMessage.LightOn; //rMessage.ReflectorDirection; //rMessage.ReflectorUp; } if ((rMessage.Type & LightTypeEnum.Spotlight) > 0) { // because it's so in dx9... float coneMaxAngleCos = 1 - rMessage.ReflectorConeMaxAngleCos; coneMaxAngleCos = (float)Math.Min(Math.Max(coneMaxAngleCos, 0.01), 0.99f); MyLights.UpdateSpotlight(light, rMessage.ReflectorOn, rMessage.ReflectorDirection, rMessage.ReflectorRange, coneMaxAngleCos, rMessage.ReflectorUp, new Vector3(rMessage.ReflectorColor.R, rMessage.ReflectorColor.G, rMessage.ReflectorColor.B) / 255.0f * rMessage.Intensity, rMessage.ReflectorFalloff, MyTextures.GetTexture(rMessage.ReflectorTexture, MyTextureEnum.CUSTOM)); } MyLights.UpdateGlare(light, new MyGlareDesc { Enabled = rMessage.GlareOn, Material = X.TEXT(rMessage.GlareMaterial), Intensity = rMessage.GlareIntensity, QuerySize = rMessage.GlareQuerySize, Type = rMessage.GlareType, Size = rMessage.GlareSize, MaxDistance = rMessage.GlareMaxDistance, Color = rMessage.Color, Direction = rMessage.ReflectorDirection, Range = rMessage.Range }); } break; } case MyRenderMessageEnum.SetLightShadowIgnore: { var rMessage = (MyRenderMessageSetLightShadowIgnore)message; var light = MyLights.Get(rMessage.ID); var actor = MyIDTracker<MyActor>.FindByID(rMessage.ID2); if(light != LightId.NULL && actor != null) { if(!MyLights.IgnoredEntitites.ContainsKey(light)) { MyLights.IgnoredEntitites[light] = new HashSet<uint>(); } MyLights.IgnoredEntitites[light].Add(rMessage.ID2); } break; } case MyRenderMessageEnum.ClearLightShadowIgnore: { var rMessage = (MyRenderMessageClearLightShadowIgnore)message; var light = MyLights.Get(rMessage.ID); if(light != LightId.NULL) { MyLights.IgnoredEntitites.Remove(light); } break; } case MyRenderMessageEnum.UpdateFogSettings: { var rMessage = (MyRenderMessageUpdateFogSettings)message; MyEnvironment.FogSettings = rMessage.Settings; break; } case MyRenderMessageEnum.UpdateRenderEnvironment: { var rMessage = (MyRenderMessageUpdateRenderEnvironment)message; MyEnvironment.DirectionalLightDir = VRageMath.Vector3.Normalize(rMessage.SunDirection); MyEnvironment.DirectionalLightIntensity = rMessage.SunIntensity * rMessage.SunColor.ToVector3(); MyEnvironment.DirectionalLightEnabled = rMessage.SunLightOn; MyEnvironment.DayTime = (float)(rMessage.DayTime - Math.Truncate(rMessage.DayTime)); MyEnvironment.SunDistance = rMessage.DistanceToSun; MyEnvironment.SunColor = rMessage.SunColor; MyEnvironment.SunMaterial = rMessage.SunMaterial; MyEnvironment.SunSizeMultiplier = rMessage.SunSizeMultiplier; MyEnvironment.SunBillboardEnabled = rMessage.SunBillboardEnabled; var skybox = rMessage.BackgroundTexture; m_resetEyeAdaptation = m_resetEyeAdaptation || rMessage.ResetEyeAdaptation; break; } case MyRenderMessageEnum.UpdateEnvironmentMap: { break; } case MyRenderMessageEnum.UpdatePostprocessSettings: { var rMessage = (MyRenderMessageUpdatePostprocessSettings)message; m_postprocessSettings = rMessage.Settings; break; } case MyRenderMessageEnum.UpdateSSAOSettings: { var rMessage = (MyRenderMessageUpdateSSAOSettings)message; MySSAO.Params.MinRadius = rMessage.MinRadius; MySSAO.Params.MaxRadius = rMessage.MaxRadius; MySSAO.Params.RadiusGrow = rMessage.RadiusGrowZScale; MySSAO.Params.RadiusBias = rMessage.Bias; MySSAO.Params.Falloff = rMessage.Falloff; MySSAO.Params.Normalization = rMessage.NormValue; MySSAO.Params.Contrast = rMessage.Contrast; break; } #endregion #region Sprites case MyRenderMessageEnum.DrawSprite: case MyRenderMessageEnum.DrawSpriteNormalized: case MyRenderMessageEnum.DrawSpriteAtlas: case MyRenderMessageEnum.SpriteScissorPush: case MyRenderMessageEnum.SpriteScissorPop: { m_drawQueue.Enqueue(message); break; } #endregion #region Fonts and text case MyRenderMessageEnum.CreateFont: { var createFontMessage = message as MyRenderMessageCreateFont; Debug.Assert(createFontMessage != null); var renderFont = new MyRenderFont(createFontMessage.FontPath); renderFont.LoadContent(); AddFont(createFontMessage.FontId, renderFont, createFontMessage.IsDebugFont); break; } case MyRenderMessageEnum.DrawString: { m_drawQueue.Enqueue(message); break; } #endregion #region Textures case MyRenderMessageEnum.PreloadTextures: { var preloadMsg = message as MyRenderMessagePreloadTextures; //MyTextureManager.PreloadTextures(preloadMsg.InDirectory, preloadMsg.Recursive); //MyTextures.UnloadTexture(texMessage.Texture); break; } case MyRenderMessageEnum.UnloadTexture: { var texMessage = (MyRenderMessageUnloadTexture)message; //MyTextureManager.UnloadTexture(texMessage.Texture); MyTextures.UnloadTexture(texMessage.Texture); break; } case MyRenderMessageEnum.ReloadTextures: { var reloadMsg = (MyRenderMessageReloadTextures)message; MyVoxelMaterials1.InvalidateMaterials(); MyMeshMaterials1.InvalidateMaterials(); MyTextures.ReloadAssetTextures(); //MyTextureManager.UnloadTextures(); //MyMaterialProxyFactory.ReloadTextures(); break; } case MyRenderMessageEnum.ReloadModels: { var reloadMsg = (MyRenderMessageReloadModels)message; //MyMaterials.Clear(); MyAssetsLoader.ReloadMeshes(); MyRenderableComponent.MarkAllDirty(); break; } #endregion case MyRenderMessageEnum.TakeScreenshot: { var rMessage = (MyRenderMessageTakeScreenshot)message; m_screenshot = new MyScreenshot(rMessage.PathToSave, rMessage.SizeMultiplier, rMessage.IgnoreSprites); break; } case MyRenderMessageEnum.ReloadEffects: { m_reloadShaders = true; //MyShaderBundleFactory.ClearCache(); //MyShaderMaterial.ClearCache(); //MyShaderPass.ClearCache(); MyShaders.Recompile(); MyMaterialShaders.Recompile(); MyAtmosphereRenderer.RecomputeAtmospheres(); MyRenderableComponent.MarkAllDirty(); foreach (var f in MyComponentFactory<MyFoliageComponent>.GetAll()) { f.Dispose(); } break; } case MyRenderMessageEnum.PlayVideo: { var rMessage = (MyRenderMessagePlayVideo)message; MyVideoFactory.Create(rMessage.ID, rMessage.VideoFile); var video = MyVideoFactory.Videos.Get(rMessage.ID); if (video != null) { video.Volume = rMessage.Volume; } break; } case MyRenderMessageEnum.CloseVideo: { var rMessage = (MyRenderMessageCloseVideo)message; var video = MyVideoFactory.Videos.Get(rMessage.ID); if (video != null) { video.Stop(); video.Dispose(); MyVideoFactory.Videos.Remove(rMessage.ID); } break; } case MyRenderMessageEnum.DrawVideo: { var rMessage = (MyRenderMessageDrawVideo)message; var video = MyVideoFactory.Videos.Get(rMessage.ID); if (video != null) { video.Draw(rMessage.Rectangle, rMessage.Color, rMessage.FitMode); } break; } case MyRenderMessageEnum.UpdateVideo: { var rMessage = (MyRenderMessageUpdateVideo)message; var video = MyVideoFactory.Videos.Get(rMessage.ID); if(video != null) { video.Update(); } break; } case MyRenderMessageEnum.SetVideoVolume: { var rMessage = (MyRenderMessageSetVideoVolume)message; var video = MyVideoFactory.Videos.Get(rMessage.ID); if (video != null) { video.Volume = rMessage.Volume; } break; } case MyRenderMessageEnum.VideoAdaptersRequest: { MyRenderProxy.SendVideoAdapters(GetAdaptersList()); break; } case MyRenderMessageEnum.SwitchDeviceSettings: { MyRenderProxy.RenderThread.SwitchSettings((message as MyRenderMessageSwitchDeviceSettings).Settings); break; } case MyRenderMessageEnum.SwitchRenderSettings: { UpdateRenderSettings((message as MyRenderMessageSwitchRenderSettings).Settings); break; } case MyRenderMessageEnum.UnloadData: { MyRender11.UnloadData(); break; } case MyRenderMessageEnum.CollectGarbage: { GC.Collect(); break; } #region Debug draw case MyRenderMessageEnum.DebugDrawPoint: case MyRenderMessageEnum.DebugDrawLine3D: case MyRenderMessageEnum.DebugDrawLine2D: case MyRenderMessageEnum.DebugDrawSphere: case MyRenderMessageEnum.DebugDrawAABB: case MyRenderMessageEnum.DebugDrawAxis: case MyRenderMessageEnum.DebugDrawOBB: case MyRenderMessageEnum.DebugDrawCone: case MyRenderMessageEnum.DebugDrawTriangle: case MyRenderMessageEnum.DebugDrawCapsule: case MyRenderMessageEnum.DebugDrawText2D: case MyRenderMessageEnum.DebugDrawText3D: case MyRenderMessageEnum.DebugDrawModel: case MyRenderMessageEnum.DebugDrawTriangles: case MyRenderMessageEnum.DebugDrawPlane: case MyRenderMessageEnum.DebugDrawCylinder: { m_debugDrawMessages.Enqueue(message); } break; case MyRenderMessageEnum.DebugCrashRenderThread: { throw new InvalidOperationException("Forced exception"); } #endregion } }
private static void ProcessMessageInternal(MyRenderMessageBase message) { switch (message.MessageType) { case MyRenderMessageEnum.SetCameraViewMatrix: { var rMessage = (MyRenderMessageSetCameraViewMatrix)message; SetupCameraMatrices(rMessage); break; } case MyRenderMessageEnum.DrawScene: { var rMessage = (MyRenderMessageBase)message; m_drawQueue.Enqueue(rMessage); break; } case MyRenderMessageEnum.RebuildCullingStructure: { break; } #region Profiler case MyRenderMessageEnum.RenderProfiler: { var profMessage = (MyRenderMessageRenderProfiler)message; MyRenderProfiler.HandleInput(profMessage.Command, profMessage.Index); break; } #endregion #region Characters case MyRenderMessageEnum.CreateRenderCharacter: { var rMessage = (MyRenderMessageCreateRenderCharacter)message; var actor = MyActorFactory.CreateCharacter(); var renderable = actor.GetRenderable(); renderable.SetModel(MyMeshes.GetMeshId(MyStringId.GetOrCompute(rMessage.Model), 1.0f)); actor.SetMatrix(ref rMessage.WorldMatrix); if (rMessage.ColorMaskHSV.HasValue) { var color = ColorFromMask(rMessage.ColorMaskHSV.Value); renderable.SetKeyColor(new Vector4(color, 1)); } actor.SetID(rMessage.ID); renderable.m_additionalFlags |= MyProxiesFactory.GetRenderableProxyFlags(rMessage.Flags); renderable.m_drawFlags = MyDrawSubmesh.MySubmeshFlags.Gbuffer | MyDrawSubmesh.MySubmeshFlags.Depth; break; } case MyRenderMessageEnum.SetCharacterSkeleton: { var rMessage = (MyRenderMessageSetCharacterSkeleton)message; var actor = MyIDTracker<MyActor>.FindByID(rMessage.CharacterID); if (actor != null) { actor.GetSkinning().SetSkeleton(rMessage.SkeletonBones, rMessage.SkeletonIndices); } //var entity = MyComponents.GetEntity(rMessage.CharacterID); //MyComponents.SetSkeleton(entity, rMessage.SkeletonBones, rMessage.SkeletonIndices); break; }; case MyRenderMessageEnum.SetCharacterTransforms: { var rMessage = (MyRenderMessageSetCharacterTransforms)message; var actor = MyIDTracker<MyActor>.FindByID(rMessage.CharacterID); if (actor != null) { actor.GetSkinning().SetAnimationBones(rMessage.BoneAbsoluteTransforms, rMessage.BoneDecalUpdates); } //var entity = MyComponents.GetEntity(rMessage.CharacterID); //MyComponents.SetAnimation(entity, rMessage.RelativeBoneTransforms); break; } case MyRenderMessageEnum.UpdateRenderEntity: { var rMessage = (MyRenderMessageUpdateRenderEntity)message; var actor = MyIDTracker<MyActor>.FindByID(rMessage.ID); if (actor == null) break; var renderableComponent = actor.GetRenderable(); if (renderableComponent == null) break; if (rMessage.ColorMaskHSV.HasValue) { actor.GetRenderable().SetKeyColor(new Vector4(ColorFromMask(rMessage.ColorMaskHSV.Value), 0)); } actor.GetRenderable().SetDithering(rMessage.Dithering); break; } case MyRenderMessageEnum.ChangeModel: { var rMessage = (MyRenderMessageChangeModel)message; var actor = MyIDTracker<MyActor>.FindByID(rMessage.ID); if (actor != null && actor.GetRenderable() != null) { var r = actor.GetRenderable(); var modelId = MyMeshes.GetMeshId(X.TEXT_(rMessage.Model), rMessage.Rescale); if(r.GetModel() != modelId) { r.SetModel(modelId); } } break; } case MyRenderMessageEnum.ChangeModelMaterial: { var rMessage = (MyRenderMessageChangeModelMaterial)message; //var matId = MyMeshMaterialId.NULL; //if (rMessage.Material.ToLower().Contains("debug")) //{ // matId = MyMeshMaterials1.DebugMaterialId; //} //else //{ // matId = MyMeshMaterials1.GetMaterialId(rMessage.Material); //} //MyAssetsLoader.GetModel(rMessage.Model).SetMaterial_SLOW(MyMeshMaterials1.GetProxyId(matId)); break; } #endregion #region Render objects case MyRenderMessageEnum.UpdateCockpitGlass: { var rMessage = (MyRenderMessageUpdateCockpitGlass)message; //if (MyRender11.Environment.CockpitGlass == null) //{ // MyRender11.Environment.CockpitGlass = MyActorFactory.CreateSceneObject(); //} //MyRender11.Environment.CockpitGlass.GetRenderable().SetModel(MyMeshes.GetMeshId(X.TEXT(rMessage.Model))); //MyRender11.Environment.CockpitGlass.SetVisibility(rMessage.Visible); //MyRender11.Environment.CockpitGlass.MarkRenderDirty(); //var matrix = (Matrix)rMessage.WorldMatrix; //MyRender11.Environment.CockpitGlass.SetMatrix(ref matrix); break; } case MyRenderMessageEnum.CreateRenderVoxelDebris: { var rMessage = (MyRenderMessageCreateRenderVoxelDebris)message; Matrix m = (Matrix)rMessage.WorldMatrix; var actor = MyActorFactory.CreateSceneObject(); if (rMessage.Model != null) { actor.GetRenderable().SetModel(MyMeshes.GetMeshId(X.TEXT_(rMessage.Model), 1.0f)); } actor.SetID(rMessage.ID); actor.SetMatrix(ref rMessage.WorldMatrix); MyRenderableComponent.DebrisEntityVoxelMaterial[rMessage.ID] = rMessage.VoxelMaterialIndex; break; } case MyRenderMessageEnum.CreateScreenDecal: { var rMessage = (MyRenderMessageCreateScreenDecal)message; MyScreenDecals.AddDecal(rMessage.ID, rMessage.ParentID, ref rMessage.TopoData, rMessage.Flags, rMessage.SourceTarget, rMessage.Material, rMessage.MaterialIndex); break; } case MyRenderMessageEnum.UpdateScreenDecal: { var rMessage = (MyRenderMessageUpdateScreenDecal)message; MyScreenDecals.UpdateDecals(rMessage.Decals); break; } case MyRenderMessageEnum.CreateRenderEntity: { var rMessage = (MyRenderMessageCreateRenderEntity)message; Matrix m = (Matrix)rMessage.WorldMatrix; var actor = MyActorFactory.CreateSceneObject(); if (rMessage.Model != null) { var model = MyAssetsLoader.ModelRemap.Get(rMessage.Model, rMessage.Model); actor.GetRenderable().SetModel(MyMeshes.GetMeshId(X.TEXT_(model), rMessage.Rescale)); } actor.SetID(rMessage.ID); actor.SetMatrix(ref rMessage.WorldMatrix); var renderable = actor.GetRenderable(); renderable.m_additionalFlags |= MyProxiesFactory.GetRenderableProxyFlags(rMessage.Flags); renderable.m_depthBias = rMessage.DepthBias; break; } case MyRenderMessageEnum.CreateRenderEntityClouds: { var rMessage = (MyRenderMessageCreateRenderEntityClouds)message; if (rMessage.Technique == MyMeshDrawTechnique.CLOUD_LAYER) { MyCloudRenderer.CreateCloudLayer( rMessage.ID, rMessage.CenterPoint, rMessage.Altitude, rMessage.MinScaledAltitude, rMessage.ScalingEnabled, rMessage.FadeOutRelativeAltitudeStart, rMessage.FadeOutRelativeAltitudeEnd, rMessage.ApplyFogRelativeDistance, rMessage.MaxPlanetHillRadius, rMessage.Model, rMessage.Textures, rMessage.RotationAxis, rMessage.AngularVelocity, rMessage.InitialRotation); } break; } case MyRenderMessageEnum.CreateRenderEntityAtmosphere: { var rMessage = (MyRenderMessageCreateRenderEntityAtmosphere)message; if (rMessage.Technique == MyMeshDrawTechnique.ATMOSPHERE) { float earthPlanetRadius = 6360000f; float earthAtmosphereRadius = 6420000f; float earthAtmosphereToPlanetRatio = earthAtmosphereRadius / earthPlanetRadius; float targetAtmosphereToPlanetRatio = rMessage.AtmosphereRadius / rMessage.PlanetRadius; float targetToEarthRatio = (targetAtmosphereToPlanetRatio - 1) / (earthAtmosphereToPlanetRatio - 1); earthAtmosphereRadius = earthPlanetRadius * targetAtmosphereToPlanetRatio; float planetScaleFactor = (rMessage.PlanetRadius) / earthPlanetRadius; float atmosphereScaleFactor = (rMessage.AtmosphereRadius - rMessage.PlanetRadius) / (rMessage.PlanetRadius * 0.5f); Vector3 rayleighScattering = new Vector3(5.8e-6f, 13.5e-6f, 33.1e-6f); Vector3 mieScattering = new Vector3(2e-5f, 2e-5f, 2e-5f); float rayleighHeightScale = 8000f; float mieHeightScale = 1200f; MyAtmosphereRenderer.CreateAtmosphere(rMessage.ID, rMessage.WorldMatrix, earthPlanetRadius, earthAtmosphereRadius, rayleighScattering, rayleighHeightScale, mieScattering, mieHeightScale, planetScaleFactor, atmosphereScaleFactor); } break; } case MyRenderMessageEnum.RemoveDecal: { var rMessage = (MyRenderMessageRemoveDecal)message; MyScreenDecals.RemoveDecal(rMessage.ID); MyRenderProxy.RemoveMessageId(rMessage.ID, MyRenderProxy.ObjectType.ScreenDecal); break; } case MyRenderMessageEnum.SetDecalGlobals: { var rMessage = (MyRenderMessageSetDecalGlobals)message; MyScreenDecals.SetDecalGlobals(rMessage.Globals); break; } case MyRenderMessageEnum.RegisterDecalsMaterials: { var rMessage = (MyRenderMessageRegisterScreenDecalsMaterials)message; MyScreenDecals.RegisterMaterials(rMessage.MaterialDescriptions); break; } case MyRenderMessageEnum.ClearDecals: { var rMessage = (MyRenderMessageClearScreenDecals)message; MyScreenDecals.ClearDecals(); break; } case MyRenderMessageEnum.UpdateRenderObject: { var rMessage = (MyRenderMessageUpdateRenderObject)message; MyRenderProxy.Assert(rMessage.ID != MyRenderProxy.RENDER_ID_UNASSIGNED); MyRenderProxy.ObjectType objectType; if (MyRenderProxy.ObjectTypes.TryGetValue(rMessage.ID, out objectType)) { switch (objectType) { case MyRenderProxy.ObjectType.Entity: var actor = MyIDTracker<MyActor>.FindByID(rMessage.ID); if (actor != null) { if (rMessage.LastMomentUpdateIndex != -1 && MyOpenVR.LmuDebugOnOff) MyOpenVR.LMUMatrixUpdate(ref rMessage.WorldMatrix, rMessage.LastMomentUpdateIndex); actor.SetMatrix(ref rMessage.WorldMatrix); if (rMessage.AABB.HasValue) { actor.SetAabb(rMessage.AABB.Value); } } break; case MyRenderProxy.ObjectType.Clipmap: if (MyClipmapFactory.ClipmapByID.ContainsKey(rMessage.ID)) { MyClipmapFactory.ClipmapByID[rMessage.ID].UpdateWorldMatrix(ref rMessage.WorldMatrix); } break; default: MyRenderProxy.Assert(false); break; } } else MyRenderProxy.Assert(false); break; } case MyRenderMessageEnum.RemoveRenderObject: { var rMessage = (MyRenderMessageRemoveRenderObject)message; MyRenderProxy.Assert(rMessage.ID != MyRenderProxy.RENDER_ID_UNASSIGNED); MyRenderProxy.ObjectType objectType; if (MyRenderProxy.ObjectTypes.TryGetValue(rMessage.ID, out objectType)) { switch (objectType) { case MyRenderProxy.ObjectType.Entity: var actor = MyIDTracker<MyActor>.FindByID(rMessage.ID); if (actor != null) { if (actor.GetRenderable() != null && actor.GetRenderable().GetModel().Info.Dynamic) { MyMeshes.RemoveMesh(actor.GetRenderable().GetModel()); } actor.Destruct(); MyScreenDecals.RemoveEntityDecals(rMessage.ID); } else MyRenderProxy.Assert(false); break; case MyRenderProxy.ObjectType.InstanceBuffer: MyInstancing.Remove(rMessage.ID); break; case MyRenderProxy.ObjectType.Light: MyLights.Remove(rMessage.ID); break; case MyRenderProxy.ObjectType.Clipmap: MyClipmapFactory.Remove(rMessage.ID); break; case MyRenderProxy.ObjectType.GPUEmitter: MyGPUEmitters.Remove(rMessage.ID); break; case MyRenderProxy.ObjectType.Atmosphere: MyAtmosphereRenderer.RemoveAtmosphere(rMessage.ID); break; case MyRenderProxy.ObjectType.Cloud: MyCloudRenderer.RemoveCloud(rMessage.ID); break; case MyRenderProxy.ObjectType.DebugDrawMesh: MyPrimitivesRenderer.RemoveDebugMesh(rMessage.ID); break; case MyRenderProxy.ObjectType.Video: MyVideoFactory.Remove(rMessage.ID); break; default: MyRenderProxy.Assert(false); break; } MyRenderProxy.RemoveMessageId(rMessage.ID, objectType); } else MyRenderProxy.Assert(false); break; } case MyRenderMessageEnum.UpdateRenderObjectVisibility: { var rMessage = (MyRenderMessageUpdateRenderObjectVisibility)message; MyRenderProxy.Assert(rMessage.ID != MyRenderProxy.RENDER_ID_UNASSIGNED); MyRenderProxy.ObjectType objectType; if (MyRenderProxy.ObjectTypes.TryGetValue(rMessage.ID, out objectType)) { switch (objectType) { case MyRenderProxy.ObjectType.Entity: var actor = MyIDTracker<MyActor>.FindByID(rMessage.ID); if (actor != null) { actor.SetVisibility(rMessage.Visible); } break; } } else MyRenderProxy.Assert(false); break; } case MyRenderMessageEnum.CreateRenderInstanceBuffer: { var rMessage = (MyRenderMessageCreateRenderInstanceBuffer)message; //var instancing = MyComponentFactory<MyInstancingComponent>.Create(); //instancing.SetID(rMessage.ID); //instancing.Init(rMessage.Type); //instancing.SetDebugName(rMessage.DebugName); MyInstancing.Create(rMessage.ID, rMessage.ParentID, rMessage.Type, rMessage.DebugName); break; } case MyRenderMessageEnum.UpdateRenderInstanceBufferSettings: { var rMessage = (MyRenderMessageUpdateRenderInstanceBufferSettings)message; //var instancing = MyIDTracker<MyInstancingComponent>.FindByID(rMessage.ID); //if(instancing != null) //{ // instancing.UpdateGeneric(rMessage.InstanceData, rMessage.Capacity); //} var handle = MyInstancing.Get(rMessage.ID); if (handle != InstancingId.NULL) { // TODO: Do something :P MyInstancing.UpdateGenericSettings(handle, rMessage.SetPerInstanceLod); } else { // MyRenderProxy.Assert(handle != InstancingId.NULL, "No instance buffer with ID " + rMessage.ID); } break; } case MyRenderMessageEnum.UpdateRenderInstanceBufferRange: { var rMessage = (MyRenderMessageUpdateRenderInstanceBufferRange)message; //var instancing = MyIDTracker<MyInstancingComponent>.FindByID(rMessage.ID); //if(instancing != null) //{ // instancing.UpdateGeneric(rMessage.InstanceData, rMessage.Capacity); //} // TODO: Turn this into partial update. var handle = MyInstancing.Get(rMessage.ID); if (handle != InstancingId.NULL) { MyInstancing.UpdateGeneric(handle, rMessage.InstanceData, rMessage.InstanceData.Length); } else { // Debug.Assert(handle != InstancingId.NULL, "No instance buffer with ID " + rMessage.ID); } break; } case MyRenderMessageEnum.UpdateRenderCubeInstanceBuffer: { var rMessage = (MyRenderMessageUpdateRenderCubeInstanceBuffer)message; //var instancing = MyIDTracker<MyInstancingComponent>.FindByID(rMessage.ID); //if (instancing != null) //{ // instancing.UpdateCube(rMessage.InstanceData, rMessage.Capacity); //} var handle = MyInstancing.Get(rMessage.ID); if (handle != InstancingId.NULL) { MyInstancing.UpdateCube(MyInstancing.Get(rMessage.ID), rMessage.InstanceData, rMessage.DecalsData, rMessage.Capacity); } else Debug.Fail("No instance buffer with ID " + rMessage.ID); break; } case MyRenderMessageEnum.SetInstanceBuffer: { var rMessage = (MyRenderMessageSetInstanceBuffer)message; var actor = MyIDTracker<MyActor>.FindByID(rMessage.ID); //var instancing = MyIDTracker<MyInstancingComponent>.FindByID(rMessage.InstanceBufferId); if (actor != null) { //if (actor.GetComponent(MyActorComponentEnum.Instancing) != instancing) //{ // actor.AddComponent(instancing); //} //actor.SetLocalAabb(rMessage.LocalAabb); //actor.GetRenderable().SetInstancingCounters(rMessage.InstanceCount, rMessage.InstanceStart); actor.GetRenderable().SetInstancing(MyInstancing.Get(rMessage.InstanceBufferId)); actor.SetLocalAabb(rMessage.LocalAabb); actor.GetRenderable().SetInstancingCounters(rMessage.InstanceCount, rMessage.InstanceStart); } break; } case MyRenderMessageEnum.CreateManualCullObject: { var rMessage = (MyRenderMessageCreateManualCullObject)message; var actor = MyActorFactory.CreateGroup(); actor.SetID(rMessage.ID); Matrix m = (Matrix)rMessage.WorldMatrix; actor.SetMatrix(ref rMessage.WorldMatrix); break; } case MyRenderMessageEnum.SetParentCullObject: { var rMessage = (MyRenderMessageSetParentCullObject)message; var child = MyIDTracker<MyActor>.FindByID(rMessage.ID); var parent = MyIDTracker<MyActor>.FindByID(rMessage.CullObjectID); if (child != null && parent != null && parent.GetGroupRoot() != null && child.GetGroupLeaf() == null) { child.SetRelativeTransform(rMessage.ChildToParent); parent.GetGroupRoot().Add(child); } break; } case MyRenderMessageEnum.CreateLineBasedObject: { var rMessage = (MyRenderMessageCreateLineBasedObject)message; var actor = MyActorFactory.CreateSceneObject(); //actor.GetRenderable().SetModel(new MyDynamicMesh()); actor.SetID(rMessage.ID); actor.SetMatrix(ref MatrixD.Identity); MyMeshMaterials1.GetMaterialId("__ROPE_MATERIAL", null, rMessage.ColorMetalTexture, rMessage.NormalGlossTexture, rMessage.ExtensionTexture, MyMesh.DEFAULT_MESH_TECHNIQUE); actor.GetRenderable().SetModel(MyMeshes.CreateRuntimeMesh(X.TEXT_("LINE" + rMessage.ID), 1, true)); break; } case MyRenderMessageEnum.UpdateLineBasedObject: { var rMessage = (MyRenderMessageUpdateLineBasedObject)message; var actor = MyIDTracker<MyActor>.FindByID(rMessage.ID); if (actor != null) { //var mesh = actor.GetRenderable().GetMesh() as MyDynamicMesh; MyVertexFormatPositionH4 [] stream0; MyVertexFormatTexcoordNormalTangent [] stream1; MyLineHelpers.GenerateVertexData(ref rMessage.WorldPointA, ref rMessage.WorldPointB, out stream0, out stream1); var indices = MyLineHelpers.GenerateIndices(stream0.Length); var sections = new MySectionInfo[] { new MySectionInfo { TriCount = indices.Length / 3, IndexStart = 0, MaterialName = "__ROPE_MATERIAL" } }; MyMeshes.UpdateRuntimeMesh(MyMeshes.GetMeshId(X.TEXT_("LINE" + rMessage.ID), 1.0f), indices, stream0, stream1, sections, (BoundingBox)MyLineHelpers.GetBoundingBox(ref rMessage.WorldPointA, ref rMessage.WorldPointB)); //actor.SetAabb((BoundingBox)MyLineHelpers.GetBoundingBox(ref rMessage.WorldPointA, ref rMessage.WorldPointB)); actor.MarkRenderDirty(); var matrix = MatrixD.CreateTranslation((Vector3)(rMessage.WorldPointA + rMessage.WorldPointB) * 0.5f); actor.SetMatrix(ref matrix); } break; } case MyRenderMessageEnum.SetRenderEntityData: { var rMessage = (MyRenderMessageSetRenderEntityData)message; MyRenderProxy.Assert(false, "MyRenderMessageSetRenderEntityData is deprecated!"); break; } case MyRenderMessageEnum.AddRuntimeModel: { var rMessage = (MyRenderMessageAddRuntimeModel)message; //MyDestructionMesh mesh = MyDestructionMesh.ModelsDictionary.Get(rMessage.Name); //if (mesh == null) //{ //mesh = new MyDestructionMesh(rMessage.Name); //ProfilerShort.Begin("LoadBuffers"); //mesh.Fill(rMessage.ModelData.Indices, rMessage.ModelData.Positions, rMessage.ModelData.Normals, rMessage.ModelData.Tangents, rMessage.ModelData.TexCoords, rMessage.ModelData.Sections, rMessage.ModelData.AABB); //ProfilerShort.End(); if(!MyMeshes.Exists(rMessage.Name)) { { ushort[] indices = new ushort[rMessage.ModelData.Indices.Count]; for (int i = 0; i < rMessage.ModelData.Indices.Count; i++) { indices[i] = (ushort)rMessage.ModelData.Indices[i]; } var verticesNum = rMessage.ModelData.Positions.Count; MyVertexFormatPositionH4[] stream0 = new MyVertexFormatPositionH4[verticesNum]; MyVertexFormatTexcoordNormalTangent[] stream1 = new MyVertexFormatTexcoordNormalTangent[verticesNum]; for (int i = 0; i < verticesNum; i++) { stream0[i] = new MyVertexFormatPositionH4(rMessage.ModelData.Positions[i]); stream1[i] = new MyVertexFormatTexcoordNormalTangent( rMessage.ModelData.TexCoords[i], rMessage.ModelData.Normals[i], rMessage.ModelData.Tangents[i]); } var id = MyMeshes.CreateRuntimeMesh(X.TEXT_(rMessage.Name), rMessage.ModelData.Sections.Count, false); MyMeshes.UpdateRuntimeMesh(id, indices, stream0, stream1, rMessage.ModelData.Sections.ToArray(), rMessage.ModelData.AABB); } if (rMessage.ReplacedModel != null) { //MyAssetsLoader.ModelRemap[rMessage.ReplacedModel] = rMessage.Name; MyAssetsLoader.ModelRemap[rMessage.Name] = rMessage.ReplacedModel; } //if (MyAssetsLoader.LOG_MESH_STATISTICS) //{ // mesh.DebugWriteInfo(); //} } break; } case MyRenderMessageEnum.UpdateModelProperties: { var rMessage = (MyRenderMessageUpdateModelProperties)message; var actor = MyIDTracker<MyActor>.FindByID(rMessage.ID); if (actor != null) { // careful, lod is ignored after all (properties apply to all lods) var key = new MyEntityMaterialKey { LOD = rMessage.LOD, Material = X.TEXT_(rMessage.MaterialName) }; if(rMessage.Enabled.HasValue) { if (!MyScene.EntityDisabledMaterials.ContainsKey(rMessage.ID)) { MyScene.EntityDisabledMaterials.Add(rMessage.ID, new HashSet<MyEntityMaterialKey>()); } if (!rMessage.Enabled.Value) { MyScene.EntityDisabledMaterials[rMessage.ID].Add(key); } else { MyScene.EntityDisabledMaterials[rMessage.ID].Remove(key); } } var renderableComponent = actor.GetRenderable(); if ((rMessage.Emissivity.HasValue || rMessage.DiffuseColor.HasValue) && !renderableComponent.ModelProperties.ContainsKey(key)) { renderableComponent.ModelProperties[key] = new MyModelProperties(); } if(rMessage.Emissivity.HasValue) { renderableComponent.ModelProperties[key].Emissivity = rMessage.Emissivity.Value; } if(rMessage.DiffuseColor.HasValue) { renderableComponent.ModelProperties[key].ColorMul = rMessage.DiffuseColor.Value; } actor.MarkRenderDirty(); MyOutline.HandleOutline(rMessage.ID, rMessage.MeshIndex, rMessage.OutlineColor, rMessage.OutlineThickness, rMessage.PulseTimeInFrames); } break; } case MyRenderMessageEnum.UpdateModelHighlight: { var rMessage = (MyRenderMessageUpdateModelHighlight)message; var actor = MyIDTracker<MyActor>.FindByID(rMessage.ID); if (actor != null) { MyOutline.HandleOutline(rMessage.ID, rMessage.SectionIndices, rMessage.OutlineColor, rMessage.Thickness, rMessage.PulseTimeInFrames, rMessage.InstanceIndex); if (rMessage.SubpartIndices != null) foreach (uint index in rMessage.SubpartIndices) MyOutline.HandleOutline(index, null, rMessage.OutlineColor, rMessage.Thickness, rMessage.PulseTimeInFrames, -1); } break; } case MyRenderMessageEnum.UpdateColorEmissivity: { var rMessage = (MyRenderMessageUpdateColorEmissivity)message; var actor = MyIDTracker<MyActor>.FindByID(rMessage.ID); if (actor != null) { actor.GetRenderable().UpdateColorEmissivity(rMessage.LOD, rMessage.MaterialName, rMessage.DiffuseColor, rMessage.Emissivity); } break; } case MyRenderMessageEnum.PreloadModel: { var rMessage = (MyRenderMessagePreloadModel) message; //MyAssetsLoader.GetModel(rMessage.Name); MyMeshes.GetMeshId(X.TEXT_(rMessage.Name), rMessage.Rescale); break; } case MyRenderMessageEnum.ChangeMaterialTexture: { var rMessage = (MyRenderMessageChangeMaterialTexture)message; var actor = MyIDTracker<MyActor>.FindByID(rMessage.RenderObjectID); if (actor != null) { var r = actor.GetRenderable(); var key = new MyEntityMaterialKey { LOD = 0, Material = X.TEXT_(rMessage.MaterialName) }; if (!r.ModelProperties.ContainsKey(key)) { r.ModelProperties[key] = new MyModelProperties(); } if (r.ModelProperties[key].TextureSwaps == null) { r.ModelProperties[key].TextureSwaps = new List<MyMaterialTextureSwap>(); foreach(var s in rMessage.Changes) { r.ModelProperties[key].TextureSwaps.Add(new MyMaterialTextureSwap { TextureName = X.TEXT_(s.TextureName), MaterialSlot = s.MaterialSlot }); } } else { foreach (var s in rMessage.Changes) { bool swapped = false; for(int i=0; i<r.ModelProperties[key].TextureSwaps.Count; ++i) { if(r.ModelProperties[key].TextureSwaps[i].MaterialSlot == s.MaterialSlot) { r.ModelProperties[key].TextureSwaps[i] = new MyMaterialTextureSwap { TextureName = X.TEXT_(s.TextureName), MaterialSlot = s.MaterialSlot }; swapped = true; break; } } if(!swapped) { r.ModelProperties[key].TextureSwaps.Add(new MyMaterialTextureSwap { TextureName = X.TEXT_(s.TextureName), MaterialSlot = s.MaterialSlot }); } } } r.FreeCustomRenderTextures(key); actor.MarkRenderDirty(); } rMessage.Changes.Clear(); break; } case MyRenderMessageEnum.DrawTextToMaterial: { var rMessage = (MyRenderMessageDrawTextToMaterial)message; //rMessage.EntityId //rMessage.FontColor //rMessage.MaterialName //rMessage.Text; //rMessage.TextScale; var actor = MyIDTracker<MyActor>.FindByID(rMessage.RenderObjectID); if (actor != null) { var renderableComponent = actor.GetRenderable(); var key = new MyEntityMaterialKey { LOD = 0, Material = X.TEXT_(rMessage.MaterialName) }; if (!renderableComponent.ModelProperties.ContainsKey(key)) renderableComponent.ModelProperties[key] = new MyModelProperties(); else renderableComponent.ModelProperties[key].TextureSwaps = null; IRtvTexture handle = renderableComponent.ModelProperties[key].CustomRenderedTexture; if (handle == null && MyModelProperties.CustomTextures < MyModelProperties.MaxCustomTextures) { MyRwTextureManager texManager = MyManagers.RwTextures; handle = texManager.CreateRtv("RenderableComponent.ModelProperties[key].CustomRenderedTexture", rMessage.TextureResolution * rMessage.TextureAspectRatio, rMessage.TextureResolution, SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, optionFlags: ResourceOptionFlags.GenerateMipMaps, mipmapLevels: 1); renderableComponent.ModelProperties[key].CustomRenderedTexture = handle; ++MyModelProperties.CustomTextures; } if (handle != null) { var clearColor = new SharpDX.Color4(rMessage.BackgroundColor.PackedValue); clearColor.Alpha = 0; MyRender11.RC.ClearRtv(handle, clearColor); // my sprites renderer -> push state MySpritesRenderer.PushState(new Vector2(rMessage.TextureResolution * rMessage.TextureAspectRatio, rMessage.TextureResolution)); MySpritesRenderer.DrawText(Vector2.Zero, new StringBuilder(rMessage.Text), rMessage.FontColor, rMessage.TextScale); // render text with fonts to rt // update texture of proxy MySpritesRenderer.Draw(handle, new MyViewport(rMessage.TextureResolution * rMessage.TextureAspectRatio, rMessage.TextureResolution), MyBlendStateManager.BlendAlphaPremultNoAlphaChannel); // render to rt // my sprites renderer -> pop state MySpritesRenderer.PopState(); MyRender11.RC.GenerateMips(handle); actor.MarkRenderDirty(); } else { MyRenderProxy.TextNotDrawnToTexture(rMessage.EntityId); } } else { MyRenderProxy.TextNotDrawnToTexture(rMessage.EntityId); } break; } case MyRenderMessageEnum.PreloadMaterials: { var rMessage = (MyRenderMessagePreloadMaterials)message; //MyAssetsLoader.GetMaterials(rMessage.Name); MyMeshes.GetMeshId(X.TEXT_(rMessage.Name), 1.0f); break; } #endregion #region Voxels case MyRenderMessageEnum.CreateClipmap: { var rMessage = (MyRenderMessageCreateClipmap)message; var clipmap = new MyClipmapHandler(rMessage.ClipmapId, rMessage.ScaleGroup, rMessage.WorldMatrix, rMessage.SizeLod0, rMessage.Position, rMessage.PlanetRadius, rMessage.SpherizeWithDistance, rMessage.AdditionalRenderFlags, rMessage.PrunningFunc); MyClipmapFactory.ClipmapByID[rMessage.ClipmapId] = clipmap; clipmap.Base.LoadContent(); break; } case MyRenderMessageEnum.UpdateClipmapCell: { var rMessage = (MyRenderMessageUpdateClipmapCell)message; var clipmap = MyClipmapFactory.ClipmapByID.Get(rMessage.ClipmapId); MyRenderProxy.Assert(clipmap != null); if (clipmap != null) { clipmap.Base.UpdateCell(rMessage); } break; } case MyRenderMessageEnum.UpdateMergedVoxelMesh: { var rMessage = (MyRenderMessageUpdateMergedVoxelMesh)message; MyClipmapHandler clipmap = MyClipmapFactory.ClipmapByID.Get(rMessage.ClipmapId); if (clipmap != null) clipmap.UpdateMergedMesh(rMessage); break; } case MyRenderMessageEnum.ResetMergedVoxels: { var rMessage = (MyRenderMessageResetMergedVoxels)message; foreach(var clipmapHandler in MyClipmapFactory.ClipmapByID.Values) { if (clipmapHandler != null) clipmapHandler.ResetMergedMeshes(); } break; } case MyRenderMessageEnum.InvalidateClipmapRange: { var rMessage = (MyRenderMessageInvalidateClipmapRange)message; var clipmap = MyClipmapFactory.ClipmapByID.Get(rMessage.ClipmapId); if (clipmap != null) { clipmap.Base.InvalidateRange(rMessage.MinCellLod0, rMessage.MaxCellLod0); } break; } case MyRenderMessageEnum.CreateRenderVoxelMaterials: { var rMessage = (MyRenderMessageCreateRenderVoxelMaterials)message; MyRenderProxy.Assert(MyVoxelMaterials1.CheckIndices(rMessage.Materials)); MyVoxelMaterials1.Set(rMessage.Materials); rMessage.Materials = null; break; } case MyRenderMessageEnum.UpdateRenderVoxelMaterials: { var rMessage = (MyRenderMessageUpdateRenderVoxelMaterials)message; MyVoxelMaterials1.Set(rMessage.Materials, true); rMessage.Materials = null; break; } #endregion #region Lights case MyRenderMessageEnum.CreateRenderLight: { var rMessage = (MyRenderMessageCreateRenderLight)message; MyLights.Create(rMessage.ID); break; } case MyRenderMessageEnum.UpdateRenderLight: { var rMessage = (MyRenderMessageUpdateRenderLight)message; var light = MyLights.Get(rMessage.Data.ID); if(light != LightId.NULL) { var lightInfo = new MyLightInfo { FlareId = FlareId.NULL, SpotPosition = rMessage.Data.Position, PointPosition = rMessage.Data.Position + rMessage.Data.PointPositionOffset * rMessage.Data.PointLight.Range * rMessage.Data.SpotLight.Direction, CastsShadows = rMessage.Data.CastShadows, ShadowsDistance = rMessage.Data.ShadowDistance, ParentGID = rMessage.Data.ParentID, UsedInForward = rMessage.Data.UseInForwardRender }; MyLights.UpdateEntity(light, ref lightInfo); if (rMessage.Data.Type.HasFlag(LightTypeEnum.PointLight)) { MyLights.UpdatePointlight(light, rMessage.Data.PointLightOn, rMessage.Data.PointLightIntensity, rMessage.Data.PointLight); } if (rMessage.Data.Type.HasFlag(LightTypeEnum.Spotlight)) { MyLights.UpdateSpotlight(light, rMessage.Data.SpotLightOn, rMessage.Data.SpotLightIntensity, rMessage.Data.ReflectorConeMaxAngleCos, rMessage.Data.SpotLight, MyManagers.FileTextures.GetTexture(rMessage.Data.ReflectorTexture, MyFileTextureEnum.CUSTOM)); } light.FlareId = MyFlareRenderer.Update(rMessage.Data.ParentID, light.FlareId, rMessage.Data.Glare); } break; } case MyRenderMessageEnum.SetLightShadowIgnore: { var rMessage = (MyRenderMessageSetLightShadowIgnore)message; var light = MyLights.Get(rMessage.ID); var actor = MyIDTracker<MyActor>.FindByID(rMessage.ID2); if(light != LightId.NULL && actor != null) { if(!MyLights.IgnoredEntitites.ContainsKey(light)) { MyLights.IgnoredEntitites[light] = new HashSet<uint>(); } MyLights.IgnoredEntitites[light].Add(rMessage.ID2); } break; } case MyRenderMessageEnum.ClearLightShadowIgnore: { var rMessage = (MyRenderMessageClearLightShadowIgnore)message; var light = MyLights.Get(rMessage.ID); if(light != LightId.NULL) { MyLights.IgnoredEntitites.Remove(light); } break; } case MyRenderMessageEnum.UpdateShadowSettings: { var rMessage = (MyRenderMessageUpdateShadowSettings)message; MyShadowCascades.Settings.CopyFrom(rMessage.Settings); MyManagers.Shadow.SetSettings(rMessage.Settings); break; } case MyRenderMessageEnum.UpdateFogSettings: { var rMessage = (MyRenderMessageUpdateFogSettings)message; if (m_debugOverrides.Fog) MyRender11.Environment.Fog = rMessage.Settings; else MyRender11.Environment.Fog.FogDensity = 0; break; } case MyRenderMessageEnum.UpdateAtmosphereSettings: { var rMessage = (MyRenderMessageUpdateAtmosphereSettings)message; MyAtmosphereRenderer.UpdateSettings(rMessage.ID, rMessage.Settings); break; } case MyRenderMessageEnum.EnableAtmosphere: { var rMessage = (MyRenderMessageEnableAtmosphere)message; MyAtmosphereRenderer.Enabled = rMessage.Enabled; break; } case MyRenderMessageEnum.UpdateCloudLayerFogFlag: { var rMessage = (MyRenderMessageUpdateCloudLayerFogFlag)message; MyCloudRenderer.DrawFog = rMessage.ShouldDrawFog; break; } case MyRenderMessageEnum.UpdateRenderEnvironment: { var rMessage = (MyRenderMessageUpdateRenderEnvironment)message; MyRender11.Environment.Data = rMessage.Data; m_resetEyeAdaptation |= rMessage.ResetEyeAdaptation; /*MyRender11.Environment.DirectionalLightDir = VRageMath.Vector3.Normalize(rMessage.SunDirection); if (rMessage.SunLightOn && m_debugOverrides.Sun) MyRender11.Environment.DirectionalLightIntensity = rMessage.SunColor; else MyRender11.Environment.DirectionalLightIntensity = new Vector3(0, 0, 0); for (int lightIndex = 0; lightIndex < MyRender11.Environment.AdditionalSunIntensities.Length; ++lightIndex) { MyRender11.Environment.AdditionalSunIntensities[lightIndex] = rMessage.AdditionalSunIntensities[lightIndex]; MyRender11.Environment.AdditionalSunColors[lightIndex] = rMessage.AdditionalSunColors[lightIndex]; MyRender11.Environment.AdditionalSunDirections[lightIndex] = rMessage.AdditionalSunDirections[lightIndex]; } MyRender11.Environment.DayTime = (float)(rMessage.DayTime - Math.Truncate(rMessage.DayTime)); MyRender11.Environment.SunDistance = rMessage.DistanceToSun; MyRender11.Environment.SunColor = rMessage.SunColor; MyRender11.Environment.SunMaterial = rMessage.SunMaterial; MyRender11.Environment.SunSizeMultiplier = rMessage.SunSizeMultiplier; MyRender11.Environment.SunBillboardEnabled = rMessage.SunBillboardEnabled; MyRender11.Environment.PlanetFactor = rMessage.PlanetFactor; MyRender11.Environment.Skybox = rMessage.DayBackgroundTexture; MyRender11.Environment.NightSkybox = rMessage.NightBackgroundTexture; MyRender11.Environment.NightSkyboxPrefiltered = rMessage.NightBackgroundPrefilteredTexture; MyRender11.Environment.BackgroundOrientation = rMessage.BackgroundOrientation; MyRender11.Environment.BackgroundColor = rMessage.BackgroundColor; m_resetEyeAdaptation |= rMessage.ResetEyeAdaptation;*/ break; } case MyRenderMessageEnum.UpdateEnvironmentMap: { break; } case MyRenderMessageEnum.UpdateDebugOverrides: { var rMessage = (MyRenderMessageUpdateDebugOverrides)message; bool oldFXAA = FxaaEnabled; m_debugOverrides = rMessage.Overrides; bool newFXAA = FxaaEnabled; if (oldFXAA != newFXAA) UpdateAntialiasingMode(m_renderSettings.AntialiasingMode, m_renderSettings.AntialiasingMode); break; } case MyRenderMessageEnum.UpdatePostprocessSettings: { var rMessage = (MyRenderMessageUpdatePostprocessSettings)message; Postprocess = rMessage.Settings; if (Postprocess.EnableEyeAdaptation != rMessage.Settings.EnableEyeAdaptation) m_resetEyeAdaptation = true; break; } case MyRenderMessageEnum.UpdateSSAOSettings: { var rMessage = (MyRenderMessageUpdateSSAOSettings)message; MySSAO.Params = rMessage.Settings; break; } case MyRenderMessageEnum.UpdateHBAO: { var rMessage = (MyRenderMessageUpdateHBAO)message; MyHBAO.Params = rMessage.Data; break; } #endregion #region Sprites case MyRenderMessageEnum.DrawSprite: case MyRenderMessageEnum.DrawSpriteNormalized: case MyRenderMessageEnum.DrawSpriteAtlas: case MyRenderMessageEnum.SpriteScissorPush: case MyRenderMessageEnum.SpriteScissorPop: { m_drawQueue.Enqueue(message); break; } #endregion #region Fonts and text case MyRenderMessageEnum.CreateFont: { var createFontMessage = message as MyRenderMessageCreateFont; MyRenderProxy.Assert(createFontMessage != null); var renderFont = new MyRenderFont(createFontMessage.FontPath); renderFont.LoadContent(); AddFont(createFontMessage.FontId, renderFont, createFontMessage.IsDebugFont); break; } case MyRenderMessageEnum.DrawString: { m_drawQueue.Enqueue(message); break; } #endregion #region Textures // TODO: these messages need to be reviewed: case MyRenderMessageEnum.PreloadTextures: { var preloadMsg = message as MyRenderMessagePreloadTextures; //MyFileTextureManager.Load(preloadMsg.Texture); //MyTextureManager.PreloadTextures(preloadMsg.InDirectory, preloadMsg.Recursive); //MyTextures.UnloadTexture(texMessage.Texture); break; } case MyRenderMessageEnum.UnloadTexture: { var texMessage = (MyRenderMessageUnloadTexture)message; MyFileTextureManager texManager = MyManagers.FileTextures; texManager.DisposeTex(texMessage.Texture); //MyTextures.UnloadTexture(texMessage.Texture); break; } case MyRenderMessageEnum.ReloadTextures: { var reloadMsg = (MyRenderMessageReloadTextures)message; MyVoxelMaterials1.InvalidateMaterials(); MyMeshMaterials1.InvalidateMaterials(); MyFileTextureManager texManager = MyManagers.FileTextures; texManager.DisposeTex(MyFileTextureManager.MyFileTextureHelper.IsAssetTextureFilter); MyGPUEmitters.ReloadTextures(); MyRender11.ReloadFonts(); //MyTextureManager.UnloadTextures(); //MyMaterialProxyFactory.ReloadTextures(); break; } case MyRenderMessageEnum.ReloadModels: { var reloadMsg = (MyRenderMessageReloadModels)message; //MyMaterials.Clear(); MyAssetsLoader.ReloadMeshes(); MyRenderableComponent.MarkAllDirty(); break; } #endregion case MyRenderMessageEnum.TakeScreenshot: { var rMessage = (MyRenderMessageTakeScreenshot)message; m_screenshot = new MyScreenshot(rMessage.PathToSave, rMessage.SizeMultiplier, rMessage.IgnoreSprites, rMessage.ShowNotification); break; } case MyRenderMessageEnum.ReloadEffects: { //MyShaderBundleFactory.ClearCache(); //MyShaderMaterial.ClearCache(); //MyShaderPass.ClearCache(); MyShaders.Recompile(); MyMaterialShaders.Recompile(); MyAtmosphereRenderer.RecomputeAtmospheres(); MyRenderableComponent.MarkAllDirty(); foreach (var f in MyComponentFactory<MyFoliageComponent>.GetAll()) { f.Dispose(); } break; } case MyRenderMessageEnum.ReloadGrass: { MyRenderProxy.ReloadEffects(); // Need some delay break; } case MyRenderMessageEnum.PlayVideo: { var rMessage = (MyRenderMessagePlayVideo)message; MyVideoFactory.Create(rMessage.ID, rMessage.VideoFile); var video = MyVideoFactory.Videos.Get(rMessage.ID); if (video != null) { video.Volume = rMessage.Volume; } break; } case MyRenderMessageEnum.CloseVideo: { var rMessage = (MyRenderMessageCloseVideo)message; MyVideoFactory.Remove(rMessage.ID); MyRenderProxy.RemoveMessageId(rMessage.ID, MyRenderProxy.ObjectType.Video); break; } case MyRenderMessageEnum.UpdateGameplayFrame: { var rMessage = (MyRenderMessageUpdateGameplayFrame)message; GameplayFrameCounter = rMessage.GameplayFrame; break; } case MyRenderMessageEnum.DrawVideo: { var rMessage = (MyRenderMessageDrawVideo)message; var video = MyVideoFactory.Videos.Get(rMessage.ID); if (video != null) { video.Draw(rMessage.Rectangle, rMessage.Color, rMessage.FitMode); } break; } case MyRenderMessageEnum.UpdateVideo: { var rMessage = (MyRenderMessageUpdateVideo)message; var video = MyVideoFactory.Videos.Get(rMessage.ID); if(video != null) { video.Update(); } break; } case MyRenderMessageEnum.SetVideoVolume: { var rMessage = (MyRenderMessageSetVideoVolume)message; var video = MyVideoFactory.Videos.Get(rMessage.ID); if (video != null) { video.Volume = rMessage.Volume; } break; } case MyRenderMessageEnum.VideoAdaptersRequest: { MyRenderProxy.SendVideoAdapters(GetAdaptersList()); break; } case MyRenderMessageEnum.SwitchDeviceSettings: { MyRenderProxy.RenderThread.SwitchSettings((message as MyRenderMessageSwitchDeviceSettings).Settings); break; } case MyRenderMessageEnum.SwitchRenderSettings: { var rMessage = (MyRenderMessageSwitchRenderSettings)message; if (rMessage.Settings.HasValue) UpdateRenderSettings(rMessage.Settings.Value); if (rMessage.SettingsOld.HasValue) MyRender11.Settings = rMessage.SettingsOld.Value; break; } case MyRenderMessageEnum.SetMouseCapture: { var umc = message as MyRenderMessageSetMouseCapture; MyRenderProxy.RenderThread.SetMouseCapture(umc.Capture); break; } case MyRenderMessageEnum.UnloadData: { MyRender11.UnloadData(); break; } case MyRenderMessageEnum.CollectGarbage: { GC.Collect(); break; } case MyRenderMessageEnum.SetFrameTimeStep: { var rMessage = message as MyRenderMessageSetFrameTimeStep; MyCommon.SetFrameTimeStep(rMessage.TimeStep); break; } case MyRenderMessageEnum.ResetRandomness: { var rMessage = message as MyRenderMessageResetRandomness; MyCommon.SetRandomSeed(rMessage.Seed); break; } case MyRenderMessageEnum.RenderColoredTexture: { var rMessage = (MyRenderMessageRenderColoredTexture)message; m_texturesToRender.AddRange(rMessage.texturesToRender); break; } case MyRenderMessageEnum.CreateGPUEmitter: { var rMessage = (MyRenderMessageCreateGPUEmitter)message; //MyLight.Create(rMessage.ID); MyGPUEmitters.Create(rMessage.ID); break; } case MyRenderMessageEnum.UpdateGPUEmitters: { var rMessage = (MyRenderMessageUpdateGPUEmitters)message; MyGPUEmitters.UpdateData(rMessage.Emitters); break; } case MyRenderMessageEnum.UpdateGPUEmittersTransform: { var rMessage = (MyRenderMessageUpdateGPUEmittersTransform)message; MyGPUEmitters.UpdateTransforms(rMessage.GIDs, rMessage.Transforms); break; } case MyRenderMessageEnum.RemoveGPUEmitter: { var rMessage = (MyRenderMessageRemoveGPUEmitter)message; MyGPUEmitters.Remove(rMessage.GID, rMessage.Instant, false); MyRenderProxy.RemoveMessageId(rMessage.GID, MyRenderProxy.ObjectType.GPUEmitter); break; } #region Debug case MyRenderMessageEnum.DebugDrawPoint: case MyRenderMessageEnum.DebugDrawLine3D: case MyRenderMessageEnum.DebugDrawLine2D: case MyRenderMessageEnum.DebugDrawSphere: case MyRenderMessageEnum.DebugDrawAABB: case MyRenderMessageEnum.DebugDrawAxis: case MyRenderMessageEnum.DebugDrawOBB: case MyRenderMessageEnum.DebugDraw6FaceConvex: case MyRenderMessageEnum.DebugDrawCone: case MyRenderMessageEnum.DebugDrawTriangle: case MyRenderMessageEnum.DebugDrawCapsule: case MyRenderMessageEnum.DebugDrawText2D: case MyRenderMessageEnum.DebugDrawText3D: case MyRenderMessageEnum.DebugDrawModel: case MyRenderMessageEnum.DebugDrawTriangles: case MyRenderMessageEnum.DebugDrawPlane: case MyRenderMessageEnum.DebugDrawCylinder: case MyRenderMessageEnum.DebugDrawFrustrum: case MyRenderMessageEnum.DebugDrawMesh: case MyRenderMessageEnum.DebugWaitForPresent: case MyRenderMessageEnum.DebugClearPersistentMessages: { m_debugDrawMessages.Enqueue(message); } break; case MyRenderMessageEnum.DebugCrashRenderThread: { throw new InvalidOperationException("Forced exception"); } case MyRenderMessageEnum.DebugPrintAllFileTexturesIntoLog: { MyRender11.Log.WriteLine(MyManagers.FileTextures.GetFileTexturesDesc().ToString());; MyRender11.Log.WriteLine(MyManagers.FileArrayTextures.GetFileTexturesDesc().ToString()); break; } #endregion } }
public void AttachModelList(List <Object3D> objs) { for (int i = 0; i < objs.Count; ++i) { var ob = objs[i]; var vertColor = new Color4((float)i / objs.Count, 0, 1 - (float)i / objs.Count, 1); ob.Geometry.Colors = new HelixToolkit.Wpf.SharpDX.Core.Color4Collection(Enumerable.Repeat(vertColor, ob.Geometry.Positions.Count)); ob.Geometry.UpdateOctree(); ob.Geometry.UpdateBounds(); context.Post((o) => { var scaleTransform = new Media3D.ScaleTransform3D(15, 15, 15); var s = new MeshGeometryModel3D { Geometry = ob.Geometry, CullMode = SharpDX.Direct3D11.CullMode.Back, IsThrowingShadow = true, Transform = scaleTransform }; var diffuseMaterial = new DiffuseMaterial(); PBRMaterial pbrMaterial = null; if (ob.Material is PhongMaterialCore p) { var phong = p.ConvertToPhongMaterial(); phong.RenderEnvironmentMap = true; phong.RenderShadowMap = true; phong.RenderSpecularColorMap = false; s.Material = phong; diffuseMaterial.DiffuseColor = p.DiffuseColor; diffuseMaterial.DiffuseMap = p.DiffuseMap; pbrMaterial = new PBRMaterial() { AlbedoColor = p.DiffuseColor, AlbedoMap = p.DiffuseMap, NormalMap = p.NormalMap, RMAMap = p.SpecularColorMap, RenderShadowMap = true, RenderEnvironmentMap = true, }; } //if (ob.Transform != null && ob.Transform.Count > 0) //{ // s.Instances = ob.Transform; //} this.Model1.Add(s); Model2.Add(new MeshGeometryModel3D() { Geometry = ob.Geometry, CullMode = SharpDX.Direct3D11.CullMode.Back, IsThrowingShadow = true, Material = NormalMaterial, Transform = scaleTransform }); ModelNormalVector.Add(new MeshGeometryModel3D() { Geometry = ob.Geometry, CullMode = SharpDX.Direct3D11.CullMode.Back, IsThrowingShadow = true, Material = NormalVectorMaterial, Transform = scaleTransform }); Model3.Add(new MeshGeometryModel3D() { Geometry = ob.Geometry, CullMode = SharpDX.Direct3D11.CullMode.Back, IsThrowingShadow = true, Material = diffuseMaterial, Transform = scaleTransform }); Model4.Add(new MeshGeometryModel3D() { Geometry = ob.Geometry, CullMode = SharpDX.Direct3D11.CullMode.Back, IsThrowingShadow = true, Material = PositionMaterial, Transform = scaleTransform }); Model5.Add(new MeshGeometryModel3D() { Geometry = ob.Geometry, CullMode = SharpDX.Direct3D11.CullMode.Back, IsThrowingShadow = true, Material = VertMaterial, Transform = scaleTransform }); Model6.Add(new MeshGeometryModel3D() { Geometry = ob.Geometry, CullMode = SharpDX.Direct3D11.CullMode.Back, IsThrowingShadow = true, Material = ColorStripeMaterial, Transform = scaleTransform }); Model7.Add(new MeshGeometryModel3D { Geometry = ob.Geometry, CullMode = SharpDX.Direct3D11.CullMode.Back, IsThrowingShadow = true, Transform = scaleTransform, Material = pbrMaterial }); }, null); } }
protected void ParseDataObjectMeshVertexColors(ref Mesh mesh) { ReadHeadOfDataObject(); if (mesh.NumColorSets + 1 > AI_MAX_NUMBER_OF_COLOR_SETS) ThrowException("Too many colorsets"); Color4D[] colors; uint numColors = ReadInt(); if (numColors != mesh.Positions.Count) ThrowException("Vertex color count does not match vertex count"); //colors.resize( numColors, aiColor4D( 0, 0, 0, 1)); colors = new Color4D[numColors]; for (uint a = 0; a < numColors; a++) { uint index = ReadInt(); if (index >= mesh.Positions.Count) ThrowException("Vertex color index out of bounds"); colors[(int)index] = ReadRGBA(); // HACK: (thom) Maxon Cinema XPort plugin puts a third separator here, kwxPort puts a comma. // Ignore gracefully. if (!isBinaryFormat) { FindNextNoneWhiteSpace(); if (buffer[p] == ';' || buffer[p] == ',') p++; } } mesh.Colors[(int)mesh.NumColorSets] = new List<Color4D>(colors); CheckForClosingBrace(); }
/// <summary> /// Creates a color formatter /// </summary> /// <param name="color">Initial color</param> /// <returns>Color formatter</returns> public ColorRGBA CreateColor(SharpDX.Color4 color) { return(this.CreateColor(ref color)); }
private void Render(DX11RenderContext context, DX11RenderSettings settings) { if (this.spreadMax == 0) { return; } if (this.FInEnabled[0]) { float w = (float)settings.RenderWidth; float h = (float)settings.RenderHeight; SharpDX.Direct3D11.DeviceContext shaprdxContext = new SharpDX.Direct3D11.DeviceContext(context.CurrentDeviceContext.ComPointer); FontWrapper fw = this.FTextRenderer.IsConnected ? this.FTextRenderer[0][context].FontWrapper : FontWrapperFactory.GetWrapper(context, this.dwFactory); var renderStates = fw.RenderStates; float *rawMatPtr; int transformCount; this.transformIn.GetMatrixPointer(out transformCount, out rawMatPtr); SharpDX.Matrix *matrixPointer = (SharpDX.Matrix *)rawMatPtr; bool applyState = this.FStateIn.IsConnected; var sView = settings.View; var sProj = settings.Projection; SharpDX.Matrix view = *(SharpDX.Matrix *) & sView; SharpDX.Matrix projection = *(SharpDX.Matrix *) & sProj; var objectsettings = this.objectSettings[context]; objectsettings.IterationCount = 1; objectsettings.Geometry = null; for (int i = 0; i < this.spreadMax; i++) { SharpDX.Matrix preScale = SharpDX.Matrix.Scaling(1.0f, -1.0f, 1.0f); SharpDX.Matrix sm = matrixPointer[i % transformCount]; SharpDX.Matrix mat = SharpDX.Matrix.Multiply(preScale, sm); mat = SharpDX.Matrix.Multiply(mat, view); mat = SharpDX.Matrix.Multiply(mat, projection); SlimDX.Color4 color = this.FInColor[i]; SharpDX.Color4 sdxColor = *(SharpDX.Color4 *) & color; objectsettings.DrawCallIndex = i; objectsettings.WorldTransform = *(SlimDX.Matrix *) & mat; if (settings.ValidateObject(objectsettings)) { if (applyState) { var textLayout = this.FLayout[i]; if (textLayout != null) { renderStates.SetStates(shaprdxContext, 0); context.RenderStateStack.Push(this.FStateIn[i]); fw.DrawTextLayout(shaprdxContext, new SharpDX.DirectWrite.TextLayout(textLayout.ComPointer), SharpDX.Vector2.Zero, mat, sdxColor, TextFlags.StatePrepared); context.RenderStateStack.Pop(); } } else { var textLayout = this.FLayout[i]; if (textLayout != null) { fw.DrawTextLayout(shaprdxContext, new SharpDX.DirectWrite.TextLayout(textLayout.ComPointer), SharpDX.Vector2.Zero, mat, sdxColor, TextFlags.None); } } } } //Apply old states back context.RenderStateStack.Apply(); context.CleanShaderStages(); } }