Exemplo n.º 1
0
        public RenderTarget GetOrCreateRenderTarget()
        {
            EnsureDirectX();
            var scale = _impl.GetScaling();
            var size  = new IntSize(_impl.ActualWidth * scale.X, _impl.ActualHeight * scale.Y);
            var dpi   = scale * 96;

            if (_backBuffer != null && _backBuffer.Size == size)
            {
                return(_backBuffer.Target);
            }

            if (_image == null || _oldDpi.X != dpi.X || _oldDpi.Y != dpi.Y)
            {
                _image = new D3DImage(dpi.X, dpi.Y);
            }
            _impl.ImageSource = _image;

            RemoveAndDispose(ref _backBuffer);
            if (size == default(IntSize))
            {
                _image.Lock();
                _image.SetBackBuffer(D3DResourceType.IDirect3DSurface9, IntPtr.Zero);
                _image.Unlock();
                return(null);
            }
            _backBuffer = new SwapBuffer(size, dpi);

            return(_backBuffer.Target);
        }
Exemplo n.º 2
0
    // STARTUP.
    static void StartUp()
    {
        sGPUParticleSystemDictionary = new Dictionary <GPUParticleSystem, GPUParticleSystem>();

        sComputeShader                   = Resources.Load <ComputeShader>("GPUParticleSystem/Shaders/GPUParticleComputeShader");
        sKernelUpdate                    = sComputeShader.FindKernel("UPDATE");
        sKernelEmitt                     = sComputeShader.FindKernel("EMITT");
        sKernelResult                    = sComputeShader.FindKernel("RESULT");
        sKernelMergeInitSort             = sComputeShader.FindKernel("MERGE_INITSORT");
        sKernelSort                      = sComputeShader.FindKernel("SORT");
        sEmittMeshInfoDictionary         = new Dictionary <Mesh, EmittMeshInfo>();
        sGPUParticleAttractorBuffer      = new ComputeBuffer(sMaxAttractorCount, sizeof(float) * 8);
        sGPUParticleVectorFieldBuffer    = new ComputeBuffer(sMaxVectorFieldCount, sizeof(float) * 8);
        sGPUParticleSphereColliderBuffer = new ComputeBuffer(sMaxSphereColliderCount, sizeof(float) * 4);
        sGPUColliderResultSwapBuffer     = new SwapBuffer(2, sMaxGPUColliderCount, sizeof(int));

        sMergedPositionBuffer = new SwapBuffer(2, 1, sizeof(float) * 4);
        sMergedVelocityBuffer = new SwapBuffer(2, 1, sizeof(float) * 4);
        sMergedLifetimeBuffer = new SwapBuffer(2, 1, sizeof(float) * 4);

        sMergedColorBuffer        = new SwapBuffer(1, 1, sizeof(float) * 4);
        sMergedHaloBuffer         = new SwapBuffer(1, 1, sizeof(float) * 4);
        sMergedScaleBuffer        = new SwapBuffer(1, 1, sizeof(float) * 4);
        sMergedTransperancyBuffer = new SwapBuffer(1, 1, sizeof(float) * 4);

        sSortElementSwapBuffer = new SwapBuffer(2, 1, System.Runtime.InteropServices.Marshal.SizeOf(typeof(SortElement)));

        sRandomIndexBuffer = new ComputeBuffer(64, sizeof(int));

        // MATERIAL.
        sRenderMaterial = new Material(Resources.Load <Shader>("GPUParticleSystem/Shaders/GPUParticleRenderShader"));
    }
