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); }
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); }
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 }