public static void parse_procTexture(ref List <TkProceduralTexture> parts, TkProceduralTextureList template, ref ResourceManager resMgr) { for (int i = 0; i < template.Layers.Length; i++) { TkProceduralTextureLayer layer = template.Layers[i]; string layername = layer.Name; int layerid = i; List <TkProceduralTexture> textures = layer.Textures; //Debug.WriteLine("Texture Layer: " + layerid.ToString()); parts[layerid] = null; //Init to null int sel; if (textures.Count > 0) { //Select one descriptor at random sel = Common.RenderState.randgen.Next(0, textures.Count); TkProceduralTexture texture = textures[sel]; string partName = texture.Diffuse; parts[layerid] = texture; //addToStr(ref parts, partName); } } }
//Generate procedural textures private static void prepareTextures(textureManager texMgr, string path) { //At this point, at least one sampler exists, so for now I assume that the first sampler //is always the diffuse sampler and I can initiate the mixing process Console.WriteLine("Procedural Texture Detected: " + path); CallBacks.Log(string.Format("Parsing Procedural Texture")); TkProceduralTextureList template = NMSUtils.LoadNMSTemplate(path, ref Common.RenderState.activeResMgr) as TkProceduralTextureList; List <TkProceduralTexture> texList = new List <TkProceduralTexture>(8); for (int i = 0; i < 8; i++) { texList.Add(null); } ModelProcGen.parse_procTexture(ref texList, template, ref Common.RenderState.activeResMgr); Common.CallBacks.Log("Proc Texture Selection"); for (int i = 0; i < 8; i++) { if (texList[i] != null) { string partNameDiff = texList[i].Diffuse; Common.CallBacks.Log(partNameDiff); } } Common.CallBacks.Log("Procedural Material. Trying to generate procTextures..."); for (int i = 0; i < 8; i++) { TkProceduralTexture ptex = texList[i]; //Add defaults if (ptex == null) { baseLayersUsed[i] = 0.0f; alphaLayersUsed[i] = 0.0f; continue; } string partNameDiff = ptex.Diffuse; string partNameMask = ptex.Mask; string partNameNormal = ptex.Normal; TkPaletteTexture paletteNode = ptex.Palette; string paletteName = paletteNode.Palette.ToString(); string colorName = paletteNode.ColourAlt.ToString(); Vector4 palColor = palette[paletteName][colorName]; //Randomize palette Color every single time //Vector3 palColor = Model_Viewer.Palettes.get_color(paletteName, colorName); //Store pallete color to Recolouring List reColourings[i] = new float[] { palColor[0], palColor[1], palColor[2], palColor[3] }; if (ptex.OverrideAverageColour) { avgColourings[i] = new float[] { ptex.AverageColour.R, ptex.AverageColour.G, ptex.AverageColour.B, ptex.AverageColour.A } } ; //Create Palette Option PaletteOpt palOpt = new PaletteOpt(); palOpt.PaletteName = paletteName; palOpt.ColorName = colorName; palOpts[i] = palOpt; Console.WriteLine("Index {0} Palette Selection {1} {2} ", i, palOpt.PaletteName, palOpt.ColorName); Console.WriteLine("Index {0} Color {1} {2} {3} {4}", i, palColor[0], palColor[1], palColor[2], palColor[3]); //DIFFUSE if (partNameDiff == "") { //Add White baseLayersUsed[i] = 0.0f; } else if (!texMgr.hasTexture(partNameDiff)) { //Configure the Diffuse Texture try { Texture tex = new Texture(partNameDiff); tex.palOpt = palOpt; tex.procColor = palColor; //Store to master texture manager Common.RenderState.activeResMgr.texMgr.addTexture(tex); //Save Texture to material difftextures[i] = tex; baseLayersUsed[i] = 1.0f; alphaLayersUsed[i] = 1.0f; } catch (System.IO.FileNotFoundException) { //Texture Not Found Continue Console.WriteLine("Diffuse Texture " + partNameDiff + " Not Found, Appending White Tex"); CallBacks.Log(string.Format("Diffuse Texture {0} Not Found", partNameDiff)); baseLayersUsed[i] = 0.0f; } } else //Load texture from dict { Texture tex = texMgr.getTexture(partNameDiff); //Save Texture to material difftextures[i] = tex; baseLayersUsed[i] = 1.0f; } //MASK if (partNameMask == "") { //Skip alphaLayersUsed[i] = 0.0f; } else if (!texMgr.hasTexture(partNameMask)) { //Configure Mask try { Texture texmask = new Texture(partNameMask); //Store to master texture manager Common.RenderState.activeResMgr.texMgr.addTexture(texmask); //Store Texture to material masktextures[i] = texmask; alphaLayersUsed[i] = 0.0f; } catch (System.IO.FileNotFoundException) { //Mask Texture not found Console.WriteLine("Mask Texture " + partNameMask + " Not Found"); CallBacks.Log(string.Format("Mask Texture {0} Not Found", partNameMask)); alphaLayersUsed[i] = 0.0f; } } else //Load texture from dict { Texture tex = texMgr.getTexture(partNameMask); //Store Texture to material masktextures[i] = tex; alphaLayersUsed[i] = 1.0f; } //NORMALS if (partNameNormal == "") { //Skip } else if (!texMgr.hasTexture(partNameNormal)) { try { Texture texnormal = new Texture(partNameNormal); //Store to master texture manager Common.RenderState.activeResMgr.texMgr.addTexture(texnormal); //Store Texture to material normaltextures[i] = texnormal; } catch (System.IO.FileNotFoundException) { //Normal Texture not found CallBacks.Log(string.Format("Normal Texture {0} Not Found", partNameNormal)); } } else //Load texture from dict { Texture tex = texMgr.getTexture(partNameNormal); //Store Texture to material normaltextures[i] = tex; } } }