Ejemplo n.º 1
0
 private void Frustum()
 {
     for (int i = 0; i < currentZones.Length; i++)
     {
         if (currentZones[i] != null)
         {
             lock (currentZones[i].thisLock)
             {
                 for (int j = 0; j < currentZones[i].GetObjets.Values.Count; j++)
                 {
                     for (int k = 0; k < currentZones[i].GetObjets[j].GetFace.Count; k++)
                     {
                         for (int l = 0; l < 3; l++)
                         {
                             if (camera.PointInFrustum(scene.vertex[currentZones[i].GetObjets[j].faces[k].vertex[l]]))
                             {
                                 FACE temp = new FACE();
                                 temp          = currentZones[i].GetObjets[j].faces[k];
                                 temp.afficher = true;
                                 currentZones[i].GetObjets[j].faces[k] = temp;
                             }
                             else
                             {
                                 FACE temp = new FACE();
                                 temp          = currentZones[i].GetObjets[j].faces[k];
                                 temp.afficher = false;
                                 currentZones[i].GetObjets[j].faces[k] = temp;
                             }
                         }
                     }
                 }
             }
         }
     }
 }
		public bool loadZone(int index){
			Zone zone;
			bool Ended = false;
			bool founded = false;
			if (!scene.zones.TryGetValue(index, out zone)){
				//Console.Write("loading zone" + index + "\n");
				string line;
				bool first = true;
				int cmptObjets = 0;
				System.IO.StreamReader file = new System.IO.StreamReader(filePath);
				while((line = file.ReadLine()) != null && !Ended)
				{
					if(line.StartsWith("z") && line.Contains(Convert.ToString(index))){
						founded = true;
						string[] zoneParams = line.Split(' ');
						zone = new Zone(zoneParams[2] + index, index);
						Objet3D o = new Objet3D();
						line = file.ReadLine();
						while(!Ended)
						{
							if(line == null)
								Ended = true;
							else {
								if (line.StartsWith("o") || line.StartsWith("g")) {
									if(line.Length > 1){
										if (!first) {
											cmptObjets++;
											zone.addObjet(cmptObjets, o);
										}
										
										o = new Objet3D(); 
										first = false;
									}
								}
								
								if (line.StartsWith("m")) {
									string[] mParams = line.Split(' ');
									readMaterial(mtlPath, mParams[1]);
									o.material = mParams[1];
								}
				
								if (line.StartsWith("v")) {
									
									char[] delimiterChars = {' '};
									string[] positions = line.Split (delimiterChars);
									Vector4 v = new Vector4 (float.Parse (positions [2]), float.Parse (positions [3]), float.Parse (positions [4]), 1.0f);
									
									if(line.StartsWith ("vn"))
										scene.addNormal(int.Parse(positions[1]),v);
				
									else if(line.StartsWith ("vt"))
										scene.addTexture(int.Parse (positions[1]),v);
									
									else
										scene.addVertex(int.Parse (positions[1]),v);
		
								}
				
								if ('f'.Equals(line[0])) {
									// Je sépare la ligne en fonction des espaces
									char[] delimiterChars = {' '};
									string[] vertex = line.Split (delimiterChars);
									string[] vertexValues = vertex[1].Split('/');
									FACE f1 = new FACE();
									f1.vertex = new int[vertex.Length-1];
									if(vertexValues.Length > 2) {
										if(!vertexValues[1].Equals(""))
											f1.texture = new int[vertex.Length-1];
										if (!vertexValues[2].Equals(""))
											f1.normals = new int[vertex.Length-1];
									}
									for(int i=1; i<vertex.Length; i++)
									{
										vertexValues = vertex[i].Split('/');
										f1.vertex[i-1] = (int.Parse(vertexValues[0]));

										if(vertexValues.Length > 2) {
											if(!vertexValues[1].Equals("")){
												f1.texture[i-1] = (int.Parse(vertexValues[1]));
											}
											if(!vertexValues[2].Equals("")){
												f1.normals[i-1] = (int.Parse(vertexValues[2]));
											}
										}
									}
									o.addFace(f1);
								}
								
								if(line.StartsWith("z"))
									Ended = true;

								line = file.ReadLine();
							}
							
						}
						Ended = true;
						zone.addObjet(cmptObjets,o);
					}
				}
				if(!founded)
				{
					zone = new Zone("zone"+index,index);
				}
				lock (scene.access)
						scene.addZone(index, ref zone);
			}
			return Ended;
		}
		public void addFace(FACE f)
		{
			faces.Add(f);
		}
Ejemplo n.º 4
0
 public void addFace(FACE f)
 {
     faces.Add(f);
 }
		public static void parseObj(string path, string pathMtl, Scene3D s)
		{
			int cmptVertex = 0;
			int cmptObjets = 0;
			string line;
			bool first = true;
			Zone z = new Zone("huge",0);
			Objet3D o = new Objet3D (); 
			System.IO.StreamReader file = new System.IO.StreamReader(path);
			while ((line = file.ReadLine()) != null) {
				if (!line.Equals ("")) {
					if('u'.Equals(line[0]))
					{
						if (line.Contains("usemtl"))
						{
							char[] delimiterChars = {' '};
							string[] positions = line.Split (delimiterChars);
							//o.material = positions[1];
							//readMaterial(pathMtl,positions[1], s);
						}
					}
					// On regarde si on a un nouvel objet
					if ('o'.Equals(line[0]) || 'g'.Equals(line [0])) {
						if(line.Length > 1){
							if (!first) {
								o.Center /= o.VertexCount;
								cmptObjets++;
								z.addObjet(cmptObjets, o);
							}
			
							o = new Objet3D(); 

							first = false;
						}
					}
			
					if ('v'.Equals(line[0])) {
						if('n'.Equals(line[1]))
						{
							// Je sépare la ligne en fonction des espaces
							char[] delimiterChars = {' '};
							string[] positions = line.Split (delimiterChars);
							//Console.WriteLine ("\t" + line);		
							// Je suis obligé de changer les . par des , sinon il n'arrive pas à parser
							Vector4 v = new Vector4 (float.Parse (positions [1]), float.Parse (positions [2]), float.Parse (positions [3]), 1.0f);
							s.addNormal(s.vertexNormals.Count,v);
						}

						else if('t'.Equals(line[1]))
						{
							// Je sépare la ligne en fonction des espaces
							char[] delimiterChars = {' '};
							string[] positions = line.Split (delimiterChars);
							Vector4 v;
							if(positions.Length == 3)
								v = new Vector4 (float.Parse (positions [1]), float.Parse (positions [2]), 0.0f, 1.0f);
							else
								v = new Vector4 (float.Parse (positions [1]), float.Parse (positions [2]), float.Parse (positions [3]), 1.0f);

							s.addTexture(s.textureCoords.Count,v);
						}

						else
						{
							// Je sépare la ligne en fonction des espaces
							char[] delimiterChars = {' '};
							string[] positions = line.Split (delimiterChars);
							//Console.WriteLine ("\t" + line);		
							// Je suis obligé de changer les . par des , sinon il n'arrive pas à parser
							Vector4 v = new Vector4 (float.Parse(positions[1]), float.Parse (positions[2]), float.Parse (positions[3]), 1.0f);
							Vector4 v3 = new Vector4(v.X,v.Y,v.Z, 1);
							tabMinMaxXZScene(v3, s);
							tabMinMaxXZObject(v3, o);
							o.Center += v3;
							o.VertexCount++;
							cmptVertex++;
							s.addVertex(s.vertex.Count, v);
						}
					}

					if ('f'.Equals(line[0])) {
						// Je sépare la ligne en fonction des espaces
						char[] delimiterChars = {' '};
						string[] vertex = line.Split (delimiterChars);
						string[] vertexValues = vertex[1].Split('/');
						FACE f1 = new FACE();
						f1.vertex = new int[vertex.Length-1];
						if(vertexValues.Length > 2) {
							if(!vertexValues[1].Equals(""))
								f1.texture = new int[vertex.Length-1];
							if (!vertexValues[2].Equals(""))
								f1.normals = new int[vertex.Length-1];
						}
						for(int i=1; i<vertex.Length; i++)
						{
							vertexValues = vertex[i].Split('/');
							f1.vertex[i-1] = (int.Parse(vertexValues[0])) -1;
							f1.center += new Vector3(s.vertex[f1.vertex[i-1]]);
							if(vertexValues.Length > 2) {
								if(!vertexValues[1].Equals("")){
									f1.texture[i-1] = (int.Parse(vertexValues[1])) -1;
								}
								if(!vertexValues[2].Equals("")){
									f1.normals[i-1] = (int.Parse(vertexValues[2])) -1;
								}
							}

						}
						f1.center /= vertex.Length-1;
						o.addFace(f1);
					}
				}
			}
			cmptObjets++;
			z.addObjet(cmptObjets, o);
			s.addZone(s.zones.Count, ref z);
			s.SetTaille();
			s._nbrVertex = cmptVertex;
		}
			private void Frustum ()
			{
				for (int i = 0; i < currentZones.Length; i++) 
				{
					if(currentZones[i] != null) 
					{
						lock (currentZones[i].thisLock)
						{
							for (int j = 0; j < currentZones[i].GetObjets.Values.Count; j++)
							{
								for (int k = 0; k < currentZones[i].GetObjets[j].GetFace.Count; k++)
								{
									for (int l = 0; l < 3; l++)
									{
										if (camera.PointInFrustum(scene.vertex[currentZones[i].GetObjets[j].faces[k].vertex[l]]))
										{
											FACE temp = new FACE();
											temp = currentZones[i].GetObjets[j].faces[k];
											temp.afficher = true;
											currentZones[i].GetObjets[j].faces[k] = temp;
										}
										else
										{
											FACE temp = new FACE();
											temp = currentZones[i].GetObjets[j].faces[k];
											temp.afficher = false;
											currentZones[i].GetObjets[j].faces[k] = temp;
										}
									}
								}
							}
						}
					}
				}
			}
        public static void parseObj(string path, string pathMtl, Scene3D s)
        {
            int     cmptVertex = 0;
            int     cmptObjets = 0;
            string  line;
            bool    first = true;
            Zone    z     = new Zone("huge", 0);
            Objet3D o     = new Objet3D();

            System.IO.StreamReader file = new System.IO.StreamReader(path);
            while ((line = file.ReadLine()) != null)
            {
                if (!line.Equals(""))
                {
                    if ('u'.Equals(line[0]))
                    {
                        if (line.Contains("usemtl"))
                        {
                            char[]   delimiterChars = { ' ' };
                            string[] positions      = line.Split(delimiterChars);
                            //o.material = positions[1];
                            //readMaterial(pathMtl,positions[1], s);
                        }
                    }
                    // On regarde si on a un nouvel objet
                    if ('o'.Equals(line[0]) || 'g'.Equals(line [0]))
                    {
                        if (line.Length > 1)
                        {
                            if (!first)
                            {
                                o.Center /= o.VertexCount;
                                cmptObjets++;
                                z.addObjet(cmptObjets, o);
                            }

                            o = new Objet3D();

                            first = false;
                        }
                    }

                    if ('v'.Equals(line[0]))
                    {
                        if ('n'.Equals(line[1]))
                        {
                            // Je sépare la ligne en fonction des espaces
                            char[]   delimiterChars = { ' ' };
                            string[] positions      = line.Split(delimiterChars);
                            //Console.WriteLine ("\t" + line);
                            // Je suis obligé de changer les . par des , sinon il n'arrive pas à parser
                            Vector4 v = new Vector4(float.Parse(positions [1]), float.Parse(positions [2]), float.Parse(positions [3]), 1.0f);
                            s.addNormal(s.vertexNormals.Count, v);
                        }

                        else if ('t'.Equals(line[1]))
                        {
                            // Je sépare la ligne en fonction des espaces
                            char[]   delimiterChars = { ' ' };
                            string[] positions      = line.Split(delimiterChars);
                            Vector4  v;
                            if (positions.Length == 3)
                            {
                                v = new Vector4(float.Parse(positions [1]), float.Parse(positions [2]), 0.0f, 1.0f);
                            }
                            else
                            {
                                v = new Vector4(float.Parse(positions [1]), float.Parse(positions [2]), float.Parse(positions [3]), 1.0f);
                            }

                            s.addTexture(s.textureCoords.Count, v);
                        }

                        else
                        {
                            // Je sépare la ligne en fonction des espaces
                            char[]   delimiterChars = { ' ' };
                            string[] positions      = line.Split(delimiterChars);
                            //Console.WriteLine ("\t" + line);
                            // Je suis obligé de changer les . par des , sinon il n'arrive pas à parser
                            Vector4 v  = new Vector4(float.Parse(positions[1]), float.Parse(positions[2]), float.Parse(positions[3]), 1.0f);
                            Vector4 v3 = new Vector4(v.X, v.Y, v.Z, 1);
                            tabMinMaxXZScene(v3, s);
                            tabMinMaxXZObject(v3, o);
                            o.Center += v3;
                            o.VertexCount++;
                            cmptVertex++;
                            s.addVertex(s.vertex.Count, v);
                        }
                    }

                    if ('f'.Equals(line[0]))
                    {
                        // Je sépare la ligne en fonction des espaces
                        char[]   delimiterChars = { ' ' };
                        string[] vertex         = line.Split(delimiterChars);
                        string[] vertexValues   = vertex[1].Split('/');
                        FACE     f1             = new FACE();
                        f1.vertex = new int[vertex.Length - 1];
                        if (vertexValues.Length > 2)
                        {
                            if (!vertexValues[1].Equals(""))
                            {
                                f1.texture = new int[vertex.Length - 1];
                            }
                            if (!vertexValues[2].Equals(""))
                            {
                                f1.normals = new int[vertex.Length - 1];
                            }
                        }
                        for (int i = 1; i < vertex.Length; i++)
                        {
                            vertexValues     = vertex[i].Split('/');
                            f1.vertex[i - 1] = (int.Parse(vertexValues[0])) - 1;
                            f1.center       += new Vector3(s.vertex[f1.vertex[i - 1]]);
                            if (vertexValues.Length > 2)
                            {
                                if (!vertexValues[1].Equals(""))
                                {
                                    f1.texture[i - 1] = (int.Parse(vertexValues[1])) - 1;
                                }
                                if (!vertexValues[2].Equals(""))
                                {
                                    f1.normals[i - 1] = (int.Parse(vertexValues[2])) - 1;
                                }
                            }
                        }
                        f1.center /= vertex.Length - 1;
                        o.addFace(f1);
                    }
                }
            }
            cmptObjets++;
            z.addObjet(cmptObjets, o);
            s.addZone(s.zones.Count, ref z);
            s.SetTaille();
            s._nbrVertex = cmptVertex;
        }
