mirror of
https://github.com/bloeys/assimp-go.git
synced 2025-12-29 16:38:20 +00:00
Compare commits
28 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 362558c877 | |||
| 7e82370f34 | |||
| 58e13d1c5a | |||
| bfa7357ea2 | |||
| dd346de9de | |||
| babf9c3926 | |||
| 0fdd5d479c | |||
| 7efa9c31f4 | |||
| 02fd276728 | |||
| 1ef22874f5 | |||
| bb302e9fcc | |||
| d583049090 | |||
| 9acd5bee18 | |||
| 5b5d091d56 | |||
| c0a308b178 | |||
| 5573ffdbf6 | |||
| dee2332b9a | |||
| 4462a3be04 | |||
| 3b31e8d677 | |||
| 32c5def787 | |||
| e96f70d88f | |||
| 672802a705 | |||
| fb9d44beca | |||
| 8bf9dc9121 | |||
| 8c752a0bda | |||
| 77e62588fe | |||
| e7e81afc7c | |||
| 6b6255d4a3 |
20
.github/workflows/run-assimp-go.yml
vendored
Executable file
20
.github/workflows/run-assimp-go.yml
vendored
Executable file
@ -0,0 +1,20 @@
|
||||
name: Build-AssImp
|
||||
on:
|
||||
create:
|
||||
|
||||
jobs:
|
||||
Run-assimp-go-macos:
|
||||
runs-on: macos-10.15
|
||||
steps:
|
||||
- name: Install golang 1.17
|
||||
uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: '^1.17'
|
||||
- name: Clone assimp-go
|
||||
run: git clone https://github.com/bloeys/assimp-go
|
||||
- name: Copy dylib
|
||||
working-directory: assimp-go
|
||||
run: sudo mkdir -p /usr/local/lib && sudo cp asig/libs/libassimp_darwin_amd64.dylib /usr/local/lib/libassimp.5.dylib
|
||||
- name: Run assimp-go
|
||||
working-directory: assimp-go
|
||||
run: go run .
|
||||
10
.gitignore
vendored
10
.gitignore
vendored
@ -11,8 +11,12 @@
|
||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||
*.out
|
||||
|
||||
# Dependency directories (remove the comment below to include it)
|
||||
# Custom
|
||||
vendor/
|
||||
*.a
|
||||
.DS_Store
|
||||
*.obj
|
||||
*.fbx
|
||||
!obj.obj
|
||||
*.fbx
|
||||
*.glb
|
||||
!libassimp_darwin_arm64.dylib
|
||||
!libassimp_darwin_amd64.dylib
|
||||
128
README.md
128
README.md
@ -1,31 +1,133 @@
|
||||
# assimp-go
|
||||
|
||||
[](https://github.com/bloeys/assimp-go/actions/workflows/run-assimp-go.yml)
|
||||
|
||||
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
|
||||
|
||||
## Using assimp-go
|
||||
|
||||
### Requirements
|
||||
|
||||
To run the project you need:
|
||||
|
||||
* A 64-bit machine (32-bit machines should be supportable if we get help adding the needed libs)
|
||||
* A recent version of [Go](https://golang.org/) installed (1.17+)
|
||||
* A C/C++ compiler installed and in your path
|
||||
* **Windows**: [MingW](https://www.mingw-w64.org/downloads/#mingw-builds) or similar
|
||||
* **Mac/Linux**: Should be installed by default, but if not try [GCC](https://gcc.gnu.org/) or [Clang](https://releases.llvm.org/download.html)
|
||||
|
||||
Now to be able to run assimp-go you will need the AssImp shared libraries (DLLs/DyLibs), which you can
|
||||
download from the GitHub releases page.
|
||||
|
||||
### Installing on Windows
|
||||
|
||||
Download the **.dll** of the release you want, and place it in the **root** of your Go project.
|
||||
|
||||
### Installing on MacOS
|
||||
|
||||
First, download the appropriate **.dylib** for your device (`_amd64` for Intel CPUs and `_arm64` for Apple CPUs).
|
||||
Next you will need to rename the lib to `libassimp.5.dylib` and move it to `/usr/local/lib` or `/usr/lib`.
|
||||
|
||||
You can use this command to do it: `sudo mkdir -p /usr/local/lib && sudo cp libassimp_darwin*.dylib /usr/local/lib/libassimp.5.dylib`
|
||||
|
||||
### Running assimp-go
|
||||
|
||||
Use `go run .` to run the simple example in `main.go` ;)
|
||||
|
||||
> Note: that it might take a while to run the first time because of downloading/compiling dependencies.
|
||||
|
||||
### Getting Started
|
||||
|
||||
```Go
|
||||
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 `aig/libs` package.
|
||||
Depending on the platform we select one of them and link against it when doing `go build`.
|
||||
We link against assimp libraries that are built for each platform and the `.a`/`.dylib` files are added to the `asig/libs` package.
|
||||
At build time, the `#cgo` directive choose the appropriate libs and links against them.
|
||||
|
||||
The general steps are:
|
||||
|
||||
- Copy assimp includes into `aig/assimp`
|
||||
- Copy `zlib.h`, `zconf.h` and `irrXML.h` into `aig/zlib` and `aig/irrxml` respectively.
|
||||
- Copy static libraries into `aig/libs`
|
||||
- Generate the wrappers using `swig -go -c++ -intgosize 64 aig/aig.i`
|
||||
- Add `#cgo LDFLAGS: -L ./staticLibs -l zlibstatic -l IrrXML -l assimp` at the top of the 'C' import in `aig.go`
|
||||
* Copy assimp includes into `asig/assimp`
|
||||
* Copy libraries and DLL import libraries into `asig/libs`
|
||||
|
||||
> Note: When dealing with static libraries the compiler will probably (e.g. MinGW does this) ignore `lib` suffixes and `.a`/`.lib` suffixes.
|
||||
> Note: When dealing with libraries the compiler will probably (e.g. MinGW does this) ignore `lib` prefixes 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: 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 specifying the correct `-G` option to cMake)
|
||||
---
|
||||
> 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` file into `aig/lib`
|
||||
* Clone wanted release of assimp and run `cmake CMakeLists.txt -D ASSIMP_BUILD_ZLIB=ON -D ASSIMP_BUILD_ASSIMP_TOOLS=OFF -G "MinGW Makefiles"` in the root folder
|
||||
* Run `cmake --build . --parallel 6`
|
||||
* Copy the generated `*.lib` (or `*.a`) files from the `lib` folder and into `asig/libs`, and copy the generated dll from AssImp `bin` folder into the root of `assimp-go`.
|
||||
* Copy the generated `libzlibstatic.a` file from `contrib/zlib` and into the `asig/libs` folder.
|
||||
|
||||
**MacOS**:
|
||||
|
||||
* Clone wanted release of assimp and run `cmake CMakeLists.txt -D ASSIMP_BUILD_ZLIB=ON -D ASSIMP_BUILD_ASSIMP_TOOLS=OFF` in the root folder
|
||||
* Run `cmake --build . --parallel 6`
|
||||
* Copy the generated `*.dylib` files from the `bin` folder and into both `asig/libs` and `/usr/local/lib`
|
||||
|
||||
13563
asig/asig.go
13563
asig/asig.go
File diff suppressed because it is too large
Load Diff
241
asig/asig.i
241
asig/asig.i
@ -1,241 +0,0 @@
|
||||
%module asig
|
||||
|
||||
//NOTE: Add this above the 'C' package in asig_wrap.go `#cgo LDFLAGS: -L ./staticLibs -l zlibstatic -l IrrXML -l assimp` after generating
|
||||
|
||||
// SWIG helpers for std::string and std::vector wrapping.
|
||||
%include <std_string.i>
|
||||
%include <std_vector.i>
|
||||
|
||||
//Needed defines
|
||||
#define AI_NO_EXCEPT noexcept
|
||||
#define C_STRUCT struct
|
||||
#define AI_FORCE_INLINE inline
|
||||
#define C_ENUM enum
|
||||
#define ASSIMP_API
|
||||
#define PACK_STRUCT
|
||||
|
||||
//Macros
|
||||
%define ASSIMP_ARRAY(CLASS, TYPE, NAME, LENGTH)
|
||||
%newobject CLASS::NAME;
|
||||
%extend CLASS {
|
||||
std::vector<TYPE > *NAME() const {
|
||||
std::vector<TYPE > *result = new std::vector<TYPE >;
|
||||
result->reserve(LENGTH);
|
||||
|
||||
for (unsigned int i = 0; i < LENGTH; ++i) {
|
||||
result->push_back($self->NAME[i]);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
%ignore CLASS::NAME;
|
||||
%enddef
|
||||
|
||||
%define ASSIMP_POINTER_ARRAY(CLASS, TYPE, NAME, LENGTH)
|
||||
%newobject CLASS::NAME;
|
||||
%extend CLASS {
|
||||
std::vector<TYPE *> *NAME() const {
|
||||
std::vector<TYPE *> *result = new std::vector<TYPE *>;
|
||||
result->reserve(LENGTH);
|
||||
|
||||
TYPE *currentValue = $self->NAME;
|
||||
TYPE *valueLimit = $self->NAME + LENGTH;
|
||||
while (currentValue < valueLimit) {
|
||||
result->push_back(currentValue);
|
||||
++currentValue;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
%ignore CLASS::NAME;
|
||||
%enddef
|
||||
|
||||
%define ASSIMP_POINTER_ARRAY_ARRAY(CLASS, TYPE, NAME, OUTER_LENGTH, INNER_LENGTH)
|
||||
%newobject CLASS::NAME;
|
||||
%extend CLASS {
|
||||
std::vector<std::vector<TYPE *> > *NAME() const {
|
||||
std::vector<std::vector<TYPE *> > *result = new std::vector<std::vector<TYPE *> >;
|
||||
result->reserve(OUTER_LENGTH);
|
||||
|
||||
for (unsigned int i = 0; i < OUTER_LENGTH; ++i) {
|
||||
std::vector<TYPE *> currentElements;
|
||||
|
||||
if ($self->NAME[i] != 0) {
|
||||
currentElements.reserve(INNER_LENGTH);
|
||||
|
||||
TYPE *currentValue = $self->NAME[i];
|
||||
TYPE *valueLimit = $self->NAME[i] + INNER_LENGTH;
|
||||
while (currentValue < valueLimit) {
|
||||
currentElements.push_back(currentValue);
|
||||
++currentValue;
|
||||
}
|
||||
}
|
||||
|
||||
result->push_back(currentElements);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
%ignore CLASS::NAME;
|
||||
%enddef
|
||||
|
||||
//We need these otherwise swig won't generate interfaces for these types correctly
|
||||
//because swig gets confused when there is a typedef and a templated class, so we put the typedefs here
|
||||
//and a template directive at the end
|
||||
typedef float ai_real;
|
||||
|
||||
typedef aiVector3t<ai_real> aiVector3D;
|
||||
typedef aiVector2t<ai_real> aiVector2D;
|
||||
typedef aiMatrix3x3t<ai_real> aiMatrix3x3;
|
||||
typedef aiMatrix4x4t<ai_real> aiMatrix4x4;
|
||||
|
||||
%{
|
||||
#include "assimp/cimport.h"
|
||||
#include "assimp/scene.h"
|
||||
#include "assimp/mesh.h"
|
||||
#include "assimp/vector2.h"
|
||||
#include "assimp/vector3.h"
|
||||
#include "assimp/matrix3x3.h"
|
||||
#include "assimp/matrix4x4.h"
|
||||
#include "assimp/Defines.h"
|
||||
#include "assimp/color4.h"
|
||||
#include "assimp/postprocess.h"
|
||||
#include "assimp/types.h"
|
||||
#include "assimp/texture.h"
|
||||
#include "assimp/light.h"
|
||||
#include "assimp/camera.h"
|
||||
#include "assimp/material.h"
|
||||
#include "assimp/anim.h"
|
||||
#include "assimp/metadata.h"
|
||||
|
||||
#include "zlib/zconf.h"
|
||||
#include "zlib/zlib.h"
|
||||
|
||||
#include "irrxml/irrXML.h"
|
||||
|
||||
%}
|
||||
|
||||
//Features
|
||||
%feature("d:stripprefix", "aiProcess_") aiPostProcessSteps;
|
||||
|
||||
//Ignores
|
||||
%ignore aiString::Set(const std::string& pString);
|
||||
|
||||
//aiScene macros
|
||||
ASSIMP_ARRAY(aiScene, aiAnimation*, mAnimations, $self->mNumAnimations);
|
||||
ASSIMP_ARRAY(aiScene, aiCamera*, mCameras, $self->mNumCameras);
|
||||
ASSIMP_ARRAY(aiScene, aiLight*, mLights, $self->mNumLights);
|
||||
ASSIMP_ARRAY(aiScene, aiMaterial*, mMaterials, $self->mNumMaterials);
|
||||
ASSIMP_ARRAY(aiScene, aiMesh*, mMeshes, $self->mNumMeshes);
|
||||
ASSIMP_ARRAY(aiScene, aiTexture*, mTextures, $self->mNumTextures);
|
||||
|
||||
ASSIMP_ARRAY(aiNode, aiNode*, mChildren, $self->mNumChildren);
|
||||
ASSIMP_ARRAY(aiNode, unsigned int, mMeshes, $self->mNumMeshes);
|
||||
|
||||
//aiMesh macros
|
||||
ASSIMP_ARRAY(aiFace, unsigned int, mIndices, $self->mNumIndices);
|
||||
|
||||
ASSIMP_POINTER_ARRAY(aiBone, aiVertexWeight, mWeights, $self->mNumWeights);
|
||||
|
||||
ASSIMP_POINTER_ARRAY(aiAnimMesh, aiVector3D, mVertices, $self->mNumVertices);
|
||||
ASSIMP_POINTER_ARRAY(aiAnimMesh, aiVector3D, mNormals, $self->mNumVertices);
|
||||
ASSIMP_POINTER_ARRAY(aiAnimMesh, aiVector3D, mTangents, $self->mNumVertices);
|
||||
ASSIMP_POINTER_ARRAY(aiAnimMesh, aiVector3D, mBitangents, $self->mNumVertices);
|
||||
ASSIMP_POINTER_ARRAY_ARRAY(aiAnimMesh, aiVector3D, mTextureCoords, AI_MAX_NUMBER_OF_TEXTURECOORDS, $self->mNumVertices);
|
||||
ASSIMP_POINTER_ARRAY_ARRAY(aiAnimMesh, aiColor4D, mColors, AI_MAX_NUMBER_OF_COLOR_SETS, $self->mNumVertices);
|
||||
|
||||
ASSIMP_ARRAY(aiMesh, aiAnimMesh*, mAnimMeshes, $self->mNumAnimMeshes);
|
||||
ASSIMP_ARRAY(aiMesh, aiBone*, mBones, $self->mNumBones);
|
||||
ASSIMP_ARRAY(aiMesh, unsigned int, mNumUVComponents, AI_MAX_NUMBER_OF_TEXTURECOORDS);
|
||||
ASSIMP_POINTER_ARRAY(aiMesh, aiVector3D, mVertices, $self->mNumVertices);
|
||||
ASSIMP_POINTER_ARRAY(aiMesh, aiVector3D, mNormals, $self->mNumVertices);
|
||||
ASSIMP_POINTER_ARRAY(aiMesh, aiVector3D, mTangents, $self->mNumVertices);
|
||||
ASSIMP_POINTER_ARRAY(aiMesh, aiVector3D, mBitangents, $self->mNumVertices);
|
||||
ASSIMP_POINTER_ARRAY(aiMesh, aiFace, mFaces, $self->mNumFaces);
|
||||
ASSIMP_POINTER_ARRAY_ARRAY(aiMesh, aiVector3D, mTextureCoords, AI_MAX_NUMBER_OF_TEXTURECOORDS, $self->mNumVertices);
|
||||
ASSIMP_POINTER_ARRAY_ARRAY(aiMesh, aiColor4D, mColors, AI_MAX_NUMBER_OF_COLOR_SETS, $self->mNumVertices);
|
||||
|
||||
//Camera macros
|
||||
ASSIMP_ARRAY(aiMaterial, aiMaterialProperty*, mProperties, $self->mNumProperties)
|
||||
|
||||
//Material settings
|
||||
%include <typemaps.i>
|
||||
%apply enum SWIGTYPE *OUTPUT { aiTextureMapping* mapping };
|
||||
%apply unsigned int *OUTPUT { unsigned int* uvindex };
|
||||
%apply float *OUTPUT { float* blend };
|
||||
%apply enum SWIGTYPE *OUTPUT { aiTextureOp* op };
|
||||
%apply unsigned int *OUTPUT { unsigned int* flags };
|
||||
|
||||
//Final includes
|
||||
%include "assimp/cimport.h" // Plain-C interface
|
||||
%include "assimp/scene.h" // Output data structure
|
||||
%include "assimp/mesh.h"
|
||||
%include "assimp/vector2.h"
|
||||
%include "assimp/vector3.h"
|
||||
%include "assimp/matrix3x3.h"
|
||||
%include "assimp/matrix4x4.h"
|
||||
%include "assimp/Defines.h"
|
||||
%include "assimp/color4.h"
|
||||
%include "assimp/types.h"
|
||||
%include "assimp/texture.h"
|
||||
%include "assimp/light.h"
|
||||
%include "assimp/camera.h"
|
||||
%include "assimp/material.h"
|
||||
%include "assimp/anim.h"
|
||||
%include "assimp/metadata.h"
|
||||
%include "assimp/postprocess.h"
|
||||
|
||||
%include "zlib/zconf.h"
|
||||
%include "zlib/zlib.h"
|
||||
|
||||
%include "irrxml/irrXML.h"
|
||||
|
||||
// We have to "instantiate" the templates used by the ASSSIMP_*_ARRAY macros
|
||||
// here at the end to avoid running into forward reference issues (SWIG would
|
||||
// spit out the helper functions before the header includes for the element
|
||||
// types otherwise).
|
||||
|
||||
%template(UintVector) std::vector<unsigned int>;
|
||||
%template(aiAnimationVector) std::vector<aiAnimation *>;
|
||||
%template(aiAnimMeshVector) std::vector<aiAnimMesh *>;
|
||||
%template(aiBonesVector) std::vector<aiBone *>;
|
||||
%template(aiCameraVector) std::vector<aiCamera *>;
|
||||
%template(aiColor4DVector) std::vector<aiColor4D *>;
|
||||
%template(aiColor4DVectorVector) std::vector<std::vector<aiColor4D *> >;
|
||||
%template(aiFaceVector) std::vector<aiFace *>;
|
||||
%template(aiLightVector) std::vector<aiLight *>;
|
||||
%template(aiMaterialVector) std::vector<aiMaterial *>;
|
||||
%template(aiMaterialPropertyVector) std::vector<aiMaterialProperty *>;
|
||||
%template(aiMeshAnimVector) std::vector<aiMeshAnim *>;
|
||||
%template(aiMeshVector) std::vector<aiMesh *>;
|
||||
%template(aiNodeVector) std::vector<aiNode *>;
|
||||
%template(aiNodeAnimVector) std::vector<aiNodeAnim *>;
|
||||
%template(aiTextureVector) std::vector<aiTexture *>;
|
||||
%template(aiVector3DVector) std::vector<aiVector3D *>;
|
||||
%template(aiVector3DVectorVector) std::vector<std::vector<aiVector3D *> >;
|
||||
%template(aiVertexWeightVector) std::vector<aiVertexWeight *>;
|
||||
%template(GetInteger) aiMaterial::Get<int>;
|
||||
%template(GetFloat) aiMaterial::Get<float>;
|
||||
%template(GetColor4D) aiMaterial::Get<aiColor4D>;
|
||||
%template(GetColor3D) aiMaterial::Get<aiColor3D>;
|
||||
%template(GetString) aiMaterial::Get<aiString>;
|
||||
%template(aiVector2D) aiVector2t<ai_real>;
|
||||
%template(aiVector3D) aiVector3t<ai_real>;
|
||||
%template(aiMatrix3x3) aiMatrix3x3t<ai_real>;
|
||||
%template(aiMatrix4x4) aiMatrix4x4t<ai_real>;
|
||||
|
||||
//Material settings
|
||||
%clear unsigned int* flags;
|
||||
%clear aiTextureOp* op;
|
||||
%clear float *blend;
|
||||
%clear unsigned int* uvindex;
|
||||
%clear aiTextureMapping* mapping;
|
||||
|
||||
%apply int &OUTPUT { int &pOut };
|
||||
%apply float &OUTPUT { float &pOut };
|
||||
|
||||
%clear int &pOut;
|
||||
%clear float &pOut;
|
||||
17519
asig/asig_wrap.cxx
17519
asig/asig_wrap.cxx
File diff suppressed because it is too large
Load Diff
330
asig/enums.go
Executable file
330
asig/enums.go
Executable file
@ -0,0 +1,330 @@
|
||||
package asig
|
||||
|
||||
type aiReturn int32
|
||||
|
||||
const (
|
||||
//Indicates that a function was successful
|
||||
aiReturnSuccess = 0x0
|
||||
|
||||
//Indicates that a function failed
|
||||
aiReturnFailure = -0x1
|
||||
|
||||
//Indicates that not enough memory was available to perform the requested operation
|
||||
aiReturnOutofMemory = -0x3
|
||||
)
|
||||
|
||||
type SceneFlag int32
|
||||
|
||||
const (
|
||||
/**
|
||||
* Specifies that the scene data structure that was imported is not complete.
|
||||
* This flag bypasses some internal validations and allows the import
|
||||
* of animation skeletons, material libraries or camera animation paths
|
||||
* using Assimp. Most applications won't support such data.
|
||||
*/
|
||||
SceneFlagIncomplete SceneFlag = 1 << 0
|
||||
|
||||
/**
|
||||
* This flag is set by the validation postprocess-step (PostProcessValidateDataStructure)
|
||||
* if the validation is successful. In a validated scene you can be sure that
|
||||
* any cross references in the data structure (e.g. vertex indices) are valid.
|
||||
*/
|
||||
SceneFlagValidated SceneFlag = 1 << 1
|
||||
|
||||
/**
|
||||
* This flag is set by the validation postprocess-step (PostProcessValidateDataStructure)
|
||||
* if the validation is successful but some issues have been found.
|
||||
* This can for example mean that a texture that does not exist is referenced
|
||||
* by a material or that the bone weights for a vertex don't sum to 1.0 ... .
|
||||
* In most cases you should still be able to use the import. This flag could
|
||||
* be useful for applications which don't capture Assimp's log output.
|
||||
*/
|
||||
SceneFlagValidationWarning SceneFlag = 1 << 2
|
||||
|
||||
/**
|
||||
* This flag is currently only set by the PostProcessJoinIdenticalVertices step.
|
||||
* It indicates that the vertices of the output meshes aren't in the internal
|
||||
* verbose format anymore. In the verbose format all vertices are unique,
|
||||
* no vertex is ever referenced by more than one face.
|
||||
*/
|
||||
SceneFlagNonVerboseFormat SceneFlag = 1 << 3
|
||||
|
||||
/**
|
||||
* Denotes pure height-map terrain data. Pure terrains usually consist of quads,
|
||||
* sometimes triangles, in a regular grid. The x,y coordinates of all vertex
|
||||
* positions refer to the x,y coordinates on the terrain height map, the z-axis
|
||||
* stores the elevation at a specific point.
|
||||
*
|
||||
* TER (Terragen) and HMP (3D Game Studio) are height map formats.
|
||||
* @note Assimp is probably not the best choice for loading *huge* terrains -
|
||||
* fully triangulated data takes extremely much free store and should be avoided
|
||||
* as long as possible (typically you'll do the triangulation when you actually
|
||||
* need to render it).
|
||||
*/
|
||||
SceneFlagTerrain SceneFlag = 1 << 4
|
||||
|
||||
/**
|
||||
* Specifies that the scene data can be shared between structures. For example:
|
||||
* one vertex in few faces. SceneFlagNonVerboseFormat can not be
|
||||
* used for this because SceneFlagNonVerboseFormat has internal
|
||||
* meaning about postprocessing steps.
|
||||
*/
|
||||
SceneFlagAllowShared SceneFlag = 1 << 5
|
||||
)
|
||||
|
||||
//aiGetErrorString specifies the types of primitives that can be present in a mesh
|
||||
type PrimitiveType int32
|
||||
|
||||
const (
|
||||
PrimitiveTypePoint = 1 << 0
|
||||
PrimitiveTypeLine = 1 << 1
|
||||
PrimitiveTypeTriangle = 1 << 2
|
||||
PrimitiveTypePolygon = 1 << 3
|
||||
)
|
||||
|
||||
//MorphMethod specifies the Supported methods of mesh morphing
|
||||
type MorphMethod int32
|
||||
|
||||
const (
|
||||
//Interpolation between morph targets
|
||||
MorphMethodVertexBlend = 0x1
|
||||
//Normalized morphing between morph targets
|
||||
MorphMethodMorphNormalized = 0x2
|
||||
//Relative morphing between morph targets
|
||||
MorphMethodMorphRelative = 0x3
|
||||
)
|
||||
|
||||
//PostProcess defines the flags for all possible post processing steps.
|
||||
type PostProcess int64
|
||||
|
||||
const (
|
||||
PostProcessCalcTangentSpace PostProcess = 0x1
|
||||
PostProcessJoinIdenticalVertices PostProcess = 0x2
|
||||
PostProcessMakeLeftHanded PostProcess = 0x4
|
||||
PostProcessTriangulate PostProcess = 0x8
|
||||
PostProcessRemoveComponent PostProcess = 0x10
|
||||
PostProcessGenNormals PostProcess = 0x20
|
||||
PostProcessGenSmoothNormals PostProcess = 0x40
|
||||
PostProcessSplitLargeMeshes PostProcess = 0x80
|
||||
PostProcessPreTransformVertices PostProcess = 0x100
|
||||
PostProcessLimitBoneWeights PostProcess = 0x200
|
||||
PostProcessValidateDataStructure PostProcess = 0x400
|
||||
PostProcessImproveCacheLocality PostProcess = 0x800
|
||||
PostProcessRemoveRedundantMaterials PostProcess = 0x1000
|
||||
PostProcessFixInfacingNormals PostProcess = 0x2000
|
||||
PostProcessSortByPType PostProcess = 0x8000
|
||||
PostProcessFindDegenerates PostProcess = 0x10000
|
||||
PostProcessFindInvalidData PostProcess = 0x20000
|
||||
PostProcessGenUVCoords PostProcess = 0x40000
|
||||
PostProcessTransformUVCoords PostProcess = 0x80000
|
||||
PostProcessFindInstances PostProcess = 0x100000
|
||||
PostProcessOptimizeMeshes PostProcess = 0x200000
|
||||
PostProcessOptimizeGraph PostProcess = 0x400000
|
||||
PostProcessFlipUVs PostProcess = 0x800000
|
||||
PostProcessFlipWindingOrder PostProcess = 0x1000000
|
||||
PostProcessSplitByBoneCount PostProcess = 0x2000000
|
||||
PostProcessDebone PostProcess = 0x4000000
|
||||
PostProcessGlobalScale PostProcess = 0x8000000
|
||||
PostProcessEmbedTextures PostProcess = 0x10000000
|
||||
PostProcessForceGenNormals PostProcess = 0x20000000
|
||||
PostProcessDropNormals PostProcess = 0x40000000
|
||||
PostProcessGenBoundingBoxes PostProcess = 0x80000000
|
||||
)
|
||||
|
||||
type TextureType int32
|
||||
|
||||
const (
|
||||
|
||||
/** Dummy value.
|
||||
*
|
||||
* No texture, but the value to be used as 'texture semantic'
|
||||
* (MaterialProperty.Semantic) for all material properties
|
||||
* *not* related to textures.
|
||||
*/
|
||||
TextureTypeNone TextureType = 0
|
||||
|
||||
/** The texture is combined with the result of the diffuse
|
||||
* lighting equation.
|
||||
*/
|
||||
TextureTypeDiffuse TextureType = 1
|
||||
|
||||
/** The texture is combined with the result of the specular
|
||||
* lighting equation.
|
||||
*/
|
||||
TextureTypeSpecular TextureType = 2
|
||||
|
||||
/** The texture is combined with the result of the ambient
|
||||
* lighting equation.
|
||||
*/
|
||||
TextureTypeAmbient TextureType = 3
|
||||
|
||||
/** The texture is added to the result of the lighting
|
||||
* calculation. It isn't influenced by incoming light.
|
||||
*/
|
||||
TextureTypeEmissive TextureType = 4
|
||||
|
||||
/** The texture is a height map.
|
||||
*
|
||||
* By convention, higher gray-scale values stand for
|
||||
* higher elevations from the base height.
|
||||
*/
|
||||
TextureTypeHeight TextureType = 5
|
||||
|
||||
/** The texture is a (tangent space) normal-map.
|
||||
*
|
||||
* Agn, there are several conventions for tangent-space
|
||||
* normal maps. Assimp does (intentionally) not
|
||||
* distinguish here.
|
||||
*/
|
||||
TextureTypeNormal TextureType = 6
|
||||
|
||||
/** The texture defines the glossiness of the material.
|
||||
*
|
||||
* The glossiness is in fact the exponent of the specular
|
||||
* (phong) lighting equation. Usually there is a conversion
|
||||
* function defined to map the linear color values in the
|
||||
* texture to a suitable exponent. Have fun.
|
||||
*/
|
||||
TextureTypeShininess TextureType = 7
|
||||
|
||||
/** The texture defines per-pixel opacity.
|
||||
*
|
||||
* Usually 'white' means opaque and 'black' means
|
||||
* 'transparency'. Or quite the opposite. Have fun.
|
||||
*/
|
||||
TextureTypeOpacity TextureType = 8
|
||||
|
||||
/** Displacement texture
|
||||
*
|
||||
* The exact purpose and format is application-dependent.
|
||||
* Higher color values stand for higher vertex displacements.
|
||||
*/
|
||||
TextureTypeDisplacement TextureType = 9
|
||||
|
||||
/** Lightmap texture (aka Ambient Occlusion)
|
||||
*
|
||||
* Both 'Lightmaps' and dedicated 'ambient occlusion maps' are
|
||||
* covered by this material property. The texture contains a
|
||||
* scaling value for the final color value of a pixel. Its
|
||||
* intensity is not affected by incoming light.
|
||||
*/
|
||||
TextureTypeLightmap TextureType = 10
|
||||
|
||||
/** Reflection texture
|
||||
*
|
||||
* Contains the color of a perfect mirror reflection.
|
||||
* Rarely used, almost never for real-time applications.
|
||||
*/
|
||||
TextureTypeReflection TextureType = 11
|
||||
|
||||
/** Unknown texture
|
||||
* A texture reference that does not match any of the definitions
|
||||
* above is considered to be 'unknown'. It is still imported,
|
||||
* but is excluded from any further post-processing.
|
||||
*/
|
||||
TextureTypeUnknown TextureType = 18
|
||||
)
|
||||
|
||||
/** PBR Materials
|
||||
* PBR definitions from maya and other modelling packages now use this standard.
|
||||
* This was originally introduced around 2012.
|
||||
* Support for this is in game engines like Godot, Unreal or Unity3D.
|
||||
* Modelling packages which use this are very common now.
|
||||
*/
|
||||
const (
|
||||
TextureTypeBaseColor TextureType = 12
|
||||
TextureTypeNormalCamera TextureType = 13
|
||||
TextureTypeEmissionColor TextureType = 14
|
||||
TextureTypeMetalness TextureType = 15
|
||||
TextureTypeDiffuseRoughness TextureType = 16
|
||||
TextureTypeAmbientOcclusion TextureType = 17
|
||||
)
|
||||
|
||||
func (tp TextureType) String() string {
|
||||
|
||||
switch tp {
|
||||
case TextureTypeNone:
|
||||
return "None"
|
||||
case TextureTypeDiffuse:
|
||||
return "Diffuse"
|
||||
case TextureTypeSpecular:
|
||||
return "Specular"
|
||||
case TextureTypeAmbient:
|
||||
return "Ambient"
|
||||
case TextureTypeAmbientOcclusion:
|
||||
return "AmbientOcclusion"
|
||||
case TextureTypeBaseColor:
|
||||
return "BaseColor"
|
||||
case TextureTypeDiffuseRoughness:
|
||||
return "DiffuseRoughness"
|
||||
case TextureTypeDisplacement:
|
||||
return "Displacement"
|
||||
case TextureTypeEmissionColor:
|
||||
return "EmissionColor"
|
||||
case TextureTypeEmissive:
|
||||
return "Emissive"
|
||||
case TextureTypeHeight:
|
||||
return "Height"
|
||||
case TextureTypeLightmap:
|
||||
return "Lightmap"
|
||||
case TextureTypeMetalness:
|
||||
return "Metalness"
|
||||
case TextureTypeNormal:
|
||||
return "Normal"
|
||||
case TextureTypeNormalCamera:
|
||||
return "NormalCamera"
|
||||
case TextureTypeOpacity:
|
||||
return "Opacity"
|
||||
case TextureTypeReflection:
|
||||
return "Reflection"
|
||||
case TextureTypeShininess:
|
||||
return "Shininess"
|
||||
case TextureTypeUnknown:
|
||||
return "Unknown"
|
||||
default:
|
||||
return "Invalid"
|
||||
}
|
||||
}
|
||||
|
||||
type MatPropertyTypeInfo int32
|
||||
|
||||
const (
|
||||
MatPropTypeInfoFloat32 MatPropertyTypeInfo = iota + 1
|
||||
MatPropTypeInfoFloat64
|
||||
MatPropTypeInfoString
|
||||
MatPropTypeInfoInt32
|
||||
|
||||
//Simple binary buffer, content undefined. Not convertible to anything.
|
||||
MatPropTypeInfoBuffer
|
||||
)
|
||||
|
||||
func (mpti MatPropertyTypeInfo) String() string {
|
||||
|
||||
switch mpti {
|
||||
case MatPropTypeInfoFloat32:
|
||||
return "Float32"
|
||||
case MatPropTypeInfoFloat64:
|
||||
return "Float64"
|
||||
case MatPropTypeInfoString:
|
||||
return "String"
|
||||
case MatPropTypeInfoInt32:
|
||||
return "Int32"
|
||||
case MatPropTypeInfoBuffer:
|
||||
return "Buffer"
|
||||
default:
|
||||
return "Unknown"
|
||||
}
|
||||
}
|
||||
|
||||
type MetadataType int32
|
||||
|
||||
const (
|
||||
MetadataTypeBool MetadataType = 0
|
||||
MetadataTypeInt32 MetadataType = 1
|
||||
MetadataTypeUint64 MetadataType = 2
|
||||
MetadataTypeFloat32 MetadataType = 3
|
||||
MetadataTypeFloat64 MetadataType = 4
|
||||
MetadataTypeString MetadataType = 5
|
||||
MetadataTypeVec3 MetadataType = 6
|
||||
MetadataTypeMAX MetadataType = 7
|
||||
)
|
||||
@ -1,547 +0,0 @@
|
||||
// Copyright (C) 2002-2005 Nikolaus Gebhardt
|
||||
// This file is part of the "Irrlicht Engine" and the "irrXML" project.
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h and/or irrXML.h
|
||||
|
||||
#ifndef __IRR_XML_H_INCLUDED__
|
||||
#define __IRR_XML_H_INCLUDED__
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#define IRRXML_API
|
||||
// #ifdef _WIN32
|
||||
// # define IRRXML_API __declspec(dllexport)
|
||||
// #else
|
||||
// # define IRRXML_API __attribute__ ((visibility("default")))
|
||||
// #endif // _WIN32
|
||||
|
||||
/** \mainpage irrXML 1.2 API documentation
|
||||
<div align="center"><img src="logobig.png" ></div>
|
||||
|
||||
\section intro Introduction
|
||||
|
||||
Welcome to the irrXML API documentation.
|
||||
Here you'll find any information you'll need to develop applications with
|
||||
irrXML. If you look for a tutorial on how to start, take a look at the \ref irrxmlexample,
|
||||
at the homepage of irrXML at <A HREF="http://xml.irrlicht3d.org" >xml.irrlicht3d.org</A>
|
||||
or into the SDK in the directory \example.
|
||||
|
||||
irrXML is intended to be a high speed and easy-to-use XML Parser for C++, and
|
||||
this documentation is an important part of it. If you have any questions or
|
||||
suggestions, just send a email to the author of the engine, Nikolaus Gebhardt
|
||||
(niko (at) irrlicht3d.org). For more informations about this parser, see \ref history.
|
||||
|
||||
\section features Features
|
||||
|
||||
irrXML provides forward-only, read-only
|
||||
access to a stream of non validated XML data. It was fully implemented by
|
||||
Nikolaus Gebhardt. Its current features are:
|
||||
|
||||
- It it fast as lighting and has very low memory usage. It was
|
||||
developed with the intention of being used in 3D games, as it already has been.
|
||||
- irrXML is very small: It only consists of 60 KB of code and can be added easily
|
||||
to your existing project.
|
||||
- Of course, it is platform independent and works with lots of compilers.
|
||||
- It is able to parse ASCII, UTF-8, UTF-16 and UTF-32 text files, both in
|
||||
little and big endian format.
|
||||
- Independent of the input file format, the parser can return all strings in ASCII, UTF-8,
|
||||
UTF-16 and UTF-32 format.
|
||||
- With its optional file access abstraction it has the advantage that it can read not
|
||||
only from files but from any type of data (memory, network, ...). For example when
|
||||
used with the Irrlicht Engine, it directly reads from compressed .zip files.
|
||||
- Just like the Irrlicht Engine for which it was originally created, it is extremely easy
|
||||
to use.
|
||||
- It has no external dependencies, it does not even need the STL.
|
||||
|
||||
Although irrXML has some strenghts, it currently also has the following limitations:
|
||||
|
||||
- The input xml file is not validated and assumed to be correct.
|
||||
|
||||
\section irrxmlexample Example
|
||||
|
||||
The following code demonstrates the basic usage of irrXML. A simple xml
|
||||
file like this is parsed:
|
||||
\code
|
||||
<?xml version="1.0"?>
|
||||
<config>
|
||||
<!-- This is a config file for the mesh viewer -->
|
||||
<model file="dwarf.dea" />
|
||||
<messageText caption="Irrlicht Engine Mesh Viewer">
|
||||
Welcome to the Mesh Viewer of the "Irrlicht Engine".
|
||||
</messageText>
|
||||
</config>
|
||||
\endcode
|
||||
|
||||
The code for parsing this file would look like this:
|
||||
\code
|
||||
#include <irrXML.h>
|
||||
using namespace irr; // irrXML is located in the namespace irr::io
|
||||
using namespace io;
|
||||
|
||||
#include <string> // we use STL strings to store data in this example
|
||||
|
||||
void main()
|
||||
{
|
||||
// create the reader using one of the factory functions
|
||||
|
||||
IrrXMLReader* xml = createIrrXMLReader("config.xml");
|
||||
|
||||
// strings for storing the data we want to get out of the file
|
||||
std::string modelFile;
|
||||
std::string messageText;
|
||||
std::string caption;
|
||||
|
||||
// parse the file until end reached
|
||||
|
||||
while(xml && xml->read())
|
||||
{
|
||||
switch(xml->getNodeType())
|
||||
{
|
||||
case EXN_TEXT:
|
||||
// in this xml file, the only text which occurs is the messageText
|
||||
messageText = xml->getNodeData();
|
||||
break;
|
||||
case EXN_ELEMENT:
|
||||
{
|
||||
if (!strcmp("model", xml->getNodeName()))
|
||||
modelFile = xml->getAttributeValue("file");
|
||||
else
|
||||
if (!strcmp("messageText", xml->getNodeName()))
|
||||
caption = xml->getAttributeValue("caption");
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// delete the xml parser after usage
|
||||
delete xml;
|
||||
}
|
||||
\endcode
|
||||
|
||||
\section howto How to use
|
||||
|
||||
Simply add the source files in the /src directory of irrXML to your project. Done.
|
||||
|
||||
\section license License
|
||||
|
||||
The irrXML license is based on the zlib license. Basicly, this means you can do with
|
||||
irrXML whatever you want:
|
||||
|
||||
Copyright (C) 2002-2005 Nikolaus Gebhardt
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
|
||||
\section history History
|
||||
|
||||
As lots of references in this documentation and the source show, this xml
|
||||
parser has originally been a part of the
|
||||
<A HREF="http://irrlicht.sourceforge.net" >Irrlicht Engine</A>. But because
|
||||
the parser has become very useful with the latest release, people asked for a
|
||||
separate version of it, to be able to use it in non Irrlicht projects. With
|
||||
irrXML 1.0, this has now been done.
|
||||
*/
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace io
|
||||
{
|
||||
//! Enumeration of all supported source text file formats
|
||||
enum ETEXT_FORMAT
|
||||
{
|
||||
//! ASCII, file without byte order mark, or not a text file
|
||||
ETF_ASCII,
|
||||
|
||||
//! UTF-8 format
|
||||
ETF_UTF8,
|
||||
|
||||
//! UTF-16 format, big endian
|
||||
ETF_UTF16_BE,
|
||||
|
||||
//! UTF-16 format, little endian
|
||||
ETF_UTF16_LE,
|
||||
|
||||
//! UTF-32 format, big endian
|
||||
ETF_UTF32_BE,
|
||||
|
||||
//! UTF-32 format, little endian
|
||||
ETF_UTF32_LE
|
||||
};
|
||||
|
||||
|
||||
//! Enumeration for all xml nodes which are parsed by IrrXMLReader
|
||||
enum EXML_NODE
|
||||
{
|
||||
//! No xml node. This is usually the node if you did not read anything yet.
|
||||
EXN_NONE,
|
||||
|
||||
//! A xml element, like <foo>
|
||||
EXN_ELEMENT,
|
||||
|
||||
//! End of an xml element, like </foo>
|
||||
EXN_ELEMENT_END,
|
||||
|
||||
//! Text within a xml element: <foo> this is the text. </foo>
|
||||
EXN_TEXT,
|
||||
|
||||
//! An xml comment like <!-- I am a comment --> or a DTD definition.
|
||||
EXN_COMMENT,
|
||||
|
||||
//! An xml cdata section like <![CDATA[ this is some CDATA ]]>
|
||||
EXN_CDATA,
|
||||
|
||||
//! Unknown element.
|
||||
EXN_UNKNOWN
|
||||
};
|
||||
|
||||
//! Callback class for file read abstraction.
|
||||
/** With this, it is possible to make the xml parser read in other things
|
||||
than just files. The Irrlicht engine is using this for example to
|
||||
read xml from compressed .zip files. To make the parser read in
|
||||
any other data, derive a class from this interface, implement the
|
||||
two methods to read your data and give a pointer to an instance of
|
||||
your implementation when calling createIrrXMLReader(),
|
||||
createIrrXMLReaderUTF16() or createIrrXMLReaderUTF32() */
|
||||
class IRRXML_API IFileReadCallBack
|
||||
{
|
||||
public:
|
||||
|
||||
//! virtual destructor
|
||||
virtual ~IFileReadCallBack() {};
|
||||
|
||||
//! Reads an amount of bytes from the file.
|
||||
/** \param buffer: Pointer to buffer where to read bytes will be written to.
|
||||
\param sizeToRead: Amount of bytes to read from the file.
|
||||
\return Returns how much bytes were read. */
|
||||
virtual int read(void* buffer, int sizeToRead) = 0;
|
||||
|
||||
//! Returns size of file in bytes
|
||||
virtual int getSize() = 0;
|
||||
};
|
||||
|
||||
//! Empty class to be used as parent class for IrrXMLReader.
|
||||
/** If you need another class as base class for the xml reader, you can do this by creating
|
||||
the reader using for example new CXMLReaderImpl<char, YourBaseClass>(yourcallback);
|
||||
The Irrlicht Engine for example needs IUnknown as base class for every object to
|
||||
let it automaticly reference countend, hence it replaces IXMLBase with IUnknown.
|
||||
See irrXML.cpp on how this can be done in detail. */
|
||||
class IXMLBase
|
||||
{
|
||||
};
|
||||
|
||||
//! Interface providing easy read access to a XML file.
|
||||
/** You can create an instance of this reader using one of the factory functions
|
||||
createIrrXMLReader(), createIrrXMLReaderUTF16() and createIrrXMLReaderUTF32().
|
||||
If using the parser from the Irrlicht Engine, please use IFileSystem::createXMLReader()
|
||||
instead.
|
||||
For a detailed intro how to use the parser, see \ref irrxmlexample and \ref features.
|
||||
|
||||
The typical usage of this parser looks like this:
|
||||
\code
|
||||
#include <irrXML.h>
|
||||
using namespace irr; // irrXML is located in the namespace irr::io
|
||||
using namespace io;
|
||||
|
||||
void main()
|
||||
{
|
||||
// create the reader using one of the factory functions
|
||||
IrrXMLReader* xml = createIrrXMLReader("config.xml");
|
||||
|
||||
if (xml == 0)
|
||||
return; // file could not be opened
|
||||
|
||||
// parse the file until end reached
|
||||
while(xml->read())
|
||||
{
|
||||
// based on xml->getNodeType(), do something.
|
||||
}
|
||||
|
||||
// delete the xml parser after usage
|
||||
delete xml;
|
||||
}
|
||||
\endcode
|
||||
See \ref irrxmlexample for a more detailed example.
|
||||
*/
|
||||
template<class char_type, class super_class>
|
||||
class IIrrXMLReader : public super_class
|
||||
{
|
||||
public:
|
||||
|
||||
//! Destructor
|
||||
virtual ~IIrrXMLReader() {};
|
||||
|
||||
//! Reads forward to the next xml node.
|
||||
/** \return Returns false, if there was no further node. */
|
||||
virtual bool read() = 0;
|
||||
|
||||
//! Returns the type of the current XML node.
|
||||
virtual EXML_NODE getNodeType() const = 0;
|
||||
|
||||
//! Returns attribute count of the current XML node.
|
||||
/** This is usually
|
||||
non null if the current node is EXN_ELEMENT, and the element has attributes.
|
||||
\return Returns amount of attributes of this xml node. */
|
||||
virtual int getAttributeCount() const = 0;
|
||||
|
||||
//! Returns name of an attribute.
|
||||
/** \param idx: Zero based index, should be something between 0 and getAttributeCount()-1.
|
||||
\return Name of the attribute, 0 if an attribute with this index does not exist. */
|
||||
virtual const char_type* getAttributeName(int idx) const = 0;
|
||||
|
||||
//! Returns the value of an attribute.
|
||||
/** \param idx: Zero based index, should be something between 0 and getAttributeCount()-1.
|
||||
\return Value of the attribute, 0 if an attribute with this index does not exist. */
|
||||
virtual const char_type* getAttributeValue(int idx) const = 0;
|
||||
|
||||
//! Returns the value of an attribute.
|
||||
/** \param name: Name of the attribute.
|
||||
\return Value of the attribute, 0 if an attribute with this name does not exist. */
|
||||
virtual const char_type* getAttributeValue(const char_type* name) const = 0;
|
||||
|
||||
//! Returns the value of an attribute in a safe way.
|
||||
/** Like getAttributeValue(), but does not
|
||||
return 0 if the attribute does not exist. An empty string ("") is returned then.
|
||||
\param name: Name of the attribute.
|
||||
\return Value of the attribute, and "" if an attribute with this name does not exist */
|
||||
virtual const char_type* getAttributeValueSafe(const char_type* name) const = 0;
|
||||
|
||||
//! Returns the value of an attribute as integer.
|
||||
/** \param name Name of the attribute.
|
||||
\return Value of the attribute as integer, and 0 if an attribute with this name does not exist or
|
||||
the value could not be interpreted as integer. */
|
||||
virtual int getAttributeValueAsInt(const char_type* name) const = 0;
|
||||
|
||||
//! Returns the value of an attribute as integer.
|
||||
/** \param idx: Zero based index, should be something between 0 and getAttributeCount()-1.
|
||||
\return Value of the attribute as integer, and 0 if an attribute with this index does not exist or
|
||||
the value could not be interpreted as integer. */
|
||||
virtual int getAttributeValueAsInt(int idx) const = 0;
|
||||
|
||||
//! Returns the value of an attribute as float.
|
||||
/** \param name: Name of the attribute.
|
||||
\return Value of the attribute as float, and 0 if an attribute with this name does not exist or
|
||||
the value could not be interpreted as float. */
|
||||
virtual float getAttributeValueAsFloat(const char_type* name) const = 0;
|
||||
|
||||
//! Returns the value of an attribute as float.
|
||||
/** \param idx: Zero based index, should be something between 0 and getAttributeCount()-1.
|
||||
\return Value of the attribute as float, and 0 if an attribute with this index does not exist or
|
||||
the value could not be interpreted as float. */
|
||||
virtual float getAttributeValueAsFloat(int idx) const = 0;
|
||||
|
||||
//! Returns the name of the current node.
|
||||
/** Only non null, if the node type is EXN_ELEMENT.
|
||||
\return Name of the current node or 0 if the node has no name. */
|
||||
virtual const char_type* getNodeName() const = 0;
|
||||
|
||||
//! Returns data of the current node.
|
||||
/** Only non null if the node has some
|
||||
data and it is of type EXN_TEXT or EXN_UNKNOWN. */
|
||||
virtual const char_type* getNodeData() const = 0;
|
||||
|
||||
//! Returns if an element is an empty element, like <foo />
|
||||
virtual bool isEmptyElement() const = 0;
|
||||
|
||||
//! Returns format of the source xml file.
|
||||
/** It is not necessary to use
|
||||
this method because the parser will convert the input file format
|
||||
to the format wanted by the user when creating the parser. This
|
||||
method is useful to get/display additional informations. */
|
||||
virtual ETEXT_FORMAT getSourceFormat() const = 0;
|
||||
|
||||
//! Returns format of the strings returned by the parser.
|
||||
/** This will be UTF8 for example when you created a parser with
|
||||
IrrXMLReaderUTF8() and UTF32 when it has been created using
|
||||
IrrXMLReaderUTF32. It should not be necessary to call this
|
||||
method and only exists for informational purposes. */
|
||||
virtual ETEXT_FORMAT getParserFormat() const = 0;
|
||||
};
|
||||
|
||||
|
||||
//! defines the utf-16 type.
|
||||
/** Not using wchar_t for this because
|
||||
wchar_t has 16 bit on windows and 32 bit on other operating systems. */
|
||||
typedef unsigned short char16;
|
||||
|
||||
//! defines the utf-32 type.
|
||||
/** Not using wchar_t for this because
|
||||
wchar_t has 16 bit on windows and 32 bit on other operating systems. */
|
||||
typedef unsigned long char32;
|
||||
|
||||
//! A UTF-8 or ASCII character xml parser.
|
||||
/** This means that all character data will be returned in 8 bit ASCII or UTF-8 by this parser.
|
||||
The file to read can be in any format, it will be converted to UTF-8 if it is not
|
||||
in this format.
|
||||
Create an instance of this with createIrrXMLReader();
|
||||
See IIrrXMLReader for description on how to use it. */
|
||||
typedef IIrrXMLReader<char, IXMLBase> IrrXMLReader;
|
||||
|
||||
//! A UTF-16 xml parser.
|
||||
/** This means that all character data will be returned in UTF-16 by this parser.
|
||||
The file to read can be in any format, it will be converted to UTF-16 if it is not
|
||||
in this format.
|
||||
Create an instance of this with createIrrXMLReaderUTF16();
|
||||
See IIrrXMLReader for description on how to use it. */
|
||||
typedef IIrrXMLReader<char16, IXMLBase> IrrXMLReaderUTF16;
|
||||
|
||||
//! A UTF-32 xml parser.
|
||||
/** This means that all character data will be returned in UTF-32 by this parser.
|
||||
The file to read can be in any format, it will be converted to UTF-32 if it is not
|
||||
in this format.
|
||||
Create an instance of this with createIrrXMLReaderUTF32();
|
||||
See IIrrXMLReader for description on how to use it. */
|
||||
typedef IIrrXMLReader<char32, IXMLBase> IrrXMLReaderUTF32;
|
||||
|
||||
|
||||
//! Creates an instance of an UFT-8 or ASCII character xml parser.
|
||||
/** This means that all character data will be returned in 8 bit ASCII or UTF-8.
|
||||
The file to read can be in any format, it will be converted to UTF-8 if it is not in this format.
|
||||
If you are using the Irrlicht Engine, it is better not to use this function but
|
||||
IFileSystem::createXMLReaderUTF8() instead.
|
||||
\param filename: Name of file to be opened.
|
||||
\return Returns a pointer to the created xml parser. This pointer should be
|
||||
deleted using 'delete' after no longer needed. Returns 0 if an error occured
|
||||
and the file could not be opened. */
|
||||
IRRXML_API IrrXMLReader* createIrrXMLReader(const char* filename);
|
||||
|
||||
//! Creates an instance of an UFT-8 or ASCII character xml parser.
|
||||
/** This means that all character data will be returned in 8 bit ASCII or UTF-8. The file to read can
|
||||
be in any format, it will be converted to UTF-8 if it is not in this format.
|
||||
If you are using the Irrlicht Engine, it is better not to use this function but
|
||||
IFileSystem::createXMLReaderUTF8() instead.
|
||||
\param file: Pointer to opened file, must have been opened in binary mode, e.g.
|
||||
using fopen("foo.bar", "wb"); The file will not be closed after it has been read.
|
||||
\return Returns a pointer to the created xml parser. This pointer should be
|
||||
deleted using 'delete' after no longer needed. Returns 0 if an error occured
|
||||
and the file could not be opened. */
|
||||
IRRXML_API IrrXMLReader* createIrrXMLReader(FILE* file);
|
||||
|
||||
//! Creates an instance of an UFT-8 or ASCII character xml parser.
|
||||
/** This means that all character data will be returned in 8 bit ASCII or UTF-8. The file to read can
|
||||
be in any format, it will be converted to UTF-8 if it is not in this format.
|
||||
If you are using the Irrlicht Engine, it is better not to use this function but
|
||||
IFileSystem::createXMLReaderUTF8() instead.
|
||||
\param callback: Callback for file read abstraction. Implement your own
|
||||
callback to make the xml parser read in other things than just files. See
|
||||
IFileReadCallBack for more information about this.
|
||||
\return Returns a pointer to the created xml parser. This pointer should be
|
||||
deleted using 'delete' after no longer needed. Returns 0 if an error occured
|
||||
and the file could not be opened. */
|
||||
IRRXML_API IrrXMLReader* createIrrXMLReader(IFileReadCallBack* callback);
|
||||
|
||||
//! Creates an instance of an UFT-16 xml parser.
|
||||
/** This means that
|
||||
all character data will be returned in UTF-16. The file to read can
|
||||
be in any format, it will be converted to UTF-16 if it is not in this format.
|
||||
If you are using the Irrlicht Engine, it is better not to use this function but
|
||||
IFileSystem::createXMLReader() instead.
|
||||
\param filename: Name of file to be opened.
|
||||
\return Returns a pointer to the created xml parser. This pointer should be
|
||||
deleted using 'delete' after no longer needed. Returns 0 if an error occured
|
||||
and the file could not be opened. */
|
||||
IRRXML_API IrrXMLReaderUTF16* createIrrXMLReaderUTF16(const char* filename);
|
||||
|
||||
//! Creates an instance of an UFT-16 xml parser.
|
||||
/** This means that all character data will be returned in UTF-16. The file to read can
|
||||
be in any format, it will be converted to UTF-16 if it is not in this format.
|
||||
If you are using the Irrlicht Engine, it is better not to use this function but
|
||||
IFileSystem::createXMLReader() instead.
|
||||
\param file: Pointer to opened file, must have been opened in binary mode, e.g.
|
||||
using fopen("foo.bar", "wb"); The file will not be closed after it has been read.
|
||||
\return Returns a pointer to the created xml parser. This pointer should be
|
||||
deleted using 'delete' after no longer needed. Returns 0 if an error occured
|
||||
and the file could not be opened. */
|
||||
IRRXML_API IrrXMLReaderUTF16* createIrrXMLReaderUTF16(FILE* file);
|
||||
|
||||
//! Creates an instance of an UFT-16 xml parser.
|
||||
/** This means that all character data will be returned in UTF-16. The file to read can
|
||||
be in any format, it will be converted to UTF-16 if it is not in this format.
|
||||
If you are using the Irrlicht Engine, it is better not to use this function but
|
||||
IFileSystem::createXMLReader() instead.
|
||||
\param callback: Callback for file read abstraction. Implement your own
|
||||
callback to make the xml parser read in other things than just files. See
|
||||
IFileReadCallBack for more information about this.
|
||||
\return Returns a pointer to the created xml parser. This pointer should be
|
||||
deleted using 'delete' after no longer needed. Returns 0 if an error occured
|
||||
and the file could not be opened. */
|
||||
IRRXML_API IrrXMLReaderUTF16* createIrrXMLReaderUTF16(IFileReadCallBack* callback);
|
||||
|
||||
|
||||
//! Creates an instance of an UFT-32 xml parser.
|
||||
/** This means that all character data will be returned in UTF-32. The file to read can
|
||||
be in any format, it will be converted to UTF-32 if it is not in this format.
|
||||
If you are using the Irrlicht Engine, it is better not to use this function but
|
||||
IFileSystem::createXMLReader() instead.
|
||||
\param filename: Name of file to be opened.
|
||||
\return Returns a pointer to the created xml parser. This pointer should be
|
||||
deleted using 'delete' after no longer needed. Returns 0 if an error occured
|
||||
and the file could not be opened. */
|
||||
IRRXML_API IrrXMLReaderUTF32* createIrrXMLReaderUTF32(const char* filename);
|
||||
|
||||
//! Creates an instance of an UFT-32 xml parser.
|
||||
/** This means that all character data will be returned in UTF-32. The file to read can
|
||||
be in any format, it will be converted to UTF-32 if it is not in this format.
|
||||
if you are using the Irrlicht Engine, it is better not to use this function but
|
||||
IFileSystem::createXMLReader() instead.
|
||||
\param file: Pointer to opened file, must have been opened in binary mode, e.g.
|
||||
using fopen("foo.bar", "wb"); The file will not be closed after it has been read.
|
||||
\return Returns a pointer to the created xml parser. This pointer should be
|
||||
deleted using 'delete' after no longer needed. Returns 0 if an error occured
|
||||
and the file could not be opened. */
|
||||
IRRXML_API IrrXMLReaderUTF32* createIrrXMLReaderUTF32(FILE* file);
|
||||
|
||||
//! Creates an instance of an UFT-32 xml parser.
|
||||
/** This means that
|
||||
all character data will be returned in UTF-32. The file to read can
|
||||
be in any format, it will be converted to UTF-32 if it is not in this format.
|
||||
If you are using the Irrlicht Engine, it is better not to use this function but
|
||||
IFileSystem::createXMLReader() instead.
|
||||
\param callback: Callback for file read abstraction. Implement your own
|
||||
callback to make the xml parser read in other things than just files. See
|
||||
IFileReadCallBack for more information about this.
|
||||
\return Returns a pointer to the created xml parser. This pointer should be
|
||||
deleted using 'delete' after no longer needed. Returns 0 if an error occured
|
||||
and the file could not be opened. */
|
||||
IRRXML_API IrrXMLReaderUTF32* createIrrXMLReaderUTF32(IFileReadCallBack* callback);
|
||||
|
||||
|
||||
/*! \file irrxml.h
|
||||
\brief Header file of the irrXML, the Irrlicht XML parser.
|
||||
|
||||
This file includes everything needed for using irrXML,
|
||||
the XML parser of the Irrlicht Engine. To use irrXML,
|
||||
you only need to include this file in your project:
|
||||
|
||||
\code
|
||||
#include <irrXML.h>
|
||||
\endcode
|
||||
|
||||
It is also common to use the two namespaces in which irrXML is included,
|
||||
directly after #including irrXML.h:
|
||||
|
||||
\code
|
||||
#include <irrXML.h>
|
||||
using namespace irr;
|
||||
using namespace io;
|
||||
\endcode
|
||||
*/
|
||||
|
||||
} // end namespace io
|
||||
} // end namespace irr
|
||||
|
||||
#endif // __IRR_XML_H_INCLUDED__
|
||||
|
||||
BIN
asig/libs/libassimp_darwin_amd64.dylib
Executable file
BIN
asig/libs/libassimp_darwin_amd64.dylib
Executable file
Binary file not shown.
BIN
asig/libs/libassimp_darwin_arm64.dylib
Executable file
BIN
asig/libs/libassimp_darwin_arm64.dylib
Executable file
Binary file not shown.
BIN
asig/libs/libassimp_windows_amd64.a
Executable file
BIN
asig/libs/libassimp_windows_amd64.a
Executable file
Binary file not shown.
83
asig/material.go
Executable file
83
asig/material.go
Executable file
@ -0,0 +1,83 @@
|
||||
package asig
|
||||
|
||||
/*
|
||||
#cgo CFLAGS: -I .
|
||||
#cgo LDFLAGS: -L libs
|
||||
#cgo windows,amd64 LDFLAGS: -l assimp_windows_amd64
|
||||
#cgo darwin,arm64 LDFLAGS: -l assimp_darwin_arm64
|
||||
|
||||
#include "wrap.c"
|
||||
#include <stdlib.h>
|
||||
*/
|
||||
import "C"
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type Material struct {
|
||||
cMat *C.struct_aiMaterial
|
||||
|
||||
/** List of all material properties loaded. */
|
||||
Properties []*MaterialProperty
|
||||
|
||||
/** Storage allocated */
|
||||
AllocatedStorage uint
|
||||
}
|
||||
|
||||
type MaterialProperty struct {
|
||||
|
||||
//Specifies the name of the property (aka key). Keys are generally case insensitive.
|
||||
name string
|
||||
|
||||
/** Textures: Specifies their exact usage semantic.
|
||||
* For non-texture properties, this member is always 0 (aka TextureTypeNone).
|
||||
*/
|
||||
Semantic TextureType
|
||||
|
||||
/** Textures: Specifies the index of the texture.
|
||||
* For non-texture properties, this member is always 0.
|
||||
*/
|
||||
Index uint
|
||||
|
||||
/** Type information for the property.
|
||||
*
|
||||
* Defines the data layout inside the data buffer. This is used
|
||||
* by the library internally to perform debug checks and to
|
||||
* utilize proper type conversions.
|
||||
* (It's probably a hacky solution, but it works.)
|
||||
*/
|
||||
TypeInfo MatPropertyTypeInfo
|
||||
|
||||
//Binary buffer to hold the property's value.
|
||||
Data []byte
|
||||
}
|
||||
|
||||
func GetMaterialTextureCount(m *Material, texType TextureType) int {
|
||||
return int(C.aiGetMaterialTextureCount(m.cMat, uint32(texType)))
|
||||
}
|
||||
|
||||
type GetMatTexInfo struct {
|
||||
Path string
|
||||
}
|
||||
|
||||
func GetMaterialTexture(m *Material, texType TextureType, texIndex uint) (*GetMatTexInfo, error) {
|
||||
|
||||
outCPath := &C.struct_aiString{}
|
||||
status := aiReturn(C.aiGetMaterialTexture(m.cMat, uint32(texType), C.uint(texIndex), outCPath, nil, nil, nil, nil, nil, nil))
|
||||
if status == aiReturnSuccess {
|
||||
return &GetMatTexInfo{
|
||||
Path: parseAiString(*outCPath),
|
||||
}, nil
|
||||
}
|
||||
|
||||
if status == aiReturnFailure {
|
||||
return nil, errors.New("get texture failed: " + getAiErr().Error())
|
||||
}
|
||||
|
||||
if status == aiReturnOutofMemory {
|
||||
return nil, errors.New("get texture failed: out of memory")
|
||||
}
|
||||
|
||||
return nil, errors.New("get texture failed: unknown error with code " + fmt.Sprintf("%v", status))
|
||||
}
|
||||
87
asig/mesh.go
Executable file
87
asig/mesh.go
Executable file
@ -0,0 +1,87 @@
|
||||
package asig
|
||||
|
||||
import "github.com/bloeys/gglm/gglm"
|
||||
|
||||
const (
|
||||
MaxColorSets = 8
|
||||
MaxTexCoords = 8
|
||||
)
|
||||
|
||||
type Mesh struct {
|
||||
|
||||
//Bitwise combination of PrimitiveType enum
|
||||
PrimitiveTypes PrimitiveType
|
||||
Vertices []gglm.Vec3
|
||||
Normals []gglm.Vec3
|
||||
Tangents []gglm.Vec3
|
||||
BitTangents []gglm.Vec3
|
||||
|
||||
//ColorSets vertex color sets where each set is either empty or has length=len(Vertices), with max number of sets=MaxColorSets
|
||||
ColorSets [MaxColorSets][]gglm.Vec4
|
||||
|
||||
//TexCoords (aka UV channels) where each TexCoords[i] has NumUVComponents[i] channels, and is either empty or has length=len(Vertices), with max number of TexCoords per vertex = MaxTexCoords
|
||||
TexCoords [MaxTexCoords][]gglm.Vec3
|
||||
TexCoordChannelCount [MaxTexCoords]uint
|
||||
|
||||
Faces []Face
|
||||
Bones []*Bone
|
||||
AnimMeshes []*AnimMesh
|
||||
AABB AABB
|
||||
MorphMethod MorphMethod
|
||||
|
||||
MaterialIndex uint
|
||||
Name string
|
||||
}
|
||||
|
||||
type Face struct {
|
||||
Indices []uint
|
||||
}
|
||||
|
||||
type AnimMesh struct {
|
||||
Name string
|
||||
|
||||
/** Replacement for Mes.Vertices. If this array is non-NULL,
|
||||
* it *must* contain mNumVertices entries. The corresponding
|
||||
* array in the host mesh must be non-NULL as well - animation
|
||||
* meshes may neither add or nor remove vertex components (if
|
||||
* a replacement array is NULL and the corresponding source
|
||||
* array is not, the source data is taken instead)*/
|
||||
Vertices []gglm.Vec3
|
||||
Normals []gglm.Vec3
|
||||
Tangents []gglm.Vec3
|
||||
BitTangents []gglm.Vec3
|
||||
Colors [MaxColorSets][]gglm.Vec4
|
||||
TexCoords [MaxTexCoords][]gglm.Vec3
|
||||
|
||||
Weight float32
|
||||
}
|
||||
|
||||
type AABB struct {
|
||||
Min gglm.Vec3
|
||||
Max gglm.Vec3
|
||||
}
|
||||
|
||||
type Bone struct {
|
||||
Name string
|
||||
//The influence weights of this bone
|
||||
Weights []VertexWeight
|
||||
|
||||
/** Matrix that transforms from bone space to mesh space in bind pose.
|
||||
*
|
||||
* This matrix describes the position of the mesh
|
||||
* in the local space of this bone when the skeleton was bound.
|
||||
* Thus it can be used directly to determine a desired vertex position,
|
||||
* given the world-space transform of the bone when animated,
|
||||
* and the position of the vertex in mesh space.
|
||||
*
|
||||
* It is sometimes called an inverse-bind matrix,
|
||||
* or inverse bind pose matrix.
|
||||
*/
|
||||
OffsetMatrix gglm.Mat4
|
||||
}
|
||||
|
||||
type VertexWeight struct {
|
||||
VertIndex uint
|
||||
//The strength of the influence in the range (0...1). The total influence from all bones at one vertex is 1
|
||||
Weight float32
|
||||
}
|
||||
3
asig/wrap.c
Executable file
3
asig/wrap.c
Executable file
@ -0,0 +1,3 @@
|
||||
#include <assimp/cimport.h> // Plain-C interface
|
||||
#include <assimp/scene.h> // Output data structure
|
||||
#include <assimp/postprocess.h>
|
||||
@ -1,536 +0,0 @@
|
||||
/* zconf.h -- configuration of the zlib compression library
|
||||
* Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
/* @(#) $Id$ */
|
||||
|
||||
#ifndef ZCONF_H
|
||||
#define ZCONF_H
|
||||
/* #undef Z_PREFIX */
|
||||
#define Z_HAVE_UNISTD_H
|
||||
|
||||
/*
|
||||
* If you *really* need a unique prefix for all types and library functions,
|
||||
* compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
|
||||
* Even better than compiling with -DZ_PREFIX would be to use configure to set
|
||||
* this permanently in zconf.h using "./configure --zprefix".
|
||||
*/
|
||||
#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */
|
||||
# define Z_PREFIX_SET
|
||||
|
||||
/* all linked symbols and init macros */
|
||||
# define _dist_code z__dist_code
|
||||
# define _length_code z__length_code
|
||||
# define _tr_align z__tr_align
|
||||
# define _tr_flush_bits z__tr_flush_bits
|
||||
# define _tr_flush_block z__tr_flush_block
|
||||
# define _tr_init z__tr_init
|
||||
# define _tr_stored_block z__tr_stored_block
|
||||
# define _tr_tally z__tr_tally
|
||||
# define adler32 z_adler32
|
||||
# define adler32_combine z_adler32_combine
|
||||
# define adler32_combine64 z_adler32_combine64
|
||||
# define adler32_z z_adler32_z
|
||||
# ifndef Z_SOLO
|
||||
# define compress z_compress
|
||||
# define compress2 z_compress2
|
||||
# define compressBound z_compressBound
|
||||
# endif
|
||||
# define crc32 z_crc32
|
||||
# define crc32_combine z_crc32_combine
|
||||
# define crc32_combine64 z_crc32_combine64
|
||||
# define crc32_z z_crc32_z
|
||||
# define deflate z_deflate
|
||||
# define deflateBound z_deflateBound
|
||||
# define deflateCopy z_deflateCopy
|
||||
# define deflateEnd z_deflateEnd
|
||||
# define deflateGetDictionary z_deflateGetDictionary
|
||||
# define deflateInit z_deflateInit
|
||||
# define deflateInit2 z_deflateInit2
|
||||
# define deflateInit2_ z_deflateInit2_
|
||||
# define deflateInit_ z_deflateInit_
|
||||
# define deflateParams z_deflateParams
|
||||
# define deflatePending z_deflatePending
|
||||
# define deflatePrime z_deflatePrime
|
||||
# define deflateReset z_deflateReset
|
||||
# define deflateResetKeep z_deflateResetKeep
|
||||
# define deflateSetDictionary z_deflateSetDictionary
|
||||
# define deflateSetHeader z_deflateSetHeader
|
||||
# define deflateTune z_deflateTune
|
||||
# define deflate_copyright z_deflate_copyright
|
||||
# define get_crc_table z_get_crc_table
|
||||
# ifndef Z_SOLO
|
||||
# define gz_error z_gz_error
|
||||
# define gz_intmax z_gz_intmax
|
||||
# define gz_strwinerror z_gz_strwinerror
|
||||
# define gzbuffer z_gzbuffer
|
||||
# define gzclearerr z_gzclearerr
|
||||
# define gzclose z_gzclose
|
||||
# define gzclose_r z_gzclose_r
|
||||
# define gzclose_w z_gzclose_w
|
||||
# define gzdirect z_gzdirect
|
||||
# define gzdopen z_gzdopen
|
||||
# define gzeof z_gzeof
|
||||
# define gzerror z_gzerror
|
||||
# define gzflush z_gzflush
|
||||
# define gzfread z_gzfread
|
||||
# define gzfwrite z_gzfwrite
|
||||
# define gzgetc z_gzgetc
|
||||
# define gzgetc_ z_gzgetc_
|
||||
# define gzgets z_gzgets
|
||||
# define gzoffset z_gzoffset
|
||||
# define gzoffset64 z_gzoffset64
|
||||
# define gzopen z_gzopen
|
||||
# define gzopen64 z_gzopen64
|
||||
# ifdef _WIN32
|
||||
# define gzopen_w z_gzopen_w
|
||||
# endif
|
||||
# define gzprintf z_gzprintf
|
||||
# define gzputc z_gzputc
|
||||
# define gzputs z_gzputs
|
||||
# define gzread z_gzread
|
||||
# define gzrewind z_gzrewind
|
||||
# define gzseek z_gzseek
|
||||
# define gzseek64 z_gzseek64
|
||||
# define gzsetparams z_gzsetparams
|
||||
# define gztell z_gztell
|
||||
# define gztell64 z_gztell64
|
||||
# define gzungetc z_gzungetc
|
||||
# define gzvprintf z_gzvprintf
|
||||
# define gzwrite z_gzwrite
|
||||
# endif
|
||||
# define inflate z_inflate
|
||||
# define inflateBack z_inflateBack
|
||||
# define inflateBackEnd z_inflateBackEnd
|
||||
# define inflateBackInit z_inflateBackInit
|
||||
# define inflateBackInit_ z_inflateBackInit_
|
||||
# define inflateCodesUsed z_inflateCodesUsed
|
||||
# define inflateCopy z_inflateCopy
|
||||
# define inflateEnd z_inflateEnd
|
||||
# define inflateGetDictionary z_inflateGetDictionary
|
||||
# define inflateGetHeader z_inflateGetHeader
|
||||
# define inflateInit z_inflateInit
|
||||
# define inflateInit2 z_inflateInit2
|
||||
# define inflateInit2_ z_inflateInit2_
|
||||
# define inflateInit_ z_inflateInit_
|
||||
# define inflateMark z_inflateMark
|
||||
# define inflatePrime z_inflatePrime
|
||||
# define inflateReset z_inflateReset
|
||||
# define inflateReset2 z_inflateReset2
|
||||
# define inflateResetKeep z_inflateResetKeep
|
||||
# define inflateSetDictionary z_inflateSetDictionary
|
||||
# define inflateSync z_inflateSync
|
||||
# define inflateSyncPoint z_inflateSyncPoint
|
||||
# define inflateUndermine z_inflateUndermine
|
||||
# define inflateValidate z_inflateValidate
|
||||
# define inflate_copyright z_inflate_copyright
|
||||
# define inflate_fast z_inflate_fast
|
||||
# define inflate_table z_inflate_table
|
||||
# ifndef Z_SOLO
|
||||
# define uncompress z_uncompress
|
||||
# define uncompress2 z_uncompress2
|
||||
# endif
|
||||
# define zError z_zError
|
||||
# ifndef Z_SOLO
|
||||
# define zcalloc z_zcalloc
|
||||
# define zcfree z_zcfree
|
||||
# endif
|
||||
# define zlibCompileFlags z_zlibCompileFlags
|
||||
# define zlibVersion z_zlibVersion
|
||||
|
||||
/* all zlib typedefs in zlib.h and zconf.h */
|
||||
# define Byte z_Byte
|
||||
# define Bytef z_Bytef
|
||||
# define alloc_func z_alloc_func
|
||||
# define charf z_charf
|
||||
# define free_func z_free_func
|
||||
# ifndef Z_SOLO
|
||||
# define gzFile z_gzFile
|
||||
# endif
|
||||
# define gz_header z_gz_header
|
||||
# define gz_headerp z_gz_headerp
|
||||
# define in_func z_in_func
|
||||
# define intf z_intf
|
||||
# define out_func z_out_func
|
||||
# define uInt z_uInt
|
||||
# define uIntf z_uIntf
|
||||
# define uLong z_uLong
|
||||
# define uLongf z_uLongf
|
||||
# define voidp z_voidp
|
||||
# define voidpc z_voidpc
|
||||
# define voidpf z_voidpf
|
||||
|
||||
/* all zlib structs in zlib.h and zconf.h */
|
||||
# define gz_header_s z_gz_header_s
|
||||
# define internal_state z_internal_state
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(__MSDOS__) && !defined(MSDOS)
|
||||
# define MSDOS
|
||||
#endif
|
||||
#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
|
||||
# define OS2
|
||||
#endif
|
||||
#if defined(_WINDOWS) && !defined(WINDOWS)
|
||||
# define WINDOWS
|
||||
#endif
|
||||
#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__)
|
||||
# ifndef WIN32
|
||||
# define WIN32
|
||||
# endif
|
||||
#endif
|
||||
#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
|
||||
# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
|
||||
# ifndef SYS16BIT
|
||||
# define SYS16BIT
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Compile with -DMAXSEG_64K if the alloc function cannot allocate more
|
||||
* than 64k bytes at a time (needed on systems with 16-bit int).
|
||||
*/
|
||||
#ifdef SYS16BIT
|
||||
# define MAXSEG_64K
|
||||
#endif
|
||||
#ifdef MSDOS
|
||||
# define UNALIGNED_OK
|
||||
#endif
|
||||
|
||||
#ifdef __STDC_VERSION__
|
||||
# ifndef STDC
|
||||
# define STDC
|
||||
# endif
|
||||
# if __STDC_VERSION__ >= 199901L
|
||||
# ifndef STDC99
|
||||
# define STDC99
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
|
||||
# define STDC
|
||||
#endif
|
||||
#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
|
||||
# define STDC
|
||||
#endif
|
||||
#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
|
||||
# define STDC
|
||||
#endif
|
||||
#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
|
||||
# define STDC
|
||||
#endif
|
||||
|
||||
#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */
|
||||
# define STDC
|
||||
#endif
|
||||
|
||||
#ifndef STDC
|
||||
# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
|
||||
# define const /* note: need a more gentle solution here */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(ZLIB_CONST) && !defined(z_const)
|
||||
# define z_const const
|
||||
#else
|
||||
# define z_const
|
||||
#endif
|
||||
|
||||
#ifdef Z_SOLO
|
||||
typedef unsigned long z_size_t;
|
||||
#else
|
||||
# define z_longlong long long
|
||||
# if defined(NO_SIZE_T)
|
||||
typedef unsigned NO_SIZE_T z_size_t;
|
||||
# elif defined(STDC)
|
||||
# include <stddef.h>
|
||||
typedef size_t z_size_t;
|
||||
# else
|
||||
typedef unsigned long z_size_t;
|
||||
# endif
|
||||
# undef z_longlong
|
||||
#endif
|
||||
|
||||
/* Maximum value for memLevel in deflateInit2 */
|
||||
#ifndef MAX_MEM_LEVEL
|
||||
# ifdef MAXSEG_64K
|
||||
# define MAX_MEM_LEVEL 8
|
||||
# else
|
||||
# define MAX_MEM_LEVEL 9
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Maximum value for windowBits in deflateInit2 and inflateInit2.
|
||||
* WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
|
||||
* created by gzip. (Files created by minigzip can still be extracted by
|
||||
* gzip.)
|
||||
*/
|
||||
#ifndef MAX_WBITS
|
||||
# define MAX_WBITS 15 /* 32K LZ77 window */
|
||||
#endif
|
||||
|
||||
/* The memory requirements for deflate are (in bytes):
|
||||
(1 << (windowBits+2)) + (1 << (memLevel+9))
|
||||
that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
|
||||
plus a few kilobytes for small objects. For example, if you want to reduce
|
||||
the default memory requirements from 256K to 128K, compile with
|
||||
make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
|
||||
Of course this will generally degrade compression (there's no free lunch).
|
||||
|
||||
The memory requirements for inflate are (in bytes) 1 << windowBits
|
||||
that is, 32K for windowBits=15 (default value) plus about 7 kilobytes
|
||||
for small objects.
|
||||
*/
|
||||
|
||||
/* Type declarations */
|
||||
|
||||
#ifndef OF /* function prototypes */
|
||||
# ifdef STDC
|
||||
# define OF(args) args
|
||||
# else
|
||||
# define OF(args) ()
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef Z_ARG /* function prototypes for stdarg */
|
||||
# if defined(STDC) || defined(Z_HAVE_STDARG_H)
|
||||
# define Z_ARG(args) args
|
||||
# else
|
||||
# define Z_ARG(args) ()
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* The following definitions for FAR are needed only for MSDOS mixed
|
||||
* model programming (small or medium model with some far allocations).
|
||||
* This was tested only with MSC; for other MSDOS compilers you may have
|
||||
* to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
|
||||
* just define FAR to be empty.
|
||||
*/
|
||||
#ifdef SYS16BIT
|
||||
# if defined(M_I86SM) || defined(M_I86MM)
|
||||
/* MSC small or medium model */
|
||||
# define SMALL_MEDIUM
|
||||
# ifdef _MSC_VER
|
||||
# define FAR _far
|
||||
# else
|
||||
# define FAR far
|
||||
# endif
|
||||
# endif
|
||||
# if (defined(__SMALL__) || defined(__MEDIUM__))
|
||||
/* Turbo C small or medium model */
|
||||
# define SMALL_MEDIUM
|
||||
# ifdef __BORLANDC__
|
||||
# define FAR _far
|
||||
# else
|
||||
# define FAR far
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(WINDOWS) || defined(WIN32)
|
||||
/* If building or using zlib as a DLL, define ZLIB_DLL.
|
||||
* This is not mandatory, but it offers a little performance increase.
|
||||
*/
|
||||
# ifdef ZLIB_DLL
|
||||
# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
|
||||
# ifdef ZLIB_INTERNAL
|
||||
# define ZEXTERN extern __declspec(dllexport)
|
||||
# else
|
||||
# define ZEXTERN extern __declspec(dllimport)
|
||||
# endif
|
||||
# endif
|
||||
# endif /* ZLIB_DLL */
|
||||
/* If building or using zlib with the WINAPI/WINAPIV calling convention,
|
||||
* define ZLIB_WINAPI.
|
||||
* Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
|
||||
*/
|
||||
# ifdef ZLIB_WINAPI
|
||||
# ifdef FAR
|
||||
# undef FAR
|
||||
# endif
|
||||
# include <windows.h>
|
||||
/* No need for _export, use ZLIB.DEF instead. */
|
||||
/* For complete Windows compatibility, use WINAPI, not __stdcall. */
|
||||
# define ZEXPORT WINAPI
|
||||
# ifdef WIN32
|
||||
# define ZEXPORTVA WINAPIV
|
||||
# else
|
||||
# define ZEXPORTVA FAR CDECL
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined (__BEOS__)
|
||||
# ifdef ZLIB_DLL
|
||||
# ifdef ZLIB_INTERNAL
|
||||
# define ZEXPORT __declspec(dllexport)
|
||||
# define ZEXPORTVA __declspec(dllexport)
|
||||
# else
|
||||
# define ZEXPORT __declspec(dllimport)
|
||||
# define ZEXPORTVA __declspec(dllimport)
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef ZEXTERN
|
||||
# define ZEXTERN extern
|
||||
#endif
|
||||
#ifndef ZEXPORT
|
||||
# define ZEXPORT
|
||||
#endif
|
||||
#ifndef ZEXPORTVA
|
||||
# define ZEXPORTVA
|
||||
#endif
|
||||
|
||||
#ifndef FAR
|
||||
# define FAR
|
||||
#endif
|
||||
|
||||
#if !defined(__MACTYPES__)
|
||||
typedef unsigned char Byte; /* 8 bits */
|
||||
#endif
|
||||
typedef unsigned int uInt; /* 16 bits or more */
|
||||
typedef unsigned long uLong; /* 32 bits or more */
|
||||
|
||||
#ifdef SMALL_MEDIUM
|
||||
/* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
|
||||
# define Bytef Byte FAR
|
||||
#else
|
||||
typedef Byte FAR Bytef;
|
||||
#endif
|
||||
typedef char FAR charf;
|
||||
typedef int FAR intf;
|
||||
typedef uInt FAR uIntf;
|
||||
typedef uLong FAR uLongf;
|
||||
|
||||
#ifdef STDC
|
||||
typedef void const *voidpc;
|
||||
typedef void FAR *voidpf;
|
||||
typedef void *voidp;
|
||||
#else
|
||||
typedef Byte const *voidpc;
|
||||
typedef Byte FAR *voidpf;
|
||||
typedef Byte *voidp;
|
||||
#endif
|
||||
|
||||
#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC)
|
||||
# include <limits.h>
|
||||
# if (UINT_MAX == 0xffffffffUL)
|
||||
# define Z_U4 unsigned
|
||||
# elif (ULONG_MAX == 0xffffffffUL)
|
||||
# define Z_U4 unsigned long
|
||||
# elif (USHRT_MAX == 0xffffffffUL)
|
||||
# define Z_U4 unsigned short
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef Z_U4
|
||||
typedef Z_U4 z_crc_t;
|
||||
#else
|
||||
typedef unsigned long z_crc_t;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */
|
||||
# define Z_HAVE_UNISTD_H
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */
|
||||
# define Z_HAVE_STDARG_H
|
||||
#endif
|
||||
|
||||
#ifdef STDC
|
||||
# ifndef Z_SOLO
|
||||
# include <sys/types.h> /* for off_t */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(STDC) || defined(Z_HAVE_STDARG_H)
|
||||
# ifndef Z_SOLO
|
||||
# include <stdarg.h> /* for va_list */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
# ifndef Z_SOLO
|
||||
# include <stddef.h> /* for wchar_t */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and
|
||||
* "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even
|
||||
* though the former does not conform to the LFS document), but considering
|
||||
* both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as
|
||||
* equivalently requesting no 64-bit operations
|
||||
*/
|
||||
#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1
|
||||
# undef _LARGEFILE64_SOURCE
|
||||
#endif
|
||||
|
||||
#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H)
|
||||
# define Z_HAVE_UNISTD_H
|
||||
#endif
|
||||
#ifndef Z_SOLO
|
||||
# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE)
|
||||
# include <unistd.h> /* for SEEK_*, off_t, and _LFS64_LARGEFILE */
|
||||
# ifdef VMS
|
||||
# include <unixio.h> /* for off_t */
|
||||
# endif
|
||||
# ifndef z_off_t
|
||||
# define z_off_t off_t
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0
|
||||
# define Z_LFS64
|
||||
#endif
|
||||
|
||||
#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64)
|
||||
# define Z_LARGE64
|
||||
#endif
|
||||
|
||||
#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64)
|
||||
# define Z_WANT64
|
||||
#endif
|
||||
|
||||
#if !defined(SEEK_SET) && !defined(Z_SOLO)
|
||||
# define SEEK_SET 0 /* Seek from beginning of file. */
|
||||
# define SEEK_CUR 1 /* Seek from current position. */
|
||||
# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
|
||||
#endif
|
||||
|
||||
#ifndef z_off_t
|
||||
# define z_off_t long
|
||||
#endif
|
||||
|
||||
#if !defined(_WIN32) && defined(Z_LARGE64)
|
||||
# define z_off64_t off64_t
|
||||
#else
|
||||
# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO)
|
||||
# define z_off64_t __int64
|
||||
# else
|
||||
# define z_off64_t z_off_t
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* MVS linker does not support external names larger than 8 bytes */
|
||||
#if defined(__MVS__)
|
||||
#pragma map(deflateInit_,"DEIN")
|
||||
#pragma map(deflateInit2_,"DEIN2")
|
||||
#pragma map(deflateEnd,"DEEND")
|
||||
#pragma map(deflateBound,"DEBND")
|
||||
#pragma map(inflateInit_,"ININ")
|
||||
#pragma map(inflateInit2_,"ININ2")
|
||||
#pragma map(inflateEnd,"INEND")
|
||||
#pragma map(inflateSync,"INSY")
|
||||
#pragma map(inflateSetDictionary,"INSEDI")
|
||||
#pragma map(compressBound,"CMBND")
|
||||
#pragma map(inflate_table,"INTABL")
|
||||
#pragma map(inflate_fast,"INFA")
|
||||
#pragma map(inflate_copyright,"INCOPY")
|
||||
#endif
|
||||
|
||||
#endif /* ZCONF_H */
|
||||
1917
asig/zlib/zlib.h
1917
asig/zlib/zlib.h
File diff suppressed because it is too large
Load Diff
2
go.mod
2
go.mod
@ -1,3 +1,5 @@
|
||||
module github.com/bloeys/assimp-go
|
||||
|
||||
go 1.17
|
||||
|
||||
require github.com/bloeys/gglm v0.3.1
|
||||
|
||||
4
go.sum
Executable file
4
go.sum
Executable file
@ -0,0 +1,4 @@
|
||||
github.com/bloeys/gglm v0.2.6 h1:+6m+GZuabU9GRhtEfqz7NS3fewO1xMcjJEenKVPRosM=
|
||||
github.com/bloeys/gglm v0.2.6/go.mod h1:qwJQ0WzV191wAMwlGicbfbChbKoSedMk7gFFX6GnyOk=
|
||||
github.com/bloeys/gglm v0.3.1 h1:Sy9upW7SBsBfDXrSmEhid3aQ+7J7itej+upwcxOnPMQ=
|
||||
github.com/bloeys/gglm v0.3.1/go.mod h1:qwJQ0WzV191wAMwlGicbfbChbKoSedMk7gFFX6GnyOk=
|
||||
63
main.go
63
main.go
@ -1,28 +1,67 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"image/png"
|
||||
|
||||
"github.com/bloeys/assimp-go/asig"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
||||
scene := asig.AiImportFile("obj.obj", uint(0))
|
||||
meshes := scene.MMeshes()
|
||||
scene, release, err := asig.ImportFile("obj.obj", asig.PostProcessTriangulate|asig.PostProcessJoinIdenticalVertices)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer release()
|
||||
|
||||
verts := meshes.Get(0).MVertices()
|
||||
for i := 0; i < int(verts.Size()); i++ {
|
||||
v := verts.Get(i)
|
||||
fmt.Printf("V%v: (%v, %v, %v)\n", i, v.GetX(), v.GetY(), v.GetZ())
|
||||
fmt.Printf("RootNode: %+v\n\n", scene.RootNode)
|
||||
|
||||
for i := 0; i < len(scene.Meshes); i++ {
|
||||
|
||||
println("Mesh:", i, "; Verts:", len(scene.Meshes[i].Vertices), "; Normals:", len(scene.Meshes[i].Normals), "; MatIndex:", scene.Meshes[i].MaterialIndex)
|
||||
for j := 0; j < len(scene.Meshes[i].Vertices); j++ {
|
||||
fmt.Printf("V(%v): (%v, %v, %v)\n", j, scene.Meshes[i].Vertices[j].X(), scene.Meshes[i].Vertices[j].Y(), scene.Meshes[i].Vertices[j].Z())
|
||||
}
|
||||
}
|
||||
|
||||
scene = asig.AiImportFile("obj.fbx", uint(0))
|
||||
meshes = scene.MMeshes()
|
||||
for i := 0; i < len(scene.Materials); i++ {
|
||||
|
||||
verts = meshes.Get(0).MVertices()
|
||||
for i := 0; i < int(verts.Size()); i++ {
|
||||
v := verts.Get(i)
|
||||
fmt.Printf("V%v: (%v, %v, %v)\n", i, v.GetX(), v.GetY(), v.GetZ())
|
||||
m := scene.Materials[i]
|
||||
println("Material:", i, "; Props:", len(scene.Materials[i].Properties))
|
||||
texCount := asig.GetMaterialTextureCount(m, asig.TextureTypeDiffuse)
|
||||
fmt.Println("Texture count:", texCount)
|
||||
|
||||
if texCount > 0 {
|
||||
|
||||
texInfo, err := asig.GetMaterialTexture(m, asig.TextureTypeDiffuse, 0)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
fmt.Printf("%v", texInfo)
|
||||
}
|
||||
}
|
||||
|
||||
ts := scene.Textures
|
||||
for i := 0; i < len(ts); i++ {
|
||||
t := ts[i]
|
||||
|
||||
fmt.Printf("T(%v): Name=%v, Hint=%v, Width=%v, Height=%v, NumTexels=%v\n", i, t.Filename, t.FormatHint, t.Width, t.Height, len(t.Data))
|
||||
|
||||
if t.FormatHint == "png" {
|
||||
decodePNG(t.Data)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func decodePNG(texels []byte) {
|
||||
|
||||
img, err := png.Decode(bytes.NewReader(texels))
|
||||
if err != nil {
|
||||
panic("wow2: " + err.Error())
|
||||
}
|
||||
|
||||
println("C:", img.At(100, 100))
|
||||
}
|
||||
|
||||
46
obj.obj
Executable file
46
obj.obj
Executable file
@ -0,0 +1,46 @@
|
||||
# Blender v2.92.0 OBJ File: ''
|
||||
# www.blender.org
|
||||
mtllib obj.mtl
|
||||
o Cube
|
||||
v 2.275618 1.000000 0.349413
|
||||
v 3.520138 -1.000000 0.102233
|
||||
v 2.275618 1.000000 0.752820
|
||||
v 3.520138 -1.000000 1.000000
|
||||
v 0.244520 1.000000 0.349413
|
||||
v -1.000000 -1.000000 0.102233
|
||||
v 0.244520 1.000000 0.752820
|
||||
v -1.000000 -1.000000 1.000000
|
||||
vt 0.806168 0.568832
|
||||
vt 0.693832 0.681168
|
||||
vt 0.693832 0.568832
|
||||
vt 0.375000 1.000000
|
||||
vt 0.375000 0.750000
|
||||
vt 0.375000 0.000000
|
||||
vt 0.625000 0.250000
|
||||
vt 0.375000 0.250000
|
||||
vt 0.375000 0.500000
|
||||
vt 0.125000 0.750000
|
||||
vt 0.125000 0.500000
|
||||
vt 0.806168 0.681168
|
||||
vt 0.625000 0.931168
|
||||
vt 0.625000 0.068832
|
||||
vn 0.0000 1.0000 0.0000
|
||||
vn 0.0000 0.1227 0.9924
|
||||
vn -0.8490 0.5283 0.0000
|
||||
vn 0.0000 -1.0000 0.0000
|
||||
vn 0.8490 0.5283 0.0000
|
||||
vn 0.0000 0.1227 -0.9924
|
||||
usemtl Material
|
||||
s off
|
||||
f 5/1/1 3/2/1 1/3/1
|
||||
f 3/2/2 8/4/2 4/5/2
|
||||
f 8/6/3 5/7/3 6/8/3
|
||||
f 2/9/4 8/10/4 6/11/4
|
||||
f 1/3/5 4/5/5 2/9/5
|
||||
f 5/7/6 2/9/6 6/8/6
|
||||
f 5/1/1 7/12/1 3/2/1
|
||||
f 3/2/2 7/13/2 8/4/2
|
||||
f 8/6/3 7/14/3 5/7/3
|
||||
f 2/9/4 4/5/4 8/10/4
|
||||
f 1/3/5 3/2/5 4/5/5
|
||||
f 5/7/6 1/3/6 2/9/6
|
||||
Reference in New Issue
Block a user