Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using SharpDX;
- using SharpDX.Direct3D11;
- namespace VoidwalkerEngine.Framework.DirectX.Rendering
- {
- public enum FaceVisibilityOptions
- {
- None = 0,
- Front = 1,
- Back = 2,
- Left = 4,
- Right = 8,
- Top = 16,
- Bottom = 32,
- All = Front | Back | Left | Right | Top | Bottom
- }
- public class BrushVolume
- {
- public Vector3 Location { get; set; }
- public int Width { get; private set; }
- public int Height { get; private set; }
- public int Depth { get; private set; }
- public FaceVisibilityOptions FaceVisibility { get; private set; }
- public Material DiffuseMaterial { get; set; }
- public Device Device;
- private VertexBufferBinding _bufferBinding;
- private const float _stride = 16;
- // 36 Vertices maximum
- private int _drawCount;
- public BrushVolume(Device device, Material diffuseMaterial,
- int width, int height, int length,
- FaceVisibilityOptions visibilityOptions)
- {
- this.Device = device;
- this.Width = width;
- this.Height = height;
- this.Depth = length;
- this.FaceVisibility = visibilityOptions;
- this.DiffuseMaterial = diffuseMaterial;
- Rebuild();
- }
- public BrushVolume(Device device, Material diffuseMaterial,
- int width, int height, int length, Vector3 location,
- FaceVisibilityOptions visibilityOptions)
- {
- this.Device = device;
- this.Width = width;
- this.Height = height;
- this.Depth = length;
- this.Location = location;
- this.FaceVisibility = visibilityOptions;
- this.DiffuseMaterial = diffuseMaterial;
- Rebuild();
- }
- public void Resize(int width, int height, int depth)
- {
- this.Width = width;
- this.Height = height;
- this.Depth = depth;
- Rebuild();
- }
- public void Rebuild(int width, int height, int depth, FaceVisibilityOptions visibilityOptions)
- {
- this.Width = width;
- this.Height = height;
- this.Depth = depth;
- this.FaceVisibility = visibilityOptions;
- Rebuild();
- }
- public void SetFaceVisibility(FaceVisibilityOptions visibilityOptions)
- {
- this.FaceVisibility = visibilityOptions;
- Rebuild();
- }
- private int CountVisibleFaces(FaceVisibilityOptions visibilityOptions)
- {
- int value = (int)visibilityOptions;
- value -= ((value >> 1) & 1431655765);
- value = (value & 858993459) + ((value >> 2) & 858993459);
- int count = ((value + (value >> 4) & 252645135) * 16843009) >> 24;
- return count;
- }
- public void Rebuild()
- {
- Vertex[] vertices = new Vertex[CountVisibleFaces(this.FaceVisibility) * 6];
- float width = _stride * this.Width;
- float height = _stride * this.Height;
- float depth = _stride * this.Depth;
- float uvX = width / this.DiffuseMaterial.Width;
- float uvY = height / this.DiffuseMaterial.Height;
- float uvZ = depth / this.DiffuseMaterial.Width;
- // Generate Front Face
- int index = 0;
- if (this.FaceVisibility.HasFlag(FaceVisibilityOptions.Front))
- {
- Vector3 normal = new Vector3(0, 0, -1);
- vertices[index++] = new Vertex(new Vector3(-width, height, -depth), new Vector2(-uvX, -uvY), normal);
- vertices[index++] = new Vertex(new Vector3(width, -height, -depth), new Vector2(0, 0), normal);
- vertices[index++] = new Vertex(new Vector3(-width, -height, -depth), new Vector2(-uvX, 0), normal);
- vertices[index++] = new Vertex(new Vector3(-width, height, -depth), new Vector2(-uvX, -uvY), normal);
- vertices[index++] = new Vertex(new Vector3(width, height, -depth), new Vector2(0, -uvY), normal);
- vertices[index++] = new Vertex(new Vector3(width, -height, -depth), new Vector2(0, 0), normal);
- }
- // Generate Back Face
- if (this.FaceVisibility.HasFlag(FaceVisibilityOptions.Back))
- {
- Vector3 normal = new Vector3(0, 0, 1);
- vertices[index++] = new Vertex(new Vector3(width, height, depth), new Vector2(-uvX, -uvY), normal);
- vertices[index++] = new Vertex(new Vector3(-width, -height, depth), new Vector2(0, 0), normal);
- vertices[index++] = new Vertex(new Vector3(width, -height, depth), new Vector2(-uvX, 0), normal);
- vertices[index++] = new Vertex(new Vector3(width, height, depth), new Vector2(-uvX, -uvY), normal);
- vertices[index++] = new Vertex(new Vector3(-width, height, depth), new Vector2(0, -uvY), normal);
- vertices[index++] = new Vertex(new Vector3(-width, -height, depth), new Vector2(0, 0), normal);
- }
- // Generate Right Face
- if (this.FaceVisibility.HasFlag(FaceVisibilityOptions.Right))
- {
- Vector3 normal = new Vector3(1, 0, 0);
- vertices[index++] = new Vertex(new Vector3(width, height, -depth), new Vector2(-uvZ, -uvY), normal);
- vertices[index++] = new Vertex(new Vector3(width, -height, depth), new Vector2(0, 0), normal);
- vertices[index++] = new Vertex(new Vector3(width, -height, -depth), new Vector2(-uvZ, 0), normal);
- vertices[index++] = new Vertex(new Vector3(width, height, -depth), new Vector2(-uvZ, -uvY), normal);
- vertices[index++] = new Vertex(new Vector3(width, height, depth), new Vector2(0, -uvY), normal);
- vertices[index++] = new Vertex(new Vector3(width, -height, depth), new Vector2(0, 0), normal);
- }
- // Generate Left Face
- if (this.FaceVisibility.HasFlag(FaceVisibilityOptions.Left))
- {
- Vector3 normal = new Vector3(-1, 0, 0);
- vertices[index++] = new Vertex(new Vector3(-width, height, depth), new Vector2(-uvZ, -uvY), normal);
- vertices[index++] = new Vertex(new Vector3(-width, -height, -depth), new Vector2(0, 0), normal);
- vertices[index++] = new Vertex(new Vector3(-width, -height, depth), new Vector2(-uvZ, 0), normal);
- vertices[index++] = new Vertex(new Vector3(-width, height, depth), new Vector2(-uvZ, -uvY), normal);
- vertices[index++] = new Vertex(new Vector3(-width, height, -depth), new Vector2(0, -uvY), normal);
- vertices[index++] = new Vertex(new Vector3(-width, -height, -depth), new Vector2(0, 0), normal);
- }
- // Generate Bottom Face
- if (this.FaceVisibility.HasFlag(FaceVisibilityOptions.Bottom))
- {
- Vector3 normal = new Vector3(0, -1, 0);
- vertices[index++] = new Vertex(new Vector3(-width, -height, depth), new Vector2(-uvZ, -uvX), normal);
- vertices[index++] = new Vertex(new Vector3(width, -height, -depth), new Vector2(0, 0), normal);
- vertices[index++] = new Vertex(new Vector3(width, -height, depth), new Vector2(-uvZ, 0), normal);
- vertices[index++] = new Vertex(new Vector3(-width, -height, depth), new Vector2(-uvZ, -uvX), normal);
- vertices[index++] = new Vertex(new Vector3(-width, -height, -depth), new Vector2(0, -uvX), normal);
- vertices[index++] = new Vertex(new Vector3(width, -height, -depth), new Vector2(0, 0), normal);
- }
- // Generate Top Face
- if (this.FaceVisibility.HasFlag(FaceVisibilityOptions.Top))
- {
- Vector3 normal = new Vector3(0, 1, 0);
- vertices[index++] = new Vertex(new Vector3(width, height, depth), new Vector2(-uvZ, -uvX), normal);
- vertices[index++] = new Vertex(new Vector3(-width, height, -depth), new Vector2(0, 0), normal);
- vertices[index++] = new Vertex(new Vector3(-width, height, depth), new Vector2(-uvZ, 0), normal);
- vertices[index++] = new Vertex(new Vector3(width, height, depth), new Vector2(-uvZ, -uvX), normal);
- vertices[index++] = new Vertex(new Vector3(width, height, -depth), new Vector2(0, -uvX), normal);
- vertices[index++] = new Vertex(new Vector3(-width, height, -depth), new Vector2(0, 0), normal);
- }
- if (this._bufferBinding.Buffer != null)
- {
- this._bufferBinding.Buffer.Dispose();
- }
- this._drawCount = vertices.Length;
- Buffer vertexBuffer = Buffer.Create(Device, BindFlags.VertexBuffer, vertices);
- this._bufferBinding = new VertexBufferBinding(vertexBuffer, 32, 0); // 32 is Vertex Size In Bytes
- }
- public void Draw(DeviceContext context)
- {
- context.InputAssembler.SetVertexBuffers(0, this._bufferBinding);
- if (DiffuseMaterial != null)
- {
- context.PixelShader.SetShaderResource(0, DiffuseMaterial.ResourceView);
- context.PixelShader.SetSampler(0, DiffuseMaterial.SamplerState);
- }
- context.Draw(_drawCount, 0);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement