Ejemplo n.º 1
0
    public void SetPlayer(PdxAnimationPlayer p)
    {
        firstChange = true;

        if (p == null)
        {
            Hide();
        }
        else
        {
            panel.SetActive(true);
            player = p;

            slider.minValue = 1;
            slider.maxValue = p.animationData.sampleCount;

            imagePlayPause.texture = iconPause;
        }
    }
Ejemplo n.º 2
0
    public void LoadAnim(string path)
    {
        if (!string.IsNullOrEmpty(path) && File.Exists(path))
        {
            byte[] file = File.ReadAllBytes(path);

            if (selectedObject != null)
            {
                PdxAnimationPlayer p = selectedObject.GetComponent <PdxAnimationPlayer>();
                if (p != null)
                {
                    p.SetTpose();
                    Destroy(p);
                }

                p        = selectedObject.AddComponent <PdxAnimationPlayer>();
                animBase = p.animationData = CreatePdxAnimation(pds.ReadFromBuffer(file));
            }
        }
    }
Ejemplo n.º 3
0
    public IEnumerator _OpenFbx()
    {
        string lastPath = Application.dataPath;

        if (PlayerPrefs.HasKey("lastfbxpath"))
        {
            lastPath = PlayerPrefs.GetString("lastfbxpath");
        }

        string[] result = StandaloneFileBrowser.OpenFilePanel("Import model", lastPath, new[] { new ExtensionFilter("Supported formats ", "fbx", "obj"), new ExtensionFilter("OBJ file ", "obj") }, false);

        if (result.Length > 0)
        {
            for (int i = 0; i < hierarchyPanel.childCount; i++)
            {
                Destroy(hierarchyPanel.GetChild(i).gameObject);
            }
            for (int i = 0; i < canvasLocators.childCount; i++)
            {
                Destroy(canvasLocators.GetChild(i).gameObject);
            }

            meshPath.text = animPath.text = fbxPath.text = "";
            saveAnimButton.interactable = saveMeshButton.interactable = saveFbxButton.interactable = false;

            bigStatus.gameObject.SetActive(true);
            SetAttach(null);
            yield return(null);

            meshPath.text = result[0].Replace('\\', '/');
            PlayerPrefs.SetString("lastfbxpath", Path.GetDirectoryName(result[0]));
            PlayerPrefs.Save();

            loader.ClearScene();

            GameObject imported = null;

            imported = assimpLoader.LoadMesh(result[0]);

            PdxAnimationPlayer p = null;

            if (imported != null)
            {
                SkinnedMeshRenderer[] smrs = imported.GetComponentsInChildren <SkinnedMeshRenderer>();
                foreach (var smr in smrs)
                {
                    smr.gameObject.AddComponent <BoneViewer>();
                    //smr.sharedMaterials = new Material[] { smr.sharedMaterial, loader.materialHighlight };
                }

                MeshRenderer[] mrs = imported.GetComponentsInChildren <MeshRenderer>();

                foreach (var mr in mrs)
                {
                    mr.enabled = true;
                    //mr.sharedMaterials = new Material[] { mr.sharedMaterial, loader.materialHighlight };
                }

                loader.loadedObjects.Add(imported);
                loader.selectedObject = imported;

                p = imported.GetComponent <PdxAnimationPlayer>();
                animationPanel.SetPlayer(p);
            }

            StartCoroutine(AddShapesButtons());

            meshPath.text = "mesh can be saved for EU4";
            saveMeshButton.interactable = true;

            if (p != null)
            {
                animPath.text = "animation can be saved for EU4";
                saveAnimButton.interactable = true;
            }

            fbxPath.text = Path.GetFileName(result[0]);
            saveFbxButton.interactable = true;

            Status(fbxPath.text + " loaded!");
        }

        bigStatus.gameObject.SetActive(false);
    }
