示例#1
0
        public static quaternion AsQuaternionRotation(uint3 u)
        {
            float3 rnd       = AsFloat3(u, 0f, new float3(2.0f * math.PI, 2.0f * math.PI, 1.0f));
            float  u1        = rnd.z;
            float2 theta_rho = rnd.xy;

            float i = math.sqrt(1.0f - u1);
            float j = math.sqrt(u1);

            float2 sin_theta_rho;
            float2 cos_theta_rho;

            math.sincos(theta_rho, out sin_theta_rho, out cos_theta_rho);

            quaternion q = new quaternion(i * sin_theta_rho.x, i * cos_theta_rho.x, j * sin_theta_rho.y, j * cos_theta_rho.y);

            return(new quaternion(math.select(q.value, -q.value, q.value.w < 0.0f)));
        }
示例#2
0
        void Start()
        {
            tex = new RenderTexture(source.width, source.height, 0);
            tex.enableRandomWrite = true;
            tex.Create();

            int kernel = compute.FindKernel("CSMain");

            uint3 groups = compute.GetThreadGroupSize(kernel);

            Debug.Assert(source.width % groups.x == 0);
            Debug.Assert(source.height % groups.y == 0);

            compute.SetTexture(kernel, "Source", source, 0);
            compute.SetTexture(kernel, "Result", tex);

            compute.Dispatch(kernel, tex.width / (int)groups.x, tex.height / (int)groups.y, 1);
        }
示例#3
0
        public CoeffTexture(uint3 size)
        {
            RenderTextureDescriptor desc = new RenderTextureDescriptor
            {
                autoGenerateMips   = false,
                bindMS             = false,
                colorFormat        = RenderTextureFormat.ARGBHalf,
                depthBufferBits    = 0,
                dimension          = TextureDimension.Tex3D,
                enableRandomWrite  = true,
                width              = (int)size.x,
                height             = (int)size.y,
                volumeDepth        = (int)size.z,
                memoryless         = RenderTextureMemoryless.None,
                msaaSamples        = 1,
                shadowSamplingMode = ShadowSamplingMode.None,
                sRGB            = false,
                useDynamicScale = false,
                useMipMap       = false,
                vrUsage         = VRTextureUsage.None
            };

            coeff0            = new RenderTexture(desc);
            coeff1            = new RenderTexture(desc);
            coeff2            = new RenderTexture(desc);
            coeff3            = new RenderTexture(desc);
            coeff4            = new RenderTexture(desc);
            coeff5            = new RenderTexture(desc);
            coeff6            = new RenderTexture(desc);
            coeff0.filterMode = FilterMode.Bilinear;
            coeff1.filterMode = FilterMode.Bilinear;
            coeff2.filterMode = FilterMode.Bilinear;
            coeff3.filterMode = FilterMode.Bilinear;
            coeff4.filterMode = FilterMode.Bilinear;
            coeff5.filterMode = FilterMode.Bilinear;
            coeff6.filterMode = FilterMode.Bilinear;
            coeff0.Create();
            coeff1.Create();
            coeff2.Create();
            coeff3.Create();
            coeff4.Create();
            coeff5.Create();
            coeff6.Create();
        }
示例#4
0
 public void InvariantNorm()
 {
     {
         var v0 = new uint3(5u, 3u, 2u);
         Assert.LessOrEqual(v0.NormMax, v0.Norm);
     }
     {
         var v0 = new uint3(4u, 4u, 0u);
         Assert.LessOrEqual(v0.NormMax, v0.Norm);
     }
     {
         var v0 = new uint3(2u, 6u, 0u);
         Assert.LessOrEqual(v0.NormMax, v0.Norm);
     }
     {
         var v0 = new uint3(9u, 5u, 7u);
         Assert.LessOrEqual(v0.NormMax, v0.Norm);
     }
     {
         var v0 = new uint3(3u, 2u, 6u);
         Assert.LessOrEqual(v0.NormMax, v0.Norm);
     }
     {
         var v0 = new uint3(7u, 9u, 3u);
         Assert.LessOrEqual(v0.NormMax, v0.Norm);
     }
     {
         var v0 = new uint3(2u, 5u, 6u);
         Assert.LessOrEqual(v0.NormMax, v0.Norm);
     }
     {
         var v0 = new uint3(6u, 3u, 7u);
         Assert.LessOrEqual(v0.NormMax, v0.Norm);
     }
     {
         var v0 = new uint3(7u, 6u, 0u);
         Assert.LessOrEqual(v0.NormMax, v0.Norm);
     }
     {
         var v0 = new uint3(4u, 5u, 3u);
         Assert.LessOrEqual(v0.NormMax, v0.Norm);
     }
 }
