diff --git a/ANX.Framework.Content.Pipeline/Tasks/BuildContentTask.cs b/ANX.Framework.Content.Pipeline/Tasks/BuildContentTask.cs
index ca9cbd5b..1b09d0be 100644
--- a/ANX.Framework.Content.Pipeline/Tasks/BuildContentTask.cs
+++ b/ANX.Framework.Content.Pipeline/Tasks/BuildContentTask.cs
@@ -290,7 +290,6 @@ namespace ANX.Framework.Content.Pipeline.Tasks
{
if (BuildCache.IsValid(buildItem, outputFilename))
{
- BuildLogger.LogMessage("---\"{0}\" still valid, skipping build.", buildItem.SourceFilename);
return true;
}
return false;
diff --git a/ANX.Framework/Graphics/AlphaTestEffect.cs b/ANX.Framework/Graphics/AlphaTestEffect.cs
index 76420785..55f1c91d 100644
--- a/ANX.Framework/Graphics/AlphaTestEffect.cs
+++ b/ANX.Framework/Graphics/AlphaTestEffect.cs
@@ -151,8 +151,7 @@ namespace ANX.Framework.Graphics
}
#endregion
- #region PreBindSetParameters
- internal override void PreBindSetParameters()
+ protected internal override void OnApply()
{
Matrix worldView;
Matrix.Multiply(ref world, ref view, out worldView);
@@ -173,7 +172,6 @@ namespace ANX.Framework.Graphics
else
Parameters["FogVector"].SetValue(Vector4.Zero);
}
- #endregion
#region SetAlphaTestValue
private void SetAlphaTestValue()
diff --git a/ANX.Framework/Graphics/BasicEffect.cs b/ANX.Framework/Graphics/BasicEffect.cs
index 314c3345..e53175be 100644
--- a/ANX.Framework/Graphics/BasicEffect.cs
+++ b/ANX.Framework/Graphics/BasicEffect.cs
@@ -244,8 +244,7 @@ namespace ANX.Framework.Graphics
}
#endregion
- #region PreBindSetParameters
- internal override void PreBindSetParameters()
+ protected internal override void OnApply()
{
Matrix worldView;
Matrix.Multiply(ref world, ref view, out worldView);
@@ -270,7 +269,6 @@ namespace ANX.Framework.Graphics
SelectTechnique();
}
- #endregion
#region SelectTechnique
private void SelectTechnique()
diff --git a/ANX.Framework/Graphics/DualTextureEffect.cs b/ANX.Framework/Graphics/DualTextureEffect.cs
index cace809a..303ebdc9 100644
--- a/ANX.Framework/Graphics/DualTextureEffect.cs
+++ b/ANX.Framework/Graphics/DualTextureEffect.cs
@@ -136,8 +136,7 @@ namespace ANX.Framework.Graphics
}
#endregion
- #region PreBindSetParameters
- internal override void PreBindSetParameters()
+ protected internal override void OnApply()
{
Matrix worldView;
Matrix.Multiply(ref world, ref view, out worldView);
@@ -158,7 +157,6 @@ namespace ANX.Framework.Graphics
else
Parameters["FogVector"].SetValue(Vector4.Zero);
}
- #endregion
#region SelectTechnique
private void SelectTechnique()
diff --git a/ANX.Framework/Graphics/Effect.cs b/ANX.Framework/Graphics/Effect.cs
index 911be9a4..69ea7cf4 100644
--- a/ANX.Framework/Graphics/Effect.cs
+++ b/ANX.Framework/Graphics/Effect.cs
@@ -1,5 +1,6 @@
using System;
using System.IO;
+using System.Linq;
using System.Runtime.InteropServices;
using ANX.Framework.NonXNA;
using ANX.Framework.NonXNA.Development;
@@ -19,6 +20,7 @@ namespace ANX.Framework.Graphics
private INativeEffect nativeEffect;
private readonly byte[] byteCode;
private EffectSourceLanguage sourceLanguage;
+ private EffectTechnique currentTechnique;
#endregion
#region Public
@@ -26,29 +28,39 @@ namespace ANX.Framework.Graphics
{
get
{
- if (nativeEffect == null)
- {
- CreateNativeEffect(this.sourceLanguage);
- }
-
return this.nativeEffect;
}
}
- public EffectTechnique CurrentTechnique { get; set; }
+ public EffectTechnique CurrentTechnique
+ {
+ get { return this.currentTechnique; }
+ set
+ {
+ if (value == null)
+ throw new ArgumentNullException("value");
+
+ if (!Techniques.Contains(value))
+ throw new InvalidOperationException("CurrentTechnique must be a technique of the same effect instance.");
+
+ this.currentTechnique = value;
+ }
+ }
+
public EffectParameterCollection Parameters { get; private set; }
public EffectTechniqueCollection Techniques { get; private set; }
#endregion
- #region Constructor
protected Effect(Effect cloneSource)
: this(cloneSource.GraphicsDevice, cloneSource.byteCode)
{
+ CreateNativeEffect(cloneSource.sourceLanguage);
}
public Effect(GraphicsDevice graphicsDevice, byte[] byteCode)
: this(graphicsDevice, byteCode, EffectSourceLanguage.HLSL_FX)
{
+ CreateNativeEffect(EffectSourceLanguage.HLSL_FX);
}
public Effect(GraphicsDevice graphicsDevice, byte[] byteCode, EffectSourceLanguage sourceLanguage)
@@ -67,14 +79,6 @@ namespace ANX.Framework.Graphics
this.sourceLanguage = sourceLanguage;
}
- ~Effect()
- {
- Dispose();
- base.GraphicsDevice.ResourceCreated -= GraphicsDevice_ResourceCreated;
- base.GraphicsDevice.ResourceDestroyed -= GraphicsDevice_ResourceDestroyed;
- }
- #endregion
-
#region GraphicsDevice_ResourceCreated
private void GraphicsDevice_ResourceCreated(object sender, ResourceCreatedEventArgs e)
{
@@ -106,14 +110,9 @@ namespace ANX.Framework.Graphics
}
#endregion
- #region PreBindSetParameters
- ///
- /// This is used by the built in effects to set all their parameters only once and not everytime the properties change.
- ///
- internal virtual void PreBindSetParameters()
- {
- }
- #endregion
+ protected internal virtual void OnApply()
+ {
+ }
#region Dispose
protected override void Dispose(bool disposeManaged)
@@ -125,6 +124,23 @@ namespace ANX.Framework.Graphics
nativeEffect.Dispose();
nativeEffect = null;
}
+
+ if (Parameters != null)
+ {
+ foreach (var parameter in Parameters)
+ parameter.NativeParameter.Dispose();
+ Parameters = null;
+ }
+
+ if (Techniques != null)
+ {
+ foreach (var technique in Techniques)
+ technique.NativeTechnique.Dispose();
+ Techniques = null;
+ }
+
+ base.GraphicsDevice.ResourceCreated -= GraphicsDevice_ResourceCreated;
+ base.GraphicsDevice.ResourceDestroyed -= GraphicsDevice_ResourceDestroyed;
}
base.Dispose(disposeManaged);
@@ -139,8 +155,8 @@ namespace ANX.Framework.Graphics
if (creator.IsLanguageSupported(sourceLanguage))
{
this.nativeEffect = creator.CreateEffect(GraphicsDevice, this, new MemoryStream(this.byteCode, false));
- this.Techniques = new EffectTechniqueCollection(this, this.nativeEffect);
- this.Parameters = new EffectParameterCollection(this, this.nativeEffect);
+ this.Techniques = new EffectTechniqueCollection(this.nativeEffect.Techniques);
+ this.Parameters = new EffectParameterCollection(this.nativeEffect.Parameters);
}
else
throw new InvalidOperationException("couldn't create " + sourceLanguage + " native effect using RenderSystem " +
diff --git a/ANX.Framework/Graphics/EffectAnnotation.cs b/ANX.Framework/Graphics/EffectAnnotation.cs
index 4a03f3be..466cdaa8 100644
--- a/ANX.Framework/Graphics/EffectAnnotation.cs
+++ b/ANX.Framework/Graphics/EffectAnnotation.cs
@@ -13,81 +13,85 @@ namespace ANX.Framework.Graphics
[TestState(TestStateAttribute.TestState.Untested)]
public sealed class EffectAnnotation
{
- private readonly INativeEffectAnnotation nativeAnnotation;
+ internal INativeEffectAnnotation NativeAnnotation
+ {
+ get;
+ private set;
+ }
public int ColumnCount
{
- get { return nativeAnnotation.ColumnCount; }
+ get { return NativeAnnotation.ColumnCount; }
}
public string Name
{
- get { return nativeAnnotation.Name; }
+ get { return NativeAnnotation.Name; }
}
public EffectParameterClass ParameterClass
{
- get { return nativeAnnotation.ParameterClass; }
+ get { return NativeAnnotation.ParameterClass; }
}
public EffectParameterType ParameterType
{
- get { return nativeAnnotation.ParameterType; }
+ get { return NativeAnnotation.ParameterType; }
}
public int RowCount
{
- get { return nativeAnnotation.RowCount; }
+ get { return NativeAnnotation.RowCount; }
}
public string Semantic
{
- get { return nativeAnnotation.Semantic; }
+ get { return NativeAnnotation.Semantic; }
}
internal EffectAnnotation(INativeEffectAnnotation setNativeAnnotation)
{
- nativeAnnotation = setNativeAnnotation;
+ NativeAnnotation = setNativeAnnotation;
}
public bool GetValueBoolean()
{
- return nativeAnnotation.GetValueBoolean();
+ return NativeAnnotation.GetValueBoolean();
}
public int GetValueInt32()
{
- return nativeAnnotation.GetValueInt32();
+ return NativeAnnotation.GetValueInt32();
}
public Matrix GetValueMatrix()
{
- return nativeAnnotation.GetValueMatrix();
+ return NativeAnnotation.GetValueMatrix();
}
public float GetValueSingle()
{
- return nativeAnnotation.GetValueSingle();
+ return NativeAnnotation.GetValueSingle();
}
public string GetValueString()
{
- return nativeAnnotation.GetValueString();
+ return NativeAnnotation.GetValueString();
}
public Vector2 GetValueVector2()
{
- return nativeAnnotation.GetValueVector2();
+ return NativeAnnotation.GetValueVector2();
}
public Vector3 GetValueVector3()
{
- return nativeAnnotation.GetValueVector3();
+ return NativeAnnotation.GetValueVector3();
}
public Vector4 GetValueVector4()
{
- return nativeAnnotation.GetValueVector4();
+ return NativeAnnotation.GetValueVector4();
}
}
}
diff --git a/ANX.Framework/Graphics/EffectAnnotationCollection.cs b/ANX.Framework/Graphics/EffectAnnotationCollection.cs
index 0a70c6d1..06d4da61 100644
--- a/ANX.Framework/Graphics/EffectAnnotationCollection.cs
+++ b/ANX.Framework/Graphics/EffectAnnotationCollection.cs
@@ -35,9 +35,9 @@ namespace ANX.Framework.Graphics
get { return annotations.FirstOrDefault(annotation => annotation.Name == name); }
}
- internal EffectAnnotationCollection(List setAnnotations)
+ internal EffectAnnotationCollection(IEnumerable setAnnotations)
{
- annotations = setAnnotations ?? new List();
+ annotations = new List(setAnnotations);
}
IEnumerator IEnumerable.GetEnumerator()
diff --git a/ANX.Framework/Graphics/EffectParameter.cs b/ANX.Framework/Graphics/EffectParameter.cs
index 62e536ec..ab73eb60 100644
--- a/ANX.Framework/Graphics/EffectParameter.cs
+++ b/ANX.Framework/Graphics/EffectParameter.cs
@@ -14,271 +14,275 @@ namespace ANX.Framework.Graphics
[Developer("Glatzemann")]
public sealed class EffectParameter
{
- private readonly INativeEffectParameter nativeParameter;
+ internal INativeEffectParameter NativeParameter
+ {
+ get;
+ private set;
+ }
#region Public
public EffectAnnotationCollection Annotations
{
- get { return nativeParameter.Annotations; }
+ get { return NativeParameter.Annotations; }
}
public EffectParameterCollection Elements
{
- get { return nativeParameter.Elements; }
+ get { return NativeParameter.Elements; }
}
public EffectParameterCollection StructureMembers
{
- get { return nativeParameter.StructureMembers; }
+ get { return NativeParameter.StructureMembers; }
}
public int ColumnCount
{
- get { return nativeParameter.ColumnCount; }
+ get { return NativeParameter.ColumnCount; }
}
public string Name
{
- get { return nativeParameter.Name; }
+ get { return NativeParameter.Name; }
}
public EffectParameterClass ParameterClass
{
- get { return nativeParameter.ParameterClass; }
+ get { return NativeParameter.ParameterClass; }
}
public EffectParameterType ParameterType
{
- get { return nativeParameter.ParameterType; }
+ get { return NativeParameter.ParameterType; }
}
public int RowCount
{
- get { return nativeParameter.RowCount; }
+ get { return NativeParameter.RowCount; }
}
public string Semantic
{
- get { return nativeParameter.Semantic; }
+ get { return NativeParameter.Semantic; }
}
#endregion
internal EffectParameter(INativeEffectParameter nativeParameter)
{
- this.nativeParameter = nativeParameter;
+ this.NativeParameter = nativeParameter;
}
#region GetValue
public bool GetValueBoolean()
{
- return nativeParameter.GetValueBoolean();
+ return NativeParameter.GetValueBoolean();
}
public bool[] GetValueBooleanArray(int count)
{
- return nativeParameter.GetValueBooleanArray(count);
+ return NativeParameter.GetValueBooleanArray(count);
}
public int GetValueInt32()
{
- return nativeParameter.GetValueInt32();
+ return NativeParameter.GetValueInt32();
}
public Int32[] GetValueInt32Array(int count)
{
- return nativeParameter.GetValueInt32Array(count);
+ return NativeParameter.GetValueInt32Array(count);
}
public Matrix GetValueMatrix()
{
- return nativeParameter.GetValueMatrix();
+ return NativeParameter.GetValueMatrix();
}
public Matrix[] GetValueMatrixArray(int count)
{
- return nativeParameter.GetValueMatrixArray(count);
+ return NativeParameter.GetValueMatrixArray(count);
}
public Matrix GetValueMatrixTranspose()
{
- return nativeParameter.GetValueMatrixTranspose();
+ return NativeParameter.GetValueMatrixTranspose();
}
public Matrix[] GetValueMatrixTransposeArray(int count)
{
- return nativeParameter.GetValueMatrixTransposeArray(count);
+ return NativeParameter.GetValueMatrixTransposeArray(count);
}
public Quaternion GetValueQuaternion()
{
- return nativeParameter.GetValueQuaternion();
+ return NativeParameter.GetValueQuaternion();
}
public Quaternion[] GetValueQuaternionArray(int count)
{
- return nativeParameter.GetValueQuaternionArray(count);
+ return NativeParameter.GetValueQuaternionArray(count);
}
public float GetValueSingle()
{
- return nativeParameter.GetValueSingle();
+ return NativeParameter.GetValueSingle();
}
public float[] GetValueSingleArray(int count)
{
- return nativeParameter.GetValueSingleArray(count);
+ return NativeParameter.GetValueSingleArray(count);
}
public string GetValueString()
{
- return nativeParameter.GetValueString();
+ return NativeParameter.GetValueString();
}
public Texture2D GetValueTexture2D()
{
- return nativeParameter.GetValueTexture2D();
+ return NativeParameter.GetValueTexture2D();
}
public Texture3D GetValueTexture3D()
{
- return nativeParameter.GetValueTexture3D();
+ return NativeParameter.GetValueTexture3D();
}
public TextureCube GetValueTextureCube()
{
- return nativeParameter.GetValueTextureCube();
+ return NativeParameter.GetValueTextureCube();
}
public Vector2 GetValueVector2()
{
- return nativeParameter.GetValueVector2();
+ return NativeParameter.GetValueVector2();
}
public Vector2[] GetValueVector2Array(int count)
{
- return nativeParameter.GetValueVector2Array(count);
+ return NativeParameter.GetValueVector2Array(count);
}
public Vector3 GetValueVector3()
{
- return nativeParameter.GetValueVector3();
+ return NativeParameter.GetValueVector3();
}
public Vector3[] GetValueVector3Array(int count)
{
- return nativeParameter.GetValueVector3Array(count);
+ return NativeParameter.GetValueVector3Array(count);
}
public Vector4 GetValueVector4()
{
- return nativeParameter.GetValueVector4();
+ return NativeParameter.GetValueVector4();
}
public Vector4[] GetValueVector4Array(int count)
{
- return nativeParameter.GetValueVector4Array(count);
+ return NativeParameter.GetValueVector4Array(count);
}
#endregion
#region SetValue
public void SetValue([MarshalAs(UnmanagedType.U1)] bool value)
{
- nativeParameter.SetValue(value);
+ NativeParameter.SetValue(value);
}
public void SetValue(bool[] value)
{
- nativeParameter.SetValue(value);
+ NativeParameter.SetValue(value);
}
public void SetValue(int value)
{
- nativeParameter.SetValue(value);
+ NativeParameter.SetValue(value);
}
public void SetValue(int[] value)
{
- nativeParameter.SetValue(value);
+ NativeParameter.SetValue(value);
}
public void SetValue(Matrix value)
{
- nativeParameter.SetValue(value, false);
+ NativeParameter.SetValue(value, false);
}
public void SetValue(Matrix[] value)
{
- nativeParameter.SetValue(value, false);
+ NativeParameter.SetValue(value, false);
}
public void SetValue(Quaternion value)
{
- nativeParameter.SetValue(value);
+ NativeParameter.SetValue(value);
}
public void SetValue(Quaternion[] value)
{
- nativeParameter.SetValue(value);
+ NativeParameter.SetValue(value);
}
public void SetValue(float value)
{
- nativeParameter.SetValue(value);
+ NativeParameter.SetValue(value);
}
public void SetValue(float[] value)
{
- nativeParameter.SetValue(value);
+ NativeParameter.SetValue(value);
}
public void SetValue(string value)
{
- nativeParameter.SetValue(value);
+ NativeParameter.SetValue(value);
}
public void SetValue(Texture value)
{
- nativeParameter.SetValue(value);
+ NativeParameter.SetValue(value);
}
public void SetValue(Vector2 value)
{
- nativeParameter.SetValue(value);
+ NativeParameter.SetValue(value);
}
public void SetValue(Vector2[] value)
{
- nativeParameter.SetValue(value);
+ NativeParameter.SetValue(value);
}
public void SetValue(Vector3 value)
{
- nativeParameter.SetValue(value);
+ NativeParameter.SetValue(value);
}
public void SetValue(Vector3[] value)
{
- nativeParameter.SetValue(value);
+ NativeParameter.SetValue(value);
}
public void SetValue(Vector4 value)
{
- nativeParameter.SetValue(value);
+ NativeParameter.SetValue(value);
}
public void SetValue(Vector4[] value)
{
- nativeParameter.SetValue(value);
+ NativeParameter.SetValue(value);
}
public void SetValueTranspose(Matrix value)
{
- nativeParameter.SetValue(value, true);
+ NativeParameter.SetValue(value, true);
}
public void SetValueTranspose(Matrix[] value)
{
- nativeParameter.SetValue(value, true);
+ NativeParameter.SetValue(value, true);
}
#endregion
}
diff --git a/ANX.Framework/Graphics/EffectParameterCollection.cs b/ANX.Framework/Graphics/EffectParameterCollection.cs
index a2f5f00e..a27cc2c8 100644
--- a/ANX.Framework/Graphics/EffectParameterCollection.cs
+++ b/ANX.Framework/Graphics/EffectParameterCollection.cs
@@ -20,8 +20,6 @@ namespace ANX.Framework.Graphics
public sealed class EffectParameterCollection : IEnumerable
{
#region Private Members
- private Effect parentEffect;
- private INativeEffect nativeEffect;
private List parameters;
#endregion
@@ -40,16 +38,9 @@ namespace ANX.Framework.Graphics
get { return parameters.Count; }
}
- internal EffectParameterCollection(Effect parentEffect, INativeEffect nativeEffect)
+ internal EffectParameterCollection(IEnumerable parameters)
{
- this.parentEffect = parentEffect;
- this.nativeEffect = nativeEffect;
- this.parameters = new List();
-
- foreach (EffectParameter p in nativeEffect.Parameters)
- {
- this.parameters.Add(p);
- }
+ this.parameters = new List(parameters);
}
public EffectParameter GetParameterBySemantic(string semantic)
diff --git a/ANX.Framework/Graphics/EffectPass.cs b/ANX.Framework/Graphics/EffectPass.cs
index d6b99619..52834539 100644
--- a/ANX.Framework/Graphics/EffectPass.cs
+++ b/ANX.Framework/Graphics/EffectPass.cs
@@ -1,5 +1,6 @@
using System;
using ANX.Framework.NonXNA.Development;
+using ANX.Framework.NonXNA;
// This file is part of the ANX.Framework created by the
// "ANX.Framework developer group" and released under the Ms-PL license.
@@ -14,21 +15,33 @@ namespace ANX.Framework.Graphics
{
private readonly Effect parentEffect;
- public string Name { get; private set; }
- public EffectAnnotationCollection Annotations { get; private set; }
-
- internal EffectPass(Effect parentEffect)
+ internal INativeEffectPass NativeEffectPass
{
- if (parentEffect == null)
- throw new ArgumentNullException("parentEffect");
+ get;
+ private set;
+ }
- this.parentEffect = parentEffect;
+ public string Name
+ {
+ get { return this.NativeEffectPass.Name; }
+ }
+
+ public EffectAnnotationCollection Annotations
+ {
+ get { return this.NativeEffectPass.Annotations; }
+ }
+
+ internal EffectPass(INativeEffectPass nativeEffectPass)
+ {
+ if (nativeEffectPass == null)
+ throw new ArgumentNullException("nativeEffectPass");
+
+ this.NativeEffectPass = nativeEffectPass;
}
public void Apply()
{
- parentEffect.PreBindSetParameters();
- parentEffect.NativeEffect.Apply(parentEffect.GraphicsDevice);
+ this.NativeEffectPass.Apply();
}
}
}
diff --git a/ANX.Framework/Graphics/EffectTechniqueCollection.cs b/ANX.Framework/Graphics/EffectTechniqueCollection.cs
index e7a577c1..45009f23 100644
--- a/ANX.Framework/Graphics/EffectTechniqueCollection.cs
+++ b/ANX.Framework/Graphics/EffectTechniqueCollection.cs
@@ -21,8 +21,6 @@ namespace ANX.Framework.Graphics
public sealed class EffectTechniqueCollection : IEnumerable, IEnumerable
{
#region Private Members
- private Effect parentEffect;
- private INativeEffect nativeEffect;
private List techniques;
#endregion // Private Members
@@ -42,16 +40,9 @@ namespace ANX.Framework.Graphics
get { return techniques.Count; }
}
- internal EffectTechniqueCollection(Effect parentEffect, INativeEffect nativeEffect)
+ internal EffectTechniqueCollection(IEnumerable techniques)
{
- this.parentEffect = parentEffect;
- this.nativeEffect = nativeEffect;
- this.techniques = new List();
-
- foreach (EffectTechnique teq in nativeEffect.Techniques)
- {
- this.techniques.Add(teq);
- }
+ this.techniques = new List(techniques);
}
IEnumerator IEnumerable.GetEnumerator()
diff --git a/ANX.Framework/Graphics/EnvironmentMapEffect.cs b/ANX.Framework/Graphics/EnvironmentMapEffect.cs
index b94f8d1a..ab54277c 100644
--- a/ANX.Framework/Graphics/EnvironmentMapEffect.cs
+++ b/ANX.Framework/Graphics/EnvironmentMapEffect.cs
@@ -212,8 +212,7 @@ namespace ANX.Framework.Graphics
}
#endregion
- #region PreBindSetParameters
- internal override void PreBindSetParameters()
+ protected internal override void OnApply()
{
Matrix worldView;
Matrix.Multiply(ref world, ref view, out worldView);
@@ -242,7 +241,6 @@ namespace ANX.Framework.Graphics
SelectTechnique();
}
- #endregion
#region SelectTechnique
private void SelectTechnique()
diff --git a/ANX.Framework/Graphics/GraphicsDevice.cs b/ANX.Framework/Graphics/GraphicsDevice.cs
index 1484b68f..db0a469f 100644
--- a/ANX.Framework/Graphics/GraphicsDevice.cs
+++ b/ANX.Framework/Graphics/GraphicsDevice.cs
@@ -16,7 +16,6 @@ namespace ANX.Framework.Graphics
public class GraphicsDevice : IDisposable
{
#region Private Members
- private IndexBuffer indexBuffer;
private SamplerStateCollection samplerStateCollection;
private Viewport viewport;
private BlendState blendState;
@@ -116,11 +115,9 @@ namespace ANX.Framework.Graphics
NativeDevice.Present();
}
- public void Present(Nullable sourceRectangle, Nullable destinationRectangle,
- WindowHandle overrideWindowHandle)
+ public void Present(Rectangle? sourceRectangle, Rectangle? destinationRectangle, WindowHandle overrideWindowHandle)
{
- //TODO: implement
- throw new NotImplementedException();
+ NativeDevice.Present(sourceRectangle, destinationRectangle, overrideWindowHandle);
}
#endregion // Present
@@ -128,12 +125,7 @@ namespace ANX.Framework.Graphics
#region DrawPrimitives & DrawIndexedPrimitives
public void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount)
{
- if (this.indexBuffer == null)
- {
- throw new InvalidOperationException("you have to set a index buffer before you can draw using DrawIndexedPrimitives");
- }
-
- NativeDevice.DrawIndexedPrimitives(primitiveType, baseVertex, minVertexIndex, numVertices, startIndex, primitiveCount, this.indexBuffer);
+ NativeDevice.DrawIndexedPrimitives(primitiveType, baseVertex, minVertexIndex, numVertices, startIndex, primitiveCount);
}
public void DrawPrimitives(PrimitiveType primitiveType, int startVertex, int primitiveCount)
@@ -147,7 +139,7 @@ namespace ANX.Framework.Graphics
int startIndex, int primitiveCount, int instanceCount)
{
NativeDevice.DrawInstancedPrimitives(primitiveType, baseVertex, minVertexIndex, numVertices, startIndex,
- primitiveCount, instanceCount, this.indexBuffer);
+ primitiveCount, instanceCount);
}
#endregion
@@ -403,11 +395,11 @@ namespace ANX.Framework.Graphics
{
get
{
- return this.indexBuffer;
+ return this.NativeDevice.IndexBuffer;
}
set
{
- this.indexBuffer = value;
+ this.NativeDevice.IndexBuffer = value;
}
}
@@ -649,9 +641,6 @@ namespace ANX.Framework.Graphics
raise_ResourceCreated(this, new ResourceCreatedEventArgs(NativeDevice));
GraphicsResourceTracker.Instance.UpdateGraphicsDeviceReference(this);
- if (this.indexBuffer != null)
- NativeDevice.SetIndexBuffer(this.indexBuffer);
-
if (this.currentVertexBufferBindings != null)
NativeDevice.SetVertexBuffers(this.currentVertexBufferBindings);
diff --git a/ANX.Framework/Graphics/SkinnedEffect.cs b/ANX.Framework/Graphics/SkinnedEffect.cs
index 0a3a8dca..0c4c5933 100644
--- a/ANX.Framework/Graphics/SkinnedEffect.cs
+++ b/ANX.Framework/Graphics/SkinnedEffect.cs
@@ -274,8 +274,7 @@ namespace ANX.Framework.Graphics
}
#endregion
- #region PreBindSetParameters
- internal override void PreBindSetParameters()
+ protected internal override void OnApply()
{
Matrix worldView;
Matrix.Multiply(ref world, ref view, out worldView);
@@ -302,7 +301,6 @@ namespace ANX.Framework.Graphics
SelectTechnique();
}
- #endregion
#region SelectTechnique
private void SelectTechnique()
diff --git a/ANX.Framework/Graphics/SpriteBatch.cs b/ANX.Framework/Graphics/SpriteBatch.cs
index ef31f742..4e50823d 100644
--- a/ANX.Framework/Graphics/SpriteBatch.cs
+++ b/ANX.Framework/Graphics/SpriteBatch.cs
@@ -470,9 +470,7 @@ namespace ANX.Framework.Graphics
this.vertexBuffer.SetData(this.vertices, 0, vertexCount);
- SetRenderStates();
-
- spriteBatchEffect.Parameters["Texture"].SetValue(this.spriteInfos[offset].texture);
+ SetRenderStates(offset);
GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, vertexCount, 0, count * 2);
}
@@ -568,7 +566,7 @@ namespace ANX.Framework.Graphics
#endregion
#region SetRenderStates
- private void SetRenderStates()
+ private void SetRenderStates(int offset)
{
GraphicsDevice.BlendState = blendState != null ? blendState : BlendState.AlphaBlend;
GraphicsDevice.DepthStencilState = depthStencilState != null ? depthStencilState : DepthStencilState.None;
@@ -598,7 +596,8 @@ namespace ANX.Framework.Graphics
Matrix result;
Matrix.Multiply(ref transformMatrix, ref cachedTransformMatrix, out result);
this.spriteBatchEffect.Parameters["MatrixTransform"].SetValue(result);
- spriteBatchEffect.NativeEffect.Apply(GraphicsDevice);
+ spriteBatchEffect.Parameters["Texture"].SetValue(this.spriteInfos[offset].texture);
+ spriteBatchEffect.CurrentTechnique.Passes[0].Apply();
GraphicsDevice.Indices = this.indexBuffer;
GraphicsDevice.SetVertexBuffer(this.vertexBuffer);
diff --git a/ANX.Framework/NonXNA/RenderSystem/INativeEffect.cs b/ANX.Framework/NonXNA/RenderSystem/INativeEffect.cs
index 3b72c851..faba30e2 100644
--- a/ANX.Framework/NonXNA/RenderSystem/INativeEffect.cs
+++ b/ANX.Framework/NonXNA/RenderSystem/INativeEffect.cs
@@ -13,8 +13,6 @@ namespace ANX.Framework.NonXNA
{
public interface INativeEffect : IDisposable
{
- void Apply(GraphicsDevice graphicsDevice);
-
IEnumerable Techniques { get; }
IEnumerable Parameters { get; }
diff --git a/ANX.Framework/NonXNA/RenderSystem/INativeEffectAnnotation.cs b/ANX.Framework/NonXNA/RenderSystem/INativeEffectAnnotation.cs
index 10914d8e..8c66e3ce 100644
--- a/ANX.Framework/NonXNA/RenderSystem/INativeEffectAnnotation.cs
+++ b/ANX.Framework/NonXNA/RenderSystem/INativeEffectAnnotation.cs
@@ -1,5 +1,6 @@
using ANX.Framework.Graphics;
using ANX.Framework.NonXNA.Development;
+using System;
// This file is part of the ANX.Framework created by the
// "ANX.Framework developer group" and released under the Ms-PL license.
@@ -10,7 +11,7 @@ namespace ANX.Framework.NonXNA.RenderSystem
[PercentageComplete(100)]
[Developer("AstrorEnales")]
[TestState(TestStateAttribute.TestState.Untested)]
- public interface INativeEffectAnnotation
+ public interface INativeEffectAnnotation : IDisposable
{
int ColumnCount { get; }
string Name { get; }
diff --git a/ANX.Framework/NonXNA/RenderSystem/INativeEffectParameter.cs b/ANX.Framework/NonXNA/RenderSystem/INativeEffectParameter.cs
index b7155d30..3b013b57 100644
--- a/ANX.Framework/NonXNA/RenderSystem/INativeEffectParameter.cs
+++ b/ANX.Framework/NonXNA/RenderSystem/INativeEffectParameter.cs
@@ -14,7 +14,7 @@ namespace ANX.Framework.NonXNA
[PercentageComplete(100)]
[TestState(TestStateAttribute.TestState.Untested)]
[Developer("Glatzemann")]
- public interface INativeEffectParameter
+ public interface INativeEffectParameter : IDisposable
{
string Name { get; }
string Semantic { get; }
diff --git a/ANX.Framework/NonXNA/RenderSystem/INativeEffectPass.cs b/ANX.Framework/NonXNA/RenderSystem/INativeEffectPass.cs
index 60793fc0..3aee2166 100644
--- a/ANX.Framework/NonXNA/RenderSystem/INativeEffectPass.cs
+++ b/ANX.Framework/NonXNA/RenderSystem/INativeEffectPass.cs
@@ -11,8 +11,12 @@ using ANX.Framework.Graphics;
namespace ANX.Framework.NonXNA
{
- public interface INativeEffectPass
+ public interface INativeEffectPass : IDisposable
{
string Name { get; }
+
+ EffectAnnotationCollection Annotations { get; }
+
+ void Apply();
}
}
diff --git a/ANX.Framework/NonXNA/RenderSystem/INativeEffectTechnique.cs b/ANX.Framework/NonXNA/RenderSystem/INativeEffectTechnique.cs
index 5c1df18f..18514eaf 100644
--- a/ANX.Framework/NonXNA/RenderSystem/INativeEffectTechnique.cs
+++ b/ANX.Framework/NonXNA/RenderSystem/INativeEffectTechnique.cs
@@ -11,7 +11,7 @@ using ANX.Framework.Graphics;
namespace ANX.Framework.NonXNA
{
- public interface INativeEffectTechnique
+ public interface INativeEffectTechnique : IDisposable
{
string Name { get; }
IEnumerable Passes { get; }
diff --git a/ANX.Framework/NonXNA/RenderSystem/INativeGraphicsDevice.cs b/ANX.Framework/NonXNA/RenderSystem/INativeGraphicsDevice.cs
index 9bd5ad32..8e102d65 100644
--- a/ANX.Framework/NonXNA/RenderSystem/INativeGraphicsDevice.cs
+++ b/ANX.Framework/NonXNA/RenderSystem/INativeGraphicsDevice.cs
@@ -13,10 +13,11 @@ namespace ANX.Framework.NonXNA
void Present();
- void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount, IndexBuffer indexBuffer);
+ void Present(Rectangle? sourceRectangle, Rectangle? destinationRectangle, WindowHandle overrideWindowHandle);
- void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices,
- int startIndex, int primitiveCount, int instanceCount, IndexBuffer indexBuffer);
+ void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount);
+
+ void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount, int instanceCount);
void DrawUserIndexedPrimitives(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int numVertices,
Array indexData, int indexOffset, int primitiveCount, VertexDeclaration vertexDeclaration,
@@ -33,7 +34,7 @@ namespace ANX.Framework.NonXNA
void SetVertexBuffers(VertexBufferBinding[] vertexBuffers);
- void SetIndexBuffer(IndexBuffer indexBuffer);
+ IndexBuffer IndexBuffer { get; set; }
void SetViewport(Viewport viewport);
diff --git a/RenderSystems/ANX.RenderSystem.DX.SharedSources/DxFormatConverter.cs b/RenderSystems/ANX.RenderSystem.DX.SharedSources/DxFormatConverter.cs
index 8528eee0..fdf46224 100644
--- a/RenderSystems/ANX.RenderSystem.DX.SharedSources/DxFormatConverter.cs
+++ b/RenderSystems/ANX.RenderSystem.DX.SharedSources/DxFormatConverter.cs
@@ -227,55 +227,53 @@ namespace ANX.RenderSystem.Windows.DX11
}
#endregion
- #region Translate (ShaderVariableType)
- public static EffectParameterType Translate(ShaderVariableType type)
+ public static ANX.Framework.Graphics.EffectParameterClass Translate(this ShaderVariableClass variableClass)
{
- switch (type)
+ switch (variableClass)
+ {
+ case ShaderVariableClass.Vector:
+ return Framework.Graphics.EffectParameterClass.Vector;
+ case ShaderVariableClass.Struct:
+ return Framework.Graphics.EffectParameterClass.Struct;
+ case ShaderVariableClass.Scalar:
+ return Framework.Graphics.EffectParameterClass.Scalar;
+ case ShaderVariableClass.Object:
+ return Framework.Graphics.EffectParameterClass.Object;
+ case ShaderVariableClass.MatrixColumns:
+ case ShaderVariableClass.MatrixRows:
+ return Framework.Graphics.EffectParameterClass.Matrix;
+ default:
+ return (Framework.Graphics.EffectParameterClass)(-1);
+ }
+ }
+
+ public static ANX.Framework.Graphics.EffectParameterType Translate(this ShaderVariableType variableType)
+ {
+ switch (variableType)
{
case ShaderVariableType.Bool:
- return EffectParameterType.Bool;
- case ShaderVariableType.Texture1D:
- return EffectParameterType.Texture1D;
- case ShaderVariableType.Texture2D:
- return EffectParameterType.Texture2D;
- case ShaderVariableType.Texture3D:
- return EffectParameterType.Texture3D;
- case ShaderVariableType.Texture:
- return EffectParameterType.Texture;
- case ShaderVariableType.Void:
- return EffectParameterType.Void;
+ return Framework.Graphics.EffectParameterType.Bool;
case ShaderVariableType.Int:
- return EffectParameterType.Int32;
+ return Framework.Graphics.EffectParameterType.Int32;
case ShaderVariableType.Float:
- return EffectParameterType.Single;
+ return Framework.Graphics.EffectParameterType.Single;
case ShaderVariableType.String:
- return EffectParameterType.String;
+ return Framework.Graphics.EffectParameterType.String;
+ case ShaderVariableType.Texture:
+ return Framework.Graphics.EffectParameterType.Texture;
+ case ShaderVariableType.Texture1D:
+ return Framework.Graphics.EffectParameterType.Texture1D;
+ case ShaderVariableType.Texture2D:
+ return Framework.Graphics.EffectParameterType.Texture2D;
+ case ShaderVariableType.Texture3D:
+ return Framework.Graphics.EffectParameterType.Texture3D;
case ShaderVariableType.TextureCube:
- return EffectParameterType.TextureCube;
+ return Framework.Graphics.EffectParameterType.TextureCube;
+ case ShaderVariableType.Void:
+ return Framework.Graphics.EffectParameterType.Void;
+ default:
+ return (Framework.Graphics.EffectParameterType)(-1);
}
-
- return EffectParameterType.Void;
}
- #endregion
-
- #region Translate (ShaderVariableType)
- public static EffectParameterClass Translate(ShaderVariableClass type)
- {
- switch (type)
- {
- case ShaderVariableClass.Scalar:
- return EffectParameterClass.Scalar;
- case ShaderVariableClass.Vector:
- return EffectParameterClass.Vector;
- case ShaderVariableClass.Struct:
- return EffectParameterClass.Struct;
- case ShaderVariableClass.MatrixRows:
- case ShaderVariableClass.MatrixColumns:
- return EffectParameterClass.Matrix;
- }
-
- return EffectParameterClass.Object;
- }
- #endregion
}
}
diff --git a/RenderSystems/ANX.RenderSystem.DX.SharedSources/InputLayoutManager.cs b/RenderSystems/ANX.RenderSystem.DX.SharedSources/InputLayoutManager.cs
new file mode 100644
index 00000000..a7b46b7c
--- /dev/null
+++ b/RenderSystems/ANX.RenderSystem.DX.SharedSources/InputLayoutManager.cs
@@ -0,0 +1,184 @@
+using ANX.Framework.Graphics;
+using SharpDX.D3DCompiler;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using Anx = ANX.Framework.Graphics;
+
+#if DX10
+using SharpDX.Direct3D10;
+namespace ANX.RenderSystem.Windows.DX10
+#elif DX11
+using SharpDX.Direct3D11;
+namespace ANX.RenderSystem.Windows.DX11
+#endif
+{
+ class InputLayoutManager : IDisposable
+ {
+#if DEBUG
+ private static int layoutCount = 0;
+#endif
+
+ private Dictionary layouts = new Dictionary(new InputLayoutBindingCompararer());
+
+ ///
+ /// This method creates a InputLayout which is needed by DirectX 10 for rendering primitives.
+ /// The VertexDeclaration of ANX/XNA needs to be mapped to the DirectX 10 types.
+ ///
+ public InputLayout GetInputLayout(Device device, ShaderBytecode passSignature, VertexDeclaration vertexDeclaration)
+ {
+ if (device == null) throw new ArgumentNullException("device");
+ if (passSignature == null) throw new ArgumentNullException("passSignature");
+ if (vertexDeclaration == null) throw new ArgumentNullException("vertexDeclaration");
+
+ var inputLayoutBinding = new InputLayoutBinding[] { new InputLayoutBinding() { vertexElements = vertexDeclaration.GetVertexElements() } };
+
+ InputLayout layout;
+ var vertexElements = vertexDeclaration.GetVertexElements();
+ if (!layouts.TryGetValue(inputLayoutBinding, out layout))
+ {
+ InputElement[] inputElements = new InputElement[vertexElements.Length];
+ for (int i = 0; i < vertexElements.Length; i++)
+ {
+ inputElements[i] = CreateInputElementFromVertexElement(vertexElements[i]);
+ }
+
+ layout = CreateInputLayout(device, passSignature, inputElements);
+
+ layouts.Add(inputLayoutBinding, layout);
+ }
+
+ return layout;
+ }
+
+ public InputLayout GetInputLayout(Device device, ShaderBytecode passSignature, params ANX.Framework.Graphics.VertexBufferBinding[] vertexBufferBindings)
+ {
+ if (device == null) throw new ArgumentNullException("device");
+ if (passSignature == null) throw new ArgumentNullException("passSignature");
+ if (vertexBufferBindings == null) throw new ArgumentNullException("vertexBufferBindings");
+
+ var inputLayoutBindings = vertexBufferBindings.Select((x) => new InputLayoutBinding() { instanceFrequency = x.InstanceFrequency, vertexElements = x.VertexBuffer.VertexDeclaration.GetVertexElements() }).ToArray();
+
+ InputLayout layout;
+ if (!layouts.TryGetValue(inputLayoutBindings, out layout))
+ {
+ List inputElements = new List();
+ int slot = 0;
+ foreach (ANX.Framework.Graphics.VertexBufferBinding binding in vertexBufferBindings)
+ {
+ foreach (VertexElement vertexElement in binding.VertexBuffer.VertexDeclaration.GetVertexElements())
+ {
+ inputElements.Add(CreateInputElementFromVertexElement(vertexElement, binding.InstanceFrequency, slot));
+ }
+ slot++;
+ }
+
+ // Layout from VertexShader input signature
+ layout = CreateInputLayout(device, passSignature, inputElements.ToArray());
+
+ layouts.Add(inputLayoutBindings, layout);
+ }
+
+ return layout;
+ }
+
+ private InputLayout CreateInputLayout(Device device, ShaderBytecode passSignature, InputElement[] inputElements)
+ {
+ var layout = new InputLayout(device, passSignature, inputElements);
+#if DEBUG
+ layout.DebugName = "InputLayout_" + layoutCount++;
+#endif
+
+ return layout;
+ }
+
+ private InputElement CreateInputElementFromVertexElement(VertexElement vertexElement, int instanceFrequency, int slot)
+ {
+ string elementName = DxFormatConverter.Translate(ref vertexElement);
+ SharpDX.DXGI.Format elementFormat = DxFormatConverter.ConvertVertexElementFormat(vertexElement.VertexElementFormat);
+ return new InputElement(elementName, vertexElement.UsageIndex, elementFormat, vertexElement.Offset, slot, instanceFrequency == 0 ? InputClassification.PerVertexData : InputClassification.PerInstanceData, instanceFrequency);
+ }
+
+ private InputElement CreateInputElementFromVertexElement(VertexElement vertexElement)
+ {
+ string elementName = DxFormatConverter.Translate(ref vertexElement);
+ SharpDX.DXGI.Format elementFormat = DxFormatConverter.ConvertVertexElementFormat(vertexElement.VertexElementFormat);
+ return new InputElement(elementName, vertexElement.UsageIndex, elementFormat, vertexElement.Offset, 0);
+ }
+
+ public void Dispose()
+ {
+ this.Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+
+ protected virtual void Dispose(bool disposeManaged)
+ {
+ if (disposeManaged)
+ {
+ foreach (var layout in layouts.Values)
+ {
+ layout.Dispose();
+ }
+
+ layouts.Clear();
+ }
+ }
+
+ class InputLayoutBinding : IEquatable
+ {
+ public int instanceFrequency = 0;
+ public VertexElement[] vertexElements;
+
+ public override int GetHashCode()
+ {
+ int hash = this.instanceFrequency;
+ foreach (var element in this.vertexElements)
+ hash ^= element.GetHashCode();
+
+ return hash;
+ }
+
+ public override bool Equals(object obj)
+ {
+ if (obj is InputLayoutBinding)
+ return this.Equals((InputLayoutBinding)obj);
+
+ return false;
+ }
+
+ public bool Equals(InputLayoutBinding other)
+ {
+ return other.instanceFrequency == this.instanceFrequency && other.vertexElements.SequenceEqual(this.vertexElements);
+ }
+ }
+
+ class InputLayoutBindingCompararer : IEqualityComparer
+ {
+ public bool Equals(InputLayoutBinding[] x, InputLayoutBinding[] y)
+ {
+ if (x.Length == y.Length)
+ {
+ for (int i = 0; i < x.Length; i++)
+ if (!x[i].Equals(y[i]))
+ return false;
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public int GetHashCode(InputLayoutBinding[] obj)
+ {
+ int hash = 0;
+ foreach (var binding in obj)
+ hash ^= binding.GetHashCode();
+
+ return hash;
+ }
+ }
+ }
+}
diff --git a/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedGraphicsDeviceDX.cs b/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedGraphicsDeviceDX.cs
index 7eb09196..00fe3dda 100644
--- a/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedGraphicsDeviceDX.cs
+++ b/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedGraphicsDeviceDX.cs
@@ -13,9 +13,13 @@ using SharpDX.DXGI;
// For details see: http://anxframework.codeplex.com/license
#if DX10
+using SharpDX.Direct3D10;
+
namespace ANX.RenderSystem.Windows.DX10
#endif
#if DX11
+using SharpDX.Direct3D11;
+
namespace ANX.RenderSystem.Windows.DX11
#endif
{
@@ -23,9 +27,11 @@ namespace ANX.RenderSystem.Windows.DX11
{
#region Private
protected SharpDX.DXGI.SwapChain swapChain;
- protected VertexBufferBinding[] currentVertexBuffer;
+ protected Framework.Graphics.VertexBufferBinding[] currentVertexBuffer = new Framework.Graphics.VertexBufferBinding[0];
protected int currentVertexBufferCount;
protected IndexBuffer currentIndexBuffer;
+ private InputLayoutManager inputLayoutManager = new InputLayoutManager();
+ private InputLayout currentInputLayout = null;
#endregion
#region Public
@@ -86,7 +92,80 @@ namespace ANX.RenderSystem.Windows.DX11
}
#endregion
- #region GetBackBufferData (TODO)
+ public void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount)
+ {
+ if (primitiveCount <= 0) throw new ArgumentOutOfRangeException("primitiveCount is less than or equal to zero. When drawing, at least one primitive must be drawn.");
+ if (this.currentVertexBufferCount == 0) throw new InvalidOperationException("you have to set a valid vertex buffer before drawing.");
+
+ int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount);
+
+ SetupDraw(primitiveType);
+
+ nativeDevice.DrawIndexed(vertexCount, startIndex, baseVertex);
+ }
+
+ public void DrawPrimitives(PrimitiveType primitiveType, int vertexOffset, int primitiveCount)
+ {
+ int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount);
+
+ SetupDraw(primitiveType);
+
+ nativeDevice.Draw(vertexCount, vertexOffset);
+ }
+
+ public void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices,
+ int startIndex, int primitiveCount, int instanceCount)
+ {
+ int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount);
+
+ SetupDraw(primitiveType);
+
+ nativeDevice.DrawIndexedInstanced(vertexCount, instanceCount, startIndex, baseVertex, 0);
+ }
+
+ public void DrawUserIndexedPrimitives(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int numVertices,
+ Array indexData, int indexOffset, int primitiveCount, VertexDeclaration vertexDeclaration,
+ IndexElementSize indexFormat) where T : struct, IVertexType
+ {
+ int vertexCount = vertexData.Length;
+ int indexCount = indexData.Length;
+
+ using (var vertexBuffer = new DynamicVertexBuffer(vertexDeclaration.GraphicsDevice, vertexDeclaration, vertexCount, BufferUsage.WriteOnly))
+ using (var indexBuffer = new DynamicIndexBuffer(vertexDeclaration.GraphicsDevice, indexFormat, indexCount, BufferUsage.WriteOnly))
+ {
+ vertexBuffer.SetData(vertexData);
+ this.SetVertexBuffers(new[] { new Framework.Graphics.VertexBufferBinding(vertexBuffer, vertexOffset) });
+
+ if (indexData.GetType() == typeof(Int16[]))
+ {
+ indexBuffer.SetData((short[])indexData);
+ }
+ else
+ {
+ indexBuffer.SetData((int[])indexData);
+ }
+ this.IndexBuffer = indexBuffer;
+
+ DrawIndexedPrimitives(primitiveType, 0, vertexOffset, numVertices, indexOffset, primitiveCount);
+ }
+ }
+
+ public void DrawUserPrimitives(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int primitiveCount, VertexDeclaration vertexDeclaration) where T : struct, IVertexType
+ {
+ int vertexCount = vertexData.Length;
+ //TODO: use a shared vertexBuffer, instead of creating one on every call.
+ using (var vertexBuffer = new DynamicVertexBuffer(vertexDeclaration.GraphicsDevice, vertexDeclaration, vertexCount, BufferUsage.WriteOnly))
+ {
+ vertexBuffer.SetData(vertexData);
+ this.SetVertexBuffers(new[] { new Framework.Graphics.VertexBufferBinding(vertexBuffer, vertexOffset) });
+
+ SetupDraw(primitiveType);
+
+ nativeDevice.Draw(vertexCount, vertexOffset);
+ }
+ }
+
+ #region GetBackBufferData
public void GetBackBufferData(Rectangle? rect, T[] data, int startIndex, int elementCount) where T : struct
{
this.backBuffer.GetData(0, rect, data, startIndex, elementCount);
@@ -103,6 +182,35 @@ namespace ANX.RenderSystem.Windows.DX11
}
#endregion
+ public IndexBuffer IndexBuffer
+ {
+ get
+ {
+ return this.currentIndexBuffer;
+ }
+ set
+ {
+ if (value == null)
+ throw new ArgumentNullException("indexBuffer");
+
+ if (this.currentIndexBuffer != value)
+ {
+ this.currentIndexBuffer = value;
+
+ DxIndexBuffer nativeIndexBuffer = value.NativeIndexBuffer as DxIndexBuffer;
+
+ if (nativeIndexBuffer != null)
+ {
+ nativeDevice.InputAssembler.SetIndexBuffer(nativeIndexBuffer.NativeBuffer, DxFormatConverter.Translate(value.IndexElementSize), 0);
+ }
+ else
+ {
+ throw new Exception("couldn't fetch native DirectX10 IndexBuffer");
+ }
+ }
+ }
+ }
+
#if XNAEXT
#region SetConstantBuffer (TODO)
public void SetConstantBuffer(int slot, ConstantBuffer constantBuffer)
@@ -114,5 +222,29 @@ namespace ANX.RenderSystem.Windows.DX11
}
#endregion
#endif
+
+ public void Dispose()
+ {
+ this.Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+
+ protected virtual void Dispose(bool diposeManaged)
+ {
+ if (swapChain != null)
+ {
+ DisposeBackBuffer();
+
+ swapChain.Dispose();
+ swapChain = null;
+ }
+
+ if (inputLayoutManager != null)
+ {
+ inputLayoutManager.Dispose();
+ inputLayoutManager = null;
+ }
+ //TODO: dispose everything else
+ }
}
}
diff --git a/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedIndexBuffer.cs b/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedIndexBuffer.cs
index bc7c8df4..67232b46 100644
--- a/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedIndexBuffer.cs
+++ b/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedIndexBuffer.cs
@@ -35,7 +35,7 @@ namespace ANX.RenderSystem.Windows.DX11
public void SetData(int offsetInBytes, S[] data, int startIndex, int elementCount)
where S : struct
{
- if (offsetInBytes + elementCount * Marshal.SizeOf(typeof(S)) > NativeBuffer.Description.SizeInBytes)
+ if (offsetInBytes + elementCount * Marshal.SizeOf(typeof(S)) > SizeInBytes)
throw new ArgumentOutOfRangeException(string.Format("The offset by \"{0}\" plus the byte length described by \"{1}\" is over the bounds of the buffer.", "offsetInBytes", "elementCount"));
var buffer = this.NativeBuffer;
diff --git a/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedVertexBuffer.cs b/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedVertexBuffer.cs
index ee2ba598..b8dba382 100644
--- a/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedVertexBuffer.cs
+++ b/RenderSystems/ANX.RenderSystem.DX.SharedSources/SharedVertexBuffer.cs
@@ -52,11 +52,11 @@ namespace ANX.RenderSystem.Windows.DX11
if (startIndex + elementCount > data.Length)
throw new ArgumentOutOfRangeException("startIndex must be smaller than elementCount + data.Length.");
- if (offsetInBytes + elementCount * Marshal.SizeOf(typeof(S)) > NativeBuffer.Description.SizeInBytes)
+ if (offsetInBytes + elementCount * Marshal.SizeOf(typeof(S)) > this.SizeInBytes)
throw new ArgumentOutOfRangeException(string.Format("The offset by \"{0}\" plus the byte length described by \"{1}\" is over the bounds of the buffer.", "offsetInBytes", "elementCount"));
var buffer = this.NativeBuffer;
- if (!this.WriteNeedsStaging)
+ if (this.WriteNeedsStaging)
{
buffer = CreateStagingBuffer(ResourceMapping.Write);
}
@@ -80,7 +80,7 @@ namespace ANX.RenderSystem.Windows.DX11
}
finally
{
- if (!this.WriteNeedsStaging)
+ if (this.WriteNeedsStaging)
{
CopySubresource(buffer, this.NativeBuffer);
buffer.Dispose();
diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX10/ANX.RenderSystem.Windows.DX10.csproj b/RenderSystems/ANX.RenderSystem.Windows.DX10/ANX.RenderSystem.Windows.DX10.csproj
index 53774513..4e12c2c9 100644
--- a/RenderSystems/ANX.RenderSystem.Windows.DX10/ANX.RenderSystem.Windows.DX10.csproj
+++ b/RenderSystems/ANX.RenderSystem.Windows.DX10/ANX.RenderSystem.Windows.DX10.csproj
@@ -60,6 +60,9 @@
BufferHelper.cs
+
+ InputLayoutManager.cs
+
ResourceMapping.cs
@@ -67,6 +70,7 @@
+
diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX10/Buffer.cs b/RenderSystems/ANX.RenderSystem.Windows.DX10/Buffer.cs
index 7bf95f15..8d94e087 100644
--- a/RenderSystems/ANX.RenderSystem.Windows.DX10/Buffer.cs
+++ b/RenderSystems/ANX.RenderSystem.Windows.DX10/Buffer.cs
@@ -10,11 +10,32 @@ namespace ANX.RenderSystem.Windows.DX10
{
public abstract class Buffer : IDisposable
{
- public Dx.Buffer NativeBuffer { get; protected set; }
+ public Dx.Buffer NativeBuffer
+ {
+ get { return nativeBuffer; }
+ protected set
+ {
+ if (value != null)
+ SizeInBytes = value.Description.SizeInBytes;
+ else
+ SizeInBytes = 0;
+
+ nativeBuffer = value;
+ }
+ }
+
+ private Dx.Buffer nativeBuffer;
+
private Dx.Device device;
private BufferUsage usage;
private bool isDynamic;
+ public int SizeInBytes
+ {
+ get;
+ private set;
+ }
+
protected Buffer(Dx.Device device, BufferUsage usage, bool isDynamic)
{
this.device = device;
@@ -26,6 +47,9 @@ namespace ANX.RenderSystem.Windows.DX10
{
CheckUsage(mapping);
+ if (isDynamic && mapping == ResourceMapping.Write)
+ return buffer.Map(Dx.MapMode.WriteDiscard);
+
return buffer.Map(mapping.ToMapMode());
}
@@ -59,7 +83,7 @@ namespace ANX.RenderSystem.Windows.DX10
var description = new Dx.BufferDescription()
{
Usage = Dx.ResourceUsage.Staging,
- SizeInBytes = NativeBuffer.Description.SizeInBytes,
+ SizeInBytes = this.SizeInBytes,
CpuAccessFlags = mapping.ToCpuAccessFlags(),
OptionFlags = Dx.ResourceOptionFlags.None
};
diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX10/DxEffectAnnotation.cs b/RenderSystems/ANX.RenderSystem.Windows.DX10/DxEffectAnnotation.cs
new file mode 100644
index 00000000..8a1ffde8
--- /dev/null
+++ b/RenderSystems/ANX.RenderSystem.Windows.DX10/DxEffectAnnotation.cs
@@ -0,0 +1,153 @@
+using ANX.Framework.NonXNA.RenderSystem;
+using SharpDX.Direct3D10;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace ANX.RenderSystem.Windows.DX10
+{
+ public class DxEffectAnnotation : INativeEffectAnnotation
+ {
+ private readonly EffectVariable nativeEffectVariable;
+
+ public DxEffectAnnotation(SharpDX.Direct3D10.EffectVariable nativeEffectVariable)
+ {
+ this.nativeEffectVariable = nativeEffectVariable;
+
+ var description = nativeEffectVariable.Description;
+ var typeDescription = nativeEffectVariable.TypeInfo.Description;
+
+ this.Name = description.Name;
+ this.ColumnCount = typeDescription.Columns;
+ this.ParameterClass = typeDescription.Class.ToParameterClass();
+ this.ParameterType = typeDescription.Type.ToParameterType();
+ this.RowCount = typeDescription.Rows;
+ this.Semantic = description.Semantic;
+
+ this.Matrix = nativeEffectVariable.AsMatrix();
+ this.Scalar = nativeEffectVariable.AsScalar();
+ this.String = nativeEffectVariable.AsString();
+ this.Vector = nativeEffectVariable.AsVector();
+ }
+
+ public int ColumnCount
+ {
+ get;
+ private set;
+ }
+
+ public string Name
+ {
+ get;
+ private set;
+ }
+
+ public Framework.Graphics.EffectParameterClass ParameterClass
+ {
+ get;
+ private set;
+ }
+
+ public Framework.Graphics.EffectParameterType ParameterType
+ {
+ get;
+ private set;
+ }
+
+ public int RowCount
+ {
+ get;
+ private set;
+ }
+
+ public string Semantic
+ {
+ get;
+ private set;
+ }
+
+ protected EffectScalarVariable Scalar
+ {
+ get;
+ private set;
+ }
+
+ protected EffectMatrixVariable Matrix
+ {
+ get;
+ private set;
+ }
+
+ protected EffectStringVariable String
+ {
+ get;
+ private set;
+ }
+
+ protected EffectVectorVariable Vector
+ {
+ get;
+ private set;
+ }
+
+ public bool GetValueBoolean()
+ {
+ return this.Scalar.GetBool();
+ }
+
+ public int GetValueInt32()
+ {
+ return this.Scalar.GetInt();
+ }
+
+ public Framework.Matrix GetValueMatrix()
+ {
+ return this.Matrix.GetMatrix();
+ }
+
+ public float GetValueSingle()
+ {
+ return this.Scalar.GetFloat();
+ }
+
+ public string GetValueString()
+ {
+ return this.String.GetString();
+ }
+
+ public Framework.Vector2 GetValueVector2()
+ {
+ return this.Vector.GetVector();
+ }
+
+ public Framework.Vector3 GetValueVector3()
+ {
+ return this.Vector.GetVector();
+ }
+
+ public Framework.Vector4 GetValueVector4()
+ {
+ return this.Vector.GetVector();
+ }
+
+ public void Dispose()
+ {
+ this.Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+
+ protected virtual void Dispose(bool disposeManaged)
+ {
+ if (disposeManaged)
+ {
+ this.Matrix.Dispose();
+ this.Scalar.Dispose();
+ this.String.Dispose();
+ this.Vector.Dispose();
+
+ this.nativeEffectVariable.Dispose();
+ }
+ }
+ }
+}
diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectDX.cs b/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectDX.cs
index fa8cf654..b9b41a76 100644
--- a/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectDX.cs
+++ b/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectDX.cs
@@ -26,32 +26,17 @@ namespace ANX.RenderSystem.Windows.DX10
#region Public
internal Dx10.Effect NativeEffect { get; private set; }
- public IEnumerable Techniques
- {
- get
- {
- for (int i = 0; i < NativeEffect.Description.TechniqueCount; i++)
- {
- var teqDx10 = new EffectTechnique_DX10(managedEffect, NativeEffect.GetTechniqueByIndex(i));
- yield return new EffectTechnique(this.managedEffect, teqDx10);
- }
- }
- }
+ public IEnumerable Techniques
+ {
+ get;
+ private set;
+ }
- public IEnumerable Parameters
- {
- get
- {
- for (int i = 0; i < NativeEffect.Description.GlobalVariableCount; i++)
- {
- var parDx10 = new EffectParameter_DX10
- {
- NativeParameter = NativeEffect.GetVariableByIndex(i)
- };
- yield return new EffectParameter(parDx10);
- }
- }
- }
+ public IEnumerable Parameters
+ {
+ get;
+ private set;
+ }
#endregion
#region Constructor
@@ -61,6 +46,8 @@ namespace ANX.RenderSystem.Windows.DX10
var device = ((GraphicsDeviceDX)graphicsDevice.NativeDevice).NativeDevice;
vertexShader = new Dx10.VertexShader(device, GetByteCode(vertexShaderStream));
pixelShader = new Dx10.PixelShader(device, GetByteCode(pixelShaderStream));
+
+ this.BufferNativeData();
}
public EffectDX(GraphicsDevice graphicsDevice, Effect managedEffect, Stream effectStream)
@@ -76,9 +63,30 @@ namespace ANX.RenderSystem.Windows.DX10
{
System.Diagnostics.Debugger.Break();
}
+
+ this.BufferNativeData();
}
#endregion
+ private void BufferNativeData()
+ {
+ var description = NativeEffect.Description;
+
+ var techniques = new EffectTechnique[description.TechniqueCount];
+ for (int i = 0; i < techniques.Length; i++)
+ {
+ techniques[i] = new EffectTechnique(this.managedEffect, new EffectTechnique_DX10(managedEffect, NativeEffect.GetTechniqueByIndex(i)));
+ }
+ this.Techniques = techniques;
+
+ var parameters = new EffectParameter[description.GlobalVariableCount];
+ for (int i = 0; i < parameters.Length; i++)
+ {
+ parameters[i] = new EffectParameter(new EffectParameter_DX10(NativeEffect.GetVariableByIndex(i)));
+ }
+ this.Parameters = parameters;
+ }
+
#region GetCurrentTechnique
public EffectTechnique_DX10 GetCurrentTechnique()
{
@@ -86,13 +94,6 @@ namespace ANX.RenderSystem.Windows.DX10
}
#endregion
- #region Apply
- public void Apply(GraphicsDevice graphicsDevice)
- {
- ((GraphicsDeviceDX)graphicsDevice.NativeDevice).currentEffect = this;
- }
- #endregion
-
#region CompileFXShader
public static byte[] CompileFXShader(string effectCode, string directory = "")
{
@@ -103,16 +104,31 @@ namespace ANX.RenderSystem.Windows.DX10
#region Dispose
public void Dispose()
{
- SafeDispose(pixelShader);
- pixelShader = null;
-
- SafeDispose(vertexShader);
- vertexShader = null;
-
- SafeDispose(NativeEffect);
- NativeEffect = null;
+ this.Dispose(true);
+ GC.SuppressFinalize(this);
}
+ protected virtual void Dispose(bool disposeManaged)
+ {
+ if (disposeManaged)
+ {
+ SafeDispose(pixelShader);
+ pixelShader = null;
+
+ SafeDispose(vertexShader);
+ vertexShader = null;
+
+ SafeDispose(NativeEffect);
+ NativeEffect = null;
+
+ foreach (var technique in this.Techniques)
+ technique.NativeTechnique.Dispose();
+
+ foreach (var parameter in this.Parameters)
+ parameter.NativeParameter.Dispose();
+ }
+ }
+
private void SafeDispose(IDisposable disposable)
{
if (disposable != null)
diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectParameter_DX10.cs b/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectParameter_DX10.cs
index cbba830f..0416b692 100644
--- a/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectParameter_DX10.cs
+++ b/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectParameter_DX10.cs
@@ -4,6 +4,7 @@ using ANX.Framework.Graphics;
using ANX.Framework.NonXNA;
using Dx10 = SharpDX.Direct3D10;
using ANX.Framework.NonXNA.Development;
+using SharpDX.Direct3D10;
// This file is part of the ANX.Framework created by the
// "ANX.Framework developer group" and released under the Ms-PL license.
@@ -11,269 +12,214 @@ using ANX.Framework.NonXNA.Development;
namespace ANX.RenderSystem.Windows.DX10
{
- [PercentageComplete(50)]
+ [PercentageComplete(80)]
[TestState(TestStateAttribute.TestState.Untested)]
- [Developer("Glatzemann")]
- public class EffectParameter_DX10 : INativeEffectParameter
+ [Developer("Glatzemann, KorsarNek")]
+ public class EffectParameter_DX10 : DxEffectAnnotation, INativeEffectParameter
{
#region Public
- public Dx10.EffectVariable NativeParameter { get; internal set; }
+ public Dx10.EffectVariable NativeParameter { get; private set; }
- public string Name
+ public EffectParameter_DX10(Dx10.EffectVariable nativeParameter)
+ : base(nativeParameter)
{
- get { return NativeParameter.Description.Name; }
- }
+ this.NativeParameter = nativeParameter;
- public string Semantic
- {
- get { return NativeParameter.Description.Semantic; }
- }
+ var description = nativeParameter.Description;
+ var typeDescription = nativeParameter.TypeInfo.Description;
- public int ColumnCount
- {
- get { return NativeParameter.TypeInfo.Description.Columns; }
- }
+ var annotations = new EffectAnnotation[description.AnnotationCount];
+ for (int i = 0; i < annotations.Length; i++)
+ annotations[i] = new EffectAnnotation(new DxEffectAnnotation(nativeParameter.GetAnnotationByIndex(i)));
+ this.Annotations = new EffectAnnotationCollection(annotations);
- public int RowCount
- {
- get { return NativeParameter.TypeInfo.Description.Rows; }
- }
+ var elements = new EffectParameter[typeDescription.Elements];
+ for (int i = 0; i < elements.Length; i++)
+ elements[i] = new EffectParameter(new EffectParameter_DX10(nativeParameter.GetElement(i)));
+ this.Elements = new EffectParameterCollection(elements);
- public EffectParameterClass ParameterClass
- {
- get { return DxFormatConverter.Translate(NativeParameter.TypeInfo.Description.Class); }
- }
+ var members = new EffectParameter[typeDescription.Members];
+ for (int i = 0; i < members.Length; i++)
+ members[i] = new EffectParameter(new EffectParameter_DX10(nativeParameter.GetMemberByIndex(i)));
+ this.StructureMembers = new EffectParameterCollection(members);
- public EffectParameterType ParameterType
- {
- get { return DxFormatConverter.Translate(NativeParameter.TypeInfo.Description.Type); }
+ this.ShaderResource = nativeParameter.AsShaderResource();
}
public EffectAnnotationCollection Annotations
{
- get { throw new NotImplementedException(); }
+ get;
+ private set;
}
public EffectParameterCollection Elements
{
- get { throw new NotImplementedException(); }
+ get;
+ private set;
}
public EffectParameterCollection StructureMembers
{
- get { throw new NotImplementedException(); }
+ get;
+ private set;
}
#endregion
- #region SetValue (bool)
+ protected EffectShaderResourceVariable ShaderResource
+ {
+ get;
+ private set;
+ }
+
+ #region SetValue (TODO)
public void SetValue(bool value)
{
- NativeParameter.AsScalar().Set(value);
+ Scalar.Set(value);
}
- #endregion
- #region SetValue (bool[])
public void SetValue(bool[] value)
{
- NativeParameter.AsScalar().Set(value);
+ Scalar.Set(value);
}
- #endregion
- #region SetValue (int)
public void SetValue(int value)
{
- NativeParameter.AsScalar().Set(value);
+ Scalar.Set(value);
}
- #endregion
- #region SetValue (int[])
public void SetValue(int[] value)
{
- NativeParameter.AsScalar().Set(value);
+ Scalar.Set(value);
}
- #endregion
- #region SetValue (Matrix, transpose) (TODO)
public void SetValue(Matrix value, bool transpose)
{
- Matrix val = value;
if (transpose)
- {
- Matrix.Transpose(ref val, out val);
- }
-
- NativeParameter.AsMatrix().SetMatrix(val);
+ Matrix.SetMatrixTranspose(value);
+ else
+ Matrix.SetMatrix(value);
}
- #endregion
- #region SetValue (Matrix[], transpose) (TODO)
public void SetValue(Matrix[] value, bool transpose)
{
- // TODO: handle transpose!
- NativeParameter.AsMatrix().SetMatrix(value);
+ if (transpose)
+ Matrix.SetMatrixTranspose(value);
+ else
+ Matrix.SetMatrix(value);
}
- #endregion
- #region SetValue (Quaternion)
public void SetValue(Quaternion value)
{
- NativeParameter.AsVector().Set(value);
+ Vector.Set(value);
}
- #endregion
- #region SetValue (Quaternion[])
public void SetValue(Quaternion[] value)
{
- NativeParameter.AsVector().Set(value);
+ Vector.Set(value);
}
- #endregion
- #region SetValue (float)
public void SetValue(float value)
{
- NativeParameter.AsScalar().Set(value);
+ Vector.Set(value);
}
- #endregion
- #region SetValue (float[])
public void SetValue(float[] value)
{
- NativeParameter.AsScalar().Set(value);
+ Scalar.Set(value);
}
- #endregion
- #region SetValue (Vector2)
public void SetValue(Vector2 value)
{
- NativeParameter.AsVector().Set(value);
+ Vector.Set(value);
}
- #endregion
- #region SetValue (Vector2[])
public void SetValue(Vector2[] value)
{
- NativeParameter.AsVector().Set(value);
+ Vector.Set(value);
}
- #endregion
- #region SetValue (Vector3)
public void SetValue(Vector3 value)
{
- NativeParameter.AsVector().Set(value);
+ Vector.Set(value);
}
- #endregion
- #region SetValue (Vector3[])
public void SetValue(Vector3[] value)
{
- NativeParameter.AsVector().Set(value);
+ Vector.Set(value);
}
- #endregion
- #region SetValue (Vector4)
public void SetValue(Vector4 value)
{
- NativeParameter.AsVector().Set(value);
+ Vector.Set(value);
}
- #endregion
- #region SetValue (Vector4[])
public void SetValue(Vector4[] value)
{
- NativeParameter.AsVector().Set(value);
+ Vector.Set(value);
}
- #endregion
- #region SetValue (Texture)
public void SetValue(Texture value)
{
if (value == null)
throw new ArgumentNullException("value");
- var tex = value.NativeTexture as DxTexture2D;
- NativeParameter.AsShaderResource().SetResource(tex.NativeShaderResourceView);
+ ShaderResource.SetResource(((DxTexture2D)value.NativeTexture).NativeShaderResourceView);
}
- #endregion
- #region SetValue (string) (TODO)
public void SetValue(string value)
{
- throw new NotImplementedException();
+ throw new NotImplementedException();
}
#endregion
#region Get (TODO)
- public bool GetValueBoolean()
- {
- throw new NotImplementedException();
- }
public bool[] GetValueBooleanArray(int count)
{
- throw new NotImplementedException();
- }
-
- public int GetValueInt32()
- {
- throw new NotImplementedException();
+ return Scalar.GetBoolArray(0, count);
}
public int[] GetValueInt32Array(int count)
{
- throw new NotImplementedException();
- }
-
- public Matrix GetValueMatrix()
- {
- throw new NotImplementedException();
+ return Scalar.GetIntArray(count);
}
public Matrix[] GetValueMatrixArray(int count)
{
- throw new NotImplementedException();
+ return Matrix.GetMatrixArray(count);
}
- public Matrix GetValueMatrixTranspose()
- {
- throw new NotImplementedException();
- }
+ public Matrix GetValueMatrixTranspose()
+ {
+ return Matrix.GetMatrixTranspose();
+ }
public Matrix[] GetValueMatrixTransposeArray(int count)
{
- throw new NotImplementedException();
+ return Matrix.GetMatrixTransposeArray(count);
}
public Quaternion GetValueQuaternion()
{
- throw new NotImplementedException();
+ return Vector.GetVector();
}
public Quaternion[] GetValueQuaternionArray(int count)
{
- throw new NotImplementedException();
- }
-
- public float GetValueSingle()
- {
- throw new NotImplementedException();
+ return Vector.GetVectorArray(count);
}
public float[] GetValueSingleArray(int count)
{
- throw new NotImplementedException();
+ return Scalar.GetFloatArray(count);
}
- public string GetValueString()
+ public ANX.Framework.Graphics.Texture2D GetValueTexture2D()
{
throw new NotImplementedException();
}
- public Texture2D GetValueTexture2D()
- {
- throw new NotImplementedException();
- }
-
- public Texture3D GetValueTexture3D()
+ public ANX.Framework.Graphics.Texture3D GetValueTexture3D()
{
throw new NotImplementedException();
}
@@ -283,35 +229,39 @@ namespace ANX.RenderSystem.Windows.DX10
throw new NotImplementedException();
}
- public Vector2 GetValueVector2()
- {
- throw new NotImplementedException();
- }
-
public Vector2[] GetValueVector2Array(int count)
{
- throw new NotImplementedException();
- }
-
- public Vector3 GetValueVector3()
- {
- throw new NotImplementedException();
+ return Vector.GetVectorArray(count);
}
public Vector3[] GetValueVector3Array(int count)
{
- throw new NotImplementedException();
- }
-
- public Vector4 GetValueVector4()
- {
- throw new NotImplementedException();
+ return Vector.GetVectorArray(count);
}
public Vector4[] GetValueVector4Array(int count)
{
- throw new NotImplementedException();
+ return Vector.GetVectorArray(count);
}
#endregion
- }
+
+ protected override void Dispose(bool disposeManaged)
+ {
+ if (disposeManaged)
+ {
+ ShaderResource.Dispose();
+
+ foreach (var annotation in this.Annotations)
+ annotation.NativeAnnotation.Dispose();
+
+ foreach (var element in this.Elements)
+ element.NativeParameter.Dispose();
+
+ foreach (var member in this.StructureMembers)
+ member.NativeParameter.Dispose();
+ }
+
+ base.Dispose(disposeManaged);
+ }
+ }
}
diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectPass_DX10.cs b/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectPass_DX10.cs
index 0127490d..47c1dd07 100644
--- a/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectPass_DX10.cs
+++ b/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectPass_DX10.cs
@@ -1,5 +1,6 @@
using ANX.Framework.NonXNA;
using SharpDX.Direct3D10;
+using System;
// This file is part of the ANX.Framework created by the
// "ANX.Framework developer group" and released under the Ms-PL license.
@@ -9,19 +10,72 @@ namespace ANX.RenderSystem.Windows.DX10
{
public class EffectPass_DX10 : INativeEffectPass
{
- private EffectPass nativePass;
+ private Framework.Graphics.Effect parentEffect;
public string Name
{
- get
- {
- return nativePass.Description.Name;
- }
+ get;
+ private set;
}
- internal EffectPass_DX10(EffectPass setNativePass)
+ private EffectPass NativeEffectPass
+ {
+ get;
+ set;
+ }
+
+ public SharpDX.D3DCompiler.ShaderBytecode Signature
+ {
+ get;
+ private set;
+ }
+
+ internal EffectPass_DX10(Framework.Graphics.Effect parentEffect, EffectPass nativePass)
{
- nativePass = setNativePass;
+ this.NativeEffectPass = nativePass;
+ this.parentEffect = parentEffect;
+
+ var description = nativePass.Description;
+
+ this.Name = description.Name;
+ this.Signature = description.Signature;
+
+ var annotations = new Framework.Graphics.EffectAnnotation[description.AnnotationCount];
+ for (int i = 0; i < annotations.Length; i++)
+ annotations[i] = new Framework.Graphics.EffectAnnotation(new DxEffectAnnotation(nativePass.GetAnnotationByIndex(i)));
+
+ this.Annotations = new Framework.Graphics.EffectAnnotationCollection(annotations);
}
+
+ public Framework.Graphics.EffectAnnotationCollection Annotations
+ {
+ get;
+ private set;
+ }
+
+ public void Apply()
+ {
+ //TODO: Don't set every state every time, use NativeEffectPass.ComputeStateBlockMask to prevent unnecessary state changes.
+ NativeEffectPass.Apply();
+ ((GraphicsDeviceDX)this.parentEffect.GraphicsDevice.NativeDevice).currentPass = this;
+ parentEffect.OnApply();
+ }
+
+ public void Dispose()
+ {
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+
+ protected virtual void Dispose(bool disposeManaged)
+ {
+ if (disposeManaged)
+ {
+ this.NativeEffectPass.Dispose();
+
+ foreach (var annotation in this.Annotations)
+ annotation.NativeAnnotation.Dispose();
+ }
+ }
}
}
diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectTechnique_DX10.cs b/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectTechnique_DX10.cs
index 6144ec63..686d9b8b 100644
--- a/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectTechnique_DX10.cs
+++ b/RenderSystems/ANX.RenderSystem.Windows.DX10/EffectTechnique_DX10.cs
@@ -17,6 +17,7 @@ namespace ANX.RenderSystem.Windows.DX10
public class EffectTechnique_DX10 : INativeEffectTechnique
{
private readonly Effect parentEffect;
+ private readonly EffectPass[] effectPasses;
public EffectTechnique_DX10(Effect parentEffect, Dx10.EffectTechnique nativeTechnique)
{
@@ -27,34 +28,71 @@ namespace ANX.RenderSystem.Windows.DX10
this.parentEffect = parentEffect;
NativeTechnique = nativeTechnique;
+
+ var description = NativeTechnique.Description;
+
+ this.Name = description.Name;
+
+ var passCounts = description.PassCount;
+ this.effectPasses = new EffectPass[passCounts];
+
+ for (int i = 0; i < passCounts; i++)
+ {
+ this.effectPasses[i] = new EffectPass(new EffectPass_DX10(this.parentEffect, NativeTechnique.GetPassByIndex(i)));
+ }
+
+ var annotationCount = description.AnnotationCount;
+ var annotations = new EffectAnnotation[annotationCount];
+ for (int i = 0; i < annotationCount; i++)
+ annotations[i] = new EffectAnnotation(new DxEffectAnnotation(nativeTechnique.GetAnnotationByIndex(i)));
+
+ this.Annotations = new EffectAnnotationCollection(annotations);
}
- public Dx10.EffectTechnique NativeTechnique { get; protected set; }
-
+ public Dx10.EffectTechnique NativeTechnique { get; private set; }
+
public string Name
- {
- get
- {
- return NativeTechnique.Description.Name;
- }
- }
+ {
+ get;
+ private set;
+ }
public IEnumerable Passes
{
get
{
- for (int i = 0; i < NativeTechnique.Description.PassCount; i++)
- {
- var passDx10 = new EffectPass_DX10(NativeTechnique.GetPassByIndex(i));
- // TODO: wire up native pass and managed pass?
- yield return new EffectPass(this.parentEffect);
- }
+ return this.effectPasses;
}
}
public EffectAnnotationCollection Annotations
{
- get { throw new NotImplementedException(); }
+ get;
+ private set;
}
- }
+
+ public void Dispose()
+ {
+ this.Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+
+ protected virtual void Dispose(bool disposeManaged)
+ {
+ if (disposeManaged)
+ {
+ if (NativeTechnique != null)
+ {
+ NativeTechnique.Dispose();
+ NativeTechnique = null;
+ }
+
+ foreach (var pass in this.effectPasses)
+ pass.NativeEffectPass.Dispose();
+
+ foreach (var annotation in this.Annotations)
+ annotation.NativeAnnotation.Dispose();
+ }
+ }
+ }
}
diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX10/Extensions.cs b/RenderSystems/ANX.RenderSystem.Windows.DX10/Extensions.cs
index 3df7ccda..7895d9da 100644
--- a/RenderSystems/ANX.RenderSystem.Windows.DX10/Extensions.cs
+++ b/RenderSystems/ANX.RenderSystem.Windows.DX10/Extensions.cs
@@ -1,4 +1,5 @@
using SharpDX;
+using SharpDX.D3DCompiler;
using SharpDX.Direct3D10;
using System;
using System.Collections.Generic;
@@ -38,5 +39,15 @@ namespace ANX.RenderSystem.Windows.DX10
Top = rect.Top,
};
}
+
+ public static ANX.Framework.Graphics.EffectParameterClass ToParameterClass(this ShaderVariableClass variableClass)
+ {
+ return DxFormatConverter.Translate(variableClass);
+ }
+
+ public static ANX.Framework.Graphics.EffectParameterType ToParameterType(this ShaderVariableType variableType)
+ {
+ return DxFormatConverter.Translate(variableType);
+ }
}
}
diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX10/GraphicsDeviceDX.cs b/RenderSystems/ANX.RenderSystem.Windows.DX10/GraphicsDeviceDX.cs
index fe59ac2f..5c4e9ae4 100644
--- a/RenderSystems/ANX.RenderSystem.Windows.DX10/GraphicsDeviceDX.cs
+++ b/RenderSystems/ANX.RenderSystem.Windows.DX10/GraphicsDeviceDX.cs
@@ -1,5 +1,6 @@
#region Using Statements
using System;
+using System.Linq;
using System.Collections.Generic;
using ANX.Framework;
using ANX.Framework.Graphics;
@@ -32,7 +33,7 @@ namespace ANX.RenderSystem.Windows.DX10
private Dx10.RenderTargetView[] renderTargetView = new RenderTargetView[MAX_RENDER_TARGETS];
private Dx10.DepthStencilView[] depthStencilView = new DepthStencilView[MAX_RENDER_TARGETS];
private RenderTarget2D_DX10 backBuffer;
- internal EffectDX currentEffect;
+ internal EffectPass_DX10 currentPass;
#endregion
#region CreateDevice
@@ -123,187 +124,34 @@ namespace ANX.RenderSystem.Windows.DX10
{
swapChain.Present(VSync ? 1 : 0, PresentFlags.None);
}
- #endregion
- #region DrawIndexedPrimitives
- public void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount, IndexBuffer indexBuffer)
- {
- if (primitiveCount <= 0) throw new ArgumentOutOfRangeException("primitiveCount is less than or equal to zero. When drawing, at least one primitive must be drawn.");
- if (this.currentVertexBuffer == null || this.currentVertexBufferCount <= 0) throw new InvalidOperationException("you have to set a valid vertex buffer before drawing.");
-
- Dx10.EffectTechnique technique = SetupEffectForDraw();
- int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount);
-
- nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType);
-
- if (indexBuffer != null)
- {
- SetIndexBuffer(indexBuffer);
- }
-
- for (int i = 0; i < technique.Description.PassCount; ++i)
- {
- technique.GetPassByIndex(i).Apply();
- nativeDevice.DrawIndexed(vertexCount, startIndex, baseVertex);
- }
-
- nativeDevice.InputAssembler.InputLayout.Dispose();
- nativeDevice.InputAssembler.InputLayout = null;
- }
- #endregion
-
- #region DrawPrimitives
- public void DrawPrimitives(PrimitiveType primitiveType, int vertexOffset, int primitiveCount)
- {
- Dx10.EffectTechnique technique = SetupEffectForDraw();
- int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount);
-
- nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType);
-
- for (int i = 0; i < technique.Description.PassCount; ++i)
- {
- technique.GetPassByIndex(i).Apply();
- nativeDevice.Draw(vertexCount, vertexOffset);
- }
-
- nativeDevice.InputAssembler.InputLayout.Dispose();
- nativeDevice.InputAssembler.InputLayout = null;
+ public void Present(Rectangle? sourceRectangle, Rectangle? destinationRectangle, WindowHandle overrideWindowHandle)
+ {
+ throw new NotImplementedException();
}
#endregion
- public void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices,
- int startIndex, int primitiveCount, int instanceCount, IndexBuffer indexBuffer)
+ private void SetupDraw(PrimitiveType primitiveType)
{
- Dx10.EffectTechnique technique = SetupEffectForDraw();
- int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount);
+ var inputLayout = this.inputLayoutManager.GetInputLayout(NativeDevice, currentPass.Signature, this.currentVertexBuffer);
nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType);
-
- if (indexBuffer != null)
+ if (currentInputLayout != inputLayout)
{
- SetIndexBuffer(indexBuffer);
- }
-
- for (int i = 0; i < technique.Description.PassCount; ++i)
- {
- technique.GetPassByIndex(i).Apply();
- nativeDevice.DrawIndexedInstanced(vertexCount, instanceCount, startIndex, baseVertex, 0);
- }
-
- nativeDevice.InputAssembler.InputLayout.Dispose();
- nativeDevice.InputAssembler.InputLayout = null;
- }
-
- public void DrawUserIndexedPrimitives(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int numVertices,
- Array indexData, int indexOffset, int primitiveCount, VertexDeclaration vertexDeclaration,
- IndexElementSize indexFormat) where T : struct, IVertexType
- {
- int vertexCount = vertexData.Length;
- int indexCount = indexData.Length;
-
- using (var vertexBuffer = new DynamicVertexBuffer(vertexDeclaration.GraphicsDevice, vertexDeclaration, vertexCount, BufferUsage.WriteOnly))
- using (var indexBuffer = new DynamicIndexBuffer(vertexDeclaration.GraphicsDevice, indexFormat, indexCount, BufferUsage.WriteOnly))
- {
- vertexBuffer.SetData(vertexData);
- this.SetVertexBuffers(new[] { new Framework.Graphics.VertexBufferBinding(vertexBuffer, vertexOffset) });
-
- if (indexData.GetType() == typeof(Int16[]))
- {
- indexBuffer.SetData((short[])indexData);
- }
- else
- {
- indexBuffer.SetData((int[])indexData);
- }
-
- DrawIndexedPrimitives(primitiveType, 0, vertexOffset, numVertices, indexOffset, primitiveCount, indexBuffer);
+ nativeDevice.InputAssembler.InputLayout = this.inputLayoutManager.GetInputLayout(NativeDevice, currentPass.Signature, this.currentVertexBuffer);
+ currentInputLayout = inputLayout;
}
}
- public void DrawUserPrimitives(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int primitiveCount, VertexDeclaration vertexDeclaration) where T : struct, IVertexType
- {
- int vertexCount = vertexData.Length;
- //TODO: use a shared vertexBuffer, instead of creating one on every call.
- using (DxVertexBuffer vb10 = new DxVertexBuffer(nativeDevice, vertexDeclaration, vertexCount, BufferUsage.WriteOnly, dynamic: true))
- {
- vb10.SetData(vertexData);
-
- Dx10.VertexBufferBinding nativeVertexBufferBindings = new Dx10.VertexBufferBinding(vb10.NativeBuffer, vertexDeclaration.VertexStride, 0);
-
- nativeDevice.InputAssembler.SetVertexBuffers(0, nativeVertexBufferBindings);
-
- //TODO: check for currentEffect null and throw exception
- // TODO: check for null's and throw exceptions
- // TODO: get the correct pass index!
- var technique = currentEffect.GetCurrentTechnique().NativeTechnique;
- var pass = technique.GetPassByIndex(0);
- var layout = CreateInputLayout(nativeDevice, pass.Description.Signature, vertexDeclaration);
-
- nativeDevice.InputAssembler.InputLayout = layout;
- // Prepare All the stages
- nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType);
-
- for (int i = 0; i < technique.Description.PassCount; ++i)
- {
- technique.GetPassByIndex(i).Apply();
- nativeDevice.Draw(vertexCount, vertexOffset);
- }
-
- nativeDevice.InputAssembler.InputLayout.Dispose();
- nativeDevice.InputAssembler.InputLayout = null;
- }
- }
-
- private Dx10.EffectTechnique SetupEffectForDraw()
- {
- //TODO: check for currentEffect null and throw exception
- // TODO: check for null's and throw exceptions
- // TODO: get the correct pass index!
- var technique = currentEffect.GetCurrentTechnique().NativeTechnique;
- var pass = technique.GetPassByIndex(0);
- SetupInputLayout(pass.Description.Signature);
-
- return technique;
- }
-
- #region SetupInputLayout
- private InputLayout SetupInputLayout(ShaderBytecode passSignature)
- {
- // get the VertexDeclaration from current VertexBuffer to create input layout for the input assembler
- var layout = CreateInputLayout(nativeDevice, passSignature, currentVertexBuffer);
-
- nativeDevice.InputAssembler.InputLayout = layout;
- return layout;
- }
- #endregion
-
- #region SetIndexBuffer
- public void SetIndexBuffer(IndexBuffer indexBuffer)
- {
- if (indexBuffer == null)
- throw new ArgumentNullException("indexBuffer");
-
- this.currentIndexBuffer = indexBuffer;
-
- DxIndexBuffer nativeIndexBuffer = indexBuffer.NativeIndexBuffer as DxIndexBuffer;
-
- if (nativeIndexBuffer != null)
- {
- nativeDevice.InputAssembler.SetIndexBuffer(nativeIndexBuffer.NativeBuffer, DxFormatConverter.Translate(indexBuffer.IndexElementSize), 0);
- }
- else
- {
- throw new Exception("couldn't fetch native DirectX10 IndexBuffer");
- }
- }
- #endregion
-
#region SetVertexBuffers
public void SetVertexBuffers(ANX.Framework.Graphics.VertexBufferBinding[] vertexBuffers)
{
if (vertexBuffers == null)
throw new ArgumentNullException("vertexBuffers");
+ if (this.currentVertexBuffer.SequenceEqual(vertexBuffers))
+ return;
+
this.currentVertexBufferCount = vertexBuffers.Length;
if (this.currentVertexBuffer == null || this.currentVertexBuffer.Length < currentVertexBufferCount)
@@ -347,67 +195,6 @@ namespace ANX.RenderSystem.Windows.DX10
{
nativeDevice.Rasterizer.SetViewports(viewports);
}
- #endregion
-
- #region CreateInputLayout
- ///
- /// This method creates a InputLayout which is needed by DirectX 10 for rendering primitives.
- /// The VertexDeclaration of ANX/XNA needs to be mapped to the DirectX 10 types.
- ///
- private Dx10.InputLayout CreateInputLayout(Dx10.Device device, ShaderBytecode passSignature, params VertexDeclaration[] vertexDeclaration)
- {
- if (device == null) throw new ArgumentNullException("device");
- if (passSignature == null) throw new ArgumentNullException("passSignature");
- if (vertexDeclaration == null) throw new ArgumentNullException("vertexDeclaration");
-
- //TODO: try to get rid of the list
- List inputElements = new List();
- foreach (VertexDeclaration decl in vertexDeclaration)
- {
- foreach (VertexElement vertexElement in decl.GetVertexElements())
- {
- inputElements.Add(CreateInputElementFromVertexElement(vertexElement, 0));
- }
- }
-
- return new Dx10.InputLayout(device, passSignature, inputElements.ToArray());
- }
-
- private Dx10.InputLayout CreateInputLayout(Dx10.Device device, ShaderBytecode passSignature, params ANX.Framework.Graphics.VertexBufferBinding[] vertexBufferBindings)
- {
- if (device == null) throw new ArgumentNullException("device");
- if (passSignature == null) throw new ArgumentNullException("passSignature");
- if (vertexBufferBindings == null) throw new ArgumentNullException("vertexBufferBindings");
-
- //TODO: try to get rid of the list
- List inputElements = new List();
- int slot = 0;
- foreach (ANX.Framework.Graphics.VertexBufferBinding binding in vertexBufferBindings)
- {
- foreach (VertexElement vertexElement in binding.VertexBuffer.VertexDeclaration.GetVertexElements())
- {
- inputElements.Add(CreateInputElementFromVertexElement(vertexElement, binding.InstanceFrequency, slot));
- }
- slot++;
- }
-
- // Layout from VertexShader input signature
- return new InputLayout(device, passSignature, inputElements.ToArray());
- }
- #endregion
-
- #region CreateInputElementFromVertexElement
- private InputElement CreateInputElementFromVertexElement(VertexElement vertexElement, int slot)
- {
- return CreateInputElementFromVertexElement(vertexElement, 0, slot);
- }
-
- private InputElement CreateInputElementFromVertexElement(VertexElement vertexElement, int instanceFrequency, int slot)
- {
- string elementName = DxFormatConverter.Translate(ref vertexElement);
- Format elementFormat = DxFormatConverter.ConvertVertexElementFormat(vertexElement.VertexElementFormat);
- return new InputElement(elementName, vertexElement.UsageIndex, elementFormat, vertexElement.Offset, slot, instanceFrequency == 0 ? InputClassification.PerVertexData : InputClassification.PerInstanceData, instanceFrequency);
- }
#endregion
#region SetRenderTargets
@@ -484,21 +271,6 @@ namespace ANX.RenderSystem.Windows.DX10
}
}
- #region Dispose
- public void Dispose()
- {
- if (swapChain != null)
- {
- DisposeBackBuffer();
-
- swapChain.Dispose();
- swapChain = null;
- }
-
- //TODO: dispose everything else
- }
- #endregion
-
internal Dx10.Device NativeDevice
{
get
diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/ANX.RenderSystem.Windows.DX11.csproj b/RenderSystems/ANX.RenderSystem.Windows.DX11/ANX.RenderSystem.Windows.DX11.csproj
index 9f76be20..2e81fc19 100644
--- a/RenderSystems/ANX.RenderSystem.Windows.DX11/ANX.RenderSystem.Windows.DX11.csproj
+++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/ANX.RenderSystem.Windows.DX11.csproj
@@ -73,6 +73,9 @@
BufferHelper.cs
+
+ InputLayoutManager.cs
+
ResourceMapping.cs
diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/Buffer.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/Buffer.cs
index 95c3ddb1..86e6ede2 100644
--- a/RenderSystems/ANX.RenderSystem.Windows.DX11/Buffer.cs
+++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/Buffer.cs
@@ -10,11 +10,32 @@ namespace ANX.RenderSystem.Windows.DX11
{
public abstract class Buffer : IDisposable
{
- public Dx.Buffer NativeBuffer { get; protected set; }
+ public Dx.Buffer NativeBuffer
+ {
+ get { return nativeBuffer; }
+ protected set
+ {
+ if (value != null)
+ SizeInBytes = value.Description.SizeInBytes;
+ else
+ SizeInBytes = 0;
+
+ nativeBuffer = value;
+ }
+ }
+
+ private Dx.Buffer nativeBuffer;
+
private Dx.Device device;
private BufferUsage usage;
private bool isDynamic;
+ public int SizeInBytes
+ {
+ get;
+ private set;
+ }
+
protected Buffer(Dx.Device device, BufferUsage usage, bool isDynamic)
{
this.device = device;
@@ -26,8 +47,14 @@ namespace ANX.RenderSystem.Windows.DX11
{
CheckUsage(mapping);
+ Dx.MapMode mapMode;
+ if (isDynamic && mapping == ResourceMapping.Write)
+ mapMode = Dx.MapMode.WriteDiscard;
+ else
+ mapMode = mapping.ToMapMode();
+
DataStream dataStream;
- device.ImmediateContext.MapSubresource(buffer, mapping.ToMapMode(), Dx.MapFlags.None, out dataStream);
+ device.ImmediateContext.MapSubresource(buffer, mapMode, Dx.MapFlags.None, out dataStream);
return dataStream;
}
diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectDX.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectDX.cs
index 53b13569..a45608dd 100644
--- a/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectDX.cs
+++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectDX.cs
@@ -86,13 +86,6 @@ namespace ANX.RenderSystem.Windows.DX11
}
#endregion
- #region Apply
- public void Apply(GraphicsDevice graphicsDevice)
- {
- ((GraphicsDeviceDX)graphicsDevice.NativeDevice).currentEffect = this;
- }
- #endregion
-
#region CompileFXShader
public static byte[] CompileFXShader(string effectCode, string directory = "")
{
diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectParameter_DX11.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectParameter_DX11.cs
index a6cd6aa0..d4eaecfa 100644
--- a/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectParameter_DX11.cs
+++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectParameter_DX11.cs
@@ -308,5 +308,23 @@ namespace ANX.RenderSystem.Windows.DX11
throw new NotImplementedException();
}
#endregion
+
+ public void Dispose()
+ {
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+
+ protected virtual void Dispose(bool disposeManaged)
+ {
+ if (disposeManaged)
+ {
+ if (NativeParameter != null)
+ {
+ NativeParameter.Dispose();
+ NativeParameter = null;
+ }
+ }
+ }
}
}
diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectPass_DX11.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectPass_DX11.cs
index b118236c..b8019cdd 100644
--- a/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectPass_DX11.cs
+++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectPass_DX11.cs
@@ -1,5 +1,6 @@
using ANX.Framework.NonXNA;
using SharpDX.Direct3D11;
+using System;
// This file is part of the ANX.Framework created by the
// "ANX.Framework developer group" and released under the Ms-PL license.
@@ -10,6 +11,7 @@ namespace ANX.RenderSystem.Windows.DX11
public class EffectPass_DX11 : INativeEffectPass
{
private EffectPass nativePass;
+ private Framework.Graphics.Effect parentEffect;
public string Name
{
@@ -19,9 +21,50 @@ namespace ANX.RenderSystem.Windows.DX11
}
}
- internal EffectPass_DX11(EffectPass setNativePass)
+ public SharpDX.D3DCompiler.ShaderBytecode Signature
+ {
+ get;
+ private set;
+ }
+
+ internal EffectPass_DX11(Framework.Graphics.Effect parentEffect, EffectPass setNativePass)
{
nativePass = setNativePass;
+ this.parentEffect = parentEffect;
+
+ this.Signature = nativePass.Description.Signature;
}
+
+ public Framework.Graphics.EffectAnnotationCollection Annotations
+ {
+ get { throw new System.NotImplementedException(); }
+ }
+
+ public void Apply()
+ {
+ var deviceContext = ((GraphicsDeviceDX)parentEffect.GraphicsDevice.NativeDevice).NativeDevice;
+
+ nativePass.Apply(deviceContext);
+ ((GraphicsDeviceDX)this.parentEffect.GraphicsDevice.NativeDevice).currentPass = this;
+ parentEffect.OnApply();
+ }
+
+ public void Dispose()
+ {
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+
+ protected virtual void Dispose(bool disposeManaged)
+ {
+ if (disposeManaged)
+ {
+ if (nativePass != null)
+ {
+ nativePass.Dispose();
+ nativePass = null;
+ }
+ }
+ }
}
}
diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectTechnique_DX11.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectTechnique_DX11.cs
index beb0f66a..1c6c77e9 100644
--- a/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectTechnique_DX11.cs
+++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/EffectTechnique_DX11.cs
@@ -45,9 +45,7 @@ namespace ANX.RenderSystem.Windows.DX11
{
for (int i = 0; i < NativeTechnique.Description.PassCount; i++)
{
- var passDx11 = new EffectPass_DX11(NativeTechnique.GetPassByIndex(i));
- // TODO: wire up native pass and managed pass?
- yield return new EffectPass(this.parentEffect);
+ yield return new EffectPass(new EffectPass_DX11(this.parentEffect, NativeTechnique.GetPassByIndex(i)));
}
}
}
@@ -56,5 +54,23 @@ namespace ANX.RenderSystem.Windows.DX11
{
get { throw new NotImplementedException(); }
}
+
+ public void Dispose()
+ {
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+
+ protected virtual void Dispose(bool disposeManaged)
+ {
+ if (disposeManaged)
+ {
+ if (NativeTechnique != null)
+ {
+ NativeTechnique.Dispose();
+ NativeTechnique = null;
+ }
+ }
+ }
}
}
diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/Extensions.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/Extensions.cs
index 4a302fee..08a6b447 100644
--- a/RenderSystems/ANX.RenderSystem.Windows.DX11/Extensions.cs
+++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/Extensions.cs
@@ -1,4 +1,5 @@
using SharpDX;
+using SharpDX.D3DCompiler;
using SharpDX.Direct3D11;
using System;
using System.Collections.Generic;
@@ -30,5 +31,15 @@ namespace ANX.RenderSystem.Windows.DX11
{
return new ResourceRegion(rect.Left, rect.Top, 0, rect.Right, rect.Bottom, 1);
}
+
+ public static ANX.Framework.Graphics.EffectParameterClass ToParameterClass(this ShaderVariableClass variableClass)
+ {
+ return DxFormatConverter.Translate(variableClass);
+ }
+
+ public static ANX.Framework.Graphics.EffectParameterType ToParameterType(this ShaderVariableType variableType)
+ {
+ return DxFormatConverter.Translate(variableType);
+ }
}
}
diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/GraphicsDeviceDX.cs b/RenderSystems/ANX.RenderSystem.Windows.DX11/GraphicsDeviceDX.cs
index 4e293159..d7929ce9 100644
--- a/RenderSystems/ANX.RenderSystem.Windows.DX11/GraphicsDeviceDX.cs
+++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/GraphicsDeviceDX.cs
@@ -27,14 +27,12 @@ namespace ANX.RenderSystem.Windows.DX11
static int graphicsDeviceCount = 0;
static int swapChainCount = 0;
#endif
- //Restricted to 8 from DirectX side.
- const int MAX_RENDER_TARGETS = 8;
private Dx11.DeviceContext nativeDevice;
- private Dx11.RenderTargetView[] renderTargetView = new RenderTargetView[MAX_RENDER_TARGETS];
- private Dx11.DepthStencilView[] depthStencilView = new DepthStencilView[MAX_RENDER_TARGETS];
+ private Dx11.RenderTargetView[] renderTargetView = new RenderTargetView[1];
+ private Dx11.DepthStencilView[] depthStencilView = new DepthStencilView[1];
private RenderTarget2D_DX11 backBuffer;
- internal EffectDX currentEffect;
+ internal EffectPass_DX11 currentPass;
#endregion
#region CreateDevice
@@ -50,7 +48,7 @@ namespace ANX.RenderSystem.Windows.DX11
OutputHandle = presentationParameters.DeviceWindowHandle,
SampleDescription = new SampleDescription(1, 0),
SwapEffect = SwapEffect.Discard,
- Usage = Usage.RenderTargetOutput
+ Usage = Usage.RenderTargetOutput | Usage.ShaderInput
};
// Create Device and SwapChain
@@ -63,12 +61,12 @@ namespace ANX.RenderSystem.Windows.DX11
#endif
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb205068(v=vs.85).aspx
Device.CreateWithSwapChain(DriverType.Hardware, flags, desc, out dxDevice, out swapChain);
+
+ nativeDevice = dxDevice.ImmediateContext;
#if DEBUG
nativeDevice.DebugName = "GraphicsDevice_" + graphicsDeviceCount++;
swapChain.DebugName = "SwapChain_" + swapChainCount++;
#endif
-
- nativeDevice = dxDevice.ImmediateContext;
}
#endregion
@@ -88,12 +86,9 @@ namespace ANX.RenderSystem.Windows.DX11
// Clear a RenderTarget (or BackBuffer)
var clearColor = new SharpDX.Color4(color.X, color.Y, color.Z, color.W);
- for (int i = 0; i < MAX_RENDER_TARGETS; i++)
+ foreach (var renderTargetView in this.renderTargetView)
{
- if (this.renderTargetView[i] == null)
- break;
-
- nativeDevice.ClearRenderTargetView(this.renderTargetView[i], clearColor);
+ nativeDevice.ClearRenderTargetView(renderTargetView, clearColor);
}
}
@@ -111,12 +106,9 @@ namespace ANX.RenderSystem.Windows.DX11
clearFlags = Dx11.DepthStencilClearFlags.Depth;
}
- for (int i = 0; i < MAX_RENDER_TARGETS; i++)
+ foreach (var depthStencilView in this.depthStencilView)
{
- if (this.depthStencilView[i] == null)
- break;
-
- nativeDevice.ClearDepthStencilView(this.depthStencilView[i], clearFlags, depth, (byte)stencil);
+ nativeDevice.ClearDepthStencilView(depthStencilView, clearFlags, depth, (byte)stencil);
}
}
@@ -127,212 +119,25 @@ namespace ANX.RenderSystem.Windows.DX11
{
swapChain.Present(VSync ? 1 : 0, PresentFlags.None);
}
+
+ public void Present(Rectangle? sourceRectangle, Rectangle? destinationRectangle, WindowHandle overrideWindowHandle)
+ {
+ throw new NotImplementedException();
+ }
#endregion
- #region DrawIndexedPrimitives
- public void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount, IndexBuffer indexBuffer)
- {
- if (primitiveCount <= 0) throw new ArgumentOutOfRangeException("primitiveCount is less than or equal to zero. When drawing, at least one primitive must be drawn.");
- if (this.currentVertexBuffer == null || this.currentVertexBufferCount <= 0) throw new InvalidOperationException("you have to set a valid vertex buffer before drawing.");
-
- Dx11.EffectTechnique technique = SetupEffectForDraw();
- int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount);
+ private void SetupDraw(PrimitiveType primitiveType)
+ {
+ var inputLayout = this.inputLayoutManager.GetInputLayout(NativeDevice.Device, currentPass.Signature, this.currentVertexBuffer);
nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType);
- //nativeDevice.Rasterizer.SetViewports(currentViewport);
- //nativeDevice.OutputMerger.SetTargets(this.depthStencilView, this.renderView);
-
- if (indexBuffer != null)
+ if (currentInputLayout != inputLayout)
{
- SetIndexBuffer(indexBuffer);
- }
-
- for (int i = 0; i < technique.Description.PassCount; ++i)
- {
- technique.GetPassByIndex(i).Apply(nativeDevice);
- nativeDevice.DrawIndexed(vertexCount, startIndex, baseVertex);
- }
-
- nativeDevice.InputAssembler.InputLayout.Dispose();
- nativeDevice.InputAssembler.InputLayout = null;
- }
- #endregion
-
- #region DrawPrimitives
- public void DrawPrimitives(PrimitiveType primitiveType, int vertexOffset, int primitiveCount)
- {
- Dx11.EffectPass pass; Dx11.EffectTechnique technique; ShaderBytecode passSignature;
- SetupEffectForDraw(out pass, out technique, out passSignature);
-
- var layout = SetupInputLayout(passSignature);
-
- // Prepare All the stages
- nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType);
- //nativeDevice.Rasterizer.SetViewports(currentViewport);
- //nativeDevice.OutputMerger.SetTargets(this.depthStencilView, this.renderView);
-
- for (int i = 0; i < technique.Description.PassCount; ++i)
- {
- pass.Apply(nativeDevice);
- nativeDevice.Draw(primitiveCount, vertexOffset);
- }
-
- layout.Dispose();
- layout = null;
- }
- #endregion
-
- #region DrawInstancedPrimitives
- public void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount, int instanceCount, IndexBuffer indexBuffer)
- {
- Dx11.EffectTechnique technique = SetupEffectForDraw();
- int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount);
-
- nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType);
- //nativeDevice.Rasterizer.SetViewports(currentViewport);
- //nativeDevice.OutputMerger.SetTargets(this.depthStencilView, this.renderView);
-
- if (indexBuffer != null)
- {
- SetIndexBuffer(indexBuffer);
- }
-
- for (int i = 0; i < technique.Description.PassCount; ++i)
- {
- technique.GetPassByIndex(i).Apply(nativeDevice);
- nativeDevice.DrawIndexedInstanced(vertexCount, instanceCount, startIndex, baseVertex, 0);
- }
-
- nativeDevice.InputAssembler.InputLayout.Dispose();
- nativeDevice.InputAssembler.InputLayout = null;
- }
-
- #endregion // DrawInstancedPrimitives
-
- #region DrawUserIndexedPrimitives
- public void DrawUserIndexedPrimitives(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int numVertices,
- Array indexData, int indexOffset, int primitiveCount, VertexDeclaration vertexDeclaration,
- IndexElementSize indexFormat) where T : struct, IVertexType
- {
- int vertexCount = vertexData.Length;
- int indexCount = indexData.Length;
-
- using (VertexBuffer vertexBuffer = new VertexBuffer(vertexDeclaration.GraphicsDevice, vertexDeclaration, vertexCount, BufferUsage.WriteOnly))
- using (IndexBuffer indexBuffer = new IndexBuffer(vertexDeclaration.GraphicsDevice, indexFormat, indexCount, BufferUsage.WriteOnly))
- {
- vertexBuffer.SetData(vertexData);
- this.SetVertexBuffers(new[] { new Framework.Graphics.VertexBufferBinding(vertexBuffer, vertexOffset) });
-
- if (indexData.GetType() == typeof(Int16[]))
- {
- indexBuffer.SetData((short[])indexData);
- }
- else
- {
- indexBuffer.SetData((int[])indexData);
- }
-
- DrawIndexedPrimitives(primitiveType, 0, vertexOffset, numVertices, indexOffset, primitiveCount, indexBuffer);
+ nativeDevice.InputAssembler.InputLayout = this.inputLayoutManager.GetInputLayout(NativeDevice.Device, currentPass.Signature, this.currentVertexBuffer);
+ currentInputLayout = inputLayout;
}
}
- #endregion // DrawUserIndexedPrimitives
-
- #region DrawUserPrimitives
- public void DrawUserPrimitives(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int primitiveCount, VertexDeclaration vertexDeclaration) where T : struct, IVertexType
- {
- int vertexCount = vertexData.Length;
- using (DxVertexBuffer vb11 = new DxVertexBuffer(this, vertexDeclaration, vertexCount, BufferUsage.WriteOnly, dynamic: true))
- {
- vb11.SetData(vertexData);
-
- Dx11.VertexBufferBinding nativeVertexBufferBindings = new Dx11.VertexBufferBinding(vb11.NativeBuffer, vertexDeclaration.VertexStride, 0);
-
- nativeDevice.InputAssembler.SetVertexBuffers(0, nativeVertexBufferBindings);
-
- Dx11.EffectPass pass; Dx11.EffectTechnique technique; ShaderBytecode passSignature;
- SetupEffectForDraw(out pass, out technique, out passSignature);
-
- var layout = CreateInputLayout(nativeDevice.Device, passSignature, vertexDeclaration);
-
- nativeDevice.InputAssembler.InputLayout = layout;
- // Prepare All the stages
- nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType);
- //nativeDevice.Rasterizer.SetViewports(currentViewport);
- //device.OutputMerger.SetTargets(this.depthStencilView, this.renderView);
-
- for (int i = 0; i < technique.Description.PassCount; ++i)
- {
- pass.Apply(nativeDevice);
- nativeDevice.Draw(primitiveCount, vertexOffset);
- }
-
- layout.Dispose();
- layout = null;
- }
- }
-
- #endregion // DrawUserPrimitives
-
- #region SetupEffectForDraw
- private void SetupEffectForDraw(out Dx11.EffectPass pass, out Dx11.EffectTechnique technique,
- out ShaderBytecode passSignature)
- {
- // get the current effect
- //TODO: check for null and throw exception
- EffectDX effect = this.currentEffect;
-
- // get the input semantic of the current effect / technique that is used
- //TODO: check for null's and throw exceptions
- // TODO: get the correct pass index!
- technique = effect.GetCurrentTechnique().NativeTechnique;
- pass = technique.GetPassByIndex(0);
- passSignature = pass.Description.Signature;
- }
-
- private Dx11.EffectTechnique SetupEffectForDraw()
- {
- //TODO: check for currentEffect null and throw exception
- // TODO: check for null's and throw exceptions
- // TODO: get the correct pass index!
- var technique = currentEffect.GetCurrentTechnique().NativeTechnique;
- var pass = technique.GetPassByIndex(0);
- SetupInputLayout(pass.Description.Signature);
-
- return technique;
- }
- #endregion
-
- #region SetupInputLayout
- private InputLayout SetupInputLayout(ShaderBytecode passSignature)
- {
- // get the VertexDeclaration from current VertexBuffer to create input layout for the input assembler
- var layout = CreateInputLayout(nativeDevice.Device, passSignature, currentVertexBuffer);
-
- nativeDevice.InputAssembler.InputLayout = layout;
- return layout;
- }
- #endregion
-
- #region SetIndexBuffer
- public void SetIndexBuffer(IndexBuffer indexBuffer)
- {
- if (indexBuffer == null)
- throw new ArgumentNullException("indexBuffer");
-
- this.currentIndexBuffer = indexBuffer;
- DxIndexBuffer nativeIndexBuffer = indexBuffer.NativeIndexBuffer as DxIndexBuffer;
-
- if (nativeIndexBuffer != null)
- {
- nativeDevice.InputAssembler.SetIndexBuffer(nativeIndexBuffer.NativeBuffer,
- DxFormatConverter.Translate(indexBuffer.IndexElementSize), 0);
- }
- else
- throw new Exception("couldn't fetch native DirectX10 IndexBuffer");
- }
- #endregion
-
#region SetVertexBuffers
public void SetVertexBuffers(ANX.Framework.Graphics.VertexBufferBinding[] vertexBuffers)
{
@@ -384,49 +189,6 @@ namespace ANX.RenderSystem.Windows.DX11
}
#endregion
- #region CreateInputLayout
- private InputLayout CreateInputLayout(Device device, ShaderBytecode passSignature, params VertexDeclaration[] vertexDeclaration)
- {
- if (device == null) throw new ArgumentNullException("device");
- if (passSignature == null) throw new ArgumentNullException("passSignature");
- if (vertexDeclaration == null) throw new ArgumentNullException("vertexDeclaration");
-
- //TODO: try to get rid of the list
- List inputElements = new List();
- foreach (VertexDeclaration decl in vertexDeclaration)
- {
- foreach (VertexElement vertexElement in decl.GetVertexElements())
- {
- inputElements.Add(CreateInputElementFromVertexElement(vertexElement, 0));
- }
- }
-
- return new InputLayout(device, passSignature, inputElements.ToArray());
- }
-
- private InputLayout CreateInputLayout(Device device, ShaderBytecode passSignature, params ANX.Framework.Graphics.VertexBufferBinding[] vertexBufferBindings)
- {
- if (device == null) throw new ArgumentNullException("device");
- if (passSignature == null) throw new ArgumentNullException("passSignature");
- if (vertexBufferBindings == null) throw new ArgumentNullException("vertexBufferBindings");
-
- //TODO: try to get rid of the list
- List inputElements = new List();
- int slot = 0;
- foreach (ANX.Framework.Graphics.VertexBufferBinding binding in vertexBufferBindings)
- {
- foreach (VertexElement vertexElement in binding.VertexBuffer.VertexDeclaration.GetVertexElements())
- {
- inputElements.Add(CreateInputElementFromVertexElement(vertexElement, binding.InstanceFrequency, slot));
- }
- slot++;
- }
-
- // Layout from VertexShader input signature
- return new InputLayout(device, passSignature, inputElements.ToArray());
- }
- #endregion
-
#region CreateInputElementFromVertexElement
private InputElement CreateInputElementFromVertexElement(VertexElement vertexElement, int slot)
{
@@ -446,27 +208,21 @@ namespace ANX.RenderSystem.Windows.DX11
{
if (renderTargets == null || renderTargets.Length == 0)
{
- this.renderTargetView[0] = this.backBuffer.RenderTargetView;
- this.depthStencilView[0] = this.backBuffer.DepthStencilView;
-
- for (int i = 1; i < MAX_RENDER_TARGETS; i++)
- {
- this.renderTargetView[i] = null;
- this.depthStencilView[i] = null;
- }
+ this.renderTargetView = new RenderTargetView[] { this.backBuffer.RenderTargetView };
+ this.depthStencilView = new DepthStencilView[] { this.backBuffer.DepthStencilView };
+ nativeDevice.OutputMerger.ResetTargets();
//To correctly unset renderTargets, the amount of given rendertargetViews must be max(#previousRenderTargets, #newRenderTargets),
//otherwise the old ones at the slots stay bound. For us it means, we try to unbind every possible previous slot.
- nativeDevice.OutputMerger.SetRenderTargets(this.backBuffer.DepthStencilView, this.renderTargetView);
+ nativeDevice.OutputMerger.SetRenderTargets(this.backBuffer.DepthStencilView, this.backBuffer.RenderTargetView);
nativeDevice.Rasterizer.SetViewport(new SharpDX.ViewportF(0, 0, this.backBuffer.Width, this.backBuffer.Height));
}
else
{
int renderTargetCount = renderTargets.Length;
- if (renderTargetCount > MAX_RENDER_TARGETS)
- throw new NotSupportedException(string.Format("{0} render targets are not supported. The maximum is {1}.", renderTargetCount, MAX_RENDER_TARGETS));
-
var rtViewports = new SharpDX.ViewportF[renderTargetCount];
+ this.renderTargetView = new RenderTargetView[renderTargetCount];
+ this.depthStencilView = new DepthStencilView[renderTargetCount];
var firstRenderTarget = renderTargets[0].RenderTarget as RenderTarget2D;
for (int i = 1; i < renderTargetCount; i++)
@@ -481,16 +237,12 @@ namespace ANX.RenderSystem.Windows.DX11
RenderTarget2D renderTarget = renderTargets[i].RenderTarget as RenderTarget2D;
var nativeRenderTarget = renderTarget.NativeRenderTarget as RenderTarget2D_DX11;
- renderTargetView[i] = nativeRenderTarget.RenderTargetView;
- depthStencilView[i] = nativeRenderTarget.DepthStencilView;
+ this.renderTargetView[i] = nativeRenderTarget.RenderTargetView;
+ this.depthStencilView[i] = nativeRenderTarget.DepthStencilView;
rtViewports[i] = new SharpDX.ViewportF(0, 0, renderTarget.Width, renderTarget.Height);
}
- for (int i = renderTargetCount; i < MAX_RENDER_TARGETS; i++)
- {
- this.renderTargetView[i] = null;
- this.depthStencilView[i] = null;
- }
+ nativeDevice.OutputMerger.ResetTargets();
nativeDevice.OutputMerger.SetRenderTargets(this.depthStencilView[0], renderTargetView);
nativeDevice.Rasterizer.SetViewports(rtViewports);
@@ -502,34 +254,13 @@ namespace ANX.RenderSystem.Windows.DX11
{
if (backBuffer != null)
{
- for (int i = 0; i < MAX_RENDER_TARGETS; i++)
- {
- this.renderTargetView[i] = null;
- this.depthStencilView[i] = null;
- }
-
- nativeDevice.OutputMerger.SetRenderTargets(null, this.renderTargetView);
+ nativeDevice.OutputMerger.ResetTargets();
backBuffer.Dispose();
backBuffer = null;
}
}
- #region Dispose
- public void Dispose()
- {
- if (swapChain != null)
- {
- DisposeBackBuffer();
-
- swapChain.Dispose();
- swapChain = null;
- }
-
- //TODO: dispose everything else
- }
- #endregion
-
internal DeviceContext NativeDevice
{
get
diff --git a/Samples/SampleContent/SampleContent.cproj b/Samples/SampleContent/SampleContent.cproj
index e200e983..5fe7c43f 100644
--- a/Samples/SampleContent/SampleContent.cproj
+++ b/Samples/SampleContent/SampleContent.cproj
@@ -104,7 +104,6 @@
..\..\bin\Debug\ANX.InputSystem.Standard.dll
..\..\bin\Debug\ANX.PlatformSystem.Windows.dll
..\..\bin\Debug\ANX.RenderSystem.Windows.DX10.dll
- ..\..\bin\Debug\ANX.RenderSystem.Windows.DX11.dll
..\..\bin\Debug\AssimpNet.dll
diff --git a/Samples/StencilBuffer.sln b/Samples/StencilBuffer.sln
index fab78b4d..3ad84395 100644
--- a/Samples/StencilBuffer.sln
+++ b/Samples/StencilBuffer.sln
@@ -1,58 +1,199 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2012
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleContent", "SampleContent\SampleContent.contentproj", "{FA6E229D-4504-47B1-8A23-2D3FCC13F778}"
-EndProject
+# Visual Studio 2013
+VisualStudioVersion = 12.0.40629.0
+MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StencilBuffer", "StencilBuffer\StencilBuffer.csproj", "{41E6C2CF-51EA-4D8E-96AE-739CA3951766}"
+ ProjectSection(ProjectDependencies) = postProject
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C} = {75EFAE60-726E-430F-8661-4CF9ABD1306C}
+ EndProjectSection
+EndProject
+Project("{75EFAE60-726E-430F-8661-4CF9ABD1306C}") = "SampleContent", "SampleContent\SampleContent.cproj", "{75EFAE60-726E-430F-8661-4CF9ABD1306C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
+ Debug|Android = Debug|Android
+ Debug|iOS = Debug|iOS
+ Debug|Linux = Debug|Linux
+ Debug|Mac OS = Debug|Mac OS
Debug|Mixed Platforms = Debug|Mixed Platforms
+ Debug|PS Vita = Debug|PS Vita
+ Debug|Windows = Debug|Windows
+ Debug|Windows Metro = Debug|Windows Metro
+ Debug|Windows Phone = Debug|Windows Phone
Debug|x86 = Debug|x86
- DebugWin8|Any CPU = DebugWin8|Any CPU
+ Debug|XBox 360 = Debug|XBox 360
+ DebugWin8|Android = DebugWin8|Android
+ DebugWin8|iOS = DebugWin8|iOS
+ DebugWin8|Linux = DebugWin8|Linux
+ DebugWin8|Mac OS = DebugWin8|Mac OS
DebugWin8|Mixed Platforms = DebugWin8|Mixed Platforms
+ DebugWin8|PS Vita = DebugWin8|PS Vita
+ DebugWin8|Windows = DebugWin8|Windows
+ DebugWin8|Windows Metro = DebugWin8|Windows Metro
+ DebugWin8|Windows Phone = DebugWin8|Windows Phone
DebugWin8|x86 = DebugWin8|x86
- Release|Any CPU = Release|Any CPU
+ DebugWin8|XBox 360 = DebugWin8|XBox 360
+ Release|Android = Release|Android
+ Release|iOS = Release|iOS
+ Release|Linux = Release|Linux
+ Release|Mac OS = Release|Mac OS
Release|Mixed Platforms = Release|Mixed Platforms
+ Release|PS Vita = Release|PS Vita
+ Release|Windows = Release|Windows
+ Release|Windows Metro = Release|Windows Metro
+ Release|Windows Phone = Release|Windows Phone
Release|x86 = Release|x86
- ReleaseWin8|Any CPU = ReleaseWin8|Any CPU
+ Release|XBox 360 = Release|XBox 360
+ ReleaseWin8|Android = ReleaseWin8|Android
+ ReleaseWin8|iOS = ReleaseWin8|iOS
+ ReleaseWin8|Linux = ReleaseWin8|Linux
+ ReleaseWin8|Mac OS = ReleaseWin8|Mac OS
ReleaseWin8|Mixed Platforms = ReleaseWin8|Mixed Platforms
+ ReleaseWin8|PS Vita = ReleaseWin8|PS Vita
+ ReleaseWin8|Windows = ReleaseWin8|Windows
+ ReleaseWin8|Windows Metro = ReleaseWin8|Windows Metro
+ ReleaseWin8|Windows Phone = ReleaseWin8|Windows Phone
ReleaseWin8|x86 = ReleaseWin8|x86
+ ReleaseWin8|XBox 360 = ReleaseWin8|XBox 360
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.Debug|x86.ActiveCfg = Debug|Any CPU
- {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.DebugWin8|Any CPU.ActiveCfg = Debug|Any CPU
- {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.DebugWin8|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.DebugWin8|x86.ActiveCfg = Debug|Any CPU
- {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.Release|Any CPU.ActiveCfg = Debug|Any CPU
- {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.Release|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.Release|x86.ActiveCfg = Debug|Any CPU
- {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.ReleaseWin8|Any CPU.ActiveCfg = Debug|Any CPU
- {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.ReleaseWin8|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {FA6E229D-4504-47B1-8A23-2D3FCC13F778}.ReleaseWin8|x86.ActiveCfg = Debug|Any CPU
- {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|Android.ActiveCfg = Debug|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|iOS.ActiveCfg = Debug|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|Linux.ActiveCfg = Debug|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|Mac OS.ActiveCfg = Debug|x86
{41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
{41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|Mixed Platforms.Build.0 = Debug|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|PS Vita.ActiveCfg = Debug|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|Windows.ActiveCfg = Debug|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|Windows Metro.ActiveCfg = Debug|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|Windows Phone.ActiveCfg = Debug|x86
{41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|x86.ActiveCfg = Debug|x86
{41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|x86.Build.0 = Debug|x86
- {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|Any CPU.ActiveCfg = DebugWin8|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Debug|XBox 360.ActiveCfg = Debug|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|Android.ActiveCfg = DebugWin8|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|iOS.ActiveCfg = DebugWin8|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|Linux.ActiveCfg = DebugWin8|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|Mac OS.ActiveCfg = DebugWin8|x86
{41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|Mixed Platforms.ActiveCfg = DebugWin8|x86
{41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|Mixed Platforms.Build.0 = DebugWin8|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|PS Vita.ActiveCfg = DebugWin8|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|Windows.ActiveCfg = DebugWin8|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|Windows Metro.ActiveCfg = DebugWin8|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|Windows Phone.ActiveCfg = DebugWin8|x86
{41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|x86.ActiveCfg = DebugWin8|x86
{41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|x86.Build.0 = DebugWin8|x86
- {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|Any CPU.ActiveCfg = Release|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.DebugWin8|XBox 360.ActiveCfg = DebugWin8|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|Android.ActiveCfg = Release|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|iOS.ActiveCfg = Release|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|Linux.ActiveCfg = Release|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|Mac OS.ActiveCfg = Release|x86
{41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|Mixed Platforms.ActiveCfg = Release|x86
{41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|Mixed Platforms.Build.0 = Release|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|PS Vita.ActiveCfg = Release|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|Windows.ActiveCfg = Release|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|Windows Metro.ActiveCfg = Release|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|Windows Phone.ActiveCfg = Release|x86
{41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|x86.ActiveCfg = Release|x86
{41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|x86.Build.0 = Release|x86
- {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|Any CPU.ActiveCfg = ReleaseWin8|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.Release|XBox 360.ActiveCfg = Release|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|Android.ActiveCfg = ReleaseWin8|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|iOS.ActiveCfg = ReleaseWin8|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|Linux.ActiveCfg = ReleaseWin8|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|Mac OS.ActiveCfg = ReleaseWin8|x86
{41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|Mixed Platforms.ActiveCfg = ReleaseWin8|x86
{41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|Mixed Platforms.Build.0 = ReleaseWin8|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|PS Vita.ActiveCfg = ReleaseWin8|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|Windows.ActiveCfg = ReleaseWin8|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|Windows Metro.ActiveCfg = ReleaseWin8|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|Windows Phone.ActiveCfg = ReleaseWin8|x86
{41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|x86.ActiveCfg = ReleaseWin8|x86
{41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|x86.Build.0 = ReleaseWin8|x86
+ {41E6C2CF-51EA-4D8E-96AE-739CA3951766}.ReleaseWin8|XBox 360.ActiveCfg = ReleaseWin8|x86
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Android.ActiveCfg = Debug|Android
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Android.Build.0 = Debug|Android
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|iOS.ActiveCfg = Debug|iOS
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|iOS.Build.0 = Debug|iOS
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Linux.ActiveCfg = Debug|Linux
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Linux.Build.0 = Debug|Linux
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Mac OS.ActiveCfg = Debug|Mac OS
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Mac OS.Build.0 = Debug|Mac OS
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Mixed Platforms.ActiveCfg = Debug|XBox 360
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Mixed Platforms.Build.0 = Debug|XBox 360
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|PS Vita.ActiveCfg = Debug|PS Vita
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|PS Vita.Build.0 = Debug|PS Vita
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Windows.ActiveCfg = Debug|Windows
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Windows.Build.0 = Debug|Windows
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Windows Metro.ActiveCfg = Debug|Windows Metro
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Windows Metro.Build.0 = Debug|Windows Metro
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Windows Phone.ActiveCfg = Debug|Windows Phone
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|Windows Phone.Build.0 = Debug|Windows Phone
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|x86.ActiveCfg = Debug|XBox 360
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|XBox 360.ActiveCfg = Debug|XBox 360
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Debug|XBox 360.Build.0 = Debug|XBox 360
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Android.ActiveCfg = Debug|Android
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Android.Build.0 = Debug|Android
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|iOS.ActiveCfg = Debug|iOS
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|iOS.Build.0 = Debug|iOS
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Linux.ActiveCfg = Debug|Linux
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Linux.Build.0 = Debug|Linux
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Mac OS.ActiveCfg = Debug|Mac OS
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Mac OS.Build.0 = Debug|Mac OS
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Mixed Platforms.ActiveCfg = Debug|XBox 360
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Mixed Platforms.Build.0 = Debug|XBox 360
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|PS Vita.ActiveCfg = Debug|PS Vita
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|PS Vita.Build.0 = Debug|PS Vita
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Windows.ActiveCfg = Debug|Windows
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Windows.Build.0 = Debug|Windows
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Windows Metro.ActiveCfg = Debug|Windows Metro
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Windows Metro.Build.0 = Debug|Windows Metro
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Windows Phone.ActiveCfg = Debug|Windows Phone
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|Windows Phone.Build.0 = Debug|Windows Phone
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|x86.ActiveCfg = Debug|XBox 360
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|XBox 360.ActiveCfg = Debug|XBox 360
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.DebugWin8|XBox 360.Build.0 = Debug|XBox 360
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Android.ActiveCfg = Release|Android
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Android.Build.0 = Release|Android
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|iOS.ActiveCfg = Release|iOS
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|iOS.Build.0 = Release|iOS
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Linux.ActiveCfg = Release|Linux
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Linux.Build.0 = Release|Linux
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Mac OS.ActiveCfg = Release|Mac OS
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Mac OS.Build.0 = Release|Mac OS
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Mixed Platforms.ActiveCfg = Release|XBox 360
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Mixed Platforms.Build.0 = Release|XBox 360
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|PS Vita.ActiveCfg = Release|PS Vita
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|PS Vita.Build.0 = Release|PS Vita
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Windows.ActiveCfg = Release|Windows
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Windows.Build.0 = Release|Windows
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Windows Metro.ActiveCfg = Release|Windows Metro
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Windows Metro.Build.0 = Release|Windows Metro
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Windows Phone.ActiveCfg = Release|Windows Phone
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|Windows Phone.Build.0 = Release|Windows Phone
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|x86.ActiveCfg = Release|XBox 360
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|XBox 360.ActiveCfg = Release|XBox 360
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.Release|XBox 360.Build.0 = Release|XBox 360
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Android.ActiveCfg = Release|Android
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Android.Build.0 = Release|Android
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|iOS.ActiveCfg = Release|iOS
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|iOS.Build.0 = Release|iOS
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Linux.ActiveCfg = Release|Linux
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Linux.Build.0 = Release|Linux
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Mac OS.ActiveCfg = Release|Mac OS
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Mac OS.Build.0 = Release|Mac OS
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Mixed Platforms.ActiveCfg = Release|XBox 360
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Mixed Platforms.Build.0 = Release|XBox 360
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|PS Vita.ActiveCfg = Release|PS Vita
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|PS Vita.Build.0 = Release|PS Vita
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Windows.ActiveCfg = Release|Windows
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Windows.Build.0 = Release|Windows
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Windows Metro.ActiveCfg = Release|Windows Metro
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Windows Metro.Build.0 = Release|Windows Metro
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Windows Phone.ActiveCfg = Release|Windows Phone
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|Windows Phone.Build.0 = Release|Windows Phone
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|x86.ActiveCfg = Release|XBox 360
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|XBox 360.ActiveCfg = Release|XBox 360
+ {75EFAE60-726E-430F-8661-4CF9ABD1306C}.ReleaseWin8|XBox 360.Build.0 = Release|XBox 360
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/Samples/StencilBuffer/StencilBuffer.csproj b/Samples/StencilBuffer/StencilBuffer.csproj
index 7fd02e52..5a075190 100644
--- a/Samples/StencilBuffer/StencilBuffer.csproj
+++ b/Samples/StencilBuffer/StencilBuffer.csproj
@@ -1,8 +1,8 @@
+
{41E6C2CF-51EA-4D8E-96AE-739CA3951766}
- {6D335F3A-9D43-41b4-9D22-F6F17C4BE596};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
Debug
x86
WinExe
@@ -11,28 +11,10 @@
StencilBuffer
v4.0
Client
- v4.0
- Windows
- HiDef
- 8d206378-4698-42f2-a96f-90f1ce3daa81
- Game
anx.ico
- GameThumbnail.png
- publish\
- true
- Disk
- false
- Foreground
- 7
- Days
- false
- false
true
0
1.0.0.%2a
- false
- false
- true
true
@@ -45,7 +27,6 @@
true
false
x86
- false
pdbonly
@@ -57,7 +38,6 @@
true
false
x86
- true
bin\x86\DebugWin8\
@@ -79,7 +59,13 @@
;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules
true
+
+ Always
+
+
+ ..\..\bin\Debug\ANX.RenderSystem.Windows.DX11.dll
+
False
@@ -105,6 +91,14 @@
+
+ sharpdx_direct3d11_effects_x64.dll
+ PreserveNewest
+
+
+ sharpdx_direct3d11_effects_x86.dll
+ PreserveNewest
+
@@ -124,50 +118,28 @@
.NET Framework 3.5 SP1
false
-
- False
- Windows Installer 3.1
- true
-
-
- False
- Microsoft XNA Framework Redistributable 4.0
- true
-
-
- {6899F0C9-70B9-4EB0-9DD3-E598D4BE3E35}
- ANX.Framework
-
-
- {60D08399-244F-46A3-91F1-4CFD26D961A3}
- ANX.InputDevices.Windows.XInput
-
-
- {49066074-3B7B-4A55-B122-6BD33AB73558}
- ANX.InputSystem.Standard
-
-
- {068EB2E9-963C-4E1B-8831-E25011F11FFE}
- ANX.PlatformSystem.Windows
-
-
- {5BE49183-2F6F-4527-AC90-D816911FCF90}
- ANX.RenderSystem.Windows.DX10
-
-
- {6A582788-C4D2-410C-96CD-177F75712D65}
- ANX.SoundSystem.Windows.XAudio
-
-
- {FA6E229D-4504-47B1-8A23-2D3FCC13F778}
- SampleContent
- Content
-
+
+ ..\..\bin\Debug\ANX.Framework.dll
+
+
+ ..\..\bin\Debug\ANX.InputDevices.Windows.XInput.dll
+
+
+ ..\..\bin\Debug\ANX.InputSystem.Standard.dll
+
+
+ ..\..\bin\Debug\ANX.PlatformSystem.Windows.dll
+
+
+ ..\..\bin\Debug\ANX.SoundSystem.Windows.XAudio.dll
+
-
+
+ xcopy $(ProjectDir)..\SampleContent\bin\$(ConfigurationName) $(TargetDir)SampleContent\ /D /E /Y
+