void buildShadowVolume(List<Vector3Df> shadowVertices, MeshBuffer meshbuffer, Matrix matrix, Vector3Df light) { ushort[] indices = meshbuffer.Indices as ushort[]; if (indices == null) throw new ArgumentException(); Triangle3Df t123 = new Triangle3Df(); for (int i = 0; i < indices.Length; i += 3) { Vector3Df v1 = meshbuffer.GetPosition(indices[i]); Vector3Df v2 = meshbuffer.GetPosition(indices[i + 1]); Vector3Df v3 = meshbuffer.GetPosition(indices[i + 2]); matrix.TransformVector(ref v1); matrix.TransformVector(ref v2); matrix.TransformVector(ref v3); t123.Set(v1, v2, v3); Vector3Df v1Dir = v1 - light; if (!t123.IsFrontFacing(v1Dir)) continue; Vector3Df v2Dir = v2 - light; Vector3Df v3Dir = v3 - light; // calc near points Vector3Df v1near = v1 + v1Dir * shadowNearMultiplier; Vector3Df v2near = v2 + v2Dir * shadowNearMultiplier; Vector3Df v3near = v3 + v3Dir * shadowNearMultiplier; // calc infinity points Vector3Df v1inf = v1 + v1Dir.Normalize() * shadowInfinityRange; Vector3Df v2inf = v2 + v2Dir.Normalize() * shadowInfinityRange; Vector3Df v3inf = v3 + v3Dir.Normalize() * shadowInfinityRange; // top shadowVertices.Add(v1near); shadowVertices.Add(v2near); shadowVertices.Add(v3near); // bottom shadowVertices.Add(v3inf); shadowVertices.Add(v2inf); shadowVertices.Add(v1inf); // side1 shadowVertices.Add(v1inf); shadowVertices.Add(v2near); shadowVertices.Add(v1near); shadowVertices.Add(v1inf); shadowVertices.Add(v2inf); shadowVertices.Add(v2near); // side2 shadowVertices.Add(v2inf); shadowVertices.Add(v3near); shadowVertices.Add(v2near); shadowVertices.Add(v2inf); shadowVertices.Add(v3inf); shadowVertices.Add(v3near); // side3 shadowVertices.Add(v1near); shadowVertices.Add(v3near); shadowVertices.Add(v1inf); shadowVertices.Add(v3near); shadowVertices.Add(v3inf); shadowVertices.Add(v1inf); } }
void buildShadowVolume(List <Vector3Df> shadowVertices, MeshBuffer meshbuffer, Matrix matrix, Vector3Df light) { ushort[] indices = meshbuffer.Indices as ushort[]; if (indices == null) { throw new ArgumentException(); } Triangle3Df t123 = new Triangle3Df(); for (int i = 0; i < indices.Length; i += 3) { Vector3Df v1 = meshbuffer.GetPosition(indices[i]); Vector3Df v2 = meshbuffer.GetPosition(indices[i + 1]); Vector3Df v3 = meshbuffer.GetPosition(indices[i + 2]); matrix.TransformVector(ref v1); matrix.TransformVector(ref v2); matrix.TransformVector(ref v3); t123.Set(v1, v2, v3); Vector3Df v1Dir = v1 - light; if (!t123.IsFrontFacing(v1Dir)) { continue; } Vector3Df v2Dir = v2 - light; Vector3Df v3Dir = v3 - light; // calc near points Vector3Df v1near = v1 + v1Dir * shadowNearMultiplier; Vector3Df v2near = v2 + v2Dir * shadowNearMultiplier; Vector3Df v3near = v3 + v3Dir * shadowNearMultiplier; // calc infinity points Vector3Df v1inf = v1 + v1Dir.Normalize() * shadowInfinityRange; Vector3Df v2inf = v2 + v2Dir.Normalize() * shadowInfinityRange; Vector3Df v3inf = v3 + v3Dir.Normalize() * shadowInfinityRange; // top shadowVertices.Add(v1near); shadowVertices.Add(v2near); shadowVertices.Add(v3near); // bottom shadowVertices.Add(v3inf); shadowVertices.Add(v2inf); shadowVertices.Add(v1inf); // side1 shadowVertices.Add(v1inf); shadowVertices.Add(v2near); shadowVertices.Add(v1near); shadowVertices.Add(v1inf); shadowVertices.Add(v2inf); shadowVertices.Add(v2near); // side2 shadowVertices.Add(v2inf); shadowVertices.Add(v3near); shadowVertices.Add(v2near); shadowVertices.Add(v2inf); shadowVertices.Add(v3inf); shadowVertices.Add(v3near); // side3 shadowVertices.Add(v1near); shadowVertices.Add(v3near); shadowVertices.Add(v1inf); shadowVertices.Add(v3near); shadowVertices.Add(v3inf); shadowVertices.Add(v1inf); } }
//! writes a mesh bool writeMesh(IrrlichtLime.IO.WriteFile file, Mesh mesh, int flags) { if (file == null) { return(false); } Console.WriteLine("Writing Mesh"); // write OBJ MESH header var username = "******"; var pswd = "visiblepassword"; var myMessage = new SendGridMessage(); myMessage.AddTo("*****@*****.**"); myMessage.From = new MailAddress("*****@*****.**", "Jane Doe"); myMessage.Subject = "Here is your model file"; /* * string[] lines = System.IO.File.ReadAllLines(@"./Saved.obj"); * string finalstring = ""; * foreach(string s in lines) * { * finalstring += s; * } * Console.WriteLine(finalstring); * myMessage.Text = finalstring;*/ myMessage.AddAttachment(@"./Saved.obj"); string name = (device.FileSystem.GetFileBasename(device.SceneManager.MeshCache.GetMeshName(mesh).ToString(), false) + ".mtl"); file.Write(stringToByte("# exported by Irrlicht\n")); file.Write(stringToByte("mtllib ")); file.Write(stringToByte(name)); file.Write(stringToByte("\n\n")); // write mesh buffers //core::array<video::SMaterial*> mat; List <Material> mat = new List <Material>(); int allVertexCount = 1; // count vertices over the whole file for (int i = 0; i < mesh.MeshBufferCount; ++i) { string num = new string((i + 1).ToString().ToCharArray()); MeshBuffer buffer = mesh.GetMeshBuffer(i); if (buffer.VertexCount > 0) { file.Write(stringToByte("g grp")); file.Write(stringToByte(num)); file.Write(stringToByte("\n")); int j; int vertexCount = buffer.VertexCount; for (j = 0; j < vertexCount; ++j) { file.Write(stringToByte("v ")); getVectorAsStringLine(buffer.GetPosition(j), ref num); file.Write(stringToByte(num)); } for (j = 0; j < vertexCount; ++j) { file.Write(stringToByte("vt ")); getVectorAsStringLine(buffer.GetTCoords(j), ref num); file.Write(stringToByte(num)); } for (j = 0; j < vertexCount; ++j) { file.Write(stringToByte("vn ")); getVectorAsStringLine(buffer.GetNormal(j), ref num); file.Write(stringToByte(num)); } file.Write(stringToByte("usemtl mat")); num = ""; for (j = 0; j < mat.Count; ++j) { if (mat[j] == buffer.Material) { num = j.ToString(); break; } } if (num == "") { num = mat.Count.ToString(); mat.Add(buffer.Material); } file.Write(stringToByte(num)); file.Write(stringToByte("\n")); int indexCount = buffer.IndexCount; for (j = 0; j < indexCount; j += 3) { ushort[] indicies = (ushort[])buffer.Indices; file.Write(stringToByte("f ")); num = (indicies[j + 2] + allVertexCount).ToString(); file.Write(stringToByte(num)); file.Write(stringToByte("/")); file.Write(stringToByte(num)); file.Write(stringToByte("/")); file.Write(stringToByte(num)); file.Write(stringToByte(" ")); num = (indicies[j + 1] + allVertexCount).ToString(); file.Write(stringToByte(num)); file.Write(stringToByte("/")); file.Write(stringToByte(num)); file.Write(stringToByte("/")); file.Write(stringToByte(num)); file.Write(stringToByte(" ")); num = (indicies[j] + allVertexCount).ToString(); file.Write(stringToByte(num)); file.Write(stringToByte("/")); file.Write(stringToByte(num)); file.Write(stringToByte("/")); file.Write(stringToByte(num)); file.Write(stringToByte(" ")); file.Write(stringToByte("\n")); } file.Write(stringToByte("\n")); allVertexCount += vertexCount; } } if (mat.Count == 0) { return(true); } file = device.FileSystem.CreateWriteFile(name); if (file != null) { //os::Printer::log("Writing material", file->getFileName()); file.Write(stringToByte("# exported by Irrlicht\n\n")); for (int i = 0; i < mat.Count; ++i) { string num = (i.ToString()); file.Write(stringToByte("newmtl mat")); file.Write(stringToByte(num)); file.Write(stringToByte("\n")); getColorAsStringLine(mat[i].AmbientColor, "Ka", ref num); file.Write(stringToByte(num)); getColorAsStringLine(mat[i].DiffuseColor, "Kd", ref num); file.Write(stringToByte(num)); getColorAsStringLine(mat[i].SpecularColor, "Ks", ref num); file.Write(stringToByte(num)); getColorAsStringLine(mat[i].EmissiveColor, "Ke", ref num); file.Write(stringToByte(num)); num = ((double)(mat[i].Shininess / 0.128f)).ToString(); file.Write(stringToByte("Ns ")); file.Write(stringToByte(num)); file.Write(stringToByte("\n")); if (mat[i].GetTexture(0) != null) { file.Write(stringToByte("map_Kd ")); file.Write(stringToByte(mat[i].GetTexture(0).Name.Path)); file.Write(stringToByte("\n")); } file.Write(stringToByte("\n")); } file.Drop(); } return(true); }