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); }
// 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")); }
// 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)); }
public TreeView() { swap = new SwapBuffer <TreeViewItem, TreeViewNode>(512); queue = new QueueBuffer <TreeViewItem>(256); }
/// <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 }); }
/// <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); }