# 🧩 Build Options（ビルドオプション）

**ufbx**<span style="white-space: pre-wrap;"> のビルドは、主に </span>****プリプロセッサマクロ（**`<strong class="editor-theme-bold editor-theme-code">#define</strong>`**）****<span style="white-space: pre-wrap;"> によってカスタマイズします。</span>

マクロの定義方法は次のいずれかです。

1. コンパイラオプションでグローバルに指定する
2. `<span class="editor-theme-code">"ufbx.h"</span>`<span style="white-space: pre-wrap;"> や </span>`<span class="editor-theme-code">"ufbx.c"</span>`<span style="white-space: pre-wrap;"> をインクルードする前にマクロを定義する</span>
3. または以下を定義して独自設定ファイルを読み込む：

```c
#define UFBX_CONFIG_HEADER "my-config.h"
#define UFBX_CONFIG_SOURCE "my-source-config.h"
```

これにより、`<span class="editor-theme-code">ufbx.h</span>`<span style="white-space: pre-wrap;"> および </span>`<span class="editor-theme-code">ufbx.c</span>`<span style="white-space: pre-wrap;"> 内で指定した設定ファイルが自動的にインクルードされます。</span>

---

## 📘 ヘッダ設定（Header）

<span style="white-space: pre-wrap;">多くの設定マクロは </span>`<span class="editor-theme-code">"ufbx.c"</span>`<span style="white-space: pre-wrap;"> 内だけで有効にすれば十分です。</span>  
ただし、****型やインライン関数に影響を与えるマクロ****<span style="white-space: pre-wrap;"> は </span>`<span class="editor-theme-code">"ufbx.h"</span>`<span style="white-space: pre-wrap;"> にも定義する必要があります。</span>

```c
// アサートを独自実装に置き換える
#define ufbx_assert(cond) my_assert(cond)

// 浮動小数型を double → float に変更
#define UFBX_REAL_IS_FLOAT
```

---

## ⚙️ オプション機能の無効化

**ufbx**<span style="white-space: pre-wrap;"> のサイズを小さくしたい場合、</span>  
特定の機能をマクロで無効化できます。

```c
// メッシュの細分化
#define UFBX_NO_SUBDIVISION

// NURBS のテッセレーション
#define UFBX_NO_TESSELLATION

// ジオメトリキャッシュの読み込み
#define UFBX_NO_GEOMETRY_CACHE

// シーン評価
#define UFBX_NO_SCENE_EVALUATION

// スキン評価
#define UFBX_NO_SKINNING_EVALUATION

// アニメーションベイク
#define UFBX_NO_ANIMATION_BAKING

// 面の三角化
#define UFBX_NO_TRIANGULATION

// インデックス生成
#define UFBX_NO_INDEX_GENERATION

// OBJ 形式の読み込みを無効化
#define UFBX_NO_FORMAT_OBJ
```

---

## 💾 メモリアロケーション（Memory Allocation）

**ufbx**<span style="white-space: pre-wrap;"> は標準の </span>`<span class="editor-theme-code">malloc()</span>`<span style="white-space: pre-wrap;"> / </span>`<span class="editor-theme-code">realloc()</span>`<span style="white-space: pre-wrap;"> / </span>`<span class="editor-theme-code">free()</span>`<span style="white-space: pre-wrap;"> を使用します。</span>  
これを独自アロケータに置き換える方法は3通りあります：

### 方法①：マクロでフックする

```c
#define ufbx_malloc(size) my_alloc(size)
#define ufbx_realloc(ptr, old_size, new_size) my_realloc(ptr, old_size, new_size)
#define ufbx_free(ptr, size) my_free(ptr, size)

#include "ufbx.c"
```

### 方法②：外部関数として定義する

```c
#define UFBX_EXTERNAL_MALLOC

void *ufbx_malloc(size_t size);
void *ufbx_realloc(void *ptr, size_t old_size, size_t new_size);
void ufbx_free(void *ptr, size_t size);
```

### 方法③：アロケータを完全に無効化する

```c
#define UFBX_NO_MALLOC
```

<span style="white-space: pre-wrap;">この場合、ユーザーが </span>`<span class="editor-theme-code">ufbx_allocator</span>`<span style="white-space: pre-wrap;"> を提供しない限り、</span>  
メモリ確保を行う API はすべて失敗します。

---

## 📂 ファイル入出力（File I/O）

<span style="white-space: pre-wrap;">標準の </span>`<span class="editor-theme-code">FILE</span>`<span style="white-space: pre-wrap;"> API を使用して </span>`<span class="editor-theme-code">ufbx_load_file()</span>`<span style="white-space: pre-wrap;"> が動作します。</span>  
独自のファイルI/Oを使いたい場合は、以下の方法で上書き可能です。

### 外部定義で差し替え

