public void InitializeRendering(AnimationEditor editor, DeviceManager deviceManager, WadMoveable skin) { if (LicenseManager.UsageMode != LicenseUsageMode.Runtime) { return; } base.InitializeRendering(deviceManager.Device, Configuration.RenderingItem_Antialias); ResetCamera(); _editor = editor; _wadRenderer = new WadRenderer(deviceManager.___LegacyDevice); _model = _wadRenderer.GetMoveable(editor.Moveable); Configuration = _editor.Tool.Configuration; if (skin != null) { _skinModel = _wadRenderer.GetMoveable(skin); } // Actual "InitializeRendering" _fontTexture = Device.CreateTextureAllocator(new RenderingTextureAllocator.Description { Size = new VectorInt3(512, 512, 2) }); _fontDefault = Device.CreateFont(new RenderingFont.Description { FontName = "Segoe UI", FontSize = 24, FontIsBold = true, TextureAllocator = _fontTexture }); // Legacy rendering { _device = deviceManager.___LegacyDevice; _deviceManager = deviceManager; new BasicEffect(_device); // This effect is used for editor special meshes like sinks, cameras, light meshes, etc SharpDX.Direct3D11.RasterizerStateDescription renderStateDesc = new SharpDX.Direct3D11.RasterizerStateDescription { CullMode = SharpDX.Direct3D11.CullMode.None, DepthBias = 0, DepthBiasClamp = 0, FillMode = SharpDX.Direct3D11.FillMode.Wireframe, IsAntialiasedLineEnabled = true, IsDepthClipEnabled = true, IsFrontCounterClockwise = false, IsMultisampleEnabled = true, IsScissorEnabled = false, SlopeScaledDepthBias = 0 }; _rasterizerWireframe = RasterizerState.New(deviceManager.___LegacyDevice, renderStateDesc); _gizmo = new GizmoAnimationEditor(editor, _device, _deviceManager.___LegacyEffects["Solid"], this); _plane = GeometricPrimitive.GridPlane.New(_device, 8, 4); } }
protected override void OnDraw() { // To make sure things are in a defined state for legacy rendering... ((Rendering.DirectX11.Dx11RenderingSwapChain)SwapChain).BindForce(); ((Rendering.DirectX11.Dx11RenderingDevice)Device).ResetState(); if (DrawTransparency) { _legacyDevice.SetBlendState(_legacyDevice.BlendStates.AlphaBlend); } else { _legacyDevice.SetBlendState(_legacyDevice.BlendStates.Opaque); } Matrix4x4 viewProjection = Camera.GetViewProjectionMatrix(Width, Height); if (CurrentObject is WadMoveable) { // HACK: new moveables have one bone with null mesh var moveable = (WadMoveable)CurrentObject; if (moveable.Meshes.Count == 0 || (moveable.Meshes.Count == 1 && moveable.Meshes[0] == null)) { return; } AnimatedModel model = _wadRenderer.GetMoveable((WadMoveable)CurrentObject); // We don't need to rebuilt it everytime necessarily, but it's cheap to so and // simpler than trying to figure out when it may be necessary. model.UpdateAnimation(AnimationIndex, KeyFrameIndex); var effect = DeviceManager.DefaultDeviceManager.___LegacyEffects["Model"]; effect.Parameters["AlphaTest"].SetValue(DrawTransparency); effect.Parameters["Color"].SetValue(Vector4.One); effect.Parameters["Texture"].SetResource(_wadRenderer.Texture); effect.Parameters["TextureSampler"].SetResource(_legacyDevice.SamplerStates.Default); // Build animation transforms var matrices = new List <Matrix4x4>(); if (model.Animations.Count != 0) { for (var b = 0; b < model.Meshes.Count; b++) { matrices.Add(model.AnimationTransforms[b]); } } else { foreach (var bone in model.Bones) { matrices.Add(bone.GlobalTransform); } } for (int i = 0; i < model.Meshes.Count; i++) { var mesh = model.Meshes[i]; if (mesh.Vertices.Count == 0) { continue; } _legacyDevice.SetVertexBuffer(0, mesh.VertexBuffer); _legacyDevice.SetIndexBuffer(mesh.IndexBuffer, true); _legacyDevice.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, mesh.VertexBuffer)); effect.Parameters["ModelViewProjection"].SetValue((matrices[i] * viewProjection).ToSharpDX()); effect.Techniques[0].Passes[0].Apply(); foreach (var submesh in mesh.Submeshes) { _legacyDevice.Draw(PrimitiveType.TriangleList, submesh.Value.NumIndices, submesh.Value.BaseIndex); } //foreach (var submesh in mesh.Submeshes) // _legacyDevice.DrawIndexed(PrimitiveType.TriangleList, submesh.Value.NumIndices, submesh.Value.MeshBaseIndex); } } else if (CurrentObject is WadStatic) { StaticModel model = _wadRenderer.GetStatic((WadStatic)CurrentObject); var effect = DeviceManager.DefaultDeviceManager.___LegacyEffects["StaticModel"]; effect.Parameters["ModelViewProjection"].SetValue(viewProjection.ToSharpDX()); effect.Parameters["AlphaTest"].SetValue(DrawTransparency); effect.Parameters["Color"].SetValue(Vector4.One); effect.Parameters["Texture"].SetResource(_wadRenderer.Texture); effect.Parameters["TextureSampler"].SetResource(_legacyDevice.SamplerStates.Default); for (int i = 0; i < model.Meshes.Count; i++) { var mesh = model.Meshes[i]; _legacyDevice.SetVertexBuffer(0, mesh.VertexBuffer); _legacyDevice.SetIndexBuffer(mesh.IndexBuffer, true); _legacyDevice.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, mesh.VertexBuffer)); effect.Parameters["ModelViewProjection"].SetValue(viewProjection.ToSharpDX()); effect.Techniques[0].Passes[0].Apply(); foreach (var submesh in mesh.Submeshes) { _legacyDevice.DrawIndexed(PrimitiveType.TriangleList, submesh.Value.NumIndices, submesh.Value.BaseIndex); } } } else if (CurrentObject is WadSpriteSequence) { var seq = (WadSpriteSequence)CurrentObject; if (seq.Sprites.Count <= _currentFrame) { return; } WadSprite sprite = seq.Sprites[_currentFrame]; float aspectRatioViewport = (float)ClientSize.Width / ClientSize.Height; float aspectRatioImage = (float)sprite.Texture.Image.Width / sprite.Texture.Image.Height; float aspectRatioAdjust = aspectRatioViewport / aspectRatioImage; Vector2 factor = Vector2.Min(new Vector2(1.0f / aspectRatioAdjust, aspectRatioAdjust), new Vector2(1.0f)); SwapChain.RenderSprites(_textureAllocator, false, new Sprite { Texture = sprite.Texture.Image, PosStart = -0.9f * factor, PosEnd = 0.9f * factor }); } else if (CurrentObject is ImportedGeometry) { var geo = (ImportedGeometry)CurrentObject; var model = geo.DirectXModel; var effect = DeviceManager.DefaultDeviceManager.___LegacyEffects["RoomGeometry"]; effect.Parameters["UseVertexColors"].SetValue(true); effect.Parameters["AlphaTest"].SetValue(DrawTransparency); effect.Parameters["Color"].SetValue(Vector4.One); for (int i = 0; i < model.Meshes.Count; i++) { var mesh = model.Meshes[i]; _legacyDevice.SetVertexBuffer(0, mesh.VertexBuffer); _legacyDevice.SetIndexBuffer(mesh.IndexBuffer, true); _legacyDevice.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, mesh.VertexBuffer)); effect.Parameters["ModelViewProjection"].SetValue(viewProjection.ToSharpDX()); effect.Techniques[0].Passes[0].Apply(); foreach (var submesh in mesh.Submeshes) { var texture = submesh.Value.Material.Texture; if (texture != null && texture is ImportedGeometryTexture) { effect.Parameters["TextureEnabled"].SetValue(true); effect.Parameters["Texture"].SetResource(((ImportedGeometryTexture)texture).DirectXTexture); effect.Parameters["ReciprocalTextureSize"].SetValue(new Vector2(1.0f / texture.Image.Width, 1.0f / texture.Image.Height)); effect.Parameters["TextureSampler"].SetResource(_legacyDevice.SamplerStates.AnisotropicWrap); } else { effect.Parameters["TextureEnabled"].SetValue(false); } effect.Techniques[0].Passes[0].Apply(); _legacyDevice.DrawIndexed(PrimitiveType.TriangleList, submesh.Value.NumIndices, submesh.Value.BaseIndex); } foreach (var submesh in mesh.Submeshes) { _legacyDevice.DrawIndexed(PrimitiveType.TriangleList, submesh.Value.NumIndices, submesh.Value.BaseIndex); } } } }