public static MobModel Read(Stream fs) { var zip = new ZipFile(fs); var zonefile = zip.GetInputStream(zip.GetEntry("ORC_ACTORDEF.oec")); var reader = new BinaryReader(zonefile); var obj = new ArrayMesh(); var nummeshes = reader.ReadInt32(); for (var i = 0; i < nummeshes; ++i) { var flags = reader.ReadUInt32(); var numtex = reader.ReadUInt32(); var textures = new Texture[numtex]; for (var j = 0; j < numtex; ++j) { var fn = reader.ReadString(); var entry = zip.GetEntry(fn); textures[j] = TextureLoader.Load(zip.GetInputStream(entry), (int)entry.Size, flags != 1); } var mat = new SpatialMaterial(); if (numtex > 0) { mat.AlbedoTexture = textures[0]; } if (flags == 1) { mat.ParamsUseAlphaScissor = true; } //else if(flags != 0) // mat.FlagsTransparent = true; var numvert = reader.ReadInt32(); var arrays = new object[ArrayMesh.ARRAY_MAX]; arrays[ArrayMesh.ARRAY_VERTEX] = Enumerable.Range(0, numvert).Select(_ => reader.ReadVector3()).ToArray(); arrays[ArrayMesh.ARRAY_NORMAL] = Enumerable.Range(0, numvert).Select(_ => reader.ReadVector3()).ToArray(); arrays[ArrayMesh.ARRAY_TEX_UV] = Enumerable.Range(0, numvert).Select(_ => reader.ReadVector2()).ToArray(); arrays[ArrayMesh.ARRAY_BONES] = Enumerable.Range(0, numvert * 4).Select(o => (o & 3) == 0 ? reader.ReadUInt32() : 0f).ToArray(); arrays[ArrayMesh.ARRAY_WEIGHTS] = Enumerable.Range(0, numvert * 4).Select(o => (o & 3) == 0 ? 1f : 0f).ToArray(); var numpoly = reader.ReadInt32(); var ind = Enumerable.Range(0, numpoly * 3).Select(_ => (int)reader.ReadUInt32()).ToArray(); arrays[ArrayMesh.ARRAY_INDEX] = ind; obj.AddSurfaceFromArrays(VisualServer.PRIMITIVE_TRIANGLES, arrays); obj.SurfaceSetMaterial(i, mat); } var sp = new Spatial(); var numbones = reader.ReadUInt32(); var skel = new Skeleton(); skel.RotateX(-Mathf.PI / 2); sp.AddChild(skel); skel.SetName("skel"); for (var i = 0; i < numbones; ++i) { skel.AddBone($"bone_{i}"); skel.SetBoneParent(i, reader.ReadInt32()); } var numanim = reader.ReadUInt32(); var aniplayer = new AnimationPlayer(); aniplayer.SetName("aniplayer"); for (var i = 0; i < numanim; ++i) { var name = reader.ReadString(); var ani = new Animation(); var boneframes = new List <Tuple <Vector3, Quat> > [numbones]; for (var j = 0; j < numbones; ++j) { ani.AddTrack(Animation.TYPE_TRANSFORM); ani.TrackSetPath(j, $"skel:bone_{j}"); var numframes = reader.ReadUInt32(); for (var k = 0; k < numframes; ++k) { ani.TransformTrackInsertKey(j, 0.1f * k, reader.ReadVector3(), reader.ReadQuat(), new Vector3(1, 1, 1)); } } aniplayer.AddAnimation(name, ani); } sp.AddChild(aniplayer); aniplayer.SetActive(true); aniplayer.Play("C09"); var mi = new MeshInstance { Mesh = obj }; skel.AddChild(mi); return(new MobModel(sp)); }
public override object Load(LoadedAsset asset) { XmlReader xmlReader = XmlReader.Create(asset.Data); while (xmlReader.Read()) { if (xmlReader.NodeType == XmlNodeType.Element) { if (xmlReader.Name == "bone") { string name = xmlReader.GetAttribute("name"); boneIdx = int.Parse(xmlReader.GetAttribute("id")); skeleton.AddBone(new Bone(name)); } else if (xmlReader.Name == "position") { float x = float.Parse(xmlReader.GetAttribute("x")); float y = float.Parse(xmlReader.GetAttribute("y")); float z = float.Parse(xmlReader.GetAttribute("z")); Vector3f vec = new Vector3f(x, y, z); skeleton.GetBone(boneIdx).SetBindTranslation(vec); } else if (xmlReader.Name == "rotation") { float angle = float.Parse(xmlReader.GetAttribute("angle")); bindAngle = angle; } else if (xmlReader.Name == "boneparent") { string parent = xmlReader.GetAttribute("parent"); string child = xmlReader.GetAttribute("bone"); Bone parentBone = null; for (int i = 0; i < skeleton.GetNumBones(); i++) { if (skeleton.GetBone(i).Name == parent) { parentBone = skeleton.GetBone(i); } } for (int i = 0; i < skeleton.GetNumBones(); i++) { if (skeleton.GetBone(i).Name == child) { Bone b = skeleton.GetBone(i); parentBone.AddChild(b); } } } else if (xmlReader.Name == "track") { string bone = xmlReader.GetAttribute("bone"); keyframeBoneName = bone; Bone b = skeleton.GetBone(keyframeBoneName); if (b != null) { skeleton.GetAnimations()[skeleton.GetAnimations().Count - 1].AddTrack(new AnimationTrack(b)); } } else if (xmlReader.Name == "translate") { float x = float.Parse(xmlReader.GetAttribute("x")); float y = float.Parse(xmlReader.GetAttribute("y")); float z = float.Parse(xmlReader.GetAttribute("z")); Vector3f vec = new Vector3f(x, y, z); keyframeBoneTrans = vec; } else if (xmlReader.Name == "rotate") { float angle = float.Parse(xmlReader.GetAttribute("angle")); keyframeBoneAngle = angle; } else if (xmlReader.Name == "axis") { float x = float.Parse(xmlReader.GetAttribute("x")); float y = float.Parse(xmlReader.GetAttribute("y")); float z = float.Parse(xmlReader.GetAttribute("z")); Vector3f vec = new Vector3f(x, y, z); string peek = lastElement; if (peek == "rotate") // it is a keyframe { keyframeBoneAxis = vec; } else if (peek == "rotation") // it is a bone bind pose { bindAxis = vec; skeleton.GetBone(boneIdx).SetBindAxisAngle(bindAxis.Normalize(), bindAngle); } } else if (xmlReader.Name == "keyframe") { keyframeBoneTime = float.Parse(xmlReader.GetAttribute("time")); } else if (xmlReader.Name == "animation") { skeleton.GetAnimations().Add(new Animation(xmlReader.GetAttribute("name"))); } lastElement = xmlReader.Name; } else if (xmlReader.NodeType == XmlNodeType.EndElement) { if (xmlReader.Name == "keyframe") { Bone b = skeleton.GetBone(keyframeBoneName); if (b != null) { Keyframe keyf = null; skeleton.GetAnimations()[skeleton.GetAnimations().Count - 1] .GetTrack(skeleton.GetAnimations()[skeleton.GetAnimations().Count - 1] .GetTracks().Count - 1) .AddKeyframe(keyf = new Keyframe(keyframeBoneTime, keyframeBoneTrans, keyframeBoneAxis, keyframeBoneAngle)); } keyframeBoneAngle = 0f; keyframeBoneAxis = new Vector3f(Vector3f.Zero); keyframeBoneTime = 0f; keyframeBoneTrans = new Vector3f(Vector3f.Zero); } else if (xmlReader.Name == "track") { keyframeBoneName = ""; } } } xmlReader.Close(); return(skeleton); }
public override object Load(LoadedAsset asset) { XmlReader xmlReader = XmlReader.Create(asset.Data); while (xmlReader.Read()) { if (xmlReader.NodeType == XmlNodeType.Element) { if (xmlReader.Name == ApxExporter.TOKEN_NODE) { node = true; geom = false; string name = xmlReader.GetAttribute(ApxExporter.TOKEN_NAME); Node n = new Node(name); if (lastNode != null) { lastNode.AddChild(n); } lastNode = n; nodes.Add(n); } else if (xmlReader.Name == ApxExporter.TOKEN_GEOMETRY) { node = false; geom = true; string name = xmlReader.GetAttribute(ApxExporter.TOKEN_NAME); Geometry g = new Geometry(); g.Name = name; if (lastNode != null) { lastNode.AddChild(g); } geoms.Add(g); } else if (xmlReader.Name == ApxExporter.TOKEN_MATERIAL) { Material mat = new Material(); mats.Add(mat); string bucketStr = xmlReader.GetAttribute(ApxExporter.TOKEN_MATERIAL_BUCKET); RenderManager.Bucket bucket; if (bucketStr != null) { Enum.TryParse <RenderManager.Bucket>(bucketStr, out bucket); } else { bucket = RenderManager.Bucket.Opaque; } Console.WriteLine("Bucket: " + bucket.ToString()); mat.Bucket = bucket; } else if (xmlReader.Name == ApxExporter.TOKEN_MATERIAL_PROPERTY) { Material lastMaterial = mats[mats.Count - 1]; string name = xmlReader.GetAttribute(ApxExporter.TOKEN_NAME); string type = xmlReader.GetAttribute(ApxExporter.TOKEN_TYPE); string val = xmlReader.GetAttribute(ApxExporter.TOKEN_VALUE); object value = null; if (type == ApxExporter.TOKEN_TYPE_STRING) { value = val; } else if (type == ApxExporter.TOKEN_TYPE_INT) { value = int.Parse(val); } else if (type == ApxExporter.TOKEN_TYPE_BOOLEAN) { value = bool.Parse(val); } else if (type == ApxExporter.TOKEN_TYPE_FLOAT) { value = float.Parse(val); } else if (type == ApxExporter.TOKEN_TYPE_VECTOR2) { value = ParseVector2(val); } else if (type == ApxExporter.TOKEN_TYPE_VECTOR3) { value = ParseVector3(val); } else if (type == ApxExporter.TOKEN_TYPE_VECTOR4) { value = ParseVector4(val); } else if (type == ApxExporter.TOKEN_TYPE_TEXTURE) { string texPath = val; string parentPath = System.IO.Directory.GetParent(asset.FilePath).ToString(); string finalTexPath = parentPath + "\\" + texPath; if (System.IO.File.Exists(finalTexPath)) { value = AssetManager.LoadTexture(finalTexPath); } else if (System.IO.File.Exists(texPath)) // absolute path { value = AssetManager.LoadTexture(texPath); } else { value = null; } } lastMaterial.SetValue(name, value); } else if (xmlReader.Name == ApxExporter.TOKEN_TRANSLATION) { float x = float.Parse(xmlReader.GetAttribute("x")); float y = float.Parse(xmlReader.GetAttribute("y")); float z = float.Parse(xmlReader.GetAttribute("z")); Vector3f vec = new Vector3f(x, y, z); GameObject go = null; if (node) { go = nodes[nodes.Count - 1]; } else if (geom) { go = geoms[geoms.Count - 1]; } go.SetLocalTranslation(vec); } else if (xmlReader.Name == ApxExporter.TOKEN_ROTATION) { float x = float.Parse(xmlReader.GetAttribute("x")); float y = float.Parse(xmlReader.GetAttribute("y")); float z = float.Parse(xmlReader.GetAttribute("z")); float w = float.Parse(xmlReader.GetAttribute("w")); Quaternion quat = new Quaternion(x, y, z, w); GameObject go = null; if (node) { go = nodes[nodes.Count - 1]; } else if (geom) { go = geoms[geoms.Count - 1]; } go.SetLocalRotation(quat); } else if (xmlReader.Name == ApxExporter.TOKEN_SCALE) { float x = float.Parse(xmlReader.GetAttribute("x")); float y = float.Parse(xmlReader.GetAttribute("y")); float z = float.Parse(xmlReader.GetAttribute("z")); Vector3f vec = new Vector3f(x, y, z); GameObject go = null; if (node) { go = nodes[nodes.Count - 1]; } else if (geom) { go = geoms[geoms.Count - 1]; } go.SetLocalScale(vec); } else if (xmlReader.Name == ApxExporter.TOKEN_MESH) { meshes.Add(new Mesh()); } else if (xmlReader.Name == ApxExporter.TOKEN_VERTICES) { List <Vertex> newVList = new List <Vertex>(); vertices.Add(newVList); List <Vector3f> newPList = new List <Vector3f>(); positions.Add(newPList); List <Vector3f> newNList = new List <Vector3f>(); normals.Add(newNList); List <Vector2f> newT0List = new List <Vector2f>(); texcoords0.Add(newT0List); List <Vector2f> newT1List = new List <Vector2f>(); texcoords1.Add(newT1List); } else if (xmlReader.Name == ApxExporter.TOKEN_POSITION) { List <Vector3f> pos = positions[positions.Count - 1]; float x = float.Parse(xmlReader.GetAttribute("x")); float y = float.Parse(xmlReader.GetAttribute("y")); float z = float.Parse(xmlReader.GetAttribute("z")); Vector3f position = new Vector3f(x, y, z); pos.Add(position); } else if (xmlReader.Name == ApxExporter.TOKEN_NORMAL) { List <Vector3f> nor = normals[normals.Count - 1]; float x = float.Parse(xmlReader.GetAttribute("x")); float y = float.Parse(xmlReader.GetAttribute("y")); float z = float.Parse(xmlReader.GetAttribute("z")); Vector3f normal = new Vector3f(x, y, z); nor.Add(normal); } else if (xmlReader.Name == ApxExporter.TOKEN_TEXCOORD0) { List <Vector2f> tc0 = texcoords0[texcoords0.Count - 1]; float x = float.Parse(xmlReader.GetAttribute("x")); float y = float.Parse(xmlReader.GetAttribute("y")); Vector2f tc = new Vector2f(x, y); tc0.Add(tc); } else if (xmlReader.Name == ApxExporter.TOKEN_TEXCOORD1) { List <Vector2f> tc1 = texcoords1[texcoords1.Count - 1]; float x = float.Parse(xmlReader.GetAttribute("x")); float y = float.Parse(xmlReader.GetAttribute("y")); Vector2f tc = new Vector2f(x, y); tc1.Add(tc); } else if (xmlReader.Name == ApxExporter.TOKEN_FACES) { faces.Add(new List <int>()); } else if (xmlReader.Name == ApxExporter.TOKEN_FACE) { List <int> fList = faces[faces.Count - 1]; for (int i = 0; i < 3; i++) { string val = xmlReader.GetAttribute("i" + i.ToString()); if (val != "") { string[] tokens = val.Split('/'); for (int j = 0; j < tokens.Length; j++) { fList.Add(int.Parse(tokens[j])); } } } } else if (xmlReader.Name == ApxExporter.TOKEN_SKELETON) { skeletons.Add(new Skeleton()); bones.Add(new List <Bone>()); } else if (xmlReader.Name == ApxExporter.TOKEN_SKELETON_ASSIGN) { string assign = xmlReader.GetAttribute(ApxExporter.TOKEN_ID); skeletonAssigns.Add(int.Parse(assign)); } else if (xmlReader.Name == ApxExporter.TOKEN_BONE) { string name = xmlReader.GetAttribute(ApxExporter.TOKEN_NAME); string parent = xmlReader.GetAttribute(ApxExporter.TOKEN_PARENT); Bone bone = new Bone(name); List <Bone> lastBL = bones[bones.Count - 1]; if (!string.IsNullOrEmpty(parent)) { foreach (Bone b in lastBL) { if (b.Name == parent) { b.AddChild(bone); } } } List <Bone> skel = bones[bones.Count - 1]; skel.Add(bone); Skeleton lastSkeleton = skeletons[skeletons.Count - 1]; lastSkeleton.AddBone(bone); } else if (xmlReader.Name == ApxExporter.TOKEN_BONE_BINDPOSITION) { float x = float.Parse(xmlReader.GetAttribute("x")); float y = float.Parse(xmlReader.GetAttribute("y")); float z = float.Parse(xmlReader.GetAttribute("z")); Vector3f vec = new Vector3f(x, y, z); List <Bone> skel = bones[bones.Count - 1]; if (skel.Count > 0) { Bone lastBone = skel[skel.Count - 1]; lastBone.SetBindTranslation(vec); } } else if (xmlReader.Name == ApxExporter.TOKEN_BONE_BINDROTATION) { float x = float.Parse(xmlReader.GetAttribute("x")); float y = float.Parse(xmlReader.GetAttribute("y")); float z = float.Parse(xmlReader.GetAttribute("z")); float w = float.Parse(xmlReader.GetAttribute("w")); List <Bone> skel = bones[bones.Count - 1]; if (skel.Count > 0) { Bone lastBone = skel[skel.Count - 1]; // lastBone.SetBindAxisAngle(new Vector3f(x, y, z), w); lastBone.SetBindRotation(new Quaternion(x, y, z, w)); } } else if (xmlReader.Name == ApxExporter.TOKEN_BONE_ASSIGNS) { boneAssigns.Add(new List <BoneAssign>()); } else if (xmlReader.Name == ApxExporter.TOKEN_BONE_ASSIGN) { int vertIdx = int.Parse(xmlReader.GetAttribute(ApxExporter.TOKEN_VERTEXINDEX)); int boneIdx = int.Parse(xmlReader.GetAttribute(ApxExporter.TOKEN_BONEINDEX)); float boneWeight = float.Parse(xmlReader.GetAttribute(ApxExporter.TOKEN_BONEWEIGHT)); List <BoneAssign> ba = boneAssigns[boneAssigns.Count - 1]; ba.Add(new BoneAssign(vertIdx, boneWeight, boneIdx)); } else if (xmlReader.Name == ApxExporter.TOKEN_ANIMATIONS) { hasAnimations = true; } else if (xmlReader.Name == ApxExporter.TOKEN_ANIMATION) { string name = xmlReader.GetAttribute(ApxExporter.TOKEN_NAME); Animation anim = new Animation(name); animations.Add(anim); } else if (xmlReader.Name == ApxExporter.TOKEN_ANIMATION_TRACK) { string bone = xmlReader.GetAttribute(ApxExporter.TOKEN_BONE); Bone b = skeletons[skeletons.Count - 1].GetBone(bone); if (b != null) { AnimationTrack track = new AnimationTrack(b); animations[animations.Count - 1].AddTrack(track); } } else if (xmlReader.Name == ApxExporter.TOKEN_KEYFRAME) { float time = float.Parse(xmlReader.GetAttribute(ApxExporter.TOKEN_TIME)); Keyframe frame = new Keyframe(time, null, null); Animation canim = animations[animations.Count - 1]; AnimationTrack ctrack = canim.GetTrack(canim.GetTracks().Count - 1); ctrack.AddKeyframe(frame); } else if (xmlReader.Name == ApxExporter.TOKEN_KEYFRAME_TRANSLATION) { Animation canim = animations[animations.Count - 1]; AnimationTrack ctrack = canim.GetTrack(canim.GetTracks().Count - 1); Keyframe lastFrame = ctrack.frames[ctrack.frames.Count - 1]; float x = float.Parse(xmlReader.GetAttribute("x")); float y = float.Parse(xmlReader.GetAttribute("y")); float z = float.Parse(xmlReader.GetAttribute("z")); Vector3f vec = new Vector3f(x, y, z); lastFrame.SetTranslation(vec); } else if (xmlReader.Name == ApxExporter.TOKEN_KEYFRAME_ROTATION) { Animation canim = animations[animations.Count - 1]; AnimationTrack ctrack = canim.GetTrack(canim.GetTracks().Count - 1); Keyframe lastFrame = ctrack.frames[ctrack.frames.Count - 1]; float x = float.Parse(xmlReader.GetAttribute("x")); float y = float.Parse(xmlReader.GetAttribute("y")); float z = float.Parse(xmlReader.GetAttribute("z")); float w = float.Parse(xmlReader.GetAttribute("w")); Quaternion rot = new Quaternion(x, y, z, w); lastFrame.SetRotation(rot); } } // start element else if (xmlReader.NodeType == XmlNodeType.EndElement) { if (xmlReader.Name == ApxExporter.TOKEN_NODE) { if (lastNode != null) { if (lastNode.GetParent() != null) { lastNode = lastNode.GetParent(); } else { lastNode = null; } } node = false; } else if (xmlReader.Name == ApxExporter.TOKEN_GEOMETRY) { geom = false; } else if (xmlReader.Name == ApxExporter.TOKEN_MATERIAL) { if (geoms.Count > 0) { int lastGeomIndex = geoms.Count - 1; Geometry parent = geoms[lastGeomIndex]; int lastMatIndex = mats.Count - 1; Material m = mats[lastMatIndex]; geomMats.Add(parent, m); } } else if (xmlReader.Name == ApxExporter.TOKEN_SKELETON) { } else if (xmlReader.Name == ApxExporter.TOKEN_MODEL) { // end of model, load in meshes EndModel(); } } // end element } xmlReader.Close(); Node finalNode = new Node(); foreach (Node n in nodes) { if (n.GetParent() == null) { finalNode.AddChild(n); } } this.ResetLoader(); return(finalNode); }