Ejemplo n.º 1
0
		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);
			}
		}
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
        //! 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);
        }