Пример #1
0
        private IRenderable CreateRenderableModel()
        {
            NumsbhNode meshNode = null;
            NuhlpbNode hlpbNode = null;
            RSkeleton  skeleton = null;
            Matl       material = null;
            XmbNode    modelXmb = null;
            XmbNode    lodXmb   = null;

            var textureByName = new Dictionary <string, RTexture>();

            GetNodesForRendering(ref meshNode, ref hlpbNode, ref skeleton, ref material, ref modelXmb, ref lodXmb, textureByName);

            return(new RNumdl(model, skeleton, material, meshNode, hlpbNode, modelXmb, lodXmb, textureByName));
        }
Пример #2
0
        private void GetNodesForRendering(ref NumshbNode meshNode, ref NuhlpbNode hlpbNode, ref RSkeleton skeleton, ref Matl material, ref XmbNode modelXmb, ref XmbNode lodXmb,
                                          Dictionary <string, RTexture> textureByName)
        {
            // TODO: There's probably a cleaner way of doing this.
            foreach (FileNode fileNode in Parent.Nodes)
            {
                if (fileNode is NuhlpbNode node)
                {
                    hlpbNode = node;
                }
                else if (fileNode is NutexbNode nutexNode)
                {
                    var texture = (RTexture)nutexNode.Renderable.Value;

                    // Use the file name instead of the internal name.
                    // Ignore case.
                    var textureName = System.IO.Path.GetFileNameWithoutExtension(fileNode.Text).ToLower();
                    textureByName[textureName] = texture;
                }
                else if (fileNode.Text.Equals(model.MeshString))
                {
                    meshNode = (NumshbNode)fileNode;
                }
                else if (fileNode.Text.Equals(model.SkeletonFileName))
                {
                    skeleton = (RSkeleton)((NusktbNode)fileNode).Renderable.Value;
                }
                else if (fileNode.Text.Equals(model.MaterialFileNames[0].MaterialFileName))
                {
                    material = ((NumatbNode)fileNode).Material;
                }
                else if (fileNode.Text.Equals("model.xmb"))
                {
                    modelXmb = (XmbNode)fileNode;
                }
                else if (fileNode.Text.Equals("lod.xmb"))
                {
                    lodXmb = (XmbNode)fileNode;
                }
            }
        }
Пример #3
0
 private void GetNodesForRendering(ref NumsbhNode meshNode, ref NuhlpbNode hlpbNode, ref RSkeleton skeleton, ref Matl material, ref XmbNode modelXmb, ref XmbNode lodXmb,
                                   Dictionary <string, RTexture> textureByName)
 {
     // TODO: There's probably a cleaner way of doing this.
     foreach (FileNode fileNode in Parent.Nodes)
     {
         if (fileNode is NuhlpbNode node)
         {
             hlpbNode = node;
         }
         else if (fileNode is NutexNode nutexNode)
         {
             var texture = (RTexture)nutexNode.GetRenderableNode();
             textureByName[nutexNode.TexName.ToLower()] = texture;
         }
         else if (fileNode.Text.Equals(model.MeshString))
         {
             meshNode = (NumsbhNode)fileNode;
         }
         else if (fileNode.Text.Equals(model.SkeletonFileName))
         {
             skeleton = (RSkeleton)((SkelNode)fileNode).GetRenderableNode();
         }
         else if (fileNode.Text.Equals(model.MaterialFileNames[0].MaterialFileName))
         {
             material = ((MatlNode)fileNode).Material;
         }
         else if (fileNode.Text.Equals("model.xmb"))
         {
             modelXmb = (XmbNode)fileNode;
         }
         else if (fileNode.Text.Equals("lod.xmb"))
         {
             lodXmb = (XmbNode)fileNode;
         }
     }
 }
Пример #4
0
        public RNumdl(Modl modl, RSkeleton skeleton, Matl matl, NumshbNode meshNode, NuhlpbNode hlpbNode, XmbNode modelXmb, XmbNode lodXmb,
                      Dictionary <string, RTexture> textureByName)
        {
            Modl          = modl;
            Skeleton      = skeleton;
            Matl          = matl;
            ModelXmb      = modelXmb?.Xmb;
            LodXmb        = lodXmb?.Xmb;
            TextureByName = textureByName;

            if (meshNode != null)
            {
                RenderModel = meshNode.GetRenderModel(Skeleton);
            }

            UpdateMaterials(matl);
            if (Skeleton != null)
            {
                hlpbNode?.AddToRenderSkeleton(Skeleton);
            }
        }