Jump to content

WorldTrigger Problem/Question


photo

Recommended Posts

I have a Problem by managing TriggerCallbacks. They dont want to work in my Case.

 

Here my Example:

 

Class Test {

Node myTriggerNodeArray[0] = ();
WorldTrigger myTrigger;

Test (
myTrigger = new WorldTrigger(myNode.getBoundMax());
myTrigger.setTouch(1);
myTrigger.setEnterCallback("CollissionDetected");
myTrigger.setLeaveCallback("CollissionLeaveDetected");
myTrigger.setName("attach_trigger");
)

void CollissionDetected()
{
 Logger::logger (0, "Test::CollissionDetected()", "CollissionDetected" );  
}

void CollissionLeaveDetected()
{
Logger::logger (0, "Test::CollissionLeaveDetected()", "CollissionLeaveDetected" );  
}

PlaceNode() 
{
myNode.setPosition(myPosition);  
myTriggerNodeArray.append(myNode);   
myTrigger.setTargetNodes(myTriggerNodeArray);
}
}

 

So i have my Oject Test in the running CPP-File and i place a node, about PlaceNodefunction. So i add this to my Targetnodes from the Trigger.

In my Constructor i managed the Callbackdeclaration.

 

When i now place a node in another Target node the event dont react. And i dont know why. I can use WorldTrigger´s for Collissiondetection or?

 

Greets Jochen

Link to comment

When i now place a node in another Target node the event dont react. And i dont know why. I can use WorldTrigger´s for Collissiondetection or?

 

Not sure what you want to achive exactly but if you are interested in inter-node collisions than maybe you better should use Body class based collision detection instead of WorldTrigger.

 

Just from a coding point of view I would expect that callback functions and myTriggerNodeArray should be declared on a global scope. Also WorldTrigger size and position should be properly synchronized and you should ensure proper trigger/node removal on class destruction to avoid memory leaks. Something like

 

/////////////////////////////////////////////////////////////
// global scope

Node g_myTriggerNodeArray[0];

void CollissionDetected( Node node )
{
   Logger::logger (0, "Test::CollissionDetected()", "CollissionDetected" );  
}

void CollissionLeaveDetected( Node node )
{
   Logger::logger (0, "Test::CollissionLeaveDetected()", "CollissionLeaveDetected" );  
}

... 

/////////////////////////////////////////////////////////////
// class scope

Class Test {

   WorldTrigger myTrigger;

   Test
   (
       vec3 triggerSize =  myNode.getBoundMax() - myNode.getBoundMin();

       // you could deferre WorldTrigger creation to placeNode()
       myTrigger = new WorldTrigger(triggerSize); // bounMax() is proper size only if bindMin() = vec3(0,0,0)
       myTrigger.setTouch(1);
       myTrigger.setEnterCallback("CollissionDetected");
       myTrigger.setLeaveCallback("CollissionLeaveDetected");
       myTrigger.setName("attach_trigger");
   )

   placeNode() 
   {
      myNode.setPosition(myPosition);  // I would expect that you would also have to update WorldTrigger pos 
      myTrigger.setPosition( myPosition ); 

      g_myTriggerNodeArray.append(myNode);   

      myTrigger.setTargetNodes(myTriggerNodeArray);
   }

   // also ensure proper myNode removal from myTriggerNodeArray and myTrigger destruction on Test class destruction

   removeNode()
   {
      int index = g_myTriggerNodeArray.find(myNode);

      if( index != -1 ) {
          g_myTriggerNodeArray.remove(index);
      }
   }

   ~Test()
   {
       removeNode();

       if( myTrigger != 0 ) {
           delete myTrigger;
       }
   }
}

Link to comment

Edit: Miss understood the documentation. :(

 

 

Not sure what you want to achive exactly but if you are interested in inter-node collisions than maybe you better should use Body class based collision detection instead of WorldTrigger.

 

Just from a coding point of view I would expect that callback functions and myTriggerNodeArray should be declared on a global scope. Also WorldTrigger size and position should be properly synchronized and you should ensure proper trigger/node removal on class destruction to avoid memory leaks. Something like

 

Jochen and me tried today to implement this, but something is very strange.

 

 

project.cpp (Version 1 with no global scope)

int init() {
   WorldTrigger myTrigger2 = new WorldTrigger(vec3(5,5,5));

   Node test_trigger_targets[2];

   Node tmpNode = node_load("relics_of_annorath/nodes/trees/fraser_fir_001.node");
   Node tmpNode2 = node_load("relics_of_annorath/nodes/trees/fraser_fir_002.node");
   Node tmpNode3 = node_load("relics_of_annorath/nodes/flora/mushrooms/mushroom_001.node");


   test_trigger_targets.append(tmpNode);
   test_trigger_targets.append(tmpNode2);
   test_trigger_targets.append(tmpNode3);

   myTrigger2.setTargetNodes(test_trigger_targets);

   log.error("Target Nodes: %i \n", myTrigger2.getNumNodes());

   return 1;
}

 

This will return 0 in the log.error.

 

 

project.cpp (Version 2 with global scope)

WorldTrigger myTrigger2 = new WorldTrigger(vec3(5,5,5));
Node test_trigger_targets[2];    

int init() {

   Node tmpNode = node_load("relics_of_annorath/nodes/trees/fraser_fir_001.node");
   Node tmpNode2 = node_load("relics_of_annorath/nodes/trees/fraser_fir_002.node");
   Node tmpNode3 = node_load("relics_of_annorath/nodes/flora/mushrooms/mushroom_001.node");

   test_trigger_targets.append(tmpNode);
   test_trigger_targets.append(tmpNode2);
   test_trigger_targets.append(tmpNode3);

   myTrigger2.setTargetNodes(test_trigger_targets);

   log.error("Target Nodes: %i \n", myTrigger2.getNumNodes());

   return 1;
}

 

This will return always 1 in log.error.

 

 

I don't understand this, are we doing something horrible wrong?

Link to comment
×
×
  • Create New...