private static BoneGraph makeBoneGraph(IPXPmx pmx) { BoneGraph boneGraph = new BoneGraph(); foreach (IPXBone bone in pmx.Bone) { Node boneNode = makeBoneNode(bone); /////////// // 4 種類のエッジを作成する // (1) 親 -> 子 (type=親子) // (2) 付与親 -> 子 (type=付与親) // (2) IKボーン -> IKターゲットボーン (type=IKターゲット) // (3) IKボーン -> IKリンクボーン (type=IKリンク) boneGraph.addNode(boneNode); // 4種に当てはまらないボーン用 // (1) IPXBone parentBone = bone.Parent; if (null != parentBone) { Node parentNode = makeBoneNode(parentBone); EdgeInfo info = new EdgeInfo(boneNode, "親子"); boneGraph.addEdge(parentNode, info); } // (2) if (null != bone.AppendParent && (bone.IsAppendRotation || bone.IsAppendTranslation)) { Node appendNode = makeBoneNode(bone.AppendParent); EdgeInfo info = new EdgeInfo(boneNode, "付与親"); info.setAttr( "weight", string.Format("{0:F3}", bone.AppendRatio)); boneGraph.addEdge(appendNode, info); } // (3), (4) if (bone.IsIK && null != bone.IK) { if (null != bone.IK.Target) { Node targetNode = makeBoneNode(bone.IK.Target); EdgeInfo targetInfo = new EdgeInfo( targetNode, "IKターゲット"); boneGraph.addEdge(boneNode, targetInfo); } foreach (IPXIKLink ikLink in bone.IK.Links) { Node linkNode = makeBoneNode(ikLink.Bone); EdgeInfo linkInfo = new EdgeInfo( linkNode, "IKリンク"); boneGraph.addEdge(boneNode, linkInfo); } } } return(boneGraph); }
internal void addEdge(Node fromNode, EdgeInfo info) { this.addNode(fromNode); this.addNode(info.toNode); this.directedEdges[fromNode].Item2.Add(info); }
internal static string determineStyle(EdgeInfo info) { return(styleLegend[info.type]); }