Ejemplo n.º 4
0
    public Base BaseFromGameObject(GameObject target)
    {
        Matrix4x4 world = target.transform.localToWorldMatrix;

        Vector3 lastPos = target.transform.position;

        PdxAnimationPlayer player = target.GetComponent <PdxAnimationPlayer>();

        if (player != null)
        {
            player.SetTpose();
        }

        target.transform.position = Vector3.zero;

        List <Transform> shapes = new List <Transform>();

        FindTagInChildren(shapes, target.transform, "Shape", target.transform);

        Base _base = new Base("PdxData", "object");

        Base _pdxasset = new Base("pdxasset", "int", _base);

        _pdxasset.value = new List <Base.Data>()
        {
            Base.Data.Int(1), Base.Data.Int(0)
        };

        Base _object = new Base("object", "object", _base);

        foreach (Transform sh in shapes)
        {
            MeshFilter          mf  = sh.GetComponent <MeshFilter>();
            MeshRenderer        mr  = sh.GetComponent <MeshRenderer>();
            SkinnedMeshRenderer smr = sh.GetComponent <SkinnedMeshRenderer>();

            PdxShape shapeData = sh.GetComponent <PdxShape>();

            bool isCollider = sh.gameObject.tag == "Collider";
            bool skinned    = smr != null;

            Mesh     mesh;
            Material mat;
            if (isCollider)
            {
                mesh = mf.mesh;
                mat  = null;
            }
            else if (skinned)
            {
                mesh = smr.sharedMesh;
                mat  = smr.material;
            }
            else
            {
                mesh = mf.mesh;
                mat  = mr.material;
            }

            Base _shape = _object.subNodes.ContainsKey(sh.name) ? _object.subNodes[sh.name] : new Base(sh.name.Replace(" Instance", ""), "object", _object);

            Base _mesh = new Base("mesh", "object", _shape);

            Base _p = new Base("p", "float", _mesh);
            foreach (Vector3 p in mesh.vertices)
            {
                Vector3 pW = world.MultiplyPoint3x4(p);
                _p.value.Add(Base.Data.Float(pW.x)); _p.value.Add(Base.Data.Float(pW.y)); _p.value.Add(Base.Data.Float(pW.z));
            }

            if (!isCollider)
            {
                Base _n = new Base("n", "float", _mesh);
                foreach (Vector3 n in mesh.normals)
                {
                    Vector3 nW = world.MultiplyPoint3x4(n);
                    _n.value.Add(Base.Data.Float(nW.x)); _n.value.Add(Base.Data.Float(nW.y)); _n.value.Add(Base.Data.Float(nW.z));
                }

                Base _ta = new Base("ta", "float", _mesh);
                foreach (Vector4 ta in mesh.tangents)
                {
                    Vector4 taW = world * ta;
                    _ta.value.Add(Base.Data.Float(taW.x)); _ta.value.Add(Base.Data.Float(taW.y)); _ta.value.Add(Base.Data.Float(taW.z)); _ta.value.Add(Base.Data.Float(taW.w));
                }

                Base _uv = new Base("u0", "float", _mesh);
                foreach (Vector2 uv in mesh.uv)
                {
                    _uv.value.Add(Base.Data.Float(uv.x)); _uv.value.Add(Base.Data.Float(uv.y));
                }

                if (mesh.uv2 != null && mesh.uv2.Length > 0)
                {
                    Base _uv1 = new Base("u1", "float", _mesh);
                    foreach (Vector2 uv2 in mesh.uv2)
                    {
                        _uv1.value.Add(Base.Data.Float(uv2.x)); _uv1.value.Add(Base.Data.Float(uv2.y));
                    }
                }
            }

            Base _tri = new Base("tri", "int", _mesh);
            foreach (int tri in mesh.triangles)
            {
                _tri.value.Add(Base.Data.Int(tri));
            }

            Base _aabb = new Base("aabb", "object", _mesh);

            Base _min = new Base("min", "float", _aabb);

            _min.value.Add(Base.Data.Float(mesh.bounds.min.x));
            _min.value.Add(Base.Data.Float(mesh.bounds.min.y));
            _min.value.Add(Base.Data.Float(mesh.bounds.min.z));

            Base _max = new Base("max", "float", _aabb);

            _max.value.Add(Base.Data.Float(mesh.bounds.max.x));
            _max.value.Add(Base.Data.Float(mesh.bounds.max.y));
            _max.value.Add(Base.Data.Float(mesh.bounds.max.z));

            Base _material = new Base("material", "object", _mesh);

            Base _shader = new Base("shader", "string", _material); _shader.nullByteString = true;

            if (!isCollider)
            {
                _shader.value.Add(Base.Data.String(shapeData.shader));

                if (!string.IsNullOrEmpty(shapeData.diffuse))
                {
                    Base _diff = new Base("diff", "string", _material); _diff.nullByteString = true;
                    _diff.value.Add(Base.Data.String(Path.GetFileName(shapeData.diffuse)));
                }

                if (!string.IsNullOrEmpty(shapeData.normal))
                {
                    Base _normal = new Base("n", "string", _material); _normal.nullByteString = true;
                    _normal.value.Add(Base.Data.String(Path.GetFileName(shapeData.normal)));
                }

                if (!string.IsNullOrEmpty(shapeData.specular))
                {
                    Base _spec = new Base("spec", "string", _material); _spec.nullByteString = true;
                    _spec.value.Add(Base.Data.String(Path.GetFileName(shapeData.specular)));
                }
            }
            else
            {
                _shader.value.Add(Base.Data.String("Collision"));
            }

            if (skinned)
            {
                Dictionary <Transform, int> newBoneIndices = new Dictionary <Transform, int>();
                Dictionary <int, Transform> oldBoneIndices = new Dictionary <int, Transform>();

                if (!_shape.subNodes.ContainsKey("skeleton"))
                {
                    Transform root = null;

                    Base _skeleton = new Base("skeleton", "object", _shape);
                    Dictionary <string, Base> nameBones = new Dictionary <string, Base>();

                    foreach (Transform b in smr.bones)
                    {
                        oldBoneIndices.Add(Array.IndexOf(smr.bones, b), b);

                        if (b.name.ToLower().Equals("root"))
                        {
                            root = b;
                        }
                        Base _bone = new Base(b.name, "object");
                        Base _btx  = new Base("tx", "float", _bone);

                        Matrix4x4 m = b.localToWorldMatrix.inverse;

                        _btx.value = new List <Base.Data>()
                        {
                            new Base.Data()
                            {
                                f = m.m00
                            }, new Base.Data()
                            {
                                f = m.m10
                            }, new Base.Data()
                            {
                                f = m.m20
                            },                                                                                        //new Base.Data() { f = m.m03 },
                            new Base.Data()
                            {
                                f = m.m01
                            }, new Base.Data()
                            {
                                f = m.m11
                            }, new Base.Data()
                            {
                                f = m.m21
                            },                                                                                        //new Base.Data() { f = m.m13 },
                            new Base.Data()
                            {
                                f = m.m02
                            }, new Base.Data()
                            {
                                f = m.m12
                            }, new Base.Data()
                            {
                                f = m.m22
                            },                                                                                        //new Base.Data() { f = m.m23 },
                            new Base.Data()
                            {
                                f = m.m03
                            }, new Base.Data()
                            {
                                f = m.m13
                            }, new Base.Data()
                            {
                                f = m.m23
                            },                                                                                        //new Base.Data() { f = m.m33 },
                        };

                        nameBones.Add(b.name, _bone);
                    }

                    List <Transform> hierBones = new List <Transform>();
                    ObjectHierarchy(hierBones, root);

                    foreach (var hb in hierBones)
                    {
                        newBoneIndices.Add(hb, hierBones.IndexOf(hb));

                        Base _bone = nameBones[hb.name];
                        Base _bix  = new Base("ix", "int", _bone);
                        _bix.value.Add(Base.Data.Int(hierBones.IndexOf(hb)));
                        _skeleton.Add(_bone);

                        if (hb != smr.rootBone)
                        {
                            Base _bpa = new Base("pa", "int", _bone);
                            _bpa.value.Add(Base.Data.Int(hierBones.IndexOf(hb.parent)));
                        }
                    }
                }

                Base _skin = new Base("skin", "object", _mesh);

                Base _bonesPerVert = new Base("bones", "int", _skin);

                int num = 1;

                foreach (BoneWeight bw in mesh.boneWeights)
                {
                    if (num < 2 && bw.weight1 > 0)
                    {
                        num = 2;
                    }
                    if (num < 3 && bw.weight2 > 0)
                    {
                        num = 3;
                    }
                    if (num < 4 && bw.weight3 > 0)
                    {
                        num = 4;
                        break;
                    }
                }

                _bonesPerVert.value.Add(Base.Data.Int(num));

                int ixCount = mesh.vertexCount;

                Base _ix = new Base("ix", "int", _skin);
                Base _w  = new Base("w", "float", _skin);

                for (int i = 0; i < ixCount; i++)
                {
                    BoneWeight w = mesh.boneWeights[i];

                    int bi0 = newBoneIndices[oldBoneIndices[w.boneIndex0]];
                    int bi1 = newBoneIndices[oldBoneIndices[w.boneIndex1]];
                    int bi2 = newBoneIndices[oldBoneIndices[w.boneIndex2]];
                    int bi3 = newBoneIndices[oldBoneIndices[w.boneIndex3]];

                    _ix.value.Add(Base.Data.Int((bi0 == 0 && w.weight0 == 0) ? -1 : bi0));
                    _ix.value.Add(Base.Data.Int((bi1 == 0 && w.weight1 == 0) ? -1 : bi1));
                    _ix.value.Add(Base.Data.Int((bi2 == 0 && w.weight2 == 0) ? -1 : bi2));
                    _ix.value.Add(Base.Data.Int((bi3 == 0 && w.weight3 == 0) ? -1 : bi3));

                    _w.value.Add(Base.Data.Float(w.weight0));
                    _w.value.Add(Base.Data.Float(w.weight1));
                    _w.value.Add(Base.Data.Float(w.weight2));
                    _w.value.Add(Base.Data.Float(w.weight3));
                }
            }
        }

        Base _locator = new Base("locator", "object", _base);

        List <Transform> locators = new List <Transform>();

        FindTagInChildren(locators, target.transform, "Locator", target.transform);

        foreach (Transform loc in locators)
        {
            Base _loc = new Base(loc.name, "object", _locator);

            Base _p  = new Base("p", "float", _loc);
            Base _q  = new Base("q", "float", _loc);
            Base _pa = new Base("pa", "string", _loc); _pa.nullByteString = true;

            Vector3    pos = loc.transform.localPosition;
            Quaternion rot = loc.transform.localRotation;

            _p.value.Add(Base.Data.Float(pos.x)); _p.value.Add(Base.Data.Float(pos.y)); _p.value.Add(Base.Data.Float(pos.z));

            _q.value.Add(Base.Data.Float(rot.x)); _q.value.Add(Base.Data.Float(rot.y)); _q.value.Add(Base.Data.Float(rot.z)); _q.value.Add(Base.Data.Float(rot.w));

            _pa.value.Add(Base.Data.String(loc.transform.parent.name));
        }

        target.transform.position = lastPos;

        return(_base);
    }
Ejemplo n.º 5
0
 public void Hide()
 {
     panel.SetActive(false);
     player = null;
 }