示例#5
0
 public void InvariantId()
 {
     {
         var v0 = new uint3(4u, 1u, 2u);
         Assert.AreEqual(v0, +v0);
     }
     {
         var v0 = new uint3(5u, 3u, 1u);
         Assert.AreEqual(v0, +v0);
     }
     {
         var v0 = new uint3(4u, 8u, 5u);
         Assert.AreEqual(v0, +v0);
     }
     {
         var v0 = new uint3(4u, 4u, 9u);
         Assert.AreEqual(v0, +v0);
     }
     {
         var v0 = new uint3(1u, 7u, 8u);
         Assert.AreEqual(v0, +v0);
     }
     {
         var v0 = new uint3(1u, 1u, 3u);
         Assert.AreEqual(v0, +v0);
     }
     {
         var v0 = new uint3(5u, 4u, 6u);
         Assert.AreEqual(v0, +v0);
     }
     {
         var v0 = new uint3(8u, 2u, 2u);
         Assert.AreEqual(v0, +v0);
     }
     {
         var v0 = new uint3(5u, 5u, 0u);
         Assert.AreEqual(v0, +v0);
     }
     {
         var v0 = new uint3(8u, 8u, 5u);
         Assert.AreEqual(v0, +v0);
     }
 }
示例#6
0
 public void InvariantTriple()
 {
     {
         var v0 = new uint3(9u, 1u, 3u);
         Assert.AreEqual(v0 + v0 + v0, 3 * v0);
     }
     {
         var v0 = new uint3(7u, 7u, 8u);
         Assert.AreEqual(v0 + v0 + v0, 3 * v0);
     }
     {
         var v0 = new uint3(0u, 1u, 2u);
         Assert.AreEqual(v0 + v0 + v0, 3 * v0);
     }
     {
         var v0 = new uint3(2u, 8u, 6u);
         Assert.AreEqual(v0 + v0 + v0, 3 * v0);
     }
     {
         var v0 = new uint3(5u, 3u, 2u);
         Assert.AreEqual(v0 + v0 + v0, 3 * v0);
     }
     {
         var v0 = new uint3(8u, 5u, 8u);
         Assert.AreEqual(v0 + v0 + v0, 3 * v0);
     }
     {
         var v0 = new uint3(5u, 1u, 9u);
         Assert.AreEqual(v0 + v0 + v0, 3 * v0);
     }
     {
         var v0 = new uint3(9u, 7u, 4u);
         Assert.AreEqual(v0 + v0 + v0, 3 * v0);
     }
     {
         var v0 = new uint3(1u, 7u, 4u);
         Assert.AreEqual(v0 + v0 + v0, 3 * v0);
     }
     {
         var v0 = new uint3(2u, 3u, 5u);
         Assert.AreEqual(v0 + v0 + v0, 3 * v0);
     }
 }
        public static int3 intpow(int3 x, uint3 n)
        {
            if (Sse2.IsSse2Supported)
            {
                v128 ZERO = default(v128);
                v128 ONE  = new v128(1);
                v128 _x   = *(v128 *)&x;
                v128 _n   = *(v128 *)&n;

                v128 doneMask = ZERO;
                v128 result   = ZERO;

                v128 p = _x;
                v128 y = ONE;


Loop:
                v128 y_times_p = Operator.mul_int(y, p);
                y = Mask.BlendV(y, y_times_p, Sse2.cmpeq_epi32(ONE, Sse2.and_si128(ONE, _n)));

                _n = Sse2.srli_epi32(_n, 1);

                v128 n_is_zero = Sse2.cmpeq_epi32(ZERO, _n);
                result   = Mask.BlendV(result, y, Sse2.andnot_si128(doneMask, n_is_zero));
                doneMask = n_is_zero;


                if (bitmask32(3 * sizeof(int)) != (bitmask32(3 * sizeof(int)) & Sse2.movemask_epi8(doneMask)))
                {
                    p = Operator.mul_int(p, p);

                    goto Loop;
                }
                else
                {
                    return(*(int3 *)&result);
                }
            }
            else
            {
                return(new int3(intpow(x.x, n.x), intpow(x.y, n.y), intpow(x.z, n.z)));
            }
        }
