====== Example: Hello, World ====== This is just about the simplest functional example possible. It demonstrates: * Setting up error and message callbacks. * Allocating and deleting a SpeedTree Engine object. * Loading a SpeedTree model file ([[input|STE or SPM]]). #include #include "speedtree_engine.h" /////////////////////////////////////////////////////////////////////// // SpeedTree Engine API error callback static void MyEngineApiErrorCallback(const char* pError) { fprintf(stderr, " **[Error Report from SpeedTree Engine API]**: %s\n", pError); } /////////////////////////////////////////////////////////////////////// // SpeedTree Engine API message callback static void MyEngineApiMessageCallback(const char* pMessage) { fprintf(stderr, " [Message from SpeedTree Engine API]: %s\n", pMessage); } /////////////////////////////////////////////////////////////////////// // Example_HelloWorld bool Example_HelloWorld(const char* pModelFilename) { bool bSuccess = false; // register callback message functions; when api calls fail, messages will be sent here SteSetErrorFunction(MyEngineApiErrorCallback); SteSetMessageFunction(MyEngineApiMessageCallback); // uses a C interface -- objects are created and initialized through function calls SSteEngine* pEngine = SteNew( ); if (pEngine) { // this causes the model file to be loaded and parsed, but nothing is computed yet if (SteLoadSpeedTreeFile(pEngine, pModelFilename) == STE_SUCCESS) { printf("Hello, world. SpeedTree model loaded successfully.\n"); bSuccess = true; } else { // if there's a failure, a message will be sent via the callback } // using C, so no destructors SteDelete(pEngine); } return bSuccess; }