Exemple #1
0
        /// <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);
 }
Exemple #5
0
        /// <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;
            }
        }