コード例 #1
0
        void OnDrawGizmos()
        {
            Verify();

            if (!isRenderingEnabled)
            {
                return;
            }

            // return; // TODO: Remove?

            SplineGraphComponent.DrawSplineGraph(ref splineGraph, transform, gizmoSplineSegmentCount);

            // Debug only:
            if (!isEditingEnabled)
            {
                return;
            }
            UnityEditor.EditorApplication.QueuePlayerLoopUpdate();
            UnityEditor.SceneView.RepaintAll();
        }
コード例 #2
0
        public void BuildGraphFromInstances()
        {
            Verify();

            splineGraph.Clear();

            // 1) Append all graphs into single graph.
            for (int i = 0, iCount = SplineGraphComponent.instances.Count; i < iCount; ++i)
            {
                SplineGraphComponent instance = SplineGraphComponent.instances[i];
                instance.Verify();

                if (instance.type != type)
                {
                    continue;
                }

                Int16 vertexStart = (Int16)splineGraph.vertices.count;
                splineGraph.PushDirectedGraph(ref instance.splineGraph, Allocator.Persistent);
                Int16 vertexEnd = (Int16)splineGraph.vertices.count;

                // Transform vertices into splineGraphManager's coordinate system:
                Transform instanceTransform = instance.GetComponent <Transform>();
                for (Int16 v = vertexStart; v < vertexEnd; ++v)
                {
                    float3     position = splineGraph.payload.positions.data[v];
                    quaternion rotation = splineGraph.payload.rotations.data[v];
                    float2     scale    = splineGraph.payload.scales.data[v];
                    float2     leash    = splineGraph.payload.leashes.data[v];

                    float3 forwardOS                   = math.mul(rotation, new float3(0.0f, 0.0f, 1.0f));
                    float3 tangentOS                   = math.mul(rotation, new float3(1.0f, 0.0f, 0.0f));
                    float3 bitangentOS                 = math.mul(rotation, new float3(0.0f, 1.0f, 0.0f));
                    float3 forwardWS                   = instanceTransform.TransformVector(forwardOS);
                    float3 tangentWS                   = instanceTransform.TransformVector(tangentOS);
                    float3 bitangentWS                 = instanceTransform.TransformVector(bitangentOS);
                    float3 forwardMOS                  = transform.InverseTransformVector(forwardWS);
                    float3 tangentMOS                  = transform.InverseTransformVector(tangentWS);
                    float3 bitangentMOS                = transform.InverseTransformVector(bitangentWS);
                    float  mosFromInstanceOSScale      = math.length(forwardMOS);
                    float2 mosFromInstanceOSLeashScale = new float2(
                        math.length(tangentMOS),
                        math.length(bitangentMOS)
                        );

                    // Construct manager-object-space rotation from transformed frame, so that scale can be accounted for in final rotation.
                    // In particular, we care about this for using -1 scale to perform mirroring of graph in X, Y, or Z.
                    forwardMOS   = math.normalize(forwardMOS);
                    bitangentMOS = math.normalize(bitangentMOS);
                    quaternion rotationMOS = Quaternion.LookRotation(forwardMOS, bitangentMOS);

                    // Manager-Object-space from world-space * World-space from Instance-Object-space
                    position = instanceTransform.TransformPoint(position);
                    position = transform.InverseTransformPoint(position);
                    rotation = rotationMOS;
                    scale    = scale * mosFromInstanceOSScale;
                    leash    = leash * mosFromInstanceOSLeashScale;

                    splineGraph.payload.positions.data[v] = position;
                    splineGraph.payload.rotations.data[v] = rotation;
                    splineGraph.payload.scales.data[v]    = scale;
                    splineGraph.payload.leashes.data[v]   = leash;
                }
                for (Int16 v = vertexStart; v < vertexEnd; ++v)
                {
                    splineGraph.payload.VertexComputePayloads(ref splineGraph, v);
                }
            }

            // 2) Weld vertices.
            VertexWeldAllWithinThreshold();

            // 3)
            VertexWeldAllRedundant();

            // 4) Compact.
            BuildCompactGraph();

            // Need to set the dirty flag here because the call to Verify() above cleared any dirty flags that were possibly set by UndoRecord()
            // and we have just changed our runtime data representation.
            isDirty = true;
        }