예제 #1
0
        public bool MoveNext()
        {
            int i;

            for (i = startIndex; i < endIndex - _pc.particlesLimit; i++)
            {
                Vector3 randomVector;
                RandomVector((uint)i + 1, out randomVector);
                Cross(ref randomVector, ref _particleDataArr[i].basePosition, out randomVector);

                randomVector.Normalize();

#if UNITY_2018_1_OR_NEWER && USE_NATIVE_ARRAYS
                Vector3 position;
                rotate_position(ref _particleDataArr[i].basePosition,
                                ref randomVector, _particleDataArr[i].rotationSpeed * MillionPointsCPU._time,
                                out position);

                _gpuparticleDataArr[i] = new GPUParticleData(position, _gpuparticleDataArr[i].albedo);
#else
                rotate_position(ref _particleDataArr[i].basePosition,
                                ref randomVector, _particleDataArr[i].rotationSpeed * MillionPointsCPU._time,
                                out _gpuparticleDataArr[i].position);
#endif
            }

            var value = i - startIndex;
            Interlocked.Add(ref _pc.particlesTransformed, value);

            return(false);
        }
예제 #2
0
        void InitializeDataForDrawMeshInstancedIndirect()
        {
            _cpuParticleDataArr = new CPUParticleData[_particleCount];
#if UNITY_2018_1_OR_NEWER && USE_NATIVE_ARRAYS
            _gpuparticleDataArr = new NativeArray <GPUParticleData>((int)_particleCount, Allocator.Persistent);
#else
            _gpuparticleDataArr = new GPUParticleData[_particleCount];
#endif
            _particleDataBuffer = new ComputeBuffer((int)_particleCount, Marshal.SizeOf(typeof(GPUParticleData)));
            // set default position
            for (int i = 0; i < _particleCount; i++)
            {
                _cpuParticleDataArr[i].basePosition = new Vector3(Random.Range(-10.0f, 10.0f),
                                                                  Random.Range(-10.0f, 10.0f), Random.Range(-10.0f, 10.0f));
                _cpuParticleDataArr[i].rotationSpeed = Random.Range(1.0f, 100.0f);
            }

            for (int i = 0; i < _particleCount; i++)
            {
                _gpuparticleDataArr[i] =
                    new GPUParticleData(new Vector3(Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f),
                                                    Random.Range(0.0f, 1.0f)));
            }

            // creat point mesh
            _pointMesh          = new Mesh();
            _pointMesh.vertices = new[] { new Vector3(0, 0) };
            _pointMesh.normals  = new[] { new Vector3(0, 1, 0) };
            _pointMesh.SetIndices(new[] { 0 }, MeshTopology.Points, 0);

            _GPUInstancingArgsBuffer = new ComputeBuffer(1
                                                         , _GPUInstancingArgs.Length * sizeof(uint)
                                                         , ComputeBufferType.IndirectArguments);
            _GPUInstancingArgs[0] = (_pointMesh != null) ? _pointMesh.GetIndexCount(0) : 0;
            _GPUInstancingArgs[1] = _particleCount;
            _GPUInstancingArgsBuffer.SetData(_GPUInstancingArgs);

            var materialShader = Shader.Find("Custom/MillionPointsCPU");
            _material.shader = materialShader;
            _material.SetBuffer("_ParticleDataBuffer", _particleDataBuffer);
        }
예제 #3
0
        public void Update(int i)
        {
            Vector3 randomVector;

            RandomVector((uint)i + 1, out randomVector);
            Cross(ref randomVector, ref _particleDataArr[i].basePosition, out randomVector);

            randomVector.Normalize();
#if UNITY_2018_1_OR_NEWER && USE_NATIVE_ARRAYS
            Vector3 position;
            rotate_position(ref _particleDataArr[i].basePosition,
                            ref randomVector, _particleDataArr[i].rotationSpeed * MillionPointsCPU._time,
                            out position);

            _gpuparticleDataArr[i] = new GPUParticleData(position, _gpuparticleDataArr[i].albedo);
#else
            rotate_position(ref _particleDataArr[i].basePosition,
                            ref randomVector, _particleDataArr[i].rotationSpeed * MillionPointsCPU._time,
                            out _gpuparticleDataArr[i].position);
#endif
        }