private void LoadBonesInfo(AnimatedNode node, BoneInfo parent = null) { if (bonesMapping.ContainsKey(node.Name)) { var point = Vector3.Zero; var boneIndex = bonesMapping[node.Name]; var bone = Bones[boneIndex]; var transform = m_globalInverseTransform * bone.BoneOffset; transform.Transpose(); bone.Point = -Vector3.Transform(point, transform); if (parent != null) { var line = new BoneLineInfo { Point = bone.Point, Direction = bone.Point - parent.Point }; line.Length = line.Direction.Length; line.Direction /= line.Length; parent.Lines.Add(line); } foreach (var child in node.Childs) { LoadBonesInfo(child, bone); } } else { foreach (var child in node.Childs) { LoadBonesInfo(child, parent); } } }
private void ReadNodeHeirarchy(float animationTime, AnimatedNode node, Matrix4 parentTransform) { var channel = СurrentAnimation.AnimationNodes.ContainsKey(node.Name) ? СurrentAnimation.AnimationNodes[node.Name] : null; var nodeTransformation = node.Transform; if (channel != null) { var scale = CalcInterpolatedScaling(animationTime, channel); var scaleMatrix = Matrix4.CreateScale(scale); var rotateMatrix = CalcInterpolatedRotation(animationTime, channel); var translate = CalcInterpolatedPosition(animationTime, channel); nodeTransformation = rotateMatrix * scaleMatrix; nodeTransformation.M14 = translate.X; nodeTransformation.M24 = translate.Y; nodeTransformation.M34 = translate.Z; } var globalTransformation = parentTransform * nodeTransformation; if (bonesMapping.ContainsKey(node.Name)) { var boneIndex = bonesMapping[node.Name]; Bones[boneIndex].FinalTransformation = m_globalInverseTransform * globalTransformation * Bones[boneIndex].BoneOffset; Bones[boneIndex].FinalTransformation.Transpose(); } foreach (var child in node.Childs) { ReadNodeHeirarchy(animationTime, child, globalTransformation); } }
protected override void OnDetachedFromNode(AnimatedNode parent) { if (parent != _parent) { throw new InvalidOperationException("Invalid parent node provided."); } _parent = null; }
protected override void OnAttachedToNode(AnimatedNode parent) { if (_parent != null) { throw new InvalidOperationException("Parent already attached."); } var valueNode = parent as ValueAnimatedNode; if (valueNode == null) { throw new InvalidOperationException("Parent is not a value node."); } _parent = valueNode; }
public bool Initialize(String daeFileName) { var fi = new FileInfo(daeFileName); if (!fi.Exists) { return(false); } var scene = LoadDaeScene(fi.FullName); if (scene == null) { return(false); } foreach (var t in BodyMeshes) { t.Destroy(); } BodyMeshes.Clear(); Bones.Clear(); bonesMapping.Clear(); Animations.Clear(); Poses.Clear(); rootNode = null; СurrentAnimation = null; m_globalInverseTransform = FromMatrix(scene.RootNode.Transform); m_globalInverseTransform.Invert(); var title = Path.GetFileNameWithoutExtension(fi.FullName); LoadBodyMeshes(fi.FullName, scene, scene.RootNode, null); LoadBonesInfo(rootNode); LoadAnimations(scene, title); return(true); }
private void LoadBodyMeshes(string daePath, Scene scene, Node node, AnimatedNode animationNode) { if (node.HasMeshes) { var vertexPositions = new List <float>(); var vertexNormals = new List <float>(); var vertexTextureCoordinates = new List <float>(); var vertexBoneIndices = new List <float>(); var vertexBoneWeights = new List <float>(); var indeces = new List <uint>(); var fi = new FileInfo(daePath); foreach (var index in node.MeshIndices) { var mesh = scene.Meshes[index]; var hasTexCoords = mesh.HasTextureCoords(0); vertexPositions.Clear(); vertexNormals.Clear(); vertexTextureCoordinates.Clear(); vertexBoneIndices.Clear(); vertexBoneWeights.Clear(); indeces.Clear(); for (var i = 0; i < mesh.VertexCount; i++) { var vector = mesh.Vertices[i]; vertexPositions.Add(vector.X); vertexPositions.Add(vector.Y); vertexPositions.Add(vector.Z); vector = mesh.HasNormals ? mesh.Normals[i] : ZERO_VECTRO3D; vertexNormals.Add(vector.X); vertexNormals.Add(vector.Y); vertexNormals.Add(vector.Z); vector = hasTexCoords ? mesh.GetTextureCoords(0)[i] : ZERO_VECTRO3D; vertexTextureCoordinates.Add(vector.X); vertexTextureCoordinates.Add(1.0f - vector.Y); vertexBoneIndices.AddRange(new[] { 0.0f, 0.0f, 0.0f, 0.0f }); vertexBoneWeights.AddRange(new[] { 0.0f, 0.0f, 0.0f, 0.0f }); } foreach (var face in mesh.Faces) { indeces.Add(face.Indices[0]); indeces.Add(face.Indices[1]); indeces.Add(face.Indices[2]); } if (mesh.HasBones) { foreach (var bone in mesh.Bones) { if (!bone.HasVertexWeights) { continue; } int boneIndex; if (bonesMapping.ContainsKey(bone.Name)) { boneIndex = bonesMapping[bone.Name]; } else { boneIndex = Bones.Count; var boneInfo = new BoneInfo { BoneOffset = FromMatrix(bone.OffsetMatrix), }; Bones.Add(boneInfo); bonesMapping.Add(bone.Name, boneIndex); } foreach (var weight in bone.VertexWeights) { var vi = (int)weight.VertexID * 4; for (var i = 0; i < 4; i++) { if (vertexBoneWeights[vi + i] == 0.0f) { vertexBoneIndices[vi + i] = boneIndex; vertexBoneWeights[vi + i] = weight.Weight; break; } } } } } var mtr = scene.Materials[mesh.MaterialIndex]; var texturePath = string.Empty; var transparentPath = string.Empty; if (mtr.GetTextureCount(TextureType.Diffuse) > 0) { var tex = mtr.GetTexture(TextureType.Diffuse, 0); texturePath = Path.Combine(fi.DirectoryName, tex.FilePath); transparentPath = Path.Combine(Path.GetDirectoryName(tex.FilePath), Path.GetFileNameWithoutExtension(tex.FilePath) + "_alpha" + Path.GetExtension(tex.FilePath)); transparentPath = File.Exists(transparentPath) ? transparentPath : string.Empty; } var renderMesh = new DynamicRenderMesh(MeshType.Head); if (renderMesh.Create(vertexPositions, vertexNormals, vertexTextureCoordinates, vertexBoneIndices, vertexBoneWeights, indeces, texturePath, transparentPath)) { renderMesh.Transform = FromMatrix(node.Transform); renderMesh.Material.DiffuseColor = new Vector4(mtr.ColorDiffuse.R, mtr.ColorDiffuse.G, mtr.ColorDiffuse.B, mtr.ColorDiffuse.A); BodyMeshes.Add(renderMesh); } } } var parentNode = animationNode; if (animationNode == null) { rootNode = new AnimatedNode(); parentNode = rootNode; } parentNode.Name = node.Name; parentNode.Transform = FromMatrix(node.Transform); for (var i = 0; i < node.ChildCount; i++) { var childNode = new AnimatedNode { Parent = parentNode }; LoadBodyMeshes(daePath, scene, node.Children[i], childNode); parentNode.Childs.Add(childNode); } }
private void ReadNodeHeirarchy(float animationTime, AnimatedNode node, Matrix4 parentTransform) { var channel = СurrentAnimation.AnimationNodes.ContainsKey(node.Name) ? СurrentAnimation.AnimationNodes[node.Name] : null; var nodeTransformation = node.Transform; if (channel != null) { var scale = CalcInterpolatedScaling(animationTime, channel); var scaleMatrix = Matrix4.CreateScale(scale); var rotateMatrix = CalcInterpolatedRotation(animationTime, channel); var translate = CalcInterpolatedPosition(animationTime, channel); nodeTransformation = rotateMatrix * scaleMatrix; nodeTransformation.M14 = translate.X; nodeTransformation.M24 = translate.Y; nodeTransformation.M34 = translate.Z; } var globalTransformation = parentTransform * nodeTransformation; if (bonesMapping.ContainsKey(node.Name)) { var boneIndex = bonesMapping[node.Name]; Bones[boneIndex].FinalTransformation = m_globalInverseTransform * globalTransformation * Bones[boneIndex].BoneOffset; Bones[boneIndex].FinalTransformation.Transpose(); } foreach (var child in node.Childs) { ReadNodeHeirarchy(animationTime, child, globalTransformation); } }
private void LoadBonesInfo(AnimatedNode node, BoneInfo parent = null) { if (bonesMapping.ContainsKey(node.Name)) { var point = Vector3.Zero; var boneIndex = bonesMapping[node.Name]; var bone = Bones[boneIndex]; var transform = m_globalInverseTransform * bone.BoneOffset; transform.Transpose(); bone.Point = -Vector3.Transform(point, transform); if (parent != null) { var line = new BoneLineInfo { Point = bone.Point, Direction = bone.Point - parent.Point }; line.Length = line.Direction.Length; line.Direction /= line.Length; parent.Lines.Add(line); } foreach (var child in node.Childs) { LoadBonesInfo(child, bone); } } else { foreach (var child in node.Childs) { LoadBonesInfo(child, parent); } } }
private void LoadBodyMeshes(string daePath, Scene scene, Node node, AnimatedNode animationNode) { if (node.HasMeshes) { var vertexPositions = new List<float>(); var vertexNormals = new List<float>(); var vertexTextureCoordinates = new List<float>(); var vertexBoneIndices = new List<float>(); var vertexBoneWeights = new List<float>(); var indeces = new List<uint>(); var fi = new FileInfo(daePath); foreach (var index in node.MeshIndices) { var mesh = scene.Meshes[index]; var hasTexCoords = mesh.HasTextureCoords(0); vertexPositions.Clear(); vertexNormals.Clear(); vertexTextureCoordinates.Clear(); vertexBoneIndices.Clear(); vertexBoneWeights.Clear(); indeces.Clear(); for (var i = 0; i < mesh.VertexCount; i++) { var vector = mesh.Vertices[i]; vertexPositions.Add(vector.X); vertexPositions.Add(vector.Y); vertexPositions.Add(vector.Z); vector = mesh.HasNormals ? mesh.Normals[i] : ZERO_VECTRO3D; vertexNormals.Add(vector.X); vertexNormals.Add(vector.Y); vertexNormals.Add(vector.Z); vector = hasTexCoords ? mesh.GetTextureCoords(0)[i] : ZERO_VECTRO3D; vertexTextureCoordinates.Add(vector.X); vertexTextureCoordinates.Add(1.0f - vector.Y); vertexBoneIndices.AddRange(new[] { 0.0f, 0.0f, 0.0f, 0.0f }); vertexBoneWeights.AddRange(new[] { 0.0f, 0.0f, 0.0f, 0.0f }); } foreach (var face in mesh.Faces) { indeces.Add(face.Indices[0]); indeces.Add(face.Indices[1]); indeces.Add(face.Indices[2]); } if (mesh.HasBones) { foreach (var bone in mesh.Bones) { if (!bone.HasVertexWeights) continue; int boneIndex; if (bonesMapping.ContainsKey(bone.Name)) { boneIndex = bonesMapping[bone.Name]; } else { boneIndex = Bones.Count; var boneInfo = new BoneInfo { BoneOffset = FromMatrix(bone.OffsetMatrix), }; Bones.Add(boneInfo); bonesMapping.Add(bone.Name, boneIndex); } foreach (var weight in bone.VertexWeights) { var vi = (int)weight.VertexID * 4; for (var i = 0; i < 4; i++) { if (vertexBoneWeights[vi + i] == 0.0f) { vertexBoneIndices[vi + i] = boneIndex; vertexBoneWeights[vi + i] = weight.Weight; break; } } } } } var mtr = scene.Materials[mesh.MaterialIndex]; var texturePath = string.Empty; var transparentPath = string.Empty; if (mtr.GetTextureCount(TextureType.Diffuse) > 0) { var tex = mtr.GetTexture(TextureType.Diffuse, 0); texturePath = Path.Combine(fi.DirectoryName, tex.FilePath); transparentPath = Path.Combine(Path.GetDirectoryName(tex.FilePath), Path.GetFileNameWithoutExtension(tex.FilePath) + "_alpha" + Path.GetExtension(tex.FilePath)); transparentPath = File.Exists(transparentPath) ? transparentPath : string.Empty; } var renderMesh = new DynamicRenderMesh(MeshType.Head); if (renderMesh.Create(vertexPositions, vertexNormals, vertexTextureCoordinates, vertexBoneIndices, vertexBoneWeights, indeces, texturePath, transparentPath)) { renderMesh.Transform = FromMatrix(node.Transform); renderMesh.Material.DiffuseColor = new Vector4(mtr.ColorDiffuse.R, mtr.ColorDiffuse.G, mtr.ColorDiffuse.B, mtr.ColorDiffuse.A); BodyMeshes.Add(renderMesh); } } } var parentNode = animationNode; if (animationNode == null) { rootNode = new AnimatedNode(); parentNode = rootNode; } parentNode.Name = node.Name; parentNode.Transform = FromMatrix(node.Transform); for (var i = 0; i < node.ChildCount; i++) { var childNode = new AnimatedNode { Parent = parentNode }; LoadBodyMeshes(daePath, scene, node.Children[i], childNode); parentNode.Childs.Add(childNode); } }
public bool Initialize(String daeFileName) { var fi = new FileInfo(daeFileName); if (!fi.Exists) return false; var scene = LoadDaeScene(fi.FullName); if (scene == null) return false; foreach (var t in BodyMeshes) t.Destroy(); BodyMeshes.Clear(); Bones.Clear(); bonesMapping.Clear(); Animations.Clear(); Poses.Clear(); rootNode = null; СurrentAnimation = null; m_globalInverseTransform = FromMatrix(scene.RootNode.Transform); m_globalInverseTransform.Invert(); var title = Path.GetFileNameWithoutExtension(fi.FullName); LoadBodyMeshes(fi.FullName, scene, scene.RootNode, null); LoadBonesInfo(rootNode); LoadAnimations(scene, title); return true; }