Beispiel #1
0
        private static bool CheckCluster(Dictionary <Vector2Int, int> targetDict, Vector3Int triangle, out Vector4Int cluster)
        {
            cluster = new Vector4Int();
            NativeArray <Vector2Int> waitingTarget = new NativeArray <Vector2Int>(3, Allocator.Temp, NativeArrayOptions.UninitializedMemory);
            NativeArray <int>        currentTarget = new NativeArray <int>(3, Allocator.Temp, NativeArrayOptions.UninitializedMemory);

            waitingTarget[0] = new Vector2Int(triangle.y, triangle.x);
            waitingTarget[1] = new Vector2Int(triangle.z, triangle.y);
            waitingTarget[2] = new Vector2Int(triangle.x, triangle.z);
            currentTarget[0] = triangle.z;
            currentTarget[1] = triangle.x;
            currentTarget[2] = triangle.y;
            for (int i = 0; i < 3; ++i)
            {
                int value;
                if (targetDict.TryGetValue(waitingTarget[i], out value))
                {
                    targetDict.Remove(waitingTarget[i]);
                    targetDict.Remove(new Vector2Int(waitingTarget[i].y, value));
                    targetDict.Remove(new Vector2Int(value, waitingTarget[i].x));
                    cluster = new Vector4Int(currentTarget[i], waitingTarget[i].y, waitingTarget[i].x, value);
                    return(true);
                }
            }
            targetDict[new Vector2Int(triangle.x, triangle.y)] = triangle.z;
            targetDict[new Vector2Int(triangle.z, triangle.x)] = triangle.y;
            targetDict[new Vector2Int(triangle.y, triangle.z)] = triangle.x;
            waitingTarget.Dispose();
            currentTarget.Dispose();
            return(false);
        }
Beispiel #2
0
        public static void SetPointToVoxel(Vector4Int points, NativeList <Point> allPoints, List <Fragment>[,,] voxel, Vector3 leftPoint, Vector3 extent)
        {
            Vector3 position = allPoints[points.x].vertex
                               + allPoints[points.y].vertex
                               + allPoints[points.z].vertex
                               + allPoints[points.w].vertex;

            position /= 4;
            Vector3    distToLeft = position - leftPoint;
            Vector3Int voxelIndex = GetVoxel(distToLeft, extent);
            Fragment   frag;

            frag.indices  = points;
            frag.voxel    = voxelIndex;
            frag.position = position;
            List <Fragment> lists = voxel[voxelIndex.x, voxelIndex.y, voxelIndex.z];

            lock (lists)
            {
                lists.Add(frag);
            }
        }
        protected override void Init(PipelineResources resources)
        {
            block     = new MaterialPropertyBlock();
            objBuffer = new ComputeBuffer(characterPoints.Length, sizeof(AnimState));
            Matrix4x4[] bindPosesArray = targetMesh.bindposes;
            bindPoseCount = bindPosesArray.Length;
            bonesBuffer   = new ComputeBuffer(bindPoseCount * characterPoints.Length, sizeof(Matrix3x4));
            bindBuffer    = new ComputeBuffer(bindPoseCount, sizeof(Matrix3x4));
            NativeArray <Matrix3x4> bindNative = new NativeArray <Matrix3x4>(bindPoseCount, Allocator.Temp, NativeArrayOptions.UninitializedMemory);
            Matrix3x4 *bindPtr = bindNative.Ptr();

            for (int i = 0; i < bindPoseCount; ++i)
            {
                *bindPtr = new Matrix3x4(ref bindPosesArray[i]);
                bindPtr++;
            }
            bindBuffer.SetData(bindNative);
            bindNative.Dispose();
            int[]                   triangles     = targetMesh.triangles;
            Vector3[]               vertices      = targetMesh.vertices;
            Vector3[]               normals       = targetMesh.normals;
            Vector4[]               tangents      = targetMesh.tangents;
            BoneWeight[]            weights       = targetMesh.boneWeights;
            Vector2[]               uv            = targetMesh.uv;
            NativeArray <SkinPoint> allSkinPoints = new NativeArray <SkinPoint>(triangles.Length, Allocator.Temp, NativeArrayOptions.UninitializedMemory);
            SkinPoint *             pointsPtr     = allSkinPoints.Ptr();

            for (int i = 0; i < triangles.Length; ++i)
            {
                SkinPoint *currentPtr = pointsPtr + i;
                int        index      = triangles[i];
                currentPtr->position = vertices[index];
                currentPtr->tangent  = tangents[index];
                currentPtr->normal   = normals[index];
                ref BoneWeight bone = ref weights[index];
                currentPtr->boneWeight = new Vector4(bone.weight0, bone.weight1, bone.weight2, bone.weight3);
                currentPtr->boneIndex  = new Vector4Int(bone.boneIndex0, bone.boneIndex1, bone.boneIndex2, bone.boneIndex3);
                currentPtr->uv         = uv[index];
            }