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)); }
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; } } }
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; } } }
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); } }