示例#8
0
文件: uint8.cs 项目: csritter/MaxMath
        public uint8(uint3 x012, uint2 x34, uint3 x567)
        {
            if (Sse2.IsSse2Supported)
            {
                v128 lo;
                v128 mid = Sse2.bslli_si128(*(v128 *)&x34, 3 * sizeof(uint));

                if (Sse4_1.IsSse41Supported)
                {
                    lo = Sse4_1.blend_epi16(*(v128 *)&x012, mid, 0b1100_0000);
                }
                else
                {
                    lo = Mask.BlendEpi16_SSE2(*(v128 *)&x012, mid, 0b1100_0000);
                }

                mid = Sse2.bsrli_si128(*(v128 *)&x34, sizeof(uint));

                v128 hi = Sse2.bslli_si128(*(v128 *)&x567, sizeof(uint));

                if (Sse4_1.IsSse41Supported)
                {
                    hi = Sse4_1.blend_epi16(mid, hi, 0b1111_1100);
                }
                else
                {
                    hi = Mask.BlendEpi16_SSE2(mid, hi, 0b1111_1100);
                }


                this = new uint8(*(uint4 *)&lo, *(uint4 *)&hi);
            }
            else
            {
                this = new uint8
                {
                    _v4_0 = new uint4(x012, x34.x),
                    _v4_4 = new uint4(x34.y, x567)
                };
            }
        }
示例#9
0
        public void Indexer()
        {
            var v = new uint3(5u, 7u, 6u);

            Assert.AreEqual(5u, v[0]);
            Assert.AreEqual(7u, v[1]);
            Assert.AreEqual(6u, v[2]);

            Assert.Throws <ArgumentOutOfRangeException>(() => { var s = v[-2147483648]; });
            Assert.Throws <ArgumentOutOfRangeException>(() => { v[-2147483648] = 0u; });
            Assert.Throws <ArgumentOutOfRangeException>(() => { var s = v[-1]; });
            Assert.Throws <ArgumentOutOfRangeException>(() => { v[-1] = 0u; });
            Assert.Throws <ArgumentOutOfRangeException>(() => { var s = v[3]; });
            Assert.Throws <ArgumentOutOfRangeException>(() => { v[3] = 0u; });
            Assert.Throws <ArgumentOutOfRangeException>(() => { var s = v[2147483647]; });
            Assert.Throws <ArgumentOutOfRangeException>(() => { v[2147483647] = 0u; });
            Assert.Throws <ArgumentOutOfRangeException>(() => { var s = v[5]; });
            Assert.Throws <ArgumentOutOfRangeException>(() => { v[5] = 0u; });

            v[0] = 0u;
            Assert.AreEqual(0u, v[0]);
            v[0] = 1u;
            Assert.AreEqual(1u, v[0]);
            v[1] = 2u;
            Assert.AreEqual(2u, v[1]);
            v[1] = 3u;
            Assert.AreEqual(3u, v[1]);
            v[1] = 4u;
            Assert.AreEqual(4u, v[1]);
            v[2] = 5u;
            Assert.AreEqual(5u, v[2]);
            v[0] = 6u;
            Assert.AreEqual(6u, v[0]);
            v[1] = 7u;
            Assert.AreEqual(7u, v[1]);
            v[1] = 8u;
            Assert.AreEqual(8u, v[1]);
            v[2] = 9u;
            Assert.AreEqual(9u, v[2]);
        }
        public void uint3_operator_postfix_inc()
        {
            uint3 a0 = uint3(241865086, 2145821641, 1596166022);
            uint3 r0 = uint3(241865086, 2145821641, 1596166022);

            TestUtils.AreEqual(a0++, r0);

            uint3 a1 = uint3(803592338, 1656767229, 903047443);
            uint3 r1 = uint3(803592338, 1656767229, 903047443);

            TestUtils.AreEqual(a1++, r1);

            uint3 a2 = uint3(1213663244, 1384002775, 389844650);
            uint3 r2 = uint3(1213663244, 1384002775, 389844650);

            TestUtils.AreEqual(a2++, r2);

            uint3 a3 = uint3(1159795446, 1227160199, 947635082);
            uint3 r3 = uint3(1159795446, 1227160199, 947635082);

            TestUtils.AreEqual(a3++, r3);
        }
        public void uint3_operator_prefix_dec()
        {
            uint3 a0 = uint3(1331961415, 1612382200, 1401591249);
            uint3 r0 = uint3(1331961414, 1612382199, 1401591248);

            TestUtils.AreEqual(--a0, r0);

            uint3 a1 = uint3(2042075388, 1895858159, 1467742422);
            uint3 r1 = uint3(2042075387, 1895858158, 1467742421);

            TestUtils.AreEqual(--a1, r1);

            uint3 a2 = uint3(578341664, 2059077641, 1169239112);
            uint3 r2 = uint3(578341663, 2059077640, 1169239111);

            TestUtils.AreEqual(--a2, r2);

            uint3 a3 = uint3(1862369220, 1027543764, 1595492535);
            uint3 r3 = uint3(1862369219, 1027543763, 1595492534);

            TestUtils.AreEqual(--a3, r3);
        }
        public void uint3_operator_neg()
        {
            uint3 a0 = uint3(1385088677, 94114564, 1350664872);
            uint3 r0 = uint3(2909878619, 4200852732, 2944302424);

            TestUtils.AreEqual(-a0, r0);

            uint3 a1 = uint3(1458616659, 218122493, 958484951);
            uint3 r1 = uint3(2836350637, 4076844803, 3336482345);

            TestUtils.AreEqual(-a1, r1);

            uint3 a2 = uint3(270553961, 270503114, 1928771252);
            uint3 r2 = uint3(4024413335, 4024464182, 2366196044);

            TestUtils.AreEqual(-a2, r2);

            uint3 a3 = uint3(1427605822, 1434247484, 485368391);
            uint3 r3 = uint3(2867361474, 2860719812, 3809598905);

            TestUtils.AreEqual(-a3, r3);
        }
        public void uint3_operator_plus()
        {
            uint3 a0 = uint3(195392567, 222719748, 1002351013);
            uint3 r0 = uint3(195392567, 222719748, 1002351013);

            TestUtils.AreEqual(+a0, r0);

            uint3 a1 = uint3(1570765263, 1515950277, 1689763402);
            uint3 r1 = uint3(1570765263, 1515950277, 1689763402);

            TestUtils.AreEqual(+a1, r1);

            uint3 a2 = uint3(291471785, 1084131995, 195779102);
            uint3 r2 = uint3(291471785, 1084131995, 195779102);

            TestUtils.AreEqual(+a2, r2);

            uint3 a3 = uint3(2131702223, 1995564647, 69731564);
            uint3 r3 = uint3(2131702223, 1995564647, 69731564);

            TestUtils.AreEqual(+a3, r3);
        }
        public void uint3_operator_prefix_inc()
        {
            uint3 a0 = uint3(780471723, 954741756, 272723451);
            uint3 r0 = uint3(780471724, 954741757, 272723452);

            TestUtils.AreEqual(++a0, r0);

            uint3 a1 = uint3(2142862245, 1514814550, 250124151);
            uint3 r1 = uint3(2142862246, 1514814551, 250124152);

            TestUtils.AreEqual(++a1, r1);

            uint3 a2 = uint3(444189162, 1915989169, 1348278302);
            uint3 r2 = uint3(444189163, 1915989170, 1348278303);

            TestUtils.AreEqual(++a2, r2);

            uint3 a3 = uint3(129540735, 1170613526, 986715680);
            uint3 r3 = uint3(129540736, 1170613527, 986715681);

            TestUtils.AreEqual(++a3, r3);
        }
