예제 #1
0
        private void comboBoxSourceNmlMonoBehaviour_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                comboBoxSourceMesh.Items.Clear();
                RefreshLabelSourceWarning();

                Tuple <string, string> item = (Tuple <string, string>)comboBoxSourceNmlMonoBehaviour.SelectedItem;
                if (item == null || item.Item2 == null)
                {
                    toolTip1.SetToolTip(comboBoxSourceNmlMonoBehaviour, null);
                    return;
                }

                NmlMonoBehaviour       srcNmlParser = (NmlMonoBehaviour)Gui.Scripting.Variables[item.Item2];
                NmlMonoBehaviourEditor srcNmlEditor = new NmlMonoBehaviourEditor(srcNmlParser);
                int selectIdx = -1;
                for (int i = 0; i < srcNmlEditor.GenericMonos.Count; i++)
                {
                    Tuple <string, int> obj = new Tuple <string, int>(srcNmlEditor.GenericMonos[i].ObjectName, i);
                    comboBoxSourceMesh.Items.Add(obj);
                    if (listViewNmlMeshes.SelectedIndices.Count > 0 && obj.Item1 == listViewNmlMeshes.SelectedItems[0].Text)
                    {
                        selectIdx = i;
                    }
                }
                comboBoxSourceMesh.SelectedIndex = selectIdx < 0 && comboBoxSourceMesh.Items.Count > 0 ? 0 : selectIdx;

                string tip = item.Item1 + " (" + ((NmlMonoBehaviour)Gui.Scripting.Variables[item.Item2]).file.Parser.FilePath + ")";
                toolTip1.SetToolTip(comboBoxSourceNmlMonoBehaviour, tip);
            }
            catch (Exception ex)
            {
                Utility.ReportException(ex);
            }
        }