Exemplo n.º 3
0
    // INIT.
    private void InitSystem()
    {
        if (mDescriptor == null)
        {
            mDescriptor = new GPUParticleDescriptor();
        }

        mDescriptor.Update();

        mMaxParticleCount = (int)Mathf.Ceil(mDescriptor.EmittFrequency * mDescriptor.Lifetime);
        mLastPosition     = transform.position;

        sTotalParticleCount += mMaxParticleCount;

        // BUFFERS.
        mPositionBuffer = new SwapBuffer(2, mMaxParticleCount, sizeof(float) * 4);
        mVelocityBuffer = new SwapBuffer(2, mMaxParticleCount, sizeof(float) * 4);
        mLifetimeBuffer = new SwapBuffer(2, mMaxParticleCount, sizeof(float) * 4);

        mColorBuffer        = new ComputeBuffer(mMaxParticleCount, sizeof(float) * 4);
        mHaloBuffer         = new ComputeBuffer(mMaxParticleCount, sizeof(float) * 4);
        mScaleBuffer        = new ComputeBuffer(mMaxParticleCount, sizeof(float) * 4);
        mTransperancyBuffer = new ComputeBuffer(mMaxParticleCount, sizeof(float) * 4);

        {   // Set lifetime default (negative)value.
            float[] arr = new float[mMaxParticleCount * 4];
            for (int i = 0; i < mMaxParticleCount * 4; ++i)
            {
                arr[i] = -0.01f;
            }
            mLifetimeBuffer.GetInputBuffer().SetData(arr);
            mLifetimeBuffer.GetOutputBuffer().SetData(arr);
        }

        // MESH.
        UpdateMesh();

        //LIFETIME POINT BUFFERS
        // ------- Color ------
        UpdateLifetimeBuffer(out mColorLifetimePointsBuffer, mDescriptor.ColorOverLifetime.Get());

        // ------- Halo -------
        UpdateLifetimeBuffer(out mHaloLifetimePointsBuffer, mDescriptor.HaloOverLifetime.Get());

        // ------ Scale -------
        UpdateLifetimeBuffer(out mScaleLifetimePointsBuffer, mDescriptor.ScaleOverLifetime.Get());

        // ------ Opacity -----
        UpdateLifetimeBuffer(out mTransparencyLifetimePointsBuffer, mDescriptor.OpacityOverLifetime.Get());

        // COLLISION.
        mSphereColliderResultBuffer = new ComputeBuffer(sMaxSphereColliderCount, sizeof(int));
    }
Exemplo n.º 4
0
 public TreeView()
 {
     swap  = new SwapBuffer <TreeViewItem, TreeViewNode>(512);
     queue = new QueueBuffer <TreeViewItem>(256);
 }
