// パーティクルごと public void Execute(int index) { // 初期化コピー var nextpos = nextPosList[index]; outNextPosList[index] = nextpos; // 頂点フラグ var flag = flagList[index]; if (flag.IsValid() == false || flag.IsFixed()) { return; } // チーム var team = teamDataList[teamIdList[index]]; if (team.IsActive() == false || team.clampDistanceGroupIndex < 0) { return; } // 更新確認 if (team.IsUpdate() == false) { return; } int pstart = team.particleChunk.startIndex; int vindex = index - pstart; // クロスごとの拘束データ var gdata = groupList[team.clampDistanceGroupIndex]; if (gdata.active == 0) { return; } // 参照データ情報 var refdata = refDataList[gdata.refChunk.startIndex + vindex]; if (refdata.count > 0) { int dataIndex = gdata.dataChunk.startIndex + refdata.startIndex; ClampDistanceData data = clampDistanceList[dataIndex]; if (data.IsValid() == false) { return; } // ターゲット int pindex2 = pstart + data.targetVertexIndex; float3 nextpos2 = nextPosList[pindex2]; // 現在のベクトル float3 v = nextpos - nextpos2; // 本来の長さ float length = math.distance(basePosList[index], basePosList[pindex2]); // ベクトル長クランプ //v = MathUtility.ClampVector(v, data.length * gdata.minRatio, data.length * gdata.maxRatio); v = MathUtility.ClampVector(v, length * gdata.minRatio, length * gdata.maxRatio); // 位置 var opos = nextpos; nextpos = nextpos2 + v; // 書き出し outNextPosList[index] = nextpos; // 速度影響 var av = (nextpos - opos) * (1.0f - gdata.velocityInfluence); posList[index] = posList[index] + av; } }
// パーティクルごと public void Execute(int index) { // 初期化コピー var nextpos = nextPosList[index]; outNextPosList[index] = nextpos; // 頂点フラグ var flag = flagList[index]; if (flag.IsValid() == false || flag.IsFixed()) { return; } // チーム var team = teamDataList[teamIdList[index]]; if (team.IsActive() == false || team.clampDistanceGroupIndex < 0) { return; } // 更新確認 if (team.IsUpdate() == false) { return; } int pstart = team.particleChunk.startIndex; int vindex = index - pstart; // クロスごとの拘束データ var gdata = groupList[team.clampDistanceGroupIndex]; if (gdata.active == 0) { return; } // 参照データ情報 var refdata = refDataList[gdata.refChunk.startIndex + vindex]; if (refdata.count > 0) { int dataIndex = gdata.dataChunk.startIndex + refdata.startIndex; ClampDistanceData data = clampDistanceList[dataIndex]; if (data.IsValid() == false) { return; } // ターゲット int pindex2 = pstart + data.targetVertexIndex; float3 nextpos2 = nextPosList[pindex2]; // 現在のベクトル float3 v = nextpos - nextpos2; // 復元長さ float length = data.length; // v1.7.0 length *= team.scaleRatio; // チームスケール倍率 //if (length == 0.0f) //{ // // 従来データ(basePosの長さから) // length = math.distance(basePosList[index], basePosList[pindex2]); //} // ベクトル長クランプ v = MathUtility.ClampVector(v, length * gdata.minRatio, length * gdata.maxRatio); // 位置 var opos = nextpos; nextpos = nextpos2 + v; // 摩擦係数から移動率を算出 float friction = frictionList[index]; float moveratio = math.saturate(1.0f - friction * Define.Compute.FrictionMoveRatio); nextpos = math.lerp(opos, nextpos, moveratio); // 書き出し outNextPosList[index] = nextpos; // 速度影響 var av = (nextpos - opos) * (1.0f - gdata.velocityInfluence); posList[index] = posList[index] + av; } }