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; } }
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)); } } }
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); }
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); }
public void Hide() { panel.SetActive(false); player = null; }