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(); }
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; }