From f9762d63abb6730e2b3caff8d032d8aae67937db Mon Sep 17 00:00:00 2001 From: erwin coumans Date: Sat, 16 Jul 2016 00:55:56 -0700 Subject: [PATCH] Removed many memoryleaks in Example Browser, reducing some technical debt. When running the Example Browser with Basic Example, 'visual leak detector' show no leak. Many other individual examples still leak, so it is work-in-progress. Disabled the profiler window (too many leaks) --- .../GwenGUISupport/GwenProfileWindow.cpp | 16 +- .../GwenGUISupport/gwenInternalData.h | 5 +- .../GwenGUISupport/gwenUserInterface.cpp | 170 ++++++---- .../GwenGUISupport/gwenUserInterface.h | 1 + .../ExampleBrowser/OpenGLExampleBrowser.cpp | 302 ++++++++++++------ .../ExampleBrowser/OpenGLExampleBrowser.h | 3 + examples/ExampleBrowser/OpenGLGuiHelper.cpp | 1 + examples/ExampleBrowser/main.cpp | 52 +-- .../ImportURDFDemo/BulletUrdfImporter.cpp | 1 + .../Importers/ImportURDFDemo/UrdfParser.cpp | 8 +- .../ImportURDFDemo/urdfStringSplit.cpp | 9 +- .../ImportURDFDemo/urdfStringSplit.h | 4 +- .../InverseDynamicsExample.cpp | 11 + examples/OpenGLWindow/SimpleOpenGL3App.cpp | 3 +- examples/OpenGLWindow/TwFonts.cpp | 35 +- examples/SimpleOpenGL3/main.cpp | 188 +++++------ .../main_console_single_example.cpp | 28 +- 17 files changed, 521 insertions(+), 316 deletions(-) diff --git a/examples/ExampleBrowser/GwenGUISupport/GwenProfileWindow.cpp b/examples/ExampleBrowser/GwenGUISupport/GwenProfileWindow.cpp index d376246ec..597ff834d 100644 --- a/examples/ExampleBrowser/GwenGUISupport/GwenProfileWindow.cpp +++ b/examples/ExampleBrowser/GwenGUISupport/GwenProfileWindow.cpp @@ -44,7 +44,7 @@ public: CProfileIterator* profIter; - + class MyMenuItems* m_menuItems; MyProfileWindow ( Gwen::Controls::Base* pParent) : Gwen::Controls::WindowControl( pParent ), profIter(0) @@ -83,6 +83,12 @@ public: } + virtual ~MyProfileWindow() + { + + delete m_node; + delete m_ctrl; + } float dumpRecursive(CProfileIterator* profileIterator, Gwen::Controls::TreeNode* parentNode) { @@ -266,11 +272,16 @@ public: MyProfileWindow* setupProfileWindow(GwenInternalData* data) { MyMenuItems* menuItems = new MyMenuItems; + MyProfileWindow* profWindow = new MyProfileWindow(data->pCanvas); //profWindow->SetHidden(true); - profWindow->profIter = CProfileManager::Get_Iterator(); + + profWindow->m_menuItems = menuItems; + //profWindow->profIter = CProfileManager::Get_Iterator(); data->m_viewMenu->GetMenu()->AddItem( L"Profiler", menuItems,(Gwen::Event::Handler::Function)&MyMenuItems::MenuItemSelect); + menuItems->m_profWindow = profWindow; + return profWindow; } @@ -290,5 +301,6 @@ void profileWindowSetVisible(MyProfileWindow* window, bool visible) } void destroyProfileWindow(MyProfileWindow* window) { + CProfileManager::Release_Iterator(window->profIter); delete window; } diff --git a/examples/ExampleBrowser/GwenGUISupport/gwenInternalData.h b/examples/ExampleBrowser/GwenGUISupport/gwenInternalData.h index ec0982571..3fc3bb4b4 100644 --- a/examples/ExampleBrowser/GwenGUISupport/gwenInternalData.h +++ b/examples/ExampleBrowser/GwenGUISupport/gwenInternalData.h @@ -45,7 +45,10 @@ struct GwenInternalData Gwen::Controls::ListBox* m_TextOutput; Gwen::Controls::Label* m_exampleInfoGroupBox; Gwen::Controls::ListBox* m_exampleInfoTextOutput; - + struct MyTestMenuBar* m_menubar; + Gwen::Controls::StatusBar* m_bar; + Gwen::Controls::ScrollControl* m_windowRight; + Gwen::Controls::TabControl* m_tab; int m_curYposition; diff --git a/examples/ExampleBrowser/GwenGUISupport/gwenUserInterface.cpp b/examples/ExampleBrowser/GwenGUISupport/gwenUserInterface.cpp index a70d9268a..fcff13968 100644 --- a/examples/ExampleBrowser/GwenGUISupport/gwenUserInterface.cpp +++ b/examples/ExampleBrowser/GwenGUISupport/gwenUserInterface.cpp @@ -17,6 +17,83 @@ GwenUserInterface::GwenUserInterface() } +class MyMenuItems : public Gwen::Controls::Base +{ +public: + + b3FileOpenCallback m_fileOpenCallback; + b3QuitCallback m_quitCallback; + + MyMenuItems() :Gwen::Controls::Base(0), m_fileOpenCallback(0) + { + } + void myQuitApp(Gwen::Controls::Base* pControl) + { + if (m_quitCallback) + { + (*m_quitCallback)(); + } + } + void fileOpen(Gwen::Controls::Base* pControl) + { + if (m_fileOpenCallback) + { + (*m_fileOpenCallback)(); + } + } + +}; + + + +struct MyTestMenuBar : public Gwen::Controls::MenuStrip +{ + + Gwen::Controls::MenuItem* m_fileMenu; + Gwen::Controls::MenuItem* m_viewMenu; + MyMenuItems* m_menuItems; + + MyTestMenuBar(Gwen::Controls::Base* pParent) + :Gwen::Controls::MenuStrip(pParent) + { + // Gwen::Controls::MenuStrip* menu = new Gwen::Controls::MenuStrip( pParent ); + { + m_menuItems = new MyMenuItems(); + m_menuItems->m_fileOpenCallback = 0; + m_menuItems->m_quitCallback = 0; + + m_fileMenu = AddItem(L"File"); + + m_fileMenu->GetMenu()->AddItem(L"Open", m_menuItems, (Gwen::Event::Handler::Function)&MyMenuItems::fileOpen); + m_fileMenu->GetMenu()->AddItem(L"Quit", m_menuItems, (Gwen::Event::Handler::Function)&MyMenuItems::myQuitApp); + m_viewMenu = AddItem(L"View"); + + } + } + virtual ~MyTestMenuBar() + { + delete m_menuItems; + } + +}; + + +void GwenUserInterface::exit() +{ + //m_data->m_menubar->RemoveAllChildren(); + delete m_data->m_tab; + delete m_data->m_windowRight; + delete m_data->m_leftStatusBar; + delete m_data->m_TextOutput; + delete m_data->m_rightStatusBar; + delete m_data->m_bar; + delete m_data->m_menubar; + + m_data->m_menubar = 0; + delete m_data->pCanvas; + m_data->pCanvas = 0; +} + GwenUserInterface::~GwenUserInterface() { for (int i=0;im_handlers.size();i++) @@ -26,72 +103,15 @@ GwenUserInterface::~GwenUserInterface() m_data->m_handlers.clear(); - - delete m_data->pCanvas; - - + delete m_data; - - } -class MyMenuItems : public Gwen::Controls::Base -{ -public: - b3FileOpenCallback m_fileOpenCallback; - b3QuitCallback m_quitCallback; - - MyMenuItems() :Gwen::Controls::Base(0),m_fileOpenCallback(0) - { - } - void myQuitApp( Gwen::Controls::Base* pControl ) - { - if (m_quitCallback) - { - (*m_quitCallback)(); - } - } - void fileOpen( Gwen::Controls::Base* pControl ) - { - if (m_fileOpenCallback) - { - (*m_fileOpenCallback)(); - } - } - -}; - -struct MyTestMenuBar : public Gwen::Controls::MenuStrip -{ - - Gwen::Controls::MenuItem* m_fileMenu; - Gwen::Controls::MenuItem* m_viewMenu; - MyMenuItems* m_menuItems; - - MyTestMenuBar(Gwen::Controls::Base* pParent) - :Gwen::Controls::MenuStrip(pParent) - { -// Gwen::Controls::MenuStrip* menu = new Gwen::Controls::MenuStrip( pParent ); - { - m_menuItems = new MyMenuItems(); - m_menuItems->m_fileOpenCallback = 0; - m_menuItems->m_quitCallback = 0; - - m_fileMenu = AddItem( L"File" ); - - m_fileMenu->GetMenu()->AddItem(L"Open",m_menuItems,(Gwen::Event::Handler::Function)&MyMenuItems::fileOpen); - m_fileMenu->GetMenu()->AddItem(L"Quit",m_menuItems,(Gwen::Event::Handler::Function)&MyMenuItems::myQuitApp); - m_viewMenu = AddItem( L"View" ); - - } - } - -}; void GwenUserInterface::resize(int width, int height) { @@ -232,6 +252,7 @@ void GwenUserInterface::setStatusBarMessage(const char* message, bool isLeft) } } + void GwenUserInterface::registerFileOpenCallback(b3FileOpenCallback callback) { m_data->m_menuItems->m_fileOpenCallback = callback; @@ -249,35 +270,43 @@ void GwenUserInterface::init(int width, int height,Gwen::Renderer::Base* rendere m_data->pRenderer = renderer;//new GwenOpenGL3CoreRenderer(m_data->m_primRenderer,stash,width,height,retinaScale); m_data->skin.SetRender( m_data->pRenderer ); + m_data->pCanvas= new Gwen::Controls::Canvas( &m_data->skin ); m_data->pCanvas->SetSize( width,height); m_data->pCanvas->SetDrawBackground( false); m_data->pCanvas->SetBackgroundColor( Gwen::Color( 150, 170, 170, 255 ) ); - - - + + + MyTestMenuBar* menubar = new MyTestMenuBar(m_data->pCanvas); m_data->m_viewMenu = menubar->m_viewMenu; m_data->m_menuItems = menubar->m_menuItems; - + m_data->m_menubar = menubar; + - Gwen::Controls::StatusBar* bar = new Gwen::Controls::StatusBar(m_data->pCanvas); + m_data->m_bar = bar; + + m_data->m_rightStatusBar = new Gwen::Controls::Label( bar ); + m_data->m_rightStatusBar->SetWidth(width/2); //m_data->m_rightStatusBar->SetText( L"Label Added to Right" ); bar->AddControl( m_data->m_rightStatusBar, true ); - + m_data->m_TextOutput = new Gwen::Controls::ListBox( m_data->pCanvas ); + m_data->m_TextOutput->Dock( Gwen::Pos::Bottom ); m_data->m_TextOutput->SetHeight( 100 ); - + m_data->m_leftStatusBar = new Gwen::Controls::Label( bar ); + //m_data->m_leftStatusBar->SetText( L"Label Added to Left" ); m_data->m_leftStatusBar->SetWidth(width/2); bar->AddControl( m_data->m_leftStatusBar,false); + //Gwen::KeyboardFocus /*Gwen::Controls::GroupBox* box = new Gwen::Controls::GroupBox(m_data->pCanvas); box->SetText("text"); @@ -289,11 +318,14 @@ void GwenUserInterface::init(int width, int height,Gwen::Renderer::Base* rendere windowRight->SetWidth(250); windowRight->SetHeight(250); windowRight->SetScroll(false,true); - + m_data->m_windowRight = windowRight; //windowLeft->SetSkin( Gwen::Controls::TabControl* tab = new Gwen::Controls::TabControl(windowRight); + m_data->m_tab = tab; + + //tab->SetHeight(300); tab->SetWidth(240); @@ -304,7 +336,8 @@ void GwenUserInterface::init(int width, int height,Gwen::Renderer::Base* rendere Gwen::UnicodeString str1(L"Params"); m_data->m_demoPage = tab->AddPage(str1); - + + @@ -348,7 +381,7 @@ void GwenUserInterface::init(int width, int height,Gwen::Renderer::Base* rendere //windowLeft->SetClosable(false); // windowLeft->SetShouldDrawBackground(true); windowLeft->SetTabable(true); - + Gwen::Controls::TabControl* explorerTab = new Gwen::Controls::TabControl(windowLeft); //tab->SetHeight(300); @@ -388,7 +421,6 @@ void GwenUserInterface::init(int width, int height,Gwen::Renderer::Base* rendere m_data->m_exampleInfoGroupBox->SetText("Example Description"); m_data->m_exampleInfoTextOutput = new Gwen::Controls::ListBox(m_data->m_explorerPage->GetPage()); - //m_data->m_exampleInfoTextOutput->Dock( Gwen::Pos::Bottom ); m_data->m_exampleInfoTextOutput->SetPos(2, 332); diff --git a/examples/ExampleBrowser/GwenGUISupport/gwenUserInterface.h b/examples/ExampleBrowser/GwenGUISupport/gwenUserInterface.h index c448e9fff..d66b59828 100644 --- a/examples/ExampleBrowser/GwenGUISupport/gwenUserInterface.h +++ b/examples/ExampleBrowser/GwenGUISupport/gwenUserInterface.h @@ -26,6 +26,7 @@ class GwenUserInterface virtual ~GwenUserInterface(); void init(int width, int height,Gwen::Renderer::Base* gwenRenderer,float retinaScale); + void exit(); void setFocus(); void forceUpdateScrollBars(); diff --git a/examples/ExampleBrowser/OpenGLExampleBrowser.cpp b/examples/ExampleBrowser/OpenGLExampleBrowser.cpp index 64eb707a9..18578c71a 100644 --- a/examples/ExampleBrowser/OpenGLExampleBrowser.cpp +++ b/examples/ExampleBrowser/OpenGLExampleBrowser.cpp @@ -42,19 +42,65 @@ #include "../Importers/ImportURDFDemo/ImportURDFSetup.h" #include "../Importers/ImportBullet/SerializeSetup.h" +#include "Bullet3Common/b3HashMap.h" + +struct GL3TexLoader : public MyTextureLoader +{ + b3HashMap m_hashMap; + + virtual void LoadTexture(Gwen::Texture* pTexture) + { + Gwen::String namestr = pTexture->name.Get(); + const char* n = namestr.c_str(); + GLint* texIdPtr = m_hashMap[n]; + if (texIdPtr) + { + pTexture->m_intData = *texIdPtr; + } + } + virtual void FreeTexture(Gwen::Texture* pTexture) + { + } +}; + + +struct OpenGLExampleBrowserInternalData +{ + Gwen::Renderer::Base* m_gwenRenderer; + CommonGraphicsApp* m_app; +// MyProfileWindow* m_profWindow; + btAlignedObjectArray m_nodes; + GwenUserInterface* m_gui; + GL3TexLoader* m_myTexLoader; + struct MyMenuItemHander* m_handler2; + btAlignedObjectArray m_handlers; + + OpenGLExampleBrowserInternalData() + : m_gwenRenderer(0), + m_app(0), +// m_profWindow(0), + m_gui(0), + m_myTexLoader(0), + m_handler2(0) + { + + } +}; + static CommonGraphicsApp* s_app=0; static CommonWindowInterface* s_window = 0; static CommonParameterInterface* s_parameterInterface=0; static CommonRenderInterface* s_instancingRenderer=0; static OpenGLGuiHelper* s_guiHelper=0; -static MyProfileWindow* s_profWindow =0; +//static MyProfileWindow* s_profWindow =0; static SharedMemoryInterface* sSharedMem = 0; #define DEMO_SELECTION_COMBOBOX 13 const char* startFileName = "0_Bullet3Demo.txt"; char staticPngFileName[1024]; -static GwenUserInterface* gui = 0; +//static GwenUserInterface* gui = 0; +static GwenUserInterface* gui2 = 0; static int sCurrentDemoIndex = -1; static int sCurrentHightlighted = 0; static CommonExampleInterface* sCurrentDemo = 0; @@ -123,9 +169,9 @@ void MyKeyboardCallback(int key, int state) //b3Printf("key=%d, state=%d", key, state); bool handled = false; - if (gui && !handled ) + if (gui2 && !handled ) { - handled = gui->keyboardCallback(key, state); + handled = gui2->keyboardCallback(key, state); } if (!handled && sCurrentDemo) @@ -226,8 +272,8 @@ static void MyMouseMoveCallback( float x, float y) bool handled = false; if (sCurrentDemo) handled = sCurrentDemo->mouseMoveCallback(x,y); - if (!handled && gui) - handled = gui->mouseMoveCallback(x,y); + if (!handled && gui2) + handled = gui2->mouseMoveCallback(x,y); if (!handled) { if (prevMouseMoveCallback) @@ -244,8 +290,8 @@ static void MyMouseButtonCallback(int button, int state, float x, float y) if (sCurrentDemo) handled = sCurrentDemo->mouseButtonCallback(button,state,x,y); - if (!handled && gui) - handled = gui->mouseButtonCallback(button,state,x,y); + if (!handled && gui2) + handled = gui2->mouseButtonCallback(button,state,x,y); if (!handled) { @@ -333,7 +379,10 @@ void selectDemo(int demoIndex) CommonExampleInterface::CreateFunc* func = gAllExamples->getExampleCreateFunc(demoIndex); if (func) { - s_parameterInterface->removeAllParameters(); + if (s_parameterInterface) + { + s_parameterInterface->removeAllParameters(); + } int option = gAllExamples->getExampleOption(demoIndex); s_guiHelper= new OpenGLGuiHelper(s_app, sUseOpenGL2); CommonExampleOptions options(s_guiHelper, option); @@ -341,12 +390,15 @@ void selectDemo(int demoIndex) sCurrentDemo = (*func)(options); if (sCurrentDemo) { - if (gui) + if (gui2) { - gui->setStatusBarMessage("Status: OK", false); + gui2->setStatusBarMessage("Status: OK", false); } b3Printf("Selected demo: %s",gAllExamples->getExampleName(demoIndex)); - gui->setExampleDescription(gAllExamples->getExampleDescription(demoIndex)); + if (gui2) + { + gui2->setExampleDescription(gAllExamples->getExampleDescription(demoIndex)); + } sCurrentDemo->initPhysics(); if(resetCamera) @@ -437,10 +489,10 @@ void MyComboBoxCallback(int comboId, const char* item) void MyGuiPrintf(const char* msg) { printf("b3Printf: %s\n",msg); - if (gui) + if (gui2) { - gui->textOutput(msg); - gui->forceUpdateScrollBars(); + gui2->textOutput(msg); + gui2->forceUpdateScrollBars(); } } @@ -449,10 +501,10 @@ void MyGuiPrintf(const char* msg) void MyStatusBarPrintf(const char* msg) { printf("b3Printf: %s\n", msg); - if (gui) + if (gui2) { bool isLeft = true; - gui->setStatusBarMessage(msg,isLeft); + gui2->setStatusBarMessage(msg,isLeft); } } @@ -460,12 +512,12 @@ void MyStatusBarPrintf(const char* msg) void MyStatusBarError(const char* msg) { printf("Warning: %s\n", msg); - if (gui) + if (gui2) { bool isLeft = false; - gui->setStatusBarMessage(msg,isLeft); - gui->textOutput(msg); - gui->forceUpdateScrollBars(); + gui2->setStatusBarMessage(msg,isLeft); + gui2->textOutput(msg); + gui2->forceUpdateScrollBars(); } } @@ -534,7 +586,7 @@ struct MyMenuItemHander :public Gwen::Event::Handler { // printf("select %d\n",m_buttonId); sCurrentHightlighted = m_buttonId; - gui->setExampleDescription(gAllExamples->getExampleDescription(sCurrentHightlighted)); + gui2->setExampleDescription(gAllExamples->getExampleDescription(sCurrentHightlighted)); } void onButtonF(Gwen::Controls::Base* pControl) @@ -549,26 +601,6 @@ struct MyMenuItemHander :public Gwen::Event::Handler -}; -#include "Bullet3Common/b3HashMap.h" - -struct GL3TexLoader : public MyTextureLoader -{ - b3HashMap m_hashMap; - - virtual void LoadTexture( Gwen::Texture* pTexture ) - { - Gwen::String namestr = pTexture->name.Get(); - const char* n = namestr.c_str(); - GLint* texIdPtr = m_hashMap[n]; - if (texIdPtr) - { - pTexture->m_intData = *texIdPtr; - } - } - virtual void FreeTexture( Gwen::Texture* pTexture ) - { - } }; void quitCallback() @@ -623,7 +655,7 @@ struct QuickCanvas : public Common2dCanvasInterface m_curNumGraphWindows++; - MyGraphInput input(gui->getInternalData()); + MyGraphInput input(gui2->getInternalData()); input.m_width=width; input.m_height=height; input.m_xPos = 10000;//GUI will clamp it to the right//300; @@ -669,12 +701,50 @@ struct QuickCanvas : public Common2dCanvasInterface OpenGLExampleBrowser::OpenGLExampleBrowser(class ExampleEntries* examples) { + m_internalData = new OpenGLExampleBrowserInternalData; + gAllExamples = examples; } OpenGLExampleBrowser::~OpenGLExampleBrowser() { - deleteDemo(); + deleteDemo(); + for (int i = 0; i < m_internalData->m_nodes.size(); i++) + { + delete m_internalData->m_nodes[i]; + } + delete m_internalData->m_handler2; + for (int i = 0; i < m_internalData->m_handlers.size(); i++) + { + delete m_internalData->m_handlers[i]; + } + m_internalData->m_handlers.clear(); + m_internalData->m_nodes.clear(); + delete s_parameterInterface; + s_parameterInterface = 0; + delete s_app->m_2dCanvasInterface; + s_app->m_2dCanvasInterface = 0; + + m_internalData->m_gui->exit(); + + + delete m_internalData->m_gui; + delete m_internalData->m_gwenRenderer; + delete m_internalData->m_myTexLoader; + + + + + + delete m_internalData->m_app; + s_app = 0; + + + +// delete m_internalData->m_profWindow; + + delete m_internalData; + gAllExamples = 0; } @@ -732,11 +802,10 @@ bool OpenGLExampleBrowser::init(int argc, char* argv[]) char title[1024]; sprintf(title,"%s using OpenGL3+. %s", appTitle,optMode); simpleApp = new SimpleOpenGL3App(title,width,height, gAllowRetina); - - s_app = simpleApp; } #endif + m_internalData->m_app = s_app; char* gVideoFileName = 0; args.GetCmdLineArgument("mp4",gVideoFileName); #ifndef NO_OPENGL3 @@ -792,43 +861,67 @@ bool OpenGLExampleBrowser::init(int argc, char* argv[]) assert(glGetError()==GL_NO_ERROR); + { + GL3TexLoader* myTexLoader = new GL3TexLoader; + m_internalData->m_myTexLoader = myTexLoader; - gui = new GwenUserInterface; - GL3TexLoader* myTexLoader = new GL3TexLoader; - - Gwen::Renderer::Base* gwenRenderer = 0; - if (sUseOpenGL2 ) - { - gwenRenderer = new Gwen::Renderer::OpenGL_DebugFont(); - } + sth_stash* fontstash = simpleApp->getFontStash(); + + if (sUseOpenGL2) + { + m_internalData->m_gwenRenderer = new Gwen::Renderer::OpenGL_DebugFont(); + } #ifndef NO_OPENGL3 - else - { - sth_stash* fontstash=simpleApp->getFontStash(); - gwenRenderer = new GwenOpenGL3CoreRenderer(simpleApp->m_primRenderer,fontstash,width,height,s_window->getRetinaScale(),myTexLoader); - } + else + { + sth_stash* fontstash = simpleApp->getFontStash(); + m_internalData->m_gwenRenderer = new GwenOpenGL3CoreRenderer(simpleApp->m_primRenderer, fontstash, width, height, s_window->getRetinaScale(), myTexLoader); + } #endif + + gui2 = new GwenUserInterface; + + m_internalData->m_gui = gui2; + + m_internalData->m_myTexLoader = myTexLoader; + + + + gui2->init(width, height, m_internalData->m_gwenRenderer, s_window->getRetinaScale()); + + + } + //gui = 0;// new GwenUserInterface; + + GL3TexLoader* myTexLoader = m_internalData->m_myTexLoader; + // = myTexLoader; + + + // - gui->init(width,height,gwenRenderer,s_window->getRetinaScale()); - - - - -// gui->getInternalData()->m_explorerPage - Gwen::Controls::TreeControl* tree = gui->getInternalData()->m_explorerTreeCtrl; + if (gui2) + { + + + + + // gui->getInternalData()->m_explorerPage + Gwen::Controls::TreeControl* tree = gui2->getInternalData()->m_explorerTreeCtrl; + + + //gui->getInternalData()->pRenderer->setTextureLoader(myTexLoader); + + +// s_profWindow= setupProfileWindow(gui2->getInternalData()); + //m_internalData->m_profWindow = s_profWindow; + // profileWindowSetVisible(s_profWindow,false); + gui2->setFocus(); + + s_parameterInterface = s_app->m_parameterInterface = new GwenParameterInterface(gui2->getInternalData()); + s_app->m_2dCanvasInterface = new QuickCanvas(myTexLoader); - //gui->getInternalData()->pRenderer->setTextureLoader(myTexLoader); - - - s_profWindow= setupProfileWindow(gui->getInternalData()); - profileWindowSetVisible(s_profWindow,false); - gui->setFocus(); - - s_parameterInterface = s_app->m_parameterInterface = new GwenParameterInterface(gui->getInternalData()); - s_app->m_2dCanvasInterface = new QuickCanvas(myTexLoader); - ///add some demos to the gAllExamples @@ -839,7 +932,7 @@ bool OpenGLExampleBrowser::init(int argc, char* argv[]) //int curDemo = 0; int selectedDemo = 0; Gwen::Controls::TreeNode* curNode = tree; - MyMenuItemHander* handler2 = new MyMenuItemHander(-1); + m_internalData->m_handler2 = new MyMenuItemHander(-1); char* demoNameFromCommandOption = 0; args.GetCmdLineArgument("start_demo_name", demoNameFromCommandOption); @@ -847,7 +940,7 @@ bool OpenGLExampleBrowser::init(int argc, char* argv[]) selectedDemo = -1; } - tree->onReturnKeyDown.Add(handler2, &MyMenuItemHander::onButtonD); + tree->onReturnKeyDown.Add(m_internalData->m_handler2, &MyMenuItemHander::onButtonD); int firstAvailableDemoIndex=-1; Gwen::Controls::TreeNode* firstNode=0; @@ -894,13 +987,18 @@ bool OpenGLExampleBrowser::init(int argc, char* argv[]) } } +#if 1 MyMenuItemHander* handler = new MyMenuItemHander(d); + m_internalData->m_handlers.push_back(handler); + pNode->onNamePress.Add(handler, &MyMenuItemHander::onButtonA); pNode->GetButton()->onDoubleClick.Add(handler, &MyMenuItemHander::onButtonB); pNode->GetButton()->onDown.Add(handler, &MyMenuItemHander::onButtonC); pNode->onSelect.Add(handler, &MyMenuItemHander::onButtonE); pNode->onReturnKeyDown.Add(handler, &MyMenuItemHander::onButtonG); pNode->onSelectChange.Add(handler, &MyMenuItemHander::onButtonF); + +#endif // pNode->onKeyReturn.Add(handler, &MyMenuItemHander::onButtonD); // pNode->GetButton()->onKeyboardReturn.Add(handler, &MyMenuItemHander::onButtonD); // pNode->onNamePress.Add(handler, &MyMenuItemHander::onButtonD); @@ -910,6 +1008,7 @@ bool OpenGLExampleBrowser::init(int argc, char* argv[]) else { curNode = tree->AddNode(nodeUText); + m_internalData->m_nodes.push_back(curNode); } } @@ -928,6 +1027,9 @@ bool OpenGLExampleBrowser::init(int argc, char* argv[]) } } + free(demoNameFromCommandOption); + demoNameFromCommandOption = 0; + btAssert(sCurrentDemo!=0); if (sCurrentDemo==0) { @@ -935,9 +1037,11 @@ bool OpenGLExampleBrowser::init(int argc, char* argv[]) exit(0); } - gui->registerFileOpenCallback(fileOpenCallback); - gui->registerQuitCallback(quitCallback); - + gui2->registerFileOpenCallback(fileOpenCallback); + gui2->registerQuitCallback(quitCallback); + } + + return true; } @@ -1044,7 +1148,7 @@ void OpenGLExampleBrowser::update(float deltaTime) { - if (s_guiHelper && s_guiHelper->getRenderInterface() && s_guiHelper->getRenderInterface()->getActiveCamera()) + if (gui2 && s_guiHelper && s_guiHelper->getRenderInterface() && s_guiHelper->getRenderInterface()->getActiveCamera()) { char msg[1024]; float camDist = s_guiHelper->getRenderInterface()->getActiveCamera()->getCameraDistance(); @@ -1053,7 +1157,7 @@ void OpenGLExampleBrowser::update(float deltaTime) float camTarget[3]; s_guiHelper->getRenderInterface()->getActiveCamera()->getCameraTargetPosition(camTarget); sprintf(msg,"dist=%f, pitch=%f, yaw=%f,target=%f,%f,%f", camDist,pitch,yaw,camTarget[0],camTarget[1],camTarget[2]); - gui->setStatusBarMessage(msg, true); + gui2->setStatusBarMessage(msg, true); } } @@ -1061,16 +1165,24 @@ void OpenGLExampleBrowser::update(float deltaTime) static int toggle = 1; if (renderGui) { - if (!pauseSimulation) - processProfileData(s_profWindow,false); + // if (!pauseSimulation) + // processProfileData(s_profWindow,false); - if (sUseOpenGL2) + if (sUseOpenGL2) { - - saveOpenGLState(s_instancingRenderer->getScreenWidth(),s_instancingRenderer->getScreenHeight()); + + saveOpenGLState(s_instancingRenderer->getScreenWidth(), s_instancingRenderer->getScreenHeight()); } - BT_PROFILE("Draw Gwen GUI"); - gui->draw(s_instancingRenderer->getScreenWidth(),s_instancingRenderer->getScreenHeight()); + BT_PROFILE("Draw Gwen GUI"); + if (m_internalData->m_gui) + { + m_internalData->m_gui->draw(s_instancingRenderer->getScreenWidth(), s_instancingRenderer->getScreenHeight()); + } + if (gui2) + { + gui2->draw(s_instancingRenderer->getScreenWidth(), s_instancingRenderer->getScreenHeight()); + } + if (sUseOpenGL2) { restoreOpenGLState(); @@ -1084,14 +1196,20 @@ void OpenGLExampleBrowser::update(float deltaTime) toggle=1-toggle; { BT_PROFILE("Sync Parameters"); - s_parameterInterface->syncParameters(); + if (s_parameterInterface) + { + s_parameterInterface->syncParameters(); + } } { BT_PROFILE("Swap Buffers"); s_app->swapBuffer(); } - gui->forceUpdateScrollBars(); + if (gui2) + { + gui2->forceUpdateScrollBars(); + } } diff --git a/examples/ExampleBrowser/OpenGLExampleBrowser.h b/examples/ExampleBrowser/OpenGLExampleBrowser.h index ac9acd2f6..1f68abedb 100644 --- a/examples/ExampleBrowser/OpenGLExampleBrowser.h +++ b/examples/ExampleBrowser/OpenGLExampleBrowser.h @@ -5,6 +5,9 @@ class OpenGLExampleBrowser : public ExampleBrowserInterface { + + struct OpenGLExampleBrowserInternalData* m_internalData; + public: OpenGLExampleBrowser(class ExampleEntries* examples); diff --git a/examples/ExampleBrowser/OpenGLGuiHelper.cpp b/examples/ExampleBrowser/OpenGLGuiHelper.cpp index 1ed1ffb19..a5d7e0c3d 100644 --- a/examples/ExampleBrowser/OpenGLGuiHelper.cpp +++ b/examples/ExampleBrowser/OpenGLGuiHelper.cpp @@ -167,6 +167,7 @@ OpenGLGuiHelper::OpenGLGuiHelper(CommonGraphicsApp* glApp, bool useOpenGL2) OpenGLGuiHelper::~OpenGLGuiHelper() { + delete m_data->m_debugDraw; delete m_data->m_gl2ShapeDrawer; delete m_data; } diff --git a/examples/ExampleBrowser/main.cpp b/examples/ExampleBrowser/main.cpp index b245cdecb..6a528bc24 100644 --- a/examples/ExampleBrowser/main.cpp +++ b/examples/ExampleBrowser/main.cpp @@ -1,3 +1,4 @@ +#include "C:\develop\visual_leak_detector\vld-2.5\vld-2.5\src\vld.h" #include "OpenGLExampleBrowser.h" @@ -19,33 +20,34 @@ int main(int argc, char* argv[]) { - b3CommandLineArgs args(argc,argv); - b3Clock clock; - - - ExampleEntriesAll examples; - examples.initExampleEntries(); - - OpenGLExampleBrowser* exampleBrowser = new OpenGLExampleBrowser(&examples); - bool init = exampleBrowser->init(argc,argv); - exampleBrowser->registerFileImporter(".urdf",ImportURDFCreateFunc); - exampleBrowser->registerFileImporter(".sdf",ImportSDFCreateFunc); - exampleBrowser->registerFileImporter(".obj",ImportObjCreateFunc); - exampleBrowser->registerFileImporter(".stl",ImportSTLCreateFunc); - - clock.reset(); - if (init) { - do - { - float deltaTimeInSeconds = clock.getTimeMicroseconds()/1000000.f; - clock.reset(); - exampleBrowser->update(deltaTimeInSeconds); + b3CommandLineArgs args(argc, argv); + b3Clock clock; + + + ExampleEntriesAll examples; + examples.initExampleEntries(); + + OpenGLExampleBrowser* exampleBrowser = new OpenGLExampleBrowser(&examples); + bool init = exampleBrowser->init(argc, argv); + exampleBrowser->registerFileImporter(".urdf", ImportURDFCreateFunc); + exampleBrowser->registerFileImporter(".sdf", ImportSDFCreateFunc); + exampleBrowser->registerFileImporter(".obj", ImportObjCreateFunc); + exampleBrowser->registerFileImporter(".stl", ImportSTLCreateFunc); + + clock.reset(); + if (init) + { + do + { + float deltaTimeInSeconds = clock.getTimeMicroseconds() / 1000000.f; + clock.reset(); + exampleBrowser->update(deltaTimeInSeconds); + + } while (!exampleBrowser->requestedExit()); + } + delete exampleBrowser; - } while (!exampleBrowser->requestedExit()); } - delete exampleBrowser; - - return 0; } diff --git a/examples/Importers/ImportURDFDemo/BulletUrdfImporter.cpp b/examples/Importers/ImportURDFDemo/BulletUrdfImporter.cpp index 1c24c2eba..628d99bc2 100644 --- a/examples/Importers/ImportURDFDemo/BulletUrdfImporter.cpp +++ b/examples/Importers/ImportURDFDemo/BulletUrdfImporter.cpp @@ -1058,6 +1058,7 @@ btCollisionShape* BulletURDFImporter::getAllocatedCollisionShape(int index) { const UrdfCollision& col = link->m_collisionArray[v]; btCollisionShape* childShape = convertURDFToCollisionShape(&col ,pathPrefix); + m_data->m_allocatedCollisionShapes.push_back(childShape); if (childShape) { diff --git a/examples/Importers/ImportURDFDemo/UrdfParser.cpp b/examples/Importers/ImportURDFDemo/UrdfParser.cpp index 64be1573b..6ed9ac2c8 100644 --- a/examples/Importers/ImportURDFDemo/UrdfParser.cpp +++ b/examples/Importers/ImportURDFDemo/UrdfParser.cpp @@ -61,7 +61,9 @@ static bool parseVector4(btVector4& vec4, const std::string& vector_str) vec4.setZero(); btArray pieces; btArray rgba; - urdfStringSplit(pieces, vector_str, urdfIsAnyOf(" ")); + btAlignedObjectArray strArray; + urdfIsAnyOf(" ", strArray); + urdfStringSplit(pieces, vector_str, strArray); for (int i = 0; i < pieces.size(); ++i) { if (!pieces[i].empty()) @@ -82,7 +84,9 @@ static bool parseVector3(btVector3& vec3, const std::string& vector_str, ErrorLo vec3.setZero(); btArray pieces; btArray rgba; - urdfStringSplit(pieces, vector_str, urdfIsAnyOf(" ")); + btAlignedObjectArray strArray; + urdfIsAnyOf(" ", strArray); + urdfStringSplit(pieces, vector_str, strArray); for (int i = 0; i < pieces.size(); ++i) { if (!pieces[i].empty()) diff --git a/examples/Importers/ImportURDFDemo/urdfStringSplit.cpp b/examples/Importers/ImportURDFDemo/urdfStringSplit.cpp index a5a1adf83..9ed88e7f4 100644 --- a/examples/Importers/ImportURDFDemo/urdfStringSplit.cpp +++ b/examples/Importers/ImportURDFDemo/urdfStringSplit.cpp @@ -8,7 +8,7 @@ #include "urdfStringSplit.h" -void urdfStringSplit( btAlignedObjectArray&pieces, const std::string& vector_str, btAlignedObjectArray separators) +void urdfStringSplit( btAlignedObjectArray&pieces, const std::string& vector_str, const btAlignedObjectArray& separators) { assert(separators.size()==1); if (separators.size()==1) @@ -20,10 +20,9 @@ void urdfStringSplit( btAlignedObjectArray&pieces, const std::strin urdfStrArrayFree(strArray); } } - btAlignedObjectArray urdfIsAnyOf(const char* seps) + void urdfIsAnyOf(const char* seps, btAlignedObjectArray& strArray) { - btAlignedObjectArray strArray; - + int numSeps = strlen(seps); for (int i=0;i&pieces, const std::strin sep2[0] = seps[i]; strArray.push_back(sep2); } - return strArray; - } diff --git a/examples/Importers/ImportURDFDemo/urdfStringSplit.h b/examples/Importers/ImportURDFDemo/urdfStringSplit.h index 6eaa42b6d..dd7af9158 100644 --- a/examples/Importers/ImportURDFDemo/urdfStringSplit.h +++ b/examples/Importers/ImportURDFDemo/urdfStringSplit.h @@ -7,9 +7,9 @@ #include "LinearMath/btAlignedObjectArray.h" -void urdfStringSplit( btAlignedObjectArray&pieces, const std::string& vector_str, btAlignedObjectArray separators); +void urdfStringSplit( btAlignedObjectArray&pieces, const std::string& vector_str, const btAlignedObjectArray& separators); -btAlignedObjectArray urdfIsAnyOf(const char* seps); +void urdfIsAnyOf(const char* seps, btAlignedObjectArray& strArray); ///The string split C code is by Lars Wirzenius ///See http://stackoverflow.com/questions/2531605/how-to-split-a-string-with-a-delimiter-larger-than-one-single-char diff --git a/examples/InverseDynamics/InverseDynamicsExample.cpp b/examples/InverseDynamics/InverseDynamicsExample.cpp index 20cff9204..986f9024b 100644 --- a/examples/InverseDynamics/InverseDynamicsExample.cpp +++ b/examples/InverseDynamics/InverseDynamicsExample.cpp @@ -73,6 +73,7 @@ class InverseDynamicsExample : public CommonMultiBodyBase { btInverseDynamicsExampleOptions m_option; btMultiBody* m_multiBody; + btAlignedObjectArray m_allocatedShapes; btInverseDynamics::MultiBodyTree *m_inverseModel; TimeSeriesCanvas* m_timeSeriesCanvas; public: @@ -105,7 +106,13 @@ InverseDynamicsExample::InverseDynamicsExample(struct GUIHelperInterface* helper InverseDynamicsExample::~InverseDynamicsExample() { + delete m_multiBody; + for (int i = 0; i < m_allocatedShapes.size(); i++) + { + delete m_allocatedShapes[i]; + } + m_allocatedShapes.resize(0); delete m_inverseModel; delete m_timeSeriesCanvas; } @@ -166,6 +173,10 @@ void InverseDynamicsExample::initPhysics() btTransform identityTrans; identityTrans.setIdentity(); ConvertURDF2Bullet(u2b,creation, identityTrans,m_dynamicsWorld,true,u2b.getPathPrefix()); + for (int i = 0; i < u2b.getNumAllocatedCollisionShapes(); i++) + { + m_allocatedShapes.push_back(u2b.getAllocatedCollisionShape(i)); + } m_multiBody = creation.getBulletMultiBody(); if (m_multiBody) { diff --git a/examples/OpenGLWindow/SimpleOpenGL3App.cpp b/examples/OpenGLWindow/SimpleOpenGL3App.cpp index ba7f1c076..1423f2841 100644 --- a/examples/OpenGLWindow/SimpleOpenGL3App.cpp +++ b/examples/OpenGLWindow/SimpleOpenGL3App.cpp @@ -655,8 +655,9 @@ SimpleOpenGL3App::~SimpleOpenGL3App() delete m_primRenderer ; sth_delete(m_data->m_fontStash); delete m_data->m_renderCallbacks; - m_window->closeWindow(); TwDeleteDefaultFonts(); + m_window->closeWindow(); + delete m_window; delete m_data ; } diff --git a/examples/OpenGLWindow/TwFonts.cpp b/examples/OpenGLWindow/TwFonts.cpp index e5cd37595..eaf351eec 100644 --- a/examples/OpenGLWindow/TwFonts.cpp +++ b/examples/OpenGLWindow/TwFonts.cpp @@ -4883,18 +4883,33 @@ static const unsigned char s_FontFixed1[] = { void TwGenerateDefaultFonts() { - g_DefaultSmallFont = TwGenerateFont(s_Font0, FONT0_BM_W, FONT0_BM_H); - assert(g_DefaultSmallFont && g_DefaultSmallFont->m_NbCharRead==224); + if (g_DefaultSmallFont == 0) + { + g_DefaultSmallFont = TwGenerateFont(s_Font0, FONT0_BM_W, FONT0_BM_H); + assert(g_DefaultSmallFont && g_DefaultSmallFont->m_NbCharRead == 224); + } - g_DefaultNormalFont = TwGenerateFont(s_Font1, FONT1_BM_W, FONT1_BM_H); - assert(g_DefaultNormalFont && g_DefaultNormalFont->m_NbCharRead==224); + if (g_DefaultNormalFont == 0) + { + g_DefaultNormalFont = TwGenerateFont(s_Font1, FONT1_BM_W, FONT1_BM_H); + assert(g_DefaultNormalFont && g_DefaultNormalFont->m_NbCharRead == 224); + } - g_DefaultNormalFontAA = TwGenerateFont(s_Font1AA, FONT1AA_BM_W, FONT1AA_BM_H); - assert(g_DefaultNormalFontAA && g_DefaultNormalFontAA->m_NbCharRead==224); - g_DefaultLargeFont = TwGenerateFont(s_Font2AA, FONT2AA_BM_W, FONT2AA_BM_H); - assert(g_DefaultLargeFont && g_DefaultLargeFont->m_NbCharRead==224); - g_DefaultFixed1Font = TwGenerateFont(s_FontFixed1, FONTFIXED1_BM_W, FONTFIXED1_BM_H); - assert(g_DefaultFixed1Font && g_DefaultFixed1Font->m_NbCharRead==224); + if (g_DefaultNormalFontAA == 0) + { + g_DefaultNormalFontAA = TwGenerateFont(s_Font1AA, FONT1AA_BM_W, FONT1AA_BM_H); + assert(g_DefaultNormalFontAA && g_DefaultNormalFontAA->m_NbCharRead == 224); + } + if (g_DefaultLargeFont == 0) + { + g_DefaultLargeFont = TwGenerateFont(s_Font2AA, FONT2AA_BM_W, FONT2AA_BM_H); + assert(g_DefaultLargeFont && g_DefaultLargeFont->m_NbCharRead == 224); + } + if (g_DefaultFixed1Font == 0) + { + g_DefaultFixed1Font = TwGenerateFont(s_FontFixed1, FONTFIXED1_BM_W, FONTFIXED1_BM_H); + assert(g_DefaultFixed1Font && g_DefaultFixed1Font->m_NbCharRead == 224); + } } // --------------------------------------------------------------------------- diff --git a/examples/SimpleOpenGL3/main.cpp b/examples/SimpleOpenGL3/main.cpp index 5a2752e73..fe637778f 100644 --- a/examples/SimpleOpenGL3/main.cpp +++ b/examples/SimpleOpenGL3/main.cpp @@ -1,4 +1,6 @@ + + #include "OpenGLWindow/SimpleOpenGL3App.h" #include "Bullet3Common/b3Quaternion.h" #include "Bullet3Common/b3CommandLineArgs.h" @@ -59,101 +61,103 @@ void MyKeyboardCallback(int keycode, int state) int main(int argc, char* argv[]) { - b3CommandLineArgs myArgs(argc,argv); - - - SimpleOpenGL3App* app = new SimpleOpenGL3App("SimpleOpenGL3App",gWidth,gHeight,true); - - app->m_instancingRenderer->getActiveCamera()->setCameraDistance(13); - app->m_instancingRenderer->getActiveCamera()->setCameraPitch(0); - app->m_instancingRenderer->getActiveCamera()->setCameraTargetPosition(0,0,0); - sOldKeyboardCB = app->m_window->getKeyboardCallback(); - app->m_window->setKeyboardCallback(MyKeyboardCallback); - sOldMouseMoveCB = app->m_window->getMouseMoveCallback(); - app->m_window->setMouseMoveCallback(MyMouseMoveCallback); - sOldMouseButtonCB = app->m_window->getMouseButtonCallback(); - app->m_window->setMouseButtonCallback(MyMouseButtonCallback); - sOldWheelCB = app->m_window->getWheelCallback(); - app->m_window->setWheelCallback(MyWheelCallback); - sOldResizeCB = app->m_window->getResizeCallback(); - app->m_window->setResizeCallback(MyResizeCallback); - - - myArgs.GetCmdLineArgument("mp4_file",gVideoFileName); - if (gVideoFileName) - app->dumpFramesToVideo(gVideoFileName); - - myArgs.GetCmdLineArgument("png_file",gPngFileName); - char fileName[1024]; - - int textureWidth = 128; - int textureHeight = 128; - - unsigned char* image=new unsigned char[textureWidth*textureHeight*4]; - - - int textureHandle = app->m_renderer->registerTexture(image,textureWidth,textureHeight); - - int cubeIndex = app->registerCubeShape(1,1,1); - - b3Vector3 pos = b3MakeVector3(0,0,0); - b3Quaternion orn(0,0,0,1); - b3Vector3 color=b3MakeVector3(1,0,0); - b3Vector3 scaling=b3MakeVector3 (1,1,1); - app->m_renderer->registerGraphicsInstance(cubeIndex,pos,orn,color,scaling); - app->m_renderer->writeTransforms(); - - do { - static int frameCount = 0; - frameCount++; - if (gPngFileName) - { - printf("gPngFileName=%s\n",gPngFileName); - - sprintf(fileName,"%s%d.png",gPngFileName,frameCount++); - app->dumpNextFrameToPng(fileName); - } - - - - //update the texels of the texture using a simple pattern, animated using frame index - for(int y=0;y>4; - unsigned char* pi=image+y*textureWidth*3; - for(int x=0;x>4; - const unsigned char b=180; - unsigned char c=b+((s+(t&1))&1)*(255-b); - pi[0]=pi[1]=pi[2]=pi[3]=c;pi+=3; - } - } - - app->m_renderer->activateTexture(textureHandle); - app->m_renderer->updateTexture(textureHandle,image); - - float color[4] = {255,1,1,1}; - app->m_primRenderer->drawTexturedRect(100,200,gWidth/2-50,gHeight/2-50,color,0,0,1,1,true); - - - app->m_instancingRenderer->init(); - app->m_instancingRenderer->updateCamera(); - - app->m_renderer->renderScene(); - app->drawGrid(); - char bla[1024]; - sprintf(bla,"Simple test frame %d", frameCount); - - app->drawText(bla,10,10); - app->swapBuffer(); - } while (!app->m_window->requestedExit()); + b3CommandLineArgs myArgs(argc, argv); - - delete app; + SimpleOpenGL3App* app = new SimpleOpenGL3App("SimpleOpenGL3App", gWidth, gHeight, true); - delete[] image; + app->m_instancingRenderer->getActiveCamera()->setCameraDistance(13); + app->m_instancingRenderer->getActiveCamera()->setCameraPitch(0); + app->m_instancingRenderer->getActiveCamera()->setCameraTargetPosition(0, 0, 0); + sOldKeyboardCB = app->m_window->getKeyboardCallback(); + app->m_window->setKeyboardCallback(MyKeyboardCallback); + sOldMouseMoveCB = app->m_window->getMouseMoveCallback(); + app->m_window->setMouseMoveCallback(MyMouseMoveCallback); + sOldMouseButtonCB = app->m_window->getMouseButtonCallback(); + app->m_window->setMouseButtonCallback(MyMouseButtonCallback); + sOldWheelCB = app->m_window->getWheelCallback(); + app->m_window->setWheelCallback(MyWheelCallback); + sOldResizeCB = app->m_window->getResizeCallback(); + app->m_window->setResizeCallback(MyResizeCallback); + + + myArgs.GetCmdLineArgument("mp4_file", gVideoFileName); + if (gVideoFileName) + app->dumpFramesToVideo(gVideoFileName); + + myArgs.GetCmdLineArgument("png_file", gPngFileName); + char fileName[1024]; + + int textureWidth = 128; + int textureHeight = 128; + + unsigned char* image = new unsigned char[textureWidth*textureHeight * 4]; + + + int textureHandle = app->m_renderer->registerTexture(image, textureWidth, textureHeight); + + int cubeIndex = app->registerCubeShape(1, 1, 1); + + b3Vector3 pos = b3MakeVector3(0, 0, 0); + b3Quaternion orn(0, 0, 0, 1); + b3Vector3 color = b3MakeVector3(1, 0, 0); + b3Vector3 scaling = b3MakeVector3 (1, 1, 1); + app->m_renderer->registerGraphicsInstance(cubeIndex, pos, orn, color, scaling); + app->m_renderer->writeTransforms(); + + do + { + static int frameCount = 0; + frameCount++; + if (gPngFileName) + { + printf("gPngFileName=%s\n", gPngFileName); + + sprintf(fileName, "%s%d.png", gPngFileName, frameCount++); + app->dumpNextFrameToPng(fileName); + } + + + + //update the texels of the texture using a simple pattern, animated using frame index + for (int y = 0; y < textureHeight; ++y) + { + const int t = (y + frameCount) >> 4; + unsigned char* pi = image + y*textureWidth * 3; + for (int x = 0; x < textureWidth; ++x) + { + const int s = x >> 4; + const unsigned char b = 180; + unsigned char c = b + ((s + (t & 1)) & 1)*(255 - b); + pi[0] = pi[1] = pi[2] = pi[3] = c; pi += 3; + } + } + + app->m_renderer->activateTexture(textureHandle); + app->m_renderer->updateTexture(textureHandle, image); + + float color[4] = { 255, 1, 1, 1 }; + app->m_primRenderer->drawTexturedRect(100, 200, gWidth / 2 - 50, gHeight / 2 - 50, color, 0, 0, 1, 1, true); + + + app->m_instancingRenderer->init(); + app->m_instancingRenderer->updateCamera(); + + app->m_renderer->renderScene(); + app->drawGrid(); + char bla[1024]; + sprintf(bla, "Simple test frame %d", frameCount); + + app->drawText(bla, 10, 10); + app->swapBuffer(); + } while (!app->m_window->requestedExit()); + + + + delete app; + + delete[] image; + } return 0; } diff --git a/examples/StandaloneMain/main_console_single_example.cpp b/examples/StandaloneMain/main_console_single_example.cpp index c29ebcd79..5764e28fb 100644 --- a/examples/StandaloneMain/main_console_single_example.cpp +++ b/examples/StandaloneMain/main_console_single_example.cpp @@ -28,22 +28,22 @@ subject to the following restrictions: int main(int argc, char* argv[]) { - - DummyGUIHelper noGfx; - - CommonExampleOptions options(&noGfx); - CommonExampleInterface* example = StandaloneExampleCreateFunc(options); - - example->initPhysics(); - for (int i=0;i<1000;i++) { - printf("Simulating step %d\n",i); - example->stepSimulation(1.f/60.f); + DummyGUIHelper noGfx; + + CommonExampleOptions options(&noGfx); + CommonExampleInterface* example = StandaloneExampleCreateFunc(options); + + example->initPhysics(); + for (int i = 0; i < 1000; i++) + { + printf("Simulating step %d\n", i); + example->stepSimulation(1.f / 60.f); + } + example->exitPhysics(); + + delete example; } - example->exitPhysics(); - - delete example; - return 0; }