示例#15
0
        public static bool3 isdivisible(uint3 dividend, uint divisor)
        {
            Assert.AreNotEqual(0u, divisor);

            if (Constant.IsConstantExpression(divisor))
            {
                if (math.ispow2(divisor))
                {
                    return((dividend & (divisor - 1)) == 0);
                }
                else
                {
                    ulong3 compile = (new ulong3(ulong.MaxValue) / divisor) + 1;

                    return(dividend * compile <= compile - 1);
                }
            }
            else
            {
                return(dividend % divisor == 0);
            }
        }
        public void uint3_operator_postfix_dec()
        {
            uint3 a0 = uint3(1870005937, 1708534798, 704493460);
            uint3 r0 = uint3(1870005937, 1708534798, 704493460);

            TestUtils.AreEqual(a0--, r0);

            uint3 a1 = uint3(462940703, 228744869, 940247280);
            uint3 r1 = uint3(462940703, 228744869, 940247280);

            TestUtils.AreEqual(a1--, r1);

            uint3 a2 = uint3(1818778351, 862428933, 1401191870);
            uint3 r2 = uint3(1818778351, 862428933, 1401191870);

            TestUtils.AreEqual(a2--, r2);

            uint3 a3 = uint3(2080259851, 140452688, 1928164223);
            uint3 r3 = uint3(2080259851, 140452688, 1928164223);

            TestUtils.AreEqual(a3--, r3);
        }
        public void uint3_operator_bitwise_not()
        {
            uint3 a0 = uint3(111796841, 603562399, 745091931);
            uint3 r0 = uint3(4183170454, 3691404896, 3549875364);

            TestUtils.AreEqual(~a0, r0);

            uint3 a1 = uint3(853183268, 381888399, 1891338755);
            uint3 r1 = uint3(3441784027, 3913078896, 2403628540);

            TestUtils.AreEqual(~a1, r1);

            uint3 a2 = uint3(1506860135, 787710759, 875964607);
            uint3 r2 = uint3(2788107160, 3507256536, 3419002688);

            TestUtils.AreEqual(~a2, r2);

            uint3 a3 = uint3(96456785, 203444882, 1172294211);
            uint3 r3 = uint3(4198510510, 4091522413, 3122673084);

            TestUtils.AreEqual(~a3, r3);
        }
