コード例 #1
0
        public CricleDataBase(int size = 1, S para = default)
        {
            LogTool.LogAssertIsTrue(size > 0, "size should be bigger than 0");
            this.cricleIndexer = new CricleIndexer(size, 0);

            var c = 0;

            while (c++ < size)
            {
                this.dataList.Add(this.OnCreate(para));
            }
        }
コード例 #2
0
ファイル: BitonicSort.cs プロジェクト: vanish87/UnityTools
        public void Sort(ref GPUBufferVariable <T> source)
        {
            LogTool.LogAssertIsTrue(Mathf.IsPowerOfTwo(source.Size), "num of source should be power of 2");
            LogTool.LogAssertIsTrue(source.Size >= BITONIC_BLOCK_SIZE * TRANSPOSE_BLOCK_SIZE, "source size must bigger than " + (BITONIC_BLOCK_SIZE * TRANSPOSE_BLOCK_SIZE));

            if (this.tempBuffer == null || this.tempBuffer.Size != source.Size)
            {
                this.tempBuffer.InitBuffer(source.Size);
            }
            ComputeShader sortCS = this.bitonicCS;

            int KERNEL_ID_BITONICSORT = sortCS.FindKernel("BitonicSort");
            int KERNEL_ID_TRANSPOSE   = sortCS.FindKernel("MatrixTranspose");

            uint NUM_ELEMENTS  = (uint)source.Size;
            uint MATRIX_WIDTH  = BITONIC_BLOCK_SIZE;
            uint MATRIX_HEIGHT = (uint)NUM_ELEMENTS / BITONIC_BLOCK_SIZE;

            for (uint level = 2; level <= BITONIC_BLOCK_SIZE; level <<= 1)
            {
                SetGPUSortConstants(sortCS, level, level, MATRIX_HEIGHT, MATRIX_WIDTH);

                // Sort the row data
                sortCS.SetBuffer(KERNEL_ID_BITONICSORT, "Data", source);
                sortCS.Dispatch(KERNEL_ID_BITONICSORT, (int)(NUM_ELEMENTS / BITONIC_BLOCK_SIZE), 1, 1);
            }

            // Then sort the rows and columns for the levels > than the block size
            // Transpose. Sort the Columns. Transpose. Sort the Rows.
            for (uint level = (BITONIC_BLOCK_SIZE << 1); level <= NUM_ELEMENTS; level <<= 1)
            {
                // Transpose the data from buffer 1 into buffer 2
                SetGPUSortConstants(sortCS, level / BITONIC_BLOCK_SIZE, (level & ~NUM_ELEMENTS) / BITONIC_BLOCK_SIZE, MATRIX_WIDTH, MATRIX_HEIGHT);
                sortCS.SetBuffer(KERNEL_ID_TRANSPOSE, "Input", source);
                sortCS.SetBuffer(KERNEL_ID_TRANSPOSE, "Data", tempBuffer);
                sortCS.Dispatch(KERNEL_ID_TRANSPOSE, (int)(MATRIX_WIDTH / TRANSPOSE_BLOCK_SIZE), (int)(MATRIX_HEIGHT / TRANSPOSE_BLOCK_SIZE), 1);

                // Sort the transposed column data
                sortCS.SetBuffer(KERNEL_ID_BITONICSORT, "Data", tempBuffer);
                sortCS.Dispatch(KERNEL_ID_BITONICSORT, (int)(NUM_ELEMENTS / BITONIC_BLOCK_SIZE), 1, 1);

                // Transpose the data from buffer 2 back into buffer 1
                SetGPUSortConstants(sortCS, BITONIC_BLOCK_SIZE, level, MATRIX_HEIGHT, MATRIX_WIDTH);
                sortCS.SetBuffer(KERNEL_ID_TRANSPOSE, "Input", tempBuffer);
                sortCS.SetBuffer(KERNEL_ID_TRANSPOSE, "Data", source);
                sortCS.Dispatch(KERNEL_ID_TRANSPOSE, (int)(MATRIX_HEIGHT / TRANSPOSE_BLOCK_SIZE), (int)(MATRIX_WIDTH / TRANSPOSE_BLOCK_SIZE), 1);

                // Sort the row data
                sortCS.SetBuffer(KERNEL_ID_BITONICSORT, "Data", source);
                sortCS.Dispatch(KERNEL_ID_BITONICSORT, (int)(NUM_ELEMENTS / BITONIC_BLOCK_SIZE), 1, 1);
            }
        }
コード例 #3
0
ファイル: Vector.cs プロジェクト: vanish87/UnityTools
        public static Vector <T> Sub(int from, int to, Vector <T> src)
        {
            LogTool.LogAssertIsTrue(to > from && from >= 0, "Vector index Error");
            var ret   = new Vector <T>(to - from);
            var count = 0;

            for (var i = from; i < to; ++i)
            {
                ret[count++] = src[i];
            }

            return(ret);
        }
コード例 #4
0
ファイル: Vector.cs プロジェクト: vanish87/UnityTools
        public static Vector <T> operator /(Vector <T> a, float b)
        {
            dynamic rhs = b;

            LogTool.LogAssertIsTrue(rhs != 0, "Vector size is not same");
            var ret = new Vector <T>(a.Size);

            for (var i = 0; i < a.Size; ++i)
            {
                dynamic lhs = a[i];
                ret[i] = lhs / rhs;
            }
            return(ret);
        }
コード例 #5
0
ファイル: Vector.cs プロジェクト: vanish87/UnityTools
        public static Vector <T> operator -(Vector <T> a, Vector <T> b)
        {
            LogTool.LogAssertIsTrue(a.Size == b.Size, "Vector size is not same");

            var ret = new Vector <T>(a.Size);

            for (var i = 0; i < a.Size; ++i)
            {
                dynamic lhs = a[i];
                dynamic rhs = b[i];
                ret[i] = lhs - rhs;
            }
            return(ret);
        }
コード例 #6
0
        protected void Start()
        {
            this.function = this.GetComponentInChildren <IFunctionProvider>()?.Function;
            LogTool.LogAssertIsTrue(this.function != null, "Cannot find function");

            this.matrial = new DisposableMaterial(new Material(Shader.Find("Diffuse")));
            this.matrial.Data.SetInt("_Cull", (int)UnityEngine.Rendering.CullMode.Off);

            var meshFiter  = this.gameObject.FindOrAddTypeInComponentsAndChildren <MeshFilter>();
            var meshRender = this.gameObject.FindOrAddTypeInComponentsAndChildren <MeshRenderer>();

            meshRender.material = this.matrial;


            var mesh = FunctionTool.GenerateFunctionMesh(this.function);

            meshFiter.mesh = mesh;
        }
コード例 #7
0
        public override ISolution Solve(IProblem problem)
        {
            LogTool.LogAssertIsTrue(this.dt != null, "Dt is null");
            var sol = new Solution();
            var p   = this.problem as Problem;

            p.Next.Generate(null);

            var current = p.Current.Evaluate(null);
            var next    = p.Next.Evaluate(null);

            var useNext = this.ShouldUseNext(current, next);

            if (useNext)
            {
                p.MoveToNext();
            }

            p.Cool(useNext);

            sol.Current = p.Current;

            return(sol);
        }
コード例 #8
0
 public CricleIndexer(int size, int current)
 {
     LogTool.LogAssertIsTrue(size > 0, "size should be bigger than 0");
     this.size    = size;
     this.current = this.GetIndex(current);
 }
コード例 #9
0
 public CricleIndexer(int size)
 {
     LogTool.LogAssertIsTrue(size > 0, "size should be bigger than 0");
     this.size    = size;
     this.current = -1;
 }