```c
#define UFBX_EXTERNAL_STDIO

void *ufbx_stdio_open(const char *path, size_t path_len);
size_t ufbx_stdio_read(void *file, void *data, size_t size);
bool   ufbx_stdio_skip(void *file, size_t size);
uint64_t ufbx_stdio_size(void *file);
void   ufbx_stdio_close(void *file);
```

### 標準I/Oを完全に無効化

```c
#define UFBX_NO_STDIO
```

この場合、`<span class="editor-theme-code">ufbx_load_file()</span>`<span style="white-space: pre-wrap;"> など </span>`<span class="editor-theme-code">FILE</span>`<span style="white-space: pre-wrap;"> に依存する機能は利用できません。</span>  
代わりに、`<span class="editor-theme-code">ufbx_load_opts.open_file_cb</span>`<span style="white-space: pre-wrap;"> によるカスタム読み込みを利用します。</span>

---

## 🧮 数学関数（Math）

**ufbx**<span style="white-space: pre-wrap;"> は </span>`<span class="editor-theme-code"><math.h></span>`<span style="white-space: pre-wrap;"> の一部関数を利用しますが、</span>  
****ビット単位で一致する結果を保証したい場合****や  
****標準ライブラリを使用できない環境****では、  
外部定義で上書きすることができます。

```c
#define UFBX_EXTERNAL_MATH

double ufbx_sqrt(double x);
double ufbx_sin(double x);
double ufbx_cos(double x);
double ufbx_tan(double x);
double ufbx_asin(double x);
double ufbx_acos(double x);
double ufbx_atan(double x);
double ufbx_atan2(double y, double x);
double ufbx_pow(double x, double y);
double ufbx_fmin(double a, double b);
double ufbx_fmax(double a, double b);
double ufbx_fabs(double x);
double ufbx_copysign(double x, double y);
double ufbx_nextafter(double x, double y);
double ufbx_rint(double x);
double ufbx_ceil(double x);
int    ufbx_isnan(double x);
```

これらは自前で定義するか、  
[`<span class="editor-theme-code">extra/ufbx_math.c</span>`](https://github.com/ufbx/ufbx/blob/master/extra/ufbx_math.c)<span style="white-space: pre-wrap;"> を使用可能です。</span>

---

## 🧱 標準ライブラリの除去（C Standard Library）

`<span class="editor-theme-code">UFBX_NO_LIBC</span>`<span style="white-space: pre-wrap;"> を定義すると、</span>  
ほとんどの標準ライブラリ依存を無効化できます。  
これにより組み込み環境などでも利用可能になります。

```c
#define UFBX_NO_LIBC
```

この定義により、デフォルトで以下が暗黙的に有効になります：

- `<span class="editor-theme-code">UFBX_EXTERNAL_MALLOC</span>`
- `<span class="editor-theme-code">UFBX_EXTERNAL_STDIO</span>`
- `<span class="editor-theme-code">UFBX_EXTERNAL_MATH</span>`

標準機能を完全に使わない場合は：

```c
#define UFBX_NO_MALLOC
#define UFBX_NO_STDIO
```

を併用します。

---

### `<span class="editor-theme-code"><string.h></span>`<span style="white-space: pre-wrap;"> 関数の再実装が必要</span>

標準ライブラリを使わない場合、以下の関数を提供する必要があります。  
<span style="white-space: pre-wrap;">（または </span>[`<span class="editor-theme-code">extra/ufbx_libc.c</span>`](https://github.com/ufbx/ufbx/blob/master/extra/ufbx_libc.c)<span style="white-space: pre-wrap;"> を使用）</span>

```c
size_t ufbx_strlen(const char *str);
void *ufbx_memcpy(void *dst, const void *src, size_t count);
void *ufbx_memmove(void *dst, const void *src, size_t count);
void *ufbx_memset(void *dst, int ch, size_t count);
const void *ufbx_memchr(const void *ptr, int value, size_t count);
int ufbx_memcmp(const void *a, const void *b, size_t count);
int ufbx_strcmp(const char *a, const char *b);
int ufbx_strncmp(const char *a, const char *b, size_t count);
```

---

### 📦 最低限必要なヘッダ

以下のヘッダは、ライブラリなしでも通常利用可能です：

```c
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include <stdarg.h>
```

もしこれらすら利用できない環境では：

```c
#define UFBX_NO_LIBC_TYPES
```

<span style="white-space: pre-wrap;">を定義し、自前でこれらの型定義を </span>`<span class="editor-theme-code">"ufbx.h"</span>`<span style="white-space: pre-wrap;"> と </span>`<span class="editor-theme-code">"ufbx.c"</span>`<span style="white-space: pre-wrap;"> の両方に用意する必要があります。</span>

---

<span style="white-space: pre-wrap;">📘 </span>****備考****  
このドキュメントは MIT / Public Domain ライセンスのもとで公開された  
[ufbx (c) 2020 Samuli Raivio](https://ufbx.github.io)<span style="white-space: pre-wrap;"> の内容を翻訳・整形しています。</span>