示例#18
0
        public static uint3 bitmask32(uint3 numBits, uint3 index = default(uint3))
        {
            Assert.IsBetween(index.x, 0u, 32u);
            Assert.IsBetween(index.y, 0u, 32u);
            Assert.IsBetween(index.z, 0u, 32u);
            Assert.IsBetween(numBits.x, 0u, 32u - index.x);
            Assert.IsBetween(numBits.y, 0u, 32u - index.y);
            Assert.IsBetween(numBits.z, 0u, 32u - index.z);

            // mask
            index = shl(uint.MaxValue, index);

            if (Sse2.IsSse2Supported)
            {
                v128 isMaxBitsMask = Sse2.cmpeq_epi32(*(v128 *)&numBits, new v128(32));

                return((*(uint3 *)&isMaxBitsMask) | andnot(index, shl(index, numBits)));
            }
            else
            {
                return((uint3)(-toint32(numBits == 32)) | andnot(index, shl(index, numBits)));
            }
        }
示例#19
0
        public static int indexof(uint3 v, uint x)
        {
            if (Sse2.IsSse2Supported)
            {
                return(math.tzcnt(bitmask32(3 * sizeof(uint)) & Sse.movemask_ps(Sse2.cmpeq_epi32(*(v128 *)&v, new v128(x)))));
            }
            else
            {
                for (int i = 0; i < 3; i++)
                {
                    if (v[i] == x)
                    {
                        return(i);
                    }
                    else
                    {
                        continue;
                    }
                }

                return(32);
            }
        }
示例#20
0
 public static void AreEqual(uint3 a, uint3 b)
 {
     AreEqual(a.x, b.x);
     AreEqual(a.y, b.y);
     AreEqual(a.z, b.z);
 }
示例#21
0
 public static void AreEqual(uint3 expected, uint3 actual)
 {
     AreEqual(expected.x, actual.x);
     AreEqual(expected.y, actual.y);
     AreEqual(expected.z, actual.z);
 }
示例#22
0
 public static extern CUResult cuMemcpyDtoH_v2(ref uint3 dstHost, CUdeviceptr srcDevice, SizeT ByteCount);
示例#23
0
 public uint3x2(float v)
 {
     this.c0 = (uint3)v;
     this.c1 = (uint3)v;
 }
示例#24
0
 public uint3x2(int3x2 v)
 {
     this.c0 = (uint3)v.c0;
     this.c1 = (uint3)v.c1;
 }
示例#25
0
 public uint3x2(int v)
 {
     this.c0 = (uint3)v;
     this.c1 = (uint3)v;
 }
示例#26
0
 public static uint3x2 uint3x2(uint3 c0, uint3 c1)
 {
     return(new uint3x2(c0, c1));
 }
示例#27
0
 public uint3x2(bool3x2 v)
 {
     this.c0 = math.select(new uint3(0u), new uint3(1u), v.c0);
     this.c1 = math.select(new uint3(0u), new uint3(1u), v.c1);
 }
示例#28
0
 public uint3x2(uint v)
 {
     this.c0 = v;
     this.c1 = v;
 }
示例#29
0
 public uint3x2(uint3 c0, uint3 c1)
 {
     this.c0 = c0;
     this.c1 = c1;
 }
示例#30
0
 public uint3x2(double v)
 {
     this.c0 = (uint3)v;
     this.c1 = (uint3)v;
 }
示例#31
0
 private static int ConvertToInt(uint3 result)
 {
     return((int)(result.x + result.y * 10 + result.z * 100));
 }