ODE Internal error 2

All about the core api and animation, input, sound, effect, collision and physics engines.
You can also post here your feature requests.

Moderator: Brume Dev Team

ODE Internal error 2

Postby Mast10 on Sat Jun 14, 2008 8:23 am

As posted in the reply before, I seem to have a problem when adding and removing objects from brume.
I can add them but as soon as i give them collissionshapes i get an Ode internal error 2.
The same happens when i try to remove collissionshapes .
It tells me it s an invalid operationn on locked space.

Is this because i do this in a different class then the brumeclass with brume given as a parameter?

Code: Select all
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using Brume;
using System.IO;

namespace BoardIt
{
    class Terrain
    {
        static Brume.Brume brume;
        public static void Load(Brume.Brume _brume,int LandNumber)
        {
            brume = _brume;
            int[] numbers = new int [0];
            switch (LandNumber)
            {
                case 1:
                    numbers = new int[3]{ 1,2,5 };
                    break;
                case 2:
                    numbers = new int[8] {2,1,3,4,5,18,16,17};
                    break;
                case 3:
                    numbers = new int[6] {3,2,4,7,17,16 };
                    break;
                case 4:
                    numbers = new int[6] {4,2,3,17,7,6 };
                    break;
                case 5:
                    numbers = new int[6] { 5, 1, 2, 15, 19, 18 };
                    break;
                case 6:
                    numbers = new int[4] { 6,4,7,8 };
                    break;
                case 7:
                    numbers = new int[6] {7,3,4,6,8,17 };
                    break;
                case 8:
                    numbers = new int[8] {8,6,7,17,24,25,13,9 };
                    break;
                case 9:
                    numbers = new int[6] { 9,8,13,14,11,10 };
                    break;
                case 10:
                    numbers = new int[4] { 10,9,14,11 };
                    break;
                case 11:
                    numbers = new int[5] { 11,9,10,14,12 };
                    break;
                case 12:
                    numbers = new int[4] { 12,30,14,11 };
                    break;
                case 13:
                    numbers = new int[7] { 13,8,9,14,27,25,24 };
                    break;
                case 14:
                    numbers = new int[8] {14,9,11,12,13,30,27,25};
                    break;
                case 15:
                    numbers = new int[7] {15,5,19,18,20,21,22 };
                    break;
                case 16:
                    numbers = new int[8] { 16,2,3,17,26,45,47,18};
                    break;
                case 17:
                    numbers = new int[10] { 17,2,3,7,8,24,25,26,45,16 };
                    break;
                case 18:
                    numbers = new int[8] { 18,2,16,45,47,20,19,5 };
                    break;
                case 19:
                    numbers = new int[5] { 19,5,18,20,15};
                    break;
                case 20:
                    numbers = new int[7] { 20,18,19,15,21,49,47};
                    break;
                case 21:
                    numbers = new int[6] { 21,15,20,49,23,22 };
                    break;
                case 22:
                    numbers = new int[4] { 22,21,23,53 };
                    break;
                case 23:
                    numbers = new int[5] { 23,22,21,49,53};
                    break;
                case 24:
                    numbers = new int[6] { 24,8,13,25,26,17 };
                    break;
                case 25:
                    numbers = new int[9] { 25,24,26,13,14,27,54,43,45 };
                    break;
                case 26:
                    numbers = new int[7] { 26,17,8,24,25,45,16 };
                    break;
                case 27:
                    numbers = new int[10] { 27,25,54,38,35,31,30,14,13,43 };
                    break;
                case 28:
                    numbers = new int[7] { 28,49,48,41,50,52,53 };
                    break;
                case 30:
                    numbers = new int[5] { 30,12,14,27,31};
                    break;
                case 31:
                    numbers = new int[5] { 31,30,27,35,32 };
                    break;
                case 32:
                    numbers = new int[5] { 32,31,35,36,33 };
                    break;
                case 33:
                    numbers = new int[4] { 33,32,36,37};
                    break;
                case 35:
                    numbers = new int[6] { 35,27,31,32,36,38 };
                    break;
                case 36:
                    numbers = new int[7] { 36,38,35,32,33,37,40 };
                    break;
                case 37:
                    numbers = new int[5] { 37,33,36,40,51 };
                    break;
                case 38:
                    numbers = new int[8] { 38,41,54,27,35,36,40,50 };
                    break;
                case 40:
                    numbers = new int[6] { 40,50,38,36,37,51};
                    break;
                case 41:
                    numbers = new int[7] {41,43,54,38,50,28,48 };
                    break;
                case 43:
                    numbers = new int[8] { 43,47,45,25,27,54,41,48  };
                    break;
                case 45:
                    numbers = new int[9] { 45,16,17,26,25,43,47,20,18  };
                    break;
                case 47:
                    numbers = new int[8] { 47,45,43,48,49,20,16,18  };
                    break;
                case 48:
                    numbers = new int[7] { 48,47,43,41,28,53,49 };
                    break;
                case 49:
                    numbers = new int[8] { 49,20,47,48,28,53,23,21 };
                    break;
                case 50:
                    numbers = new int[7] { 50,28,41,38,40,51,52 };
                    break;
                case 51:
                    numbers = new int[6] { 51,52,50,40,36,37 };
                    break;
                case 52:
                    numbers = new int[5] { 51,51,50,28,53 };
                    break;
                case 53:
                    numbers = new int[7] { 53,22,23,49,48,28,52 };
                    break;
                case 54:
                    numbers = new int[7] { 54, 43,25,27,38,35,41 };
                    break;
            }
            LoadLand(numbers);
        }

