jochen.wolfrum Posted April 16, 2011 Share Posted April 16, 2011 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
ulf.schroeter Posted April 17, 2011 Share Posted April 17, 2011 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
manuel.gysin Posted April 18, 2011 Share Posted April 18, 2011 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
Recommended Posts