SpeedTree
    Show / Hide Table of Contents

    Callback system

    The Runtime SDK has a centralized callback system. The callback registration system is housed in Include/SpeedTree/Core/Callbacks.h. There are nine callbacks that can be registered, though each drops back to a default definition if not set (the callbacks are located in Source/Core/Source/Callbacks.cpp):

    Callback function Description
    SpeedTree::Callbacks::Message() The Runtime SDK calls this function when it wants to communicate a non-error message to the client application.
    SpeedTree::Callbacks::Error() The Runtime SDK calls this function when an error message needs to be communicated to the client.
    SpeedTree::Callbacks::HeapAlloc() All Runtime SDK-internal heap allocations are routed through this function.
    SpeedTree::Callbacks::HeapFree() All Runtime SDK-internal heap free calls are routed here.
    SpeedTree::Callbacks::GetFileSize() Given a string filename, this function will return the size of that file in bytes.
    SpeedTree::Callbacks::LoadBinaryFile() Given a string filename and a buffer, this function will read a binary file and fill the provided buffer with its contents.
    SpeedTree::Callbacks::UserRenderPipeline() During graphics initialization, this function helps determine which shaders and render states should be applied based on various parameters. This is described in more detail in User Render Configuration.
    SpeedTree::Callbacks::DirectMemAlloc() Used by some non-desktop platforms for GPU memory allocation.
    SpeedTree::Callbacks::DirectMemFree() Used by some non-desktop platforms for GPU memory freeing.

    Note that due to DLL interface constraints, these functions cannot be set directly but are set through access functions. An example of setting a callback appears in the listing below.

    #include <cstdio>
    #include "Core/Callbacks.h"
    
    // example callback functions to show expected function parameters
    
    // message callback
    void MyMessageCallback(const char* pMsg) { printf("SpeedTree Runtime SDK Message: [%s]\n", pMsg); }
    
    // error callback
    void MyErrorCallback(const char* pError) { fprintf(stderr, "SpeedTree Runtime SDK Error: [%s]\n", pError); }
    
    // heap allocation callback
    void* MyHeapAllocCallback(size_t siSizeInBytes, size_t siAlignment) { return malloc(siSizeInBytes); }
    
    // heap free callback
    void MyHeapFreeCallback(void* pBlock) { if (pBlock) free(pBlock); }
    
    // file size callback prototype
    size_t MyFileSizeCallback(const char* pFilename);
    
    // load binary file callback prototype (returns true on success)
    bool MyLoadFileCallback(const char* pFilename, void* pBuffer);
    
    // example use
    void main(void)
    {
        // assign example callbacks
        SpeedTree::Callbacks::Message() = MyMessageCallback;
        SpeedTree::Callbacks::Error() = MyErrorCallback;
        SpeedTree::Callbacks::HeapAlloc() = MyHeapAllocCallback;
        SpeedTree::Callbacks::HeapFree() = MyHeapFreeCallback;
        SpeedTree::Callbacks::GetFileSize() = MyFileSizeCallback;
        SpeedTree::Callbacks::LoadBinaryFile() = MyLoadFileCallback;
    
        // to test one, we can manually invoke an error callback with
        SpeedTree::CCore::Error("an error... we've just experienced an error");
    }
    
    Copyright © 2023 Unity Technologies
    • Legal
    • Privacy Policy
    • Cookies
    • Do Not Sell or Share My Personal Information
    • Your Privacy Choices (Cookie Settings)
    "Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
    Generated by DocFX.