AcTools.Kn5File.Kn5Reader.ReadNode C# (CSharp) Method

ReadNode() public method

public ReadNode ( ) : Kn5Node
return Kn5Node
        public Kn5Node ReadNode() {
            var nodeClass = ReadNodeClass();
            var nodeName = ReadString();
            var nodeChildren = ReadInt32();
            var nodeActive = ReadBoolean();

            var node = new Kn5Node {
                NodeClass = nodeClass,
                Name = nodeName,
                Children = new List<Kn5Node>(nodeChildren),
                Active = nodeActive
            };

            switch (node.NodeClass) {
                case Kn5NodeClass.Base:
                    node.Transform = ReadMatrix();
                    break;

                case Kn5NodeClass.Mesh:
                    node.CastShadows = ReadBoolean();
                    node.IsVisible = ReadBoolean();
                    node.IsTransparent = ReadBoolean();
            
                    node.Vertices = new Kn5Node.Vertice[ReadUInt32()];
                    for (var i = 0; i < node.Vertices.Length; i++) {
                        // 44 bytes per vertice
                        node.Vertices[i] = new Kn5Node.Vertice {
                            Co = ReadSingle3D(),
                            Normal = ReadSingle3D(),
                            Uv = ReadSingle2D(),
                            Tangent = ReadSingle3D()
                        };
                    }
            
                    node.Indices = new ushort[ReadUInt32()];
                    for (var i = 0; i < node.Indices.Length; i++) {
                        node.Indices[i] = ReadUInt16();
                    }
            
                    node.MaterialId = ReadUInt32();
                    node.Layer = ReadUInt32();
                    
                    node.LodIn = ReadSingle();
                    node.LodOut = ReadSingle();
                    
                    node.BoundingSphereCenter = ReadSingle3D();
                    node.BoundingSphereRadius = ReadSingle();

                    node.IsRenderable = ReadBoolean();
                    break;

                case Kn5NodeClass.SkinnedMesh:
                    node.CastShadows = ReadBoolean();
                    node.IsVisible = ReadBoolean();
                    node.IsTransparent = ReadBoolean();
            
                    node.Bones = new Kn5Node.Bone[ReadUInt32()];
                    for (var i = 0; i < node.Bones.Length; i++) {
                        node.Bones[i] = new Kn5Node.Bone {
                            Name = ReadString(),
                            Transform = ReadMatrix()
                        };
                    }
            
                    node.Vertices = new Kn5Node.Vertice[ReadUInt32()];
                    node.VerticeWeights = new Kn5Node.VerticeWeight[node.Vertices.Length];
                    for (var i = 0; i < node.Vertices.Length; i++) {
                        // 76 bytes per vertice
                        node.Vertices[i] = new Kn5Node.Vertice {
                            Co = ReadSingle3D(),
                            Normal = ReadSingle3D(),
                            Uv = ReadSingle2D(),
                            Tangent = ReadSingle3D()
                        };

                        node.VerticeWeights[i] = new Kn5Node.VerticeWeight {
                            Weights = ReadSingle4D(),
                            Indices = ReadSingle4D()
                        };
                    }
            
                    node.Indices = new ushort[ReadUInt32()];
                    for (var i = 0; i < node.Indices.Length; i++) {
                        node.Indices[i] = ReadUInt16();
                    }

                    node.MaterialId = ReadUInt32();
                    node.Layer = ReadUInt32();
                    
                    ReadBytes(8); // the only mistery left?
                    node.IsRenderable = true;
                    break;
            }

            return node;
        }

Usage Example

Example #1
0
        private Kn5Node FromFile_Node(Kn5Reader reader)
        {
            var node     = reader.ReadNode();
            var capacity = node.Children.Capacity;

            try {
                for (var i = 0; i < capacity; i++)
                {
                    node.Children.Add(FromFile_Node(reader));
                }
            } catch (EndOfStreamException) {
                node.Children.Capacity = node.Children.Count;
            }

            return(node);
        }
All Usage Examples Of AcTools.Kn5File.Kn5Reader::ReadNode