public static void KCL2OBJ(string fname, KCL kcl) { int FaceShift = 1; using (StreamWriter f = new StreamWriter(fname)) { foreach (KCL.KCLModel mdl in kcl.models) { List <Vector3> VerticesN = new List <Vector3>(); //a lot of normals are often shared f.WriteLine($"o {mdl.Text}"); foreach (KCL.Vertex vtx in mdl.vertices) { f.WriteLine($"v {vtx.pos.X} {vtx.pos.Y} {vtx.pos.Z}"); } foreach (KCL.Vertex vtx in mdl.vertices) { f.WriteLine($"vn {vtx.nrm.X} {vtx.nrm.Y} {vtx.nrm.Z}"); } f.WriteLine($"usemtl None"); f.WriteLine($"s off"); var vert = mdl.CreateDisplayVertices(); for (int i = 0; i < mdl.display.Length; i++) { int[] verts = new int[3] { (int)mdl.display[i++], (int)mdl.display[i++], (int)mdl.display[i] }; int[] normals = new int[3] { VerticesN.IndexOf(mdl.vertices[verts[0]].nrm), VerticesN.IndexOf(mdl.vertices[verts[1]].nrm), VerticesN.IndexOf(mdl.vertices[verts[2]].nrm) }; f.WriteLine($"f {verts[0] + FaceShift}/{verts[0] + FaceShift}/{normals[0] + FaceShift} {verts[1] + FaceShift}/{verts[1] + FaceShift}/{normals[1] + FaceShift} {verts[2] + FaceShift}/{verts[2] + FaceShift}/{normals[2] + FaceShift}"); } FaceShift += vert.Count; } } }
public void Render(Camera camera, int depthMap, Matrix4 lightMatrix, Vector2 screenDimensions, bool drawShadow = false) { if (!Checked) { return; } Shader shader; // 3DS MBN shader = OpenTKSharedResources.shaders["Mbn"]; shader.UseProgram(); SetMbnUniforms(camera, shader); // Melee DAT shader = OpenTKSharedResources.shaders["Dat"]; shader.UseProgram(); SetDatUniforms(shader); if (BCH != null) { foreach (BCH_Model mo in BCH.Models.Nodes) { mo.Render(camera.MvpMatrix); } } if (DatMelee != null && OpenTKSharedResources.shaders["Dat"].ProgramCreatedSuccessfully) { DatMelee.Render(camera.MvpMatrix); } LightColor diffuseColor = Runtime.lightSetParam.characterDiffuse.diffuseColor; LightColor ambientColor = Runtime.lightSetParam.characterDiffuse.ambientColor; if (KCL != null && OpenTKSharedResources.shaders["KCL"].ProgramCreatedSuccessfully) { shader = OpenTKSharedResources.shaders["KCL"]; shader.UseProgram(); shader.SetVector3("difLightColor", diffuseColor.R, diffuseColor.G, diffuseColor.B); shader.SetVector3("ambLightColor", ambientColor.R, ambientColor.G, ambientColor.B); KCL.Render(camera.MvpMatrix); } if (BFRES != null && OpenTKSharedResources.shaders["BFRES"].ProgramCreatedSuccessfully && OpenTKSharedResources.shaders["BFRES_PBR"].ProgramCreatedSuccessfully) { if (Runtime.renderPhysicallyBasedRendering == true) { shader = OpenTKSharedResources.shaders["BFRES_PBR"]; } else { shader = OpenTKSharedResources.shaders["BFRES"]; } shader.UseProgram(); shader.SetVector3("difLightColor", diffuseColor.R, diffuseColor.G, diffuseColor.B); shader.SetVector3("ambLightColor", ambientColor.R, ambientColor.G, ambientColor.B); Matrix4 invertedCamera = camera.MvpMatrix.Inverted(); Vector3 lightDirection = new Vector3(0f, 0f, -1f); //Todo. Maybe change direction via AAMP file (configs shader data) shader.SetVector3("lightDirection", Vector3.TransformNormal(lightDirection, invertedCamera).Normalized()); shader.SetVector3("specLightDirection", Vector3.TransformNormal(lightDirection, invertedCamera).Normalized()); shader.SetVector3("difLightDirection", Vector3.TransformNormal(lightDirection, invertedCamera).Normalized()); shader.SetInt("debugOption", (int)Runtime.uvChannel); // This cube map is for a quick test. shader.SetTexture("cmap", RenderTools.dummyTextures[NUD.DummyTextures.StageMapHigh].Id, TextureTarget.TextureCubeMap, 2); BFRES.Render(camera.MvpMatrix); } if (NUD != null && OpenTKSharedResources.shaders["Nud"].ProgramCreatedSuccessfully && OpenTKSharedResources.shaders["NudDebug"].ProgramCreatedSuccessfully) { // Choose the appropriate shader. if (drawShadow) { shader = OpenTKSharedResources.shaders["Shadow"]; } else if (Runtime.renderType != Runtime.RenderTypes.Shaded) { shader = OpenTKSharedResources.shaders["NudDebug"]; } else { shader = OpenTKSharedResources.shaders["Nud"]; } shader.UseProgram(); // Matrices. Matrix4 lightMatrixRef = lightMatrix; shader.SetMatrix4x4("lightMatrix", ref lightMatrixRef); SetCameraMatrixUniforms(camera, shader); SetRenderSettingsUniforms(shader); SetLightingUniforms(shader, camera); shader.SetInt("renderType", (int)Runtime.renderType); shader.SetInt("debugOption", (int)Runtime.uvChannel); shader.SetBoolToInt("drawShadow", Runtime.drawModelShadow); shader.SetTexture("depthMap", depthMap, TextureTarget.Texture2D, 14); SetElapsedDirectUvTime(shader); NUD.Render(VBN, camera, drawShadow, Runtime.drawNudColorIdPass); } }