Exemplo n.º 5
0
        /// <summary>
        /// 初期化処理
        /// </summary>
        void Start()
        {
            // パーティクル数を2の累乗に丸める(BiotonicSort用)
            int r = Mathf.CeilToInt(Mathf.Log(_particleNum, 2));

            _particleNum = (int)Mathf.Pow(2, r);

            // 体積/有効半径/パーティクル半径計算
            _volume          = _kernelParticles * _mass / _density;                      // カーネルパーティクル分の体積
            _effectiveRadius = Mathf.Pow((3.0f * _volume) / (4.0f * Mathf.PI), 1f / 3f); // 球の体積から有効半径を計算
            _particleRadius  = Mathf.Pow((Mathf.PI / (6.0f * _kernelParticles)), 1f / 3f) * _effectiveRadius;

            // グループ数計算
            _groupNum.x = Mathf.CeilToInt(_particleNum / THREAD_NUM_X) + 1;

            // カーネル関数の係数部分定義
            _particleComputeShader.SetFloat(CS_NAMES.WPOLY6, 315f / (64f * Mathf.PI * Mathf.Pow(_effectiveRadius, 9f)));
            _particleComputeShader.SetFloat(CS_NAMES.G_WPOLY6, -945f / (32f * Mathf.PI * Mathf.Pow(_effectiveRadius, 9f)));
            _particleComputeShader.SetFloat(CS_NAMES.L_WPOLY6, -945f / (32f * Mathf.PI * Mathf.Pow(_effectiveRadius, 9f)));
            _particleComputeShader.SetFloat(CS_NAMES.WSPIKY, 15f / (Mathf.PI * Mathf.Pow(_effectiveRadius, 6f)));
            _particleComputeShader.SetFloat(CS_NAMES.G_WSPIKY, -45f / (Mathf.PI * Mathf.Pow(_effectiveRadius, 6f)));
            _particleComputeShader.SetFloat(CS_NAMES.L_WSPIKY, -90f / (Mathf.PI * Mathf.Pow(_effectiveRadius, 6f)));
            _particleComputeShader.SetFloat(CS_NAMES.WVISC, 15f / (2f * Mathf.PI * Mathf.Pow(_effectiveRadius, 3f)));
            _particleComputeShader.SetFloat(CS_NAMES.G_WVISC, 15f / (2f * Mathf.PI * Mathf.Pow(_effectiveRadius, 3f)));
            _particleComputeShader.SetFloat(CS_NAMES.L_WVISC, 45f / (Mathf.PI * Mathf.Pow(_effectiveRadius, 6f)));

            // バッファの初期化
            _particleBuffer     = new SwapBuffer(_particleNum, Marshal.SizeOf(typeof(Particle)));
            _deltaDensBuffer    = new ComputeBuffer(_particleNum, sizeof(float));
            _cellStartEndBuffer = new ComputeBuffer(_nnSearchDivNum.x * _nnSearchDivNum.y * _nnSearchDivNum.z, Marshal.SizeOf(typeof(CellStartEnd)));
            _particleIdBuffer   = new ComputeBuffer(_particleNum, sizeof(int));

            _particleBuffer.Current.SetData(
                Enumerable.Range(0, _particleNum)
                .Select(_ => new Particle()
            {
                index         = _,
                pos           = Random.insideUnitSphere * initRadius,
                vel           = Vector3.zero,
                acc           = Vector3.zero,
                dens          = 0.0f,
                force         = Vector3.zero,
                prevPos       = Vector3.zero,
                scalingFactor = 0.0f,
                deltaPos      = Vector3.zero,
            }).ToArray()
                );

            _particleBuffer.Other.SetData(
                Enumerable.Range(0, _particleNum)
                .Select(_ => new Particle()
            {
                index         = _,
                pos           = Random.insideUnitSphere * initRadius,
                vel           = Vector3.zero,
                acc           = Vector3.zero,
                dens          = 0.0f,
                force         = Vector3.zero,
                prevPos       = Vector3.zero,
                scalingFactor = 0.0f,
                deltaPos      = Vector3.zero,
            }).ToArray()
                );

            _particleIdBuffer.SetData(
                Enumerable.Range(0, _particleNum).ToArray()
                );

            _particleComputeShader.SetVector(CS_NAMES.GRAVITY, _gravity);
            _particleComputeShader.SetFloat(CS_NAMES.EFFECTIVE_RADIUS, _effectiveRadius);
            _particleComputeShader.SetFloat(CS_NAMES.MASS, _mass);
            _particleComputeShader.SetFloat(CS_NAMES.VISCOSITY, _viscosity);
            _particleComputeShader.SetFloat(CS_NAMES.DENSITY, _density);
            _particleComputeShader.SetFloat(CS_NAMES.EPSILON, _epsilon);
            _particleComputeShader.SetBool(CS_NAMES.USE_ARTIFICIAL_PRESSURE, _useArtificialPressure);
            _particleComputeShader.SetFloat(CS_NAMES.AP_K, _ap_k);
            _particleComputeShader.SetFloat(CS_NAMES.AP_N, _ap_n);
            _particleComputeShader.SetFloat(CS_NAMES.AP_Q, _ap_q);
            _particleComputeShader.SetFloat(CS_NAMES.AP_WQ, KernelPoly6(_ap_q * _effectiveRadius, _effectiveRadius, 315f / (64f * Mathf.PI * Mathf.Pow(_effectiveRadius, 9f))));
            _particleComputeShader.SetFloat(CS_NAMES.WALL_STIFFNESS, _wallStiffness);

            _particleComputeShader.SetVector(CS_NAMES.SPACE_MIN, _spaceMin);
            _particleComputeShader.SetVector(CS_NAMES.SPACE_MAX, _spaceMax);
            _particleComputeShader.SetVector(CS_NAMES.MOUSE_POS, new Vector4(-1000.0f, -1000.0f, -1000.0f, 0f));

            _particleComputeShader.SetInts(CS_NAMES.NNSEARCH_DIM, new int[] { _nnSearchDivNum.x, _nnSearchDivNum.y, _nnSearchDivNum.z });
        }
Exemplo n.º 6
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="capacity">Capacity(number of elemets) of memory block.</param>
 /// <param name="stride">Stride of memory block.</param>
 /// <param name="type">Type of memory block.</param>
 public GPUMemoryBlock(int capacity, int stride, ComputeBufferType type)
 {
     mCapacity   = capacity;
     mStride     = stride;
     mSwapBuffer = new SwapBuffer(capacity, stride, type);
 }