forked from fiigii/PacketTracer
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSurfaces.cs
More file actions
61 lines (50 loc) · 2.46 KB
/
Surfaces.cs
File metadata and controls
61 lines (50 loc) · 2.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
//
using System.Runtime.Intrinsics;
using System.Runtime.Intrinsics.X86;
using static System.Runtime.Intrinsics.X86.Avx;
using ColorPacket256 = VectorPacket256;
using System;
internal static class Surfaces
{
private static readonly ColorPacket256 White = new ColorPacket256(Vector256.Create(1.0f));
private static readonly ColorPacket256 Black = new ColorPacket256(0.02f, 0.0f, 0.14f);
// Only works with X-Z plane.
public static readonly Surface CheckerBoard =
new Surface(
delegate (VectorPacket256 pos)
{
var floored = ConvertToVector256Int32(Add(Floor(pos.Zs), Floor(pos.Xs)));
var modMask = Vector256.Create(1);
var evenMaskint = Avx2.And(floored, modMask);
var evenMask = Avx2.CompareEqual(evenMaskint, modMask);
var resultX = BlendVariable(Black.Xs, White.Xs, evenMask.AsSingle());
var resultY = BlendVariable(Black.Ys, White.Ys, evenMask.AsSingle());
var resultZ = BlendVariable(Black.Zs, White.Zs, evenMask.AsSingle());
return new ColorPacket256(resultX, resultY, resultZ);
},
new VectorPacket256(1f, 1f, 1f),
delegate (VectorPacket256 pos)
{
var floored = ConvertToVector256Int32(Add(Floor(pos.Zs), Floor(pos.Xs)));
var modMask = Vector256.Create(1);
var evenMaskUint = Avx2.And(floored, modMask);
var evenMask = Avx2.CompareEqual(evenMaskUint, modMask);
return BlendVariable(Vector256.Create(0.5f), Vector256.Create(0.1f), evenMask.AsSingle());
},
150f);
public static readonly Surface Shiny =
new Surface(
delegate (VectorPacket256 pos) { return new VectorPacket256(1f, 1f, 1f); },
new VectorPacket256(.5f, .5f, .5f),
delegate (VectorPacket256 pos) { return Vector256.Create(0.7f); },
250f);
public static readonly Surface MatteShiny =
new Surface(
delegate (VectorPacket256 pos) { return new VectorPacket256(1f, 1f, 1f); },
new VectorPacket256(.25f, .25f, .25f),
delegate (VectorPacket256 pos) { return Vector256.Create(0.7f); },
250f);
}