2021-11-20 00:37:59 +04:00
2021-11-20 00:37:59 +04:00
2021-11-19 21:10:11 +04:00
2021-11-19 21:05:21 +04:00
2021-11-18 21:02:14 +04:00
2021-11-11 07:54:16 +04:00
2021-11-20 00:37:59 +04:00
2021-11-20 00:37:59 +04:00

assimp-go

A Handcrafted Open Asset Import Library (AssImp) wrapper for Go.

Features

The following features are already implemented:

  • Loading all supported model formats into a Scene object
  • Mesh data
  • Materials
  • Textures and embedded textures
  • Error reporting
  • Enums relevant to the above operations

Unimplemented (yet) AssImp Scene objects:

  • Animation
  • Lights
  • Camera
  • Metadata

Using assimp-go

Requirements

To run the project you need:

  • A recent version of Go installed (1.17+)
  • A C/C++ compiler installed and in your path
    • Windows: MingW or similar
    • Mac/Linux: Should be installed by default, but if not try GCC or Clang

Then simply clone and use go run .

Note: that it might take a while to run the first time because of downloading/compiling dependencies.

assimp-go statically links AssImp using platform dependent libraries. Currently only Windows libraries are available, but more should be easy to add by statically compiling assimp on the wanted platform. (Make a PR if you can help us get those binaries!)

Getting Started

func main() {

    //Load this .fbx model with the following post processing flags
    scene, release, err := asig.ImportFile("my-cube.fbx", asig.PostProcessTriangulate | asig.PostProcessJoinIdenticalVertices)
    if err != nil {
            panic(err)
    }

    for i := 0; i < len(scene.Materials); i++ {

        m := scene.Materials[i]

        //Check how many diffuse textures are attached to this material
        texCount := asig.GetMaterialTextureCount(m, asig.TextureTypeDiffuse)
        fmt.Println("Texture count:", texCount)

        //If we have at least 1 diffuse texture attached to this material, load the first diffuse texture (index 0)
        if texCount > 0 {

            texInfo, err := asig.GetMaterialTexture(m, asig.TextureTypeDiffuse, 0)
            if err != nil {
                panic(err)
            }

            fmt.Printf("%v\n", texInfo)
        }
    }

    //Now that we are done with all our `asig.XYZ` calls we can release underlying C resources. 
    //
    //NOTE: Our Go objects (like scene, scene.Materials etc) will remain intact ;), but we must NOT use asig.XYZ calls on this scene and its children anymore
    release()
}

The release() function is used to free underlying C resources and should be called after all processing that requires C code is done. release() Will not affect the returned Go structs like Scene or Mesh. Returned Go data will remain valid.

asig.X functions call into C and therefore should not be used on released objects. Calling any asig.X function after release() is undefined.

While asig functions should NOT be called on a Scene (or its objects) after they have been released, methods on structs (e.g. myScene.XYZ, myMesh.ABCD()) are safe even after release.

Developing assimp-go

We link against static assimp libraries that are built for each platform and added to the asig/libs package. Depending on the platform we select one of them and link against it when doing go build.

The general steps are:

  • Copy assimp includes into asig/assimp
  • Copy zlib.h, zconf.h and irrXML.h into asig/zlib and asig/irrxml respectively.
  • Copy static libraries into asig/libs
  • Generate the wrappers using swig -go -c++ -intgosize 64 asig/asig.i
  • Add #cgo LDFLAGS: -L ./staticLibs -l zlibstatic -l IrrXML -l assimp at the top of the 'C' import in asig.go

Note: When dealing with static libraries the compiler will probably (e.g. MinGW does this) ignore lib suffixes and .a/.lib suffixes. So if your lib name is libassimp.a you need to pass it to CGO as -l assimp, otherwise you will get an error about library not found.

For platform specific steps:

Windows:

Note: You must compile with the same C/C++ compiler you use with Go (e.g. if you use MinGW with Go, then compile assimp with MinGW by sepcifying the correct -G option)


Note: If you get compilation errors with things like File too big or can't write 166 bytes to section then cmake isn't detecting you are using MinGW, so add this flag -D CMAKE_COMPILER_IS_MINGW=TRUE

Now assuming you are using MinGW on windows:

  • Clone wanted release of assimp and run cmake CMakeLists.txt -D BUILD_SHARED_LIBS=OFF -D ASSIMP_BUILD_ZLIB=ON -D ASSIMP_BUILD_ASSIMP_TOOLS=OFF -D ASSIMP_BUILD_TESTS=OFF -G "MinGW Makefiles" in the root folder
  • Run cmake --build . --parallel 6
  • Copy the generated *.lib (or *.a) files into asig/lib
Description
Handcrafted Open Asset Import Library (AssImp) wrapper for Go
Readme MIT 24 MiB
Languages
C++ 62.6%
C 33.3%
Go 4.1%