Pages: 1
- Accueil forums
- » Aide Irrlicht.NET et .NET CP
- » [IrrlichtNETCP - C#] TerrainSceneNode qui foire...
04-10-2006 14:12:13
- prudho
- Membres

- Date d'inscription:
- Messages: 13
- IP: 194.254.206.125
- Courriel 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 :
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
Vises toujours la Lune, car même si tu la rate, tu finiras par les étoiles !
Hors ligne
04-10-2006 17:44:32
- DeusXL
- Membres

- Date d'inscription:
- Messages: 174
- IP: 82.66.209.23
- Courriel
"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/index.php/Category:Tutorials
http://irrlichtnetcp.sourceforge.net/index.php/Irrlicht_12_:_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
04-10-2006 19:17:59
- prudho
- Membres

- Date d'inscription:
- Messages: 13
- IP: 83.113.71.226
- Courriel 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
04-10-2006 19:57:05
- DeusXL
- Membres

- Date d'inscription:
- Messages: 174
- IP: 82.66.209.23
- Courriel
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
05-10-2006 04:13:01
- prudho
- Membres

- Date d'inscription:
- Messages: 13
- IP: 83.113.71.226
- Courriel 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 ![]()
Vises toujours la Lune, car même si tu la rate, tu finiras par les étoiles !
Hors ligne
05-10-2006 05:20:21
- DeusXL
- Membres

- Date d'inscription:
- Messages: 174
- IP: 82.66.209.23
- Courriel
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
06-10-2006 09:23:43
- prudho
- Membres

- Date d'inscription:
- Messages: 13
- IP: 194.254.206.125
- Courriel 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
).
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...
Vises toujours la Lune, car même si tu la rate, tu finiras par les étoiles !
Hors ligne
06-10-2006 09:38:41
- izguit
- Administrateurs

- Date d'inscription:
- Messages: 306
- IP: 83.153.5.80
- Courriel 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
06-10-2006 16:42:05
- DeusXL
- Membres

- Date d'inscription:
- Messages: 174
- IP: 82.66.209.23
- Courriel
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 ![]()
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
07-10-2006 12:47:13
- prudho
- Membres

- Date d'inscription:
- Messages: 13
- IP: 83.113.73.231
- Courriel 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 Ecris:
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 Ecris:
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



