#0 

04-10-2006 16:12:13

prudho
Membre
Lieu: Allier (03)
Date d'inscription: 29-09-2006
Messages: 13
Site web

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 :

Code:

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 wink


Vises toujours la Lune, car même si tu la rate, tu finiras par les étoiles !

Hors ligne


#1 

04-10-2006 19:44:32

DeusXL
Abonné
Lieu: Paris
Date d'inscription: 27-09-2006
Messages: 174

"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 wink

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


Fanatique d'Irrlicht + Fanatique de Mono + Fanatique de Linux => Créateur d'Irrlicht .NET CP bien sûr !
Version actuelle d'Irrlicht .NET CP : 0.8, Version en test : 0.9.

Hors ligne


#2 

04-10-2006 21:17:59

prudho
Membre
Lieu: Allier (03)
Date d'inscription: 29-09-2006
Messages: 13
Site web

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 !


Vises toujours la Lune, car même si tu la rate, tu finiras par les étoiles !

Hors ligne


#3 

04-10-2006 21:57:05

DeusXL
Abonné
Lieu: Paris
Date d'inscription: 27-09-2006
Messages: 174

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".


Fanatique d'Irrlicht + Fanatique de Mono + Fanatique de Linux => Créateur d'Irrlicht .NET CP bien sûr !
Version actuelle d'Irrlicht .NET CP : 0.8, Version en test : 0.9.

Hors ligne


#4 

05-10-2006 06:13:01

prudho
Membre
Lieu: Allier (03)
Date d'inscription: 29-09-2006
Messages: 13
Site web

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 wink


Vises toujours la Lune, car même si tu la rate, tu finiras par les étoiles !

Hors ligne


#5 

05-10-2006 07:20:21

DeusXL
Abonné
Lieu: Paris
Date d'inscription: 27-09-2006
Messages: 174

Alors regarde la console d'Irrlicht, c'est sûrement une erreur dans le chargement de ta heightmap.


Fanatique d'Irrlicht + Fanatique de Mono + Fanatique de Linux => Créateur d'Irrlicht .NET CP bien sûr !
Version actuelle d'Irrlicht .NET CP : 0.8, Version en test : 0.9.

Hors ligne


#6 

06-10-2006 11:23:43

prudho
Membre
Lieu: Allier (03)
Date d'inscription: 29-09-2006
Messages: 13
Site web

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 big_smile).

Donc celle ci est corrigée, mais une nouvelle apparait au moment du chargement de la skybox :

Code:

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...


Vises toujours la Lune, car même si tu la rate, tu finiras par les étoiles !

Hors ligne


#7 

06-10-2006 11:38:41

izguit
Administrateur
Lieu: 127.0.0.1
Date d'inscription: 14-09-2006
Messages: 306
Site web

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?


Athlon 64 3000+ // 1Go RAM // Geforce 6600GT 128Mo
Turion 64 X2 // 1Go RAM // ATI X1250

Hors ligne


#8 

06-10-2006 18:42:05

DeusXL
Abonné
Lieu: Paris
Date d'inscription: 27-09-2006
Messages: 174

Déjà moi j'aime pas ça :
"\\" ... en général on met ça : "/" (question de compatibilité, pensez aux amis linuxiens) big_smile 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 wink


Fanatique d'Irrlicht + Fanatique de Mono + Fanatique de Linux => Créateur d'Irrlicht .NET CP bien sûr !
Version actuelle d'Irrlicht .NET CP : 0.8, Version en test : 0.9.

Hors ligne


#9 

07-10-2006 14:47:13

prudho
Membre
Lieu: Allier (03)
Date d'inscription: 29-09-2006
Messages: 13
Site web

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 !!! big_smile

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 !


Vises toujours la Lune, car même si tu la rate, tu finiras par les étoiles !

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
881 membres
1427 sujets
11117 messages
Dernier membre inscrit: Bidule
23 invités en ligne
Aucun membre connecté
RSS Feed