        private static void LoadLand(int[] numbers)
        {
            if (brume.GetObjects().Count != 0)
            {
                List<BrumeObject> LandList = new List<BrumeObject>();
                List<BrumeObject> ObjectList = new List<BrumeObject>();
                List<BrumeObject> All = brume.GetObjects();
                List<int> RemoveList = new List<int>();
                bool[] available = new bool[numbers.Length];
                foreach (BrumeObject o in All)
                {
                    if (o.Name.StartsWith("_Land"))
                    {
                        LandList.Add(o);
                    }
                    if (o.Name.StartsWith("Land"))
                    {
                        ObjectList.Add(o);
                    }
                }
                for (int i = 0; i < LandList.Count; i++)
                {
                    string strnumb = LandList[i].Name.Substring(5);
                    string integer = "";
                    for (int h = 0; h < strnumb.Length; h++)
                    {
                        if (Char.IsDigit(strnumb[h]))
                        {
                            integer += strnumb[h];
                        }
                        else
                        {
                            break;
                        }
                    }
                    int landnumber = Int32.Parse(integer);
                    bool isInList = false;
                    for (int x = 0; x < numbers.Length; x++)
                    {
                        if (landnumber == numbers[x])
                        {
                            available[x] = true;
                            isInList = true;
                            break;
                        }
                    }
                    if (!isInList)
                    {
                        RemoveList.Add(landnumber);
                    }
                }
                foreach (int num in RemoveList)
                {
                    foreach (BrumeObject o in All)
                    {
                        if (o.Name.Contains(num.ToString()))
                        {

                           // foreach (BrumeCollisionShape s in o.GetCollisionShapes())
                            //{
                            //    brume.CollisionWorld.CollisionSpace.RemoveCollisionShape(s); <------------error
                           // }
                            brume.RemoveObject(o);
                        }
                    }
                }


                for (int i = 0; i < available.Length; i++)
                {
                    if (!available[i])
                    {
                        BrumeXMesh mesh = null;
                        BrumeLightedObject land = null;
                        if (File.Exists("..//..//Terrain//land_" + numbers[i] + "_water.x"))
                        {
                            mesh = new BrumeXMesh(brume, "Land" + numbers[i] + "Mesh", "land_" + numbers[i] + "_water.x", false);
                            land = new BrumeLightedObject(brume, "_Land" + numbers[i] + "_water");
                        }
                        if (File.Exists("..//..//Terrain//land_" + numbers[i] + "_sneeuw.x"))
                        {
                            mesh = new BrumeXMesh(brume, "Land" + numbers[i] + "Mesh", "land_" + numbers[i] + "_sneeuw.x", false);
                            land = new BrumeLightedObject(brume, "_Land" + numbers[i] + "_sneeuw");
                        }
                        if (File.Exists("..//..//Terrain//land_" + numbers[i] + "_zand.x"))
                        {
                            mesh = new BrumeXMesh(brume, "Land" + numbers[i] + "Mesh", "land_" + numbers[i] + "_zand.x", false);
                            land = new BrumeLightedObject(brume, "_Land" + numbers[i] + "_zand");
                        }
                        if (File.Exists("..//..//Terrain//land_" + numbers[i] + "_bos.x"))
                        {
                            mesh = new BrumeXMesh(brume, "Land" + numbers[i] + "Mesh", "land_" + numbers[i] + "_bos.x", false);
                            land = new BrumeLightedObject(brume, "_Land" + numbers[i] + "_bos");
                        }
                        land.Mesh = mesh;
                        land.Pos = new BrumeVector(0, 0, 0);
                        land.AddCollisionShapes(brume.GenerateCollisionShapes(land));
                        land.ShowCollisionShapes = true;
                    }
                }
            }
            else
            {
                for (int i = 0; i < numbers.Length; i++)
                {
                    BrumeXMesh mesh = null;
                    BrumeLightedObject land = null;
                    if (File.Exists("..//..//Terrain//land_" + numbers[i] + "_water.x"))
                    {
                        mesh = new BrumeXMesh(brume, "Land" + numbers[i] + "Mesh", "land_" + numbers[i] + "_water.x", false);
                        land = new BrumeLightedObject(brume, "_Land" + numbers[i] + "_water");
                    }
                    if (File.Exists("..//..//Terrain//land_" + numbers[i] + "_sneeuw.x"))
                    {
                        mesh = new BrumeXMesh(brume, "Land" + numbers[i] + "Mesh", "land_" + numbers[i] + "_sneeuw.x", false);
                        land = new BrumeLightedObject(brume, "_Land" + numbers[i] + "_sneeuw");
                    }
                    if (File.Exists("..//..//Terrain//land_" + numbers[i] + "_zand.x"))
                    {
                        mesh = new BrumeXMesh(brume, "Land" + numbers[i] + "Mesh", "land_" + numbers[i] + "_zand.x", false);
                        land = new BrumeLightedObject(brume, "_Land" + numbers[i] + "_zand");
                    }
                    if (File.Exists("..//..//Terrain//land_" + numbers[i] + "_bos.x"))
                    {
                        mesh = new BrumeXMesh(brume, "Land" + numbers[i] + "Mesh", "land_" + numbers[i] + "_bos.x", false);
                        land = new BrumeLightedObject(brume, "_Land" + numbers[i] + "_bos");
                    }
                    land.Mesh = mesh;
                    land.Pos = new BrumeVector(0, 0, 0);
                    land.ShowCollisionShapes = true;
                    land.HasCollisions = true; <----------------error
                }
            }


        }
    }
}

User avatar
Mast10
Brume Rookie
 
Posts: 16
Joined: Thu Apr 24, 2008 1:10 pm

Re: ODE Internal error 2

Postby Silmaryls on Fri Jul 04, 2008 8:16 pm

hi,

It sounds strange...
Can you test the falling cube in Brume demo ? It can be activated with "F" key. just press the key many times to see if it works.
The cube activated/deactivated using the BrumeObject.HasPhysicsAndCollisions property (for you it should be BrumeObject.HasCollisions) which is based on the BrumeObject.RemoveCollisionShapes() method. Can you try this method instead of accessing CollisionsWorld directly ?

Silmaryls
User avatar
Silmaryls
Brume Team Member
 
Posts: 340
Joined: Tue Feb 21, 2006 10:09 pm
Location: Paris - France


Return to Technical discussion

Who is online

Users browsing this forum: No registered users and 1 guest

cron