mohamed.irshad.k Posted June 22, 2011 Posted June 22, 2011 I have the below script in my world.cpp // Unigine script namespace Widgets { WidgetButton CreateButton() { Gui gui = engine.getGui(); WidgetButton widgetButton = new WidgetButton(gui); gui.addChild(widgetButton, GUI_ALIGN_EXPAND); widgetButton.setCallback(GUI_CLICKED, "Widgets::Button_Clicked"); return widgetButton; } void Button_Clicked() { // Do stuff.... } } I call this CreateButton funtion from C++: engine->runWorld("Widgets::CreateButton"); Unigine crashes at the line: widgetButton.setCallback(GUI_CLICKED, "Widgets::Button_Clicked"); I tried push/popWorld, but didn't help.
Guest mrred Posted June 27, 2011 Posted June 27, 2011 I have the below script in my world.cpp // Unigine script namespace Widgets { WidgetButton CreateButton() { Gui gui = engine.getGui(); WidgetButton widgetButton = new WidgetButton(gui); gui.addChild(widgetButton, GUI_ALIGN_EXPAND); widgetButton.setCallback(GUI_CLICKED, "Widgets::Button_Clicked"); return widgetButton; } void Button_Clicked() { // Do stuff.... } } I call this CreateButton funtion from C++: engine->runWorld("Widgets::CreateButton"); Unigine crashes at the line: widgetButton.setCallback(GUI_CLICKED, "Widgets::Button_Clicked"); I tried push/popWorld, but didn't help. Please, attach your log.html file located at the bin directory of project and your script so that we could reproduce and fix this.
mohamed.irshad.k Posted June 28, 2011 Author Posted June 28, 2011 Please, attach your log.html file located at the bin directory of project and your script so that we could reproduce and fix this. Please find attached the log.html, world.cpp and world.world files. log.html world1.cpp world1.world
Guest mrred Posted June 29, 2011 Posted June 29, 2011 As a temporal workaround try commenting this line return widgetButton; If You will still experience crash, please, post here or send for support@unigine.com a minimal version of your C++ Application so that we could reproduce this issue and find a solution.
mohamed.irshad.k Posted June 29, 2011 Author Posted June 29, 2011 I tried your workaround, but still the program is crashing. I have mailed a sample project to support@unigine.com for reproducing the issue.
Guest mrred Posted June 29, 2011 Posted June 29, 2011 I tried your workaround, but still the program is crashing. I have mailed a sample project to support@unigine.com for reproducing the issue. Thank You, we'll try to reproduce this issue now. I will contact you soon.
Guest mrred Posted June 29, 2011 Posted June 29, 2011 We found the source of this issue. It is this line that makes unigine crash: widgetButton.setCallback(GUI_CLICKED, "Widgets::Button_Clicked"); Thank You for pointing this bug for us. We will fix it in the next SDK release approximately in a month.
mohamed.irshad.k Posted June 30, 2011 Author Posted June 30, 2011 Thanks mrred. For the time being, is there any work around for this? In our project, we need to set the callback from C++ side.
Guest jashik Posted July 1, 2011 Posted July 1, 2011 You can use deferred execution to make a callback for widget. Example: [C++: main.cpp] #include <Unigine.h> #include <UnigineInterpreter.h> using namespace Unigine; int main(int argc, char * argv[]) { Engine * engine = Engine::init(UNIGINE_VERSION, argc, argv); int count = 5; // For delay Variable command("CreateButton"); while (!engine->isDone()) { if(count == 0) { engine->runWorld("addDeferredExecution",command); count = -1; } else if(count > 0) { count--; Log::warning("count = %d \n",count); } engine->update(); engine->render(); engine->swap(); } engine->shutdown(); return 0; } [unigineScript: world1.cpp] /* */ string deferred_executions[0]; /* */ int init() { engine.game.setPlayer(new PlayerSpectator()); return 1; } /* */ int shutdown() { return 1; } /* */ int update() { if(deferred_executions.size() > 0) { forloop(int i = 0; deferred_executions.size()) { string command = deferred_executions[i]; log.message("call command '%s'\n",command); engine.world.call(deferred_executions[i]); } deferred_executions.clear(); } return 1; } /* */ void addDeferredExecution(string command) { log.message("add command '%s'\n",command); deferred_executions.append(command); } /* */ void CreateButton() { Gui gui = engine.getGui(); WidgetButton widgetButton = new WidgetButton(gui); widgetButton.setCallback(GUI_CLICKED,"call_back"); gui.addChild(widgetButton, GUI_ALIGN_LEFT); log.message("CreateButton \n"); } /* */ void call_back() { engine.console.print("In call_back()\n"); }
Recommended Posts