forked from MoonsideGames/MoonWorks
Compare commits
5 Commits
230c1b41b4
...
807deb2c33
Author | SHA1 | Date |
---|---|---|
Caleb Cornett | 807deb2c33 | |
cosmonaut | c43df10c2a | |
cosmonaut | 95981f0f03 | |
cosmonaut | 703b694bf6 | |
cosmonaut | fe561b61ef |
|
@ -1,9 +1,10 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>net6.0;net7.0</TargetFrameworks>
|
<TargetFrameworks>net7.0</TargetFrameworks>
|
||||||
<Platforms>x64</Platforms>
|
<Platforms>x64</Platforms>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<LangVersion>11</LangVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 6567310793f90e24438ae8682492c660207275af
|
Subproject commit 11ba6b37509a6c2fa2690f2643ee7bf5ce2ab4f2
|
|
@ -1 +1 @@
|
||||||
Subproject commit 9068263afcf5743ac8f2c023eb68610523feb905
|
Subproject commit 1643061386177f62b516ccaad0ea04607cae2333
|
|
@ -1 +1 @@
|
||||||
Subproject commit eb2178f6d042038463fb18bd756576cd5152003e
|
Subproject commit f8c6fc407fbb22072fdafcda918aec52b2102519
|
|
@ -0,0 +1,7 @@
|
||||||
|
namespace MoonWorks.Graphics
|
||||||
|
{
|
||||||
|
public interface IVertexType
|
||||||
|
{
|
||||||
|
static abstract VertexElementFormat[] Formats { get; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -127,12 +127,11 @@ namespace MoonWorks.Graphics
|
||||||
public uint Stride;
|
public uint Stride;
|
||||||
public VertexInputRate InputRate;
|
public VertexInputRate InputRate;
|
||||||
|
|
||||||
// Shortcut for the common case of having a single vertex binding.
|
public static VertexBinding Create<T>(uint binding = 0) where T : unmanaged
|
||||||
public unsafe static VertexBinding Create<T>() where T : unmanaged
|
|
||||||
{
|
{
|
||||||
return new VertexBinding
|
return new VertexBinding
|
||||||
{
|
{
|
||||||
Binding = 0,
|
Binding = binding,
|
||||||
InputRate = VertexInputRate.Vertex,
|
InputRate = VertexInputRate.Vertex,
|
||||||
Stride = (uint) Marshal.SizeOf<T>()
|
Stride = (uint) Marshal.SizeOf<T>()
|
||||||
};
|
};
|
||||||
|
@ -146,28 +145,6 @@ namespace MoonWorks.Graphics
|
||||||
public uint Binding;
|
public uint Binding;
|
||||||
public VertexElementFormat Format;
|
public VertexElementFormat Format;
|
||||||
public uint Offset;
|
public uint Offset;
|
||||||
|
|
||||||
public static VertexAttribute Create<T>(
|
|
||||||
string fieldName,
|
|
||||||
uint location,
|
|
||||||
uint binding = 0
|
|
||||||
)
|
|
||||||
{
|
|
||||||
var fieldInfo = typeof(T).GetField(fieldName);
|
|
||||||
|
|
||||||
if (fieldInfo == null)
|
|
||||||
{
|
|
||||||
throw new System.ArgumentException("Field not recognized!");
|
|
||||||
}
|
|
||||||
|
|
||||||
return new VertexAttribute
|
|
||||||
{
|
|
||||||
Binding = binding,
|
|
||||||
Location = location,
|
|
||||||
Format = Conversions.TypeToVertexElementFormat(fieldInfo.FieldType),
|
|
||||||
Offset = (uint) Marshal.OffsetOf<T>(fieldName)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
|
|
@ -272,14 +272,12 @@ namespace MoonWorks.Graphics
|
||||||
const uint DDS_MAGIC = 0x20534444;
|
const uint DDS_MAGIC = 0x20534444;
|
||||||
const uint DDS_HEADERSIZE = 124;
|
const uint DDS_HEADERSIZE = 124;
|
||||||
const uint DDS_PIXFMTSIZE = 32;
|
const uint DDS_PIXFMTSIZE = 32;
|
||||||
const uint DDSD_CAPS = 0x1;
|
|
||||||
const uint DDSD_HEIGHT = 0x2;
|
const uint DDSD_HEIGHT = 0x2;
|
||||||
const uint DDSD_WIDTH = 0x4;
|
const uint DDSD_WIDTH = 0x4;
|
||||||
const uint DDSD_PITCH = 0x8;
|
const uint DDSD_PITCH = 0x8;
|
||||||
const uint DDSD_FMT = 0x1000;
|
|
||||||
const uint DDSD_LINEARSIZE = 0x80000;
|
const uint DDSD_LINEARSIZE = 0x80000;
|
||||||
const uint DDSD_REQ = (
|
const uint DDSD_REQ = (
|
||||||
DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_FMT
|
DDSD_HEIGHT | DDSD_WIDTH
|
||||||
);
|
);
|
||||||
const uint DDSCAPS_MIPMAP = 0x400000;
|
const uint DDSCAPS_MIPMAP = 0x400000;
|
||||||
const uint DDSCAPS_TEXTURE = 0x1000;
|
const uint DDSCAPS_TEXTURE = 0x1000;
|
||||||
|
|
|
@ -10,16 +10,61 @@
|
||||||
|
|
||||||
public static readonly VertexInputState Empty = new VertexInputState
|
public static readonly VertexInputState Empty = new VertexInputState
|
||||||
{
|
{
|
||||||
VertexBindings = new VertexBinding[0],
|
VertexBindings = System.Array.Empty<VertexBinding>(),
|
||||||
VertexAttributes = new VertexAttribute[0]
|
VertexAttributes = System.Array.Empty<VertexAttribute>()
|
||||||
};
|
};
|
||||||
|
|
||||||
public VertexInputState(
|
public VertexInputState(
|
||||||
VertexBinding vertexBinding,
|
VertexBinding vertexBinding,
|
||||||
params VertexAttribute[] vertexAttributes
|
VertexAttribute[] vertexAttributes
|
||||||
) {
|
) {
|
||||||
VertexBindings = new VertexBinding[] { vertexBinding };
|
VertexBindings = new VertexBinding[] { vertexBinding };
|
||||||
VertexAttributes = vertexAttributes;
|
VertexAttributes = vertexAttributes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public VertexInputState(
|
||||||
|
VertexBinding[] vertexBindings,
|
||||||
|
VertexAttribute[] vertexAttributes
|
||||||
|
) {
|
||||||
|
VertexBindings = vertexBindings;
|
||||||
|
VertexAttributes = vertexAttributes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public VertexInputState(
|
||||||
|
VertexBindingAndAttributes bindingAndAttributes
|
||||||
|
) {
|
||||||
|
VertexBindings = new VertexBinding[] { bindingAndAttributes.VertexBinding };
|
||||||
|
VertexAttributes = bindingAndAttributes.VertexAttributes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public VertexInputState(
|
||||||
|
VertexBindingAndAttributes[] bindingAndAttributesArray
|
||||||
|
) {
|
||||||
|
VertexBindings = new VertexBinding[bindingAndAttributesArray.Length];
|
||||||
|
var attributesLength = 0;
|
||||||
|
|
||||||
|
for (var i = 0; i < bindingAndAttributesArray.Length; i += 1)
|
||||||
|
{
|
||||||
|
VertexBindings[i] = bindingAndAttributesArray[i].VertexBinding;
|
||||||
|
attributesLength += bindingAndAttributesArray[i].VertexAttributes.Length;
|
||||||
|
}
|
||||||
|
|
||||||
|
VertexAttributes = new VertexAttribute[attributesLength];
|
||||||
|
|
||||||
|
var attributeIndex = 0;
|
||||||
|
for (var i = 0; i < bindingAndAttributesArray.Length; i += 1)
|
||||||
|
{
|
||||||
|
for (var j = 0; j < bindingAndAttributesArray[i].VertexAttributes.Length; j += 1)
|
||||||
|
{
|
||||||
|
VertexAttributes[attributeIndex] = bindingAndAttributesArray[i].VertexAttributes[j];
|
||||||
|
attributeIndex += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static VertexInputState CreateSingleBinding<T>() where T : unmanaged, IVertexType
|
||||||
|
{
|
||||||
|
return new VertexInputState(VertexBindingAndAttributes.Create<T>(0));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,28 @@
|
||||||
namespace MoonWorks
|
using System.Collections.Generic;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using MoonWorks.Graphics;
|
||||||
|
|
||||||
|
namespace MoonWorks
|
||||||
{
|
{
|
||||||
public static class Conversions
|
public static class Conversions
|
||||||
{
|
{
|
||||||
|
private readonly static Dictionary<VertexElementFormat, uint> Sizes = new Dictionary<VertexElementFormat, uint>
|
||||||
|
{
|
||||||
|
{ VertexElementFormat.Byte4, (uint) Marshal.SizeOf<Byte4>() },
|
||||||
|
{ VertexElementFormat.Color, (uint) Marshal.SizeOf<Color>() },
|
||||||
|
{ VertexElementFormat.Float, (uint) Marshal.SizeOf<float>() },
|
||||||
|
{ VertexElementFormat.HalfVector2, (uint) Marshal.SizeOf<HalfVector2>() },
|
||||||
|
{ VertexElementFormat.HalfVector4, (uint) Marshal.SizeOf<HalfVector4>() },
|
||||||
|
{ VertexElementFormat.NormalizedShort2, (uint) Marshal.SizeOf<NormalizedShort2>() },
|
||||||
|
{ VertexElementFormat.NormalizedShort4, (uint) Marshal.SizeOf<NormalizedShort4>() },
|
||||||
|
{ VertexElementFormat.Short2, (uint) Marshal.SizeOf<Short2>() },
|
||||||
|
{ VertexElementFormat.Short4, (uint) Marshal.SizeOf<Short4>() },
|
||||||
|
{ VertexElementFormat.UInt, (uint) Marshal.SizeOf<uint>() },
|
||||||
|
{ VertexElementFormat.Vector2, (uint) Marshal.SizeOf<Math.Float.Vector2>() },
|
||||||
|
{ VertexElementFormat.Vector3, (uint) Marshal.SizeOf<Math.Float.Vector3>() },
|
||||||
|
{ VertexElementFormat.Vector4, (uint) Marshal.SizeOf<Math.Float.Vector4>() }
|
||||||
|
};
|
||||||
|
|
||||||
public static byte BoolToByte(bool b)
|
public static byte BoolToByte(bool b)
|
||||||
{
|
{
|
||||||
return (byte) (b ? 1 : 0);
|
return (byte) (b ? 1 : 0);
|
||||||
|
@ -12,38 +33,9 @@
|
||||||
return b != 0;
|
return b != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Graphics.VertexElementFormat TypeToVertexElementFormat(System.Type type)
|
public static uint VertexElementFormatSize(VertexElementFormat format)
|
||||||
{
|
{
|
||||||
if (type == typeof(uint))
|
return Sizes[format];
|
||||||
{
|
|
||||||
return Graphics.VertexElementFormat.UInt;
|
|
||||||
}
|
|
||||||
if (type == typeof(float))
|
|
||||||
{
|
|
||||||
return Graphics.VertexElementFormat.Float;
|
|
||||||
}
|
|
||||||
else if (type == typeof(Math.Float.Vector2))
|
|
||||||
{
|
|
||||||
return Graphics.VertexElementFormat.Vector2;
|
|
||||||
}
|
|
||||||
else if (type == typeof(Math.Float.Vector3))
|
|
||||||
{
|
|
||||||
return Graphics.VertexElementFormat.Vector3;
|
|
||||||
}
|
|
||||||
else if (type == typeof(Math.Float.Vector4))
|
|
||||||
{
|
|
||||||
return Graphics.VertexElementFormat.Vector4;
|
|
||||||
}
|
|
||||||
else if (type == typeof(Graphics.Color))
|
|
||||||
{
|
|
||||||
return Graphics.VertexElementFormat.Color;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw new System.ArgumentException(
|
|
||||||
"Cannot automatically convert this type to a VertexElementFormat!"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
namespace MoonWorks.Graphics
|
||||||
|
{
|
||||||
|
// This is a convenience structure for pairing a vertex binding with its associated attributes.
|
||||||
|
public struct VertexBindingAndAttributes
|
||||||
|
{
|
||||||
|
public VertexBinding VertexBinding { get; }
|
||||||
|
public VertexAttribute[] VertexAttributes { get; }
|
||||||
|
|
||||||
|
public VertexBindingAndAttributes(VertexBinding binding, VertexAttribute[] attributes)
|
||||||
|
{
|
||||||
|
VertexBinding = binding;
|
||||||
|
VertexAttributes = attributes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static VertexBindingAndAttributes Create<T>(uint bindingIndex) where T : unmanaged, IVertexType
|
||||||
|
{
|
||||||
|
VertexBinding binding = VertexBinding.Create<T>(bindingIndex);
|
||||||
|
VertexAttribute[] attributes = new VertexAttribute[T.Formats.Length];
|
||||||
|
uint offset = 0;
|
||||||
|
|
||||||
|
for (uint i = 0; i < T.Formats.Length; i += 1)
|
||||||
|
{
|
||||||
|
var format = T.Formats[i];
|
||||||
|
|
||||||
|
attributes[i] = new VertexAttribute
|
||||||
|
{
|
||||||
|
Binding = bindingIndex,
|
||||||
|
Location = i,
|
||||||
|
Format = format,
|
||||||
|
Offset = offset
|
||||||
|
};
|
||||||
|
|
||||||
|
offset += Conversions.VertexElementFormatSize(format);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new VertexBindingAndAttributes(binding, attributes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue