Pages: 1
Salut à tous !
Dans le cadre d'un éditeur de terrain je dois créer un TerrainSceneNode. Je le déclare comme d'habitude, je compile, et quand je le lance, gros plantage...
La référence d'objet n'est pas définie à une instance d'un objet.
Voilà le code en question :
using System; using System.Collections.Generic; using System.io; using System.Xml; using System.Windows.Forms; using IrrlichtNETCP; namespace XTremEditor { class Program { IrrlichtDevice device; TerrainSceneNode map; string heightmap; string texturemap; string detailmap; /// <summary> /// Point d'entrée principal de l'application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new FormGeneral()); } public void startEngine(Control c, string mapfile) { device = new IrrlichtDevice(DriverType.Direct3D9, new dimension2d(c.Width, c.Height), 32, false, false, false, false, c.Handle); VideoDriver driver = device.VideoDriver; // Chargement de ma map loadMap(mapfile); //****************************************** // Ajouter la camera //****************************************** SceneManager smgr = device.SceneManager; CameraSceneNode camera = smgr.AddCameraSceneNode(null); camera.Position = new vector3d(1900 * 2, 255 * 2, 3700 * 2); camera.FarValue = 12000.0f; //****************************************** // Ajouter la map //****************************************** // Erreur ICI : map = smgr.AddTerrainSceneNode(heightmap, null, -1, new vector3d(), new vector3d(40, 4.4f, 40),new vector3d(0,0,0), new IrrlichtNETCP.Color(255, 255, 255, 255), 1, TerrainPatchSize.TPS65); map.SetMaterialFlag(MaterialFlag.Lighting, false); map.SetMaterialType(MaterialType.DETAIL_MAP); map.SetMaterialTexture(0, driver.GetTexture(texturemap)); map.SetMaterialTexture(1, driver.GetTexture(detailmap)); //****************************************** // Ajouter la skybox //****************************************** driver.SetTextureFlag(TextureCreationFlag.CreateMipMaps, false); smgr.AddSkyBoxSceneNode(null, new Texture[] { driver.GetTexture("media\\irrlicht2_up.jpg"), driver.GetTexture("media\\irrlicht2_dn.jpg"), driver.GetTexture("media\\irrlicht2_lf.jpg"), driver.GetTexture("media\\irrlicht2_rt.jpg"), driver.GetTexture("media\\irrlicht2_ft.jpg"), driver.GetTexture("media\\irrlicht2_bk.jpg")}, -1); driver.SetTextureFlag(TextureCreationFlag.CreateMipMaps, true); // Rendu de la scene while (device.Run() && c.Enabled) { device.VideoDriver.BeginScene(true, true, new IrrlichtNETCP.Color(255, 0, 0, 50)); device.SceneManager.DrawAll(); device.VideoDriver.EndScene(); } } public void loadMap(string mamap) { XmlTextReader loadmap=new XmlTextReader(mamap); loadmap.WhitespaceHandling = WhitespaceHandling.None; while (loadmap.Read()) { if (loadmap.LocalName == "heightmap") { heightmap = loadmap.ReadString(); MessageBox.Show(heightmap); } if (loadmap.LocalName == "texturemap") { texturemap = loadmap.ReadString(); MessageBox.Show(texturemap); } if (loadmap.LocalName == "detailmap") { detailmap = loadmap.ReadString(); MessageBox.Show(detailmap); } } loadmap.Close(); } } }
Et je ne parviens pas à déterminer d'ou vient l'erreur, car j'ai à peu près suivi l'exemple fourni avec Irrlicht (je l'ai juste adapté pour IrrlichtNETCP).
Merci de votre attention, et encore plus merci à ceux qui trouveront l'erreur ou du moins essaieront
Hors ligne
"1, TerrainPatchSize.TPS65);"
valeurs MaxLOD puis TerrainPatchSize.
A mon avis, non seulement MaxLOD est microscopique mais surtout TerrainPatchSize est trop grand...
Essayes avec :
"5, TerrainPatchSize.TPS17);"
Après, vérifie que c'est pas une erreur de chargement de ta heightmap non plus
PS : Inutile d'adapter les tutoriels d'Irrlicht, Zitzu l'a fait pour nous :
http://irrlichtnetcp.sourceforge.net/in … :Tutorials
http://irrlichtnetcp.sourceforge.net/in … _:_Terrain
Hors ligne
Pour ce qui est du MaxLOD puis TerrainPatchSize, même des valeurs correctes ne changent rien au problème.
J'ai également testé la heightmap, et le chemin est correct...
Je suis sûr que c'est une erreur à la c**, mais j'arrive pas à mettre le doigt dessus !
Hors ligne
En fait je t'ai dit une bêtise, si jamais c'était ces deux valeurs qui étaient incorrectes, tu aurais une erreur de mémoire corrompue (erreur dans la pile native donc) et non pas une null reference.
Si Irrlicht .NET CP fonctionne bien, il te fournit une stacktrace au moment du plantage (voire même une erreur native si tu es sur Windows). C'est à dire l'endroit exact dans la pile managée où le bug a eu lieu. J'aimerais bien avoir l'élément le plus haut pour pouvoir à la limite me référer à la source.
En gros, savoir si l'erreur est au niveau de la création de ton terrain (ligne smgr.AddTerrain...) ou si ça fonctionne mais que le terrain est à "null" (ligne "map.SetMaterialFlag...").
PS :
map.SetMaterialType(MaterialType.DETAIL_MAP);
c'est Irrlicht .NET CP ça ? J'avoue que je comprends pas trop étant donné que toutes les énumérations ont été réécrites à la main ça devrait donner "MaterialType.DetailMap".
Hors ligne
En testant, je me suis aperçu que même déclaré, map est à "null", ca doit donc venir de la ligne map = smgr.AddTerrainSceneNode...
map.SetMaterialType(MaterialType.DETAIL_MAP); : à la base non, mais maintenant si
Hors ligne
Alors regarde la console d'Irrlicht, c'est sûrement une erreur dans le chargement de ta heightmap.
Hors ligne
Je m'autoproclame boulet de l'année...
Après trois jour à galèrer sur cette erreur, je me suis aperçu que le paramètre heightmap était incorrect (il y avait bien le nom du fichier mais pas le chemin ).
Donc celle ci est corrigée, mais une nouvelle apparait au moment du chargement de la skybox :
smgr.AddSkyBoxSceneNode(null, new Texture[] { driver.GetTexture("media\\irrlicht2_up.jpg"), driver.GetTexture("media\\irrlicht2_dn.jpg"), driver.GetTexture("media\\irrlicht2_lf.jpg"), driver.GetTexture("media\\irrlicht2_rt.jpg"), driver.GetTexture("media\\irrlicht2_ft.jpg"), driver.GetTexture("media\\irrlicht2_bk.jpg")}, 0);
Ce coup là j'ai vérifié les chemins et le nom du fichier, rien à dire. Mais ca plante quand même...
Hors ligne
quel plantage? La référence d'objet n'est pas définie à une instance d'un objet ?
à la place de null je mettrais device.SceneManager.RottSceneNode, on sais jamais. Est tu sûr de tes chemins? As-tu bien le repertoire media dans le rep debug ou release?
Hors ligne
Déjà moi j'aime pas ça :
"\\" ... en général on met ça : "/" (question de compatibilité, pensez aux amis linuxiens) Ou alors par supra propreté on utilise le DirectoryCharSeparator de .NET qui se met à jour selon Windows ou Linux.
Sinon bien sûr vérifie que le fichier et le dossier sont au bon endroit.
Et enfin, lis ce que dit izguit parce qu'un plantage ça peut être tout et n'importe quoi (NullReferenceException, MemoryCorrupt, Pure virtual function call...).
Pour ce qui est de RootSceneNode, normalement Irrlicht .NET CP le fait à ta place (même pour les custom scene nodes contrairement à Irrlicht) mais tu peux toujours tester bien sûr
Hors ligne
Encore une fois c'était une erreur à la c***...
En fait le loader du fichier XML change automatiquement de dossier, et donc ne prenais plus en compte l'ancien chemin.
DeusXL :
Déjà moi j'aime pas ça :
"\\" ... en général on met ça : "/" (question de compatibilité, pensez aux amis linuxiens)
Je prends note !!!
DeusXL :
Pour ce qui est de RootSceneNode, normalement Irrlicht .NET CP le fait à ta place (même pour les custom scene nodes contrairement à Irrlicht) mais tu peux toujours tester bien sûr
Testé ! Et tu as raison !
Dans tous les cas merci à vous deux !
Hors ligne
Pages: 1
Options | Liens officiels | Caractéristiques | Statistiques | Communauté |
---|---|---|---|---|
Corrections |
|
xhtml 1.0 css 2.1 Propulsé par FluxBB Traduit par FluxBB.fr |
882 membres 1429 sujets 11119 messages |
Dernier membre inscrit: LiseBuisson96 12 invités en ligne Aucun membre connecté RSS Feed |