/// <summary> /// パーティクル削除 /// </summary> /// <param name="index"></param> public void RemoveParticle(ChunkData c) { for (int i = 0; i < c.dataLength; i++) { int pindex = c.startIndex + i; var pf = flagList[pindex]; // コライダーカウント if (pf.IsCollider()) { colliderCount--; } } flagList.RemoveChunk(c); teamIdList.RemoveChunk(c); posList.RemoveChunk(c); rotList.RemoveChunk(c); oldPosList.RemoveChunk(c); oldRotList.RemoveChunk(c); oldSlowPosList.RemoveChunk(c); localPosList.RemoveChunk(c); basePosList.RemoveChunk(c); baseRotList.RemoveChunk(c); depthList.RemoveChunk(c); radiusList.RemoveChunk(c); frictionList.RemoveChunk(c); velocityList.RemoveChunk(c); nextPos0List.RemoveChunk(c); nextPos1List.RemoveChunk(c); nextRot0List.RemoveChunk(c); nextRot1List.RemoveChunk(c); restoreTransformIndexList.RemoveChunk(c); transformIndexList.RemoveChunk(c); }
//========================================================================================= /// <summary> /// データチャンクの追加 /// </summary> /// <param name="length"></param> /// <returns></returns> public ChunkData AddChunk(int length) { // 再利用チェック for (int i = 0; i < emptyChunkList.Count; i++) { var cdata = emptyChunkList[i]; if (cdata.dataLength >= length) { // このチャンクを再利用する int remainder = cdata.dataLength - length; if (remainder > 0) { // 分割 var rchunk = new ChunkData() { chunkNo = ++chunkSeed, startIndex = cdata.startIndex + length, dataLength = remainder, }; emptyChunkList[i] = rchunk; } else { emptyChunkList.RemoveAt(i); } cdata.dataLength = length; // 使用リストに追加 useChunkList.Add(cdata); return(cdata); } } // 新規追加 var data = new ChunkData() { chunkNo = ++chunkSeed, startIndex = useLength, dataLength = length, useLength = 0, }; useChunkList.Add(data); useLength += length; if (nativeArray.Length < useLength) { // 拡張 int len = nativeArray.Length; while (len < useLength) { len += Mathf.Min(len, 4096); } var nativeArray2 = new NativeArray <T>(len, Allocator.Persistent); nativeArray2.CopyFromFast(nativeArray); nativeArray.Dispose(); nativeArray = nativeArray2; nativeLength = nativeArray.Length; } return(data); }
public ChunkData ClearData(ChunkData chunk) { nativeArray.SetValue(chunk.startIndex, chunk.dataLength, emptyElement); chunk.useLength = 0; return(chunk); }
/// <summary> /// データチャンクの削除 /// </summary> /// <param name="chunk"></param> public void RemoveChunk(ChunkData chunk) { RemoveChunk(chunk.chunkNo); }
/// <summary> /// パーティクルの有効フラグ設定 /// </summary> /// <param name="c"></param> /// <param name="sw"></param> public void SetEnable( ChunkData c, bool sw, System.Func <int, Transform> funcTarget, System.Func <int, float3> funcLpos, System.Func <int, quaternion> funcLrot ) { for (int i = 0; i < c.dataLength; i++) { int index = c.startIndex + i; var flag = flagList[index]; flag.SetEnable(sw); if (sw) { // 有効化 // 位置リセットフラグも立てる flag.SetFlag(Flag_Reset_Position, true); // ボーン登録 if (funcTarget != null) { var target = funcTarget(i); if (target != null) { // 復元トランスフォーム if (flag.IsRestoreTransform() && restoreTransformIndexList[index] == -1) { float3 lpos = funcLpos != null?funcLpos(i) : 0; quaternion lrot = funcLrot != null?funcLrot(i) : quaternion.identity; restoreTransformIndexList[index] = Bone.AddRestoreBone(target, lpos, lrot); } // 読み込みトランスフォーム if (flag.IsReadTransform() && transformIndexList[index] == -1) { // パーティクル書き戻し判定 int windex = flag.IsWriteTransform() ? index : -1; // 親トランスフォームの参照の有無 bool parent = flag.IsParentTransform(); transformIndexList[index] = Bone.AddBone(target, windex, parent); } } } } else { // 無効化 // ボーン登録解除 // 復元トランスフォーム if (flag.IsRestoreTransform()) { var restoreTransformIndex = restoreTransformIndexList[index]; if (restoreTransformIndex >= 0) { Bone.RemoveRestoreBone(restoreTransformIndex); restoreTransformIndexList[index] = -1; } } // 読み込み/書き込みトランスフォーム if (flag.IsReadTransform()) { var transformIndex = transformIndexList[index]; if (transformIndex >= 0) { int windex = flag.IsWriteTransform() ? index : -1; Bone.RemoveBone(transformIndex, windex); transformIndexList[index] = -1; } } } flagList[index] = flag; } }