134 lines
8.0 KiB
C#
134 lines
8.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using Aiwaz.Contracts;
|
|
using SlimDX;
|
|
using Aiwaz.Resources.Attributes;
|
|
using System.Collections.ObjectModel;
|
|
|
|
namespace Aiwaz.Resources.Prefab
|
|
{
|
|
[CreationParameters("Standard unity-sized non-inverted cube")]
|
|
public class CubeParams : ICreationParams
|
|
{
|
|
public float Width;
|
|
public float Height;
|
|
public float Depth;
|
|
public bool IsInverted;
|
|
|
|
public CubeParams()
|
|
{
|
|
Width = 1.0f;
|
|
Height = 1.0f;
|
|
Depth = 1.0f;
|
|
IsInverted = false;
|
|
}
|
|
}
|
|
|
|
[AiwazResource("Cube", "A simple non-uniform cube")]
|
|
public class Cube : Resource
|
|
{
|
|
public struct CommonCubeVertex
|
|
{
|
|
public CommonCubeVertex(SlimDX.Vector3 pos,
|
|
SlimDX.Vector3 normal,
|
|
SlimDX.Vector3 tangent,
|
|
SlimDX.Vector2 tex)
|
|
{
|
|
this.Pos = pos;
|
|
this.Normal = normal;
|
|
this.Tangent = tangent;
|
|
this.Tex = tex;
|
|
}
|
|
public SlimDX.Vector3 Pos;
|
|
public SlimDX.Vector3 Normal;
|
|
public SlimDX.Vector3 Tangent;
|
|
public SlimDX.Vector2 Tex;
|
|
};
|
|
|
|
public GeometryBuffer GeometryBuffer { get; protected set; }
|
|
|
|
public Cube(CubeParams parameters)
|
|
{
|
|
creationParams = parameters;
|
|
float width = parameters.Width * 0.5f;
|
|
float height = parameters.Height * 0.5f;
|
|
float depth = parameters.Depth * 0.5f;
|
|
|
|
float normal = parameters.IsInverted ? -1.0f : 1.0f;
|
|
float tangent = 1.0f;//isInverted ? -1.0f : 1.0f;
|
|
CommonCubeVertex[] vertices = new CommonCubeVertex[]
|
|
{
|
|
new CommonCubeVertex ( new SlimDX.Vector3( -width, height, -depth ), new SlimDX.Vector3(0.0f, normal, 0.0f), new SlimDX.Vector3(-tangent, 0.0f, 0.0f), new SlimDX.Vector2( 0.0f, 0.0f ) ),
|
|
new CommonCubeVertex ( new SlimDX.Vector3( width, height, -depth ), new SlimDX.Vector3(0.0f, normal, 0.0f), new SlimDX.Vector3(-tangent, 0.0f, 0.0f), new SlimDX.Vector2( 1.0f, 0.0f ) ),
|
|
new CommonCubeVertex ( new SlimDX.Vector3( width, height, depth ), new SlimDX.Vector3(0.0f, normal, 0.0f), new SlimDX.Vector3(-tangent, 0.0f, 0.0f), new SlimDX.Vector2( 1.0f, 1.0f ) ),
|
|
new CommonCubeVertex ( new SlimDX.Vector3( -width, height, depth ), new SlimDX.Vector3(0.0f, normal, 0.0f), new SlimDX.Vector3(-tangent, 0.0f, 0.0f), new SlimDX.Vector2( 0.0f, 1.0f ) ),
|
|
|
|
new CommonCubeVertex ( new SlimDX.Vector3( -width, -height, -depth ), new SlimDX.Vector3(0.0f, -normal, 0.0f), new SlimDX.Vector3(-tangent, 0.0f, 0.0f), new SlimDX.Vector2( 0.0f, 0.0f ) ),
|
|
new CommonCubeVertex ( new SlimDX.Vector3( width, -height, -depth ), new SlimDX.Vector3(0.0f, -normal, 0.0f), new SlimDX.Vector3(-tangent, 0.0f, 0.0f), new SlimDX.Vector2( 1.0f, 0.0f ) ),
|
|
new CommonCubeVertex ( new SlimDX.Vector3( width, -height, depth ), new SlimDX.Vector3(0.0f, -normal, 0.0f), new SlimDX.Vector3(-tangent, 0.0f, 0.0f), new SlimDX.Vector2( 1.0f, 1.0f ) ),
|
|
new CommonCubeVertex ( new SlimDX.Vector3( -width, -height, depth ), new SlimDX.Vector3(0.0f, -normal, 0.0f), new SlimDX.Vector3(-tangent, 0.0f, 0.0f), new SlimDX.Vector2( 0.0f, 1.0f ) ),
|
|
|
|
new CommonCubeVertex ( new SlimDX.Vector3( -width, -height, depth ), new SlimDX.Vector3(-normal, 0.0f, 0.0f), new SlimDX.Vector3(0.0f, tangent, 0.0f), new SlimDX.Vector2( 0.0f, 1.0f ) ),
|
|
new CommonCubeVertex ( new SlimDX.Vector3( -width, -height, -depth ), new SlimDX.Vector3(-normal, 0.0f, 0.0f), new SlimDX.Vector3(0.0f, tangent, 0.0f), new SlimDX.Vector2( 1.0f, 1.0f ) ),
|
|
new CommonCubeVertex ( new SlimDX.Vector3( -width, height, -depth ), new SlimDX.Vector3(-normal, 0.0f, 0.0f), new SlimDX.Vector3(0.0f, tangent, 0.0f), new SlimDX.Vector2( 1.0f, 0.0f ) ),
|
|
new CommonCubeVertex ( new SlimDX.Vector3( -width, height, depth ), new SlimDX.Vector3(-normal, 0.0f, 0.0f), new SlimDX.Vector3(0.0f, tangent, 0.0f), new SlimDX.Vector2( 0.0f, 0.0f ) ),
|
|
|
|
new CommonCubeVertex ( new SlimDX.Vector3( width, -height, depth ), new SlimDX.Vector3(normal, 0.0f, 0.0f), new SlimDX.Vector3(0.0f, -tangent, 0.0f), new SlimDX.Vector2( 1.0f, 1.0f ) ),
|
|
new CommonCubeVertex ( new SlimDX.Vector3( width, -height, -depth ), new SlimDX.Vector3(normal, 0.0f, 0.0f), new SlimDX.Vector3(0.0f, -tangent, 0.0f), new SlimDX.Vector2( 0.0f, 1.0f ) ),
|
|
new CommonCubeVertex ( new SlimDX.Vector3( width, height, -depth ), new SlimDX.Vector3(normal, 0.0f, 0.0f), new SlimDX.Vector3(0.0f, -tangent, 0.0f), new SlimDX.Vector2( 0.0f, 0.0f ) ),
|
|
new CommonCubeVertex ( new SlimDX.Vector3( width, height, depth ), new SlimDX.Vector3(normal, 0.0f, 0.0f), new SlimDX.Vector3(0.0f, -tangent, 0.0f), new SlimDX.Vector2( 1.0f, 0.0f ) ),
|
|
|
|
new CommonCubeVertex ( new SlimDX.Vector3( -width, -height, -depth ), new SlimDX.Vector3(0.0f, 0.0f, -normal), new SlimDX.Vector3(-tangent, 0.0f, 0.0f), new SlimDX.Vector2( 0.0f, 1.0f ) ),
|
|
new CommonCubeVertex ( new SlimDX.Vector3( width, -height, -depth ), new SlimDX.Vector3(0.0f, 0.0f, -normal), new SlimDX.Vector3(-tangent, 0.0f, 0.0f), new SlimDX.Vector2( 1.0f, 1.0f ) ),
|
|
new CommonCubeVertex ( new SlimDX.Vector3( width, height, -depth ), new SlimDX.Vector3(0.0f, 0.0f, -normal), new SlimDX.Vector3(-tangent, 0.0f, 0.0f), new SlimDX.Vector2( 1.0f, 0.0f ) ),
|
|
new CommonCubeVertex ( new SlimDX.Vector3( -width, height, -depth ), new SlimDX.Vector3(0.0f, 0.0f, -normal), new SlimDX.Vector3(-tangent, 0.0f, 0.0f), new SlimDX.Vector2( 0.0f, 0.0f ) ),
|
|
|
|
new CommonCubeVertex ( new SlimDX.Vector3( -width, -height, depth ), new SlimDX.Vector3(0.0f, 0.0f, normal), new SlimDX.Vector3(-tangent, 0.0f, 0.0f), new SlimDX.Vector2( 1.0f, 1.0f ) ),
|
|
new CommonCubeVertex ( new SlimDX.Vector3( width, -height, depth ), new SlimDX.Vector3(0.0f, 0.0f, normal), new SlimDX.Vector3(-tangent, 0.0f, 0.0f), new SlimDX.Vector2( 0.0f, 1.0f ) ),
|
|
new CommonCubeVertex ( new SlimDX.Vector3( width, height, depth ), new SlimDX.Vector3(0.0f, 0.0f, normal), new SlimDX.Vector3(-tangent, 0.0f, 0.0f), new SlimDX.Vector2( 0.0f, 0.0f ) ),
|
|
new CommonCubeVertex ( new SlimDX.Vector3( -width, height, depth ), new SlimDX.Vector3(0.0f, 0.0f, normal), new SlimDX.Vector3(-tangent, 0.0f, 0.0f), new SlimDX.Vector2( 1.0f, 0.0f ) ),
|
|
};
|
|
|
|
var vertexElements = new VertexElement[]
|
|
{
|
|
new VertexElement(VertexElement.Format.Position),
|
|
new VertexElement(VertexElement.Format.Normal),
|
|
new VertexElement(VertexElement.Format.Tangent),
|
|
new VertexElement(VertexElement.Format.Texture2D)
|
|
};
|
|
|
|
var invertedIndices = new uint[] { 0,1,3, 3,1,2, 5,4,6, 6,4,7, 8,9,11, 11,9,10, 13,12,14, 14,12,15, 16,17,19, 19,17,18, 21,20,22, 22,20,23 };
|
|
var normalIndices = new uint[] { 3,1,0, 2,1,3, 6,4,5, 7,4,6, 11,9,8, 10,9,11, 14,12,13, 15,12,14, 19,17,16, 18,17,19, 22,20,21, 23,20,22 };
|
|
|
|
this.GeometryBuffer = GeometryBuffer.Create<CommonCubeVertex>(
|
|
parameters.IsInverted ? invertedIndices : normalIndices,
|
|
vertices,
|
|
vertexElements,
|
|
false);
|
|
}
|
|
|
|
private ICreationParams creationParams;
|
|
public override ICreationParams CreationParams
|
|
{
|
|
get { return creationParams; }
|
|
}
|
|
|
|
private ObservableCollection<IResource> children;
|
|
[ReadOnly]
|
|
public override ObservableCollection<IResource> Children
|
|
{
|
|
get
|
|
{
|
|
if (children == null)
|
|
{
|
|
children = new ObservableCollection<IResource>();
|
|
children.Add(GeometryBuffer);
|
|
}
|
|
return children;
|
|
}
|
|
}
|
|
}
|
|
}
|