예제 #2
0
        public void ComputeMinMaxNormals(object[] nmlMeshIds, AnimatorEditor dstAnimatorEditor, NmlMonoBehaviourEditor srcNmlEditor, int srcNmlMeshId, AnimatorEditor srcAnimatorEditor, object[] adjacentAnimatorEditorMeshIdPairs, double adjacentSquaredDistance, bool worldCoordinates)
        {
            foreach (double id in nmlMeshIds)
            {
                int dstMeshRId = dstAnimatorEditor.GetMeshRendererId(GenericMonos[(int)id].ObjectName);
                SkinnedMeshRenderer       dstSMesh    = (SkinnedMeshRenderer)dstAnimatorEditor.Meshes[dstMeshRId];
                Operations.vMesh          dstVMesh    = new Operations.vMesh(dstSMesh, false, false);
                List <Operations.vVertex> dstVertList = dstVMesh.submeshes[0].vertexList;
                for (int i = 1; i < dstVMesh.submeshes.Count; i++)
                {
                    dstVertList.AddRange(dstVMesh.submeshes[i].vertexList);
                }
                Transform meshTransform       = dstSMesh.m_GameObject.instance.FindLinkedComponent(typeof(Transform));
                Matrix    meshTransformMatrix = Transform.WorldTransform(meshTransform);
                foreach (var vert in dstVertList)
                {
                    vert.position = Vector3.TransformCoordinate(vert.position, meshTransformMatrix);
                }

                int srcMeshRId = srcAnimatorEditor.GetMeshRendererId(srcNmlMeshId < 0 ? dstSMesh.m_GameObject.instance.m_Name : srcNmlEditor.GenericMonos[srcNmlMeshId].ObjectName);
                SkinnedMeshRenderer       srcSMesh    = (SkinnedMeshRenderer)srcAnimatorEditor.Meshes[srcMeshRId];
                Operations.vMesh          srcVMesh    = new Operations.vMesh(srcSMesh, false, false);
                List <Operations.vVertex> srcVertList = srcVMesh.submeshes[0].vertexList;
                for (int i = 1; i < srcVMesh.submeshes.Count; i++)
                {
                    srcVertList.AddRange(srcVMesh.submeshes[i].vertexList);
                }
                meshTransform       = srcSMesh.m_GameObject.instance.FindLinkedComponent(typeof(Transform));
                meshTransformMatrix = Transform.WorldTransform(meshTransform);
                foreach (var vert in srcVertList)
                {
                    vert.position = Vector3.TransformCoordinate(vert.position, meshTransformMatrix);
                }

                GenericMono dstGenMono = GenericMonos.Find
                                         (
                    delegate(GenericMono m)
                {
                    return(m.ObjectName == dstSMesh.m_GameObject.instance.m_Name);
                }
                                         );
                if (dstGenMono == null)
                {
                    dstGenMono            = new GenericMono();
                    dstGenMono.ObjectName = dstSMesh.m_GameObject.instance.m_Name;
                    GenericMonos.Add(dstGenMono);
                }
                else
                {
                    dstGenMono.NormalMin.Clear();
                    dstGenMono.NormalMax.Clear();
                }

                GenericMono srcGenMono = srcNmlMeshId < 0
                                        ? srcNmlEditor.GenericMonos.Find
                                         (
                    delegate(GenericMono m)
                {
                    return(m.ObjectName == dstSMesh.m_GameObject.instance.m_Name);
                }
                                         )
                                        : srcNmlEditor.GenericMonos[srcNmlMeshId];
                if (srcGenMono == null)
                {
                    throw new Exception("Source GenericMono for " + dstSMesh.m_GameObject.instance.m_Name + " not found");
                }
                if (srcGenMono.NormalMin.Count != srcVertList.Count)
                {
                    throw new Exception("Source GenericMono for " + dstSMesh.m_GameObject.instance.m_Name + " has " + srcGenMono.NormalMin.Count + " normals, but the source mesh has " + srcVertList.Count + " vertices.");
                }

                for (int i = 0; i < dstVertList.Count; i++)
                {
                    var   vert       = dstVertList[i];
                    int   vertIdx    = -1;
                    float minDistPos = float.MaxValue;
                    float minDistUV  = float.MaxValue;
                    for (int j = 0; j < srcVertList.Count; j++)
                    {
                        var   srcVert    = srcVertList[j];
                        float distSquare = (vert.position - srcVert.position).LengthSquared();
                        if (distSquare < minDistPos)
                        {
                            vertIdx = j;
                            if ((minDistPos = distSquare) == 0)
                            {
                                distSquare = (new Vector2(vert.uv[0], vert.uv[1]) - new Vector2(srcVert.uv[0], srcVert.uv[1])).LengthSquared();
                                if (distSquare < minDistUV)
                                {
                                    if ((minDistUV = distSquare) == 0)
                                    {
                                        break;
                                    }
                                }
                            }
                        }
                        else if (distSquare == minDistPos)
                        {
                            distSquare = (new Vector2(vert.uv[0], vert.uv[1]) - new Vector2(srcVert.uv[0], srcVert.uv[1])).LengthSquared();
                            if (distSquare < minDistUV)
                            {
                                vertIdx = j;
                                if ((minDistUV = distSquare) == 0)
                                {
                                    break;
                                }
                            }
                        }
                    }
                    dstGenMono.NormalMin.Add(vert.normal + srcGenMono.NormalMin[vertIdx] - srcGenMono.NormalMax[vertIdx]);
                    dstGenMono.NormalMax.Add(vert.normal);
                }

                if (adjacentAnimatorEditorMeshIdPairs != null)
                {
                    HashSet <int>      dstVertIndices = new HashSet <int>();
                    Operations.vMesh[] adjVMeshes     = new Operations.vMesh[adjacentAnimatorEditorMeshIdPairs.Length / 2];
                    for (int i = 0; i < adjacentAnimatorEditorMeshIdPairs.Length / 2; i++)
                    {
                        MeshRenderer adjMeshR = (MeshRenderer)((AnimatorEditor)adjacentAnimatorEditorMeshIdPairs[i * 2]).Meshes[(int)(double)adjacentAnimatorEditorMeshIdPairs[i * 2 + 1]];
                        Matrix       worldTransform;
                        if (worldCoordinates)
                        {
                            meshTransform  = adjMeshR.m_GameObject.instance.FindLinkedComponent(typeof(Transform));
                            worldTransform = Transform.WorldTransform(meshTransform);
                        }
                        else
                        {
                            worldTransform = Matrix.Identity;
                        }
                        Operations.vMesh adjVMesh = new Operations.vMesh(adjMeshR, false, false);
                        int adjVertsAdapted       = 0;
                        foreach (var adjSubmesh in adjVMesh.submeshes)
                        {
                            foreach (var adjVert in adjSubmesh.vertexList)
                            {
                                Vector3 adjPos = worldCoordinates
                                                                        ? Vector3.TransformCoordinate(adjVert.position, worldTransform)
                                                                        : adjVert.position;
                                for (int j = 0; j < dstVertList.Count; j++)
                                {
                                    var dstVert = dstVertList[j];
                                    if ((adjPos - dstVert.position).LengthSquared() < adjacentSquaredDistance)
                                    {
                                        if (dstVertIndices.Add(j))
                                        {
                                            dstGenMono.NormalMin[j] = dstGenMono.NormalMax[j] = (dstGenMono.NormalMin[j] + dstGenMono.NormalMax[j]) / 2;
                                        }
                                        adjVert.normal = dstGenMono.NormalMin[j];
                                        adjVertsAdapted++;
                                        break;
                                    }
                                }
                            }
                        }
                        if (adjVertsAdapted > 0)
                        {
                            adjVMeshes[i] = adjVMesh;
                            Report.ReportLog("Adjacent MeshRenderer " + adjMeshR.m_GameObject.instance.m_Name + " has " + adjVertsAdapted + " verts smaller squared distance than " + ((float)adjacentSquaredDistance).ToFloatString());
                        }
                    }

                    for (int i = 0; i < adjVMeshes.Length; i++)
                    {
                        var adjVMesh = adjVMeshes[i];
                        if (adjVMesh != null)
                        {
                            adjVMesh.Flush();
                            ((AnimatorEditor)adjacentAnimatorEditorMeshIdPairs[i * 2]).Changed = true;
                        }
                    }
                }
            }

            Parser.Param = GenericMonos;

            Changed = true;
        }
예제 #3
0
        public void ComputeMinMaxNormals(object[] nmlMeshIds, AnimatorEditor dstAnimatorEditor, NmlMonoBehaviour srcNmlParser, int srcNmlMeshId, AnimatorEditor srcAnimatorEditor, object[] adjacentAnimatorEditorMeshIdPairs, double adjacentSquaredDistance, bool worldCoordinates)
        {
            NmlMonoBehaviourEditor srcNmlEditor = new NmlMonoBehaviourEditor(srcNmlParser);

            ComputeMinMaxNormals(nmlMeshIds, dstAnimatorEditor, srcNmlEditor, srcNmlMeshId, srcAnimatorEditor, adjacentAnimatorEditorMeshIdPairs, adjacentSquaredDistance, worldCoordinates);
        }