Ejemplo n.º 8
0
        public bool loadZone(int index)
        {
            Zone zone;
            bool Ended   = false;
            bool founded = false;

            if (!scene.zones.TryGetValue(index, out zone))
            {
                //Console.Write("loading zone" + index + "\n");
                string line;
                bool   first                = true;
                int    cmptObjets           = 0;
                System.IO.StreamReader file = new System.IO.StreamReader(filePath);
                while ((line = file.ReadLine()) != null && !Ended)
                {
                    if (line.StartsWith("z") && line.Contains(Convert.ToString(index)))
                    {
                        founded = true;
                        string[] zoneParams = line.Split(' ');
                        zone = new Zone(zoneParams[2] + index, index);
                        Objet3D o = new Objet3D();
                        line = file.ReadLine();
                        while (!Ended)
                        {
                            if (line == null)
                            {
                                Ended = true;
                            }
                            else
                            {
                                if (line.StartsWith("o") || line.StartsWith("g"))
                                {
                                    if (line.Length > 1)
                                    {
                                        if (!first)
                                        {
                                            cmptObjets++;
                                            zone.addObjet(cmptObjets, o);
                                        }

                                        o     = new Objet3D();
                                        first = false;
                                    }
                                }

                                if (line.StartsWith("m"))
                                {
                                    string[] mParams = line.Split(' ');
                                    readMaterial(mtlPath, mParams[1]);
                                    o.material = mParams[1];
                                }

                                if (line.StartsWith("v"))
                                {
                                    char[]   delimiterChars = { ' ' };
                                    string[] positions      = line.Split(delimiterChars);
                                    Vector4  v = new Vector4(float.Parse(positions [2]), float.Parse(positions [3]), float.Parse(positions [4]), 1.0f);

                                    if (line.StartsWith("vn"))
                                    {
                                        scene.addNormal(int.Parse(positions[1]), v);
                                    }

                                    else if (line.StartsWith("vt"))
                                    {
                                        scene.addTexture(int.Parse(positions[1]), v);
                                    }

                                    else
                                    {
                                        scene.addVertex(int.Parse(positions[1]), v);
                                    }
                                }

                                if ('f'.Equals(line[0]))
                                {
                                    // Je sépare la ligne en fonction des espaces
                                    char[]   delimiterChars = { ' ' };
                                    string[] vertex         = line.Split(delimiterChars);
                                    string[] vertexValues   = vertex[1].Split('/');
                                    FACE     f1             = new FACE();
                                    f1.vertex = new int[vertex.Length - 1];
                                    if (vertexValues.Length > 2)
                                    {
                                        if (!vertexValues[1].Equals(""))
                                        {
                                            f1.texture = new int[vertex.Length - 1];
                                        }
                                        if (!vertexValues[2].Equals(""))
                                        {
                                            f1.normals = new int[vertex.Length - 1];
                                        }
                                    }
                                    for (int i = 1; i < vertex.Length; i++)
                                    {
                                        vertexValues     = vertex[i].Split('/');
                                        f1.vertex[i - 1] = (int.Parse(vertexValues[0]));

                                        if (vertexValues.Length > 2)
                                        {
                                            if (!vertexValues[1].Equals(""))
                                            {
                                                f1.texture[i - 1] = (int.Parse(vertexValues[1]));
                                            }
                                            if (!vertexValues[2].Equals(""))
                                            {
                                                f1.normals[i - 1] = (int.Parse(vertexValues[2]));
                                            }
                                        }
                                    }
                                    o.addFace(f1);
                                }

                                if (line.StartsWith("z"))
                                {
                                    Ended = true;
                                }

                                line = file.ReadLine();
                            }
                        }
                        Ended = true;
                        zone.addObjet(cmptObjets, o);
                    }
                }
                if (!founded)
                {
                    zone = new Zone("zone" + index, index);
                }
                lock (scene.access)
                    scene.addZone(index, ref zone);
            }
            return(Ended);
        }