Ejemplo n.º 1
0
        void UpdateMesh(MeshData data)
        {
            var trans = UpdateTransform(data.transform);

            if (trans == null)
            {
                return;
            }

            var data_trans = data.transform;
            var data_id    = data_trans.id;
            var path       = data_trans.path;

            Record rec = null;

            if (!m_clientObjects.TryGetValue(path, out rec))
            {
                m_hostObjects.TryGetValue(data_id, out rec);
            }
            if (rec == null)
            {
                Debug.LogError("Something wrong");
                return;
            }

            var target = rec.go.GetComponent <Transform>();
            var go     = target.gameObject;

            bool activeInHierarchy = go.activeInHierarchy;

            if (!activeInHierarchy && !data.flags.hasPoints)
            {
                return;
            }


            // allocate material list
            bool materialsUpdated = rec.BuildMaterialData(data);
            var  flags            = data.flags;
            bool skinned          = data.numBones > 0;

            // update mesh
            for (int si = 0; si < data.numSplits; ++si)
            {
                var t = target;
                if (si > 0)
                {
                    bool created = false;
                    t = FindOrCreateObjectByPath(path + "/[" + si + "]", true, ref created);
                    t.gameObject.SetActive(true);
                }

                var split = data.GetSplit(si);
                if (split.numPoints == 0 || split.numIndices == 0)
                {
                    rec.editMesh = null;
                }
                else
                {
                    rec.editMesh      = CreateEditedMesh(data, split);
                    rec.editMesh.name = si == 0 ? target.name : target.name + "[" + si + "]";
                }

                var smr = GetOrAddSkinnedMeshRenderer(t.gameObject, si > 0);
                if (smr != null)
                {
                    var old = smr.sharedMesh;
                    smr.sharedMesh = rec.editMesh;
                    DestroyIfNotAsset(old);

                    if (skinned)
                    {
                        // create bones
                        var paths = data.GetBonePaths();
                        var bones = new Transform[data.numBones];
                        for (int bi = 0; bi < bones.Length; ++bi)
                        {
                            bool created = false;
                            bones[bi] = FindOrCreateObjectByPath(paths[bi], true, ref created);
                            if (created)
                            {
                                var newrec = new Record
                                {
                                    go     = bones[bi].gameObject,
                                    recved = true,
                                };
                                if (m_clientObjects.ContainsKey(paths[bi]))
                                {
                                    m_clientObjects[paths[bi]] = newrec;
                                }
                                else
                                {
                                    m_clientObjects.Add(paths[bi], newrec);
                                }
                            }
                        }

                        if (bones.Length > 0)
                        {
                            bool created = false;
                            var  root    = FindOrCreateObjectByPath(data.rootBonePath, true, ref created);
                            if (root == null)
                            {
                                root = bones[0];
                            }
                            smr.rootBone = root;
                            smr.bones    = bones;
                        }
                    }
                    else
                    {
                        if (smr.rootBone != null)
                        {
                            smr.bones    = null;
                            smr.rootBone = null;
                        }
                    }
                }
            }

            int num_splits = Math.Max(1, data.numSplits);

            for (int si = num_splits; ; ++si)
            {
                bool created = false;
                var  t       = FindOrCreateObjectByPath(path + "/[" + si + "]", false, ref created);
                if (t == null)
                {
                    break;
                }
                DestroyImmediate(t.gameObject);
            }

            if (activeInHierarchy)
            {
                rec.go.SetActive(false); //
                rec.go.SetActive(true);  // force recalculate skinned mesh on editor. I couldn't find better way...
            }

            // assign materials if needed
            if (materialsUpdated)
            {
                AssignMaterials(rec);
            }
        }