Getting to the way it's supposed to be!

This commit is contained in:
2024-10-12 00:43:51 +02:00
parent 84729f9d27
commit 8f2dad9cec
2663 changed files with 540071 additions and 14 deletions

View File

@@ -1,6 +1,432 @@
// Workspace: Game
//
// String added via add_build_string() from c:/Personal/games/Coven/metaprogram.jai:30.
// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:32.
//
GAME_NAME :: "Test";
GAME_NAME :: "FPS";
//
// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:246.
//
serialize_entity :: (e: *Entity, path: string) {
builder: String_Builder;
builder.allocator = temp;
if e.type == {
case Block; serialize_entity(cast(*Block)e, *builder);
case Character; serialize_entity(cast(*Character)e, *builder);
case Item; serialize_entity(cast(*Item)e, *builder);
case Pistol; serialize_entity(cast(*Pistol)e, *builder);
}
write_entire_file(tprint("%/%.ent", path, e.id), builder_to_string(*builder));
}
//
// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:257.
//
deserialize_entity :: (scene: *Scene, path: string) -> *Entity {
content := read_entire_file(path);
if content.count == 0 return null;
lines := split(content, "\n");
first_line := split(lines[0], ":");
if first_line.count != 2 return null;
e: *Entity;
type := trim(first_line[1], " \n\r");
if type == {
case "Block"; p, locator := find_and_occupy_empty_slot(*scene.by_type._Block); p._locator = locator; e = p; register_entity(scene, p); init_entity(p); deserialize_entity(scene, lines, cast(*Block)e); update_matrix(*e.transform);
case "Character"; p, locator := find_and_occupy_empty_slot(*scene.by_type._Character); p._locator = locator; e = p; register_entity(scene, p); init_entity(p); deserialize_entity(scene, lines, cast(*Character)e); update_matrix(*e.transform);
case "Item"; p, locator := find_and_occupy_empty_slot(*scene.by_type._Item); p._locator = locator; e = p; register_entity(scene, p); init_entity(p); deserialize_entity(scene, lines, cast(*Item)e); update_matrix(*e.transform);
case "Pistol"; p, locator := find_and_occupy_empty_slot(*scene.by_type._Pistol); p._locator = locator; e = p; register_entity(scene, p); init_entity(p); deserialize_entity(scene, lines, cast(*Pistol)e); update_matrix(*e.transform);
}
return e;
}
//
// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:266.
//
new_block :: (scene: *Scene = null) -> *Block { _scene := scene;
if _scene == null {
_scene = game_state.current_scene; }
p, locator := find_and_occupy_empty_slot(*_scene.by_type._Block); p._locator = locator; register_entity(_scene, p); p.transform = create_identity_transform(); init_entity(p); return p; }
new_character :: (scene: *Scene = null) -> *Character { _scene := scene;
if _scene == null {
_scene = game_state.current_scene; }
p, locator := find_and_occupy_empty_slot(*_scene.by_type._Character); p._locator = locator; register_entity(_scene, p); p.transform = create_identity_transform(); init_entity(p); return p; }
new_item :: (scene: *Scene = null) -> *Item { _scene := scene;
if _scene == null {
_scene = game_state.current_scene; }
p, locator := find_and_occupy_empty_slot(*_scene.by_type._Item); p._locator = locator; register_entity(_scene, p); p.transform = create_identity_transform(); init_entity(p); return p; }
new_pistol :: (scene: *Scene = null) -> *Pistol { _scene := scene;
if _scene == null {
_scene = game_state.current_scene; }
p, locator := find_and_occupy_empty_slot(*_scene.by_type._Pistol); p._locator = locator; register_entity(_scene, p); p.transform = create_identity_transform(); init_entity(p); return p; }
//
// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:270.
//
serialize_entity :: (e: *Item, builder: *String_Builder) {
print_to_builder(builder, "type: Item\n");
print_to_builder(builder, "entity.enabled: %\n", e.entity.enabled);
print_to_builder(builder, "entity.flags: %\n", e.entity.flags);
print_to_builder(builder, "entity.transform.position.x: %\n", e.entity.transform.position.x);
print_to_builder(builder, "entity.transform.position.y: %\n", e.entity.transform.position.y);
print_to_builder(builder, "entity.transform.position.z: %\n", e.entity.transform.position.z);
print_to_builder(builder, "entity.transform.orientation.x: %\n", e.entity.transform.orientation.x);
print_to_builder(builder, "entity.transform.orientation.y: %\n", e.entity.transform.orientation.y);
print_to_builder(builder, "entity.transform.orientation.z: %\n", e.entity.transform.orientation.z);
print_to_builder(builder, "entity.transform.orientation.w: %\n", e.entity.transform.orientation.w);
print_to_builder(builder, "entity.transform.scale.x: %\n", e.entity.transform.scale.x);
print_to_builder(builder, "entity.transform.scale.y: %\n", e.entity.transform.scale.y);
print_to_builder(builder, "entity.transform.scale.z: %\n", e.entity.transform.scale.z);
print_to_builder(builder, "entity.grid_position.x: %\n", e.entity.grid_position.x);
print_to_builder(builder, "entity.grid_position.y: %\n", e.entity.grid_position.y);
print_to_builder(builder, "entity.grid_position.z: %\n", e.entity.grid_position.z);
print_to_builder(builder, "entity.snap_offset.x: %\n", e.entity.snap_offset.x);
print_to_builder(builder, "entity.snap_offset.y: %\n", e.entity.snap_offset.y);
print_to_builder(builder, "entity.snap_offset.z: %\n", e.entity.snap_offset.z);
}
//
// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:270.
//
deserialize_entity :: (scene: *Scene, lines: [] string, e: *Item) {
for line: lines {
values := split(line, ":");
if values.count == 2 {
if trim(values[0], " ") == {
case "entity.enabled";
scan2(values[1], "%", *e.entity.enabled);
case "entity.transform.position.x";
scan2(values[1], "%", *e.entity.transform.position.x);
case "entity.transform.position.y";
scan2(values[1], "%", *e.entity.transform.position.y);
case "entity.transform.position.z";
scan2(values[1], "%", *e.entity.transform.position.z);
case "entity.transform.orientation.x";
scan2(values[1], "%", *e.entity.transform.orientation.x);
case "entity.transform.orientation.y";
scan2(values[1], "%", *e.entity.transform.orientation.y);
case "entity.transform.orientation.z";
scan2(values[1], "%", *e.entity.transform.orientation.z);
case "entity.transform.orientation.w";
scan2(values[1], "%", *e.entity.transform.orientation.w);
case "entity.transform.scale.x";
scan2(values[1], "%", *e.entity.transform.scale.x);
case "entity.transform.scale.y";
scan2(values[1], "%", *e.entity.transform.scale.y);
case "entity.transform.scale.z";
scan2(values[1], "%", *e.entity.transform.scale.z);
case "entity.grid_position.x";
scan2(values[1], "%", *e.entity.grid_position.x);
case "entity.grid_position.y";
scan2(values[1], "%", *e.entity.grid_position.y);
case "entity.grid_position.z";
scan2(values[1], "%", *e.entity.grid_position.z);
case "entity.snap_offset.x";
scan2(values[1], "%", *e.entity.snap_offset.x);
case "entity.snap_offset.y";
scan2(values[1], "%", *e.entity.snap_offset.y);
case "entity.snap_offset.z";
scan2(values[1], "%", *e.entity.snap_offset.z);
}
}
}
}
//
// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:270.
//
serialize_entity :: (e: *Block, builder: *String_Builder) {
print_to_builder(builder, "type: Block\n");
print_to_builder(builder, "entity.enabled: %\n", e.entity.enabled);
print_to_builder(builder, "entity.flags: %\n", e.entity.flags);
print_to_builder(builder, "entity.transform.position.x: %\n", e.entity.transform.position.x);
print_to_builder(builder, "entity.transform.position.y: %\n", e.entity.transform.position.y);
print_to_builder(builder, "entity.transform.position.z: %\n", e.entity.transform.position.z);
print_to_builder(builder, "entity.transform.orientation.x: %\n", e.entity.transform.orientation.x);
print_to_builder(builder, "entity.transform.orientation.y: %\n", e.entity.transform.orientation.y);
print_to_builder(builder, "entity.transform.orientation.z: %\n", e.entity.transform.orientation.z);
print_to_builder(builder, "entity.transform.orientation.w: %\n", e.entity.transform.orientation.w);
print_to_builder(builder, "entity.transform.scale.x: %\n", e.entity.transform.scale.x);
print_to_builder(builder, "entity.transform.scale.y: %\n", e.entity.transform.scale.y);
print_to_builder(builder, "entity.transform.scale.z: %\n", e.entity.transform.scale.z);
print_to_builder(builder, "entity.grid_position.x: %\n", e.entity.grid_position.x);
print_to_builder(builder, "entity.grid_position.y: %\n", e.entity.grid_position.y);
print_to_builder(builder, "entity.grid_position.z: %\n", e.entity.grid_position.z);
print_to_builder(builder, "entity.snap_offset.x: %\n", e.entity.snap_offset.x);
print_to_builder(builder, "entity.snap_offset.y: %\n", e.entity.snap_offset.y);
print_to_builder(builder, "entity.snap_offset.z: %\n", e.entity.snap_offset.z);
print_to_builder(builder, "block_type: %\n", e.block_type);
print_to_builder(builder, "debug_id: %\n", e.debug_id);
}
//
// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:270.
//
deserialize_entity :: (scene: *Scene, lines: [] string, e: *Block) {
for line: lines {
values := split(line, ":");
if values.count == 2 {
if trim(values[0], " ") == {
case "entity.enabled";
scan2(values[1], "%", *e.entity.enabled);
case "entity.transform.position.x";
scan2(values[1], "%", *e.entity.transform.position.x);
case "entity.transform.position.y";
scan2(values[1], "%", *e.entity.transform.position.y);
case "entity.transform.position.z";
scan2(values[1], "%", *e.entity.transform.position.z);
case "entity.transform.orientation.x";
scan2(values[1], "%", *e.entity.transform.orientation.x);
case "entity.transform.orientation.y";
scan2(values[1], "%", *e.entity.transform.orientation.y);
case "entity.transform.orientation.z";
scan2(values[1], "%", *e.entity.transform.orientation.z);
case "entity.transform.orientation.w";
scan2(values[1], "%", *e.entity.transform.orientation.w);
case "entity.transform.scale.x";
scan2(values[1], "%", *e.entity.transform.scale.x);
case "entity.transform.scale.y";
scan2(values[1], "%", *e.entity.transform.scale.y);
case "entity.transform.scale.z";
scan2(values[1], "%", *e.entity.transform.scale.z);
case "entity.grid_position.x";
scan2(values[1], "%", *e.entity.grid_position.x);
case "entity.grid_position.y";
scan2(values[1], "%", *e.entity.grid_position.y);
case "entity.grid_position.z";
scan2(values[1], "%", *e.entity.grid_position.z);
case "entity.snap_offset.x";
scan2(values[1], "%", *e.entity.snap_offset.x);
case "entity.snap_offset.y";
scan2(values[1], "%", *e.entity.snap_offset.y);
case "entity.snap_offset.z";
scan2(values[1], "%", *e.entity.snap_offset.z);
case "debug_id";
scan2(values[1], "%", *e.debug_id);
}
}
}
}
//
// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:270.
//
serialize_entity :: (e: *Pistol, builder: *String_Builder) {
print_to_builder(builder, "type: Pistol\n");
print_to_builder(builder, "entity.enabled: %\n", e.entity.enabled);
print_to_builder(builder, "entity.flags: %\n", e.entity.flags);
print_to_builder(builder, "entity.transform.position.x: %\n", e.entity.transform.position.x);
print_to_builder(builder, "entity.transform.position.y: %\n", e.entity.transform.position.y);
print_to_builder(builder, "entity.transform.position.z: %\n", e.entity.transform.position.z);
print_to_builder(builder, "entity.transform.orientation.x: %\n", e.entity.transform.orientation.x);
print_to_builder(builder, "entity.transform.orientation.y: %\n", e.entity.transform.orientation.y);
print_to_builder(builder, "entity.transform.orientation.z: %\n", e.entity.transform.orientation.z);
print_to_builder(builder, "entity.transform.orientation.w: %\n", e.entity.transform.orientation.w);
print_to_builder(builder, "entity.transform.scale.x: %\n", e.entity.transform.scale.x);
print_to_builder(builder, "entity.transform.scale.y: %\n", e.entity.transform.scale.y);
print_to_builder(builder, "entity.transform.scale.z: %\n", e.entity.transform.scale.z);
print_to_builder(builder, "entity.grid_position.x: %\n", e.entity.grid_position.x);
print_to_builder(builder, "entity.grid_position.y: %\n", e.entity.grid_position.y);
print_to_builder(builder, "entity.grid_position.z: %\n", e.entity.grid_position.z);
print_to_builder(builder, "entity.snap_offset.x: %\n", e.entity.snap_offset.x);
print_to_builder(builder, "entity.snap_offset.y: %\n", e.entity.snap_offset.y);
print_to_builder(builder, "entity.snap_offset.z: %\n", e.entity.snap_offset.z);
print_to_builder(builder, "shooting: %\n", e.shooting);
print_to_builder(builder, "reloading: %\n", e.reloading);
print_to_builder(builder, "shoot_time: %\n", e.shoot_time);
print_to_builder(builder, "reload_time: %\n", e.reload_time);
print_to_builder(builder, "shot_cooldown_time: %\n", e.shot_cooldown_time);
print_to_builder(builder, "current_mag_ammo: %\n", e.current_mag_ammo);
print_to_builder(builder, "ammo_per_mag: %\n", e.ammo_per_mag);
}
//
// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:270.
//
deserialize_entity :: (scene: *Scene, lines: [] string, e: *Pistol) {
for line: lines {
values := split(line, ":");
if values.count == 2 {
if trim(values[0], " ") == {
case "entity.enabled";
scan2(values[1], "%", *e.entity.enabled);
case "entity.transform.position.x";
scan2(values[1], "%", *e.entity.transform.position.x);
case "entity.transform.position.y";
scan2(values[1], "%", *e.entity.transform.position.y);
case "entity.transform.position.z";
scan2(values[1], "%", *e.entity.transform.position.z);
case "entity.transform.orientation.x";
scan2(values[1], "%", *e.entity.transform.orientation.x);
case "entity.transform.orientation.y";
scan2(values[1], "%", *e.entity.transform.orientation.y);
case "entity.transform.orientation.z";
scan2(values[1], "%", *e.entity.transform.orientation.z);
case "entity.transform.orientation.w";
scan2(values[1], "%", *e.entity.transform.orientation.w);
case "entity.transform.scale.x";
scan2(values[1], "%", *e.entity.transform.scale.x);
case "entity.transform.scale.y";
scan2(values[1], "%", *e.entity.transform.scale.y);
case "entity.transform.scale.z";
scan2(values[1], "%", *e.entity.transform.scale.z);
case "entity.grid_position.x";
scan2(values[1], "%", *e.entity.grid_position.x);
case "entity.grid_position.y";
scan2(values[1], "%", *e.entity.grid_position.y);
case "entity.grid_position.z";
scan2(values[1], "%", *e.entity.grid_position.z);
case "entity.snap_offset.x";
scan2(values[1], "%", *e.entity.snap_offset.x);
case "entity.snap_offset.y";
scan2(values[1], "%", *e.entity.snap_offset.y);
case "entity.snap_offset.z";
scan2(values[1], "%", *e.entity.snap_offset.z);
case "shooting";
scan2(values[1], "%", *e.shooting);
case "reloading";
scan2(values[1], "%", *e.reloading);
case "shoot_time";
scan2(values[1], "%", *e.shoot_time);
case "reload_time";
scan2(values[1], "%", *e.reload_time);
case "shot_cooldown_time";
scan2(values[1], "%", *e.shot_cooldown_time);
case "current_mag_ammo";
scan2(values[1], "%", *e.current_mag_ammo);
case "ammo_per_mag";
scan2(values[1], "%", *e.ammo_per_mag);
}
}
}
}
//
// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:270.
//
serialize_entity :: (e: *Character, builder: *String_Builder) {
print_to_builder(builder, "type: Character\n");
print_to_builder(builder, "entity.enabled: %\n", e.entity.enabled);
print_to_builder(builder, "entity.flags: %\n", e.entity.flags);
print_to_builder(builder, "entity.transform.position.x: %\n", e.entity.transform.position.x);
print_to_builder(builder, "entity.transform.position.y: %\n", e.entity.transform.position.y);
print_to_builder(builder, "entity.transform.position.z: %\n", e.entity.transform.position.z);
print_to_builder(builder, "entity.transform.orientation.x: %\n", e.entity.transform.orientation.x);
print_to_builder(builder, "entity.transform.orientation.y: %\n", e.entity.transform.orientation.y);
print_to_builder(builder, "entity.transform.orientation.z: %\n", e.entity.transform.orientation.z);
print_to_builder(builder, "entity.transform.orientation.w: %\n", e.entity.transform.orientation.w);
print_to_builder(builder, "entity.transform.scale.x: %\n", e.entity.transform.scale.x);
print_to_builder(builder, "entity.transform.scale.y: %\n", e.entity.transform.scale.y);
print_to_builder(builder, "entity.transform.scale.z: %\n", e.entity.transform.scale.z);
print_to_builder(builder, "entity.grid_position.x: %\n", e.entity.grid_position.x);
print_to_builder(builder, "entity.grid_position.y: %\n", e.entity.grid_position.y);
print_to_builder(builder, "entity.grid_position.z: %\n", e.entity.grid_position.z);
print_to_builder(builder, "entity.snap_offset.x: %\n", e.entity.snap_offset.x);
print_to_builder(builder, "entity.snap_offset.y: %\n", e.entity.snap_offset.y);
print_to_builder(builder, "entity.snap_offset.z: %\n", e.entity.snap_offset.z);
print_to_builder(builder, "look_direction.x: %\n", e.look_direction.x);
print_to_builder(builder, "look_direction.y: %\n", e.look_direction.y);
print_to_builder(builder, "look_direction.z: %\n", e.look_direction.z);
print_to_builder(builder, "yaw: %\n", e.yaw);
print_to_builder(builder, "pitch: %\n", e.pitch);
print_to_builder(builder, "last_footstep_audio: %\n", e.last_footstep_audio);
print_to_builder(builder, "animation_time: %\n", e.animation_time);
print_to_builder(builder, "health: %\n", e.health);
print_to_builder(builder, "jump_press_time: %\n", e.jump_press_time);
print_to_builder(builder, "last_grounded_time: %\n", e.last_grounded_time);
}
//
// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:270.
//
deserialize_entity :: (scene: *Scene, lines: [] string, e: *Character) {
for line: lines {
values := split(line, ":");
if values.count == 2 {
if trim(values[0], " ") == {
case "entity.enabled";
scan2(values[1], "%", *e.entity.enabled);
case "entity.transform.position.x";
scan2(values[1], "%", *e.entity.transform.position.x);
case "entity.transform.position.y";
scan2(values[1], "%", *e.entity.transform.position.y);
case "entity.transform.position.z";
scan2(values[1], "%", *e.entity.transform.position.z);
case "entity.transform.orientation.x";
scan2(values[1], "%", *e.entity.transform.orientation.x);
case "entity.transform.orientation.y";
scan2(values[1], "%", *e.entity.transform.orientation.y);
case "entity.transform.orientation.z";
scan2(values[1], "%", *e.entity.transform.orientation.z);
case "entity.transform.orientation.w";
scan2(values[1], "%", *e.entity.transform.orientation.w);
case "entity.transform.scale.x";
scan2(values[1], "%", *e.entity.transform.scale.x);
case "entity.transform.scale.y";
scan2(values[1], "%", *e.entity.transform.scale.y);
case "entity.transform.scale.z";
scan2(values[1], "%", *e.entity.transform.scale.z);
case "entity.grid_position.x";
scan2(values[1], "%", *e.entity.grid_position.x);
case "entity.grid_position.y";
scan2(values[1], "%", *e.entity.grid_position.y);
case "entity.grid_position.z";
scan2(values[1], "%", *e.entity.grid_position.z);
case "entity.snap_offset.x";
scan2(values[1], "%", *e.entity.snap_offset.x);
case "entity.snap_offset.y";
scan2(values[1], "%", *e.entity.snap_offset.y);
case "entity.snap_offset.z";
scan2(values[1], "%", *e.entity.snap_offset.z);
case "look_direction.x";
scan2(values[1], "%", *e.look_direction.x);
case "look_direction.y";
scan2(values[1], "%", *e.look_direction.y);
case "look_direction.z";
scan2(values[1], "%", *e.look_direction.z);
case "yaw";
scan2(values[1], "%", *e.yaw);
case "pitch";
scan2(values[1], "%", *e.pitch);
case "last_footstep_audio";
scan2(values[1], "%", *e.last_footstep_audio);
case "animation_time";
scan2(values[1], "%", *e.animation_time);
case "health";
scan2(values[1], "%", *e.health);
case "jump_press_time";
scan2(values[1], "%", *e.jump_press_time);
case "last_grounded_time";
scan2(values[1], "%", *e.last_grounded_time);
}
}
}
}
//
// String added via add_build_string() from c:/Personal/games/FPS/modules/Coven/metaprogram.jai:278.
//
// NUM_ENTITY_TYPES tells the target program how many entity types there are.
NUM_ENTITY_TYPES :: 4;
// entity_types is an array containing all the entity types.
entity_types : [4] Type : .[ Block, Character, Item, Pistol ];
Entity_Storage :: struct {
_Block: Bucket_Array(Block, 20, true);
_Character: Bucket_Array(Character, 20, true);
_Item: Bucket_Array(Item, 20, true);
_Pistol: Bucket_Array(Pistol, 20, true);
}

View File

@@ -362,5 +362,4 @@ ease_in_out_sine :: (x: float) -> float {
}
#import "PCG";
#import "Math";
#import "Math";

View File

@@ -5,8 +5,8 @@
build_release := false;
build :: (main_path: string, game_name: string) {
set_working_directory(#filepath);
build :: (main_path: string, game_name: string, working_dir: string = #filepath) {
set_working_directory(working_dir);
w := compiler_create_workspace("Game");
opts := get_build_options(w);
@@ -18,6 +18,7 @@ build :: (main_path: string, game_name: string) {
new_path: [..] string;
array_add(*new_path, ..opts.import_path);
array_add(*new_path, "../../modules");
array_add(*new_path, "modules/ufbx");
array_add(*new_path, "modules");
opts.import_path = new_path;
@@ -163,6 +164,7 @@ generate_serialize_procedure_for_entity :: (code_struct: *Code_Struct) {
}
note_struct :: (code_struct: *Code_Struct) {
print("Type: %\n", code_struct.defined_type.name);
if is_subclass_of(code_struct.defined_type, "Entity") {
name := code_struct.defined_type.name;

View File

@@ -1,10 +1,10 @@
#load "core/entity.jai";
#load "core/scene.jai";
EDITOR :: true;
DEBUG :: true;
#if EDITOR {
//#load "../editor/scene_editor.jai";
//#load "../ui/new_ui/new_ui.jai";
#load "../editor/editor.jai";
#load "editor/editor.jai";
editor: Editor;
}
@@ -17,9 +17,9 @@ time: float;
dt: float;
quit: bool;
init :: (window_title: string, window_width: u32, window_height: u32, fullscreen: bool) {
window = Coven.create_window(GAME_NAME, 1400, xx (1400.0*aspect), true);
renderer = Coven.create_renderer(window);
coven_init :: (window_title: string, window_width: u32, window_height: u32, fullscreen: bool) {
window = create_window(GAME_NAME, 1400, xx (1400.0*aspect), true);
renderer = create_renderer(window);
renderer.vsync = true;
init_input();
@@ -27,7 +27,7 @@ init :: (window_title: string, window_width: u32, window_height: u32, fullscreen
init_console();
}
run :: (update_func: (float)) {
coven_run :: (update_func: (float)) {
time = xx seconds_since_init();
while !quit {
@@ -56,4 +56,32 @@ run :: (update_func: (float)) {
SDL_DestroyWindow(window);
SDL_Quit();
}
}
#load "input/input.jai";
#load "networking/networking.jai";
#load "renderer/renderer.jai";
#load "windowing/window.jai";
#load "physics/physics.jai";
#load "core/string_helpers.jai";
#load "core/math.jai";
#load "core/ray.jai";
#load "animation/animator.jai";
#load "core/entity.jai";
#load "core/parray.jai";
#load "core/scene.jai";
#load "core/transform.jai";
#load "core/camera.jai";
#load "core/console.jai";
#load "audio/audio.jai";
#import "Bucket_Array";
#import "Basic";
#import "String";
#import "System";
#import "Flat_Pool";
#import "Hash_Table";
#import "File";
#import "File_Watcher";
#import "File_Utilities";

46
modules/fmod/first.jai Normal file
View File

@@ -0,0 +1,46 @@
#import "Basic";
#import "Compiler";
#import "BuildCpp";
#import "Check";
#import "Bindings_Generator";
#import "File";
#run {
set_build_options_dc(.{do_output=false});
if !generate_bindings() {
compiler_set_workspace_status(.FAILED);
}
}
generate_bindings :: () -> bool {
output_filename: string;
opts: Generate_Bindings_Options;
{
using opts;
//#if OS == .WINDOWS {
output_filename = "module.jai";
//} else #if OS == .LINUX {
// output_filename = "linux.jai";
//} else #if OS == .MACOS {
// // @ToDo: Determine dynamically? Customize?
// array_add(*system_include_paths, "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include");
// output_filename = "macos.jai";
//} else {
// assert(false);
//}
array_add(*libpaths, "lib/x64");
array_add(*libnames, "fmod");
array_add(*libnames, "fmodstudio");
array_add(*system_include_paths, GENERATOR_DEFAULT_SYSTEM_INCLUDE_PATH);
array_add(*source_files, "inc/fmod.h");
array_add(*source_files, "inc/fmod_studio.h");
array_add(*extra_clang_arguments, "-x", "c");
//strip_flags = 0;
generate_compile_time_struct_checks = false;
// strip_flags &= ~(Strip_Flags.CONSTRUCTORS | .DESTRUCTORS);
}
return generate_bindings(opts, output_filename);
}

4041
modules/fmod/inc/fmod.cs Normal file

File diff suppressed because it is too large Load Diff

668
modules/fmod/inc/fmod.h Normal file
View File

@@ -0,0 +1,668 @@
/* ======================================================================================== */
/* FMOD Core API - C header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* Use this header in conjunction with fmod_common.h (which contains all the constants / */
/* callbacks) to develop using the C interface */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/core-api.html */
/* ======================================================================================== */
#ifndef _FMOD_H
#define _FMOD_H
#include "fmod_common.h"
#ifdef __cplusplus
extern "C"
{
#endif
/*
FMOD global system functions (optional).
*/
FMOD_RESULT F_API FMOD_Memory_Initialize (void *poolmem, int poollen, FMOD_MEMORY_ALLOC_CALLBACK useralloc, FMOD_MEMORY_REALLOC_CALLBACK userrealloc, FMOD_MEMORY_FREE_CALLBACK userfree, FMOD_MEMORY_TYPE memtypeflags);
FMOD_RESULT F_API FMOD_Memory_GetStats (int *currentalloced, int *maxalloced, FMOD_BOOL blocking);
FMOD_RESULT F_API FMOD_Debug_Initialize (FMOD_DEBUG_FLAGS flags, FMOD_DEBUG_MODE mode, FMOD_DEBUG_CALLBACK callback, const char *filename);
FMOD_RESULT F_API FMOD_File_SetDiskBusy (int busy);
FMOD_RESULT F_API FMOD_File_GetDiskBusy (int *busy);
FMOD_RESULT F_API FMOD_Thread_SetAttributes (FMOD_THREAD_TYPE type, FMOD_THREAD_AFFINITY affinity, FMOD_THREAD_PRIORITY priority, FMOD_THREAD_STACK_SIZE stacksize);
/*
FMOD System factory functions. Use this to create an FMOD System Instance. below you will see FMOD_System_Init/Close to get started.
*/
FMOD_RESULT F_API FMOD_System_Create (FMOD_SYSTEM **system, unsigned int headerversion);
FMOD_RESULT F_API FMOD_System_Release (FMOD_SYSTEM *system);
/*
'System' API
*/
/* Setup functions. */
FMOD_RESULT F_API FMOD_System_SetOutput (FMOD_SYSTEM *system, FMOD_OUTPUTTYPE output);
FMOD_RESULT F_API FMOD_System_GetOutput (FMOD_SYSTEM *system, FMOD_OUTPUTTYPE *output);
FMOD_RESULT F_API FMOD_System_GetNumDrivers (FMOD_SYSTEM *system, int *numdrivers);
FMOD_RESULT F_API FMOD_System_GetDriverInfo (FMOD_SYSTEM *system, int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels);
FMOD_RESULT F_API FMOD_System_SetDriver (FMOD_SYSTEM *system, int driver);
FMOD_RESULT F_API FMOD_System_GetDriver (FMOD_SYSTEM *system, int *driver);
FMOD_RESULT F_API FMOD_System_SetSoftwareChannels (FMOD_SYSTEM *system, int numsoftwarechannels);
FMOD_RESULT F_API FMOD_System_GetSoftwareChannels (FMOD_SYSTEM *system, int *numsoftwarechannels);
FMOD_RESULT F_API FMOD_System_SetSoftwareFormat (FMOD_SYSTEM *system, int samplerate, FMOD_SPEAKERMODE speakermode, int numrawspeakers);
FMOD_RESULT F_API FMOD_System_GetSoftwareFormat (FMOD_SYSTEM *system, int *samplerate, FMOD_SPEAKERMODE *speakermode, int *numrawspeakers);
FMOD_RESULT F_API FMOD_System_SetDSPBufferSize (FMOD_SYSTEM *system, unsigned int bufferlength, int numbuffers);
FMOD_RESULT F_API FMOD_System_GetDSPBufferSize (FMOD_SYSTEM *system, unsigned int *bufferlength, int *numbuffers);
FMOD_RESULT F_API FMOD_System_SetFileSystem (FMOD_SYSTEM *system, FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek, FMOD_FILE_ASYNCREAD_CALLBACK userasyncread, FMOD_FILE_ASYNCCANCEL_CALLBACK userasynccancel, int blockalign);
FMOD_RESULT F_API FMOD_System_AttachFileSystem (FMOD_SYSTEM *system, FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek);
FMOD_RESULT F_API FMOD_System_SetAdvancedSettings (FMOD_SYSTEM *system, FMOD_ADVANCEDSETTINGS *settings);
FMOD_RESULT F_API FMOD_System_GetAdvancedSettings (FMOD_SYSTEM *system, FMOD_ADVANCEDSETTINGS *settings);
FMOD_RESULT F_API FMOD_System_SetCallback (FMOD_SYSTEM *system, FMOD_SYSTEM_CALLBACK callback, FMOD_SYSTEM_CALLBACK_TYPE callbackmask);
/* Plug-in support. */
FMOD_RESULT F_API FMOD_System_SetPluginPath (FMOD_SYSTEM *system, const char *path);
FMOD_RESULT F_API FMOD_System_LoadPlugin (FMOD_SYSTEM *system, const char *filename, unsigned int *handle, unsigned int priority);
FMOD_RESULT F_API FMOD_System_UnloadPlugin (FMOD_SYSTEM *system, unsigned int handle);
FMOD_RESULT F_API FMOD_System_GetNumNestedPlugins (FMOD_SYSTEM *system, unsigned int handle, int *count);
FMOD_RESULT F_API FMOD_System_GetNestedPlugin (FMOD_SYSTEM *system, unsigned int handle, int index, unsigned int *nestedhandle);
FMOD_RESULT F_API FMOD_System_GetNumPlugins (FMOD_SYSTEM *system, FMOD_PLUGINTYPE plugintype, int *numplugins);
FMOD_RESULT F_API FMOD_System_GetPluginHandle (FMOD_SYSTEM *system, FMOD_PLUGINTYPE plugintype, int index, unsigned int *handle);
FMOD_RESULT F_API FMOD_System_GetPluginInfo (FMOD_SYSTEM *system, unsigned int handle, FMOD_PLUGINTYPE *plugintype, char *name, int namelen, unsigned int *version);
FMOD_RESULT F_API FMOD_System_SetOutputByPlugin (FMOD_SYSTEM *system, unsigned int handle);
FMOD_RESULT F_API FMOD_System_GetOutputByPlugin (FMOD_SYSTEM *system, unsigned int *handle);
FMOD_RESULT F_API FMOD_System_CreateDSPByPlugin (FMOD_SYSTEM *system, unsigned int handle, FMOD_DSP **dsp);
FMOD_RESULT F_API FMOD_System_GetDSPInfoByPlugin (FMOD_SYSTEM *system, unsigned int handle, const FMOD_DSP_DESCRIPTION **description);
FMOD_RESULT F_API FMOD_System_RegisterCodec (FMOD_SYSTEM *system, FMOD_CODEC_DESCRIPTION *description, unsigned int *handle, unsigned int priority);
FMOD_RESULT F_API FMOD_System_RegisterDSP (FMOD_SYSTEM *system, const FMOD_DSP_DESCRIPTION *description, unsigned int *handle);
FMOD_RESULT F_API FMOD_System_RegisterOutput (FMOD_SYSTEM *system, const FMOD_OUTPUT_DESCRIPTION *description, unsigned int *handle);
/* Init/Close. */
FMOD_RESULT F_API FMOD_System_Init (FMOD_SYSTEM *system, int maxchannels, FMOD_INITFLAGS flags, void *extradriverdata);
FMOD_RESULT F_API FMOD_System_Close (FMOD_SYSTEM *system);
/* General post-init system functions. */
FMOD_RESULT F_API FMOD_System_Update (FMOD_SYSTEM *system);
FMOD_RESULT F_API FMOD_System_SetSpeakerPosition (FMOD_SYSTEM *system, FMOD_SPEAKER speaker, float x, float y, FMOD_BOOL active);
FMOD_RESULT F_API FMOD_System_GetSpeakerPosition (FMOD_SYSTEM *system, FMOD_SPEAKER speaker, float *x, float *y, FMOD_BOOL *active);
FMOD_RESULT F_API FMOD_System_SetStreamBufferSize (FMOD_SYSTEM *system, unsigned int filebuffersize, FMOD_TIMEUNIT filebuffersizetype);
FMOD_RESULT F_API FMOD_System_GetStreamBufferSize (FMOD_SYSTEM *system, unsigned int *filebuffersize, FMOD_TIMEUNIT *filebuffersizetype);
FMOD_RESULT F_API FMOD_System_Set3DSettings (FMOD_SYSTEM *system, float dopplerscale, float distancefactor, float rolloffscale);
FMOD_RESULT F_API FMOD_System_Get3DSettings (FMOD_SYSTEM *system, float *dopplerscale, float *distancefactor, float *rolloffscale);
FMOD_RESULT F_API FMOD_System_Set3DNumListeners (FMOD_SYSTEM *system, int numlisteners);
FMOD_RESULT F_API FMOD_System_Get3DNumListeners (FMOD_SYSTEM *system, int *numlisteners);
FMOD_RESULT F_API FMOD_System_Set3DListenerAttributes (FMOD_SYSTEM *system, int listener, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel, const FMOD_VECTOR *forward, const FMOD_VECTOR *up);
FMOD_RESULT F_API FMOD_System_Get3DListenerAttributes (FMOD_SYSTEM *system, int listener, FMOD_VECTOR *pos, FMOD_VECTOR *vel, FMOD_VECTOR *forward, FMOD_VECTOR *up);
FMOD_RESULT F_API FMOD_System_Set3DRolloffCallback (FMOD_SYSTEM *system, FMOD_3D_ROLLOFF_CALLBACK callback);
FMOD_RESULT F_API FMOD_System_MixerSuspend (FMOD_SYSTEM *system);
FMOD_RESULT F_API FMOD_System_MixerResume (FMOD_SYSTEM *system);
FMOD_RESULT F_API FMOD_System_GetDefaultMixMatrix (FMOD_SYSTEM *system, FMOD_SPEAKERMODE sourcespeakermode, FMOD_SPEAKERMODE targetspeakermode, float *matrix, int matrixhop);
FMOD_RESULT F_API FMOD_System_GetSpeakerModeChannels (FMOD_SYSTEM *system, FMOD_SPEAKERMODE mode, int *channels);
/* System information functions. */
FMOD_RESULT F_API FMOD_System_GetVersion (FMOD_SYSTEM *system, unsigned int *version);
FMOD_RESULT F_API FMOD_System_GetOutputHandle (FMOD_SYSTEM *system, void **handle);
FMOD_RESULT F_API FMOD_System_GetChannelsPlaying (FMOD_SYSTEM *system, int *channels, int *realchannels);
FMOD_RESULT F_API FMOD_System_GetCPUUsage (FMOD_SYSTEM *system, FMOD_CPU_USAGE *usage);
FMOD_RESULT F_API FMOD_System_GetFileUsage (FMOD_SYSTEM *system, long long *sampleBytesRead, long long *streamBytesRead, long long *otherBytesRead);
/* Sound/DSP/Channel/FX creation and retrieval. */
FMOD_RESULT F_API FMOD_System_CreateSound (FMOD_SYSTEM *system, const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, FMOD_SOUND **sound);
FMOD_RESULT F_API FMOD_System_CreateStream (FMOD_SYSTEM *system, const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, FMOD_SOUND **sound);
FMOD_RESULT F_API FMOD_System_CreateDSP (FMOD_SYSTEM *system, const FMOD_DSP_DESCRIPTION *description, FMOD_DSP **dsp);
FMOD_RESULT F_API FMOD_System_CreateDSPByType (FMOD_SYSTEM *system, FMOD_DSP_TYPE type, FMOD_DSP **dsp);
FMOD_RESULT F_API FMOD_System_CreateChannelGroup (FMOD_SYSTEM *system, const char *name, FMOD_CHANNELGROUP **channelgroup);
FMOD_RESULT F_API FMOD_System_CreateSoundGroup (FMOD_SYSTEM *system, const char *name, FMOD_SOUNDGROUP **soundgroup);
FMOD_RESULT F_API FMOD_System_CreateReverb3D (FMOD_SYSTEM *system, FMOD_REVERB3D **reverb);
FMOD_RESULT F_API FMOD_System_PlaySound (FMOD_SYSTEM *system, FMOD_SOUND *sound, FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL paused, FMOD_CHANNEL **channel);
FMOD_RESULT F_API FMOD_System_PlayDSP (FMOD_SYSTEM *system, FMOD_DSP *dsp, FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL paused, FMOD_CHANNEL **channel);
FMOD_RESULT F_API FMOD_System_GetChannel (FMOD_SYSTEM *system, int channelid, FMOD_CHANNEL **channel);
FMOD_RESULT F_API FMOD_System_GetDSPInfoByType (FMOD_SYSTEM *system, FMOD_DSP_TYPE type, const FMOD_DSP_DESCRIPTION **description);
FMOD_RESULT F_API FMOD_System_GetMasterChannelGroup (FMOD_SYSTEM *system, FMOD_CHANNELGROUP **channelgroup);
FMOD_RESULT F_API FMOD_System_GetMasterSoundGroup (FMOD_SYSTEM *system, FMOD_SOUNDGROUP **soundgroup);
/* Routing to ports. */
FMOD_RESULT F_API FMOD_System_AttachChannelGroupToPort (FMOD_SYSTEM *system, FMOD_PORT_TYPE portType, FMOD_PORT_INDEX portIndex, FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL passThru);
FMOD_RESULT F_API FMOD_System_DetachChannelGroupFromPort(FMOD_SYSTEM *system, FMOD_CHANNELGROUP *channelgroup);
/* Reverb API. */
FMOD_RESULT F_API FMOD_System_SetReverbProperties (FMOD_SYSTEM *system, int instance, const FMOD_REVERB_PROPERTIES *prop);
FMOD_RESULT F_API FMOD_System_GetReverbProperties (FMOD_SYSTEM *system, int instance, FMOD_REVERB_PROPERTIES *prop);
/* System level DSP functionality. */
FMOD_RESULT F_API FMOD_System_LockDSP (FMOD_SYSTEM *system);
FMOD_RESULT F_API FMOD_System_UnlockDSP (FMOD_SYSTEM *system);
/* Recording API. */
FMOD_RESULT F_API FMOD_System_GetRecordNumDrivers (FMOD_SYSTEM *system, int *numdrivers, int *numconnected);
FMOD_RESULT F_API FMOD_System_GetRecordDriverInfo (FMOD_SYSTEM *system, int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels, FMOD_DRIVER_STATE *state);
FMOD_RESULT F_API FMOD_System_GetRecordPosition (FMOD_SYSTEM *system, int id, unsigned int *position);
FMOD_RESULT F_API FMOD_System_RecordStart (FMOD_SYSTEM *system, int id, FMOD_SOUND *sound, FMOD_BOOL loop);
FMOD_RESULT F_API FMOD_System_RecordStop (FMOD_SYSTEM *system, int id);
FMOD_RESULT F_API FMOD_System_IsRecording (FMOD_SYSTEM *system, int id, FMOD_BOOL *recording);
/* Geometry API. */
FMOD_RESULT F_API FMOD_System_CreateGeometry (FMOD_SYSTEM *system, int maxpolygons, int maxvertices, FMOD_GEOMETRY **geometry);
FMOD_RESULT F_API FMOD_System_SetGeometrySettings (FMOD_SYSTEM *system, float maxworldsize);
FMOD_RESULT F_API FMOD_System_GetGeometrySettings (FMOD_SYSTEM *system, float *maxworldsize);
FMOD_RESULT F_API FMOD_System_LoadGeometry (FMOD_SYSTEM *system, const void *data, int datasize, FMOD_GEOMETRY **geometry);
FMOD_RESULT F_API FMOD_System_GetGeometryOcclusion (FMOD_SYSTEM *system, const FMOD_VECTOR *listener, const FMOD_VECTOR *source, float *direct, float *reverb);
/* Network functions. */
FMOD_RESULT F_API FMOD_System_SetNetworkProxy (FMOD_SYSTEM *system, const char *proxy);
FMOD_RESULT F_API FMOD_System_GetNetworkProxy (FMOD_SYSTEM *system, char *proxy, int proxylen);
FMOD_RESULT F_API FMOD_System_SetNetworkTimeout (FMOD_SYSTEM *system, int timeout);
FMOD_RESULT F_API FMOD_System_GetNetworkTimeout (FMOD_SYSTEM *system, int *timeout);
/* Userdata set/get. */
FMOD_RESULT F_API FMOD_System_SetUserData (FMOD_SYSTEM *system, void *userdata);
FMOD_RESULT F_API FMOD_System_GetUserData (FMOD_SYSTEM *system, void **userdata);
/* Sound API
*/
FMOD_RESULT F_API FMOD_Sound_Release (FMOD_SOUND *sound);
FMOD_RESULT F_API FMOD_Sound_GetSystemObject (FMOD_SOUND *sound, FMOD_SYSTEM **system);
/*
Standard sound manipulation functions.
*/
FMOD_RESULT F_API FMOD_Sound_Lock (FMOD_SOUND *sound, unsigned int offset, unsigned int length, void **ptr1, void **ptr2, unsigned int *len1, unsigned int *len2);
FMOD_RESULT F_API FMOD_Sound_Unlock (FMOD_SOUND *sound, void *ptr1, void *ptr2, unsigned int len1, unsigned int len2);
FMOD_RESULT F_API FMOD_Sound_SetDefaults (FMOD_SOUND *sound, float frequency, int priority);
FMOD_RESULT F_API FMOD_Sound_GetDefaults (FMOD_SOUND *sound, float *frequency, int *priority);
FMOD_RESULT F_API FMOD_Sound_Set3DMinMaxDistance (FMOD_SOUND *sound, float min, float max);
FMOD_RESULT F_API FMOD_Sound_Get3DMinMaxDistance (FMOD_SOUND *sound, float *min, float *max);
FMOD_RESULT F_API FMOD_Sound_Set3DConeSettings (FMOD_SOUND *sound, float insideconeangle, float outsideconeangle, float outsidevolume);
FMOD_RESULT F_API FMOD_Sound_Get3DConeSettings (FMOD_SOUND *sound, float *insideconeangle, float *outsideconeangle, float *outsidevolume);
FMOD_RESULT F_API FMOD_Sound_Set3DCustomRolloff (FMOD_SOUND *sound, FMOD_VECTOR *points, int numpoints);
FMOD_RESULT F_API FMOD_Sound_Get3DCustomRolloff (FMOD_SOUND *sound, FMOD_VECTOR **points, int *numpoints);
FMOD_RESULT F_API FMOD_Sound_GetSubSound (FMOD_SOUND *sound, int index, FMOD_SOUND **subsound);
FMOD_RESULT F_API FMOD_Sound_GetSubSoundParent (FMOD_SOUND *sound, FMOD_SOUND **parentsound);
FMOD_RESULT F_API FMOD_Sound_GetName (FMOD_SOUND *sound, char *name, int namelen);
FMOD_RESULT F_API FMOD_Sound_GetLength (FMOD_SOUND *sound, unsigned int *length, FMOD_TIMEUNIT lengthtype);
FMOD_RESULT F_API FMOD_Sound_GetFormat (FMOD_SOUND *sound, FMOD_SOUND_TYPE *type, FMOD_SOUND_FORMAT *format, int *channels, int *bits);
FMOD_RESULT F_API FMOD_Sound_GetNumSubSounds (FMOD_SOUND *sound, int *numsubsounds);
FMOD_RESULT F_API FMOD_Sound_GetNumTags (FMOD_SOUND *sound, int *numtags, int *numtagsupdated);
FMOD_RESULT F_API FMOD_Sound_GetTag (FMOD_SOUND *sound, const char *name, int index, FMOD_TAG *tag);
FMOD_RESULT F_API FMOD_Sound_GetOpenState (FMOD_SOUND *sound, FMOD_OPENSTATE *openstate, unsigned int *percentbuffered, FMOD_BOOL *starving, FMOD_BOOL *diskbusy);
FMOD_RESULT F_API FMOD_Sound_ReadData (FMOD_SOUND *sound, void *buffer, unsigned int length, unsigned int *read);
FMOD_RESULT F_API FMOD_Sound_SeekData (FMOD_SOUND *sound, unsigned int pcm);
FMOD_RESULT F_API FMOD_Sound_SetSoundGroup (FMOD_SOUND *sound, FMOD_SOUNDGROUP *soundgroup);
FMOD_RESULT F_API FMOD_Sound_GetSoundGroup (FMOD_SOUND *sound, FMOD_SOUNDGROUP **soundgroup);
/*
Synchronization point API. These points can come from markers embedded in wav files, and can also generate channel callbacks.
*/
FMOD_RESULT F_API FMOD_Sound_GetNumSyncPoints (FMOD_SOUND *sound, int *numsyncpoints);
FMOD_RESULT F_API FMOD_Sound_GetSyncPoint (FMOD_SOUND *sound, int index, FMOD_SYNCPOINT **point);
FMOD_RESULT F_API FMOD_Sound_GetSyncPointInfo (FMOD_SOUND *sound, FMOD_SYNCPOINT *point, char *name, int namelen, unsigned int *offset, FMOD_TIMEUNIT offsettype);
FMOD_RESULT F_API FMOD_Sound_AddSyncPoint (FMOD_SOUND *sound, unsigned int offset, FMOD_TIMEUNIT offsettype, const char *name, FMOD_SYNCPOINT **point);
FMOD_RESULT F_API FMOD_Sound_DeleteSyncPoint (FMOD_SOUND *sound, FMOD_SYNCPOINT *point);
/*
Functions also in Channel class but here they are the 'default' to save having to change it in Channel all the time.
*/
FMOD_RESULT F_API FMOD_Sound_SetMode (FMOD_SOUND *sound, FMOD_MODE mode);
FMOD_RESULT F_API FMOD_Sound_GetMode (FMOD_SOUND *sound, FMOD_MODE *mode);
FMOD_RESULT F_API FMOD_Sound_SetLoopCount (FMOD_SOUND *sound, int loopcount);
FMOD_RESULT F_API FMOD_Sound_GetLoopCount (FMOD_SOUND *sound, int *loopcount);
FMOD_RESULT F_API FMOD_Sound_SetLoopPoints (FMOD_SOUND *sound, unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype);
FMOD_RESULT F_API FMOD_Sound_GetLoopPoints (FMOD_SOUND *sound, unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype);
/*
For MOD/S3M/XM/IT/MID sequenced formats only.
*/
FMOD_RESULT F_API FMOD_Sound_GetMusicNumChannels (FMOD_SOUND *sound, int *numchannels);
FMOD_RESULT F_API FMOD_Sound_SetMusicChannelVolume (FMOD_SOUND *sound, int channel, float volume);
FMOD_RESULT F_API FMOD_Sound_GetMusicChannelVolume (FMOD_SOUND *sound, int channel, float *volume);
FMOD_RESULT F_API FMOD_Sound_SetMusicSpeed (FMOD_SOUND *sound, float speed);
FMOD_RESULT F_API FMOD_Sound_GetMusicSpeed (FMOD_SOUND *sound, float *speed);
/*
Userdata set/get.
*/
FMOD_RESULT F_API FMOD_Sound_SetUserData (FMOD_SOUND *sound, void *userdata);
FMOD_RESULT F_API FMOD_Sound_GetUserData (FMOD_SOUND *sound, void **userdata);
/*
'Channel' API
*/
FMOD_RESULT F_API FMOD_Channel_GetSystemObject (FMOD_CHANNEL *channel, FMOD_SYSTEM **system);
/*
General control functionality for Channels and ChannelGroups.
*/
FMOD_RESULT F_API FMOD_Channel_Stop (FMOD_CHANNEL *channel);
FMOD_RESULT F_API FMOD_Channel_SetPaused (FMOD_CHANNEL *channel, FMOD_BOOL paused);
FMOD_RESULT F_API FMOD_Channel_GetPaused (FMOD_CHANNEL *channel, FMOD_BOOL *paused);
FMOD_RESULT F_API FMOD_Channel_SetVolume (FMOD_CHANNEL *channel, float volume);
FMOD_RESULT F_API FMOD_Channel_GetVolume (FMOD_CHANNEL *channel, float *volume);
FMOD_RESULT F_API FMOD_Channel_SetVolumeRamp (FMOD_CHANNEL *channel, FMOD_BOOL ramp);
FMOD_RESULT F_API FMOD_Channel_GetVolumeRamp (FMOD_CHANNEL *channel, FMOD_BOOL *ramp);
FMOD_RESULT F_API FMOD_Channel_GetAudibility (FMOD_CHANNEL *channel, float *audibility);
FMOD_RESULT F_API FMOD_Channel_SetPitch (FMOD_CHANNEL *channel, float pitch);
FMOD_RESULT F_API FMOD_Channel_GetPitch (FMOD_CHANNEL *channel, float *pitch);
FMOD_RESULT F_API FMOD_Channel_SetMute (FMOD_CHANNEL *channel, FMOD_BOOL mute);
FMOD_RESULT F_API FMOD_Channel_GetMute (FMOD_CHANNEL *channel, FMOD_BOOL *mute);
FMOD_RESULT F_API FMOD_Channel_SetReverbProperties (FMOD_CHANNEL *channel, int instance, float wet);
FMOD_RESULT F_API FMOD_Channel_GetReverbProperties (FMOD_CHANNEL *channel, int instance, float *wet);
FMOD_RESULT F_API FMOD_Channel_SetLowPassGain (FMOD_CHANNEL *channel, float gain);
FMOD_RESULT F_API FMOD_Channel_GetLowPassGain (FMOD_CHANNEL *channel, float *gain);
FMOD_RESULT F_API FMOD_Channel_SetMode (FMOD_CHANNEL *channel, FMOD_MODE mode);
FMOD_RESULT F_API FMOD_Channel_GetMode (FMOD_CHANNEL *channel, FMOD_MODE *mode);
FMOD_RESULT F_API FMOD_Channel_SetCallback (FMOD_CHANNEL *channel, FMOD_CHANNELCONTROL_CALLBACK callback);
FMOD_RESULT F_API FMOD_Channel_IsPlaying (FMOD_CHANNEL *channel, FMOD_BOOL *isplaying);
/*
Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values.
*/
FMOD_RESULT F_API FMOD_Channel_SetPan (FMOD_CHANNEL *channel, float pan);
FMOD_RESULT F_API FMOD_Channel_SetMixLevelsOutput (FMOD_CHANNEL *channel, float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright);
FMOD_RESULT F_API FMOD_Channel_SetMixLevelsInput (FMOD_CHANNEL *channel, float *levels, int numlevels);
FMOD_RESULT F_API FMOD_Channel_SetMixMatrix (FMOD_CHANNEL *channel, float *matrix, int outchannels, int inchannels, int inchannel_hop);
FMOD_RESULT F_API FMOD_Channel_GetMixMatrix (FMOD_CHANNEL *channel, float *matrix, int *outchannels, int *inchannels, int inchannel_hop);
/*
Clock based functionality.
*/
FMOD_RESULT F_API FMOD_Channel_GetDSPClock (FMOD_CHANNEL *channel, unsigned long long *dspclock, unsigned long long *parentclock);
FMOD_RESULT F_API FMOD_Channel_SetDelay (FMOD_CHANNEL *channel, unsigned long long dspclock_start, unsigned long long dspclock_end, FMOD_BOOL stopchannels);
FMOD_RESULT F_API FMOD_Channel_GetDelay (FMOD_CHANNEL *channel, unsigned long long *dspclock_start, unsigned long long *dspclock_end, FMOD_BOOL *stopchannels);
FMOD_RESULT F_API FMOD_Channel_AddFadePoint (FMOD_CHANNEL *channel, unsigned long long dspclock, float volume);
FMOD_RESULT F_API FMOD_Channel_SetFadePointRamp (FMOD_CHANNEL *channel, unsigned long long dspclock, float volume);
FMOD_RESULT F_API FMOD_Channel_RemoveFadePoints (FMOD_CHANNEL *channel, unsigned long long dspclock_start, unsigned long long dspclock_end);
FMOD_RESULT F_API FMOD_Channel_GetFadePoints (FMOD_CHANNEL *channel, unsigned int *numpoints, unsigned long long *point_dspclock, float *point_volume);
/*
DSP effects.
*/
FMOD_RESULT F_API FMOD_Channel_GetDSP (FMOD_CHANNEL *channel, int index, FMOD_DSP **dsp);
FMOD_RESULT F_API FMOD_Channel_AddDSP (FMOD_CHANNEL *channel, int index, FMOD_DSP *dsp);
FMOD_RESULT F_API FMOD_Channel_RemoveDSP (FMOD_CHANNEL *channel, FMOD_DSP *dsp);
FMOD_RESULT F_API FMOD_Channel_GetNumDSPs (FMOD_CHANNEL *channel, int *numdsps);
FMOD_RESULT F_API FMOD_Channel_SetDSPIndex (FMOD_CHANNEL *channel, FMOD_DSP *dsp, int index);
FMOD_RESULT F_API FMOD_Channel_GetDSPIndex (FMOD_CHANNEL *channel, FMOD_DSP *dsp, int *index);
/*
3D functionality.
*/
FMOD_RESULT F_API FMOD_Channel_Set3DAttributes (FMOD_CHANNEL *channel, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel);
FMOD_RESULT F_API FMOD_Channel_Get3DAttributes (FMOD_CHANNEL *channel, FMOD_VECTOR *pos, FMOD_VECTOR *vel);
FMOD_RESULT F_API FMOD_Channel_Set3DMinMaxDistance (FMOD_CHANNEL *channel, float mindistance, float maxdistance);
FMOD_RESULT F_API FMOD_Channel_Get3DMinMaxDistance (FMOD_CHANNEL *channel, float *mindistance, float *maxdistance);
FMOD_RESULT F_API FMOD_Channel_Set3DConeSettings (FMOD_CHANNEL *channel, float insideconeangle, float outsideconeangle, float outsidevolume);
FMOD_RESULT F_API FMOD_Channel_Get3DConeSettings (FMOD_CHANNEL *channel, float *insideconeangle, float *outsideconeangle, float *outsidevolume);
FMOD_RESULT F_API FMOD_Channel_Set3DConeOrientation (FMOD_CHANNEL *channel, FMOD_VECTOR *orientation);
FMOD_RESULT F_API FMOD_Channel_Get3DConeOrientation (FMOD_CHANNEL *channel, FMOD_VECTOR *orientation);
FMOD_RESULT F_API FMOD_Channel_Set3DCustomRolloff (FMOD_CHANNEL *channel, FMOD_VECTOR *points, int numpoints);
FMOD_RESULT F_API FMOD_Channel_Get3DCustomRolloff (FMOD_CHANNEL *channel, FMOD_VECTOR **points, int *numpoints);
FMOD_RESULT F_API FMOD_Channel_Set3DOcclusion (FMOD_CHANNEL *channel, float directocclusion, float reverbocclusion);
FMOD_RESULT F_API FMOD_Channel_Get3DOcclusion (FMOD_CHANNEL *channel, float *directocclusion, float *reverbocclusion);
FMOD_RESULT F_API FMOD_Channel_Set3DSpread (FMOD_CHANNEL *channel, float angle);
FMOD_RESULT F_API FMOD_Channel_Get3DSpread (FMOD_CHANNEL *channel, float *angle);
FMOD_RESULT F_API FMOD_Channel_Set3DLevel (FMOD_CHANNEL *channel, float level);
FMOD_RESULT F_API FMOD_Channel_Get3DLevel (FMOD_CHANNEL *channel, float *level);
FMOD_RESULT F_API FMOD_Channel_Set3DDopplerLevel (FMOD_CHANNEL *channel, float level);
FMOD_RESULT F_API FMOD_Channel_Get3DDopplerLevel (FMOD_CHANNEL *channel, float *level);
FMOD_RESULT F_API FMOD_Channel_Set3DDistanceFilter (FMOD_CHANNEL *channel, FMOD_BOOL custom, float customLevel, float centerFreq);
FMOD_RESULT F_API FMOD_Channel_Get3DDistanceFilter (FMOD_CHANNEL *channel, FMOD_BOOL *custom, float *customLevel, float *centerFreq);
/*
Userdata set/get.
*/
FMOD_RESULT F_API FMOD_Channel_SetUserData (FMOD_CHANNEL *channel, void *userdata);
FMOD_RESULT F_API FMOD_Channel_GetUserData (FMOD_CHANNEL *channel, void **userdata);
/*
Channel specific control functionality.
*/
FMOD_RESULT F_API FMOD_Channel_SetFrequency (FMOD_CHANNEL *channel, float frequency);
FMOD_RESULT F_API FMOD_Channel_GetFrequency (FMOD_CHANNEL *channel, float *frequency);
FMOD_RESULT F_API FMOD_Channel_SetPriority (FMOD_CHANNEL *channel, int priority);
FMOD_RESULT F_API FMOD_Channel_GetPriority (FMOD_CHANNEL *channel, int *priority);
FMOD_RESULT F_API FMOD_Channel_SetPosition (FMOD_CHANNEL *channel, unsigned int position, FMOD_TIMEUNIT postype);
FMOD_RESULT F_API FMOD_Channel_GetPosition (FMOD_CHANNEL *channel, unsigned int *position, FMOD_TIMEUNIT postype);
FMOD_RESULT F_API FMOD_Channel_SetChannelGroup (FMOD_CHANNEL *channel, FMOD_CHANNELGROUP *channelgroup);
FMOD_RESULT F_API FMOD_Channel_GetChannelGroup (FMOD_CHANNEL *channel, FMOD_CHANNELGROUP **channelgroup);
FMOD_RESULT F_API FMOD_Channel_SetLoopCount (FMOD_CHANNEL *channel, int loopcount);
FMOD_RESULT F_API FMOD_Channel_GetLoopCount (FMOD_CHANNEL *channel, int *loopcount);
FMOD_RESULT F_API FMOD_Channel_SetLoopPoints (FMOD_CHANNEL *channel, unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype);
FMOD_RESULT F_API FMOD_Channel_GetLoopPoints (FMOD_CHANNEL *channel, unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype);
/*
Information only functions.
*/
FMOD_RESULT F_API FMOD_Channel_IsVirtual (FMOD_CHANNEL *channel, FMOD_BOOL *isvirtual);
FMOD_RESULT F_API FMOD_Channel_GetCurrentSound (FMOD_CHANNEL *channel, FMOD_SOUND **sound);
FMOD_RESULT F_API FMOD_Channel_GetIndex (FMOD_CHANNEL *channel, int *index);
/*
'ChannelGroup' API
*/
FMOD_RESULT F_API FMOD_ChannelGroup_GetSystemObject (FMOD_CHANNELGROUP *channelgroup, FMOD_SYSTEM **system);
/*
General control functionality for Channels and ChannelGroups.
*/
FMOD_RESULT F_API FMOD_ChannelGroup_Stop (FMOD_CHANNELGROUP *channelgroup);
FMOD_RESULT F_API FMOD_ChannelGroup_SetPaused (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL paused);
FMOD_RESULT F_API FMOD_ChannelGroup_GetPaused (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *paused);
FMOD_RESULT F_API FMOD_ChannelGroup_SetVolume (FMOD_CHANNELGROUP *channelgroup, float volume);
FMOD_RESULT F_API FMOD_ChannelGroup_GetVolume (FMOD_CHANNELGROUP *channelgroup, float *volume);
FMOD_RESULT F_API FMOD_ChannelGroup_SetVolumeRamp (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL ramp);
FMOD_RESULT F_API FMOD_ChannelGroup_GetVolumeRamp (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *ramp);
FMOD_RESULT F_API FMOD_ChannelGroup_GetAudibility (FMOD_CHANNELGROUP *channelgroup, float *audibility);
FMOD_RESULT F_API FMOD_ChannelGroup_SetPitch (FMOD_CHANNELGROUP *channelgroup, float pitch);
FMOD_RESULT F_API FMOD_ChannelGroup_GetPitch (FMOD_CHANNELGROUP *channelgroup, float *pitch);
FMOD_RESULT F_API FMOD_ChannelGroup_SetMute (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL mute);
FMOD_RESULT F_API FMOD_ChannelGroup_GetMute (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *mute);
FMOD_RESULT F_API FMOD_ChannelGroup_SetReverbProperties (FMOD_CHANNELGROUP *channelgroup, int instance, float wet);
FMOD_RESULT F_API FMOD_ChannelGroup_GetReverbProperties (FMOD_CHANNELGROUP *channelgroup, int instance, float *wet);
FMOD_RESULT F_API FMOD_ChannelGroup_SetLowPassGain (FMOD_CHANNELGROUP *channelgroup, float gain);
FMOD_RESULT F_API FMOD_ChannelGroup_GetLowPassGain (FMOD_CHANNELGROUP *channelgroup, float *gain);
FMOD_RESULT F_API FMOD_ChannelGroup_SetMode (FMOD_CHANNELGROUP *channelgroup, FMOD_MODE mode);
FMOD_RESULT F_API FMOD_ChannelGroup_GetMode (FMOD_CHANNELGROUP *channelgroup, FMOD_MODE *mode);
FMOD_RESULT F_API FMOD_ChannelGroup_SetCallback (FMOD_CHANNELGROUP *channelgroup, FMOD_CHANNELCONTROL_CALLBACK callback);
FMOD_RESULT F_API FMOD_ChannelGroup_IsPlaying (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *isplaying);
/*
Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values.
*/
FMOD_RESULT F_API FMOD_ChannelGroup_SetPan (FMOD_CHANNELGROUP *channelgroup, float pan);
FMOD_RESULT F_API FMOD_ChannelGroup_SetMixLevelsOutput (FMOD_CHANNELGROUP *channelgroup, float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright);
FMOD_RESULT F_API FMOD_ChannelGroup_SetMixLevelsInput (FMOD_CHANNELGROUP *channelgroup, float *levels, int numlevels);
FMOD_RESULT F_API FMOD_ChannelGroup_SetMixMatrix (FMOD_CHANNELGROUP *channelgroup, float *matrix, int outchannels, int inchannels, int inchannel_hop);
FMOD_RESULT F_API FMOD_ChannelGroup_GetMixMatrix (FMOD_CHANNELGROUP *channelgroup, float *matrix, int *outchannels, int *inchannels, int inchannel_hop);
/*
Clock based functionality.
*/
FMOD_RESULT F_API FMOD_ChannelGroup_GetDSPClock (FMOD_CHANNELGROUP *channelgroup, unsigned long long *dspclock, unsigned long long *parentclock);
FMOD_RESULT F_API FMOD_ChannelGroup_SetDelay (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock_start, unsigned long long dspclock_end, FMOD_BOOL stopchannels);
FMOD_RESULT F_API FMOD_ChannelGroup_GetDelay (FMOD_CHANNELGROUP *channelgroup, unsigned long long *dspclock_start, unsigned long long *dspclock_end, FMOD_BOOL *stopchannels);
FMOD_RESULT F_API FMOD_ChannelGroup_AddFadePoint (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock, float volume);
FMOD_RESULT F_API FMOD_ChannelGroup_SetFadePointRamp (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock, float volume);
FMOD_RESULT F_API FMOD_ChannelGroup_RemoveFadePoints (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock_start, unsigned long long dspclock_end);
FMOD_RESULT F_API FMOD_ChannelGroup_GetFadePoints (FMOD_CHANNELGROUP *channelgroup, unsigned int *numpoints, unsigned long long *point_dspclock, float *point_volume);
/*
DSP effects.
*/
FMOD_RESULT F_API FMOD_ChannelGroup_GetDSP (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_DSP **dsp);
FMOD_RESULT F_API FMOD_ChannelGroup_AddDSP (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_DSP *dsp);
FMOD_RESULT F_API FMOD_ChannelGroup_RemoveDSP (FMOD_CHANNELGROUP *channelgroup, FMOD_DSP *dsp);
FMOD_RESULT F_API FMOD_ChannelGroup_GetNumDSPs (FMOD_CHANNELGROUP *channelgroup, int *numdsps);
FMOD_RESULT F_API FMOD_ChannelGroup_SetDSPIndex (FMOD_CHANNELGROUP *channelgroup, FMOD_DSP *dsp, int index);
FMOD_RESULT F_API FMOD_ChannelGroup_GetDSPIndex (FMOD_CHANNELGROUP *channelgroup, FMOD_DSP *dsp, int *index);
/*
3D functionality.
*/
FMOD_RESULT F_API FMOD_ChannelGroup_Set3DAttributes (FMOD_CHANNELGROUP *channelgroup, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel);
FMOD_RESULT F_API FMOD_ChannelGroup_Get3DAttributes (FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *pos, FMOD_VECTOR *vel);
FMOD_RESULT F_API FMOD_ChannelGroup_Set3DMinMaxDistance (FMOD_CHANNELGROUP *channelgroup, float mindistance, float maxdistance);
FMOD_RESULT F_API FMOD_ChannelGroup_Get3DMinMaxDistance (FMOD_CHANNELGROUP *channelgroup, float *mindistance, float *maxdistance);
FMOD_RESULT F_API FMOD_ChannelGroup_Set3DConeSettings (FMOD_CHANNELGROUP *channelgroup, float insideconeangle, float outsideconeangle, float outsidevolume);
FMOD_RESULT F_API FMOD_ChannelGroup_Get3DConeSettings (FMOD_CHANNELGROUP *channelgroup, float *insideconeangle, float *outsideconeangle, float *outsidevolume);
FMOD_RESULT F_API FMOD_ChannelGroup_Set3DConeOrientation(FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *orientation);
FMOD_RESULT F_API FMOD_ChannelGroup_Get3DConeOrientation(FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *orientation);
FMOD_RESULT F_API FMOD_ChannelGroup_Set3DCustomRolloff (FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *points, int numpoints);
FMOD_RESULT F_API FMOD_ChannelGroup_Get3DCustomRolloff (FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR **points, int *numpoints);
FMOD_RESULT F_API FMOD_ChannelGroup_Set3DOcclusion (FMOD_CHANNELGROUP *channelgroup, float directocclusion, float reverbocclusion);
FMOD_RESULT F_API FMOD_ChannelGroup_Get3DOcclusion (FMOD_CHANNELGROUP *channelgroup, float *directocclusion, float *reverbocclusion);
FMOD_RESULT F_API FMOD_ChannelGroup_Set3DSpread (FMOD_CHANNELGROUP *channelgroup, float angle);
FMOD_RESULT F_API FMOD_ChannelGroup_Get3DSpread (FMOD_CHANNELGROUP *channelgroup, float *angle);
FMOD_RESULT F_API FMOD_ChannelGroup_Set3DLevel (FMOD_CHANNELGROUP *channelgroup, float level);
FMOD_RESULT F_API FMOD_ChannelGroup_Get3DLevel (FMOD_CHANNELGROUP *channelgroup, float *level);
FMOD_RESULT F_API FMOD_ChannelGroup_Set3DDopplerLevel (FMOD_CHANNELGROUP *channelgroup, float level);
FMOD_RESULT F_API FMOD_ChannelGroup_Get3DDopplerLevel (FMOD_CHANNELGROUP *channelgroup, float *level);
FMOD_RESULT F_API FMOD_ChannelGroup_Set3DDistanceFilter (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL custom, float customLevel, float centerFreq);
FMOD_RESULT F_API FMOD_ChannelGroup_Get3DDistanceFilter (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *custom, float *customLevel, float *centerFreq);
/*
Userdata set/get.
*/
FMOD_RESULT F_API FMOD_ChannelGroup_SetUserData (FMOD_CHANNELGROUP *channelgroup, void *userdata);
FMOD_RESULT F_API FMOD_ChannelGroup_GetUserData (FMOD_CHANNELGROUP *channelgroup, void **userdata);
FMOD_RESULT F_API FMOD_ChannelGroup_Release (FMOD_CHANNELGROUP *channelgroup);
/*
Nested channel groups.
*/
FMOD_RESULT F_API FMOD_ChannelGroup_AddGroup (FMOD_CHANNELGROUP *channelgroup, FMOD_CHANNELGROUP *group, FMOD_BOOL propagatedspclock, FMOD_DSPCONNECTION **connection);
FMOD_RESULT F_API FMOD_ChannelGroup_GetNumGroups (FMOD_CHANNELGROUP *channelgroup, int *numgroups);
FMOD_RESULT F_API FMOD_ChannelGroup_GetGroup (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_CHANNELGROUP **group);
FMOD_RESULT F_API FMOD_ChannelGroup_GetParentGroup (FMOD_CHANNELGROUP *channelgroup, FMOD_CHANNELGROUP **group);
/*
Information only functions.
*/
FMOD_RESULT F_API FMOD_ChannelGroup_GetName (FMOD_CHANNELGROUP *channelgroup, char *name, int namelen);
FMOD_RESULT F_API FMOD_ChannelGroup_GetNumChannels (FMOD_CHANNELGROUP *channelgroup, int *numchannels);
FMOD_RESULT F_API FMOD_ChannelGroup_GetChannel (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_CHANNEL **channel);
/*
'SoundGroup' API
*/
FMOD_RESULT F_API FMOD_SoundGroup_Release (FMOD_SOUNDGROUP *soundgroup);
FMOD_RESULT F_API FMOD_SoundGroup_GetSystemObject (FMOD_SOUNDGROUP *soundgroup, FMOD_SYSTEM **system);
/*
SoundGroup control functions.
*/
FMOD_RESULT F_API FMOD_SoundGroup_SetMaxAudible (FMOD_SOUNDGROUP *soundgroup, int maxaudible);
FMOD_RESULT F_API FMOD_SoundGroup_GetMaxAudible (FMOD_SOUNDGROUP *soundgroup, int *maxaudible);
FMOD_RESULT F_API FMOD_SoundGroup_SetMaxAudibleBehavior (FMOD_SOUNDGROUP *soundgroup, FMOD_SOUNDGROUP_BEHAVIOR behavior);
FMOD_RESULT F_API FMOD_SoundGroup_GetMaxAudibleBehavior (FMOD_SOUNDGROUP *soundgroup, FMOD_SOUNDGROUP_BEHAVIOR *behavior);
FMOD_RESULT F_API FMOD_SoundGroup_SetMuteFadeSpeed (FMOD_SOUNDGROUP *soundgroup, float speed);
FMOD_RESULT F_API FMOD_SoundGroup_GetMuteFadeSpeed (FMOD_SOUNDGROUP *soundgroup, float *speed);
FMOD_RESULT F_API FMOD_SoundGroup_SetVolume (FMOD_SOUNDGROUP *soundgroup, float volume);
FMOD_RESULT F_API FMOD_SoundGroup_GetVolume (FMOD_SOUNDGROUP *soundgroup, float *volume);
FMOD_RESULT F_API FMOD_SoundGroup_Stop (FMOD_SOUNDGROUP *soundgroup);
/*
Information only functions.
*/
FMOD_RESULT F_API FMOD_SoundGroup_GetName (FMOD_SOUNDGROUP *soundgroup, char *name, int namelen);
FMOD_RESULT F_API FMOD_SoundGroup_GetNumSounds (FMOD_SOUNDGROUP *soundgroup, int *numsounds);
FMOD_RESULT F_API FMOD_SoundGroup_GetSound (FMOD_SOUNDGROUP *soundgroup, int index, FMOD_SOUND **sound);
FMOD_RESULT F_API FMOD_SoundGroup_GetNumPlaying (FMOD_SOUNDGROUP *soundgroup, int *numplaying);
/*
Userdata set/get.
*/
FMOD_RESULT F_API FMOD_SoundGroup_SetUserData (FMOD_SOUNDGROUP *soundgroup, void *userdata);
FMOD_RESULT F_API FMOD_SoundGroup_GetUserData (FMOD_SOUNDGROUP *soundgroup, void **userdata);
/*
'DSP' API
*/
FMOD_RESULT F_API FMOD_DSP_Release (FMOD_DSP *dsp);
FMOD_RESULT F_API FMOD_DSP_GetSystemObject (FMOD_DSP *dsp, FMOD_SYSTEM **system);
/*
Connection / disconnection / input and output enumeration.
*/
FMOD_RESULT F_API FMOD_DSP_AddInput (FMOD_DSP *dsp, FMOD_DSP *input, FMOD_DSPCONNECTION **connection, FMOD_DSPCONNECTION_TYPE type);
FMOD_RESULT F_API FMOD_DSP_DisconnectFrom (FMOD_DSP *dsp, FMOD_DSP *target, FMOD_DSPCONNECTION *connection);
FMOD_RESULT F_API FMOD_DSP_DisconnectAll (FMOD_DSP *dsp, FMOD_BOOL inputs, FMOD_BOOL outputs);
FMOD_RESULT F_API FMOD_DSP_GetNumInputs (FMOD_DSP *dsp, int *numinputs);
FMOD_RESULT F_API FMOD_DSP_GetNumOutputs (FMOD_DSP *dsp, int *numoutputs);
FMOD_RESULT F_API FMOD_DSP_GetInput (FMOD_DSP *dsp, int index, FMOD_DSP **input, FMOD_DSPCONNECTION **inputconnection);
FMOD_RESULT F_API FMOD_DSP_GetOutput (FMOD_DSP *dsp, int index, FMOD_DSP **output, FMOD_DSPCONNECTION **outputconnection);
/*
DSP unit control.
*/
FMOD_RESULT F_API FMOD_DSP_SetActive (FMOD_DSP *dsp, FMOD_BOOL active);
FMOD_RESULT F_API FMOD_DSP_GetActive (FMOD_DSP *dsp, FMOD_BOOL *active);
FMOD_RESULT F_API FMOD_DSP_SetBypass (FMOD_DSP *dsp, FMOD_BOOL bypass);
FMOD_RESULT F_API FMOD_DSP_GetBypass (FMOD_DSP *dsp, FMOD_BOOL *bypass);
FMOD_RESULT F_API FMOD_DSP_SetWetDryMix (FMOD_DSP *dsp, float prewet, float postwet, float dry);
FMOD_RESULT F_API FMOD_DSP_GetWetDryMix (FMOD_DSP *dsp, float *prewet, float *postwet, float *dry);
FMOD_RESULT F_API FMOD_DSP_SetChannelFormat (FMOD_DSP *dsp, FMOD_CHANNELMASK channelmask, int numchannels, FMOD_SPEAKERMODE source_speakermode);
FMOD_RESULT F_API FMOD_DSP_GetChannelFormat (FMOD_DSP *dsp, FMOD_CHANNELMASK *channelmask, int *numchannels, FMOD_SPEAKERMODE *source_speakermode);
FMOD_RESULT F_API FMOD_DSP_GetOutputChannelFormat (FMOD_DSP *dsp, FMOD_CHANNELMASK inmask, int inchannels, FMOD_SPEAKERMODE inspeakermode, FMOD_CHANNELMASK *outmask, int *outchannels, FMOD_SPEAKERMODE *outspeakermode);
FMOD_RESULT F_API FMOD_DSP_Reset (FMOD_DSP *dsp);
FMOD_RESULT F_API FMOD_DSP_SetCallback (FMOD_DSP *dsp, FMOD_DSP_CALLBACK callback);
/*
DSP parameter control.
*/
FMOD_RESULT F_API FMOD_DSP_SetParameterFloat (FMOD_DSP *dsp, int index, float value);
FMOD_RESULT F_API FMOD_DSP_SetParameterInt (FMOD_DSP *dsp, int index, int value);
FMOD_RESULT F_API FMOD_DSP_SetParameterBool (FMOD_DSP *dsp, int index, FMOD_BOOL value);
FMOD_RESULT F_API FMOD_DSP_SetParameterData (FMOD_DSP *dsp, int index, void *data, unsigned int length);
FMOD_RESULT F_API FMOD_DSP_GetParameterFloat (FMOD_DSP *dsp, int index, float *value, char *valuestr, int valuestrlen);
FMOD_RESULT F_API FMOD_DSP_GetParameterInt (FMOD_DSP *dsp, int index, int *value, char *valuestr, int valuestrlen);
FMOD_RESULT F_API FMOD_DSP_GetParameterBool (FMOD_DSP *dsp, int index, FMOD_BOOL *value, char *valuestr, int valuestrlen);
FMOD_RESULT F_API FMOD_DSP_GetParameterData (FMOD_DSP *dsp, int index, void **data, unsigned int *length, char *valuestr, int valuestrlen);
FMOD_RESULT F_API FMOD_DSP_GetNumParameters (FMOD_DSP *dsp, int *numparams);
FMOD_RESULT F_API FMOD_DSP_GetParameterInfo (FMOD_DSP *dsp, int index, FMOD_DSP_PARAMETER_DESC **desc);
FMOD_RESULT F_API FMOD_DSP_GetDataParameterIndex (FMOD_DSP *dsp, int datatype, int *index);
FMOD_RESULT F_API FMOD_DSP_ShowConfigDialog (FMOD_DSP *dsp, void *hwnd, FMOD_BOOL show);
/*
DSP attributes.
*/
FMOD_RESULT F_API FMOD_DSP_GetInfo (FMOD_DSP *dsp, char *name, unsigned int *version, int *channels, int *configwidth, int *configheight);
FMOD_RESULT F_API FMOD_DSP_GetType (FMOD_DSP *dsp, FMOD_DSP_TYPE *type);
FMOD_RESULT F_API FMOD_DSP_GetIdle (FMOD_DSP *dsp, FMOD_BOOL *idle);
/*
Userdata set/get.
*/
FMOD_RESULT F_API FMOD_DSP_SetUserData (FMOD_DSP *dsp, void *userdata);
FMOD_RESULT F_API FMOD_DSP_GetUserData (FMOD_DSP *dsp, void **userdata);
/*
Metering.
*/
FMOD_RESULT F_API FMOD_DSP_SetMeteringEnabled (FMOD_DSP *dsp, FMOD_BOOL inputEnabled, FMOD_BOOL outputEnabled);
FMOD_RESULT F_API FMOD_DSP_GetMeteringEnabled (FMOD_DSP *dsp, FMOD_BOOL *inputEnabled, FMOD_BOOL *outputEnabled);
FMOD_RESULT F_API FMOD_DSP_GetMeteringInfo (FMOD_DSP *dsp, FMOD_DSP_METERING_INFO *inputInfo, FMOD_DSP_METERING_INFO *outputInfo);
FMOD_RESULT F_API FMOD_DSP_GetCPUUsage (FMOD_DSP *dsp, unsigned int *exclusive, unsigned int *inclusive);
/*
'DSPConnection' API
*/
FMOD_RESULT F_API FMOD_DSPConnection_GetInput (FMOD_DSPCONNECTION *dspconnection, FMOD_DSP **input);
FMOD_RESULT F_API FMOD_DSPConnection_GetOutput (FMOD_DSPCONNECTION *dspconnection, FMOD_DSP **output);
FMOD_RESULT F_API FMOD_DSPConnection_SetMix (FMOD_DSPCONNECTION *dspconnection, float volume);
FMOD_RESULT F_API FMOD_DSPConnection_GetMix (FMOD_DSPCONNECTION *dspconnection, float *volume);
FMOD_RESULT F_API FMOD_DSPConnection_SetMixMatrix (FMOD_DSPCONNECTION *dspconnection, float *matrix, int outchannels, int inchannels, int inchannel_hop);
FMOD_RESULT F_API FMOD_DSPConnection_GetMixMatrix (FMOD_DSPCONNECTION *dspconnection, float *matrix, int *outchannels, int *inchannels, int inchannel_hop);
FMOD_RESULT F_API FMOD_DSPConnection_GetType (FMOD_DSPCONNECTION *dspconnection, FMOD_DSPCONNECTION_TYPE *type);
/*
Userdata set/get.
*/
FMOD_RESULT F_API FMOD_DSPConnection_SetUserData (FMOD_DSPCONNECTION *dspconnection, void *userdata);
FMOD_RESULT F_API FMOD_DSPConnection_GetUserData (FMOD_DSPCONNECTION *dspconnection, void **userdata);
/*
'Geometry' API
*/
FMOD_RESULT F_API FMOD_Geometry_Release (FMOD_GEOMETRY *geometry);
/*
Polygon manipulation.
*/
FMOD_RESULT F_API FMOD_Geometry_AddPolygon (FMOD_GEOMETRY *geometry, float directocclusion, float reverbocclusion, FMOD_BOOL doublesided, int numvertices, const FMOD_VECTOR *vertices, int *polygonindex);
FMOD_RESULT F_API FMOD_Geometry_GetNumPolygons (FMOD_GEOMETRY *geometry, int *numpolygons);
FMOD_RESULT F_API FMOD_Geometry_GetMaxPolygons (FMOD_GEOMETRY *geometry, int *maxpolygons, int *maxvertices);
FMOD_RESULT F_API FMOD_Geometry_GetPolygonNumVertices (FMOD_GEOMETRY *geometry, int index, int *numvertices);
FMOD_RESULT F_API FMOD_Geometry_SetPolygonVertex (FMOD_GEOMETRY *geometry, int index, int vertexindex, const FMOD_VECTOR *vertex);
FMOD_RESULT F_API FMOD_Geometry_GetPolygonVertex (FMOD_GEOMETRY *geometry, int index, int vertexindex, FMOD_VECTOR *vertex);
FMOD_RESULT F_API FMOD_Geometry_SetPolygonAttributes (FMOD_GEOMETRY *geometry, int index, float directocclusion, float reverbocclusion, FMOD_BOOL doublesided);
FMOD_RESULT F_API FMOD_Geometry_GetPolygonAttributes (FMOD_GEOMETRY *geometry, int index, float *directocclusion, float *reverbocclusion, FMOD_BOOL *doublesided);
/*
Object manipulation.
*/
FMOD_RESULT F_API FMOD_Geometry_SetActive (FMOD_GEOMETRY *geometry, FMOD_BOOL active);
FMOD_RESULT F_API FMOD_Geometry_GetActive (FMOD_GEOMETRY *geometry, FMOD_BOOL *active);
FMOD_RESULT F_API FMOD_Geometry_SetRotation (FMOD_GEOMETRY *geometry, const FMOD_VECTOR *forward, const FMOD_VECTOR *up);
FMOD_RESULT F_API FMOD_Geometry_GetRotation (FMOD_GEOMETRY *geometry, FMOD_VECTOR *forward, FMOD_VECTOR *up);
FMOD_RESULT F_API FMOD_Geometry_SetPosition (FMOD_GEOMETRY *geometry, const FMOD_VECTOR *position);
FMOD_RESULT F_API FMOD_Geometry_GetPosition (FMOD_GEOMETRY *geometry, FMOD_VECTOR *position);
FMOD_RESULT F_API FMOD_Geometry_SetScale (FMOD_GEOMETRY *geometry, const FMOD_VECTOR *scale);
FMOD_RESULT F_API FMOD_Geometry_GetScale (FMOD_GEOMETRY *geometry, FMOD_VECTOR *scale);
FMOD_RESULT F_API FMOD_Geometry_Save (FMOD_GEOMETRY *geometry, void *data, int *datasize);
/*
Userdata set/get.
*/
FMOD_RESULT F_API FMOD_Geometry_SetUserData (FMOD_GEOMETRY *geometry, void *userdata);
FMOD_RESULT F_API FMOD_Geometry_GetUserData (FMOD_GEOMETRY *geometry, void **userdata);
/*
'Reverb3D' API
*/
FMOD_RESULT F_API FMOD_Reverb3D_Release (FMOD_REVERB3D *reverb3d);
/*
Reverb manipulation.
*/
FMOD_RESULT F_API FMOD_Reverb3D_Set3DAttributes (FMOD_REVERB3D *reverb3d, const FMOD_VECTOR *position, float mindistance, float maxdistance);
FMOD_RESULT F_API FMOD_Reverb3D_Get3DAttributes (FMOD_REVERB3D *reverb3d, FMOD_VECTOR *position, float *mindistance, float *maxdistance);
FMOD_RESULT F_API FMOD_Reverb3D_SetProperties (FMOD_REVERB3D *reverb3d, const FMOD_REVERB_PROPERTIES *properties);
FMOD_RESULT F_API FMOD_Reverb3D_GetProperties (FMOD_REVERB3D *reverb3d, FMOD_REVERB_PROPERTIES *properties);
FMOD_RESULT F_API FMOD_Reverb3D_SetActive (FMOD_REVERB3D *reverb3d, FMOD_BOOL active);
FMOD_RESULT F_API FMOD_Reverb3D_GetActive (FMOD_REVERB3D *reverb3d, FMOD_BOOL *active);
/*
Userdata set/get.
*/
FMOD_RESULT F_API FMOD_Reverb3D_SetUserData (FMOD_REVERB3D *reverb3d, void *userdata);
FMOD_RESULT F_API FMOD_Reverb3D_GetUserData (FMOD_REVERB3D *reverb3d, void **userdata);
#ifdef __cplusplus
}
#endif
#endif /* _FMOD_H */

607
modules/fmod/inc/fmod.hpp Normal file
View File

@@ -0,0 +1,607 @@
/* ======================================================================================== */
/* FMOD Core API - C++ header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* Use this header in conjunction with fmod_common.h (which contains all the constants / */
/* callbacks) to develop using the C++ language. */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/core-api.html */
/* ======================================================================================== */
#ifndef _FMOD_HPP
#define _FMOD_HPP
#include "fmod_common.h"
#include "fmod.h"
/*
FMOD Namespace
*/
namespace FMOD
{
class System;
class Sound;
class ChannelControl;
class Channel;
class ChannelGroup;
class SoundGroup;
class DSP;
class DSPConnection;
class Geometry;
class Reverb3D;
/*
FMOD global system functions (optional).
*/
inline FMOD_RESULT Memory_Initialize (void *poolmem, int poollen, FMOD_MEMORY_ALLOC_CALLBACK useralloc, FMOD_MEMORY_REALLOC_CALLBACK userrealloc, FMOD_MEMORY_FREE_CALLBACK userfree, FMOD_MEMORY_TYPE memtypeflags = FMOD_MEMORY_ALL) { return FMOD_Memory_Initialize(poolmem, poollen, useralloc, userrealloc, userfree, memtypeflags); }
inline FMOD_RESULT Memory_GetStats (int *currentalloced, int *maxalloced, bool blocking = true) { return FMOD_Memory_GetStats(currentalloced, maxalloced, blocking); }
inline FMOD_RESULT Debug_Initialize (FMOD_DEBUG_FLAGS flags, FMOD_DEBUG_MODE mode = FMOD_DEBUG_MODE_TTY, FMOD_DEBUG_CALLBACK callback = 0, const char *filename = 0) { return FMOD_Debug_Initialize(flags, mode, callback, filename); }
inline FMOD_RESULT File_SetDiskBusy (int busy) { return FMOD_File_SetDiskBusy(busy); }
inline FMOD_RESULT File_GetDiskBusy (int *busy) { return FMOD_File_GetDiskBusy(busy); }
inline FMOD_RESULT Thread_SetAttributes (FMOD_THREAD_TYPE type, FMOD_THREAD_AFFINITY affinity = FMOD_THREAD_AFFINITY_GROUP_DEFAULT, FMOD_THREAD_PRIORITY priority = FMOD_THREAD_PRIORITY_DEFAULT, FMOD_THREAD_STACK_SIZE stacksize = FMOD_THREAD_STACK_SIZE_DEFAULT) { return FMOD_Thread_SetAttributes(type, affinity, priority, stacksize); }
/*
FMOD System factory functions.
*/
inline FMOD_RESULT System_Create (System **system, unsigned int headerversion = FMOD_VERSION) { return FMOD_System_Create((FMOD_SYSTEM **)system, headerversion); }
/*
'System' API
*/
class System
{
private:
// Constructor made private so user cannot statically instance a System class. System_Create must be used.
System();
System(const System &);
public:
FMOD_RESULT F_API release ();
// Setup functions.
FMOD_RESULT F_API setOutput (FMOD_OUTPUTTYPE output);
FMOD_RESULT F_API getOutput (FMOD_OUTPUTTYPE *output);
FMOD_RESULT F_API getNumDrivers (int *numdrivers);
FMOD_RESULT F_API getDriverInfo (int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels);
FMOD_RESULT F_API setDriver (int driver);
FMOD_RESULT F_API getDriver (int *driver);
FMOD_RESULT F_API setSoftwareChannels (int numsoftwarechannels);
FMOD_RESULT F_API getSoftwareChannels (int *numsoftwarechannels);
FMOD_RESULT F_API setSoftwareFormat (int samplerate, FMOD_SPEAKERMODE speakermode, int numrawspeakers);
FMOD_RESULT F_API getSoftwareFormat (int *samplerate, FMOD_SPEAKERMODE *speakermode, int *numrawspeakers);
FMOD_RESULT F_API setDSPBufferSize (unsigned int bufferlength, int numbuffers);
FMOD_RESULT F_API getDSPBufferSize (unsigned int *bufferlength, int *numbuffers);
FMOD_RESULT F_API setFileSystem (FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek, FMOD_FILE_ASYNCREAD_CALLBACK userasyncread, FMOD_FILE_ASYNCCANCEL_CALLBACK userasynccancel, int blockalign);
FMOD_RESULT F_API attachFileSystem (FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek);
FMOD_RESULT F_API setAdvancedSettings (FMOD_ADVANCEDSETTINGS *settings);
FMOD_RESULT F_API getAdvancedSettings (FMOD_ADVANCEDSETTINGS *settings);
FMOD_RESULT F_API setCallback (FMOD_SYSTEM_CALLBACK callback, FMOD_SYSTEM_CALLBACK_TYPE callbackmask = FMOD_SYSTEM_CALLBACK_ALL);
// Plug-in support.
FMOD_RESULT F_API setPluginPath (const char *path);
FMOD_RESULT F_API loadPlugin (const char *filename, unsigned int *handle, unsigned int priority = 0);
FMOD_RESULT F_API unloadPlugin (unsigned int handle);
FMOD_RESULT F_API getNumNestedPlugins (unsigned int handle, int *count);
FMOD_RESULT F_API getNestedPlugin (unsigned int handle, int index, unsigned int *nestedhandle);
FMOD_RESULT F_API getNumPlugins (FMOD_PLUGINTYPE plugintype, int *numplugins);
FMOD_RESULT F_API getPluginHandle (FMOD_PLUGINTYPE plugintype, int index, unsigned int *handle);
FMOD_RESULT F_API getPluginInfo (unsigned int handle, FMOD_PLUGINTYPE *plugintype, char *name, int namelen, unsigned int *version);
FMOD_RESULT F_API setOutputByPlugin (unsigned int handle);
FMOD_RESULT F_API getOutputByPlugin (unsigned int *handle);
FMOD_RESULT F_API createDSPByPlugin (unsigned int handle, DSP **dsp);
FMOD_RESULT F_API getDSPInfoByPlugin (unsigned int handle, const FMOD_DSP_DESCRIPTION **description);
FMOD_RESULT F_API registerCodec (FMOD_CODEC_DESCRIPTION *description, unsigned int *handle, unsigned int priority = 0);
FMOD_RESULT F_API registerDSP (const FMOD_DSP_DESCRIPTION *description, unsigned int *handle);
FMOD_RESULT F_API registerOutput (const FMOD_OUTPUT_DESCRIPTION *description, unsigned int *handle);
// Init/Close.
FMOD_RESULT F_API init (int maxchannels, FMOD_INITFLAGS flags, void *extradriverdata);
FMOD_RESULT F_API close ();
// General post-init system functions.
FMOD_RESULT F_API update (); /* IMPORTANT! CALL THIS ONCE PER FRAME! */
FMOD_RESULT F_API setSpeakerPosition (FMOD_SPEAKER speaker, float x, float y, bool active);
FMOD_RESULT F_API getSpeakerPosition (FMOD_SPEAKER speaker, float *x, float *y, bool *active);
FMOD_RESULT F_API setStreamBufferSize (unsigned int filebuffersize, FMOD_TIMEUNIT filebuffersizetype);
FMOD_RESULT F_API getStreamBufferSize (unsigned int *filebuffersize, FMOD_TIMEUNIT *filebuffersizetype);
FMOD_RESULT F_API set3DSettings (float dopplerscale, float distancefactor, float rolloffscale);
FMOD_RESULT F_API get3DSettings (float *dopplerscale, float *distancefactor, float *rolloffscale);
FMOD_RESULT F_API set3DNumListeners (int numlisteners);
FMOD_RESULT F_API get3DNumListeners (int *numlisteners);
FMOD_RESULT F_API set3DListenerAttributes (int listener, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel, const FMOD_VECTOR *forward, const FMOD_VECTOR *up);
FMOD_RESULT F_API get3DListenerAttributes (int listener, FMOD_VECTOR *pos, FMOD_VECTOR *vel, FMOD_VECTOR *forward, FMOD_VECTOR *up);
FMOD_RESULT F_API set3DRolloffCallback (FMOD_3D_ROLLOFF_CALLBACK callback);
FMOD_RESULT F_API mixerSuspend ();
FMOD_RESULT F_API mixerResume ();
FMOD_RESULT F_API getDefaultMixMatrix (FMOD_SPEAKERMODE sourcespeakermode, FMOD_SPEAKERMODE targetspeakermode, float *matrix, int matrixhop);
FMOD_RESULT F_API getSpeakerModeChannels (FMOD_SPEAKERMODE mode, int *channels);
// System information functions.
FMOD_RESULT F_API getVersion (unsigned int *version);
FMOD_RESULT F_API getOutputHandle (void **handle);
FMOD_RESULT F_API getChannelsPlaying (int *channels, int *realchannels = 0);
FMOD_RESULT F_API getCPUUsage (FMOD_CPU_USAGE *usage);
FMOD_RESULT F_API getFileUsage (long long *sampleBytesRead, long long *streamBytesRead, long long *otherBytesRead);
// Sound/DSP/Channel/FX creation and retrieval.
FMOD_RESULT F_API createSound (const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, Sound **sound);
FMOD_RESULT F_API createStream (const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, Sound **sound);
FMOD_RESULT F_API createDSP (const FMOD_DSP_DESCRIPTION *description, DSP **dsp);
FMOD_RESULT F_API createDSPByType (FMOD_DSP_TYPE type, DSP **dsp);
FMOD_RESULT F_API createChannelGroup (const char *name, ChannelGroup **channelgroup);
FMOD_RESULT F_API createSoundGroup (const char *name, SoundGroup **soundgroup);
FMOD_RESULT F_API createReverb3D (Reverb3D **reverb);
FMOD_RESULT F_API playSound (Sound *sound, ChannelGroup *channelgroup, bool paused, Channel **channel);
FMOD_RESULT F_API playDSP (DSP *dsp, ChannelGroup *channelgroup, bool paused, Channel **channel);
FMOD_RESULT F_API getChannel (int channelid, Channel **channel);
FMOD_RESULT F_API getDSPInfoByType (FMOD_DSP_TYPE type, const FMOD_DSP_DESCRIPTION **description);
FMOD_RESULT F_API getMasterChannelGroup (ChannelGroup **channelgroup);
FMOD_RESULT F_API getMasterSoundGroup (SoundGroup **soundgroup);
// Routing to ports.
FMOD_RESULT F_API attachChannelGroupToPort (FMOD_PORT_TYPE portType, FMOD_PORT_INDEX portIndex, ChannelGroup *channelgroup, bool passThru = false);
FMOD_RESULT F_API detachChannelGroupFromPort (ChannelGroup *channelgroup);
// Reverb API.
FMOD_RESULT F_API setReverbProperties (int instance, const FMOD_REVERB_PROPERTIES *prop);
FMOD_RESULT F_API getReverbProperties (int instance, FMOD_REVERB_PROPERTIES *prop);
// System level DSP functionality.
FMOD_RESULT F_API lockDSP ();
FMOD_RESULT F_API unlockDSP ();
// Recording API.
FMOD_RESULT F_API getRecordNumDrivers (int *numdrivers, int *numconnected);
FMOD_RESULT F_API getRecordDriverInfo (int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels, FMOD_DRIVER_STATE *state);
FMOD_RESULT F_API getRecordPosition (int id, unsigned int *position);
FMOD_RESULT F_API recordStart (int id, Sound *sound, bool loop);
FMOD_RESULT F_API recordStop (int id);
FMOD_RESULT F_API isRecording (int id, bool *recording);
// Geometry API.
FMOD_RESULT F_API createGeometry (int maxpolygons, int maxvertices, Geometry **geometry);
FMOD_RESULT F_API setGeometrySettings (float maxworldsize);
FMOD_RESULT F_API getGeometrySettings (float *maxworldsize);
FMOD_RESULT F_API loadGeometry (const void *data, int datasize, Geometry **geometry);
FMOD_RESULT F_API getGeometryOcclusion (const FMOD_VECTOR *listener, const FMOD_VECTOR *source, float *direct, float *reverb);
// Network functions.
FMOD_RESULT F_API setNetworkProxy (const char *proxy);
FMOD_RESULT F_API getNetworkProxy (char *proxy, int proxylen);
FMOD_RESULT F_API setNetworkTimeout (int timeout);
FMOD_RESULT F_API getNetworkTimeout (int *timeout);
// Userdata set/get.
FMOD_RESULT F_API setUserData (void *userdata);
FMOD_RESULT F_API getUserData (void **userdata);
};
/*
'Sound' API
*/
class Sound
{
private:
// Constructor made private so user cannot statically instance a Sound class. Appropriate Sound creation or retrieval function must be used.
Sound();
Sound(const Sound &);
public:
FMOD_RESULT F_API release ();
FMOD_RESULT F_API getSystemObject (System **system);
// Standard sound manipulation functions.
FMOD_RESULT F_API lock (unsigned int offset, unsigned int length, void **ptr1, void **ptr2, unsigned int *len1, unsigned int *len2);
FMOD_RESULT F_API unlock (void *ptr1, void *ptr2, unsigned int len1, unsigned int len2);
FMOD_RESULT F_API setDefaults (float frequency, int priority);
FMOD_RESULT F_API getDefaults (float *frequency, int *priority);
FMOD_RESULT F_API set3DMinMaxDistance (float min, float max);
FMOD_RESULT F_API get3DMinMaxDistance (float *min, float *max);
FMOD_RESULT F_API set3DConeSettings (float insideconeangle, float outsideconeangle, float outsidevolume);
FMOD_RESULT F_API get3DConeSettings (float *insideconeangle, float *outsideconeangle, float *outsidevolume);
FMOD_RESULT F_API set3DCustomRolloff (FMOD_VECTOR *points, int numpoints);
FMOD_RESULT F_API get3DCustomRolloff (FMOD_VECTOR **points, int *numpoints);
FMOD_RESULT F_API getSubSound (int index, Sound **subsound);
FMOD_RESULT F_API getSubSoundParent (Sound **parentsound);
FMOD_RESULT F_API getName (char *name, int namelen);
FMOD_RESULT F_API getLength (unsigned int *length, FMOD_TIMEUNIT lengthtype);
FMOD_RESULT F_API getFormat (FMOD_SOUND_TYPE *type, FMOD_SOUND_FORMAT *format, int *channels, int *bits);
FMOD_RESULT F_API getNumSubSounds (int *numsubsounds);
FMOD_RESULT F_API getNumTags (int *numtags, int *numtagsupdated);
FMOD_RESULT F_API getTag (const char *name, int index, FMOD_TAG *tag);
FMOD_RESULT F_API getOpenState (FMOD_OPENSTATE *openstate, unsigned int *percentbuffered, bool *starving, bool *diskbusy);
FMOD_RESULT F_API readData (void *buffer, unsigned int length, unsigned int *read);
FMOD_RESULT F_API seekData (unsigned int pcm);
FMOD_RESULT F_API setSoundGroup (SoundGroup *soundgroup);
FMOD_RESULT F_API getSoundGroup (SoundGroup **soundgroup);
// Synchronization point API. These points can come from markers embedded in wav files, and can also generate channel callbacks.
FMOD_RESULT F_API getNumSyncPoints (int *numsyncpoints);
FMOD_RESULT F_API getSyncPoint (int index, FMOD_SYNCPOINT **point);
FMOD_RESULT F_API getSyncPointInfo (FMOD_SYNCPOINT *point, char *name, int namelen, unsigned int *offset, FMOD_TIMEUNIT offsettype);
FMOD_RESULT F_API addSyncPoint (unsigned int offset, FMOD_TIMEUNIT offsettype, const char *name, FMOD_SYNCPOINT **point);
FMOD_RESULT F_API deleteSyncPoint (FMOD_SYNCPOINT *point);
// Functions also in Channel class but here they are the 'default' to save having to change it in Channel all the time.
FMOD_RESULT F_API setMode (FMOD_MODE mode);
FMOD_RESULT F_API getMode (FMOD_MODE *mode);
FMOD_RESULT F_API setLoopCount (int loopcount);
FMOD_RESULT F_API getLoopCount (int *loopcount);
FMOD_RESULT F_API setLoopPoints (unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype);
FMOD_RESULT F_API getLoopPoints (unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype);
// For MOD/S3M/XM/IT/MID sequenced formats only.
FMOD_RESULT F_API getMusicNumChannels (int *numchannels);
FMOD_RESULT F_API setMusicChannelVolume (int channel, float volume);
FMOD_RESULT F_API getMusicChannelVolume (int channel, float *volume);
FMOD_RESULT F_API setMusicSpeed (float speed);
FMOD_RESULT F_API getMusicSpeed (float *speed);
// Userdata set/get.
FMOD_RESULT F_API setUserData (void *userdata);
FMOD_RESULT F_API getUserData (void **userdata);
};
/*
'ChannelControl API'. This is a base class for Channel and ChannelGroup so they can share the same functionality. This cannot be used or instansiated explicitly.
*/
class ChannelControl
{
private:
// Constructor made private so user cannot statically instance a Control class.
ChannelControl();
ChannelControl(const ChannelControl &);
public:
FMOD_RESULT F_API getSystemObject (System **system);
// General control functionality for Channels and ChannelGroups.
FMOD_RESULT F_API stop ();
FMOD_RESULT F_API setPaused (bool paused);
FMOD_RESULT F_API getPaused (bool *paused);
FMOD_RESULT F_API setVolume (float volume);
FMOD_RESULT F_API getVolume (float *volume);
FMOD_RESULT F_API setVolumeRamp (bool ramp);
FMOD_RESULT F_API getVolumeRamp (bool *ramp);
FMOD_RESULT F_API getAudibility (float *audibility);
FMOD_RESULT F_API setPitch (float pitch);
FMOD_RESULT F_API getPitch (float *pitch);
FMOD_RESULT F_API setMute (bool mute);
FMOD_RESULT F_API getMute (bool *mute);
FMOD_RESULT F_API setReverbProperties (int instance, float wet);
FMOD_RESULT F_API getReverbProperties (int instance, float *wet);
FMOD_RESULT F_API setLowPassGain (float gain);
FMOD_RESULT F_API getLowPassGain (float *gain);
FMOD_RESULT F_API setMode (FMOD_MODE mode);
FMOD_RESULT F_API getMode (FMOD_MODE *mode);
FMOD_RESULT F_API setCallback (FMOD_CHANNELCONTROL_CALLBACK callback);
FMOD_RESULT F_API isPlaying (bool *isplaying);
// Panning and level adjustment.
// Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values.
FMOD_RESULT F_API setPan (float pan);
FMOD_RESULT F_API setMixLevelsOutput (float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright);
FMOD_RESULT F_API setMixLevelsInput (float *levels, int numlevels);
FMOD_RESULT F_API setMixMatrix (float *matrix, int outchannels, int inchannels, int inchannel_hop = 0);
FMOD_RESULT F_API getMixMatrix (float *matrix, int *outchannels, int *inchannels, int inchannel_hop = 0);
// Clock based functionality.
FMOD_RESULT F_API getDSPClock (unsigned long long *dspclock, unsigned long long *parentclock);
FMOD_RESULT F_API setDelay (unsigned long long dspclock_start, unsigned long long dspclock_end, bool stopchannels = true);
FMOD_RESULT F_API getDelay (unsigned long long *dspclock_start, unsigned long long *dspclock_end, bool *stopchannels = 0);
FMOD_RESULT F_API addFadePoint (unsigned long long dspclock, float volume);
FMOD_RESULT F_API setFadePointRamp (unsigned long long dspclock, float volume);
FMOD_RESULT F_API removeFadePoints (unsigned long long dspclock_start, unsigned long long dspclock_end);
FMOD_RESULT F_API getFadePoints (unsigned int *numpoints, unsigned long long *point_dspclock, float *point_volume);
// DSP effects.
FMOD_RESULT F_API getDSP (int index, DSP **dsp);
FMOD_RESULT F_API addDSP (int index, DSP *dsp);
FMOD_RESULT F_API removeDSP (DSP *dsp);
FMOD_RESULT F_API getNumDSPs (int *numdsps);
FMOD_RESULT F_API setDSPIndex (DSP *dsp, int index);
FMOD_RESULT F_API getDSPIndex (DSP *dsp, int *index);
// 3D functionality.
FMOD_RESULT F_API set3DAttributes (const FMOD_VECTOR *pos, const FMOD_VECTOR *vel);
FMOD_RESULT F_API get3DAttributes (FMOD_VECTOR *pos, FMOD_VECTOR *vel);
FMOD_RESULT F_API set3DMinMaxDistance (float mindistance, float maxdistance);
FMOD_RESULT F_API get3DMinMaxDistance (float *mindistance, float *maxdistance);
FMOD_RESULT F_API set3DConeSettings (float insideconeangle, float outsideconeangle, float outsidevolume);
FMOD_RESULT F_API get3DConeSettings (float *insideconeangle, float *outsideconeangle, float *outsidevolume);
FMOD_RESULT F_API set3DConeOrientation (FMOD_VECTOR *orientation);
FMOD_RESULT F_API get3DConeOrientation (FMOD_VECTOR *orientation);
FMOD_RESULT F_API set3DCustomRolloff (FMOD_VECTOR *points, int numpoints);
FMOD_RESULT F_API get3DCustomRolloff (FMOD_VECTOR **points, int *numpoints);
FMOD_RESULT F_API set3DOcclusion (float directocclusion, float reverbocclusion);
FMOD_RESULT F_API get3DOcclusion (float *directocclusion, float *reverbocclusion);
FMOD_RESULT F_API set3DSpread (float angle);
FMOD_RESULT F_API get3DSpread (float *angle);
FMOD_RESULT F_API set3DLevel (float level);
FMOD_RESULT F_API get3DLevel (float *level);
FMOD_RESULT F_API set3DDopplerLevel (float level);
FMOD_RESULT F_API get3DDopplerLevel (float *level);
FMOD_RESULT F_API set3DDistanceFilter (bool custom, float customLevel, float centerFreq);
FMOD_RESULT F_API get3DDistanceFilter (bool *custom, float *customLevel, float *centerFreq);
// Userdata set/get.
FMOD_RESULT F_API setUserData (void *userdata);
FMOD_RESULT F_API getUserData (void **userdata);
};
/*
'Channel' API.
*/
class Channel : public ChannelControl
{
private:
// Constructor made private so user cannot statically instance a Channel class. Appropriate Channel creation or retrieval function must be used.
Channel();
Channel(const Channel &);
public:
// Channel specific control functionality.
FMOD_RESULT F_API setFrequency (float frequency);
FMOD_RESULT F_API getFrequency (float *frequency);
FMOD_RESULT F_API setPriority (int priority);
FMOD_RESULT F_API getPriority (int *priority);
FMOD_RESULT F_API setPosition (unsigned int position, FMOD_TIMEUNIT postype);
FMOD_RESULT F_API getPosition (unsigned int *position, FMOD_TIMEUNIT postype);
FMOD_RESULT F_API setChannelGroup (ChannelGroup *channelgroup);
FMOD_RESULT F_API getChannelGroup (ChannelGroup **channelgroup);
FMOD_RESULT F_API setLoopCount (int loopcount);
FMOD_RESULT F_API getLoopCount (int *loopcount);
FMOD_RESULT F_API setLoopPoints (unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype);
FMOD_RESULT F_API getLoopPoints (unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype);
// Information only functions.
FMOD_RESULT F_API isVirtual (bool *isvirtual);
FMOD_RESULT F_API getCurrentSound (Sound **sound);
FMOD_RESULT F_API getIndex (int *index);
};
/*
'ChannelGroup' API
*/
class ChannelGroup : public ChannelControl
{
private:
// Constructor made private so user cannot statically instance a ChannelGroup class. Appropriate ChannelGroup creation or retrieval function must be used.
ChannelGroup();
ChannelGroup(const ChannelGroup &);
public:
FMOD_RESULT F_API release ();
// Nested channel groups.
FMOD_RESULT F_API addGroup (ChannelGroup *group, bool propagatedspclock = true, DSPConnection **connection = 0);
FMOD_RESULT F_API getNumGroups (int *numgroups);
FMOD_RESULT F_API getGroup (int index, ChannelGroup **group);
FMOD_RESULT F_API getParentGroup (ChannelGroup **group);
// Information only functions.
FMOD_RESULT F_API getName (char *name, int namelen);
FMOD_RESULT F_API getNumChannels (int *numchannels);
FMOD_RESULT F_API getChannel (int index, Channel **channel);
};
/*
'SoundGroup' API
*/
class SoundGroup
{
private:
// Constructor made private so user cannot statically instance a SoundGroup class. Appropriate SoundGroup creation or retrieval function must be used.
SoundGroup();
SoundGroup(const SoundGroup &);
public:
FMOD_RESULT F_API release ();
FMOD_RESULT F_API getSystemObject (System **system);
// SoundGroup control functions.
FMOD_RESULT F_API setMaxAudible (int maxaudible);
FMOD_RESULT F_API getMaxAudible (int *maxaudible);
FMOD_RESULT F_API setMaxAudibleBehavior (FMOD_SOUNDGROUP_BEHAVIOR behavior);
FMOD_RESULT F_API getMaxAudibleBehavior (FMOD_SOUNDGROUP_BEHAVIOR *behavior);
FMOD_RESULT F_API setMuteFadeSpeed (float speed);
FMOD_RESULT F_API getMuteFadeSpeed (float *speed);
FMOD_RESULT F_API setVolume (float volume);
FMOD_RESULT F_API getVolume (float *volume);
FMOD_RESULT F_API stop ();
// Information only functions.
FMOD_RESULT F_API getName (char *name, int namelen);
FMOD_RESULT F_API getNumSounds (int *numsounds);
FMOD_RESULT F_API getSound (int index, Sound **sound);
FMOD_RESULT F_API getNumPlaying (int *numplaying);
// Userdata set/get.
FMOD_RESULT F_API setUserData (void *userdata);
FMOD_RESULT F_API getUserData (void **userdata);
};
/*
'DSP' API
*/
class DSP
{
private:
// Constructor made private so user cannot statically instance a DSP class. Appropriate DSP creation or retrieval function must be used.
DSP();
DSP(const DSP &);
public:
FMOD_RESULT F_API release ();
FMOD_RESULT F_API getSystemObject (System **system);
// Connection / disconnection / input and output enumeration.
FMOD_RESULT F_API addInput (DSP *input, DSPConnection **connection = 0, FMOD_DSPCONNECTION_TYPE type = FMOD_DSPCONNECTION_TYPE_STANDARD);
FMOD_RESULT F_API disconnectFrom (DSP *target, DSPConnection *connection = 0);
FMOD_RESULT F_API disconnectAll (bool inputs, bool outputs);
FMOD_RESULT F_API getNumInputs (int *numinputs);
FMOD_RESULT F_API getNumOutputs (int *numoutputs);
FMOD_RESULT F_API getInput (int index, DSP **input, DSPConnection **inputconnection);
FMOD_RESULT F_API getOutput (int index, DSP **output, DSPConnection **outputconnection);
// DSP unit control.
FMOD_RESULT F_API setActive (bool active);
FMOD_RESULT F_API getActive (bool *active);
FMOD_RESULT F_API setBypass (bool bypass);
FMOD_RESULT F_API getBypass (bool *bypass);
FMOD_RESULT F_API setWetDryMix (float prewet, float postwet, float dry);
FMOD_RESULT F_API getWetDryMix (float *prewet, float *postwet, float *dry);
FMOD_RESULT F_API setChannelFormat (FMOD_CHANNELMASK channelmask, int numchannels, FMOD_SPEAKERMODE source_speakermode);
FMOD_RESULT F_API getChannelFormat (FMOD_CHANNELMASK *channelmask, int *numchannels, FMOD_SPEAKERMODE *source_speakermode);
FMOD_RESULT F_API getOutputChannelFormat (FMOD_CHANNELMASK inmask, int inchannels, FMOD_SPEAKERMODE inspeakermode, FMOD_CHANNELMASK *outmask, int *outchannels, FMOD_SPEAKERMODE *outspeakermode);
FMOD_RESULT F_API reset ();
FMOD_RESULT F_API setCallback (FMOD_DSP_CALLBACK callback);
// DSP parameter control.
FMOD_RESULT F_API setParameterFloat (int index, float value);
FMOD_RESULT F_API setParameterInt (int index, int value);
FMOD_RESULT F_API setParameterBool (int index, bool value);
FMOD_RESULT F_API setParameterData (int index, void *data, unsigned int length);
FMOD_RESULT F_API getParameterFloat (int index, float *value, char *valuestr, int valuestrlen);
FMOD_RESULT F_API getParameterInt (int index, int *value, char *valuestr, int valuestrlen);
FMOD_RESULT F_API getParameterBool (int index, bool *value, char *valuestr, int valuestrlen);
FMOD_RESULT F_API getParameterData (int index, void **data, unsigned int *length, char *valuestr, int valuestrlen);
FMOD_RESULT F_API getNumParameters (int *numparams);
FMOD_RESULT F_API getParameterInfo (int index, FMOD_DSP_PARAMETER_DESC **desc);
FMOD_RESULT F_API getDataParameterIndex (int datatype, int *index);
FMOD_RESULT F_API showConfigDialog (void *hwnd, bool show);
// DSP attributes.
FMOD_RESULT F_API getInfo (char *name, unsigned int *version, int *channels, int *configwidth, int *configheight);
FMOD_RESULT F_API getType (FMOD_DSP_TYPE *type);
FMOD_RESULT F_API getIdle (bool *idle);
// Userdata set/get.
FMOD_RESULT F_API setUserData (void *userdata);
FMOD_RESULT F_API getUserData (void **userdata);
// Metering.
FMOD_RESULT F_API setMeteringEnabled (bool inputEnabled, bool outputEnabled);
FMOD_RESULT F_API getMeteringEnabled (bool *inputEnabled, bool *outputEnabled);
FMOD_RESULT F_API getMeteringInfo (FMOD_DSP_METERING_INFO *inputInfo, FMOD_DSP_METERING_INFO *outputInfo);
FMOD_RESULT F_API getCPUUsage (unsigned int *exclusive, unsigned int *inclusive);
};
/*
'DSPConnection' API
*/
class DSPConnection
{
private:
// Constructor made private so user cannot statically instance a DSPConnection class. Appropriate DSPConnection creation or retrieval function must be used.
DSPConnection();
DSPConnection(const DSPConnection &);
public:
FMOD_RESULT F_API getInput (DSP **input);
FMOD_RESULT F_API getOutput (DSP **output);
FMOD_RESULT F_API setMix (float volume);
FMOD_RESULT F_API getMix (float *volume);
FMOD_RESULT F_API setMixMatrix (float *matrix, int outchannels, int inchannels, int inchannel_hop = 0);
FMOD_RESULT F_API getMixMatrix (float *matrix, int *outchannels, int *inchannels, int inchannel_hop = 0);
FMOD_RESULT F_API getType (FMOD_DSPCONNECTION_TYPE *type);
// Userdata set/get.
FMOD_RESULT F_API setUserData (void *userdata);
FMOD_RESULT F_API getUserData (void **userdata);
};
/*
'Geometry' API
*/
class Geometry
{
private:
// Constructor made private so user cannot statically instance a Geometry class. Appropriate Geometry creation or retrieval function must be used.
Geometry();
Geometry(const Geometry &);
public:
FMOD_RESULT F_API release ();
// Polygon manipulation.
FMOD_RESULT F_API addPolygon (float directocclusion, float reverbocclusion, bool doublesided, int numvertices, const FMOD_VECTOR *vertices, int *polygonindex);
FMOD_RESULT F_API getNumPolygons (int *numpolygons);
FMOD_RESULT F_API getMaxPolygons (int *maxpolygons, int *maxvertices);
FMOD_RESULT F_API getPolygonNumVertices (int index, int *numvertices);
FMOD_RESULT F_API setPolygonVertex (int index, int vertexindex, const FMOD_VECTOR *vertex);
FMOD_RESULT F_API getPolygonVertex (int index, int vertexindex, FMOD_VECTOR *vertex);
FMOD_RESULT F_API setPolygonAttributes (int index, float directocclusion, float reverbocclusion, bool doublesided);
FMOD_RESULT F_API getPolygonAttributes (int index, float *directocclusion, float *reverbocclusion, bool *doublesided);
// Object manipulation.
FMOD_RESULT F_API setActive (bool active);
FMOD_RESULT F_API getActive (bool *active);
FMOD_RESULT F_API setRotation (const FMOD_VECTOR *forward, const FMOD_VECTOR *up);
FMOD_RESULT F_API getRotation (FMOD_VECTOR *forward, FMOD_VECTOR *up);
FMOD_RESULT F_API setPosition (const FMOD_VECTOR *position);
FMOD_RESULT F_API getPosition (FMOD_VECTOR *position);
FMOD_RESULT F_API setScale (const FMOD_VECTOR *scale);
FMOD_RESULT F_API getScale (FMOD_VECTOR *scale);
FMOD_RESULT F_API save (void *data, int *datasize);
// Userdata set/get.
FMOD_RESULT F_API setUserData (void *userdata);
FMOD_RESULT F_API getUserData (void **userdata);
};
/*
'Reverb' API
*/
class Reverb3D
{
private:
// Constructor made private so user cannot statically instance a Reverb3D class. Appropriate Reverb creation or retrieval function must be used.
Reverb3D();
Reverb3D(const Reverb3D &);
public:
FMOD_RESULT F_API release ();
// Reverb manipulation.
FMOD_RESULT F_API set3DAttributes (const FMOD_VECTOR *position, float mindistance, float maxdistance);
FMOD_RESULT F_API get3DAttributes (FMOD_VECTOR *position, float *mindistance,float *maxdistance);
FMOD_RESULT F_API setProperties (const FMOD_REVERB_PROPERTIES *properties);
FMOD_RESULT F_API getProperties (FMOD_REVERB_PROPERTIES *properties);
FMOD_RESULT F_API setActive (bool active);
FMOD_RESULT F_API getActive (bool *active);
// Userdata set/get.
FMOD_RESULT F_API setUserData (void *userdata);
FMOD_RESULT F_API getUserData (void **userdata);
};
}
#endif

View File

@@ -0,0 +1,136 @@
/* ======================================================================================== */
/* FMOD Core API - Codec development header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* Use this header if you are wanting to develop your own file format plugin to use with */
/* FMOD's codec system. With this header you can make your own fileformat plugin that FMOD */
/* can register and use. See the documentation and examples on how to make a working */
/* plugin. */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/core-api.html */
/* ======================================================================================== */
#ifndef _FMOD_CODEC_H
#define _FMOD_CODEC_H
/*
Codec types
*/
typedef struct FMOD_CODEC_STATE FMOD_CODEC_STATE;
typedef struct FMOD_CODEC_WAVEFORMAT FMOD_CODEC_WAVEFORMAT;
/*
Codec constants
*/
#define FMOD_CODEC_PLUGIN_VERSION 1
typedef int FMOD_CODEC_SEEK_METHOD;
#define FMOD_CODEC_SEEK_METHOD_SET 0
#define FMOD_CODEC_SEEK_METHOD_CURRENT 1
#define FMOD_CODEC_SEEK_METHOD_END 2
/*
Codec callbacks
*/
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_OPEN_CALLBACK) (FMOD_CODEC_STATE *codec_state, FMOD_MODE usermode, FMOD_CREATESOUNDEXINFO *userexinfo);
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_CLOSE_CALLBACK) (FMOD_CODEC_STATE *codec_state);
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_READ_CALLBACK) (FMOD_CODEC_STATE *codec_state, void *buffer, unsigned int samples_in, unsigned int *samples_out);
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_GETLENGTH_CALLBACK) (FMOD_CODEC_STATE *codec_state, unsigned int *length, FMOD_TIMEUNIT lengthtype);
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_SETPOSITION_CALLBACK) (FMOD_CODEC_STATE *codec_state, int subsound, unsigned int position, FMOD_TIMEUNIT postype);
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_GETPOSITION_CALLBACK) (FMOD_CODEC_STATE *codec_state, unsigned int *position, FMOD_TIMEUNIT postype);
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_SOUNDCREATE_CALLBACK) (FMOD_CODEC_STATE *codec_state, int subsound, FMOD_SOUND *sound);
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_GETWAVEFORMAT_CALLBACK)(FMOD_CODEC_STATE *codec_state, int index, FMOD_CODEC_WAVEFORMAT *waveformat);
/*
Codec functions
*/
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_METADATA_FUNC) (FMOD_CODEC_STATE *codec_state, FMOD_TAGTYPE tagtype, char *name, void *data, unsigned int datalen, FMOD_TAGDATATYPE datatype, int unique);
typedef void * (F_CALLBACK *FMOD_CODEC_ALLOC_FUNC) (unsigned int size, unsigned int align, const char *file, int line);
typedef void (F_CALLBACK *FMOD_CODEC_FREE_FUNC) (void *ptr, const char *file, int line);
typedef void (F_CALLBACK *FMOD_CODEC_LOG_FUNC) (FMOD_DEBUG_FLAGS level, const char *file, int line, const char *function, const char *string, ...);
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_FILE_READ_FUNC) (FMOD_CODEC_STATE *codec_state, void *buffer, unsigned int sizebytes, unsigned int *bytesread);
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_FILE_SEEK_FUNC) (FMOD_CODEC_STATE *codec_state, unsigned int pos, FMOD_CODEC_SEEK_METHOD method);
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_FILE_TELL_FUNC) (FMOD_CODEC_STATE *codec_state, unsigned int *pos);
typedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_FILE_SIZE_FUNC) (FMOD_CODEC_STATE *codec_state, unsigned int *size);
/*
Codec structures
*/
typedef struct FMOD_CODEC_DESCRIPTION
{
unsigned int apiversion;
const char *name;
unsigned int version;
int defaultasstream;
FMOD_TIMEUNIT timeunits;
FMOD_CODEC_OPEN_CALLBACK open;
FMOD_CODEC_CLOSE_CALLBACK close;
FMOD_CODEC_READ_CALLBACK read;
FMOD_CODEC_GETLENGTH_CALLBACK getlength;
FMOD_CODEC_SETPOSITION_CALLBACK setposition;
FMOD_CODEC_GETPOSITION_CALLBACK getposition;
FMOD_CODEC_SOUNDCREATE_CALLBACK soundcreate;
FMOD_CODEC_GETWAVEFORMAT_CALLBACK getwaveformat;
} FMOD_CODEC_DESCRIPTION;
struct FMOD_CODEC_WAVEFORMAT
{
const char* name;
FMOD_SOUND_FORMAT format;
int channels;
int frequency;
unsigned int lengthbytes;
unsigned int lengthpcm;
unsigned int pcmblocksize;
int loopstart;
int loopend;
FMOD_MODE mode;
FMOD_CHANNELMASK channelmask;
FMOD_CHANNELORDER channelorder;
float peakvolume;
};
typedef struct FMOD_CODEC_STATE_FUNCTIONS
{
FMOD_CODEC_METADATA_FUNC metadata;
FMOD_CODEC_ALLOC_FUNC alloc;
FMOD_CODEC_FREE_FUNC free;
FMOD_CODEC_LOG_FUNC log;
FMOD_CODEC_FILE_READ_FUNC read;
FMOD_CODEC_FILE_SEEK_FUNC seek;
FMOD_CODEC_FILE_TELL_FUNC tell;
FMOD_CODEC_FILE_SIZE_FUNC size;
} FMOD_CODEC_STATE_FUNCTIONS;
struct FMOD_CODEC_STATE
{
void *plugindata;
FMOD_CODEC_WAVEFORMAT *waveformat;
FMOD_CODEC_STATE_FUNCTIONS *functions;
int numsubsounds;
};
/*
Codec macros
*/
#define FMOD_CODEC_METADATA(_state, _tagtype, _name, _data, _datalen, _datatype, _unique) \
(_state)->functions->metadata(_state, _tagtype, _name, _data, _datalen, _datatype, _unique)
#define FMOD_CODEC_ALLOC(_state, _size, _align) \
(_state)->functions->alloc(_size, _align, __FILE__, __LINE__)
#define FMOD_CODEC_FREE(_state, _ptr) \
(_state)->functions->free(_ptr, __FILE__, __LINE__)
#define FMOD_CODEC_LOG(_state, _level, _location, _format, ...) \
(_state)->functions->log(_level, __FILE__, __LINE__, _location, _format, __VA_ARGS__)
#define FMOD_CODEC_FILE_READ(_state, _buffer, _sizebytes, _bytesread) \
(_state)->functions->read(_state, _buffer, _sizebytes, _bytesread)
#define FMOD_CODEC_FILE_SEEK(_state, _pos, _method) \
(_state)->functions->seek(_state, _pos, _method)
#define FMOD_CODEC_FILE_TELL(_state, _pos) \
(_state)->functions->tell(_state, _pos)
#define FMOD_CODEC_FILE_SIZE(_state, _size) \
(_state)->functions->size(_state, _size)
#endif

View File

@@ -0,0 +1,899 @@
/* ======================================================================================== */
/* FMOD Core API - Common C/C++ header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* This header is included by fmod.hpp (C++ interface) and fmod.h (C interface) */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/core-api-common.html */
/* ======================================================================================== */
#ifndef _FMOD_COMMON_H
#define _FMOD_COMMON_H
/*
Library import helpers
*/
#if defined(_WIN32) || defined(__CYGWIN__)
#define F_CALL __stdcall
#else
#define F_CALL
#endif
#if defined(_WIN32) || defined(__CYGWIN__) || defined(__ORBIS__) || defined(F_USE_DECLSPEC)
#define F_EXPORT __declspec(dllexport)
#elif defined(__APPLE__) || defined(__ANDROID__) || defined(__linux__) || defined(F_USE_ATTRIBUTE)
#define F_EXPORT __attribute__((visibility("default")))
#else
#define F_EXPORT
#endif
#ifdef DLL_EXPORTS
#define F_API F_EXPORT F_CALL
#else
#define F_API F_CALL
#endif
#define F_CALLBACK F_CALL
/*
FMOD core types
*/
typedef int FMOD_BOOL;
typedef struct FMOD_SYSTEM FMOD_SYSTEM;
typedef struct FMOD_SOUND FMOD_SOUND;
typedef struct FMOD_CHANNELCONTROL FMOD_CHANNELCONTROL;
typedef struct FMOD_CHANNEL FMOD_CHANNEL;
typedef struct FMOD_CHANNELGROUP FMOD_CHANNELGROUP;
typedef struct FMOD_SOUNDGROUP FMOD_SOUNDGROUP;
typedef struct FMOD_REVERB3D FMOD_REVERB3D;
typedef struct FMOD_DSP FMOD_DSP;
typedef struct FMOD_DSPCONNECTION FMOD_DSPCONNECTION;
typedef struct FMOD_POLYGON FMOD_POLYGON;
typedef struct FMOD_GEOMETRY FMOD_GEOMETRY;
typedef struct FMOD_SYNCPOINT FMOD_SYNCPOINT;
typedef struct FMOD_ASYNCREADINFO FMOD_ASYNCREADINFO;
/*
FMOD constants
*/
#define FMOD_VERSION 0x00020212 /* 0xaaaabbcc -> aaaa = product version, bb = major version, cc = minor version.*/
typedef unsigned int FMOD_DEBUG_FLAGS;
#define FMOD_DEBUG_LEVEL_NONE 0x00000000
#define FMOD_DEBUG_LEVEL_ERROR 0x00000001
#define FMOD_DEBUG_LEVEL_WARNING 0x00000002
#define FMOD_DEBUG_LEVEL_LOG 0x00000004
#define FMOD_DEBUG_TYPE_MEMORY 0x00000100
#define FMOD_DEBUG_TYPE_FILE 0x00000200
#define FMOD_DEBUG_TYPE_CODEC 0x00000400
#define FMOD_DEBUG_TYPE_TRACE 0x00000800
#define FMOD_DEBUG_DISPLAY_TIMESTAMPS 0x00010000
#define FMOD_DEBUG_DISPLAY_LINENUMBERS 0x00020000
#define FMOD_DEBUG_DISPLAY_THREAD 0x00040000
typedef unsigned int FMOD_MEMORY_TYPE;
#define FMOD_MEMORY_NORMAL 0x00000000
#define FMOD_MEMORY_STREAM_FILE 0x00000001
#define FMOD_MEMORY_STREAM_DECODE 0x00000002
#define FMOD_MEMORY_SAMPLEDATA 0x00000004
#define FMOD_MEMORY_DSP_BUFFER 0x00000008
#define FMOD_MEMORY_PLUGIN 0x00000010
#define FMOD_MEMORY_PERSISTENT 0x00200000
#define FMOD_MEMORY_ALL 0xFFFFFFFF
typedef unsigned int FMOD_INITFLAGS;
#define FMOD_INIT_NORMAL 0x00000000
#define FMOD_INIT_STREAM_FROM_UPDATE 0x00000001
#define FMOD_INIT_MIX_FROM_UPDATE 0x00000002
#define FMOD_INIT_3D_RIGHTHANDED 0x00000004
#define FMOD_INIT_CLIP_OUTPUT 0x00000008
#define FMOD_INIT_CHANNEL_LOWPASS 0x00000100
#define FMOD_INIT_CHANNEL_DISTANCEFILTER 0x00000200
#define FMOD_INIT_PROFILE_ENABLE 0x00010000
#define FMOD_INIT_VOL0_BECOMES_VIRTUAL 0x00020000
#define FMOD_INIT_GEOMETRY_USECLOSEST 0x00040000
#define FMOD_INIT_PREFER_DOLBY_DOWNMIX 0x00080000
#define FMOD_INIT_THREAD_UNSAFE 0x00100000
#define FMOD_INIT_PROFILE_METER_ALL 0x00200000
#define FMOD_INIT_MEMORY_TRACKING 0x00400000
typedef unsigned int FMOD_DRIVER_STATE;
#define FMOD_DRIVER_STATE_CONNECTED 0x00000001
#define FMOD_DRIVER_STATE_DEFAULT 0x00000002
typedef unsigned int FMOD_TIMEUNIT;
#define FMOD_TIMEUNIT_MS 0x00000001
#define FMOD_TIMEUNIT_PCM 0x00000002
#define FMOD_TIMEUNIT_PCMBYTES 0x00000004
#define FMOD_TIMEUNIT_RAWBYTES 0x00000008
#define FMOD_TIMEUNIT_PCMFRACTION 0x00000010
#define FMOD_TIMEUNIT_MODORDER 0x00000100
#define FMOD_TIMEUNIT_MODROW 0x00000200
#define FMOD_TIMEUNIT_MODPATTERN 0x00000400
typedef unsigned int FMOD_SYSTEM_CALLBACK_TYPE;
#define FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED 0x00000001
#define FMOD_SYSTEM_CALLBACK_DEVICELOST 0x00000002
#define FMOD_SYSTEM_CALLBACK_MEMORYALLOCATIONFAILED 0x00000004
#define FMOD_SYSTEM_CALLBACK_THREADCREATED 0x00000008
#define FMOD_SYSTEM_CALLBACK_BADDSPCONNECTION 0x00000010
#define FMOD_SYSTEM_CALLBACK_PREMIX 0x00000020
#define FMOD_SYSTEM_CALLBACK_POSTMIX 0x00000040
#define FMOD_SYSTEM_CALLBACK_ERROR 0x00000080
#define FMOD_SYSTEM_CALLBACK_MIDMIX 0x00000100
#define FMOD_SYSTEM_CALLBACK_THREADDESTROYED 0x00000200
#define FMOD_SYSTEM_CALLBACK_PREUPDATE 0x00000400
#define FMOD_SYSTEM_CALLBACK_POSTUPDATE 0x00000800
#define FMOD_SYSTEM_CALLBACK_RECORDLISTCHANGED 0x00001000
#define FMOD_SYSTEM_CALLBACK_BUFFEREDNOMIX 0x00002000
#define FMOD_SYSTEM_CALLBACK_DEVICEREINITIALIZE 0x00004000
#define FMOD_SYSTEM_CALLBACK_OUTPUTUNDERRUN 0x00008000
#define FMOD_SYSTEM_CALLBACK_RECORDPOSITIONCHANGED 0x00010000
#define FMOD_SYSTEM_CALLBACK_ALL 0xFFFFFFFF
typedef unsigned int FMOD_MODE;
#define FMOD_DEFAULT 0x00000000
#define FMOD_LOOP_OFF 0x00000001
#define FMOD_LOOP_NORMAL 0x00000002
#define FMOD_LOOP_BIDI 0x00000004
#define FMOD_2D 0x00000008
#define FMOD_3D 0x00000010
#define FMOD_CREATESTREAM 0x00000080
#define FMOD_CREATESAMPLE 0x00000100
#define FMOD_CREATECOMPRESSEDSAMPLE 0x00000200
#define FMOD_OPENUSER 0x00000400
#define FMOD_OPENMEMORY 0x00000800
#define FMOD_OPENMEMORY_POINT 0x10000000
#define FMOD_OPENRAW 0x00001000
#define FMOD_OPENONLY 0x00002000
#define FMOD_ACCURATETIME 0x00004000
#define FMOD_MPEGSEARCH 0x00008000
#define FMOD_NONBLOCKING 0x00010000
#define FMOD_UNIQUE 0x00020000
#define FMOD_3D_HEADRELATIVE 0x00040000
#define FMOD_3D_WORLDRELATIVE 0x00080000
#define FMOD_3D_INVERSEROLLOFF 0x00100000
#define FMOD_3D_LINEARROLLOFF 0x00200000
#define FMOD_3D_LINEARSQUAREROLLOFF 0x00400000
#define FMOD_3D_INVERSETAPEREDROLLOFF 0x00800000
#define FMOD_3D_CUSTOMROLLOFF 0x04000000
#define FMOD_3D_IGNOREGEOMETRY 0x40000000
#define FMOD_IGNORETAGS 0x02000000
#define FMOD_LOWMEM 0x08000000
#define FMOD_VIRTUAL_PLAYFROMSTART 0x80000000
typedef unsigned int FMOD_CHANNELMASK;
#define FMOD_CHANNELMASK_FRONT_LEFT 0x00000001
#define FMOD_CHANNELMASK_FRONT_RIGHT 0x00000002
#define FMOD_CHANNELMASK_FRONT_CENTER 0x00000004
#define FMOD_CHANNELMASK_LOW_FREQUENCY 0x00000008
#define FMOD_CHANNELMASK_SURROUND_LEFT 0x00000010
#define FMOD_CHANNELMASK_SURROUND_RIGHT 0x00000020
#define FMOD_CHANNELMASK_BACK_LEFT 0x00000040
#define FMOD_CHANNELMASK_BACK_RIGHT 0x00000080
#define FMOD_CHANNELMASK_BACK_CENTER 0x00000100
#define FMOD_CHANNELMASK_MONO (FMOD_CHANNELMASK_FRONT_LEFT)
#define FMOD_CHANNELMASK_STEREO (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT)
#define FMOD_CHANNELMASK_LRC (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER)
#define FMOD_CHANNELMASK_QUAD (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT)
#define FMOD_CHANNELMASK_SURROUND (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT)
#define FMOD_CHANNELMASK_5POINT1 (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT)
#define FMOD_CHANNELMASK_5POINT1_REARS (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT)
#define FMOD_CHANNELMASK_7POINT0 (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT)
#define FMOD_CHANNELMASK_7POINT1 (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT)
typedef unsigned long long FMOD_PORT_INDEX;
#define FMOD_PORT_INDEX_NONE 0xFFFFFFFFFFFFFFFF
#define FMOD_PORT_INDEX_FLAG_VR_CONTROLLER 0x1000000000000000
typedef int FMOD_THREAD_PRIORITY;
/* Platform specific priority range */
#define FMOD_THREAD_PRIORITY_PLATFORM_MIN (-32 * 1024)
#define FMOD_THREAD_PRIORITY_PLATFORM_MAX ( 32 * 1024)
/* Platform agnostic priorities, maps internally to platform specific value */
#define FMOD_THREAD_PRIORITY_DEFAULT (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 1)
#define FMOD_THREAD_PRIORITY_LOW (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 2)
#define FMOD_THREAD_PRIORITY_MEDIUM (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 3)
#define FMOD_THREAD_PRIORITY_HIGH (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 4)
#define FMOD_THREAD_PRIORITY_VERY_HIGH (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 5)
#define FMOD_THREAD_PRIORITY_EXTREME (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 6)
#define FMOD_THREAD_PRIORITY_CRITICAL (FMOD_THREAD_PRIORITY_PLATFORM_MIN - 7)
/* Thread defaults */
#define FMOD_THREAD_PRIORITY_MIXER FMOD_THREAD_PRIORITY_EXTREME
#define FMOD_THREAD_PRIORITY_FEEDER FMOD_THREAD_PRIORITY_CRITICAL
#define FMOD_THREAD_PRIORITY_STREAM FMOD_THREAD_PRIORITY_VERY_HIGH
#define FMOD_THREAD_PRIORITY_FILE FMOD_THREAD_PRIORITY_HIGH
#define FMOD_THREAD_PRIORITY_NONBLOCKING FMOD_THREAD_PRIORITY_HIGH
#define FMOD_THREAD_PRIORITY_RECORD FMOD_THREAD_PRIORITY_HIGH
#define FMOD_THREAD_PRIORITY_GEOMETRY FMOD_THREAD_PRIORITY_LOW
#define FMOD_THREAD_PRIORITY_PROFILER FMOD_THREAD_PRIORITY_MEDIUM
#define FMOD_THREAD_PRIORITY_STUDIO_UPDATE FMOD_THREAD_PRIORITY_MEDIUM
#define FMOD_THREAD_PRIORITY_STUDIO_LOAD_BANK FMOD_THREAD_PRIORITY_MEDIUM
#define FMOD_THREAD_PRIORITY_STUDIO_LOAD_SAMPLE FMOD_THREAD_PRIORITY_MEDIUM
#define FMOD_THREAD_PRIORITY_CONVOLUTION1 FMOD_THREAD_PRIORITY_VERY_HIGH
#define FMOD_THREAD_PRIORITY_CONVOLUTION2 FMOD_THREAD_PRIORITY_VERY_HIGH
typedef unsigned int FMOD_THREAD_STACK_SIZE;
#define FMOD_THREAD_STACK_SIZE_DEFAULT 0
#define FMOD_THREAD_STACK_SIZE_MIXER (80 * 1024)
#define FMOD_THREAD_STACK_SIZE_FEEDER (16 * 1024)
#define FMOD_THREAD_STACK_SIZE_STREAM (96 * 1024)
#define FMOD_THREAD_STACK_SIZE_FILE (64 * 1024)
#define FMOD_THREAD_STACK_SIZE_NONBLOCKING (112 * 1024)
#define FMOD_THREAD_STACK_SIZE_RECORD (16 * 1024)
#define FMOD_THREAD_STACK_SIZE_GEOMETRY (48 * 1024)
#define FMOD_THREAD_STACK_SIZE_PROFILER (128 * 1024)
#define FMOD_THREAD_STACK_SIZE_STUDIO_UPDATE (96 * 1024)
#define FMOD_THREAD_STACK_SIZE_STUDIO_LOAD_BANK (96 * 1024)
#define FMOD_THREAD_STACK_SIZE_STUDIO_LOAD_SAMPLE (96 * 1024)
#define FMOD_THREAD_STACK_SIZE_CONVOLUTION1 (16 * 1024)
#define FMOD_THREAD_STACK_SIZE_CONVOLUTION2 (16 * 1024)
typedef long long FMOD_THREAD_AFFINITY;
/* Platform agnostic thread groupings */
#define FMOD_THREAD_AFFINITY_GROUP_DEFAULT 0x4000000000000000
#define FMOD_THREAD_AFFINITY_GROUP_A 0x4000000000000001
#define FMOD_THREAD_AFFINITY_GROUP_B 0x4000000000000002
#define FMOD_THREAD_AFFINITY_GROUP_C 0x4000000000000003
/* Thread defaults */
#define FMOD_THREAD_AFFINITY_MIXER FMOD_THREAD_AFFINITY_GROUP_A
#define FMOD_THREAD_AFFINITY_FEEDER FMOD_THREAD_AFFINITY_GROUP_C
#define FMOD_THREAD_AFFINITY_STREAM FMOD_THREAD_AFFINITY_GROUP_C
#define FMOD_THREAD_AFFINITY_FILE FMOD_THREAD_AFFINITY_GROUP_C
#define FMOD_THREAD_AFFINITY_NONBLOCKING FMOD_THREAD_AFFINITY_GROUP_C
#define FMOD_THREAD_AFFINITY_RECORD FMOD_THREAD_AFFINITY_GROUP_C
#define FMOD_THREAD_AFFINITY_GEOMETRY FMOD_THREAD_AFFINITY_GROUP_C
#define FMOD_THREAD_AFFINITY_PROFILER FMOD_THREAD_AFFINITY_GROUP_C
#define FMOD_THREAD_AFFINITY_STUDIO_UPDATE FMOD_THREAD_AFFINITY_GROUP_B
#define FMOD_THREAD_AFFINITY_STUDIO_LOAD_BANK FMOD_THREAD_AFFINITY_GROUP_C
#define FMOD_THREAD_AFFINITY_STUDIO_LOAD_SAMPLE FMOD_THREAD_AFFINITY_GROUP_C
#define FMOD_THREAD_AFFINITY_CONVOLUTION1 FMOD_THREAD_AFFINITY_GROUP_C
#define FMOD_THREAD_AFFINITY_CONVOLUTION2 FMOD_THREAD_AFFINITY_GROUP_C
/* Core mask, valid up to 1 << 62 */
#define FMOD_THREAD_AFFINITY_CORE_ALL 0
#define FMOD_THREAD_AFFINITY_CORE_0 (1 << 0)
#define FMOD_THREAD_AFFINITY_CORE_1 (1 << 1)
#define FMOD_THREAD_AFFINITY_CORE_2 (1 << 2)
#define FMOD_THREAD_AFFINITY_CORE_3 (1 << 3)
#define FMOD_THREAD_AFFINITY_CORE_4 (1 << 4)
#define FMOD_THREAD_AFFINITY_CORE_5 (1 << 5)
#define FMOD_THREAD_AFFINITY_CORE_6 (1 << 6)
#define FMOD_THREAD_AFFINITY_CORE_7 (1 << 7)
#define FMOD_THREAD_AFFINITY_CORE_8 (1 << 8)
#define FMOD_THREAD_AFFINITY_CORE_9 (1 << 9)
#define FMOD_THREAD_AFFINITY_CORE_10 (1 << 10)
#define FMOD_THREAD_AFFINITY_CORE_11 (1 << 11)
#define FMOD_THREAD_AFFINITY_CORE_12 (1 << 12)
#define FMOD_THREAD_AFFINITY_CORE_13 (1 << 13)
#define FMOD_THREAD_AFFINITY_CORE_14 (1 << 14)
#define FMOD_THREAD_AFFINITY_CORE_15 (1 << 15)
/* Preset for FMOD_REVERB_PROPERTIES */
#define FMOD_PRESET_OFF { 1000, 7, 11, 5000, 100, 100, 100, 250, 0, 20, 96, -80.0f }
#define FMOD_PRESET_GENERIC { 1500, 7, 11, 5000, 83, 100, 100, 250, 0, 14500, 96, -8.0f }
#define FMOD_PRESET_PADDEDCELL { 170, 1, 2, 5000, 10, 100, 100, 250, 0, 160, 84, -7.8f }
#define FMOD_PRESET_ROOM { 400, 2, 3, 5000, 83, 100, 100, 250, 0, 6050, 88, -9.4f }
#define FMOD_PRESET_BATHROOM { 1500, 7, 11, 5000, 54, 100, 60, 250, 0, 2900, 83, 0.5f }
#define FMOD_PRESET_LIVINGROOM { 500, 3, 4, 5000, 10, 100, 100, 250, 0, 160, 58, -19.0f }
#define FMOD_PRESET_STONEROOM { 2300, 12, 17, 5000, 64, 100, 100, 250, 0, 7800, 71, -8.5f }
#define FMOD_PRESET_AUDITORIUM { 4300, 20, 30, 5000, 59, 100, 100, 250, 0, 5850, 64, -11.7f }
#define FMOD_PRESET_CONCERTHALL { 3900, 20, 29, 5000, 70, 100, 100, 250, 0, 5650, 80, -9.8f }
#define FMOD_PRESET_CAVE { 2900, 15, 22, 5000, 100, 100, 100, 250, 0, 20000, 59, -11.3f }
#define FMOD_PRESET_ARENA { 7200, 20, 30, 5000, 33, 100, 100, 250, 0, 4500, 80, -9.6f }
#define FMOD_PRESET_HANGAR { 10000, 20, 30, 5000, 23, 100, 100, 250, 0, 3400, 72, -7.4f }
#define FMOD_PRESET_CARPETTEDHALLWAY { 300, 2, 30, 5000, 10, 100, 100, 250, 0, 500, 56, -24.0f }
#define FMOD_PRESET_HALLWAY { 1500, 7, 11, 5000, 59, 100, 100, 250, 0, 7800, 87, -5.5f }
#define FMOD_PRESET_STONECORRIDOR { 270, 13, 20, 5000, 79, 100, 100, 250, 0, 9000, 86, -6.0f }
#define FMOD_PRESET_ALLEY { 1500, 7, 11, 5000, 86, 100, 100, 250, 0, 8300, 80, -9.8f }
#define FMOD_PRESET_FOREST { 1500, 162, 88, 5000, 54, 79, 100, 250, 0, 760, 94, -12.3f }
#define FMOD_PRESET_CITY { 1500, 7, 11, 5000, 67, 50, 100, 250, 0, 4050, 66, -26.0f }
#define FMOD_PRESET_MOUNTAINS { 1500, 300, 100, 5000, 21, 27, 100, 250, 0, 1220, 82, -24.0f }
#define FMOD_PRESET_QUARRY { 1500, 61, 25, 5000, 83, 100, 100, 250, 0, 3400, 100, -5.0f }
#define FMOD_PRESET_PLAIN { 1500, 179, 100, 5000, 50, 21, 100, 250, 0, 1670, 65, -28.0f }
#define FMOD_PRESET_PARKINGLOT { 1700, 8, 12, 5000, 100, 100, 100, 250, 0, 20000, 56, -19.5f }
#define FMOD_PRESET_SEWERPIPE { 2800, 14, 21, 5000, 14, 80, 60, 250, 0, 3400, 66, 1.2f }
#define FMOD_PRESET_UNDERWATER { 1500, 7, 11, 5000, 10, 100, 100, 250, 0, 500, 92, 7.0f }
#define FMOD_MAX_CHANNEL_WIDTH 32
#define FMOD_MAX_SYSTEMS 8
#define FMOD_MAX_LISTENERS 8
#define FMOD_REVERB_MAXINSTANCES 4
typedef enum FMOD_THREAD_TYPE
{
FMOD_THREAD_TYPE_MIXER,
FMOD_THREAD_TYPE_FEEDER,
FMOD_THREAD_TYPE_STREAM,
FMOD_THREAD_TYPE_FILE,
FMOD_THREAD_TYPE_NONBLOCKING,
FMOD_THREAD_TYPE_RECORD,
FMOD_THREAD_TYPE_GEOMETRY,
FMOD_THREAD_TYPE_PROFILER,
FMOD_THREAD_TYPE_STUDIO_UPDATE,
FMOD_THREAD_TYPE_STUDIO_LOAD_BANK,
FMOD_THREAD_TYPE_STUDIO_LOAD_SAMPLE,
FMOD_THREAD_TYPE_CONVOLUTION1,
FMOD_THREAD_TYPE_CONVOLUTION2,
FMOD_THREAD_TYPE_MAX,
FMOD_THREAD_TYPE_FORCEINT = 65536
} FMOD_THREAD_TYPE;
typedef enum FMOD_RESULT
{
FMOD_OK,
FMOD_ERR_BADCOMMAND,
FMOD_ERR_CHANNEL_ALLOC,
FMOD_ERR_CHANNEL_STOLEN,
FMOD_ERR_DMA,
FMOD_ERR_DSP_CONNECTION,
FMOD_ERR_DSP_DONTPROCESS,
FMOD_ERR_DSP_FORMAT,
FMOD_ERR_DSP_INUSE,
FMOD_ERR_DSP_NOTFOUND,
FMOD_ERR_DSP_RESERVED,
FMOD_ERR_DSP_SILENCE,
FMOD_ERR_DSP_TYPE,
FMOD_ERR_FILE_BAD,
FMOD_ERR_FILE_COULDNOTSEEK,
FMOD_ERR_FILE_DISKEJECTED,
FMOD_ERR_FILE_EOF,
FMOD_ERR_FILE_ENDOFDATA,
FMOD_ERR_FILE_NOTFOUND,
FMOD_ERR_FORMAT,
FMOD_ERR_HEADER_MISMATCH,
FMOD_ERR_HTTP,
FMOD_ERR_HTTP_ACCESS,
FMOD_ERR_HTTP_PROXY_AUTH,
FMOD_ERR_HTTP_SERVER_ERROR,
FMOD_ERR_HTTP_TIMEOUT,
FMOD_ERR_INITIALIZATION,
FMOD_ERR_INITIALIZED,
FMOD_ERR_INTERNAL,
FMOD_ERR_INVALID_FLOAT,
FMOD_ERR_INVALID_HANDLE,
FMOD_ERR_INVALID_PARAM,
FMOD_ERR_INVALID_POSITION,
FMOD_ERR_INVALID_SPEAKER,
FMOD_ERR_INVALID_SYNCPOINT,
FMOD_ERR_INVALID_THREAD,
FMOD_ERR_INVALID_VECTOR,
FMOD_ERR_MAXAUDIBLE,
FMOD_ERR_MEMORY,
FMOD_ERR_MEMORY_CANTPOINT,
FMOD_ERR_NEEDS3D,
FMOD_ERR_NEEDSHARDWARE,
FMOD_ERR_NET_CONNECT,
FMOD_ERR_NET_SOCKET_ERROR,
FMOD_ERR_NET_URL,
FMOD_ERR_NET_WOULD_BLOCK,
FMOD_ERR_NOTREADY,
FMOD_ERR_OUTPUT_ALLOCATED,
FMOD_ERR_OUTPUT_CREATEBUFFER,
FMOD_ERR_OUTPUT_DRIVERCALL,
FMOD_ERR_OUTPUT_FORMAT,
FMOD_ERR_OUTPUT_INIT,
FMOD_ERR_OUTPUT_NODRIVERS,
FMOD_ERR_PLUGIN,
FMOD_ERR_PLUGIN_MISSING,
FMOD_ERR_PLUGIN_RESOURCE,
FMOD_ERR_PLUGIN_VERSION,
FMOD_ERR_RECORD,
FMOD_ERR_REVERB_CHANNELGROUP,
FMOD_ERR_REVERB_INSTANCE,
FMOD_ERR_SUBSOUNDS,
FMOD_ERR_SUBSOUND_ALLOCATED,
FMOD_ERR_SUBSOUND_CANTMOVE,
FMOD_ERR_TAGNOTFOUND,
FMOD_ERR_TOOMANYCHANNELS,
FMOD_ERR_TRUNCATED,
FMOD_ERR_UNIMPLEMENTED,
FMOD_ERR_UNINITIALIZED,
FMOD_ERR_UNSUPPORTED,
FMOD_ERR_VERSION,
FMOD_ERR_EVENT_ALREADY_LOADED,
FMOD_ERR_EVENT_LIVEUPDATE_BUSY,
FMOD_ERR_EVENT_LIVEUPDATE_MISMATCH,
FMOD_ERR_EVENT_LIVEUPDATE_TIMEOUT,
FMOD_ERR_EVENT_NOTFOUND,
FMOD_ERR_STUDIO_UNINITIALIZED,
FMOD_ERR_STUDIO_NOT_LOADED,
FMOD_ERR_INVALID_STRING,
FMOD_ERR_ALREADY_LOCKED,
FMOD_ERR_NOT_LOCKED,
FMOD_ERR_RECORD_DISCONNECTED,
FMOD_ERR_TOOMANYSAMPLES,
FMOD_RESULT_FORCEINT = 65536
} FMOD_RESULT;
typedef enum FMOD_CHANNELCONTROL_TYPE
{
FMOD_CHANNELCONTROL_CHANNEL,
FMOD_CHANNELCONTROL_CHANNELGROUP,
FMOD_CHANNELCONTROL_MAX,
FMOD_CHANNELCONTROL_FORCEINT = 65536
} FMOD_CHANNELCONTROL_TYPE;
typedef enum FMOD_OUTPUTTYPE
{
FMOD_OUTPUTTYPE_AUTODETECT,
FMOD_OUTPUTTYPE_UNKNOWN,
FMOD_OUTPUTTYPE_NOSOUND,
FMOD_OUTPUTTYPE_WAVWRITER,
FMOD_OUTPUTTYPE_NOSOUND_NRT,
FMOD_OUTPUTTYPE_WAVWRITER_NRT,
FMOD_OUTPUTTYPE_WASAPI,
FMOD_OUTPUTTYPE_ASIO,
FMOD_OUTPUTTYPE_PULSEAUDIO,
FMOD_OUTPUTTYPE_ALSA,
FMOD_OUTPUTTYPE_COREAUDIO,
FMOD_OUTPUTTYPE_AUDIOTRACK,
FMOD_OUTPUTTYPE_OPENSL,
FMOD_OUTPUTTYPE_AUDIOOUT,
FMOD_OUTPUTTYPE_AUDIO3D,
FMOD_OUTPUTTYPE_WEBAUDIO,
FMOD_OUTPUTTYPE_NNAUDIO,
FMOD_OUTPUTTYPE_WINSONIC,
FMOD_OUTPUTTYPE_AAUDIO,
FMOD_OUTPUTTYPE_AUDIOWORKLET,
FMOD_OUTPUTTYPE_PHASE,
FMOD_OUTPUTTYPE_MAX,
FMOD_OUTPUTTYPE_FORCEINT = 65536
} FMOD_OUTPUTTYPE;
typedef enum FMOD_DEBUG_MODE
{
FMOD_DEBUG_MODE_TTY,
FMOD_DEBUG_MODE_FILE,
FMOD_DEBUG_MODE_CALLBACK,
FMOD_DEBUG_MODE_FORCEINT = 65536
} FMOD_DEBUG_MODE;
typedef enum FMOD_SPEAKERMODE
{
FMOD_SPEAKERMODE_DEFAULT,
FMOD_SPEAKERMODE_RAW,
FMOD_SPEAKERMODE_MONO,
FMOD_SPEAKERMODE_STEREO,
FMOD_SPEAKERMODE_QUAD,
FMOD_SPEAKERMODE_SURROUND,
FMOD_SPEAKERMODE_5POINT1,
FMOD_SPEAKERMODE_7POINT1,
FMOD_SPEAKERMODE_7POINT1POINT4,
FMOD_SPEAKERMODE_MAX,
FMOD_SPEAKERMODE_FORCEINT = 65536
} FMOD_SPEAKERMODE;
typedef enum FMOD_SPEAKER
{
FMOD_SPEAKER_NONE = -1,
FMOD_SPEAKER_FRONT_LEFT = 0,
FMOD_SPEAKER_FRONT_RIGHT,
FMOD_SPEAKER_FRONT_CENTER,
FMOD_SPEAKER_LOW_FREQUENCY,
FMOD_SPEAKER_SURROUND_LEFT,
FMOD_SPEAKER_SURROUND_RIGHT,
FMOD_SPEAKER_BACK_LEFT,
FMOD_SPEAKER_BACK_RIGHT,
FMOD_SPEAKER_TOP_FRONT_LEFT,
FMOD_SPEAKER_TOP_FRONT_RIGHT,
FMOD_SPEAKER_TOP_BACK_LEFT,
FMOD_SPEAKER_TOP_BACK_RIGHT,
FMOD_SPEAKER_MAX,
FMOD_SPEAKER_FORCEINT = 65536
} FMOD_SPEAKER;
typedef enum FMOD_CHANNELORDER
{
FMOD_CHANNELORDER_DEFAULT,
FMOD_CHANNELORDER_WAVEFORMAT,
FMOD_CHANNELORDER_PROTOOLS,
FMOD_CHANNELORDER_ALLMONO,
FMOD_CHANNELORDER_ALLSTEREO,
FMOD_CHANNELORDER_ALSA,
FMOD_CHANNELORDER_MAX,
FMOD_CHANNELORDER_FORCEINT = 65536
} FMOD_CHANNELORDER;
typedef enum FMOD_PLUGINTYPE
{
FMOD_PLUGINTYPE_OUTPUT,
FMOD_PLUGINTYPE_CODEC,
FMOD_PLUGINTYPE_DSP,
FMOD_PLUGINTYPE_MAX,
FMOD_PLUGINTYPE_FORCEINT = 65536
} FMOD_PLUGINTYPE;
typedef enum FMOD_SOUND_TYPE
{
FMOD_SOUND_TYPE_UNKNOWN,
FMOD_SOUND_TYPE_AIFF,
FMOD_SOUND_TYPE_ASF,
FMOD_SOUND_TYPE_DLS,
FMOD_SOUND_TYPE_FLAC,
FMOD_SOUND_TYPE_FSB,
FMOD_SOUND_TYPE_IT,
FMOD_SOUND_TYPE_MIDI,
FMOD_SOUND_TYPE_MOD,
FMOD_SOUND_TYPE_MPEG,
FMOD_SOUND_TYPE_OGGVORBIS,
FMOD_SOUND_TYPE_PLAYLIST,
FMOD_SOUND_TYPE_RAW,
FMOD_SOUND_TYPE_S3M,
FMOD_SOUND_TYPE_USER,
FMOD_SOUND_TYPE_WAV,
FMOD_SOUND_TYPE_XM,
FMOD_SOUND_TYPE_XMA,
FMOD_SOUND_TYPE_AUDIOQUEUE,
FMOD_SOUND_TYPE_AT9,
FMOD_SOUND_TYPE_VORBIS,
FMOD_SOUND_TYPE_MEDIA_FOUNDATION,
FMOD_SOUND_TYPE_MEDIACODEC,
FMOD_SOUND_TYPE_FADPCM,
FMOD_SOUND_TYPE_OPUS,
FMOD_SOUND_TYPE_MAX,
FMOD_SOUND_TYPE_FORCEINT = 65536
} FMOD_SOUND_TYPE;
typedef enum FMOD_SOUND_FORMAT
{
FMOD_SOUND_FORMAT_NONE,
FMOD_SOUND_FORMAT_PCM8,
FMOD_SOUND_FORMAT_PCM16,
FMOD_SOUND_FORMAT_PCM24,
FMOD_SOUND_FORMAT_PCM32,
FMOD_SOUND_FORMAT_PCMFLOAT,
FMOD_SOUND_FORMAT_BITSTREAM,
FMOD_SOUND_FORMAT_MAX,
FMOD_SOUND_FORMAT_FORCEINT = 65536
} FMOD_SOUND_FORMAT;
typedef enum FMOD_OPENSTATE
{
FMOD_OPENSTATE_READY,
FMOD_OPENSTATE_LOADING,
FMOD_OPENSTATE_ERROR,
FMOD_OPENSTATE_CONNECTING,
FMOD_OPENSTATE_BUFFERING,
FMOD_OPENSTATE_SEEKING,
FMOD_OPENSTATE_PLAYING,
FMOD_OPENSTATE_SETPOSITION,
FMOD_OPENSTATE_MAX,
FMOD_OPENSTATE_FORCEINT = 65536
} FMOD_OPENSTATE;
typedef enum FMOD_SOUNDGROUP_BEHAVIOR
{
FMOD_SOUNDGROUP_BEHAVIOR_FAIL,
FMOD_SOUNDGROUP_BEHAVIOR_MUTE,
FMOD_SOUNDGROUP_BEHAVIOR_STEALLOWEST,
FMOD_SOUNDGROUP_BEHAVIOR_MAX,
FMOD_SOUNDGROUP_BEHAVIOR_FORCEINT = 65536
} FMOD_SOUNDGROUP_BEHAVIOR;
typedef enum FMOD_CHANNELCONTROL_CALLBACK_TYPE
{
FMOD_CHANNELCONTROL_CALLBACK_END,
FMOD_CHANNELCONTROL_CALLBACK_VIRTUALVOICE,
FMOD_CHANNELCONTROL_CALLBACK_SYNCPOINT,
FMOD_CHANNELCONTROL_CALLBACK_OCCLUSION,
FMOD_CHANNELCONTROL_CALLBACK_MAX,
FMOD_CHANNELCONTROL_CALLBACK_FORCEINT = 65536
} FMOD_CHANNELCONTROL_CALLBACK_TYPE;
typedef enum FMOD_CHANNELCONTROL_DSP_INDEX
{
FMOD_CHANNELCONTROL_DSP_HEAD = -1,
FMOD_CHANNELCONTROL_DSP_FADER = -2,
FMOD_CHANNELCONTROL_DSP_TAIL = -3,
FMOD_CHANNELCONTROL_DSP_FORCEINT = 65536
} FMOD_CHANNELCONTROL_DSP_INDEX;
typedef enum FMOD_ERRORCALLBACK_INSTANCETYPE
{
FMOD_ERRORCALLBACK_INSTANCETYPE_NONE,
FMOD_ERRORCALLBACK_INSTANCETYPE_SYSTEM,
FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNEL,
FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNELGROUP,
FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNELCONTROL,
FMOD_ERRORCALLBACK_INSTANCETYPE_SOUND,
FMOD_ERRORCALLBACK_INSTANCETYPE_SOUNDGROUP,
FMOD_ERRORCALLBACK_INSTANCETYPE_DSP,
FMOD_ERRORCALLBACK_INSTANCETYPE_DSPCONNECTION,
FMOD_ERRORCALLBACK_INSTANCETYPE_GEOMETRY,
FMOD_ERRORCALLBACK_INSTANCETYPE_REVERB3D,
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_SYSTEM,
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_EVENTDESCRIPTION,
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_EVENTINSTANCE,
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_PARAMETERINSTANCE,
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_BUS,
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_VCA,
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_BANK,
FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_COMMANDREPLAY,
FMOD_ERRORCALLBACK_INSTANCETYPE_FORCEINT = 65536
} FMOD_ERRORCALLBACK_INSTANCETYPE;
typedef enum FMOD_DSP_RESAMPLER
{
FMOD_DSP_RESAMPLER_DEFAULT,
FMOD_DSP_RESAMPLER_NOINTERP,
FMOD_DSP_RESAMPLER_LINEAR,
FMOD_DSP_RESAMPLER_CUBIC,
FMOD_DSP_RESAMPLER_SPLINE,
FMOD_DSP_RESAMPLER_MAX,
FMOD_DSP_RESAMPLER_FORCEINT = 65536
} FMOD_DSP_RESAMPLER;
typedef enum FMOD_DSP_CALLBACK_TYPE
{
FMOD_DSP_CALLBACK_DATAPARAMETERRELEASE,
FMOD_DSP_CALLBACK_MAX,
FMOD_DSP_CALLBACK_FORCEINT = 65536
} FMOD_DSP_CALLBACK_TYPE;
typedef enum FMOD_DSPCONNECTION_TYPE
{
FMOD_DSPCONNECTION_TYPE_STANDARD,
FMOD_DSPCONNECTION_TYPE_SIDECHAIN,
FMOD_DSPCONNECTION_TYPE_SEND,
FMOD_DSPCONNECTION_TYPE_SEND_SIDECHAIN,
FMOD_DSPCONNECTION_TYPE_MAX,
FMOD_DSPCONNECTION_TYPE_FORCEINT = 65536
} FMOD_DSPCONNECTION_TYPE;
typedef enum FMOD_TAGTYPE
{
FMOD_TAGTYPE_UNKNOWN,
FMOD_TAGTYPE_ID3V1,
FMOD_TAGTYPE_ID3V2,
FMOD_TAGTYPE_VORBISCOMMENT,
FMOD_TAGTYPE_SHOUTCAST,
FMOD_TAGTYPE_ICECAST,
FMOD_TAGTYPE_ASF,
FMOD_TAGTYPE_MIDI,
FMOD_TAGTYPE_PLAYLIST,
FMOD_TAGTYPE_FMOD,
FMOD_TAGTYPE_USER,
FMOD_TAGTYPE_MAX,
FMOD_TAGTYPE_FORCEINT = 65536
} FMOD_TAGTYPE;
typedef enum FMOD_TAGDATATYPE
{
FMOD_TAGDATATYPE_BINARY,
FMOD_TAGDATATYPE_INT,
FMOD_TAGDATATYPE_FLOAT,
FMOD_TAGDATATYPE_STRING,
FMOD_TAGDATATYPE_STRING_UTF16,
FMOD_TAGDATATYPE_STRING_UTF16BE,
FMOD_TAGDATATYPE_STRING_UTF8,
FMOD_TAGDATATYPE_MAX,
FMOD_TAGDATATYPE_FORCEINT = 65536
} FMOD_TAGDATATYPE;
typedef enum FMOD_PORT_TYPE
{
FMOD_PORT_TYPE_MUSIC,
FMOD_PORT_TYPE_COPYRIGHT_MUSIC,
FMOD_PORT_TYPE_VOICE,
FMOD_PORT_TYPE_CONTROLLER,
FMOD_PORT_TYPE_PERSONAL,
FMOD_PORT_TYPE_VIBRATION,
FMOD_PORT_TYPE_AUX,
FMOD_PORT_TYPE_MAX,
FMOD_PORT_TYPE_FORCEINT = 65536
} FMOD_PORT_TYPE;
/*
FMOD callbacks
*/
typedef FMOD_RESULT (F_CALL *FMOD_DEBUG_CALLBACK) (FMOD_DEBUG_FLAGS flags, const char *file, int line, const char* func, const char* message);
typedef FMOD_RESULT (F_CALL *FMOD_SYSTEM_CALLBACK) (FMOD_SYSTEM *system, FMOD_SYSTEM_CALLBACK_TYPE type, void *commanddata1, void* commanddata2, void *userdata);
typedef FMOD_RESULT (F_CALL *FMOD_CHANNELCONTROL_CALLBACK) (FMOD_CHANNELCONTROL *channelcontrol, FMOD_CHANNELCONTROL_TYPE controltype, FMOD_CHANNELCONTROL_CALLBACK_TYPE callbacktype, void *commanddata1, void *commanddata2);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_CALLBACK) (FMOD_DSP *dsp, FMOD_DSP_CALLBACK_TYPE type, void *data);
typedef FMOD_RESULT (F_CALL *FMOD_SOUND_NONBLOCK_CALLBACK) (FMOD_SOUND *sound, FMOD_RESULT result);
typedef FMOD_RESULT (F_CALL *FMOD_SOUND_PCMREAD_CALLBACK) (FMOD_SOUND *sound, void *data, unsigned int datalen);
typedef FMOD_RESULT (F_CALL *FMOD_SOUND_PCMSETPOS_CALLBACK) (FMOD_SOUND *sound, int subsound, unsigned int position, FMOD_TIMEUNIT postype);
typedef FMOD_RESULT (F_CALL *FMOD_FILE_OPEN_CALLBACK) (const char *name, unsigned int *filesize, void **handle, void *userdata);
typedef FMOD_RESULT (F_CALL *FMOD_FILE_CLOSE_CALLBACK) (void *handle, void *userdata);
typedef FMOD_RESULT (F_CALL *FMOD_FILE_READ_CALLBACK) (void *handle, void *buffer, unsigned int sizebytes, unsigned int *bytesread, void *userdata);
typedef FMOD_RESULT (F_CALL *FMOD_FILE_SEEK_CALLBACK) (void *handle, unsigned int pos, void *userdata);
typedef FMOD_RESULT (F_CALL *FMOD_FILE_ASYNCREAD_CALLBACK) (FMOD_ASYNCREADINFO *info, void *userdata);
typedef FMOD_RESULT (F_CALL *FMOD_FILE_ASYNCCANCEL_CALLBACK)(FMOD_ASYNCREADINFO *info, void *userdata);
typedef void (F_CALL *FMOD_FILE_ASYNCDONE_FUNC) (FMOD_ASYNCREADINFO *info, FMOD_RESULT result);
typedef void* (F_CALL *FMOD_MEMORY_ALLOC_CALLBACK) (unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr);
typedef void* (F_CALL *FMOD_MEMORY_REALLOC_CALLBACK) (void *ptr, unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr);
typedef void (F_CALL *FMOD_MEMORY_FREE_CALLBACK) (void *ptr, FMOD_MEMORY_TYPE type, const char *sourcestr);
typedef float (F_CALL *FMOD_3D_ROLLOFF_CALLBACK) (FMOD_CHANNELCONTROL *channelcontrol, float distance);
/*
FMOD structs
*/
struct FMOD_ASYNCREADINFO
{
void *handle;
unsigned int offset;
unsigned int sizebytes;
int priority;
void *userdata;
void *buffer;
unsigned int bytesread;
FMOD_FILE_ASYNCDONE_FUNC done;
};
typedef struct FMOD_VECTOR
{
float x;
float y;
float z;
} FMOD_VECTOR;
typedef struct FMOD_3D_ATTRIBUTES
{
FMOD_VECTOR position;
FMOD_VECTOR velocity;
FMOD_VECTOR forward;
FMOD_VECTOR up;
} FMOD_3D_ATTRIBUTES;
typedef struct FMOD_GUID
{
unsigned int Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[8];
} FMOD_GUID;
typedef struct FMOD_PLUGINLIST
{
FMOD_PLUGINTYPE type;
void *description;
} FMOD_PLUGINLIST;
typedef struct FMOD_ADVANCEDSETTINGS
{
int cbSize;
int maxMPEGCodecs;
int maxADPCMCodecs;
int maxXMACodecs;
int maxVorbisCodecs;
int maxAT9Codecs;
int maxFADPCMCodecs;
int maxPCMCodecs;
int ASIONumChannels;
char **ASIOChannelList;
FMOD_SPEAKER *ASIOSpeakerList;
float vol0virtualvol;
unsigned int defaultDecodeBufferSize;
unsigned short profilePort;
unsigned int geometryMaxFadeTime;
float distanceFilterCenterFreq;
int reverb3Dinstance;
int DSPBufferPoolSize;
FMOD_DSP_RESAMPLER resamplerMethod;
unsigned int randomSeed;
int maxConvolutionThreads;
int maxOpusCodecs;
} FMOD_ADVANCEDSETTINGS;
typedef struct FMOD_TAG
{
FMOD_TAGTYPE type;
FMOD_TAGDATATYPE datatype;
char *name;
void *data;
unsigned int datalen;
FMOD_BOOL updated;
} FMOD_TAG;
typedef struct FMOD_CREATESOUNDEXINFO
{
int cbsize;
unsigned int length;
unsigned int fileoffset;
int numchannels;
int defaultfrequency;
FMOD_SOUND_FORMAT format;
unsigned int decodebuffersize;
int initialsubsound;
int numsubsounds;
int *inclusionlist;
int inclusionlistnum;
FMOD_SOUND_PCMREAD_CALLBACK pcmreadcallback;
FMOD_SOUND_PCMSETPOS_CALLBACK pcmsetposcallback;
FMOD_SOUND_NONBLOCK_CALLBACK nonblockcallback;
const char *dlsname;
const char *encryptionkey;
int maxpolyphony;
void *userdata;
FMOD_SOUND_TYPE suggestedsoundtype;
FMOD_FILE_OPEN_CALLBACK fileuseropen;
FMOD_FILE_CLOSE_CALLBACK fileuserclose;
FMOD_FILE_READ_CALLBACK fileuserread;
FMOD_FILE_SEEK_CALLBACK fileuserseek;
FMOD_FILE_ASYNCREAD_CALLBACK fileuserasyncread;
FMOD_FILE_ASYNCCANCEL_CALLBACK fileuserasynccancel;
void *fileuserdata;
int filebuffersize;
FMOD_CHANNELORDER channelorder;
FMOD_SOUNDGROUP *initialsoundgroup;
unsigned int initialseekposition;
FMOD_TIMEUNIT initialseekpostype;
int ignoresetfilesystem;
unsigned int audioqueuepolicy;
unsigned int minmidigranularity;
int nonblockthreadid;
FMOD_GUID *fsbguid;
} FMOD_CREATESOUNDEXINFO;
typedef struct FMOD_REVERB_PROPERTIES
{
float DecayTime;
float EarlyDelay;
float LateDelay;
float HFReference;
float HFDecayRatio;
float Diffusion;
float Density;
float LowShelfFrequency;
float LowShelfGain;
float HighCut;
float EarlyLateMix;
float WetLevel;
} FMOD_REVERB_PROPERTIES;
typedef struct FMOD_ERRORCALLBACK_INFO
{
FMOD_RESULT result;
FMOD_ERRORCALLBACK_INSTANCETYPE instancetype;
void *instance;
const char *functionname;
const char *functionparams;
} FMOD_ERRORCALLBACK_INFO;
typedef struct FMOD_CPU_USAGE
{
float dsp;
float stream;
float geometry;
float update;
float convolution1;
float convolution2;
} FMOD_CPU_USAGE;
typedef struct FMOD_DSP_DATA_PARAMETER_INFO
{
void *data;
unsigned int length;
int index;
} FMOD_DSP_DATA_PARAMETER_INFO;
/*
FMOD optional headers for plugin development
*/
#include "fmod_codec.h"
#include "fmod_dsp.h"
#include "fmod_output.h"
#endif

View File

@@ -0,0 +1,897 @@
/* ======================================================================================== */
/* FMOD Core API - DSP header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* Use this header if you are wanting to develop your own DSP plugin to use with FMODs */
/* dsp system. With this header you can make your own DSP plugin that FMOD can */
/* register and use. See the documentation and examples on how to make a working plugin. */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/plugin-api-dsp.html */
/* =========================================================================================*/
using System;
using System.Text;
using System.Runtime.InteropServices;
namespace FMOD
{
[StructLayout(LayoutKind.Sequential)]
public struct DSP_BUFFER_ARRAY
{
public int numbuffers;
public int[] buffernumchannels;
public CHANNELMASK[] bufferchannelmask;
public IntPtr[] buffers;
public SPEAKERMODE speakermode;
}
public enum DSP_PROCESS_OPERATION
{
PROCESS_PERFORM = 0,
PROCESS_QUERY
}
[StructLayout(LayoutKind.Sequential)]
public struct COMPLEX
{
public float real;
public float imag;
}
public enum DSP_PAN_SURROUND_FLAGS
{
DEFAULT = 0,
ROTATION_NOT_BIASED = 1,
}
/*
DSP callbacks
*/
public delegate RESULT DSP_CREATE_CALLBACK (ref DSP_STATE dsp_state);
public delegate RESULT DSP_RELEASE_CALLBACK (ref DSP_STATE dsp_state);
public delegate RESULT DSP_RESET_CALLBACK (ref DSP_STATE dsp_state);
public delegate RESULT DSP_SETPOSITION_CALLBACK (ref DSP_STATE dsp_state, uint pos);
public delegate RESULT DSP_READ_CALLBACK (ref DSP_STATE dsp_state, IntPtr inbuffer, IntPtr outbuffer, uint length, int inchannels, ref int outchannels);
public delegate RESULT DSP_SHOULDIPROCESS_CALLBACK (ref DSP_STATE dsp_state, bool inputsidle, uint length, CHANNELMASK inmask, int inchannels, SPEAKERMODE speakermode);
public delegate RESULT DSP_PROCESS_CALLBACK (ref DSP_STATE dsp_state, uint length, ref DSP_BUFFER_ARRAY inbufferarray, ref DSP_BUFFER_ARRAY outbufferarray, bool inputsidle, DSP_PROCESS_OPERATION op);
public delegate RESULT DSP_SETPARAM_FLOAT_CALLBACK (ref DSP_STATE dsp_state, int index, float value);
public delegate RESULT DSP_SETPARAM_INT_CALLBACK (ref DSP_STATE dsp_state, int index, int value);
public delegate RESULT DSP_SETPARAM_BOOL_CALLBACK (ref DSP_STATE dsp_state, int index, bool value);
public delegate RESULT DSP_SETPARAM_DATA_CALLBACK (ref DSP_STATE dsp_state, int index, IntPtr data, uint length);
public delegate RESULT DSP_GETPARAM_FLOAT_CALLBACK (ref DSP_STATE dsp_state, int index, ref float value, IntPtr valuestr);
public delegate RESULT DSP_GETPARAM_INT_CALLBACK (ref DSP_STATE dsp_state, int index, ref int value, IntPtr valuestr);
public delegate RESULT DSP_GETPARAM_BOOL_CALLBACK (ref DSP_STATE dsp_state, int index, ref bool value, IntPtr valuestr);
public delegate RESULT DSP_GETPARAM_DATA_CALLBACK (ref DSP_STATE dsp_state, int index, ref IntPtr data, ref uint length, IntPtr valuestr);
public delegate RESULT DSP_SYSTEM_REGISTER_CALLBACK (ref DSP_STATE dsp_state);
public delegate RESULT DSP_SYSTEM_DEREGISTER_CALLBACK (ref DSP_STATE dsp_state);
public delegate RESULT DSP_SYSTEM_MIX_CALLBACK (ref DSP_STATE dsp_state, int stage);
/*
DSP functions
*/
public delegate IntPtr DSP_ALLOC_FUNC (uint size, MEMORY_TYPE type, IntPtr sourcestr);
public delegate IntPtr DSP_REALLOC_FUNC (IntPtr ptr, uint size, MEMORY_TYPE type, IntPtr sourcestr);
public delegate void DSP_FREE_FUNC (IntPtr ptr, MEMORY_TYPE type, IntPtr sourcestr);
public delegate void DSP_LOG_FUNC (DEBUG_FLAGS level, IntPtr file, int line, IntPtr function, IntPtr str);
public delegate RESULT DSP_GETSAMPLERATE_FUNC (ref DSP_STATE dsp_state, ref int rate);
public delegate RESULT DSP_GETBLOCKSIZE_FUNC (ref DSP_STATE dsp_state, ref uint blocksize);
public delegate RESULT DSP_GETSPEAKERMODE_FUNC (ref DSP_STATE dsp_state, ref int speakermode_mixer, ref int speakermode_output);
public delegate RESULT DSP_GETCLOCK_FUNC (ref DSP_STATE dsp_state, out ulong clock, out uint offset, out uint length);
public delegate RESULT DSP_GETLISTENERATTRIBUTES_FUNC (ref DSP_STATE dsp_state, ref int numlisteners, IntPtr attributes);
public delegate RESULT DSP_GETUSERDATA_FUNC (ref DSP_STATE dsp_state, out IntPtr userdata);
public delegate RESULT DSP_DFT_FFTREAL_FUNC (ref DSP_STATE dsp_state, int size, IntPtr signal, IntPtr dft, IntPtr window, int signalhop);
public delegate RESULT DSP_DFT_IFFTREAL_FUNC (ref DSP_STATE dsp_state, int size, IntPtr dft, IntPtr signal, IntPtr window, int signalhop);
public delegate RESULT DSP_PAN_SUMMONOMATRIX_FUNC (ref DSP_STATE dsp_state, int sourceSpeakerMode, float lowFrequencyGain, float overallGain, IntPtr matrix);
public delegate RESULT DSP_PAN_SUMSTEREOMATRIX_FUNC (ref DSP_STATE dsp_state, int sourceSpeakerMode, float pan, float lowFrequencyGain, float overallGain, int matrixHop, IntPtr matrix);
public delegate RESULT DSP_PAN_SUMSURROUNDMATRIX_FUNC (ref DSP_STATE dsp_state, int sourceSpeakerMode, int targetSpeakerMode, float direction, float extent, float rotation, float lowFrequencyGain, float overallGain, int matrixHop, IntPtr matrix, DSP_PAN_SURROUND_FLAGS flags);
public delegate RESULT DSP_PAN_SUMMONOTOSURROUNDMATRIX_FUNC (ref DSP_STATE dsp_state, int targetSpeakerMode, float direction, float extent, float lowFrequencyGain, float overallGain, int matrixHop, IntPtr matrix);
public delegate RESULT DSP_PAN_SUMSTEREOTOSURROUNDMATRIX_FUNC (ref DSP_STATE dsp_state, int targetSpeakerMode, float direction, float extent, float rotation, float lowFrequencyGain, float overallGain, int matrixHop, IntPtr matrix);
public delegate RESULT DSP_PAN_GETROLLOFFGAIN_FUNC (ref DSP_STATE dsp_state, DSP_PAN_3D_ROLLOFF_TYPE rolloff, float distance, float mindistance, float maxdistance, out float gain);
public enum DSP_TYPE : int
{
UNKNOWN,
MIXER,
OSCILLATOR,
LOWPASS,
ITLOWPASS,
HIGHPASS,
ECHO,
FADER,
FLANGE,
DISTORTION,
NORMALIZE,
LIMITER,
PARAMEQ,
PITCHSHIFT,
CHORUS,
VSTPLUGIN,
WINAMPPLUGIN,
ITECHO,
COMPRESSOR,
SFXREVERB,
LOWPASS_SIMPLE,
DELAY,
TREMOLO,
LADSPAPLUGIN,
SEND,
RETURN,
HIGHPASS_SIMPLE,
PAN,
THREE_EQ,
FFT,
LOUDNESS_METER,
ENVELOPEFOLLOWER,
CONVOLUTIONREVERB,
CHANNELMIX,
TRANSCEIVER,
OBJECTPAN,
MULTIBAND_EQ,
MAX
}
public enum DSP_PARAMETER_TYPE
{
FLOAT = 0,
INT,
BOOL,
DATA,
MAX
}
public enum DSP_PARAMETER_FLOAT_MAPPING_TYPE
{
DSP_PARAMETER_FLOAT_MAPPING_TYPE_LINEAR = 0,
DSP_PARAMETER_FLOAT_MAPPING_TYPE_AUTO,
DSP_PARAMETER_FLOAT_MAPPING_TYPE_PIECEWISE_LINEAR,
}
[StructLayout(LayoutKind.Sequential)]
public struct DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR
{
public int numpoints;
public IntPtr pointparamvalues;
public IntPtr pointpositions;
}
[StructLayout(LayoutKind.Sequential)]
public struct DSP_PARAMETER_FLOAT_MAPPING
{
public DSP_PARAMETER_FLOAT_MAPPING_TYPE type;
public DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR piecewiselinearmapping;
}
[StructLayout(LayoutKind.Sequential)]
public struct DSP_PARAMETER_DESC_FLOAT
{
public float min;
public float max;
public float defaultval;
public DSP_PARAMETER_FLOAT_MAPPING mapping;
}
[StructLayout(LayoutKind.Sequential)]
public struct DSP_PARAMETER_DESC_INT
{
public int min;
public int max;
public int defaultval;
public bool goestoinf;
public IntPtr valuenames;
}
[StructLayout(LayoutKind.Sequential)]
public struct DSP_PARAMETER_DESC_BOOL
{
public bool defaultval;
public IntPtr valuenames;
}
[StructLayout(LayoutKind.Sequential)]
public struct DSP_PARAMETER_DESC_DATA
{
public int datatype;
}
[StructLayout(LayoutKind.Explicit)]
public struct DSP_PARAMETER_DESC_UNION
{
[FieldOffset(0)]
public DSP_PARAMETER_DESC_FLOAT floatdesc;
[FieldOffset(0)]
public DSP_PARAMETER_DESC_INT intdesc;
[FieldOffset(0)]
public DSP_PARAMETER_DESC_BOOL booldesc;
[FieldOffset(0)]
public DSP_PARAMETER_DESC_DATA datadesc;
}
[StructLayout(LayoutKind.Sequential)]
public struct DSP_PARAMETER_DESC
{
public DSP_PARAMETER_TYPE type;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] name;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] label;
public string description;
public DSP_PARAMETER_DESC_UNION desc;
}
public enum DSP_PARAMETER_DATA_TYPE
{
DSP_PARAMETER_DATA_TYPE_USER = 0,
DSP_PARAMETER_DATA_TYPE_OVERALLGAIN = -1,
DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES = -2,
DSP_PARAMETER_DATA_TYPE_SIDECHAIN = -3,
DSP_PARAMETER_DATA_TYPE_FFT = -4,
DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES_MULTI = -5,
DSP_PARAMETER_DATA_TYPE_ATTENUATION_RANGE = -6
}
[StructLayout(LayoutKind.Sequential)]
public struct DSP_PARAMETER_OVERALLGAIN
{
public float linear_gain;
public float linear_gain_additive;
}
[StructLayout(LayoutKind.Sequential)]
public struct DSP_PARAMETER_3DATTRIBUTES
{
public ATTRIBUTES_3D relative;
public ATTRIBUTES_3D absolute;
}
[StructLayout(LayoutKind.Sequential)]
public struct DSP_PARAMETER_3DATTRIBUTES_MULTI
{
public int numlisteners;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public ATTRIBUTES_3D[] relative;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public float[] weight;
public ATTRIBUTES_3D absolute;
}
[StructLayout(LayoutKind.Sequential)]
public struct DSP_PARAMETER_SIDECHAIN
{
public int sidechainenable;
}
[StructLayout(LayoutKind.Sequential)]
public struct DSP_PARAMETER_FFT
{
public int length;
public int numchannels;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=32)]
private IntPtr[] spectrum_internal;
public float[][] spectrum
{
get
{
var buffer = new float[numchannels][];
for (int i = 0; i < numchannels; ++i)
{
buffer[i] = new float[length];
Marshal.Copy(spectrum_internal[i], buffer[i], 0, length);
}
return buffer;
}
}
public void getSpectrum(ref float[][] buffer)
{
int bufferLength = Math.Min(buffer.Length, numchannels);
for (int i = 0; i < bufferLength; ++i)
{
getSpectrum(i, ref buffer[i]);
}
}
public void getSpectrum(int channel, ref float[] buffer)
{
int bufferLength = Math.Min(buffer.Length, length);
Marshal.Copy(spectrum_internal[channel], buffer, 0, bufferLength);
}
}
[StructLayout(LayoutKind.Sequential)]
public struct DSP_LOUDNESS_METER_INFO_TYPE
{
public float momentaryloudness;
public float shorttermloudness;
public float integratedloudness;
public float loudness10thpercentile;
public float loudness95thpercentile;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 66)]
public float[] loudnesshistogram;
public float maxtruepeak;
public float maxmomentaryloudness;
}
[StructLayout(LayoutKind.Sequential)]
public struct DSP_LOUDNESS_METER_WEIGHTING_TYPE
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public float[] channelweight;
}
[StructLayout(LayoutKind.Sequential)]
public struct DSP_PARAMETER_ATTENUATION_RANGE
{
public float min;
public float max;
}
[StructLayout(LayoutKind.Sequential)]
public struct DSP_DESCRIPTION
{
public uint pluginsdkversion;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public byte[] name;
public uint version;
public int numinputbuffers;
public int numoutputbuffers;
public DSP_CREATE_CALLBACK create;
public DSP_RELEASE_CALLBACK release;
public DSP_RESET_CALLBACK reset;
public DSP_READ_CALLBACK read;
public DSP_PROCESS_CALLBACK process;
public DSP_SETPOSITION_CALLBACK setposition;
public int numparameters;
public IntPtr paramdesc;
public DSP_SETPARAM_FLOAT_CALLBACK setparameterfloat;
public DSP_SETPARAM_INT_CALLBACK setparameterint;
public DSP_SETPARAM_BOOL_CALLBACK setparameterbool;
public DSP_SETPARAM_DATA_CALLBACK setparameterdata;
public DSP_GETPARAM_FLOAT_CALLBACK getparameterfloat;
public DSP_GETPARAM_INT_CALLBACK getparameterint;
public DSP_GETPARAM_BOOL_CALLBACK getparameterbool;
public DSP_GETPARAM_DATA_CALLBACK getparameterdata;
public DSP_SHOULDIPROCESS_CALLBACK shouldiprocess;
public IntPtr userdata;
public DSP_SYSTEM_REGISTER_CALLBACK sys_register;
public DSP_SYSTEM_DEREGISTER_CALLBACK sys_deregister;
public DSP_SYSTEM_MIX_CALLBACK sys_mix;
}
[StructLayout(LayoutKind.Sequential)]
public struct DSP_STATE_DFT_FUNCTIONS
{
public DSP_DFT_FFTREAL_FUNC fftreal;
public DSP_DFT_IFFTREAL_FUNC inversefftreal;
}
[StructLayout(LayoutKind.Sequential)]
public struct DSP_STATE_PAN_FUNCTIONS
{
public DSP_PAN_SUMMONOMATRIX_FUNC summonomatrix;
public DSP_PAN_SUMSTEREOMATRIX_FUNC sumstereomatrix;
public DSP_PAN_SUMSURROUNDMATRIX_FUNC sumsurroundmatrix;
public DSP_PAN_SUMMONOTOSURROUNDMATRIX_FUNC summonotosurroundmatrix;
public DSP_PAN_SUMSTEREOTOSURROUNDMATRIX_FUNC sumstereotosurroundmatrix;
public DSP_PAN_GETROLLOFFGAIN_FUNC getrolloffgain;
}
[StructLayout(LayoutKind.Sequential)]
public struct DSP_STATE_FUNCTIONS
{
public DSP_ALLOC_FUNC alloc;
public DSP_REALLOC_FUNC realloc;
public DSP_FREE_FUNC free;
public DSP_GETSAMPLERATE_FUNC getsamplerate;
public DSP_GETBLOCKSIZE_FUNC getblocksize;
public IntPtr dft;
public IntPtr pan;
public DSP_GETSPEAKERMODE_FUNC getspeakermode;
public DSP_GETCLOCK_FUNC getclock;
public DSP_GETLISTENERATTRIBUTES_FUNC getlistenerattributes;
public DSP_LOG_FUNC log;
public DSP_GETUSERDATA_FUNC getuserdata;
}
[StructLayout(LayoutKind.Sequential)]
public struct DSP_STATE
{
public IntPtr instance;
public IntPtr plugindata;
public uint channelmask;
public int source_speakermode;
public IntPtr sidechaindata;
public int sidechainchannels;
public IntPtr functions;
public int systemobject;
}
[StructLayout(LayoutKind.Sequential)]
public struct DSP_METERING_INFO
{
public int numsamples;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=32)]
public float[] peaklevel;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=32)]
public float[] rmslevel;
public short numchannels;
}
/*
==============================================================================================================
FMOD built in effect parameters.
Use DSP::setParameter with these enums for the 'index' parameter.
==============================================================================================================
*/
public enum DSP_OSCILLATOR : int
{
TYPE,
RATE
}
public enum DSP_LOWPASS : int
{
CUTOFF,
RESONANCE
}
public enum DSP_ITLOWPASS : int
{
CUTOFF,
RESONANCE
}
public enum DSP_HIGHPASS : int
{
CUTOFF,
RESONANCE
}
public enum DSP_ECHO : int
{
DELAY,
FEEDBACK,
DRYLEVEL,
WETLEVEL
}
public enum DSP_FADER : int
{
GAIN,
OVERALL_GAIN,
}
public enum DSP_DELAY : int
{
CH0,
CH1,
CH2,
CH3,
CH4,
CH5,
CH6,
CH7,
CH8,
CH9,
CH10,
CH11,
CH12,
CH13,
CH14,
CH15,
MAXDELAY,
}
public enum DSP_FLANGE : int
{
MIX,
DEPTH,
RATE
}
public enum DSP_TREMOLO : int
{
FREQUENCY,
DEPTH,
SHAPE,
SKEW,
DUTY,
SQUARE,
PHASE,
SPREAD
}
public enum DSP_DISTORTION : int
{
LEVEL
}
public enum DSP_NORMALIZE : int
{
FADETIME,
THRESHOLD,
MAXAMP
}
public enum DSP_LIMITER : int
{
RELEASETIME,
CEILING,
MAXIMIZERGAIN,
MODE,
}
public enum DSP_PARAMEQ : int
{
CENTER,
BANDWIDTH,
GAIN
}
public enum DSP_MULTIBAND_EQ : int
{
A_FILTER,
A_FREQUENCY,
A_Q,
A_GAIN,
B_FILTER,
B_FREQUENCY,
B_Q,
B_GAIN,
C_FILTER,
C_FREQUENCY,
C_Q,
C_GAIN,
D_FILTER,
D_FREQUENCY,
D_Q,
D_GAIN,
E_FILTER,
E_FREQUENCY,
E_Q,
E_GAIN,
}
public enum DSP_MULTIBAND_EQ_FILTER_TYPE : int
{
DISABLED,
LOWPASS_12DB,
LOWPASS_24DB,
LOWPASS_48DB,
HIGHPASS_12DB,
HIGHPASS_24DB,
HIGHPASS_48DB,
LOWSHELF,
HIGHSHELF,
PEAKING,
BANDPASS,
NOTCH,
ALLPASS,
}
public enum DSP_PITCHSHIFT : int
{
PITCH,
FFTSIZE,
OVERLAP,
MAXCHANNELS
}
public enum DSP_CHORUS : int
{
MIX,
RATE,
DEPTH,
}
public enum DSP_ITECHO : int
{
WETDRYMIX,
FEEDBACK,
LEFTDELAY,
RIGHTDELAY,
PANDELAY
}
public enum DSP_COMPRESSOR : int
{
THRESHOLD,
RATIO,
ATTACK,
RELEASE,
GAINMAKEUP,
USESIDECHAIN,
LINKED
}
public enum DSP_SFXREVERB : int
{
DECAYTIME,
EARLYDELAY,
LATEDELAY,
HFREFERENCE,
HFDECAYRATIO,
DIFFUSION,
DENSITY,
LOWSHELFFREQUENCY,
LOWSHELFGAIN,
HIGHCUT,
EARLYLATEMIX,
WETLEVEL,
DRYLEVEL
}
public enum DSP_LOWPASS_SIMPLE : int
{
CUTOFF
}
public enum DSP_SEND : int
{
RETURNID,
LEVEL,
}
public enum DSP_RETURN : int
{
ID,
INPUT_SPEAKER_MODE
}
public enum DSP_HIGHPASS_SIMPLE : int
{
CUTOFF
}
public enum DSP_PAN_2D_STEREO_MODE_TYPE : int
{
DISTRIBUTED,
DISCRETE
}
public enum DSP_PAN_MODE_TYPE : int
{
MONO,
STEREO,
SURROUND
}
public enum DSP_PAN_3D_ROLLOFF_TYPE : int
{
LINEARSQUARED,
LINEAR,
INVERSE,
INVERSETAPERED,
CUSTOM
}
public enum DSP_PAN_3D_EXTENT_MODE_TYPE : int
{
AUTO,
USER,
OFF
}
public enum DSP_PAN : int
{
MODE,
_2D_STEREO_POSITION,
_2D_DIRECTION,
_2D_EXTENT,
_2D_ROTATION,
_2D_LFE_LEVEL,
_2D_STEREO_MODE,
_2D_STEREO_SEPARATION,
_2D_STEREO_AXIS,
ENABLED_SPEAKERS,
_3D_POSITION,
_3D_ROLLOFF,
_3D_MIN_DISTANCE,
_3D_MAX_DISTANCE,
_3D_EXTENT_MODE,
_3D_SOUND_SIZE,
_3D_MIN_EXTENT,
_3D_PAN_BLEND,
LFE_UPMIX_ENABLED,
OVERALL_GAIN,
SURROUND_SPEAKER_MODE,
_2D_HEIGHT_BLEND,
ATTENUATION_RANGE,
OVERRIDE_RANGE
}
public enum DSP_THREE_EQ_CROSSOVERSLOPE_TYPE : int
{
_12DB,
_24DB,
_48DB
}
public enum DSP_THREE_EQ : int
{
LOWGAIN,
MIDGAIN,
HIGHGAIN,
LOWCROSSOVER,
HIGHCROSSOVER,
CROSSOVERSLOPE
}
public enum DSP_FFT_WINDOW : int
{
RECT,
TRIANGLE,
HAMMING,
HANNING,
BLACKMAN,
BLACKMANHARRIS
}
public enum DSP_FFT : int
{
WINDOWSIZE,
WINDOWTYPE,
SPECTRUMDATA,
DOMINANT_FREQ
}
public enum DSP_LOUDNESS_METER : int
{
STATE,
WEIGHTING,
INFO
}
public enum DSP_LOUDNESS_METER_STATE_TYPE : int
{
RESET_INTEGRATED = -3,
RESET_MAXPEAK = -2,
RESET_ALL = -1,
PAUSED = 0,
ANALYZING = 1
}
public enum DSP_ENVELOPEFOLLOWER : int
{
ATTACK,
RELEASE,
ENVELOPE,
USESIDECHAIN
}
public enum DSP_CONVOLUTION_REVERB : int
{
IR,
WET,
DRY,
LINKED
}
public enum DSP_CHANNELMIX_OUTPUT : int
{
DEFAULT,
ALLMONO,
ALLSTEREO,
ALLQUAD,
ALL5POINT1,
ALL7POINT1,
ALLLFE,
ALL7POINT1POINT4
}
public enum DSP_CHANNELMIX : int
{
OUTPUTGROUPING,
GAIN_CH0,
GAIN_CH1,
GAIN_CH2,
GAIN_CH3,
GAIN_CH4,
GAIN_CH5,
GAIN_CH6,
GAIN_CH7,
GAIN_CH8,
GAIN_CH9,
GAIN_CH10,
GAIN_CH11,
GAIN_CH12,
GAIN_CH13,
GAIN_CH14,
GAIN_CH15,
GAIN_CH16,
GAIN_CH17,
GAIN_CH18,
GAIN_CH19,
GAIN_CH20,
GAIN_CH21,
GAIN_CH22,
GAIN_CH23,
GAIN_CH24,
GAIN_CH25,
GAIN_CH26,
GAIN_CH27,
GAIN_CH28,
GAIN_CH29,
GAIN_CH30,
GAIN_CH31,
OUTPUT_CH0,
OUTPUT_CH1,
OUTPUT_CH2,
OUTPUT_CH3,
OUTPUT_CH4,
OUTPUT_CH5,
OUTPUT_CH6,
OUTPUT_CH7,
OUTPUT_CH8,
OUTPUT_CH9,
OUTPUT_CH10,
OUTPUT_CH11,
OUTPUT_CH12,
OUTPUT_CH13,
OUTPUT_CH14,
OUTPUT_CH15,
OUTPUT_CH16,
OUTPUT_CH17,
OUTPUT_CH18,
OUTPUT_CH19,
OUTPUT_CH20,
OUTPUT_CH21,
OUTPUT_CH22,
OUTPUT_CH23,
OUTPUT_CH24,
OUTPUT_CH25,
OUTPUT_CH26,
OUTPUT_CH27,
OUTPUT_CH28,
OUTPUT_CH29,
OUTPUT_CH30,
OUTPUT_CH31,
}
public enum DSP_TRANSCEIVER_SPEAKERMODE : int
{
AUTO = -1,
MONO = 0,
STEREO,
SURROUND,
}
public enum DSP_TRANSCEIVER : int
{
TRANSMIT,
GAIN,
CHANNEL,
TRANSMITSPEAKERMODE
}
public enum DSP_OBJECTPAN : int
{
_3D_POSITION,
_3D_ROLLOFF,
_3D_MIN_DISTANCE,
_3D_MAX_DISTANCE,
_3D_EXTENT_MODE,
_3D_SOUND_SIZE,
_3D_MIN_EXTENT,
OVERALL_GAIN,
OUTPUTGAIN,
ATTENUATION_RANGE,
OVERRIDE_RANGE
}
}

421
modules/fmod/inc/fmod_dsp.h Normal file
View File

@@ -0,0 +1,421 @@
/* ======================================================================================== */
/* FMOD Core API - DSP header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* Use this header if you are wanting to develop your own DSP plugin to use with FMODs */
/* dsp system. With this header you can make your own DSP plugin that FMOD can */
/* register and use. See the documentation and examples on how to make a working plugin. */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/plugin-api-dsp.html */
/* =========================================================================================*/
#ifndef _FMOD_DSP_H
#define _FMOD_DSP_H
#include "fmod_dsp_effects.h"
typedef struct FMOD_DSP_STATE FMOD_DSP_STATE;
typedef struct FMOD_DSP_BUFFER_ARRAY FMOD_DSP_BUFFER_ARRAY;
typedef struct FMOD_COMPLEX FMOD_COMPLEX;
/*
DSP Constants
*/
#define FMOD_PLUGIN_SDK_VERSION 110
#define FMOD_DSP_GETPARAM_VALUESTR_LENGTH 32
typedef enum
{
FMOD_DSP_PROCESS_PERFORM,
FMOD_DSP_PROCESS_QUERY
} FMOD_DSP_PROCESS_OPERATION;
typedef enum FMOD_DSP_PAN_SURROUND_FLAGS
{
FMOD_DSP_PAN_SURROUND_DEFAULT = 0,
FMOD_DSP_PAN_SURROUND_ROTATION_NOT_BIASED = 1,
FMOD_DSP_PAN_SURROUND_FLAGS_FORCEINT = 65536
} FMOD_DSP_PAN_SURROUND_FLAGS;
typedef enum
{
FMOD_DSP_PARAMETER_TYPE_FLOAT,
FMOD_DSP_PARAMETER_TYPE_INT,
FMOD_DSP_PARAMETER_TYPE_BOOL,
FMOD_DSP_PARAMETER_TYPE_DATA,
FMOD_DSP_PARAMETER_TYPE_MAX,
FMOD_DSP_PARAMETER_TYPE_FORCEINT = 65536
} FMOD_DSP_PARAMETER_TYPE;
typedef enum
{
FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_LINEAR,
FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_AUTO,
FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_PIECEWISE_LINEAR,
FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_FORCEINT = 65536
} FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE;
typedef enum
{
FMOD_DSP_PARAMETER_DATA_TYPE_USER = 0,
FMOD_DSP_PARAMETER_DATA_TYPE_OVERALLGAIN = -1,
FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES = -2,
FMOD_DSP_PARAMETER_DATA_TYPE_SIDECHAIN = -3,
FMOD_DSP_PARAMETER_DATA_TYPE_FFT = -4,
FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES_MULTI = -5,
FMOD_DSP_PARAMETER_DATA_TYPE_ATTENUATION_RANGE = -6,
} FMOD_DSP_PARAMETER_DATA_TYPE;
/*
DSP Callbacks
*/
typedef FMOD_RESULT (F_CALL *FMOD_DSP_CREATE_CALLBACK) (FMOD_DSP_STATE *dsp_state);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_RELEASE_CALLBACK) (FMOD_DSP_STATE *dsp_state);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_RESET_CALLBACK) (FMOD_DSP_STATE *dsp_state);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_READ_CALLBACK) (FMOD_DSP_STATE *dsp_state, float *inbuffer, float *outbuffer, unsigned int length, int inchannels, int *outchannels);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_PROCESS_CALLBACK) (FMOD_DSP_STATE *dsp_state, unsigned int length, const FMOD_DSP_BUFFER_ARRAY *inbufferarray, FMOD_DSP_BUFFER_ARRAY *outbufferarray, FMOD_BOOL inputsidle, FMOD_DSP_PROCESS_OPERATION op);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPOSITION_CALLBACK) (FMOD_DSP_STATE *dsp_state, unsigned int pos);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_SHOULDIPROCESS_CALLBACK) (FMOD_DSP_STATE *dsp_state, FMOD_BOOL inputsidle, unsigned int length, FMOD_CHANNELMASK inmask, int inchannels, FMOD_SPEAKERMODE speakermode);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPARAM_FLOAT_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, float value);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPARAM_INT_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, int value);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPARAM_BOOL_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, FMOD_BOOL value);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPARAM_DATA_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, void *data, unsigned int length);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETPARAM_FLOAT_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, float *value, char *valuestr);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETPARAM_INT_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, int *value, char *valuestr);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETPARAM_BOOL_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, FMOD_BOOL *value, char *valuestr);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETPARAM_DATA_CALLBACK) (FMOD_DSP_STATE *dsp_state, int index, void **data, unsigned int *length, char *valuestr);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_SYSTEM_REGISTER_CALLBACK) (FMOD_DSP_STATE *dsp_state);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_SYSTEM_DEREGISTER_CALLBACK) (FMOD_DSP_STATE *dsp_state);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_SYSTEM_MIX_CALLBACK) (FMOD_DSP_STATE *dsp_state, int stage);
/*
DSP Functions
*/
typedef void * (F_CALL *FMOD_DSP_ALLOC_FUNC) (unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr);
typedef void * (F_CALL *FMOD_DSP_REALLOC_FUNC) (void *ptr, unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr);
typedef void (F_CALL *FMOD_DSP_FREE_FUNC) (void *ptr, FMOD_MEMORY_TYPE type, const char *sourcestr);
typedef void (F_CALL *FMOD_DSP_LOG_FUNC) (FMOD_DEBUG_FLAGS level, const char *file, int line, const char *function, const char *str, ...);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETSAMPLERATE_FUNC) (FMOD_DSP_STATE *dsp_state, int *rate);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETBLOCKSIZE_FUNC) (FMOD_DSP_STATE *dsp_state, unsigned int *blocksize);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETSPEAKERMODE_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE *speakermode_mixer, FMOD_SPEAKERMODE *speakermode_output);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETCLOCK_FUNC) (FMOD_DSP_STATE *dsp_state, unsigned long long *clock, unsigned int *offset, unsigned int *length);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETLISTENERATTRIBUTES_FUNC) (FMOD_DSP_STATE *dsp_state, int *numlisteners, FMOD_3D_ATTRIBUTES *attributes);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_GETUSERDATA_FUNC) (FMOD_DSP_STATE *dsp_state, void **userdata);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_DFT_FFTREAL_FUNC) (FMOD_DSP_STATE *dsp_state, int size, const float *signal, FMOD_COMPLEX* dft, const float *window, int signalhop);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_DFT_IFFTREAL_FUNC) (FMOD_DSP_STATE *dsp_state, int size, const FMOD_COMPLEX *dft, float* signal, const float *window, int signalhop);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMMONOMATRIX_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE sourceSpeakerMode, float lowFrequencyGain, float overallGain, float *matrix);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMSTEREOMATRIX_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE sourceSpeakerMode, float pan, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMSURROUNDMATRIX_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE sourceSpeakerMode, FMOD_SPEAKERMODE targetSpeakerMode, float direction, float extent, float rotation, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix, FMOD_DSP_PAN_SURROUND_FLAGS flags);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMMONOTOSURROUNDMATRIX_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE targetSpeakerMode, float direction, float extent, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMSTEREOTOSURROUNDMATRIX_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE targetSpeakerMode, float direction, float extent, float rotation, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix);
typedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_GETROLLOFFGAIN_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_DSP_PAN_3D_ROLLOFF_TYPE rolloff, float distance, float mindistance, float maxdistance, float *gain);
/*
DSP Structures
*/
struct FMOD_DSP_BUFFER_ARRAY
{
int numbuffers;
int *buffernumchannels;
FMOD_CHANNELMASK *bufferchannelmask;
float **buffers;
FMOD_SPEAKERMODE speakermode;
};
struct FMOD_COMPLEX
{
float real;
float imag;
};
typedef struct FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR
{
int numpoints;
float *pointparamvalues;
float *pointpositions;
} FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR;
typedef struct FMOD_DSP_PARAMETER_FLOAT_MAPPING
{
FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE type;
FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR piecewiselinearmapping;
} FMOD_DSP_PARAMETER_FLOAT_MAPPING;
typedef struct FMOD_DSP_PARAMETER_DESC_FLOAT
{
float min;
float max;
float defaultval;
FMOD_DSP_PARAMETER_FLOAT_MAPPING mapping;
} FMOD_DSP_PARAMETER_DESC_FLOAT;
typedef struct FMOD_DSP_PARAMETER_DESC_INT
{
int min;
int max;
int defaultval;
FMOD_BOOL goestoinf;
const char* const* valuenames;
} FMOD_DSP_PARAMETER_DESC_INT;
typedef struct FMOD_DSP_PARAMETER_DESC_BOOL
{
FMOD_BOOL defaultval;
const char* const* valuenames;
} FMOD_DSP_PARAMETER_DESC_BOOL;
typedef struct FMOD_DSP_PARAMETER_DESC_DATA
{
int datatype;
} FMOD_DSP_PARAMETER_DESC_DATA;
typedef struct FMOD_DSP_PARAMETER_DESC
{
FMOD_DSP_PARAMETER_TYPE type;
char name[16];
char label[16];
const char *description;
union
{
FMOD_DSP_PARAMETER_DESC_FLOAT floatdesc;
FMOD_DSP_PARAMETER_DESC_INT intdesc;
FMOD_DSP_PARAMETER_DESC_BOOL booldesc;
FMOD_DSP_PARAMETER_DESC_DATA datadesc;
};
} FMOD_DSP_PARAMETER_DESC;
typedef struct FMOD_DSP_PARAMETER_OVERALLGAIN
{
float linear_gain;
float linear_gain_additive;
} FMOD_DSP_PARAMETER_OVERALLGAIN;
typedef struct FMOD_DSP_PARAMETER_3DATTRIBUTES
{
FMOD_3D_ATTRIBUTES relative;
FMOD_3D_ATTRIBUTES absolute;
} FMOD_DSP_PARAMETER_3DATTRIBUTES;
typedef struct FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI
{
int numlisteners;
FMOD_3D_ATTRIBUTES relative[FMOD_MAX_LISTENERS];
float weight[FMOD_MAX_LISTENERS];
FMOD_3D_ATTRIBUTES absolute;
} FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI;
typedef struct FMOD_DSP_PARAMETER_ATTENUATION_RANGE
{
float min;
float max;
} FMOD_DSP_PARAMETER_ATTENUATION_RANGE;
typedef struct FMOD_DSP_PARAMETER_SIDECHAIN
{
FMOD_BOOL sidechainenable;
} FMOD_DSP_PARAMETER_SIDECHAIN;
typedef struct FMOD_DSP_PARAMETER_FFT
{
int length;
int numchannels;
float *spectrum[32];
} FMOD_DSP_PARAMETER_FFT;
typedef struct FMOD_DSP_DESCRIPTION
{
unsigned int pluginsdkversion;
char name[32];
unsigned int version;
int numinputbuffers;
int numoutputbuffers;
FMOD_DSP_CREATE_CALLBACK create;
FMOD_DSP_RELEASE_CALLBACK release;
FMOD_DSP_RESET_CALLBACK reset;
FMOD_DSP_READ_CALLBACK read;
FMOD_DSP_PROCESS_CALLBACK process;
FMOD_DSP_SETPOSITION_CALLBACK setposition;
int numparameters;
FMOD_DSP_PARAMETER_DESC **paramdesc;
FMOD_DSP_SETPARAM_FLOAT_CALLBACK setparameterfloat;
FMOD_DSP_SETPARAM_INT_CALLBACK setparameterint;
FMOD_DSP_SETPARAM_BOOL_CALLBACK setparameterbool;
FMOD_DSP_SETPARAM_DATA_CALLBACK setparameterdata;
FMOD_DSP_GETPARAM_FLOAT_CALLBACK getparameterfloat;
FMOD_DSP_GETPARAM_INT_CALLBACK getparameterint;
FMOD_DSP_GETPARAM_BOOL_CALLBACK getparameterbool;
FMOD_DSP_GETPARAM_DATA_CALLBACK getparameterdata;
FMOD_DSP_SHOULDIPROCESS_CALLBACK shouldiprocess;
void *userdata;
FMOD_DSP_SYSTEM_REGISTER_CALLBACK sys_register;
FMOD_DSP_SYSTEM_DEREGISTER_CALLBACK sys_deregister;
FMOD_DSP_SYSTEM_MIX_CALLBACK sys_mix;
} FMOD_DSP_DESCRIPTION;
typedef struct FMOD_DSP_STATE_DFT_FUNCTIONS
{
FMOD_DSP_DFT_FFTREAL_FUNC fftreal;
FMOD_DSP_DFT_IFFTREAL_FUNC inversefftreal;
} FMOD_DSP_STATE_DFT_FUNCTIONS;
typedef struct FMOD_DSP_STATE_PAN_FUNCTIONS
{
FMOD_DSP_PAN_SUMMONOMATRIX_FUNC summonomatrix;
FMOD_DSP_PAN_SUMSTEREOMATRIX_FUNC sumstereomatrix;
FMOD_DSP_PAN_SUMSURROUNDMATRIX_FUNC sumsurroundmatrix;
FMOD_DSP_PAN_SUMMONOTOSURROUNDMATRIX_FUNC summonotosurroundmatrix;
FMOD_DSP_PAN_SUMSTEREOTOSURROUNDMATRIX_FUNC sumstereotosurroundmatrix;
FMOD_DSP_PAN_GETROLLOFFGAIN_FUNC getrolloffgain;
} FMOD_DSP_STATE_PAN_FUNCTIONS;
typedef struct FMOD_DSP_STATE_FUNCTIONS
{
FMOD_DSP_ALLOC_FUNC alloc;
FMOD_DSP_REALLOC_FUNC realloc;
FMOD_DSP_FREE_FUNC free;
FMOD_DSP_GETSAMPLERATE_FUNC getsamplerate;
FMOD_DSP_GETBLOCKSIZE_FUNC getblocksize;
FMOD_DSP_STATE_DFT_FUNCTIONS *dft;
FMOD_DSP_STATE_PAN_FUNCTIONS *pan;
FMOD_DSP_GETSPEAKERMODE_FUNC getspeakermode;
FMOD_DSP_GETCLOCK_FUNC getclock;
FMOD_DSP_GETLISTENERATTRIBUTES_FUNC getlistenerattributes;
FMOD_DSP_LOG_FUNC log;
FMOD_DSP_GETUSERDATA_FUNC getuserdata;
} FMOD_DSP_STATE_FUNCTIONS;
struct FMOD_DSP_STATE
{
void *instance;
void *plugindata;
FMOD_CHANNELMASK channelmask;
FMOD_SPEAKERMODE source_speakermode;
float *sidechaindata;
int sidechainchannels;
FMOD_DSP_STATE_FUNCTIONS *functions;
int systemobject;
};
typedef struct FMOD_DSP_METERING_INFO
{
int numsamples;
float peaklevel[32];
float rmslevel[32];
short numchannels;
} FMOD_DSP_METERING_INFO;
/*
DSP Macros
*/
#define FMOD_DSP_INIT_PARAMDESC_FLOAT(_paramstruct, _name, _label, _description, _min, _max, _defaultval) \
memset(&(_paramstruct), 0, sizeof(_paramstruct)); \
(_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_FLOAT; \
strncpy((_paramstruct).name, _name, 15); \
strncpy((_paramstruct).label, _label, 15); \
(_paramstruct).description = _description; \
(_paramstruct).floatdesc.min = _min; \
(_paramstruct).floatdesc.max = _max; \
(_paramstruct).floatdesc.defaultval = _defaultval; \
(_paramstruct).floatdesc.mapping.type = FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_AUTO;
#define FMOD_DSP_INIT_PARAMDESC_FLOAT_WITH_MAPPING(_paramstruct, _name, _label, _description, _defaultval, _values, _positions); \
memset(&(_paramstruct), 0, sizeof(_paramstruct)); \
(_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_FLOAT; \
strncpy((_paramstruct).name, _name , 15); \
strncpy((_paramstruct).label, _label, 15); \
(_paramstruct).description = _description; \
(_paramstruct).floatdesc.min = _values[0]; \
(_paramstruct).floatdesc.max = _values[sizeof(_values) / sizeof(float) - 1]; \
(_paramstruct).floatdesc.defaultval = _defaultval; \
(_paramstruct).floatdesc.mapping.type = FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_PIECEWISE_LINEAR; \
(_paramstruct).floatdesc.mapping.piecewiselinearmapping.numpoints = sizeof(_values) / sizeof(float); \
(_paramstruct).floatdesc.mapping.piecewiselinearmapping.pointparamvalues = _values; \
(_paramstruct).floatdesc.mapping.piecewiselinearmapping.pointpositions = _positions;
#define FMOD_DSP_INIT_PARAMDESC_INT(_paramstruct, _name, _label, _description, _min, _max, _defaultval, _goestoinf, _valuenames) \
memset(&(_paramstruct), 0, sizeof(_paramstruct)); \
(_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_INT; \
strncpy((_paramstruct).name, _name , 15); \
strncpy((_paramstruct).label, _label, 15); \
(_paramstruct).description = _description; \
(_paramstruct).intdesc.min = _min; \
(_paramstruct).intdesc.max = _max; \
(_paramstruct).intdesc.defaultval = _defaultval; \
(_paramstruct).intdesc.goestoinf = _goestoinf; \
(_paramstruct).intdesc.valuenames = _valuenames;
#define FMOD_DSP_INIT_PARAMDESC_INT_ENUMERATED(_paramstruct, _name, _label, _description, _defaultval, _valuenames) \
memset(&(_paramstruct), 0, sizeof(_paramstruct)); \
(_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_INT; \
strncpy((_paramstruct).name, _name , 15); \
strncpy((_paramstruct).label, _label, 15); \
(_paramstruct).description = _description; \
(_paramstruct).intdesc.min = 0; \
(_paramstruct).intdesc.max = sizeof(_valuenames) / sizeof(char*) - 1; \
(_paramstruct).intdesc.defaultval = _defaultval; \
(_paramstruct).intdesc.goestoinf = false; \
(_paramstruct).intdesc.valuenames = _valuenames;
#define FMOD_DSP_INIT_PARAMDESC_BOOL(_paramstruct, _name, _label, _description, _defaultval, _valuenames) \
memset(&(_paramstruct), 0, sizeof(_paramstruct)); \
(_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_BOOL; \
strncpy((_paramstruct).name, _name , 15); \
strncpy((_paramstruct).label, _label, 15); \
(_paramstruct).description = _description; \
(_paramstruct).booldesc.defaultval = _defaultval; \
(_paramstruct).booldesc.valuenames = _valuenames;
#define FMOD_DSP_INIT_PARAMDESC_DATA(_paramstruct, _name, _label, _description, _datatype) \
memset(&(_paramstruct), 0, sizeof(_paramstruct)); \
(_paramstruct).type = FMOD_DSP_PARAMETER_TYPE_DATA; \
strncpy((_paramstruct).name, _name , 15); \
strncpy((_paramstruct).label, _label, 15); \
(_paramstruct).description = _description; \
(_paramstruct).datadesc.datatype = _datatype;
#define FMOD_DSP_ALLOC(_state, _size) \
(_state)->functions->alloc(_size, FMOD_MEMORY_NORMAL, __FILE__)
#define FMOD_DSP_REALLOC(_state, _ptr, _size) \
(_state)->functions->realloc(_ptr, _size, FMOD_MEMORY_NORMAL, __FILE__)
#define FMOD_DSP_FREE(_state, _ptr) \
(_state)->functions->free(_ptr, FMOD_MEMORY_NORMAL, __FILE__)
#define FMOD_DSP_LOG(_state, _level, _location, _format, ...) \
(_state)->functions->log(_level, __FILE__, __LINE__, _location, _format, __VA_ARGS__)
#define FMOD_DSP_GETSAMPLERATE(_state, _rate) \
(_state)->functions->getsamplerate(_state, _rate)
#define FMOD_DSP_GETBLOCKSIZE(_state, _blocksize) \
(_state)->functions->getblocksize(_state, _blocksize)
#define FMOD_DSP_GETSPEAKERMODE(_state, _speakermodemix, _speakermodeout) \
(_state)->functions->getspeakermode(_state, _speakermodemix, _speakermodeout)
#define FMOD_DSP_GETCLOCK(_state, _clock, _offset, _length) \
(_state)->functions->getclock(_state, _clock, _offset, _length)
#define FMOD_DSP_GETLISTENERATTRIBUTES(_state, _numlisteners, _attributes) \
(_state)->functions->getlistenerattributes(_state, _numlisteners, _attributes)
#define FMOD_DSP_GETUSERDATA(_state, _userdata) \
(_state)->functions->getuserdata(_state, _userdata)
#define FMOD_DSP_DFT_FFTREAL(_state, _size, _signal, _dft, _window, _signalhop) \
(_state)->functions->dft->fftreal(_state, _size, _signal, _dft, _window, _signalhop)
#define FMOD_DSP_DFT_IFFTREAL(_state, _size, _dft, _signal, _window, _signalhop) \
(_state)->functions->dft->inversefftreal(_state, _size, _dft, _signal, _window, _signalhop)
#define FMOD_DSP_PAN_SUMMONOMATRIX(_state, _sourcespeakermode, _lowfrequencygain, _overallgain, _matrix) \
(_state)->functions->pan->summonomatrix(_state, _sourcespeakermode, _lowfrequencygain, _overallgain, _matrix)
#define FMOD_DSP_PAN_SUMSTEREOMATRIX(_state, _sourcespeakermode, _pan, _lowfrequencygain, _overallgain, _matrixhop, _matrix) \
(_state)->functions->pan->sumstereomatrix(_state, _sourcespeakermode, _pan, _lowfrequencygain, _overallgain, _matrixhop, _matrix)
#define FMOD_DSP_PAN_SUMSURROUNDMATRIX(_state, _sourcespeakermode, _targetspeakermode, _direction, _extent, _rotation, _lowfrequencygain, _overallgain, _matrixhop, _matrix, _flags) \
(_state)->functions->pan->sumsurroundmatrix(_state, _sourcespeakermode, _targetspeakermode, _direction, _extent, _rotation, _lowfrequencygain, _overallgain, _matrixhop, _matrix, _flags)
#define FMOD_DSP_PAN_SUMMONOTOSURROUNDMATRIX(_state, _targetspeakermode, _direction, _extent, _lowfrequencygain, _overallgain, _matrixhop, _matrix) \
(_state)->functions->pan->summonotosurroundmatrix(_state, _targetspeakermode, _direction, _extent, _lowfrequencygain, _overallgain, _matrixhop, _matrix)
#define FMOD_DSP_PAN_SUMSTEREOTOSURROUNDMATRIX(_state, _targetspeakermode, _direction, _extent, _rotation, _lowfrequencygain, _overallgain, matrixhop, _matrix) \
(_state)->functions->pan->sumstereotosurroundmatrix(_state, _targetspeakermode, _direction, _extent, _rotation, _lowfrequencygain, _overallgain, matrixhop, _matrix)
#define FMOD_DSP_PAN_GETROLLOFFGAIN(_state, _rolloff, _distance, _mindistance, _maxdistance, _gain) \
(_state)->functions->pan->getrolloffgain(_state, _rolloff, _distance, _mindistance, _maxdistance, _gain)
#endif

View File

@@ -0,0 +1,577 @@
/* ============================================================================================================= */
/* FMOD Core API - Built-in effects header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* In this header you can find parameter structures for FMOD system registered DSP effects */
/* and generators. */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/core-api-common-dsp-effects.html#fmod_dsp_type */
/* ============================================================================================================= */
#ifndef _FMOD_DSP_EFFECTS_H
#define _FMOD_DSP_EFFECTS_H
typedef enum
{
FMOD_DSP_TYPE_UNKNOWN,
FMOD_DSP_TYPE_MIXER,
FMOD_DSP_TYPE_OSCILLATOR,
FMOD_DSP_TYPE_LOWPASS,
FMOD_DSP_TYPE_ITLOWPASS,
FMOD_DSP_TYPE_HIGHPASS,
FMOD_DSP_TYPE_ECHO,
FMOD_DSP_TYPE_FADER,
FMOD_DSP_TYPE_FLANGE,
FMOD_DSP_TYPE_DISTORTION,
FMOD_DSP_TYPE_NORMALIZE,
FMOD_DSP_TYPE_LIMITER,
FMOD_DSP_TYPE_PARAMEQ,
FMOD_DSP_TYPE_PITCHSHIFT,
FMOD_DSP_TYPE_CHORUS,
FMOD_DSP_TYPE_VSTPLUGIN,
FMOD_DSP_TYPE_WINAMPPLUGIN,
FMOD_DSP_TYPE_ITECHO,
FMOD_DSP_TYPE_COMPRESSOR,
FMOD_DSP_TYPE_SFXREVERB,
FMOD_DSP_TYPE_LOWPASS_SIMPLE,
FMOD_DSP_TYPE_DELAY,
FMOD_DSP_TYPE_TREMOLO,
FMOD_DSP_TYPE_LADSPAPLUGIN,
FMOD_DSP_TYPE_SEND,
FMOD_DSP_TYPE_RETURN,
FMOD_DSP_TYPE_HIGHPASS_SIMPLE,
FMOD_DSP_TYPE_PAN,
FMOD_DSP_TYPE_THREE_EQ,
FMOD_DSP_TYPE_FFT,
FMOD_DSP_TYPE_LOUDNESS_METER,
FMOD_DSP_TYPE_ENVELOPEFOLLOWER,
FMOD_DSP_TYPE_CONVOLUTIONREVERB,
FMOD_DSP_TYPE_CHANNELMIX,
FMOD_DSP_TYPE_TRANSCEIVER,
FMOD_DSP_TYPE_OBJECTPAN,
FMOD_DSP_TYPE_MULTIBAND_EQ,
FMOD_DSP_TYPE_MAX,
FMOD_DSP_TYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */
} FMOD_DSP_TYPE;
/*
===================================================================================================
FMOD built in effect parameters.
Use DSP::setParameter with these enums for the 'index' parameter.
===================================================================================================
*/
typedef enum
{
FMOD_DSP_OSCILLATOR_TYPE,
FMOD_DSP_OSCILLATOR_RATE
} FMOD_DSP_OSCILLATOR;
typedef enum
{
FMOD_DSP_LOWPASS_CUTOFF,
FMOD_DSP_LOWPASS_RESONANCE
} FMOD_DSP_LOWPASS;
typedef enum
{
FMOD_DSP_ITLOWPASS_CUTOFF,
FMOD_DSP_ITLOWPASS_RESONANCE
} FMOD_DSP_ITLOWPASS;
typedef enum
{
FMOD_DSP_HIGHPASS_CUTOFF,
FMOD_DSP_HIGHPASS_RESONANCE
} FMOD_DSP_HIGHPASS;
typedef enum
{
FMOD_DSP_ECHO_DELAY,
FMOD_DSP_ECHO_FEEDBACK,
FMOD_DSP_ECHO_DRYLEVEL,
FMOD_DSP_ECHO_WETLEVEL
} FMOD_DSP_ECHO;
typedef enum FMOD_DSP_FADER
{
FMOD_DSP_FADER_GAIN,
FMOD_DSP_FADER_OVERALL_GAIN,
} FMOD_DSP_FADER;
typedef enum
{
FMOD_DSP_FLANGE_MIX,
FMOD_DSP_FLANGE_DEPTH,
FMOD_DSP_FLANGE_RATE
} FMOD_DSP_FLANGE;
typedef enum
{
FMOD_DSP_DISTORTION_LEVEL
} FMOD_DSP_DISTORTION;
typedef enum
{
FMOD_DSP_NORMALIZE_FADETIME,
FMOD_DSP_NORMALIZE_THRESHOLD,
FMOD_DSP_NORMALIZE_MAXAMP
} FMOD_DSP_NORMALIZE;
typedef enum
{
FMOD_DSP_LIMITER_RELEASETIME,
FMOD_DSP_LIMITER_CEILING,
FMOD_DSP_LIMITER_MAXIMIZERGAIN,
FMOD_DSP_LIMITER_MODE,
} FMOD_DSP_LIMITER;
typedef enum
{
FMOD_DSP_PARAMEQ_CENTER,
FMOD_DSP_PARAMEQ_BANDWIDTH,
FMOD_DSP_PARAMEQ_GAIN
} FMOD_DSP_PARAMEQ;
typedef enum FMOD_DSP_MULTIBAND_EQ
{
FMOD_DSP_MULTIBAND_EQ_A_FILTER,
FMOD_DSP_MULTIBAND_EQ_A_FREQUENCY,
FMOD_DSP_MULTIBAND_EQ_A_Q,
FMOD_DSP_MULTIBAND_EQ_A_GAIN,
FMOD_DSP_MULTIBAND_EQ_B_FILTER,
FMOD_DSP_MULTIBAND_EQ_B_FREQUENCY,
FMOD_DSP_MULTIBAND_EQ_B_Q,
FMOD_DSP_MULTIBAND_EQ_B_GAIN,
FMOD_DSP_MULTIBAND_EQ_C_FILTER,
FMOD_DSP_MULTIBAND_EQ_C_FREQUENCY,
FMOD_DSP_MULTIBAND_EQ_C_Q,
FMOD_DSP_MULTIBAND_EQ_C_GAIN,
FMOD_DSP_MULTIBAND_EQ_D_FILTER,
FMOD_DSP_MULTIBAND_EQ_D_FREQUENCY,
FMOD_DSP_MULTIBAND_EQ_D_Q,
FMOD_DSP_MULTIBAND_EQ_D_GAIN,
FMOD_DSP_MULTIBAND_EQ_E_FILTER,
FMOD_DSP_MULTIBAND_EQ_E_FREQUENCY,
FMOD_DSP_MULTIBAND_EQ_E_Q,
FMOD_DSP_MULTIBAND_EQ_E_GAIN,
} FMOD_DSP_MULTIBAND_EQ;
typedef enum FMOD_DSP_MULTIBAND_EQ_FILTER_TYPE
{
FMOD_DSP_MULTIBAND_EQ_FILTER_DISABLED,
FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_12DB,
FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_24DB,
FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_48DB,
FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_12DB,
FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_24DB,
FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_48DB,
FMOD_DSP_MULTIBAND_EQ_FILTER_LOWSHELF,
FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHSHELF,
FMOD_DSP_MULTIBAND_EQ_FILTER_PEAKING,
FMOD_DSP_MULTIBAND_EQ_FILTER_BANDPASS,
FMOD_DSP_MULTIBAND_EQ_FILTER_NOTCH,
FMOD_DSP_MULTIBAND_EQ_FILTER_ALLPASS,
} FMOD_DSP_MULTIBAND_EQ_FILTER_TYPE;
typedef enum
{
FMOD_DSP_PITCHSHIFT_PITCH,
FMOD_DSP_PITCHSHIFT_FFTSIZE,
FMOD_DSP_PITCHSHIFT_OVERLAP,
FMOD_DSP_PITCHSHIFT_MAXCHANNELS
} FMOD_DSP_PITCHSHIFT;
typedef enum
{
FMOD_DSP_CHORUS_MIX,
FMOD_DSP_CHORUS_RATE,
FMOD_DSP_CHORUS_DEPTH,
} FMOD_DSP_CHORUS;
typedef enum
{
FMOD_DSP_ITECHO_WETDRYMIX,
FMOD_DSP_ITECHO_FEEDBACK,
FMOD_DSP_ITECHO_LEFTDELAY,
FMOD_DSP_ITECHO_RIGHTDELAY,
FMOD_DSP_ITECHO_PANDELAY
} FMOD_DSP_ITECHO;
typedef enum
{
FMOD_DSP_COMPRESSOR_THRESHOLD,
FMOD_DSP_COMPRESSOR_RATIO,
FMOD_DSP_COMPRESSOR_ATTACK,
FMOD_DSP_COMPRESSOR_RELEASE,
FMOD_DSP_COMPRESSOR_GAINMAKEUP,
FMOD_DSP_COMPRESSOR_USESIDECHAIN,
FMOD_DSP_COMPRESSOR_LINKED
} FMOD_DSP_COMPRESSOR;
typedef enum
{
FMOD_DSP_SFXREVERB_DECAYTIME,
FMOD_DSP_SFXREVERB_EARLYDELAY,
FMOD_DSP_SFXREVERB_LATEDELAY,
FMOD_DSP_SFXREVERB_HFREFERENCE,
FMOD_DSP_SFXREVERB_HFDECAYRATIO,
FMOD_DSP_SFXREVERB_DIFFUSION,
FMOD_DSP_SFXREVERB_DENSITY,
FMOD_DSP_SFXREVERB_LOWSHELFFREQUENCY,
FMOD_DSP_SFXREVERB_LOWSHELFGAIN,
FMOD_DSP_SFXREVERB_HIGHCUT,
FMOD_DSP_SFXREVERB_EARLYLATEMIX,
FMOD_DSP_SFXREVERB_WETLEVEL,
FMOD_DSP_SFXREVERB_DRYLEVEL
} FMOD_DSP_SFXREVERB;
typedef enum
{
FMOD_DSP_LOWPASS_SIMPLE_CUTOFF
} FMOD_DSP_LOWPASS_SIMPLE;
typedef enum
{
FMOD_DSP_DELAY_CH0,
FMOD_DSP_DELAY_CH1,
FMOD_DSP_DELAY_CH2,
FMOD_DSP_DELAY_CH3,
FMOD_DSP_DELAY_CH4,
FMOD_DSP_DELAY_CH5,
FMOD_DSP_DELAY_CH6,
FMOD_DSP_DELAY_CH7,
FMOD_DSP_DELAY_CH8,
FMOD_DSP_DELAY_CH9,
FMOD_DSP_DELAY_CH10,
FMOD_DSP_DELAY_CH11,
FMOD_DSP_DELAY_CH12,
FMOD_DSP_DELAY_CH13,
FMOD_DSP_DELAY_CH14,
FMOD_DSP_DELAY_CH15,
FMOD_DSP_DELAY_MAXDELAY
} FMOD_DSP_DELAY;
typedef enum
{
FMOD_DSP_TREMOLO_FREQUENCY,
FMOD_DSP_TREMOLO_DEPTH,
FMOD_DSP_TREMOLO_SHAPE,
FMOD_DSP_TREMOLO_SKEW,
FMOD_DSP_TREMOLO_DUTY,
FMOD_DSP_TREMOLO_SQUARE,
FMOD_DSP_TREMOLO_PHASE,
FMOD_DSP_TREMOLO_SPREAD
} FMOD_DSP_TREMOLO;
typedef enum
{
FMOD_DSP_SEND_RETURNID,
FMOD_DSP_SEND_LEVEL,
} FMOD_DSP_SEND;
typedef enum
{
FMOD_DSP_RETURN_ID,
FMOD_DSP_RETURN_INPUT_SPEAKER_MODE
} FMOD_DSP_RETURN;
typedef enum
{
FMOD_DSP_HIGHPASS_SIMPLE_CUTOFF
} FMOD_DSP_HIGHPASS_SIMPLE;
typedef enum
{
FMOD_DSP_PAN_2D_STEREO_MODE_DISTRIBUTED,
FMOD_DSP_PAN_2D_STEREO_MODE_DISCRETE
} FMOD_DSP_PAN_2D_STEREO_MODE_TYPE;
typedef enum
{
FMOD_DSP_PAN_MODE_MONO,
FMOD_DSP_PAN_MODE_STEREO,
FMOD_DSP_PAN_MODE_SURROUND
} FMOD_DSP_PAN_MODE_TYPE;
typedef enum
{
FMOD_DSP_PAN_3D_ROLLOFF_LINEARSQUARED,
FMOD_DSP_PAN_3D_ROLLOFF_LINEAR,
FMOD_DSP_PAN_3D_ROLLOFF_INVERSE,
FMOD_DSP_PAN_3D_ROLLOFF_INVERSETAPERED,
FMOD_DSP_PAN_3D_ROLLOFF_CUSTOM
} FMOD_DSP_PAN_3D_ROLLOFF_TYPE;
typedef enum
{
FMOD_DSP_PAN_3D_EXTENT_MODE_AUTO,
FMOD_DSP_PAN_3D_EXTENT_MODE_USER,
FMOD_DSP_PAN_3D_EXTENT_MODE_OFF
} FMOD_DSP_PAN_3D_EXTENT_MODE_TYPE;
typedef enum
{
FMOD_DSP_PAN_MODE,
FMOD_DSP_PAN_2D_STEREO_POSITION,
FMOD_DSP_PAN_2D_DIRECTION,
FMOD_DSP_PAN_2D_EXTENT,
FMOD_DSP_PAN_2D_ROTATION,
FMOD_DSP_PAN_2D_LFE_LEVEL,
FMOD_DSP_PAN_2D_STEREO_MODE,
FMOD_DSP_PAN_2D_STEREO_SEPARATION,
FMOD_DSP_PAN_2D_STEREO_AXIS,
FMOD_DSP_PAN_ENABLED_SPEAKERS,
FMOD_DSP_PAN_3D_POSITION,
FMOD_DSP_PAN_3D_ROLLOFF,
FMOD_DSP_PAN_3D_MIN_DISTANCE,
FMOD_DSP_PAN_3D_MAX_DISTANCE,
FMOD_DSP_PAN_3D_EXTENT_MODE,
FMOD_DSP_PAN_3D_SOUND_SIZE,
FMOD_DSP_PAN_3D_MIN_EXTENT,
FMOD_DSP_PAN_3D_PAN_BLEND,
FMOD_DSP_PAN_LFE_UPMIX_ENABLED,
FMOD_DSP_PAN_OVERALL_GAIN,
FMOD_DSP_PAN_SURROUND_SPEAKER_MODE,
FMOD_DSP_PAN_2D_HEIGHT_BLEND,
FMOD_DSP_PAN_ATTENUATION_RANGE,
FMOD_DSP_PAN_OVERRIDE_RANGE
} FMOD_DSP_PAN;
typedef enum
{
FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_12DB,
FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_24DB,
FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_48DB
} FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_TYPE;
typedef enum
{
FMOD_DSP_THREE_EQ_LOWGAIN,
FMOD_DSP_THREE_EQ_MIDGAIN,
FMOD_DSP_THREE_EQ_HIGHGAIN,
FMOD_DSP_THREE_EQ_LOWCROSSOVER,
FMOD_DSP_THREE_EQ_HIGHCROSSOVER,
FMOD_DSP_THREE_EQ_CROSSOVERSLOPE
} FMOD_DSP_THREE_EQ;
typedef enum
{
FMOD_DSP_FFT_WINDOW_RECT,
FMOD_DSP_FFT_WINDOW_TRIANGLE,
FMOD_DSP_FFT_WINDOW_HAMMING,
FMOD_DSP_FFT_WINDOW_HANNING,
FMOD_DSP_FFT_WINDOW_BLACKMAN,
FMOD_DSP_FFT_WINDOW_BLACKMANHARRIS
} FMOD_DSP_FFT_WINDOW;
typedef enum
{
FMOD_DSP_FFT_WINDOWSIZE,
FMOD_DSP_FFT_WINDOWTYPE,
FMOD_DSP_FFT_SPECTRUMDATA,
FMOD_DSP_FFT_DOMINANT_FREQ
} FMOD_DSP_FFT;
#define FMOD_DSP_LOUDNESS_METER_HISTOGRAM_SAMPLES 66
typedef enum
{
FMOD_DSP_LOUDNESS_METER_STATE,
FMOD_DSP_LOUDNESS_METER_WEIGHTING,
FMOD_DSP_LOUDNESS_METER_INFO
} FMOD_DSP_LOUDNESS_METER;
typedef enum
{
FMOD_DSP_LOUDNESS_METER_STATE_RESET_INTEGRATED = -3,
FMOD_DSP_LOUDNESS_METER_STATE_RESET_MAXPEAK = -2,
FMOD_DSP_LOUDNESS_METER_STATE_RESET_ALL = -1,
FMOD_DSP_LOUDNESS_METER_STATE_PAUSED = 0,
FMOD_DSP_LOUDNESS_METER_STATE_ANALYZING = 1
} FMOD_DSP_LOUDNESS_METER_STATE_TYPE;
typedef struct FMOD_DSP_LOUDNESS_METER_INFO_TYPE
{
float momentaryloudness;
float shorttermloudness;
float integratedloudness;
float loudness10thpercentile;
float loudness95thpercentile;
float loudnesshistogram[FMOD_DSP_LOUDNESS_METER_HISTOGRAM_SAMPLES];
float maxtruepeak;
float maxmomentaryloudness;
} FMOD_DSP_LOUDNESS_METER_INFO_TYPE;
typedef struct FMOD_DSP_LOUDNESS_METER_WEIGHTING_TYPE
{
float channelweight[32];
} FMOD_DSP_LOUDNESS_METER_WEIGHTING_TYPE;
typedef enum
{
FMOD_DSP_ENVELOPEFOLLOWER_ATTACK,
FMOD_DSP_ENVELOPEFOLLOWER_RELEASE,
FMOD_DSP_ENVELOPEFOLLOWER_ENVELOPE,
FMOD_DSP_ENVELOPEFOLLOWER_USESIDECHAIN
} FMOD_DSP_ENVELOPEFOLLOWER;
typedef enum
{
FMOD_DSP_CONVOLUTION_REVERB_PARAM_IR,
FMOD_DSP_CONVOLUTION_REVERB_PARAM_WET,
FMOD_DSP_CONVOLUTION_REVERB_PARAM_DRY,
FMOD_DSP_CONVOLUTION_REVERB_PARAM_LINKED
} FMOD_DSP_CONVOLUTION_REVERB;
typedef enum
{
FMOD_DSP_CHANNELMIX_OUTPUT_DEFAULT,
FMOD_DSP_CHANNELMIX_OUTPUT_ALLMONO,
FMOD_DSP_CHANNELMIX_OUTPUT_ALLSTEREO,
FMOD_DSP_CHANNELMIX_OUTPUT_ALLQUAD,
FMOD_DSP_CHANNELMIX_OUTPUT_ALL5POINT1,
FMOD_DSP_CHANNELMIX_OUTPUT_ALL7POINT1,
FMOD_DSP_CHANNELMIX_OUTPUT_ALLLFE,
FMOD_DSP_CHANNELMIX_OUTPUT_ALL7POINT1POINT4
} FMOD_DSP_CHANNELMIX_OUTPUT;
typedef enum
{
FMOD_DSP_CHANNELMIX_OUTPUTGROUPING,
FMOD_DSP_CHANNELMIX_GAIN_CH0,
FMOD_DSP_CHANNELMIX_GAIN_CH1,
FMOD_DSP_CHANNELMIX_GAIN_CH2,
FMOD_DSP_CHANNELMIX_GAIN_CH3,
FMOD_DSP_CHANNELMIX_GAIN_CH4,
FMOD_DSP_CHANNELMIX_GAIN_CH5,
FMOD_DSP_CHANNELMIX_GAIN_CH6,
FMOD_DSP_CHANNELMIX_GAIN_CH7,
FMOD_DSP_CHANNELMIX_GAIN_CH8,
FMOD_DSP_CHANNELMIX_GAIN_CH9,
FMOD_DSP_CHANNELMIX_GAIN_CH10,
FMOD_DSP_CHANNELMIX_GAIN_CH11,
FMOD_DSP_CHANNELMIX_GAIN_CH12,
FMOD_DSP_CHANNELMIX_GAIN_CH13,
FMOD_DSP_CHANNELMIX_GAIN_CH14,
FMOD_DSP_CHANNELMIX_GAIN_CH15,
FMOD_DSP_CHANNELMIX_GAIN_CH16,
FMOD_DSP_CHANNELMIX_GAIN_CH17,
FMOD_DSP_CHANNELMIX_GAIN_CH18,
FMOD_DSP_CHANNELMIX_GAIN_CH19,
FMOD_DSP_CHANNELMIX_GAIN_CH20,
FMOD_DSP_CHANNELMIX_GAIN_CH21,
FMOD_DSP_CHANNELMIX_GAIN_CH22,
FMOD_DSP_CHANNELMIX_GAIN_CH23,
FMOD_DSP_CHANNELMIX_GAIN_CH24,
FMOD_DSP_CHANNELMIX_GAIN_CH25,
FMOD_DSP_CHANNELMIX_GAIN_CH26,
FMOD_DSP_CHANNELMIX_GAIN_CH27,
FMOD_DSP_CHANNELMIX_GAIN_CH28,
FMOD_DSP_CHANNELMIX_GAIN_CH29,
FMOD_DSP_CHANNELMIX_GAIN_CH30,
FMOD_DSP_CHANNELMIX_GAIN_CH31,
FMOD_DSP_CHANNELMIX_OUTPUT_CH0,
FMOD_DSP_CHANNELMIX_OUTPUT_CH1,
FMOD_DSP_CHANNELMIX_OUTPUT_CH2,
FMOD_DSP_CHANNELMIX_OUTPUT_CH3,
FMOD_DSP_CHANNELMIX_OUTPUT_CH4,
FMOD_DSP_CHANNELMIX_OUTPUT_CH5,
FMOD_DSP_CHANNELMIX_OUTPUT_CH6,
FMOD_DSP_CHANNELMIX_OUTPUT_CH7,
FMOD_DSP_CHANNELMIX_OUTPUT_CH8,
FMOD_DSP_CHANNELMIX_OUTPUT_CH9,
FMOD_DSP_CHANNELMIX_OUTPUT_CH10,
FMOD_DSP_CHANNELMIX_OUTPUT_CH11,
FMOD_DSP_CHANNELMIX_OUTPUT_CH12,
FMOD_DSP_CHANNELMIX_OUTPUT_CH13,
FMOD_DSP_CHANNELMIX_OUTPUT_CH14,
FMOD_DSP_CHANNELMIX_OUTPUT_CH15,
FMOD_DSP_CHANNELMIX_OUTPUT_CH16,
FMOD_DSP_CHANNELMIX_OUTPUT_CH17,
FMOD_DSP_CHANNELMIX_OUTPUT_CH18,
FMOD_DSP_CHANNELMIX_OUTPUT_CH19,
FMOD_DSP_CHANNELMIX_OUTPUT_CH20,
FMOD_DSP_CHANNELMIX_OUTPUT_CH21,
FMOD_DSP_CHANNELMIX_OUTPUT_CH22,
FMOD_DSP_CHANNELMIX_OUTPUT_CH23,
FMOD_DSP_CHANNELMIX_OUTPUT_CH24,
FMOD_DSP_CHANNELMIX_OUTPUT_CH25,
FMOD_DSP_CHANNELMIX_OUTPUT_CH26,
FMOD_DSP_CHANNELMIX_OUTPUT_CH27,
FMOD_DSP_CHANNELMIX_OUTPUT_CH28,
FMOD_DSP_CHANNELMIX_OUTPUT_CH29,
FMOD_DSP_CHANNELMIX_OUTPUT_CH30,
FMOD_DSP_CHANNELMIX_OUTPUT_CH31
} FMOD_DSP_CHANNELMIX;
typedef enum
{
FMOD_DSP_TRANSCEIVER_SPEAKERMODE_AUTO = -1,
FMOD_DSP_TRANSCEIVER_SPEAKERMODE_MONO = 0,
FMOD_DSP_TRANSCEIVER_SPEAKERMODE_STEREO,
FMOD_DSP_TRANSCEIVER_SPEAKERMODE_SURROUND,
} FMOD_DSP_TRANSCEIVER_SPEAKERMODE;
typedef enum
{
FMOD_DSP_TRANSCEIVER_TRANSMIT,
FMOD_DSP_TRANSCEIVER_GAIN,
FMOD_DSP_TRANSCEIVER_CHANNEL,
FMOD_DSP_TRANSCEIVER_TRANSMITSPEAKERMODE
} FMOD_DSP_TRANSCEIVER;
typedef enum
{
FMOD_DSP_OBJECTPAN_3D_POSITION,
FMOD_DSP_OBJECTPAN_3D_ROLLOFF,
FMOD_DSP_OBJECTPAN_3D_MIN_DISTANCE,
FMOD_DSP_OBJECTPAN_3D_MAX_DISTANCE,
FMOD_DSP_OBJECTPAN_3D_EXTENT_MODE,
FMOD_DSP_OBJECTPAN_3D_SOUND_SIZE,
FMOD_DSP_OBJECTPAN_3D_MIN_EXTENT,
FMOD_DSP_OBJECTPAN_OVERALL_GAIN,
FMOD_DSP_OBJECTPAN_OUTPUTGAIN,
FMOD_DSP_OBJECTPAN_ATTENUATION_RANGE,
FMOD_DSP_OBJECTPAN_OVERRIDE_RANGE
} FMOD_DSP_OBJECTPAN;
#endif

View File

@@ -0,0 +1,106 @@
/* ============================================================================================== */
/* FMOD Core / Studio API - Error string header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* Use this header if you want to store or display a string version / english explanation */
/* of the FMOD error codes. */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/core-api-common.html#fmod_result */
/* =============================================================================================== */
namespace FMOD
{
public class Error
{
public static string String(FMOD.RESULT errcode)
{
switch (errcode)
{
case FMOD.RESULT.OK: return "No errors.";
case FMOD.RESULT.ERR_BADCOMMAND: return "Tried to call a function on a data type that does not allow this type of functionality (ie calling Sound::lock on a streaming sound).";
case FMOD.RESULT.ERR_CHANNEL_ALLOC: return "Error trying to allocate a channel.";
case FMOD.RESULT.ERR_CHANNEL_STOLEN: return "The specified channel has been reused to play another sound.";
case FMOD.RESULT.ERR_DMA: return "DMA Failure. See debug output for more information.";
case FMOD.RESULT.ERR_DSP_CONNECTION: return "DSP connection error. Connection possibly caused a cyclic dependency or connected dsps with incompatible buffer counts.";
case FMOD.RESULT.ERR_DSP_DONTPROCESS: return "DSP return code from a DSP process query callback. Tells mixer not to call the process callback and therefore not consume CPU. Use this to optimize the DSP graph.";
case FMOD.RESULT.ERR_DSP_FORMAT: return "DSP Format error. A DSP unit may have attempted to connect to this network with the wrong format, or a matrix may have been set with the wrong size if the target unit has a specified channel map.";
case FMOD.RESULT.ERR_DSP_INUSE: return "DSP is already in the mixer's DSP network. It must be removed before being reinserted or released.";
case FMOD.RESULT.ERR_DSP_NOTFOUND: return "DSP connection error. Couldn't find the DSP unit specified.";
case FMOD.RESULT.ERR_DSP_RESERVED: return "DSP operation error. Cannot perform operation on this DSP as it is reserved by the system.";
case FMOD.RESULT.ERR_DSP_SILENCE: return "DSP return code from a DSP process query callback. Tells mixer silence would be produced from read, so go idle and not consume CPU. Use this to optimize the DSP graph.";
case FMOD.RESULT.ERR_DSP_TYPE: return "DSP operation cannot be performed on a DSP of this type.";
case FMOD.RESULT.ERR_FILE_BAD: return "Error loading file.";
case FMOD.RESULT.ERR_FILE_COULDNOTSEEK: return "Couldn't perform seek operation. This is a limitation of the medium (ie netstreams) or the file format.";
case FMOD.RESULT.ERR_FILE_DISKEJECTED: return "Media was ejected while reading.";
case FMOD.RESULT.ERR_FILE_EOF: return "End of file unexpectedly reached while trying to read essential data (truncated?).";
case FMOD.RESULT.ERR_FILE_ENDOFDATA: return "End of current chunk reached while trying to read data.";
case FMOD.RESULT.ERR_FILE_NOTFOUND: return "File not found.";
case FMOD.RESULT.ERR_FORMAT: return "Unsupported file or audio format.";
case FMOD.RESULT.ERR_HEADER_MISMATCH: return "There is a version mismatch between the FMOD header and either the FMOD Studio library or the FMOD Low Level library.";
case FMOD.RESULT.ERR_HTTP: return "A HTTP error occurred. This is a catch-all for HTTP errors not listed elsewhere.";
case FMOD.RESULT.ERR_HTTP_ACCESS: return "The specified resource requires authentication or is forbidden.";
case FMOD.RESULT.ERR_HTTP_PROXY_AUTH: return "Proxy authentication is required to access the specified resource.";
case FMOD.RESULT.ERR_HTTP_SERVER_ERROR: return "A HTTP server error occurred.";
case FMOD.RESULT.ERR_HTTP_TIMEOUT: return "The HTTP request timed out.";
case FMOD.RESULT.ERR_INITIALIZATION: return "FMOD was not initialized correctly to support this function.";
case FMOD.RESULT.ERR_INITIALIZED: return "Cannot call this command after System::init.";
case FMOD.RESULT.ERR_INTERNAL: return "An error occurred that wasn't supposed to. Contact support.";
case FMOD.RESULT.ERR_INVALID_FLOAT: return "Value passed in was a NaN, Inf or denormalized float.";
case FMOD.RESULT.ERR_INVALID_HANDLE: return "An invalid object handle was used.";
case FMOD.RESULT.ERR_INVALID_PARAM: return "An invalid parameter was passed to this function.";
case FMOD.RESULT.ERR_INVALID_POSITION: return "An invalid seek position was passed to this function.";
case FMOD.RESULT.ERR_INVALID_SPEAKER: return "An invalid speaker was passed to this function based on the current speaker mode.";
case FMOD.RESULT.ERR_INVALID_SYNCPOINT: return "The syncpoint did not come from this sound handle.";
case FMOD.RESULT.ERR_INVALID_THREAD: return "Tried to call a function on a thread that is not supported.";
case FMOD.RESULT.ERR_INVALID_VECTOR: return "The vectors passed in are not unit length, or perpendicular.";
case FMOD.RESULT.ERR_MAXAUDIBLE: return "Reached maximum audible playback count for this sound's soundgroup.";
case FMOD.RESULT.ERR_MEMORY: return "Not enough memory or resources.";
case FMOD.RESULT.ERR_MEMORY_CANTPOINT: return "Can't use FMOD_OPENMEMORY_POINT on non PCM source data, or non mp3/xma/adpcm data if FMOD_CREATECOMPRESSEDSAMPLE was used.";
case FMOD.RESULT.ERR_NEEDS3D: return "Tried to call a command on a 2d sound when the command was meant for 3d sound.";
case FMOD.RESULT.ERR_NEEDSHARDWARE: return "Tried to use a feature that requires hardware support.";
case FMOD.RESULT.ERR_NET_CONNECT: return "Couldn't connect to the specified host.";
case FMOD.RESULT.ERR_NET_SOCKET_ERROR: return "A socket error occurred. This is a catch-all for socket-related errors not listed elsewhere.";
case FMOD.RESULT.ERR_NET_URL: return "The specified URL couldn't be resolved.";
case FMOD.RESULT.ERR_NET_WOULD_BLOCK: return "Operation on a non-blocking socket could not complete immediately.";
case FMOD.RESULT.ERR_NOTREADY: return "Operation could not be performed because specified sound/DSP connection is not ready.";
case FMOD.RESULT.ERR_OUTPUT_ALLOCATED: return "Error initializing output device, but more specifically, the output device is already in use and cannot be reused.";
case FMOD.RESULT.ERR_OUTPUT_CREATEBUFFER: return "Error creating hardware sound buffer.";
case FMOD.RESULT.ERR_OUTPUT_DRIVERCALL: return "A call to a standard soundcard driver failed, which could possibly mean a bug in the driver or resources were missing or exhausted.";
case FMOD.RESULT.ERR_OUTPUT_FORMAT: return "Soundcard does not support the specified format.";
case FMOD.RESULT.ERR_OUTPUT_INIT: return "Error initializing output device.";
case FMOD.RESULT.ERR_OUTPUT_NODRIVERS: return "The output device has no drivers installed. If pre-init, FMOD_OUTPUT_NOSOUND is selected as the output mode. If post-init, the function just fails.";
case FMOD.RESULT.ERR_PLUGIN: return "An unspecified error has been returned from a plugin.";
case FMOD.RESULT.ERR_PLUGIN_MISSING: return "A requested output, dsp unit type or codec was not available.";
case FMOD.RESULT.ERR_PLUGIN_RESOURCE: return "A resource that the plugin requires cannot be allocated or found. (ie the DLS file for MIDI playback)";
case FMOD.RESULT.ERR_PLUGIN_VERSION: return "A plugin was built with an unsupported SDK version.";
case FMOD.RESULT.ERR_RECORD: return "An error occurred trying to initialize the recording device.";
case FMOD.RESULT.ERR_REVERB_CHANNELGROUP: return "Reverb properties cannot be set on this channel because a parent channelgroup owns the reverb connection.";
case FMOD.RESULT.ERR_REVERB_INSTANCE: return "Specified instance in FMOD_REVERB_PROPERTIES couldn't be set. Most likely because it is an invalid instance number or the reverb doesn't exist.";
case FMOD.RESULT.ERR_SUBSOUNDS: return "The error occurred because the sound referenced contains subsounds when it shouldn't have, or it doesn't contain subsounds when it should have. The operation may also not be able to be performed on a parent sound.";
case FMOD.RESULT.ERR_SUBSOUND_ALLOCATED: return "This subsound is already being used by another sound, you cannot have more than one parent to a sound. Null out the other parent's entry first.";
case FMOD.RESULT.ERR_SUBSOUND_CANTMOVE: return "Shared subsounds cannot be replaced or moved from their parent stream, such as when the parent stream is an FSB file.";
case FMOD.RESULT.ERR_TAGNOTFOUND: return "The specified tag could not be found or there are no tags.";
case FMOD.RESULT.ERR_TOOMANYCHANNELS: return "The sound created exceeds the allowable input channel count. This can be increased using the 'maxinputchannels' parameter in System::setSoftwareFormat.";
case FMOD.RESULT.ERR_TRUNCATED: return "The retrieved string is too long to fit in the supplied buffer and has been truncated.";
case FMOD.RESULT.ERR_UNIMPLEMENTED: return "Something in FMOD hasn't been implemented when it should be! contact support!";
case FMOD.RESULT.ERR_UNINITIALIZED: return "This command failed because System::init or System::setDriver was not called.";
case FMOD.RESULT.ERR_UNSUPPORTED: return "A command issued was not supported by this object. Possibly a plugin without certain callbacks specified.";
case FMOD.RESULT.ERR_VERSION: return "The version number of this file format is not supported.";
case FMOD.RESULT.ERR_EVENT_ALREADY_LOADED: return "The specified bank has already been loaded.";
case FMOD.RESULT.ERR_EVENT_LIVEUPDATE_BUSY: return "The live update connection failed due to the game already being connected.";
case FMOD.RESULT.ERR_EVENT_LIVEUPDATE_MISMATCH: return "The live update connection failed due to the game data being out of sync with the tool.";
case FMOD.RESULT.ERR_EVENT_LIVEUPDATE_TIMEOUT: return "The live update connection timed out.";
case FMOD.RESULT.ERR_EVENT_NOTFOUND: return "The requested event, bus or vca could not be found.";
case FMOD.RESULT.ERR_STUDIO_UNINITIALIZED: return "The Studio::System object is not yet initialized.";
case FMOD.RESULT.ERR_STUDIO_NOT_LOADED: return "The specified resource is not loaded, so it can't be unloaded.";
case FMOD.RESULT.ERR_INVALID_STRING: return "An invalid string was passed to this function.";
case FMOD.RESULT.ERR_ALREADY_LOCKED: return "The specified resource is already locked.";
case FMOD.RESULT.ERR_NOT_LOCKED: return "The specified resource is not locked, so it can't be unlocked.";
case FMOD.RESULT.ERR_RECORD_DISCONNECTED: return "The specified recording driver has been disconnected.";
case FMOD.RESULT.ERR_TOOMANYSAMPLES: return "The length provided exceed the allowable limit.";
default: return "Unknown error.";
}
}
}
}

View File

@@ -0,0 +1,110 @@
/* ============================================================================================== */
/* FMOD Core / Studio API - Error string header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* Use this header if you want to store or display a string version / english explanation */
/* of the FMOD error codes. */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/core-api-common.html#fmod_result */
/* =============================================================================================== */
#ifndef _FMOD_ERRORS_H
#define _FMOD_ERRORS_H
#include "fmod.h"
#ifdef __GNUC__
static const char *FMOD_ErrorString(FMOD_RESULT errcode) __attribute__((unused));
#endif
static const char *FMOD_ErrorString(FMOD_RESULT errcode)
{
switch (errcode)
{
case FMOD_OK: return "No errors.";
case FMOD_ERR_BADCOMMAND: return "Tried to call a function on a data type that does not allow this type of functionality (ie calling Sound::lock on a streaming sound).";
case FMOD_ERR_CHANNEL_ALLOC: return "Error trying to allocate a channel.";
case FMOD_ERR_CHANNEL_STOLEN: return "The specified channel has been reused to play another sound.";
case FMOD_ERR_DMA: return "DMA Failure. See debug output for more information.";
case FMOD_ERR_DSP_CONNECTION: return "DSP connection error. Connection possibly caused a cyclic dependency or connected dsps with incompatible buffer counts.";
case FMOD_ERR_DSP_DONTPROCESS: return "DSP return code from a DSP process query callback. Tells mixer not to call the process callback and therefore not consume CPU. Use this to optimize the DSP graph.";
case FMOD_ERR_DSP_FORMAT: return "DSP Format error. A DSP unit may have attempted to connect to this network with the wrong format, or a matrix may have been set with the wrong size if the target unit has a specified channel map.";
case FMOD_ERR_DSP_INUSE: return "DSP is already in the mixer's DSP network. It must be removed before being reinserted or released.";
case FMOD_ERR_DSP_NOTFOUND: return "DSP connection error. Couldn't find the DSP unit specified.";
case FMOD_ERR_DSP_RESERVED: return "DSP operation error. Cannot perform operation on this DSP as it is reserved by the system.";
case FMOD_ERR_DSP_SILENCE: return "DSP return code from a DSP process query callback. Tells mixer silence would be produced from read, so go idle and not consume CPU. Use this to optimize the DSP graph.";
case FMOD_ERR_DSP_TYPE: return "DSP operation cannot be performed on a DSP of this type.";
case FMOD_ERR_FILE_BAD: return "Error loading file.";
case FMOD_ERR_FILE_COULDNOTSEEK: return "Couldn't perform seek operation. This is a limitation of the medium (ie netstreams) or the file format.";
case FMOD_ERR_FILE_DISKEJECTED: return "Media was ejected while reading.";
case FMOD_ERR_FILE_EOF: return "End of file unexpectedly reached while trying to read essential data (truncated?).";
case FMOD_ERR_FILE_ENDOFDATA: return "End of current chunk reached while trying to read data.";
case FMOD_ERR_FILE_NOTFOUND: return "File not found.";
case FMOD_ERR_FORMAT: return "Unsupported file or audio format.";
case FMOD_ERR_HEADER_MISMATCH: return "There is a version mismatch between the FMOD header and either the FMOD Studio library or the FMOD Low Level library.";
case FMOD_ERR_HTTP: return "A HTTP error occurred. This is a catch-all for HTTP errors not listed elsewhere.";
case FMOD_ERR_HTTP_ACCESS: return "The specified resource requires authentication or is forbidden.";
case FMOD_ERR_HTTP_PROXY_AUTH: return "Proxy authentication is required to access the specified resource.";
case FMOD_ERR_HTTP_SERVER_ERROR: return "A HTTP server error occurred.";
case FMOD_ERR_HTTP_TIMEOUT: return "The HTTP request timed out.";
case FMOD_ERR_INITIALIZATION: return "FMOD was not initialized correctly to support this function.";
case FMOD_ERR_INITIALIZED: return "Cannot call this command after System::init.";
case FMOD_ERR_INTERNAL: return "An error occurred that wasn't supposed to. Contact support.";
case FMOD_ERR_INVALID_FLOAT: return "Value passed in was a NaN, Inf or denormalized float.";
case FMOD_ERR_INVALID_HANDLE: return "An invalid object handle was used.";
case FMOD_ERR_INVALID_PARAM: return "An invalid parameter was passed to this function.";
case FMOD_ERR_INVALID_POSITION: return "An invalid seek position was passed to this function.";
case FMOD_ERR_INVALID_SPEAKER: return "An invalid speaker was passed to this function based on the current speaker mode.";
case FMOD_ERR_INVALID_SYNCPOINT: return "The syncpoint did not come from this sound handle.";
case FMOD_ERR_INVALID_THREAD: return "Tried to call a function on a thread that is not supported.";
case FMOD_ERR_INVALID_VECTOR: return "The vectors passed in are not unit length, or perpendicular.";
case FMOD_ERR_MAXAUDIBLE: return "Reached maximum audible playback count for this sound's soundgroup.";
case FMOD_ERR_MEMORY: return "Not enough memory or resources.";
case FMOD_ERR_MEMORY_CANTPOINT: return "Can't use FMOD_OPENMEMORY_POINT on non PCM source data, or non mp3/xma/adpcm data if FMOD_CREATECOMPRESSEDSAMPLE was used.";
case FMOD_ERR_NEEDS3D: return "Tried to call a command on a 2d sound when the command was meant for 3d sound.";
case FMOD_ERR_NEEDSHARDWARE: return "Tried to use a feature that requires hardware support.";
case FMOD_ERR_NET_CONNECT: return "Couldn't connect to the specified host.";
case FMOD_ERR_NET_SOCKET_ERROR: return "A socket error occurred. This is a catch-all for socket-related errors not listed elsewhere.";
case FMOD_ERR_NET_URL: return "The specified URL couldn't be resolved.";
case FMOD_ERR_NET_WOULD_BLOCK: return "Operation on a non-blocking socket could not complete immediately.";
case FMOD_ERR_NOTREADY: return "Operation could not be performed because specified sound/DSP connection is not ready.";
case FMOD_ERR_OUTPUT_ALLOCATED: return "Error initializing output device, but more specifically, the output device is already in use and cannot be reused.";
case FMOD_ERR_OUTPUT_CREATEBUFFER: return "Error creating hardware sound buffer.";
case FMOD_ERR_OUTPUT_DRIVERCALL: return "A call to a standard soundcard driver failed, which could possibly mean a bug in the driver or resources were missing or exhausted.";
case FMOD_ERR_OUTPUT_FORMAT: return "Soundcard does not support the specified format.";
case FMOD_ERR_OUTPUT_INIT: return "Error initializing output device.";
case FMOD_ERR_OUTPUT_NODRIVERS: return "The output device has no drivers installed. If pre-init, FMOD_OUTPUT_NOSOUND is selected as the output mode. If post-init, the function just fails.";
case FMOD_ERR_PLUGIN: return "An unspecified error has been returned from a plugin.";
case FMOD_ERR_PLUGIN_MISSING: return "A requested output, dsp unit type or codec was not available.";
case FMOD_ERR_PLUGIN_RESOURCE: return "A resource that the plugin requires cannot be allocated or found. (ie the DLS file for MIDI playback)";
case FMOD_ERR_PLUGIN_VERSION: return "A plugin was built with an unsupported SDK version.";
case FMOD_ERR_RECORD: return "An error occurred trying to initialize the recording device.";
case FMOD_ERR_REVERB_CHANNELGROUP: return "Reverb properties cannot be set on this channel because a parent channelgroup owns the reverb connection.";
case FMOD_ERR_REVERB_INSTANCE: return "Specified instance in FMOD_REVERB_PROPERTIES couldn't be set. Most likely because it is an invalid instance number or the reverb doesn't exist.";
case FMOD_ERR_SUBSOUNDS: return "The error occurred because the sound referenced contains subsounds when it shouldn't have, or it doesn't contain subsounds when it should have. The operation may also not be able to be performed on a parent sound.";
case FMOD_ERR_SUBSOUND_ALLOCATED: return "This subsound is already being used by another sound, you cannot have more than one parent to a sound. Null out the other parent's entry first.";
case FMOD_ERR_SUBSOUND_CANTMOVE: return "Shared subsounds cannot be replaced or moved from their parent stream, such as when the parent stream is an FSB file.";
case FMOD_ERR_TAGNOTFOUND: return "The specified tag could not be found or there are no tags.";
case FMOD_ERR_TOOMANYCHANNELS: return "The sound created exceeds the allowable input channel count. This can be increased using the 'maxinputchannels' parameter in System::setSoftwareFormat.";
case FMOD_ERR_TRUNCATED: return "The retrieved string is too long to fit in the supplied buffer and has been truncated.";
case FMOD_ERR_UNIMPLEMENTED: return "Something in FMOD hasn't been implemented when it should be! contact support!";
case FMOD_ERR_UNINITIALIZED: return "This command failed because System::init or System::setDriver was not called.";
case FMOD_ERR_UNSUPPORTED: return "A command issued was not supported by this object. Possibly a plugin without certain callbacks specified.";
case FMOD_ERR_VERSION: return "The version number of this file format is not supported.";
case FMOD_ERR_EVENT_ALREADY_LOADED: return "The specified bank has already been loaded.";
case FMOD_ERR_EVENT_LIVEUPDATE_BUSY: return "The live update connection failed due to the game already being connected.";
case FMOD_ERR_EVENT_LIVEUPDATE_MISMATCH: return "The live update connection failed due to the game data being out of sync with the tool.";
case FMOD_ERR_EVENT_LIVEUPDATE_TIMEOUT: return "The live update connection timed out.";
case FMOD_ERR_EVENT_NOTFOUND: return "The requested event, parameter, bus or vca could not be found.";
case FMOD_ERR_STUDIO_UNINITIALIZED: return "The Studio::System object is not yet initialized.";
case FMOD_ERR_STUDIO_NOT_LOADED: return "The specified resource is not loaded, so it can't be unloaded.";
case FMOD_ERR_INVALID_STRING: return "An invalid string was passed to this function.";
case FMOD_ERR_ALREADY_LOCKED: return "The specified resource is already locked.";
case FMOD_ERR_NOT_LOCKED: return "The specified resource is not locked, so it can't be unlocked.";
case FMOD_ERR_RECORD_DISCONNECTED: return "The specified recording driver has been disconnected.";
case FMOD_ERR_TOOMANYSAMPLES: return "The length provided exceeds the allowable limit.";
default : return "Unknown error.";
};
}
#endif

View File

@@ -0,0 +1,122 @@
/* ======================================================================================== */
/* FMOD Core API - output development header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* Use this header if you are wanting to develop your own output plugin to use with */
/* FMOD's output system. With this header you can make your own output plugin that FMOD */
/* can register and use. See the documentation and examples on how to make a working */
/* plugin. */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/plugin-api-output.html */
/* ======================================================================================== */
#ifndef _FMOD_OUTPUT_H
#define _FMOD_OUTPUT_H
typedef struct FMOD_OUTPUT_STATE FMOD_OUTPUT_STATE;
typedef struct FMOD_OUTPUT_OBJECT3DINFO FMOD_OUTPUT_OBJECT3DINFO;
/*
Output constants
*/
#define FMOD_OUTPUT_PLUGIN_VERSION 5
typedef unsigned int FMOD_OUTPUT_METHOD;
#define FMOD_OUTPUT_METHOD_MIX_DIRECT 0
#define FMOD_OUTPUT_METHOD_MIX_BUFFERED 1
/*
Output callbacks
*/
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_GETNUMDRIVERS_CALLBACK) (FMOD_OUTPUT_STATE *output_state, int *numdrivers);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_GETDRIVERINFO_CALLBACK) (FMOD_OUTPUT_STATE *output_state, int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_INIT_CALLBACK) (FMOD_OUTPUT_STATE *output_state, int selecteddriver, FMOD_INITFLAGS flags, int *outputrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels, FMOD_SOUND_FORMAT *outputformat, int dspbufferlength, int *dspnumbuffers, int *dspnumadditionalbuffers, void *extradriverdata);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_START_CALLBACK) (FMOD_OUTPUT_STATE *output_state);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_STOP_CALLBACK) (FMOD_OUTPUT_STATE *output_state);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_CLOSE_CALLBACK) (FMOD_OUTPUT_STATE *output_state);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_UPDATE_CALLBACK) (FMOD_OUTPUT_STATE *output_state);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_GETHANDLE_CALLBACK) (FMOD_OUTPUT_STATE *output_state, void **handle);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_MIXER_CALLBACK) (FMOD_OUTPUT_STATE *output_state);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OBJECT3DGETINFO_CALLBACK) (FMOD_OUTPUT_STATE *output_state, int *maxhardwareobjects);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OBJECT3DALLOC_CALLBACK) (FMOD_OUTPUT_STATE *output_state, void **object3d);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OBJECT3DFREE_CALLBACK) (FMOD_OUTPUT_STATE *output_state, void *object3d);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK) (FMOD_OUTPUT_STATE *output_state, void *object3d, const FMOD_OUTPUT_OBJECT3DINFO *info);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OPENPORT_CALLBACK) (FMOD_OUTPUT_STATE *output_state, FMOD_PORT_TYPE portType, FMOD_PORT_INDEX portIndex, int *portId, int *portRate, int *portChannels, FMOD_SOUND_FORMAT *portFormat);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_CLOSEPORT_CALLBACK) (FMOD_OUTPUT_STATE *output_state, int portId);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_DEVICELISTCHANGED_CALLBACK)(FMOD_OUTPUT_STATE *output_state);
/*
Output functions
*/
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_READFROMMIXER_FUNC) (FMOD_OUTPUT_STATE *output_state, void *buffer, unsigned int length);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_COPYPORT_FUNC) (FMOD_OUTPUT_STATE *output_state, int portId, void *buffer, unsigned int length);
typedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_REQUESTRESET_FUNC) (FMOD_OUTPUT_STATE *output_state);
typedef void * (F_CALL *FMOD_OUTPUT_ALLOC_FUNC) (unsigned int size, unsigned int align, const char *file, int line);
typedef void (F_CALL *FMOD_OUTPUT_FREE_FUNC) (void *ptr, const char *file, int line);
typedef void (F_CALL *FMOD_OUTPUT_LOG_FUNC) (FMOD_DEBUG_FLAGS level, const char *file, int line, const char *function, const char *string, ...);
/*
Output structures
*/
typedef struct FMOD_OUTPUT_DESCRIPTION
{
unsigned int apiversion;
const char *name;
unsigned int version;
FMOD_OUTPUT_METHOD method;
FMOD_OUTPUT_GETNUMDRIVERS_CALLBACK getnumdrivers;
FMOD_OUTPUT_GETDRIVERINFO_CALLBACK getdriverinfo;
FMOD_OUTPUT_INIT_CALLBACK init;
FMOD_OUTPUT_START_CALLBACK start;
FMOD_OUTPUT_STOP_CALLBACK stop;
FMOD_OUTPUT_CLOSE_CALLBACK close;
FMOD_OUTPUT_UPDATE_CALLBACK update;
FMOD_OUTPUT_GETHANDLE_CALLBACK gethandle;
FMOD_OUTPUT_MIXER_CALLBACK mixer;
FMOD_OUTPUT_OBJECT3DGETINFO_CALLBACK object3dgetinfo;
FMOD_OUTPUT_OBJECT3DALLOC_CALLBACK object3dalloc;
FMOD_OUTPUT_OBJECT3DFREE_CALLBACK object3dfree;
FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK object3dupdate;
FMOD_OUTPUT_OPENPORT_CALLBACK openport;
FMOD_OUTPUT_CLOSEPORT_CALLBACK closeport;
FMOD_OUTPUT_DEVICELISTCHANGED_CALLBACK devicelistchanged;
} FMOD_OUTPUT_DESCRIPTION;
struct FMOD_OUTPUT_STATE
{
void *plugindata;
FMOD_OUTPUT_READFROMMIXER_FUNC readfrommixer;
FMOD_OUTPUT_ALLOC_FUNC alloc;
FMOD_OUTPUT_FREE_FUNC free;
FMOD_OUTPUT_LOG_FUNC log;
FMOD_OUTPUT_COPYPORT_FUNC copyport;
FMOD_OUTPUT_REQUESTRESET_FUNC requestreset;
};
struct FMOD_OUTPUT_OBJECT3DINFO
{
float *buffer;
unsigned int bufferlength;
FMOD_VECTOR position;
float gain;
float spread;
float priority;
};
/*
Output macros
*/
#define FMOD_OUTPUT_READFROMMIXER(_state, _buffer, _length) \
(_state)->readfrommixer(_state, _buffer, _length)
#define FMOD_OUTPUT_ALLOC(_state, _size, _align) \
(_state)->alloc(_size, _align, __FILE__, __LINE__)
#define FMOD_OUTPUT_FREE(_state, _ptr) \
(_state)->free(_ptr, __FILE__, __LINE__)
#define FMOD_OUTPUT_LOG(_state, _level, _location, _format, ...) \
(_state)->log(_level, __FILE__, __LINE__, _location, _format, ##__VA_ARGS__)
#define FMOD_OUTPUT_COPYPORT(_state, _id, _buffer, _length) \
(_state)->copyport(_state, _id, _buffer, _length)
#define FMOD_OUTPUT_REQUESTRESET(_state) \
(_state)->requestreset(_state)
#endif /* _FMOD_OUTPUT_H */

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,248 @@
/* ======================================================================================== */
/* FMOD Studio API - C header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* Use this header in conjunction with fmod_studio_common.h (which contains all the */
/* constants / callbacks) to develop using the C language. */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/studio-api.html */
/* ======================================================================================== */
#ifndef FMOD_STUDIO_H
#define FMOD_STUDIO_H
#include "fmod_studio_common.h"
#ifdef __cplusplus
extern "C"
{
#endif
/*
Global
*/
FMOD_RESULT F_API FMOD_Studio_ParseID(const char *idstring, FMOD_GUID *id);
FMOD_RESULT F_API FMOD_Studio_System_Create(FMOD_STUDIO_SYSTEM **system, unsigned int headerversion);
/*
System
*/
FMOD_BOOL F_API FMOD_Studio_System_IsValid(FMOD_STUDIO_SYSTEM *system);
FMOD_RESULT F_API FMOD_Studio_System_SetAdvancedSettings(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_ADVANCEDSETTINGS *settings);
FMOD_RESULT F_API FMOD_Studio_System_GetAdvancedSettings(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_ADVANCEDSETTINGS *settings);
FMOD_RESULT F_API FMOD_Studio_System_Initialize(FMOD_STUDIO_SYSTEM *system, int maxchannels, FMOD_STUDIO_INITFLAGS studioflags, FMOD_INITFLAGS flags, void *extradriverdata);
FMOD_RESULT F_API FMOD_Studio_System_Release(FMOD_STUDIO_SYSTEM *system);
FMOD_RESULT F_API FMOD_Studio_System_Update(FMOD_STUDIO_SYSTEM *system);
FMOD_RESULT F_API FMOD_Studio_System_GetCoreSystem(FMOD_STUDIO_SYSTEM *system, FMOD_SYSTEM **coresystem);
FMOD_RESULT F_API FMOD_Studio_System_GetEvent(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_EVENTDESCRIPTION **event);
FMOD_RESULT F_API FMOD_Studio_System_GetBus(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_BUS **bus);
FMOD_RESULT F_API FMOD_Studio_System_GetVCA(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_VCA **vca);
FMOD_RESULT F_API FMOD_Studio_System_GetBank(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_BANK **bank);
FMOD_RESULT F_API FMOD_Studio_System_GetEventByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_EVENTDESCRIPTION **event);
FMOD_RESULT F_API FMOD_Studio_System_GetBusByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_BUS **bus);
FMOD_RESULT F_API FMOD_Studio_System_GetVCAByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_VCA **vca);
FMOD_RESULT F_API FMOD_Studio_System_GetBankByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_BANK **bank);
FMOD_RESULT F_API FMOD_Studio_System_GetSoundInfo(FMOD_STUDIO_SYSTEM *system, const char *key, FMOD_STUDIO_SOUND_INFO *info);
FMOD_RESULT F_API FMOD_Studio_System_GetParameterDescriptionByName(FMOD_STUDIO_SYSTEM *system, const char *name, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter);
FMOD_RESULT F_API FMOD_Studio_System_GetParameterDescriptionByID(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_ID id, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter);
FMOD_RESULT F_API FMOD_Studio_System_GetParameterLabelByName(FMOD_STUDIO_SYSTEM *system, const char *name, int labelindex, char *label, int size, int *retrieved);
FMOD_RESULT F_API FMOD_Studio_System_GetParameterLabelByID(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_ID id, int labelindex, char *label, int size, int *retrieved);
FMOD_RESULT F_API FMOD_Studio_System_GetParameterByID(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_ID id, float *value, float *finalvalue);
FMOD_RESULT F_API FMOD_Studio_System_SetParameterByID(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_ID id, float value, FMOD_BOOL ignoreseekspeed);
FMOD_RESULT F_API FMOD_Studio_System_SetParameterByIDWithLabel(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_ID id, const char *label, FMOD_BOOL ignoreseekspeed);
FMOD_RESULT F_API FMOD_Studio_System_SetParametersByIDs(FMOD_STUDIO_SYSTEM *system, const FMOD_STUDIO_PARAMETER_ID *ids, float *values, int count, FMOD_BOOL ignoreseekspeed);
FMOD_RESULT F_API FMOD_Studio_System_GetParameterByName(FMOD_STUDIO_SYSTEM *system, const char *name, float *value, float *finalvalue);
FMOD_RESULT F_API FMOD_Studio_System_SetParameterByName(FMOD_STUDIO_SYSTEM *system, const char *name, float value, FMOD_BOOL ignoreseekspeed);
FMOD_RESULT F_API FMOD_Studio_System_SetParameterByNameWithLabel(FMOD_STUDIO_SYSTEM *system, const char *name, const char *label, FMOD_BOOL ignoreseekspeed);
FMOD_RESULT F_API FMOD_Studio_System_LookupID(FMOD_STUDIO_SYSTEM *system, const char *path, FMOD_GUID *id);
FMOD_RESULT F_API FMOD_Studio_System_LookupPath(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, char *path, int size, int *retrieved);
FMOD_RESULT F_API FMOD_Studio_System_GetNumListeners(FMOD_STUDIO_SYSTEM *system, int *numlisteners);
FMOD_RESULT F_API FMOD_Studio_System_SetNumListeners(FMOD_STUDIO_SYSTEM *system, int numlisteners);
FMOD_RESULT F_API FMOD_Studio_System_GetListenerAttributes(FMOD_STUDIO_SYSTEM *system, int index, FMOD_3D_ATTRIBUTES *attributes, FMOD_VECTOR *attenuationposition);
FMOD_RESULT F_API FMOD_Studio_System_SetListenerAttributes(FMOD_STUDIO_SYSTEM *system, int index, const FMOD_3D_ATTRIBUTES *attributes, const FMOD_VECTOR *attenuationposition);
FMOD_RESULT F_API FMOD_Studio_System_GetListenerWeight(FMOD_STUDIO_SYSTEM *system, int index, float *weight);
FMOD_RESULT F_API FMOD_Studio_System_SetListenerWeight(FMOD_STUDIO_SYSTEM *system, int index, float weight);
FMOD_RESULT F_API FMOD_Studio_System_LoadBankFile(FMOD_STUDIO_SYSTEM *system, const char *filename, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank);
FMOD_RESULT F_API FMOD_Studio_System_LoadBankMemory(FMOD_STUDIO_SYSTEM *system, const char *buffer, int length, FMOD_STUDIO_LOAD_MEMORY_MODE mode, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank);
FMOD_RESULT F_API FMOD_Studio_System_LoadBankCustom(FMOD_STUDIO_SYSTEM *system, const FMOD_STUDIO_BANK_INFO *info, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank);
FMOD_RESULT F_API FMOD_Studio_System_RegisterPlugin(FMOD_STUDIO_SYSTEM *system, const FMOD_DSP_DESCRIPTION *description);
FMOD_RESULT F_API FMOD_Studio_System_UnregisterPlugin(FMOD_STUDIO_SYSTEM *system, const char *name);
FMOD_RESULT F_API FMOD_Studio_System_UnloadAll(FMOD_STUDIO_SYSTEM *system);
FMOD_RESULT F_API FMOD_Studio_System_FlushCommands(FMOD_STUDIO_SYSTEM *system);
FMOD_RESULT F_API FMOD_Studio_System_FlushSampleLoading(FMOD_STUDIO_SYSTEM *system);
FMOD_RESULT F_API FMOD_Studio_System_StartCommandCapture(FMOD_STUDIO_SYSTEM *system, const char *filename, FMOD_STUDIO_COMMANDCAPTURE_FLAGS flags);
FMOD_RESULT F_API FMOD_Studio_System_StopCommandCapture(FMOD_STUDIO_SYSTEM *system);
FMOD_RESULT F_API FMOD_Studio_System_LoadCommandReplay(FMOD_STUDIO_SYSTEM *system, const char *filename, FMOD_STUDIO_COMMANDREPLAY_FLAGS flags, FMOD_STUDIO_COMMANDREPLAY **replay);
FMOD_RESULT F_API FMOD_Studio_System_GetBankCount(FMOD_STUDIO_SYSTEM *system, int *count);
FMOD_RESULT F_API FMOD_Studio_System_GetBankList(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_BANK **array, int capacity, int *count);
FMOD_RESULT F_API FMOD_Studio_System_GetParameterDescriptionCount(FMOD_STUDIO_SYSTEM *system, int *count);
FMOD_RESULT F_API FMOD_Studio_System_GetParameterDescriptionList(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_PARAMETER_DESCRIPTION *array, int capacity, int *count);
FMOD_RESULT F_API FMOD_Studio_System_GetCPUUsage(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_CPU_USAGE *usage, FMOD_CPU_USAGE *usage_core);
FMOD_RESULT F_API FMOD_Studio_System_GetBufferUsage(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_BUFFER_USAGE *usage);
FMOD_RESULT F_API FMOD_Studio_System_ResetBufferUsage(FMOD_STUDIO_SYSTEM *system);
FMOD_RESULT F_API FMOD_Studio_System_SetCallback(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_SYSTEM_CALLBACK callback, FMOD_STUDIO_SYSTEM_CALLBACK_TYPE callbackmask);
FMOD_RESULT F_API FMOD_Studio_System_SetUserData(FMOD_STUDIO_SYSTEM *system, void *userdata);
FMOD_RESULT F_API FMOD_Studio_System_GetUserData(FMOD_STUDIO_SYSTEM *system, void **userdata);
FMOD_RESULT F_API FMOD_Studio_System_GetMemoryUsage(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_MEMORY_USAGE *memoryusage);
/*
EventDescription
*/
FMOD_BOOL F_API FMOD_Studio_EventDescription_IsValid(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetID(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_GUID *id);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetPath(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, char *path, int size, int *retrieved);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterDescriptionCount(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *count);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterDescriptionByIndex(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int index, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterDescriptionByName(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, const char *name, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterDescriptionByID(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_PARAMETER_ID id, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterLabelByIndex(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int index, int labelindex, char *label, int size, int *retrieved);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterLabelByName(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, const char *name, int labelindex, char *label, int size, int *retrieved);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterLabelByID(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_PARAMETER_ID id, int labelindex, char *label, int size, int *retrieved);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserPropertyCount(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *count);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserPropertyByIndex(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int index, FMOD_STUDIO_USER_PROPERTY *property);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserProperty(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, const char *name, FMOD_STUDIO_USER_PROPERTY *property);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetLength(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *length);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetMinMaxDistance(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, float *min, float *max);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetSoundSize(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, float *size);
FMOD_RESULT F_API FMOD_Studio_EventDescription_IsSnapshot(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *snapshot);
FMOD_RESULT F_API FMOD_Studio_EventDescription_IsOneshot(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *oneshot);
FMOD_RESULT F_API FMOD_Studio_EventDescription_IsStream(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *isStream);
FMOD_RESULT F_API FMOD_Studio_EventDescription_Is3D(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *is3D);
FMOD_RESULT F_API FMOD_Studio_EventDescription_IsDopplerEnabled(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *doppler);
FMOD_RESULT F_API FMOD_Studio_EventDescription_HasSustainPoint(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *sustainPoint);
FMOD_RESULT F_API FMOD_Studio_EventDescription_CreateInstance(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_EVENTINSTANCE **instance);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetInstanceCount(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *count);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetInstanceList(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_EVENTINSTANCE **array, int capacity, int *count);
FMOD_RESULT F_API FMOD_Studio_EventDescription_LoadSampleData(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription);
FMOD_RESULT F_API FMOD_Studio_EventDescription_UnloadSampleData(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetSampleLoadingState(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_LOADING_STATE *state);
FMOD_RESULT F_API FMOD_Studio_EventDescription_ReleaseAllInstances(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription);
FMOD_RESULT F_API FMOD_Studio_EventDescription_SetCallback(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask);
FMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserData(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, void **userdata);
FMOD_RESULT F_API FMOD_Studio_EventDescription_SetUserData(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, void *userdata);
/*
EventInstance
*/
FMOD_BOOL F_API FMOD_Studio_EventInstance_IsValid(FMOD_STUDIO_EVENTINSTANCE *eventinstance);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetDescription(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENTDESCRIPTION **description);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetVolume(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float *volume, float *finalvolume);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetVolume(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float volume);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetPitch(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float *pitch, float *finalpitch);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetPitch(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float pitch);
FMOD_RESULT F_API FMOD_Studio_EventInstance_Get3DAttributes(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_3D_ATTRIBUTES *attributes);
FMOD_RESULT F_API FMOD_Studio_EventInstance_Set3DAttributes(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_3D_ATTRIBUTES *attributes);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetListenerMask(FMOD_STUDIO_EVENTINSTANCE *eventinstance, unsigned int *mask);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetListenerMask(FMOD_STUDIO_EVENTINSTANCE *eventinstance, unsigned int mask);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetProperty(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENT_PROPERTY index, float *value);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetProperty(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENT_PROPERTY index, float value);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetReverbLevel(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int index, float *level);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetReverbLevel(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int index, float level);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetPaused(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_BOOL *paused);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetPaused(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_BOOL paused);
FMOD_RESULT F_API FMOD_Studio_EventInstance_Start(FMOD_STUDIO_EVENTINSTANCE *eventinstance);
FMOD_RESULT F_API FMOD_Studio_EventInstance_Stop(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_STOP_MODE mode);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetTimelinePosition(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int *position);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetTimelinePosition(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int position);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetPlaybackState(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_PLAYBACK_STATE *state);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetChannelGroup(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_CHANNELGROUP **group);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetMinMaxDistance(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float *min, float *max);
FMOD_RESULT F_API FMOD_Studio_EventInstance_Release(FMOD_STUDIO_EVENTINSTANCE *eventinstance);
FMOD_RESULT F_API FMOD_Studio_EventInstance_IsVirtual(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_BOOL *virtualstate);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetParameterByName(FMOD_STUDIO_EVENTINSTANCE *eventinstance, const char *name, float *value, float *finalvalue);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetParameterByName(FMOD_STUDIO_EVENTINSTANCE *eventinstance, const char *name, float value, FMOD_BOOL ignoreseekspeed);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetParameterByNameWithLabel(FMOD_STUDIO_EVENTINSTANCE *eventinstance, const char *name, const char *label, FMOD_BOOL ignoreseekspeed);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetParameterByID(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_PARAMETER_ID id, float *value, float *finalvalue);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetParameterByID(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_PARAMETER_ID id, float value, FMOD_BOOL ignoreseekspeed);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetParameterByIDWithLabel(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_PARAMETER_ID id, const char *label, FMOD_BOOL ignoreseekspeed);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetParametersByIDs(FMOD_STUDIO_EVENTINSTANCE *eventinstance, const FMOD_STUDIO_PARAMETER_ID *ids, float *values, int count, FMOD_BOOL ignoreseekspeed);
FMOD_RESULT F_API FMOD_Studio_EventInstance_KeyOff(FMOD_STUDIO_EVENTINSTANCE *eventinstance);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetCallback(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetUserData(FMOD_STUDIO_EVENTINSTANCE *eventinstance, void **userdata);
FMOD_RESULT F_API FMOD_Studio_EventInstance_SetUserData(FMOD_STUDIO_EVENTINSTANCE *eventinstance, void *userdata);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetCPUUsage(FMOD_STUDIO_EVENTINSTANCE *eventinstance, unsigned int *exclusive, unsigned int *inclusive);
FMOD_RESULT F_API FMOD_Studio_EventInstance_GetMemoryUsage(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_MEMORY_USAGE *memoryusage);
/*
Bus
*/
FMOD_BOOL F_API FMOD_Studio_Bus_IsValid(FMOD_STUDIO_BUS *bus);
FMOD_RESULT F_API FMOD_Studio_Bus_GetID(FMOD_STUDIO_BUS *bus, FMOD_GUID *id);
FMOD_RESULT F_API FMOD_Studio_Bus_GetPath(FMOD_STUDIO_BUS *bus, char *path, int size, int *retrieved);
FMOD_RESULT F_API FMOD_Studio_Bus_GetVolume(FMOD_STUDIO_BUS *bus, float *volume, float *finalvolume);
FMOD_RESULT F_API FMOD_Studio_Bus_SetVolume(FMOD_STUDIO_BUS *bus, float volume);
FMOD_RESULT F_API FMOD_Studio_Bus_GetPaused(FMOD_STUDIO_BUS *bus, FMOD_BOOL *paused);
FMOD_RESULT F_API FMOD_Studio_Bus_SetPaused(FMOD_STUDIO_BUS *bus, FMOD_BOOL paused);
FMOD_RESULT F_API FMOD_Studio_Bus_GetMute(FMOD_STUDIO_BUS *bus, FMOD_BOOL *mute);
FMOD_RESULT F_API FMOD_Studio_Bus_SetMute(FMOD_STUDIO_BUS *bus, FMOD_BOOL mute);
FMOD_RESULT F_API FMOD_Studio_Bus_StopAllEvents(FMOD_STUDIO_BUS *bus, FMOD_STUDIO_STOP_MODE mode);
FMOD_RESULT F_API FMOD_Studio_Bus_GetPortIndex(FMOD_STUDIO_BUS *bus, FMOD_PORT_INDEX *index);
FMOD_RESULT F_API FMOD_Studio_Bus_SetPortIndex(FMOD_STUDIO_BUS *bus, FMOD_PORT_INDEX index);
FMOD_RESULT F_API FMOD_Studio_Bus_LockChannelGroup(FMOD_STUDIO_BUS *bus);
FMOD_RESULT F_API FMOD_Studio_Bus_UnlockChannelGroup(FMOD_STUDIO_BUS *bus);
FMOD_RESULT F_API FMOD_Studio_Bus_GetChannelGroup(FMOD_STUDIO_BUS *bus, FMOD_CHANNELGROUP **group);
FMOD_RESULT F_API FMOD_Studio_Bus_GetCPUUsage(FMOD_STUDIO_BUS *bus, unsigned int *exclusive, unsigned int *inclusive);
FMOD_RESULT F_API FMOD_Studio_Bus_GetMemoryUsage(FMOD_STUDIO_BUS *bus, FMOD_STUDIO_MEMORY_USAGE *memoryusage);
/*
VCA
*/
FMOD_BOOL F_API FMOD_Studio_VCA_IsValid(FMOD_STUDIO_VCA *vca);
FMOD_RESULT F_API FMOD_Studio_VCA_GetID(FMOD_STUDIO_VCA *vca, FMOD_GUID *id);
FMOD_RESULT F_API FMOD_Studio_VCA_GetPath(FMOD_STUDIO_VCA *vca, char *path, int size, int *retrieved);
FMOD_RESULT F_API FMOD_Studio_VCA_GetVolume(FMOD_STUDIO_VCA *vca, float *volume, float *finalvolume);
FMOD_RESULT F_API FMOD_Studio_VCA_SetVolume(FMOD_STUDIO_VCA *vca, float volume);
/*
Bank
*/
FMOD_BOOL F_API FMOD_Studio_Bank_IsValid(FMOD_STUDIO_BANK *bank);
FMOD_RESULT F_API FMOD_Studio_Bank_GetID(FMOD_STUDIO_BANK *bank, FMOD_GUID *id);
FMOD_RESULT F_API FMOD_Studio_Bank_GetPath(FMOD_STUDIO_BANK *bank, char *path, int size, int *retrieved);
FMOD_RESULT F_API FMOD_Studio_Bank_Unload(FMOD_STUDIO_BANK *bank);
FMOD_RESULT F_API FMOD_Studio_Bank_LoadSampleData(FMOD_STUDIO_BANK *bank);
FMOD_RESULT F_API FMOD_Studio_Bank_UnloadSampleData(FMOD_STUDIO_BANK *bank);
FMOD_RESULT F_API FMOD_Studio_Bank_GetLoadingState(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_LOADING_STATE *state);
FMOD_RESULT F_API FMOD_Studio_Bank_GetSampleLoadingState(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_LOADING_STATE *state);
FMOD_RESULT F_API FMOD_Studio_Bank_GetStringCount(FMOD_STUDIO_BANK *bank, int *count);
FMOD_RESULT F_API FMOD_Studio_Bank_GetStringInfo(FMOD_STUDIO_BANK *bank, int index, FMOD_GUID *id, char *path, int size, int *retrieved);
FMOD_RESULT F_API FMOD_Studio_Bank_GetEventCount(FMOD_STUDIO_BANK *bank, int *count);
FMOD_RESULT F_API FMOD_Studio_Bank_GetEventList(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_EVENTDESCRIPTION **array, int capacity, int *count);
FMOD_RESULT F_API FMOD_Studio_Bank_GetBusCount(FMOD_STUDIO_BANK *bank, int *count);
FMOD_RESULT F_API FMOD_Studio_Bank_GetBusList(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_BUS **array, int capacity, int *count);
FMOD_RESULT F_API FMOD_Studio_Bank_GetVCACount(FMOD_STUDIO_BANK *bank, int *count);
FMOD_RESULT F_API FMOD_Studio_Bank_GetVCAList(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_VCA **array, int capacity, int *count);
FMOD_RESULT F_API FMOD_Studio_Bank_GetUserData(FMOD_STUDIO_BANK *bank, void **userdata);
FMOD_RESULT F_API FMOD_Studio_Bank_SetUserData(FMOD_STUDIO_BANK *bank, void *userdata);
/*
Command playback information
*/
FMOD_BOOL F_API FMOD_Studio_CommandReplay_IsValid(FMOD_STUDIO_COMMANDREPLAY *replay);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetSystem(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_SYSTEM **system);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetLength(FMOD_STUDIO_COMMANDREPLAY *replay, float *length);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandCount(FMOD_STUDIO_COMMANDREPLAY *replay, int *count);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandInfo(FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex, FMOD_STUDIO_COMMAND_INFO *info);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandString(FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex, char *buffer, int length);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandAtTime(FMOD_STUDIO_COMMANDREPLAY *replay, float time, int *commandindex);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetBankPath(FMOD_STUDIO_COMMANDREPLAY *replay, const char *bankPath);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_Start(FMOD_STUDIO_COMMANDREPLAY *replay);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_Stop(FMOD_STUDIO_COMMANDREPLAY *replay);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_SeekToTime(FMOD_STUDIO_COMMANDREPLAY *replay, float time);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_SeekToCommand(FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetPaused(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_BOOL *paused);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetPaused(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_BOOL paused);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetPlaybackState(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_PLAYBACK_STATE *state);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCurrentCommand(FMOD_STUDIO_COMMANDREPLAY *replay, int *commandindex, float *currenttime);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_Release(FMOD_STUDIO_COMMANDREPLAY *replay);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetFrameCallback(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK callback);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetLoadBankCallback(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK callback);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetCreateInstanceCallback(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK callback);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_GetUserData(FMOD_STUDIO_COMMANDREPLAY *replay, void **userdata);
FMOD_RESULT F_API FMOD_Studio_CommandReplay_SetUserData(FMOD_STUDIO_COMMANDREPLAY *replay, void *userdata);
#ifdef __cplusplus
}
#endif
#endif /* FMOD_STUDIO_H */

View File

@@ -0,0 +1,402 @@
/* ======================================================================================== */
/* FMOD Studio API - C++ header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* Use this header in conjunction with fmod_studio_common.h (which contains all the */
/* constants / callbacks) to develop using the C++ language. */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/studio-api.html */
/* ======================================================================================== */
#ifndef FMOD_STUDIO_HPP
#define FMOD_STUDIO_HPP
#include "fmod_studio_common.h"
#include "fmod_studio.h"
#include "fmod.hpp"
namespace FMOD
{
namespace Studio
{
typedef FMOD_GUID ID; // Deprecated. Please use FMOD_GUID type.
class System;
class EventDescription;
class EventInstance;
class Bus;
class VCA;
class Bank;
class CommandReplay;
inline FMOD_RESULT parseID(const char *idstring, FMOD_GUID *id) { return FMOD_Studio_ParseID(idstring, id); }
class System
{
private:
// Constructor made private so user cannot statically instance a System class. System::create must be used.
System();
System(const System &);
public:
static FMOD_RESULT F_API create(System **system, unsigned int headerversion = FMOD_VERSION);
FMOD_RESULT F_API setAdvancedSettings(FMOD_STUDIO_ADVANCEDSETTINGS *settings);
FMOD_RESULT F_API getAdvancedSettings(FMOD_STUDIO_ADVANCEDSETTINGS *settings);
FMOD_RESULT F_API initialize(int maxchannels, FMOD_STUDIO_INITFLAGS studioflags, FMOD_INITFLAGS flags, void *extradriverdata);
FMOD_RESULT F_API release();
// Handle validity
bool F_API isValid() const;
// Update processing
FMOD_RESULT F_API update();
FMOD_RESULT F_API flushCommands();
FMOD_RESULT F_API flushSampleLoading();
// Low-level API access
FMOD_RESULT F_API getCoreSystem(FMOD::System **system) const;
// Asset retrieval
FMOD_RESULT F_API getEvent(const char *path, EventDescription **event) const;
FMOD_RESULT F_API getBus(const char *path, Bus **bus) const;
FMOD_RESULT F_API getVCA(const char *path, VCA **vca) const;
FMOD_RESULT F_API getBank(const char *path, Bank **bank) const;
FMOD_RESULT F_API getEventByID(const FMOD_GUID *id, EventDescription **event) const;
FMOD_RESULT F_API getBusByID(const FMOD_GUID *id, Bus **bus) const;
FMOD_RESULT F_API getVCAByID(const FMOD_GUID *id, VCA **vca) const;
FMOD_RESULT F_API getBankByID(const FMOD_GUID *id, Bank **bank) const;
FMOD_RESULT F_API getSoundInfo(const char *key, FMOD_STUDIO_SOUND_INFO *info) const;
FMOD_RESULT F_API getParameterDescriptionByName(const char *name, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const;
FMOD_RESULT F_API getParameterDescriptionByID(FMOD_STUDIO_PARAMETER_ID id, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const;
FMOD_RESULT F_API getParameterLabelByName(const char *name, int labelindex, char *label, int size, int *retrieved) const;
FMOD_RESULT F_API getParameterLabelByID(FMOD_STUDIO_PARAMETER_ID id, int labelindex, char *label, int size, int *retrieved) const;
// Global parameter control
FMOD_RESULT F_API getParameterByID(FMOD_STUDIO_PARAMETER_ID id, float *value, float *finalvalue = 0) const;
FMOD_RESULT F_API setParameterByID(FMOD_STUDIO_PARAMETER_ID id, float value, bool ignoreseekspeed = false);
FMOD_RESULT F_API setParameterByIDWithLabel(FMOD_STUDIO_PARAMETER_ID id, const char *label, bool ignoreseekspeed = false);
FMOD_RESULT F_API setParametersByIDs(const FMOD_STUDIO_PARAMETER_ID *ids, float *values, int count, bool ignoreseekspeed = false);
FMOD_RESULT F_API getParameterByName(const char *name, float *value, float *finalvalue = 0) const;
FMOD_RESULT F_API setParameterByName(const char *name, float value, bool ignoreseekspeed = false);
FMOD_RESULT F_API setParameterByNameWithLabel(const char *name, const char *label, bool ignoreseekspeed = false);
// Path lookup
FMOD_RESULT F_API lookupID(const char *path, FMOD_GUID *id) const;
FMOD_RESULT F_API lookupPath(const FMOD_GUID *id, char *path, int size, int *retrieved) const;
// Listener control
FMOD_RESULT F_API getNumListeners(int *numlisteners);
FMOD_RESULT F_API setNumListeners(int numlisteners);
FMOD_RESULT F_API getListenerAttributes(int listener, FMOD_3D_ATTRIBUTES *attributes, FMOD_VECTOR *attenuationposition = 0) const;
FMOD_RESULT F_API setListenerAttributes(int listener, const FMOD_3D_ATTRIBUTES *attributes, const FMOD_VECTOR *attenuationposition = 0);
FMOD_RESULT F_API getListenerWeight(int listener, float *weight);
FMOD_RESULT F_API setListenerWeight(int listener, float weight);
// Bank control
FMOD_RESULT F_API loadBankFile(const char *filename, FMOD_STUDIO_LOAD_BANK_FLAGS flags, Bank **bank);
FMOD_RESULT F_API loadBankMemory(const char *buffer, int length, FMOD_STUDIO_LOAD_MEMORY_MODE mode, FMOD_STUDIO_LOAD_BANK_FLAGS flags, Bank **bank);
FMOD_RESULT F_API loadBankCustom(const FMOD_STUDIO_BANK_INFO *info, FMOD_STUDIO_LOAD_BANK_FLAGS flags, Bank **bank);
FMOD_RESULT F_API unloadAll();
// General functionality
FMOD_RESULT F_API getBufferUsage(FMOD_STUDIO_BUFFER_USAGE *usage) const;
FMOD_RESULT F_API resetBufferUsage();
FMOD_RESULT F_API registerPlugin(const FMOD_DSP_DESCRIPTION *description);
FMOD_RESULT F_API unregisterPlugin(const char *name);
// Enumeration
FMOD_RESULT F_API getBankCount(int *count) const;
FMOD_RESULT F_API getBankList(Bank **array, int capacity, int *count) const;
FMOD_RESULT F_API getParameterDescriptionCount(int *count) const;
FMOD_RESULT F_API getParameterDescriptionList(FMOD_STUDIO_PARAMETER_DESCRIPTION *array, int capacity, int *count) const;
// Command capture and replay
FMOD_RESULT F_API startCommandCapture(const char *filename, FMOD_STUDIO_COMMANDCAPTURE_FLAGS flags);
FMOD_RESULT F_API stopCommandCapture();
FMOD_RESULT F_API loadCommandReplay(const char *filename, FMOD_STUDIO_COMMANDREPLAY_FLAGS flags, CommandReplay **replay);
// Callbacks
FMOD_RESULT F_API setCallback(FMOD_STUDIO_SYSTEM_CALLBACK callback, FMOD_STUDIO_SYSTEM_CALLBACK_TYPE callbackmask = FMOD_STUDIO_SYSTEM_CALLBACK_ALL);
FMOD_RESULT F_API getUserData(void **userdata) const;
FMOD_RESULT F_API setUserData(void *userdata);
// Monitoring
FMOD_RESULT F_API getCPUUsage(FMOD_STUDIO_CPU_USAGE *usage, FMOD_CPU_USAGE *usage_core) const;
FMOD_RESULT F_API getMemoryUsage(FMOD_STUDIO_MEMORY_USAGE *memoryusage) const;
};
class EventDescription
{
private:
// Constructor made private so user cannot statically instance the class.
EventDescription();
EventDescription(const EventDescription &);
public:
// Handle validity
bool F_API isValid() const;
// Property access
FMOD_RESULT F_API getID(FMOD_GUID *id) const;
FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const;
FMOD_RESULT F_API getParameterDescriptionCount(int *count) const;
FMOD_RESULT F_API getParameterDescriptionByIndex(int index, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const;
FMOD_RESULT F_API getParameterDescriptionByName(const char *name, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const;
FMOD_RESULT F_API getParameterDescriptionByID(FMOD_STUDIO_PARAMETER_ID id, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const;
FMOD_RESULT F_API getParameterLabelByIndex(int index, int labelindex, char *label, int size, int *retrieved) const;
FMOD_RESULT F_API getParameterLabelByName(const char *name, int labelindex, char *label, int size, int *retrieved) const;
FMOD_RESULT F_API getParameterLabelByID(FMOD_STUDIO_PARAMETER_ID id, int labelindex, char *label, int size, int *retrieved) const;
FMOD_RESULT F_API getUserPropertyCount(int *count) const;
FMOD_RESULT F_API getUserPropertyByIndex(int index, FMOD_STUDIO_USER_PROPERTY *property) const;
FMOD_RESULT F_API getUserProperty(const char *name, FMOD_STUDIO_USER_PROPERTY *property) const;
FMOD_RESULT F_API getLength(int *length) const;
FMOD_RESULT F_API getMinMaxDistance(float *min, float *max) const;
FMOD_RESULT F_API getSoundSize(float *size) const;
FMOD_RESULT F_API isSnapshot(bool *snapshot) const;
FMOD_RESULT F_API isOneshot(bool *oneshot) const;
FMOD_RESULT F_API isStream(bool *isStream) const;
FMOD_RESULT F_API is3D(bool *is3d) const;
FMOD_RESULT F_API isDopplerEnabled(bool *doppler) const;
FMOD_RESULT F_API hasSustainPoint(bool *sustainPoint) const;
// Playback control
FMOD_RESULT F_API createInstance(EventInstance **instance) const;
FMOD_RESULT F_API getInstanceCount(int *count) const;
FMOD_RESULT F_API getInstanceList(EventInstance **array, int capacity, int *count) const;
// Sample data loading control
FMOD_RESULT F_API loadSampleData();
FMOD_RESULT F_API unloadSampleData();
FMOD_RESULT F_API getSampleLoadingState(FMOD_STUDIO_LOADING_STATE *state) const;
// Convenience functions
FMOD_RESULT F_API releaseAllInstances();
// Callbacks
FMOD_RESULT F_API setCallback(FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask = FMOD_STUDIO_EVENT_CALLBACK_ALL);
FMOD_RESULT F_API getUserData(void **userdata) const;
FMOD_RESULT F_API setUserData(void *userdata);
};
class EventInstance
{
private:
// Constructor made private so user cannot statically instance the class.
EventInstance();
EventInstance(const EventInstance &);
public:
// Handle validity
bool F_API isValid() const;
// Property access
FMOD_RESULT F_API getDescription(EventDescription **description) const;
// Playback control
FMOD_RESULT F_API getVolume(float *volume, float *finalvolume = 0) const;
FMOD_RESULT F_API setVolume(float volume);
FMOD_RESULT F_API getPitch(float *pitch, float *finalpitch = 0) const;
FMOD_RESULT F_API setPitch(float pitch);
FMOD_RESULT F_API get3DAttributes(FMOD_3D_ATTRIBUTES *attributes) const;
FMOD_RESULT F_API set3DAttributes(const FMOD_3D_ATTRIBUTES *attributes);
FMOD_RESULT F_API getListenerMask(unsigned int *mask) const;
FMOD_RESULT F_API setListenerMask(unsigned int mask);
FMOD_RESULT F_API getProperty(FMOD_STUDIO_EVENT_PROPERTY index, float *value) const;
FMOD_RESULT F_API setProperty(FMOD_STUDIO_EVENT_PROPERTY index, float value);
FMOD_RESULT F_API getReverbLevel(int index, float *level) const;
FMOD_RESULT F_API setReverbLevel(int index, float level);
FMOD_RESULT F_API getPaused(bool *paused) const;
FMOD_RESULT F_API setPaused(bool paused);
FMOD_RESULT F_API start();
FMOD_RESULT F_API stop(FMOD_STUDIO_STOP_MODE mode);
FMOD_RESULT F_API getTimelinePosition(int *position) const;
FMOD_RESULT F_API setTimelinePosition(int position);
FMOD_RESULT F_API getPlaybackState(FMOD_STUDIO_PLAYBACK_STATE *state) const;
FMOD_RESULT F_API getChannelGroup(ChannelGroup **group) const;
FMOD_RESULT F_API getMinMaxDistance(float *min, float *max) const;
FMOD_RESULT F_API release();
FMOD_RESULT F_API isVirtual(bool *virtualstate) const;
FMOD_RESULT F_API getParameterByID(FMOD_STUDIO_PARAMETER_ID id, float *value, float *finalvalue = 0) const;
FMOD_RESULT F_API setParameterByID(FMOD_STUDIO_PARAMETER_ID id, float value, bool ignoreseekspeed = false);
FMOD_RESULT F_API setParameterByIDWithLabel(FMOD_STUDIO_PARAMETER_ID id, const char* label, bool ignoreseekspeed = false);
FMOD_RESULT F_API setParametersByIDs(const FMOD_STUDIO_PARAMETER_ID *ids, float *values, int count, bool ignoreseekspeed = false);
FMOD_RESULT F_API getParameterByName(const char *name, float *value, float *finalvalue = 0) const;
FMOD_RESULT F_API setParameterByName(const char *name, float value, bool ignoreseekspeed = false);
FMOD_RESULT F_API setParameterByNameWithLabel(const char *name, const char* label, bool ignoreseekspeed = false);
FMOD_RESULT F_API keyOff();
// Monitoring
FMOD_RESULT F_API getCPUUsage(unsigned int *exclusive, unsigned int *inclusive) const;
FMOD_RESULT F_API getMemoryUsage(FMOD_STUDIO_MEMORY_USAGE *memoryusage) const;
// Callbacks
FMOD_RESULT F_API setCallback(FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask = FMOD_STUDIO_EVENT_CALLBACK_ALL);
FMOD_RESULT F_API getUserData(void **userdata) const;
FMOD_RESULT F_API setUserData(void *userdata);
};
class Bus
{
private:
// Constructor made private so user cannot statically instance the class.
Bus();
Bus(const Bus &);
public:
// Handle validity
bool F_API isValid() const;
// Property access
FMOD_RESULT F_API getID(FMOD_GUID *id) const;
FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const;
// Playback control
FMOD_RESULT F_API getVolume(float *volume, float *finalvolume = 0) const;
FMOD_RESULT F_API setVolume(float volume);
FMOD_RESULT F_API getPaused(bool *paused) const;
FMOD_RESULT F_API setPaused(bool paused);
FMOD_RESULT F_API getMute(bool *mute) const;
FMOD_RESULT F_API setMute(bool mute);
FMOD_RESULT F_API stopAllEvents(FMOD_STUDIO_STOP_MODE mode);
// Output port
FMOD_RESULT F_API getPortIndex(FMOD_PORT_INDEX *index) const;
FMOD_RESULT F_API setPortIndex(FMOD_PORT_INDEX index);
// Low-level API access
FMOD_RESULT F_API lockChannelGroup();
FMOD_RESULT F_API unlockChannelGroup();
FMOD_RESULT F_API getChannelGroup(FMOD::ChannelGroup **group) const;
// Monitoring
FMOD_RESULT F_API getCPUUsage(unsigned int *exclusive, unsigned int *inclusive) const;
FMOD_RESULT F_API getMemoryUsage(FMOD_STUDIO_MEMORY_USAGE *memoryusage) const;
};
class VCA
{
private:
// Constructor made private so user cannot statically instance the class.
VCA();
VCA(const VCA &);
public:
// Handle validity
bool F_API isValid() const;
// Property access
FMOD_RESULT F_API getID(FMOD_GUID *id) const;
FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const;
// Playback control
FMOD_RESULT F_API getVolume(float *volume, float *finalvolume = 0) const;
FMOD_RESULT F_API setVolume(float volume);
};
class Bank
{
private:
// Constructor made private so user cannot statically instance the class.
Bank();
Bank(const Bank &);
public:
// Handle validity
bool F_API isValid() const;
// Property access
FMOD_RESULT F_API getID(FMOD_GUID *id) const;
FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const;
// Loading control
FMOD_RESULT F_API unload();
FMOD_RESULT F_API loadSampleData();
FMOD_RESULT F_API unloadSampleData();
FMOD_RESULT F_API getLoadingState(FMOD_STUDIO_LOADING_STATE *state) const;
FMOD_RESULT F_API getSampleLoadingState(FMOD_STUDIO_LOADING_STATE *state) const;
// Enumeration
FMOD_RESULT F_API getStringCount(int *count) const;
FMOD_RESULT F_API getStringInfo(int index, FMOD_GUID *id, char *path, int size, int *retrieved) const;
FMOD_RESULT F_API getEventCount(int *count) const;
FMOD_RESULT F_API getEventList(EventDescription **array, int capacity, int *count) const;
FMOD_RESULT F_API getBusCount(int *count) const;
FMOD_RESULT F_API getBusList(Bus **array, int capacity, int *count) const;
FMOD_RESULT F_API getVCACount(int *count) const;
FMOD_RESULT F_API getVCAList(VCA **array, int capacity, int *count) const;
FMOD_RESULT F_API getUserData(void **userdata) const;
FMOD_RESULT F_API setUserData(void *userdata);
};
class CommandReplay
{
private:
// Constructor made private so user cannot statically instance the class.
CommandReplay();
CommandReplay(const CommandReplay &);
public:
// Handle validity
bool F_API isValid() const;
// Information query
FMOD_RESULT F_API getSystem(System **system) const;
FMOD_RESULT F_API getLength(float *length) const;
FMOD_RESULT F_API getCommandCount(int *count) const;
FMOD_RESULT F_API getCommandInfo(int commandindex, FMOD_STUDIO_COMMAND_INFO *info) const;
FMOD_RESULT F_API getCommandString(int commandindex, char *buffer, int length) const;
FMOD_RESULT F_API getCommandAtTime(float time, int *commandindex) const;
// Playback
FMOD_RESULT F_API setBankPath(const char *bankPath);
FMOD_RESULT F_API start();
FMOD_RESULT F_API stop();
FMOD_RESULT F_API seekToTime(float time);
FMOD_RESULT F_API seekToCommand(int commandindex);
FMOD_RESULT F_API getPaused(bool *paused) const;
FMOD_RESULT F_API setPaused(bool paused);
FMOD_RESULT F_API getPlaybackState(FMOD_STUDIO_PLAYBACK_STATE *state) const;
FMOD_RESULT F_API getCurrentCommand(int *commandindex, float *currenttime) const;
// Release
FMOD_RESULT F_API release();
// Callbacks
FMOD_RESULT F_API setFrameCallback(FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK callback);
FMOD_RESULT F_API setLoadBankCallback(FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK callback);
FMOD_RESULT F_API setCreateInstanceCallback(FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK callback);
FMOD_RESULT F_API getUserData(void **userdata) const;
FMOD_RESULT F_API setUserData(void *userdata);
};
} // namespace Studio
} // namespace FMOD
#endif //FMOD_STUDIO_HPP

View File

@@ -0,0 +1,336 @@
/* ======================================================================================== */
/* FMOD Studio API - Common C/C++ header file. */
/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2023. */
/* */
/* This header defines common enumerations, structs and callbacks that are shared between */
/* the C and C++ interfaces. */
/* */
/* For more detail visit: */
/* https://fmod.com/docs/2.02/api/studio-api.html */
/* ======================================================================================== */
#ifndef FMOD_STUDIO_COMMON_H
#define FMOD_STUDIO_COMMON_H
#include "fmod.h"
/*
FMOD Studio types.
*/
typedef struct FMOD_STUDIO_SYSTEM FMOD_STUDIO_SYSTEM;
typedef struct FMOD_STUDIO_EVENTDESCRIPTION FMOD_STUDIO_EVENTDESCRIPTION;
typedef struct FMOD_STUDIO_EVENTINSTANCE FMOD_STUDIO_EVENTINSTANCE;
typedef struct FMOD_STUDIO_BUS FMOD_STUDIO_BUS;
typedef struct FMOD_STUDIO_VCA FMOD_STUDIO_VCA;
typedef struct FMOD_STUDIO_BANK FMOD_STUDIO_BANK;
typedef struct FMOD_STUDIO_COMMANDREPLAY FMOD_STUDIO_COMMANDREPLAY;
/*
FMOD Studio constants
*/
#define FMOD_STUDIO_LOAD_MEMORY_ALIGNMENT 32
typedef unsigned int FMOD_STUDIO_INITFLAGS;
#define FMOD_STUDIO_INIT_NORMAL 0x00000000
#define FMOD_STUDIO_INIT_LIVEUPDATE 0x00000001
#define FMOD_STUDIO_INIT_ALLOW_MISSING_PLUGINS 0x00000002
#define FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE 0x00000004
#define FMOD_STUDIO_INIT_DEFERRED_CALLBACKS 0x00000008
#define FMOD_STUDIO_INIT_LOAD_FROM_UPDATE 0x00000010
#define FMOD_STUDIO_INIT_MEMORY_TRACKING 0x00000020
typedef unsigned int FMOD_STUDIO_PARAMETER_FLAGS;
#define FMOD_STUDIO_PARAMETER_READONLY 0x00000001
#define FMOD_STUDIO_PARAMETER_AUTOMATIC 0x00000002
#define FMOD_STUDIO_PARAMETER_GLOBAL 0x00000004
#define FMOD_STUDIO_PARAMETER_DISCRETE 0x00000008
#define FMOD_STUDIO_PARAMETER_LABELED 0x00000010
typedef unsigned int FMOD_STUDIO_SYSTEM_CALLBACK_TYPE;
#define FMOD_STUDIO_SYSTEM_CALLBACK_PREUPDATE 0x00000001
#define FMOD_STUDIO_SYSTEM_CALLBACK_POSTUPDATE 0x00000002
#define FMOD_STUDIO_SYSTEM_CALLBACK_BANK_UNLOAD 0x00000004
#define FMOD_STUDIO_SYSTEM_CALLBACK_LIVEUPDATE_CONNECTED 0x00000008
#define FMOD_STUDIO_SYSTEM_CALLBACK_LIVEUPDATE_DISCONNECTED 0x00000010
#define FMOD_STUDIO_SYSTEM_CALLBACK_ALL 0xFFFFFFFF
typedef unsigned int FMOD_STUDIO_EVENT_CALLBACK_TYPE;
#define FMOD_STUDIO_EVENT_CALLBACK_CREATED 0x00000001
#define FMOD_STUDIO_EVENT_CALLBACK_DESTROYED 0x00000002
#define FMOD_STUDIO_EVENT_CALLBACK_STARTING 0x00000004
#define FMOD_STUDIO_EVENT_CALLBACK_STARTED 0x00000008
#define FMOD_STUDIO_EVENT_CALLBACK_RESTARTED 0x00000010
#define FMOD_STUDIO_EVENT_CALLBACK_STOPPED 0x00000020
#define FMOD_STUDIO_EVENT_CALLBACK_START_FAILED 0x00000040
#define FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND 0x00000080
#define FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND 0x00000100
#define FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_CREATED 0x00000200
#define FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_DESTROYED 0x00000400
#define FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_MARKER 0x00000800
#define FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_BEAT 0x00001000
#define FMOD_STUDIO_EVENT_CALLBACK_SOUND_PLAYED 0x00002000
#define FMOD_STUDIO_EVENT_CALLBACK_SOUND_STOPPED 0x00004000
#define FMOD_STUDIO_EVENT_CALLBACK_REAL_TO_VIRTUAL 0x00008000
#define FMOD_STUDIO_EVENT_CALLBACK_VIRTUAL_TO_REAL 0x00010000
#define FMOD_STUDIO_EVENT_CALLBACK_START_EVENT_COMMAND 0x00020000
#define FMOD_STUDIO_EVENT_CALLBACK_NESTED_TIMELINE_BEAT 0x00040000
#define FMOD_STUDIO_EVENT_CALLBACK_ALL 0xFFFFFFFF
typedef unsigned int FMOD_STUDIO_LOAD_BANK_FLAGS;
#define FMOD_STUDIO_LOAD_BANK_NORMAL 0x00000000
#define FMOD_STUDIO_LOAD_BANK_NONBLOCKING 0x00000001
#define FMOD_STUDIO_LOAD_BANK_DECOMPRESS_SAMPLES 0x00000002
#define FMOD_STUDIO_LOAD_BANK_UNENCRYPTED 0x00000004
typedef unsigned int FMOD_STUDIO_COMMANDCAPTURE_FLAGS;
#define FMOD_STUDIO_COMMANDCAPTURE_NORMAL 0x00000000
#define FMOD_STUDIO_COMMANDCAPTURE_FILEFLUSH 0x00000001
#define FMOD_STUDIO_COMMANDCAPTURE_SKIP_INITIAL_STATE 0x00000002
typedef unsigned int FMOD_STUDIO_COMMANDREPLAY_FLAGS;
#define FMOD_STUDIO_COMMANDREPLAY_NORMAL 0x00000000
#define FMOD_STUDIO_COMMANDREPLAY_SKIP_CLEANUP 0x00000001
#define FMOD_STUDIO_COMMANDREPLAY_FAST_FORWARD 0x00000002
#define FMOD_STUDIO_COMMANDREPLAY_SKIP_BANK_LOAD 0x00000004
typedef enum FMOD_STUDIO_LOADING_STATE
{
FMOD_STUDIO_LOADING_STATE_UNLOADING,
FMOD_STUDIO_LOADING_STATE_UNLOADED,
FMOD_STUDIO_LOADING_STATE_LOADING,
FMOD_STUDIO_LOADING_STATE_LOADED,
FMOD_STUDIO_LOADING_STATE_ERROR,
FMOD_STUDIO_LOADING_STATE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */
} FMOD_STUDIO_LOADING_STATE;
typedef enum FMOD_STUDIO_LOAD_MEMORY_MODE
{
FMOD_STUDIO_LOAD_MEMORY,
FMOD_STUDIO_LOAD_MEMORY_POINT,
FMOD_STUDIO_LOAD_MEMORY_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */
} FMOD_STUDIO_LOAD_MEMORY_MODE;
typedef enum FMOD_STUDIO_PARAMETER_TYPE
{
FMOD_STUDIO_PARAMETER_GAME_CONTROLLED,
FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE,
FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_CONE_ANGLE,
FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_ORIENTATION,
FMOD_STUDIO_PARAMETER_AUTOMATIC_DIRECTION,
FMOD_STUDIO_PARAMETER_AUTOMATIC_ELEVATION,
FMOD_STUDIO_PARAMETER_AUTOMATIC_LISTENER_ORIENTATION,
FMOD_STUDIO_PARAMETER_AUTOMATIC_SPEED,
FMOD_STUDIO_PARAMETER_AUTOMATIC_SPEED_ABSOLUTE,
FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE_NORMALIZED,
FMOD_STUDIO_PARAMETER_MAX,
FMOD_STUDIO_PARAMETER_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */
} FMOD_STUDIO_PARAMETER_TYPE;
typedef enum FMOD_STUDIO_USER_PROPERTY_TYPE
{
FMOD_STUDIO_USER_PROPERTY_TYPE_INTEGER,
FMOD_STUDIO_USER_PROPERTY_TYPE_BOOLEAN,
FMOD_STUDIO_USER_PROPERTY_TYPE_FLOAT,
FMOD_STUDIO_USER_PROPERTY_TYPE_STRING,
FMOD_STUDIO_USER_PROPERTY_TYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */
} FMOD_STUDIO_USER_PROPERTY_TYPE;
typedef enum FMOD_STUDIO_EVENT_PROPERTY
{
FMOD_STUDIO_EVENT_PROPERTY_CHANNELPRIORITY,
FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_DELAY,
FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_LOOKAHEAD,
FMOD_STUDIO_EVENT_PROPERTY_MINIMUM_DISTANCE,
FMOD_STUDIO_EVENT_PROPERTY_MAXIMUM_DISTANCE,
FMOD_STUDIO_EVENT_PROPERTY_COOLDOWN,
FMOD_STUDIO_EVENT_PROPERTY_MAX,
FMOD_STUDIO_EVENT_PROPERTY_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */
} FMOD_STUDIO_EVENT_PROPERTY;
typedef enum FMOD_STUDIO_PLAYBACK_STATE
{
FMOD_STUDIO_PLAYBACK_PLAYING,
FMOD_STUDIO_PLAYBACK_SUSTAINING,
FMOD_STUDIO_PLAYBACK_STOPPED,
FMOD_STUDIO_PLAYBACK_STARTING,
FMOD_STUDIO_PLAYBACK_STOPPING,
FMOD_STUDIO_PLAYBACK_FORCEINT = 65536
} FMOD_STUDIO_PLAYBACK_STATE;
typedef enum FMOD_STUDIO_STOP_MODE
{
FMOD_STUDIO_STOP_ALLOWFADEOUT,
FMOD_STUDIO_STOP_IMMEDIATE,
FMOD_STUDIO_STOP_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */
} FMOD_STUDIO_STOP_MODE;
typedef enum FMOD_STUDIO_INSTANCETYPE
{
FMOD_STUDIO_INSTANCETYPE_NONE,
FMOD_STUDIO_INSTANCETYPE_SYSTEM,
FMOD_STUDIO_INSTANCETYPE_EVENTDESCRIPTION,
FMOD_STUDIO_INSTANCETYPE_EVENTINSTANCE,
FMOD_STUDIO_INSTANCETYPE_PARAMETERINSTANCE,
FMOD_STUDIO_INSTANCETYPE_BUS,
FMOD_STUDIO_INSTANCETYPE_VCA,
FMOD_STUDIO_INSTANCETYPE_BANK,
FMOD_STUDIO_INSTANCETYPE_COMMANDREPLAY,
FMOD_STUDIO_INSTANCETYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */
} FMOD_STUDIO_INSTANCETYPE;
/*
FMOD Studio structures
*/
typedef struct FMOD_STUDIO_BANK_INFO
{
int size;
void *userdata;
int userdatalength;
FMOD_FILE_OPEN_CALLBACK opencallback;
FMOD_FILE_CLOSE_CALLBACK closecallback;
FMOD_FILE_READ_CALLBACK readcallback;
FMOD_FILE_SEEK_CALLBACK seekcallback;
} FMOD_STUDIO_BANK_INFO;
typedef struct FMOD_STUDIO_PARAMETER_ID
{
unsigned int data1;
unsigned int data2;
} FMOD_STUDIO_PARAMETER_ID;
typedef struct FMOD_STUDIO_PARAMETER_DESCRIPTION
{
const char *name;
FMOD_STUDIO_PARAMETER_ID id;
float minimum;
float maximum;
float defaultvalue;
FMOD_STUDIO_PARAMETER_TYPE type;
FMOD_STUDIO_PARAMETER_FLAGS flags;
FMOD_GUID guid;
} FMOD_STUDIO_PARAMETER_DESCRIPTION;
typedef struct FMOD_STUDIO_USER_PROPERTY
{
const char *name;
FMOD_STUDIO_USER_PROPERTY_TYPE type;
union
{
int intvalue;
FMOD_BOOL boolvalue;
float floatvalue;
const char *stringvalue;
};
} FMOD_STUDIO_USER_PROPERTY;
typedef struct FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES
{
const char *name;
FMOD_SOUND *sound;
int subsoundIndex;
} FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES;
typedef struct FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES
{
const char *name;
FMOD_DSP *dsp;
} FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES;
typedef struct FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES
{
const char *name;
int position;
} FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES;
typedef struct FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES
{
int bar;
int beat;
int position;
float tempo;
int timesignatureupper;
int timesignaturelower;
} FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES;
typedef struct FMOD_STUDIO_TIMELINE_NESTED_BEAT_PROPERTIES
{
FMOD_GUID eventid;
FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES properties;
} FMOD_STUDIO_TIMELINE_NESTED_BEAT_PROPERTIES;
typedef struct FMOD_STUDIO_ADVANCEDSETTINGS
{
int cbsize;
unsigned int commandqueuesize;
unsigned int handleinitialsize;
int studioupdateperiod;
int idlesampledatapoolsize;
unsigned int streamingscheduledelay;
const char* encryptionkey;
} FMOD_STUDIO_ADVANCEDSETTINGS;
typedef struct FMOD_STUDIO_CPU_USAGE
{
float update;
} FMOD_STUDIO_CPU_USAGE;
typedef struct FMOD_STUDIO_BUFFER_INFO
{
int currentusage;
int peakusage;
int capacity;
int stallcount;
float stalltime;
} FMOD_STUDIO_BUFFER_INFO;
typedef struct FMOD_STUDIO_BUFFER_USAGE
{
FMOD_STUDIO_BUFFER_INFO studiocommandqueue;
FMOD_STUDIO_BUFFER_INFO studiohandle;
} FMOD_STUDIO_BUFFER_USAGE;
typedef struct FMOD_STUDIO_SOUND_INFO
{
const char *name_or_data;
FMOD_MODE mode;
FMOD_CREATESOUNDEXINFO exinfo;
int subsoundindex;
} FMOD_STUDIO_SOUND_INFO;
typedef struct FMOD_STUDIO_COMMAND_INFO
{
const char *commandname;
int parentcommandindex;
int framenumber;
float frametime;
FMOD_STUDIO_INSTANCETYPE instancetype;
FMOD_STUDIO_INSTANCETYPE outputtype;
unsigned int instancehandle;
unsigned int outputhandle;
} FMOD_STUDIO_COMMAND_INFO;
typedef struct FMOD_STUDIO_MEMORY_USAGE
{
int exclusive;
int inclusive;
int sampledata;
} FMOD_STUDIO_MEMORY_USAGE;
/*
FMOD Studio callbacks.
*/
typedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_SYSTEM_CALLBACK) (FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_SYSTEM_CALLBACK_TYPE type, void *commanddata, void *userdata);
typedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_EVENT_CALLBACK) (FMOD_STUDIO_EVENT_CALLBACK_TYPE type, FMOD_STUDIO_EVENTINSTANCE *event, void *parameters);
typedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK) (FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex, float currenttime, void *userdata);
typedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK) (FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex, const FMOD_GUID *bankguid, const char *bankfilename, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank, void *userdata);
typedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK) (FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex, FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_EVENTINSTANCE **instance, void *userdata);
#endif // FMOD_STUDIO_COMMON_H

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

3553
modules/fmod/module.jai Normal file

File diff suppressed because it is too large Load Diff

10
modules/ufbx/.gitattributes vendored Normal file
View File

@@ -0,0 +1,10 @@
* text=auto
# Treat all .fbx/.obj/.mtl files (even ASCII) as binary
*.fbx binary
*.obj binary
*.mtl binary
*.png binary
*.mcx binary
*.mc binary

19
modules/ufbx/.github/codecov.yml vendored Normal file
View File

@@ -0,0 +1,19 @@
coverage:
status:
project:
default:
informational: true
patch:
default:
informational: true
parsers:
gcov:
branch_detection:
conditional: yes
loop: yes
method: yes
macro: yes
ignore:
- "test"
comment:
layout: "diff"

500
modules/ufbx/.github/workflows/ci.yml vendored Normal file
View File

@@ -0,0 +1,500 @@
name: CI
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
# Cancel any in-flight jobs for the same PR/branch so there's only one active
# at a time
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
ci_pre_hashes:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 2
- name: Compile hash_scene
run: |
mkdir build
clang test/hash_scene.c misc/fdlibm.c -O2 -o build/hash_scene
- name: Generate reference hashes
run: |
python3 misc/generate_hashses.py --exe build/hash_scene -o build/hashes.txt --verbose
- name: Upload reference hashes
uses: actions/upload-artifact@v3
with:
name: reference-hashes
path: build/hashes.txt
ci_ubuntu:
runs-on: ubuntu-20.04
needs: ci_pre_hashes
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 2
- name: Update apt
run: sudo apt-get update
- name: Install apt dependencies
run: sudo apt-get install -y gcc-multilib g++-multilib lcov llvm-11
- name: Download reference hashes
uses: actions/download-artifact@v3
with:
name: reference-hashes
path: build
- name: Run tests
run: python3 misc/run_tests.py tests stack readme threadcheck hashes --runner ci_linux
- name: Verbose test info
run: build/runner_clang_release_x64/runner -d data -v
- name: Generate coverage
run: LLVM_COV=llvm-cov-11 bash misc/generate_coverage.sh
- name: Upload coverage
run: bash <(curl -s https://codecov.io/bash) -f coverage.lcov -y .github/codecov.yml
- name: Compress hashdumps
if: ${{ always() && !cancelled() }}
run: python3 misc/hash_diff.py compress build/hashdumps -o build/hashdump_ci_linux.txt.gz
- name: Upload hashdumps
uses: actions/upload-artifact@v3
if: ${{ always() && !cancelled() }}
with:
name: hash-dumps
path: build/hashdump_ci_linux.txt.gz
ci_windows:
runs-on: windows-2019
needs: ci_pre_hashes
steps:
- uses: actions/checkout@v3
- name: Download reference hashes
uses: actions/download-artifact@v3
with:
name: reference-hashes
path: build
- run: type build\hashes.txt
- name: Run tests
run: python misc/run_tests.py tests stack readme threadcheck hashes --runner ci_windows
- name: Verbose test info
run: build\runner_vs_cl64_release_x64\runner.exe -d data -v
- name: Compress hashdumps
if: ${{ always() && !cancelled() }}
run: python3 misc/hash_diff.py compress build/hashdumps -o build/hashdump_ci_windows.txt.gz
- name: Upload hashdumps
uses: actions/upload-artifact@v3
if: ${{ always() && !cancelled() }}
with:
name: hash-dumps
path: build/hashdump_ci_windows.txt.gz
ci_macos:
runs-on: macos-11
needs: ci_pre_hashes
steps:
- uses: actions/checkout@v3
- name: Download reference hashes
uses: actions/download-artifact@v3
with:
name: reference-hashes
path: build
- name: Run tests
run: python3 misc/run_tests.py tests stack readme threadcheck hashes --remove-compiler gcc --additional-compiler gcc-11 --remove-arch x86 --runner ci_macos
- name: Compile ufbx as Objective C
run: clang -Wall -Wextra -Werror -ObjC -c ufbx.c -o build/ufbx-objc.o
- name: Compress hashdumps
if: ${{ always() && !cancelled() }}
run: python3 misc/hash_diff.py compress build/hashdumps -o build/hashdump_ci_macos.txt.gz
- name: Upload hashdumps
uses: actions/upload-artifact@v3
if: ${{ always() && !cancelled() }}
with:
name: hash-dumps
path: build/hashdump_ci_macos.txt.gz
ci_picort:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run picort
run: python misc/run_tests.py picort
- name: Upload result images
env:
BUNNY_API_TOKEN: ${{ secrets.BUNNY_API_TOKEN }}
if: ${{ always() && !cancelled() }}
continue-on-error: true
run: |
HASH="$(git rev-parse --short=16 HEAD)"
URL="https://storage.bunnycdn.com/ufbx-images/$HASH"
DST_URL="https://ufbx-images.b-cdn.net/$HASH"
curl -sS -w " -> $DST_URL/barbarian.png \n" --request PUT --header "AccessKey: $BUNNY_API_TOKEN" --header "Content-Type: image/png" --url $URL/barbarian.png --data-binary @build/images/barbarian.png
curl -sS -w " -> $DST_URL/barbarian-scalar.png \n" --request PUT --header "AccessKey: $BUNNY_API_TOKEN" --header "Content-Type: image/png" --url $URL/barbarian-scalar.png --data-binary @build/images/barbarian-scalar.png
curl -sS -w " -> $DST_URL/barbarian-big.png \n" --request PUT --header "AccessKey: $BUNNY_API_TOKEN" --header "Content-Type: image/png" --url $URL/barbarian-big.png --data-binary @build/images/barbarian-big.png
curl -sS -w " -> $DST_URL/slime-binary.png \n" --request PUT --header "AccessKey: $BUNNY_API_TOKEN" --header "Content-Type: image/png" --url $URL/slime-binary.png --data-binary @build/images/slime-binary.png
curl -sS -w " -> $DST_URL/slime-ascii.png \n" --request PUT --header "AccessKey: $BUNNY_API_TOKEN" --header "Content-Type: image/png" --url $URL/slime-ascii.png --data-binary @build/images/slime-ascii.png
curl -sS -w " -> $DST_URL/slime-big.png \n" --request PUT --header "AccessKey: $BUNNY_API_TOKEN" --header "Content-Type: image/png" --url $URL/slime-big.png --data-binary @build/images/slime-big.png
ci_domfuzz:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run domfuzz/objfuzz
run: python misc/run_tests.py domfuzz objfuzz
ci_viewer:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run viewer
run: python misc/run_tests.py viewer
ci_features:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Compile feature permutations
run: python misc/run_tests.py features
ci_analysis:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Update apt
run: sudo apt-get update
- name: Install apt dependencies
run: sudo apt-get install -y cppcheck
- name: Install PIP dependencies
run: sudo pip3 install pcpp pycparser
- name: Prepare directories
run: mkdir build
- name: cppcheck
run: cppcheck --error-exitcode=1 --inline-suppr --std=c99 ufbx.c -DUFBX_STATIC_ANALYSIS=1
- name: Clang Analyzer
if: ${{ always() && !cancelled() }}
run: clang --analyze -Xanalyzer -analyzer-werror -Xanalyzer -analyzer-disable-checker=unix.Malloc ufbx.c
- name: Get Clang debug stack usage
if: ${{ always() && !cancelled() }}
run: clang -fstack-usage -DUFBX_DEV -DUFBX_STANDARD_C -c ufbx.c -o build/ufbx-clang-debug.o
- name: Get Clang release stack usage
if: ${{ always() && !cancelled() }}
run: clang -fstack-usage -DUFBX_DEV -O2 -c ufbx.c -o build/ufbx-clang-release.o
- name: Get GCC debug stack usage
if: ${{ always() && !cancelled() }}
run: gcc -fstack-usage -DUFBX_DEV -DUFBX_STANDARD_C -c ufbx.c -o build/ufbx-gcc-debug.o
- name: Get GCC release stack usage
if: ${{ always() && !cancelled() }}
run: gcc -fstack-usage -DUFBX_DEV -O2 -c ufbx.c -o build/ufbx-gcc-release.o
- name: Parse ufbx.c to AST for analysis
if: ${{ always() && !cancelled() }}
run: python3 misc/analyze_stack.py --no-su --cache build/ufbx-cache.pickle
- name: Analyze Clang debug stack
if: ${{ always() && !cancelled() }}
run: python3 misc/analyze_stack.py build/ufbx-clang-debug.su --limit 0x20000 --cache build/ufbx-cache.pickle
- name: Analyze Clang release stack
if: ${{ always() && !cancelled() }}
run: python3 misc/analyze_stack.py build/ufbx-clang-release.su --limit 0x10000 --cache build/ufbx-cache.pickle
- name: Analyze GCC debug stack
if: ${{ always() && !cancelled() }}
run: python3 misc/analyze_stack.py build/ufbx-gcc-debug.su --limit 0x20000 --cache build/ufbx-cache.pickle
- name: Analyze GCC release stack
if: ${{ always() && !cancelled() }}
run: python3 misc/analyze_stack.py build/ufbx-gcc-release.su --limit 0x10000 --cache build/ufbx-cache.pickle
ci_compat:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Update apt
run: sudo apt-get update
- name: Install apt dependencies
run: sudo apt-get install -y gcc-multilib g++-multilib
- name: Copy the current ufbx.h to ufbx_new.h
run: cp ufbx.h ufbx_new.h
- name: Downgrade to oldest compatible header
run: bash misc/downgrade_header.sh
- name: Run tests with old header (source compatability)
run: python3 misc/run_tests.py tests --no-sanitize --runner ci_compat
- name: Run tests with new header in ufbx.c, old header in runner.c (ABI compatability)
run: python3 misc/run_tests.py tests --no-sanitize-arch x86 --runner ci_compat --define UFBX_HEADER_PATH=\"ufbx_new.h\"
ci_lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Check formatting
if: ${{ always() && !cancelled() }}
run: python3 misc/check_formatting.py ufbx.c ufbx.h
- name: Check for typos
if: ${{ always() && !cancelled() }}
uses: crate-ci/typos@master
with:
files: ufbx.h ufbx.c
config: ./misc/typos.toml
ci_bindgen:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Create bindgen/build directory
run: mkdir bindgen/build
- name: Parse ufbx.h
run: python3 bindgen/ufbx_parser.py
- name: Generate typed IR
run: python3 bindgen/ufbx_ir.py
ci_exotic:
runs-on: ubuntu-latest
needs: ci_pre_hashes
steps:
- uses: actions/checkout@v3
- name: Download reference hashes
uses: actions/download-artifact@v3
with:
name: reference-hashes
path: build
- name: Update apt
run: sudo apt-get update
- name: Install apt dependencies
run: sudo apt-get install -y tcc qemu qemu-user gcc-multilib
- name: Install zig cc via PIP
run: sudo pip3 install ziglang
- name: Run tests with TCC
run: python3 misc/run_tests.py tests hashes --additional-compiler tcc --compiler tcc --remove-arch x86 --runner ci_exotic
- name: Compile ufbx.c wth x86 TCC
run: i386-tcc -Wall -Werror -c ufbx.c -o build/tcc-ufbx-x86.o
- name: Compile PowerPC tests
run: python3 -m ziglang cc -fno-sanitize=undefined -target powerpc-linux -DUFBX_DEV ufbx.c test/runner.c -g -o build/ppc-runner
- name: Run PowerPC tests
run: qemu-ppc build/ppc-runner -d data
- name: Compile PowerPC hash_scene
run: |
python3 -m ziglang cc -fno-sanitize=undefined -ffp-contract=off -target powerpc-linux misc/fdlibm.c test/hash_scene.c -g -o build/ppc_hasher_debug
python3 -m ziglang cc -fno-sanitize=undefined -ffp-contract=off -O2 -target powerpc-linux misc/fdlibm.c test/hash_scene.c -g -o build/ppc_hasher_release
- name: Check PowerPC hashes
run: |
qemu-ppc build/ppc_hasher_debug --check build/hashes.txt --dump build/hashdumps/ci_exotic_powerpc_debug.txt --max-dump-errors 3
qemu-ppc build/ppc_hasher_release --check build/hashes.txt --dump build/hashdumps/ci_exotic_powerpc_release.txt --max-dump-errors 3
- name: Compile runner with fdlibm
run: clang -DUFBX_NO_MATH_H -DUFBX_MATH_PREFIX=fdlibm_ ufbx.c test/runner.c misc/fdlibm.c -lm -o build/fdlibm_runner
- name: Run tests using fdlibm
run: build/fdlibm_runner -d data
- name: Compile runner.c
run: gcc -c test/runner.c -o build/runner.o
- name: Build and run standard C99
run: |
gcc -Wall -Wextra -Werror -Wno-unused-function -std=c99 -DUFBX_STANDARD_C build/runner.o ufbx.c -lm -o build/runner-c99
build/runner-c99 -d data --allow-non-thread-safe
- name: Build and run standard C11
run: |
gcc -Wall -Wextra -Werror -Wno-unused-function -std=c11 -DUFBX_STANDARD_C build/runner.o ufbx.c -lm -o build/runner-c11
build/runner-c11 -d data
- name: Build and run standard C++98
run: |
g++ -Wall -Wextra -Werror -Wno-unused-function -std=c++98 -DUFBX_STANDARD_C build/runner.o -x c++ ufbx.c -lm -o build/runner-cpp98
build/runner-cpp98 -d data --allow-non-thread-safe
- name: Build and run standard C++11
run: |
g++ -Wall -Wextra -Werror -Wno-unused-function -std=c++11 -DUFBX_STANDARD_C build/runner.o -x c++ ufbx.c -lm -o build/runner-cpp11
build/runner-cpp11 -d data
- name: Build and run threadcheck (standard C11)
run: |
gcc -Wall -Wextra -Werror -Wno-unused-function -std=c11 -DUFBX_STANDARD_C -c ufbx.c -o build/ufbx-c11.o
g++ -Wall -Wextra -Werror -Wno-unused-function -pthread -std=c++11 build/ufbx-c11.o test/threadcheck.cpp -lm -o build/threadcheck-c11
build/threadcheck-c11 data/maya_cube_7500_binary.fbx 2
- name: Build and run threadcheck (standard C++11)
run: |
g++ -Wall -Wextra -Werror -Wno-unused-function -pthread -std=c++11 -DUFBX_STANDARD_C -x c++ ufbx.c test/threadcheck.cpp -lm -o build/threadcheck-cpp11
build/threadcheck-cpp11 data/maya_cube_7500_binary.fbx 2
- name: Compress hashdumps
if: ${{ always() && !cancelled() }}
run: python3 misc/hash_diff.py compress build/hashdumps -o build/hashdump_ci_exotic.txt.gz
- name: Upload hashdumps
uses: actions/upload-artifact@v3
if: ${{ always() && !cancelled() }}
with:
name: hash-dumps
path: build/hashdump_ci_exotic.txt.gz
ci_hasher:
runs-on: ubuntu-latest
needs: ci_pre_hashes
steps:
- uses: actions/checkout@v3
- name: Prepare directories
run: |
mkdir build
mkdir build/hashdumps
- name: Download reference hashes
uses: actions/download-artifact@v3
with:
name: reference-hashes
path: build
- name: Compile and run hash_scene with various configurations
run: |
clang test/hash_scene.c misc/fdlibm.c -O2 -o build/hash_scene
build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_x64_release.txt --max-dump-errors 3
build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_unbuffered_x64_release.txt --max-dump-errors 3 --no-read-buffer
build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_dedicated_x64_release.txt --max-dump-errors 3 --dedicated-allocs
build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_linear_x64_release.txt --max-dump-errors 3 --dedicated-allocs --allocator linear
build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_linear_reverse_x64_release.txt --max-dump-errors 3 --dedicated-allocs --allocator linear-reverse
clang -DUFBX_DEV -DUFBX_REGRESSION test/hash_scene.c misc/fdlibm.c -O2 -o build/hash_scene
build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_regression_x64_release.txt --max-dump-errors 3
build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_regression_unbuffered_x64_release.txt --max-dump-errors 3 --no-read-buffer
build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_regression_dedicated_x64_release.txt --max-dump-errors 3 --dedicated-allocs
build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_regression_linear_x64_release.txt --max-dump-errors 3 --dedicated-allocs --allocator linear
build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_regression_linear_reverse_x64_release.txt --max-dump-errors 3 --dedicated-allocs --allocator linear-reverse
clang -fshort-enums -fshort-wchar test/hash_scene.c misc/fdlibm.c -O2 -o build/hash_scene
build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_short_x64_release.txt --max-dump-errors 3
clang -fsigned-char test/hash_scene.c misc/fdlibm.c -O2 -o build/hash_scene
build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_schar_x64_release.txt --max-dump-errors 3
clang -funsigned-char test/hash_scene.c misc/fdlibm.c -O2 -o build/hash_scene
build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_uchar_x64_release.txt --max-dump-errors 3
clang -DUFBX_STANDARD_C -DUFBX_DEV -DUFBX_REGRESSION test/hash_scene.c misc/fdlibm.c -O2 -o build/hash_scene
build/hash_scene --check build/hashes.txt --dump build/hashdumps/ci_hasher_stdc_x64_release.txt --max-dump-errors 3
- name: Compress hashdumps
if: ${{ always() && !cancelled() }}
run: python3 misc/hash_diff.py compress build/hashdumps -o build/hashdump_ci_hasher.txt.gz
- name: Upload hashdumps
uses: actions/upload-artifact@v3
if: ${{ always() && !cancelled() }}
with:
name: hash-dumps
path: build/hashdump_ci_hasher.txt.gz
ci_wasm:
runs-on: ubuntu-latest
needs: ci_pre_hashes
steps:
- uses: actions/checkout@v3
- name: Install wasi-sdk
run: |
mkdir build
export WASI_VERSION=17
export WASI_VERSION_FULL=${WASI_VERSION}.0
curl -L https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${WASI_VERSION}/wasi-sdk-${WASI_VERSION_FULL}-linux.tar.gz -o build/wasi-sdk.tar.gz
tar xzf build/wasi-sdk.tar.gz -C build
mv build/wasi-sdk-${WASI_VERSION_FULL} build/wasi-sdk
- name: Install wasmtime
run: |
curl https://wasmtime.dev/install.sh -sSf > wasmtime-install.sh
bash wasmtime-install.sh --version v4.0.0
echo "$HOME/.wasmtime/bin" >> $GITHUB_PATH
- name: Test wasmtime
run: wasmtime --version
- name: Download reference hashes
uses: actions/download-artifact@v3
with:
name: reference-hashes
path: build
- name: Run tests
run: python3 misc/run_tests.py tests hashes --wasi-sdk build/wasi-sdk --compiler wasi_clang --runner ci_wasm
- name: Compress hashdumps
if: ${{ always() && !cancelled() }}
run: python3 misc/hash_diff.py compress build/hashdumps -o build/hashdump_ci_wasm.txt.gz
- name: Upload hashdumps
uses: actions/upload-artifact@v3
if: ${{ always() && !cancelled() }}
with:
name: hash-dumps
path: build/hashdump_ci_wasm.txt.gz
ci_arm32:
runs-on: [self-hosted, ARM]
needs: ci_pre_hashes
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 2
- name: Download reference hashes
uses: actions/download-artifact@v3
with:
name: reference-hashes
path: build
- name: Run tests
run: python3 misc/run_tests.py tests stack hashes --no-sanitize --threads 2 --runner ci_arm64
- name: Compress hashdumps
if: ${{ always() && !cancelled() }}
run: python3 misc/hash_diff.py compress build/hashdumps -o build/hashdump_ci_arm32.txt.gz
- name: Upload hashdumps
uses: actions/upload-artifact@v3
if: ${{ always() && !cancelled() }}
with:
name: hash-dumps
path: build/hashdump_ci_arm32.txt.gz
ci_arm64:
runs-on: [self-hosted, ARM64]
needs: ci_pre_hashes
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 2
- name: Download reference hashes
uses: actions/download-artifact@v3
with:
name: reference-hashes
path: build
- name: Run tests
run: python3 misc/run_tests.py tests stack hashes --no-sanitize --threads 2 --runner ci_arm64
- name: Compress hashdumps
if: ${{ always() && !cancelled() }}
run: python3 misc/hash_diff.py compress build/hashdumps -o build/hashdump_ci_arm64.txt.gz
- name: Upload hashdumps
uses: actions/upload-artifact@v3
if: ${{ always() && !cancelled() }}
with:
name: hash-dumps
path: build/hashdump_ci_arm64.txt.gz
ci_dataset:
runs-on: [self-hosted, ARM64]
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 2
- name: Create build directory
run: mkdir build
- name: Compile check_fbx.c
run: clang -O2 test/check_fbx.c -lm -o build/check_fbx
- name: Run dataset tests
run: python3 misc/check_dataset.py --exe build/check_fbx --root /mnt/fbx-files --host-url https://ufbx-dataset.b-cdn.net
ci_post_hashes:
runs-on: ubuntu-latest
if: ${{ always() }}
needs: [ci_ubuntu, ci_windows, ci_macos, ci_wasm, ci_arm32, ci_arm64, ci_exotic, ci_hasher]
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 2
- name: Compile hash_scene
run: |
mkdir build
clang test/hash_scene.c misc/fdlibm.c -O2 -o build/hash_scene
- name: Download combined hashdumps
uses: actions/download-artifact@v3
with:
name: hash-dumps
path: build/ci-hashdumps
- name: List files to dump
run: python3 misc/hash_diff.py list build/ci-hashdumps -o build/dumped-files.txt
- name: Dump reference hashes
run: |
mkdir build/ref-hashdumps
build/hash_scene --check build/dumped-files.txt --dump build/ref-hashdumps/reference_linux_x64_release.txt --dump-all
- name: Compress reference hashdumps
run: python3 misc/hash_diff.py compress build/ref-hashdumps -o build/hashdump_ci_reference.txt.gz
- name: Diff CI and reference dumps
run: python3 misc/hash_diff.py diff build/ci-hashdumps --ref build/hashdump_ci_reference.txt.gz
- name: Upload reference hashdumps
uses: actions/upload-artifact@v3
if: ${{ always() && !cancelled() }}
with:
name: hash-dumps
path: build/hashdump_ci_reference.txt.gz

19
modules/ufbx/.gitignore vendored Normal file
View File

@@ -0,0 +1,19 @@
# Project files
proj/
# Build output
build/
# Python cache files
__pycache__/
# Editor files
.vscode/
# Coverage files
*.lcov
*.gcov
*.gcda
*.gcno

39
modules/ufbx/LICENSE Normal file
View File

@@ -0,0 +1,39 @@
------------------------------------------------------------------------------
This software is available under 2 licenses -- choose whichever you prefer.
------------------------------------------------------------------------------
ALTERNATIVE A - MIT License
Copyright (c) 2020 Samuli Raivio
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
------------------------------------------------------------------------------
ALTERNATIVE B - Public Domain (www.unlicense.org)
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
software, either in source code form or as a compiled binary, for any purpose,
commercial or non-commercial, and by any means.
In jurisdictions that recognize copyright laws, the author or authors of this
software dedicate any and all copyright interest in the software to the public
domain. We make this dedication for the benefit of the public at large and to
the detriment of our heirs and successors. We intend this dedication to be an
overt act of relinquishment in perpetuity of all present and future rights to
this software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
----------------------------------------

145
modules/ufbx/README.md Normal file
View File

@@ -0,0 +1,145 @@
# ufbx [![CI](https://github.com/bqqbarbhg/ufbx/actions/workflows/ci.yml/badge.svg)](https://github.com/bqqbarbhg/ufbx/actions/workflows/ci.yml) [![codecov](https://codecov.io/gh/bqqbarbhg/ufbx/branch/master/graph/badge.svg)](https://codecov.io/gh/bqqbarbhg/ufbx)
Single source file FBX file loader.
```cpp
ufbx_load_opts opts = { 0 }; // Optional, pass NULL for defaults
ufbx_error error; // Optional, pass NULL if you don't care about errors
ufbx_scene *scene = ufbx_load_file("thing.fbx", &opts, &error);
if (!scene) {
fprintf(stderr, "Failed to load: %s\n", error.description.data);
exit(1);
}
// Use and inspect `scene`, it's just plain data!
// Let's just list all objects within the scene for example:
for (size_t i = 0; i < scene->nodes.count; i++) {
ufbx_node *node = scene->nodes.data[i];
if (node->is_root) continue;
printf("Object: %s\n", node->name.data);
if (node->mesh) {
printf("-> mesh with %zu faces\n", node->mesh->faces.count);
}
}
ufbx_free_scene(scene);
```
## Setup
Copy `ufbx.h` and `ufbx.c` to your project, `ufbx.c` needs to be compiled as
C99/C++11 or more recent. You can also add `misc/ufbx.natvis` to get debug
formatting for the types.
## Features
The goal is to be at feature parity with the official FBX SDK.
* Supports binary and ASCII FBX files starting from version 3000
* Safe
* Invalid files and out-of-memory conditions are handled gracefully
* Loaded scenes are sanitized by default, no out-of-bounds indices or non-UTF-8 strings
* Extensively [tested](#testing)
* Various object types
* Meshes, skinning, blend shapes
* Lights and cameras
* Embedded textures
* NURBS curves and surfaces
* Geometry caches
* LOD groups
* Display/selection sets
* Rigging constraints
* Unified PBR material from known vendor-specific materials
* Various utilities for evaluating the scene (can be compiled out if not needed)
* Polygon triangulation
* Index generation
* Animation curve evaluation / layer blending
* CPU skinning evaluation
* Subdivision surface evaluation
* NURBS curve/surface tessellation
* Progress reporting and cancellation
* Support for Wavefront `.obj` files as well
## Platforms
The library is written in portable C (also compiles as C++) and should work on
almost any platform without modification. If compiled as pre-C11/C++11 on an
unknown compiler (not MSVC/Clang/GCC/TCC), some functions will not be
thread-safe as C99 does not have support for atomics.
The following platforms are tested on CI and produce bit-exact results:
* Windows: MSVC x64/x86, Clang x64/x86, GCC MinGW x64
* macOS: Clang x64, GCC x64
* Linux: Clang x64/x86/ARM64/ARM32/PowerPC, GCC x64/x86/ARM64/ARM32, TCC x64/x86
* WASI: Clang WASM
## Testing
* Internal tests run on all platforms listed above
* Fuzzed in multiple layers
* Parsers (fbx binary/fbx ascii/deflate/xml/mcx/obj/mtl) fuzzed via AFL
* Built-in fuzzing for byte modifications/truncation/out-of-memory
* Semantic fuzzing for binary FBX and OBJ files
* Public dataset: 3.0GB / 245 files
* Loaded, validated, and compared against reference .obj files
* Private dataset: 33.6GB / 12618 files
* Loaded and validated
* Static analysis for maximum stack depth on Linux GCC/Clang
## Versioning
The latest commit in the [`master`](https://github.com/ufbx/ufbx/tree/master)
branch contains the latest stable version of the library.
Older versions are tagged as `vX.Y.Z`, patch updates (`Z`) are ABI compatible
and work with older versions of the header from the same minor version (`Y`).
Minor versions within a major verision (`X`) are expected to be source
compatible after `1.0.0` but the `0.Y.Z` releases can break for every minor
release.
## License
```
------------------------------------------------------------------------------
This software is available under 2 licenses -- choose whichever you prefer.
------------------------------------------------------------------------------
ALTERNATIVE A - MIT License
Copyright (c) 2020 Samuli Raivio
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
------------------------------------------------------------------------------
ALTERNATIVE B - Public Domain (www.unlicense.org)
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
software, either in source code form or as a compiled binary, for any purpose,
commercial or non-commercial, and by any means.
In jurisdictions that recognize copyright laws, the author or authors of this
software dedicate any and all copyright interest in the software to the public
domain. We make this dedication for the benefit of the public at large and to
the detriment of our heirs and successors. We intend this dedication to be an
overt act of relinquishment in perpetuity of all present and future rights to
this software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
----------------------------------------
```

View File

@@ -0,0 +1,472 @@
import re
from typing import Optional, Callable, Any, Iterable, NamedTuple, Union, List, Dict, Tuple
import typing
try:
regex_type = re.Pattern
except AttributeError:
try:
regex_type = re.RegexObject
except AttributeError:
regex_type = type(re.compile(''))
Matcher = Callable[[str, int], int]
def make_regex_matcher(regex) -> Matcher:
def matcher(text: str, begin: int) -> int:
m = regex.match(text, begin)
if m:
return m.end()
else:
return -1
return matcher
def make_literal_matcher(literal) -> Matcher:
def matcher(text: str, begin: int) -> int:
if text.startswith(literal, begin):
return begin + len(literal)
else:
return -1
return matcher
def never_matcher(text: str, begin: int) -> int:
return -1
def always_one_matcher(text: str, begin: int) -> int:
return begin + 1
class Location(NamedTuple):
filename: str
source: str
begin: int
end: int
line: int
column: int
def __str__(self):
if self.filename:
return f"{self.filename}:{self.line}:{self.column}"
else:
return f"{self.line}:{self.column}"
class ParserHint(NamedTuple):
location: Location
message: str
class ParseError(Exception):
def __init__(self, loc: Location, message: str, hints: Iterable[ParserHint]):
msg = f"{loc}: {message}"
if hints:
lines = (f".. while parsing {h.message} at {h.location}" for h in reversed(hints))
msg = msg + "\n" + "\n".join(lines)
super().__init__(msg)
self.loc = loc
class Rule:
"""Rule to match tokens
"""
def __init__(self, name: str, matcher: Matcher=never_matcher, literal: str="", value:Any=None, ignore:bool=False):
self.name = name
self.matcher = matcher
self.literal = literal
if value is None or callable(value):
self.valuer = value
else:
self.valuer = lambda s: value
self.ignore = bool(ignore)
def __repr__(self):
return "Rule({!r})".format(self.name)
def __str__(self):
return "{!r}".format(self.name)
# Special rules for begin and end
Begin = Rule("begin-of-file")
End = Rule("end-of-file")
Synthetic = Rule("synthetic")
Error = Rule("error")
def make_matcher_from_pattern(pattern: Any) -> Matcher:
if isinstance(pattern, str):
# Compile strings to regex
regex = re.compile(pattern, re.ASCII)
return make_regex_matcher(regex)
elif isinstance(pattern, regex_type):
# Already compiled regex
return make_regex_matcher(pattern)
elif callable(pattern):
# Custom matcher function
return pattern
else:
raise TypeError('Invalid type for rule pattern {!r}'.format(type(pattern)))
class Lexer(object):
def __init__(self):
self.global_rules = []
self.prefix_rules = {}
self.lexer_type = SourceLexer
def add_rule(self, rule: Rule, prefix:Iterable[str]=None):
if prefix:
for pre in prefix:
if not isinstance(pre, str):
raise TypeError("Prefixes must be an iterable of str")
if len(pre) > 1:
raise ValueError('Prefixes must be single characters')
rules = self.prefix_rules.setdefault(pre, [])
rules.append(rule)
else:
self.global_rules.append(rule)
def rule(self, name: str, pattern: Any, *, value:Any=None, prefix:Optional[Iterable[str]]=None):
matcher = make_matcher_from_pattern(pattern)
rule = Rule(name, matcher, "", value, ignore=False)
self.add_rule(rule, prefix)
return rule
def ignore(self, name: str, pattern: Any, *, value:Any=None, prefix:Optional[Iterable[str]]=None):
matcher = make_matcher_from_pattern(pattern)
rule = Rule(name, matcher, "", value, ignore=True)
self.add_rule(rule, prefix)
return rule
def ignore_whitespace(self, *, ignore_newline=True):
spaces = " \t\v\r"
if ignore_newline:
spaces += "\n"
regex = re.compile(f"[{re.escape(spaces)}]+")
self.ignore("whitespace", regex, prefix=spaces)
def literal(self, literal: str, value: Any=None):
if not isinstance(literal, str):
raise TypeError('Literals must be strings, got {!r}'.format(type(literal)))
if not literal:
raise ValueError('Empty literal')
if len(literal) == 1:
# Prefix match is full match
matcher = always_one_matcher
else:
matcher = make_literal_matcher(literal)
rule = Rule(repr(literal), matcher, literal, value)
self.add_rule(rule, literal[0])
return rule
def literals(self, *args: str):
return [self.literal(arg) for arg in args]
def make(self, source: str, filename: str=""):
return self.lexer_type(self, source, filename)
class Token:
__slots__ = ["rule", "location", "value", "_text"]
def __init__(self, rule: Rule, location: Location):
self.rule = rule
self.location = location
self.value = None
self._text = None
if rule.valuer:
self.value = rule.valuer(self.text())
def text(self) -> str:
if self._text is None:
loc = self.location
self._text = loc.source[loc.begin:loc.end]
return self._text
def __str__(self) -> str:
loc = self.location
length = loc.end - loc.begin
if self.rule.literal or length > 20:
return self.rule.name
else:
return f"{self.rule.name} {self.text()!r}"
def __repr__(self) -> str:
return f"Token({self.rule.name!r}"
def synthetic(text: str):
length = len(text)
loc = Location("", text, 0, length, 1, 1)
return Token(Synthetic, loc)
class SourceLexer:
def __init__(self, lexer: Lexer, source: str, filename:str=""):
self.pos = 0
self.lexer = lexer
self.source = source
self.source_length = len(source)
self.filename = filename
self.line = 1
self.line_end = 0
def scan(self) -> Token:
pos = self.pos
source_end = self.source_length
lexer = self.lexer
source = self.source
global_rules = lexer.global_rules
while pos < source_end:
prefix = source[pos]
prefix_rules = lexer.prefix_rules.get(prefix)
best_rule = None
best_end = -1
if prefix_rules:
for rule in prefix_rules:
end = rule.matcher(source, pos)
if end >= best_end:
best_rule = rule
best_end = end
for rule in global_rules:
end = rule.matcher(source, pos)
if end >= best_end:
best_rule = rule
best_end = end
column = pos - self.line_end + 1
while self.line_end < best_end:
line_end = source.find("\n", self.line_end, best_end)
if line_end < 0: break
self.line_end = line_end + 1
self.line += 1
if best_end < 0:
loc = Location(self.filename, source, pos, pos + 1, self.line, column)
return Token(Error, loc)
if best_rule.ignore:
pos = best_end
else:
self.pos = best_end
loc = Location(self.filename, source, pos, best_end, self.line, column)
return Token(best_rule, loc)
loc = Location(self.filename, source, source_end, source_end + 1, self.line + 1, 1)
return Token(End, loc)
def format_rule(rule):
if isinstance(rule, list):
return 'any of ({})'.format(', '.join(format_rule(r) for r in rule))
elif isinstance(rule, Rule):
return rule.name
elif isinstance(rule, str):
return repr(rule)
else:
raise TypeError(f'Unsupported rule type {repr(type(rule))}')
def format_message(msg):
return " " + msg if msg else ""
class ParserHintContext:
def __init__(self, parser: "Parser", token_or_loc: Union[Token, Location], message: str):
self.parser = parser
if hasattr(token_or_loc, "location"):
self.location = token_or_loc.location
else:
self.location = token_or_loc
self.message = message
def __enter__(self):
self.parser.hint_stack.append(ParserHint(self.location, self.message))
def __exit__(self, type, value, traceback):
self.parser.hint_stack.pop()
class Parser:
def __init__(self, lexer: Lexer, source: str, filename:str=""):
begin_loc = Location(filename, source, 0, 0, 1, 1)
self.lexer = lexer
self.source_lexer = lexer.make(source, filename)
self.prev_token = Token(Begin, begin_loc)
self.token = self.source_lexer.scan()
self.hint_stack = []
def scan(self):
if self.token.rule is not End:
self.prev_token = self.token
self.token = self.source_lexer.scan()
if self.token.rule is Error:
self.fail(f"Bad token starting with {self.token.text()!r}")
return self.prev_token
def peek(self, rule: Any) -> Optional[Token]:
if isinstance(rule, list):
for r in rule:
tok = self.peek(r)
if tok: return tok
elif isinstance(rule, Rule):
if self.token.rule == rule:
return self.token
elif isinstance(rule, str):
if self.token.rule.literal == rule:
return self.token
else:
raise TypeError(f'Unsupported rule type {type(rule)!r}')
def accept(self, rule) -> Optional[Token]:
tok = self.peek(rule)
if tok:
self.scan()
return tok
else:
return None
def fail_at(self, location: Location, message: str):
raise ParseError(location, message, self.hint_stack)
def fail(self, message: str):
self.fail_at(self.token.location, message)
def fail_prev(self, message: str):
self.fail_at(self.prev_token.location, message)
def fail_got(self, message: str):
self.fail_at(self.token.location, message + f", got {self.token}")
def fail_prev_got(self, message: str):
self.fail_at(self.prev_token.location, message + f", got {self.prev_token}")
def require(self, rule, message: str="") -> Token:
tok = self.accept(rule)
if tok:
return tok
else:
fr, fm = format_rule, format_message
self.fail_got(f"Expected {fr(rule)}{fm(message)}")
def sep(self, sep, message="") -> Iterable[int]:
n = 0
yield n
while self.accept(sep):
yield n
n += 1
def until(self, end, message="") -> Iterable[int]:
n = 0
while not self.accept(end):
yield n
n += 1
def sep_until(self, sep, end, message="") -> Iterable[int]:
n = 0
while not self.accept(end):
if n > 0 and not self.accept(sep):
fr, fm = format_rule, format_message
self.fail_got(f"Expected {fr(sep)} or {fr(end)}{fm(message)}")
yield n
n += 1
def ignore(self, rule) -> int:
n = 0
while self.accept(rule):
n += 1
return n
def hint(self, token_or_loc: Union[Token, Location], message: str):
return ParserHintContext(self, token_or_loc, message)
get_origin = getattr(typing, "get_origin", lambda o: getattr(o, "__origin__", None))
get_args = getattr(typing, "get_args", lambda o: getattr(o, "__args__", None))
class AstField(NamedTuple):
name: str
base: type
optional: bool
sequence: bool
def make_ast_field(name, base):
origin, args = get_origin(base), get_args(base)
optional = sequence = False
if origin == Union and len(args) == 2 and type(None) in args:
base = args[args.index(type(None)) ^ 1]
optional = True
origin, args = get_origin(base), get_args(base)
if origin == List:
base = args[0]
sequence = True
elif origin:
base = object
return AstField(name, base, optional, sequence)
class Ast:
def __init__(self, *args, **kwargs):
cls = type(self)
if len(args) > len(cls.fields):
raise TypeError(f"Too many fields for {cls.__name__}: {len(args)}, expected {len(cls.fields)}")
for field, arg in zip(cls.fields, args):
setattr(self, field.name, arg)
for name, arg in kwargs.items():
setattr(self, name, arg)
for field in cls.fields:
try:
value = getattr(self, field.name)
if field.optional and value is None:
continue
if field.sequence:
for ix, v in enumerate(value):
if not isinstance(v, field.base):
raise TypeError(f"Trying to assign '{type(v).__name__}' to '{cls.__name__}' field '{field.name}: {field.base.__name__}' index [{ix}]")
else:
if not isinstance(value, field.base):
raise TypeError(f"Trying to assign '{type(value).__name__}' to '{cls.__name__}' field '{field.name}: {field.base.__name__}'")
except AttributeError:
raise ValueError(f"'{cls.__name__}' requires field '{field.name}: {field.base.__name__}'")
def __init_subclass__(cls, **kwargs):
fields = getattr(cls, "__annotations__", {})
cls.fields = [make_ast_field(k, v) for k,v in fields.items()]
super().__init_subclass__(**kwargs)
def _imp_dump(self, result, indent):
cls = type(self)
indent_str = " " * indent
result += (cls.__name__, "(")
first = True
num_asts = 0
for field in cls.fields:
if issubclass(field.base, Ast):
num_asts += 1
continue
if not first: result.append(", ")
first = False
result += (field.name, "=", str(getattr(self, field.name, None)))
for field in cls.fields:
if not issubclass(field.base, Ast): continue
if num_asts > 1:
result += ("\n", indent_str, " ")
else:
if not first: result.append(", ")
result.append(field.name)
result.append("=")
attr = getattr(self, field.name, None)
if not attr:
result.append("None")
continue
if field.sequence:
result.append("[")
seq_indent = 1 if num_asts == 1 else 2
print(seq_indent)
for ast in getattr(self, field.name, None):
result += ("\n", indent_str, " " * seq_indent)
ast._imp_dump(result, indent + seq_indent)
result += ("\n", indent_str, " ]")
else:
attr._imp_dump(result, indent + 1)
result += ")"
def dump(self, indent=0):
result = []
self._imp_dump(result, indent)
return "".join(result)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,804 @@
import parsette
import string
from typing import List, Optional, NamedTuple, Union
import json
import argparse
import os
import re
lexer = parsette.Lexer()
lexer.ignore_whitespace()
TEnd = parsette.End
TIdent = lexer.rule("identifier", r"[A-Za-z_][A-Za-z0-9_]*", prefix=string.ascii_letters+"_")
TNumber = lexer.rule("number", r"(0[Xx][0-9A-Fa-f]+)|([0-9]+)", prefix=string.digits)
TComment = lexer.rule("comment", r"//[^\r\n]*", prefix="/")
TPreproc = lexer.rule("preproc", r"#[^\n\\]*(\\\r?\n[^\n\\]*?)*\n", prefix="#")
TString = lexer.rule("string", r"\"[^\"]*\"", prefix="\"")
lexer.literals(*"const typedef struct union enum extern ufbx_abi ufbx_inline ufbx_nullable ufbx_abi ufbx_unsafe UFBX_LIST_TYPE UFBX_ENUM_REPR UFBX_FLAG_REPR UFBX_ENUM_FORCE_WIDTH UFBX_FLAG_FORCE_WIDTH UFBX_ENUM_TYPE".split())
lexer.literals(*",.*[]{}()<>=-;")
lexer.ignore("disable", re.compile(r"//\s*bindgen-disable.*?//\s*bindgen-enable", flags=re.DOTALL))
Token = parsette.Token
Ast = parsette.Ast
class AType(Ast):
pass
class AName(Ast):
pass
class ATop(Ast):
pass
class AStructDecl(Ast):
pass
class AEnumDecl(Ast):
pass
class ADecl(Ast):
type: AType
names: List[AName]
end_line: Optional[int] = None
class ANamePointer(AName):
inner: AName
class ANameArray(AName):
inner: AName
length: Optional[Token]
class ANameIdent(AName):
ident: Token
class ANameFunction(AName):
inner: AName
args: List[ADecl]
class ANameAnonymous(AName):
pass
class ATypeConst(AType):
inner: AType
class ATypeSpec(AType):
inner: AType
spec: Token
class ATypeIdent(AType):
name: Token
class ATypeStruct(AType):
kind: Token
name: Optional[Token]
decls: Optional[List[AStructDecl]]
class ATypeEnum(AType):
kind: Token
name: Optional[Token]
decls: Optional[List[AEnumDecl]]
class AStructComment(AStructDecl):
comments: List[Token]
class AStructField(AStructDecl):
decl: ADecl
class AEnumComment(AEnumDecl):
comments: List[Token]
class AEnumValue(AEnumDecl):
name: Token
value: Optional[Token]
class ATopPreproc(ATop):
preproc: Token
class ATopComment(ATop):
comments: List[Token]
class ATopDecl(ATop):
decl: ADecl
class ATopExtern(ATop):
decl: ADecl
class ATopTypedef(ATop):
decl: ADecl
class ATopFile(ATop):
tops: List[ATop]
class ATopList(ATop):
name: Token
type: ADecl
class ATopEnumType(ATop):
enum_type: Token
prefix: Token
last_value: Token
class Parser(parsette.Parser):
def __init__(self, source, filename=""):
super().__init__(lexer, source, filename)
def finish_comment(self, comment_type, first):
comments = [first]
line = first.location.line + 1
while self.peek(TComment) and self.token.location.line == line:
comments.append(self.scan())
line += 1
return comment_type(comments)
def accept_impl(self) -> bool:
if self.token.rule != TIdent: return False
text = self.token.text()
if not text.startswith("UFBX_"): return False
if not text.endswith("_IMPL"): return False
self.scan()
return True
def finish_struct(self, kind) -> ATypeStruct:
kn = kind.text()
name = self.accept(TIdent)
if self.accept("{"):
fields = []
loc = name if name else kind
with self.hint(loc, f"{kn} {name.text()}" if name else f"anonymous {kn}"):
while not self.accept("}"):
if self.accept(TComment):
fields.append(self.finish_comment(AStructComment, self.prev_token))
elif self.accept_impl():
self.require("(", "for macro parameters")
self.finish_macro_params()
else:
decl = self.parse_decl(f"{kn} field")
field = AStructField(decl)
fields.append(field)
self.require(";", f"after {kn} field")
else:
fields = None
return ATypeStruct(kind, name, fields)
def parse_enum_decl(self) -> AEnumDecl:
if self.accept(TComment):
return self.finish_comment(AEnumComment, self.prev_token)
else:
name = self.require(TIdent, "enum value name")
value = None
if self.accept("="):
value = self.require([TIdent, TNumber], f"'{name.text()}' value")
return AEnumValue(name, value)
def finish_enum(self, kind) -> ATypeStruct:
kn = kind.text()
name = self.accept(TIdent)
self.require(["UFBX_ENUM_REPR", "UFBX_FLAG_REPR"], "enum repr macro")
if self.accept("{"):
decls = []
loc = name if name else kind
has_force_width = False
with self.hint(loc, f"{kn} {name.text()}" if name else f"anonymous {kn}"):
while not self.accept("}"):
if self.accept(","):
continue
if self.accept(["UFBX_ENUM_FORCE_WIDTH", "UFBX_FLAG_FORCE_WIDTH"]):
self.require("(", "for FORCE_WIDTH macro parameters")
self.require(TIdent, "for FORCE_WIDTH macro name")
self.require(")", "for FORCE_WIDTH macro parameters")
has_force_width = True
continue
decls.append(self.parse_enum_decl())
if not has_force_width:
self.fail_at(self.prev_token, "enum missing FORCE_WIDTH macro")
else:
decls = None
return ATypeEnum(kind, name, decls)
def parse_type(self) -> AType:
token = self.token
if self.accept("const"):
inner = self.parse_type()
return ATypeConst(inner)
elif self.accept(["ufbx_nullable", "ufbx_abi", "ufbx_unsafe", "ufbx_inline"]):
inner = self.parse_type()
return ATypeSpec(inner, token)
elif self.accept(["struct", "union"]):
return self.finish_struct(self.prev_token)
elif self.accept("enum"):
return self.finish_enum(self.prev_token)
elif self.accept(TIdent):
return ATypeIdent(self.prev_token)
else:
self.fail_got("expected a type")
def parse_name_non_array(self, ctx, allow_anonymous=False) -> AName:
if self.accept("*"):
inner = self.parse_name_non_array(ctx, allow_anonymous)
return ANamePointer(inner)
if allow_anonymous and not self.peek(TIdent):
return ANameAnonymous()
else:
name = self.require(TIdent, f"for {ctx} name")
return ANameIdent(name)
def parse_name(self, ctx, allow_anonymous=False) -> AName:
ast = self.parse_name_non_array(ctx, allow_anonymous)
while True:
if self.accept("["):
length = self.accept([TIdent, TNumber])
self.require("]", f"for opening [")
ast = ANameArray(ast, length)
elif self.accept("("):
args = []
while not self.accept(")"):
args.append(self.parse_decl("argument", allow_list=False, allow_anonymous=True))
self.accept(",")
ast = ANameFunction(ast, args)
else:
break
return ast
def parse_decl(self, ctx, allow_anonymous=False, allow_list=True) -> ADecl:
typ = self.parse_type()
names = []
if not self.peek(";"):
if allow_list:
for _ in self.sep(","):
names.append(self.parse_name(ctx, allow_anonymous))
else:
names.append(self.parse_name(ctx, allow_anonymous))
return ADecl(typ, names)
def finish_top_list(self) -> ATopList:
self.require("(", "for macro parameters")
name = self.require(TIdent, "for list type name")
self.require(",", "for macro parameters")
decl = self.parse_decl("UFBX_TOP_LIST type", allow_anonymous=True, allow_list=False)
self.require(")", "for macro parameters")
return ATopList(name, decl)
def finish_top_enum_type(self) -> ATopEnumType:
self.require("(", "for macro parameters")
enum_name = self.require(TIdent, "for enum type name")
self.require(",", "for macro parameters")
prefix = self.require(TIdent, "for enum prefix")
self.require(",", "for macro parameters")
last_value = self.require(TIdent, "for enum last value")
self.require(")", "for macro parameters")
return ATopEnumType(enum_name, prefix, last_value)
def finish_macro_params(self):
while not self.accept(")"):
if self.accept(TEnd): self.fail("Unclosed macro parameters")
if self.accept("("):
self.finish_macro_params()
else:
self.scan()
def parse_top(self) -> List[ATop]:
if self.accept(TPreproc):
return [ATopPreproc(self.prev_token)]
elif self.accept(TComment):
return [self.finish_comment(ATopComment, self.prev_token)]
elif self.accept("typedef"):
decl = self.parse_decl("typedef")
self.require(";", "after typedef")
decl.end_line = self.prev_token.location.line
return [ATopTypedef(decl)]
elif self.accept("extern"):
if self.accept(TString):
self.require("{", "for extern ABI block")
tops = []
while not self.accept("}"):
tops += self.parse_top()
return tops
else:
decl = self.parse_decl("extern")
self.require(";", "after extern")
decl.end_line = self.prev_token.location.line
return [ATopExtern(decl)]
elif self.accept("UFBX_LIST_TYPE"):
tl = self.finish_top_list()
self.require(";", "after UFBX_LIST_TYPE()")
return [tl]
elif self.accept("UFBX_ENUM_TYPE"):
tl = self.finish_top_enum_type()
self.require(";", "after UFBX_ENUM_TYPE()")
return [tl]
else:
decl = self.parse_decl("top-level")
if self.accept("{"):
level = 1
while level > 0:
if self.accept("{"):
level += 1
elif self.accept("}"):
level -= 1
else:
self.scan()
decl.end_line = self.prev_token.location.line
else:
self.require(";", "after top-level declaration")
decl.end_line = self.prev_token.location.line
return [ATopDecl(decl)]
def parse_top_file(self) -> ATopFile:
tops = []
while not self.accept(parsette.End):
if self.ignore(TEnd): continue
tops += self.parse_top()
return ATopFile(tops)
def fmt_type(type: AType):
if isinstance(type, ATypeIdent):
return type.name.text()
elif isinstance(type, ATypeConst):
return f"const {fmt_type(type.inner)}"
elif isinstance(type, ATypeSpec):
return f"{type.spec.text()} {fmt_type(type.inner)}"
class SMod: pass
class SModConst(SMod): pass
class SModNullable(SMod): pass
class SModInline(SMod): pass
class SModAbi(SMod): pass
class SModUnsafe(SMod): pass
class SModPointer(SMod): pass
class SModArray(SMod):
def __init__(self, length: Optional[str]):
self.length = length
class SModFunction(SMod):
def __init__(self, args: List["SDecl"]):
self.args = args
class SComment(NamedTuple):
line_begin: int
line_end: int
text: List[str]
class SType(NamedTuple):
kind: str
name: Optional[str]
mods: List[SMod] = []
body: Union["SStruct", "SEnum", "SEnumType", None] = None
class SName(NamedTuple):
name: Optional[str]
type: SType
value: Optional[str] = None
class SDecl(NamedTuple):
line_begin: int
line_end: int
kind: str
names: List[SName]
comment: Optional[SComment] = None
comment_inline: bool = False
is_function: bool = False
define_args: Optional[List[str]] = None
value: Optional[str] = None
class SDeclGroup(NamedTuple):
line: int
decls: List[SDecl]
comment: Optional[SComment] = None
comment_inline: bool = False
is_function: bool = False
SCommentDecl = Union[SComment, SDecl, SDeclGroup]
class SStruct(NamedTuple):
line: int
kind: str
name: Optional[str]
decls: List[SCommentDecl]
is_list: bool = False
class SEnum(NamedTuple):
line: int
name: Optional[str]
decls: List[SCommentDecl]
class SEnumType(NamedTuple):
line: int
enum_name: str
enum_prefix: str
last_value: str
def type_line(typ: AType):
if isinstance(typ, ATypeIdent):
return typ.name.location.line
elif isinstance(typ, ATypeConst):
return type_line(typ.inner)
elif isinstance(typ, ATypeStruct):
return typ.kind.location.line
elif isinstance(typ, ATypeEnum):
return typ.kind.location.line
elif isinstance(typ, ATypeSpec):
return type_line(typ.inner)
else:
raise TypeError(f"Unhandled type {type(typ).__name__}")
spec_to_mod = {
"ufbx_abi": SModAbi,
"ufbx_nullable": SModNullable,
"ufbx_inline": SModInline,
"ufbx_unsafe": SModUnsafe,
}
def to_stype(typ: AType) -> SType:
if isinstance(typ, ATypeIdent):
return SType("name", typ.name.text())
elif isinstance(typ, ATypeConst):
st = to_stype(typ.inner)
return st._replace(mods=st.mods + [SModConst()])
elif isinstance(typ, ATypeSpec):
st = to_stype(typ.inner)
spec = typ.spec.text()
return st._replace(mods=st.mods + [spec_to_mod[spec]()])
elif isinstance(typ, ATypeStruct):
body = to_sstruct(typ) if typ.decls is not None else None
return SType(typ.kind.text(), typ.name.text() if typ.name else None, body=body)
elif isinstance(typ, ATypeEnum):
body = to_senum(typ) if typ.decls is not None else None
return SType("enum", typ.name.text() if typ.name else None, body=body)
else:
raise TypeError(f"Unhandled type {type(typ).__name__}")
def name_to_stype(base: SType, name: AName) -> SType:
if isinstance(name, ANamePointer):
st = name_to_stype(base, name.inner)
return st._replace(mods=st.mods + [SModPointer()])
elif isinstance(name, ANameArray):
st = name_to_stype(base, name.inner)
mod = SModArray(name.length.text() if name.length else None)
return st._replace(mods=st.mods + [mod])
elif isinstance(name, ANameFunction):
st = name_to_stype(base, name.inner)
mod = SModFunction([to_sdecl(a, "argument") for a in name.args])
return st._replace(mods=st.mods + [mod])
elif isinstance(name, ANameIdent):
return base
elif isinstance(name, ANameAnonymous):
return base
else:
raise TypeError(f"Unhandled type {type(name)}")
def name_str(name: AName):
if isinstance(name, ANameIdent):
return name.ident.text()
elif isinstance(name, ANameAnonymous):
return None
elif isinstance(name, ANamePointer):
return name_str(name.inner)
elif isinstance(name, ANameArray):
return name_str(name.inner)
elif isinstance(name, ANameFunction):
return name_str(name.inner)
else:
raise TypeError(f"Unhandled type {type(name)}")
def to_sdecl(decl: ADecl, kind: str) -> SDecl:
names = []
is_function = False
base_st = to_stype(decl.type)
for name in decl.names:
st = name_to_stype(base_st, name)
if any(isinstance(mod, SModFunction) for mod in st.mods):
is_function = True
names.append(SName(name_str(name), st))
if not decl.names:
names.append(SName(None, base_st))
line = type_line(decl.type)
end_line = decl.end_line
if end_line is None: end_line = line
return SDecl(line, end_line, kind, names, is_function=is_function)
Comment = List[str]
def to_scomment(comment: Ast):
if not comment: return None
begin = comment.comments[0].location.line
end = comment.comments[-1].location.line
text = [c.text()[3:] for c in comment.comments]
return SComment(begin, end, text)
def to_sstruct(struct: ATypeStruct) -> SStruct:
decls = []
for decl in struct.decls:
if isinstance(decl, AStructComment):
decls.append(to_scomment(decl))
elif isinstance(decl, AStructField):
decls.append(to_sdecl(decl.decl, "field"))
line = struct.kind.location.line
name = struct.name.text() if struct.name else None
kind = struct.kind.text()
return SStruct(line, kind, name, decls)
def to_senum(enum: ATypeEnum) -> SEnum:
decls = []
name = enum.name.text() if enum.name else None
for decl in enum.decls:
if isinstance(decl, AEnumComment):
decls.append(to_scomment(decl))
elif isinstance(decl, AEnumValue):
line = decl.name.location.line
decls.append(SDecl(
line_begin=line,
line_end=line,
kind="enumValue",
value=decl.value.text() if decl.value else None,
names=[
SName(
name=decl.name.text(),
type=SType("enum", name),
value=decl.value)
]))
line = enum.kind.location.line
return SEnum(line, name, decls)
def to_sbody(typ: AType):
if isinstance(typ, ATypeStruct):
return to_sstruct(typ)
elif isinstance(typ, ATypeEnum):
return to_senum(typ)
else:
raise TypeError(f"Unhandled type {type(typ)}")
def top_sdecls(top: ATop) -> List[SCommentDecl]:
if isinstance(top, ATopFile):
decls = []
for t in top.tops:
decls += top_sdecls(t)
return decls
elif isinstance(top, ATopTypedef):
return [to_sdecl(top.decl, "typedef")]
elif isinstance(top, ATopExtern):
return [to_sdecl(top.decl, "extern")]
elif isinstance(top, ATopDecl):
return [to_sdecl(top.decl, "toplevel")]
elif isinstance(top, ATopComment):
return [to_scomment(top)]
elif isinstance(top, ATopList):
line = top.name.location.line
name = top.name.text()
st = to_stype(top.type.type)
st = name_to_stype(st, top.type.names[0])
return [SDecl(line, line, "list", [SName(None, SType("struct", name,
body=SStruct(line, "struct", name, [
SDecl(line, line, "field", [SName("data", st._replace(mods=st.mods+[SModPointer()]))]),
SDecl(line+1, line+1, "field", [SName("count", SType("name", "size_t"))]),
], is_list=True)
))])]
elif isinstance(top, ATopEnumType):
line = top.enum_type.location.line
name = top.prefix.text() + "_COUNT"
return [SDecl(line, line, "enumCount",
[SName(name, SType("enumType", "enumType", body=SEnumType(
line, top.enum_type.text(), top.prefix.text(), top.last_value.text())
)
)]
)]
elif isinstance(top, ATopPreproc):
line = top.preproc.location.line
text = top.preproc.text()
m = re.match(r"#\s*define\s+(\w+)(\([^\)]*\))?\s+(.*)", text)
if m:
name = m.group(1)
args = m.group(2)
if args:
args = [arg.strip() for arg in args.split(",")]
else:
args = None
value = m.group(3)
return [SDecl(line, line, "define", [SName(name, SType("define", "define"))],
define_args=args,
value=value)]
else:
return [] # TODO
else:
raise TypeError(f"Unhandled type {type(top)}")
def collect_decl_comments(decls: List[SCommentDecl]):
n = 0
while n < len(decls):
dc = decls[n:n+3]
if isinstance(dc[0], SComment):
if (len(dc) >= 2 and isinstance(dc[1], SDecl) and dc[0].line_end + 1 == dc[1].line_begin
and (len(dc) < 3 or not (isinstance(dc[2], SComment) and dc[1].line_end == dc[2].line_begin))):
yield dc[1]._replace(comment=dc[0])
n += 2
else:
yield dc[0]
n += 1
else:
if len(dc) >= 2 and isinstance(dc[1], SComment) and dc[0].line_end == dc[1].line_begin:
comment = dc[1]._replace(text=[re.sub("^\s*<\s*", "", t) for t in dc[1].text])
yield dc[0]._replace(comment=comment, comment_inline=True)
n += 2
else:
yield dc[0]
n += 1
def collect_decl_groups(decls: List[SCommentDecl]):
n = 0
while n < len(decls):
dc = decls[n]
if isinstance(dc, SDecl) and not dc.comment_inline and not (dc.names and dc.names[0].type.body):
group = [dc]
line = dc.line_end + 1
n += 1
while n < len(decls):
dc2 = decls[n]
if not isinstance(dc2, SDecl): break
if dc2.comment: break
if dc2.line_begin != line: break
if dc2.names and dc2.names[0].type.body: break
if dc2.is_function != dc.is_function: break
group.append(dc2)
line = dc2.line_end + 1
n += 1
group[0] = dc._replace(comment=None)
comment_inline = len(group) == 1 and dc.comment_inline
yield SDeclGroup(dc.line_begin, group, dc.comment, comment_inline, dc.is_function)
elif isinstance(dc, SDecl) and not (dc.names and dc.names[0].type.body):
group = [dc._replace(comment=None)]
yield SDeclGroup(dc.line_begin, group, dc.comment, dc.comment_inline, dc.is_function)
n += 1
else:
yield dc
n += 1
def collect_decls(decls: List[SCommentDecl], allow_groups: bool) -> List[SCommentDecl]:
decls = list(collect_decl_comments(decls))
if allow_groups:
decls = list(collect_decl_groups(decls))
return decls
def format_arg(decl: SDecl):
name = decl.names[0]
return {
"type": format_type(name.type),
"name": name.name,
}
def format_mod(mod: SMod):
if isinstance(mod, SModConst):
return { "type": "const" }
elif isinstance(mod, SModNullable):
return { "type": "nullable" }
elif isinstance(mod, SModInline):
return { "type": "inline" }
elif isinstance(mod, SModAbi):
return { "type": "abi" }
elif isinstance(mod, SModPointer):
return { "type": "pointer" }
elif isinstance(mod, SModUnsafe):
return { "type": "unsafe" }
elif isinstance(mod, SModArray):
return { "type": "array", "length": mod.length }
elif isinstance(mod, SModFunction):
return { "type": "function", "args": [format_arg(d) for d in mod.args] }
else:
raise TypeError(f"Unhandled mod {type(mod)}")
def format_type(type: SType):
return {
"kind": type.kind,
"name": type.name,
"mods": [format_mod(mod) for mod in type.mods],
}
def format_name(name: SName):
return {
"type": format_type(name.type),
"name": name.name,
}
def format_decls(decls: List[SCommentDecl], allow_groups: bool):
for decl in collect_decls(decls, allow_groups):
if isinstance(decl, SComment):
yield {
"kind": "paragraph",
"comment": decl.text,
}
elif isinstance(decl, SDecl):
body = None
if decl.names and decl.names[0].type.body:
body = decl.names[0].type.body
if isinstance(body, SStruct):
yield {
"kind": "struct",
"structKind": body.kind,
"line": body.line,
"name": body.name,
"comment": decl.comment.text if decl.comment else [],
"commentInline": decl.comment_inline,
"isList": body.is_list,
"decls": list(format_decls(body.decls, allow_groups=True)),
}
elif isinstance(body, SEnum):
yield {
"kind": "enum",
"line": body.line,
"name": body.name,
"comment": decl.comment.text if decl.comment else [],
"commentInline": decl.comment_inline,
"decls": list(format_decls(body.decls, allow_groups=True)),
}
elif isinstance(body, SEnumType):
yield {
"kind": "enumType",
"line": body.line,
"enumName": body.enum_name,
"countName": body.enum_prefix + "_COUNT",
"lastValue": body.last_value,
"comment": decl.comment.text if decl.comment else [],
"commentInline": decl.comment_inline,
}
else:
for name in decl.names:
yield {
"kind": "decl",
"declKind": decl.kind,
"line": decl.line_begin,
"name": name.name,
"comment": decl.comment.text if decl.comment else [],
"commentInline": decl.comment_inline,
"isFunction": decl.is_function,
"value": decl.value,
"defineArgs": decl.define_args,
"type": format_type(name.type),
}
elif isinstance(decl, SDeclGroup):
yield {
"kind": "group",
"line": decl.line,
"name": None,
"comment": decl.comment.text if decl.comment else [],
"commentInline": decl.comment_inline,
"isFunction": decl.is_function,
"decls": list(format_decls(decl.decls, allow_groups=False)),
}
else:
raise TypeError(f"Unhandled type {type(decl)}")
if __name__ == "__main__":
parser = argparse.ArgumentParser("ufbx_parser.py")
parser.add_argument("-i", help="Input file")
parser.add_argument("-o", help="Output file")
argv = parser.parse_args()
src_path = os.path.dirname(os.path.realpath(__file__))
input_file = argv.i
if not input_file:
input_file = os.path.join(src_path, "..", "ufbx.h")
output_file = argv.o
if not output_file:
output_file = os.path.join(src_path, "build", "ufbx.json")
output_path = os.path.dirname(os.path.realpath(output_file))
if not os.path.exists(output_path):
os.makedirs(output_path, exist_ok=True)
with open(input_file) as f:
source = f.read()
p = Parser(source, "ufbx.h")
top_file = p.parse_top_file()
result = top_sdecls(top_file)
js = list(format_decls(result, allow_groups=True))
with open(output_file, "wt") as f:
json.dump(js, f, indent=2)

Binary file not shown.

View File

@@ -0,0 +1,22 @@
# Blender MTL File: 'None'
# Material Count: 2
newmtl Red
Ns 96.078421
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.000000 0.000000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 0.000000
illum 9
newmtl White
Ns 96.078421
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 0.000000
illum 9

View File

@@ -0,0 +1,199 @@
# Blender v3.2.0 OBJ File: ''
# www.blender.org
mtllib blender_279_ball_0_obj.mtl
o Icosphere
v 0.000000 -0.000000 -1.000000
v 0.723607 -0.525725 -0.447219
v -0.276388 -0.850649 -0.447220
v -0.894426 -0.000000 -0.447216
v -0.276388 0.850649 -0.447220
v 0.723607 0.525725 -0.447220
v 0.276388 -0.850649 0.447220
v -0.723607 -0.525725 0.447220
v -0.723607 0.525725 0.447219
v 0.276388 0.850649 0.447220
v 0.894426 0.000000 0.447216
v 0.000000 0.000000 1.000000
v -0.162456 -0.499995 -0.850654
v 0.425323 -0.309012 -0.850654
v 0.262869 -0.809012 -0.525738
v 0.850648 -0.000000 -0.525736
v 0.425323 0.309011 -0.850654
v -0.525730 -0.000000 -0.850652
v -0.688189 -0.499997 -0.525736
v -0.162456 0.499995 -0.850654
v -0.688189 0.499997 -0.525736
v 0.262869 0.809012 -0.525738
v 0.951058 -0.309013 0.000000
v 0.951058 0.309013 -0.000000
v 0.000000 -1.000000 0.000000
v 0.587786 -0.809017 0.000000
v -0.951058 -0.309013 0.000000
v -0.587786 -0.809017 0.000000
v -0.587786 0.809017 -0.000000
v -0.951058 0.309013 -0.000000
v 0.587786 0.809017 -0.000000
v 0.000000 1.000000 -0.000000
v 0.688189 -0.499997 0.525736
v -0.262869 -0.809012 0.525738
v -0.850648 0.000000 0.525736
v -0.262869 0.809012 0.525738
v 0.688189 0.499997 0.525736
v 0.162456 -0.499995 0.850654
v 0.525730 0.000000 0.850652
v -0.425323 -0.309011 0.850654
v -0.425323 0.309012 0.850654
v 0.162456 0.499995 0.850654
vn -0.4713 -0.5831 0.6617
vn -0.7002 0.2680 0.6617
vn -0.1024 0.3151 0.9435
vn -0.1876 0.5773 0.7947
vn -0.4713 0.5831 0.6617
vn -0.3313 0.0000 0.9435
vn -0.6071 0.0000 0.7947
vn -0.7002 -0.2680 0.6617
vn -0.1024 -0.3151 0.9435
vn -0.1876 -0.5773 0.7947
vn -0.3035 0.9342 0.1876
vn -0.5346 0.7779 0.3304
vn -0.9050 0.2680 0.3304
vn -0.9822 -0.0000 0.1876
vn -0.9050 -0.2680 0.3304
vn -0.5346 -0.7779 0.3304
vn -0.3035 -0.9342 0.1876
vn -0.8026 0.5831 0.1256
vn -0.8026 -0.5831 0.1256
vn 0.2764 -0.8506 0.4472
vn 0.6882 -0.5000 0.5257
vn 0.1625 -0.5000 0.8507
vn 0.2764 0.8506 0.4472
vn -0.2629 0.8090 0.5257
vn 0.1625 0.5000 0.8507
vn 0.8944 0.0000 0.4472
vn 0.6882 0.5000 0.5257
vn 0.5257 0.0000 0.8507
vn 0.0000 -0.0000 1.0000
vn -0.2629 -0.8090 0.5257
vn 0.9511 0.3090 -0.0000
vn 0.5878 0.8090 0.0000
vn -0.0000 1.0000 0.0000
vn -0.0000 -1.0000 0.0000
vn 0.5878 -0.8090 0.0000
vn 0.9511 -0.3090 -0.0000
vn -0.2680 -0.1947 -0.9435
vn -0.2680 0.1947 -0.9435
vn 0.0247 -0.9435 -0.3304
vn -0.8897 -0.3151 -0.3304
vn -0.5746 0.7488 -0.3304
vn -0.3066 -0.9435 -0.1256
vn -0.9921 -0.0000 -0.1256
vn -0.3066 0.9435 -0.1256
vn 0.0247 0.9435 -0.3304
vn -0.7947 0.5773 -0.1876
vn -0.8897 0.3151 -0.3304
vn -0.7947 -0.5773 -0.1876
vn -0.5746 -0.7488 -0.3304
vn -0.0385 0.7488 -0.6617
vn -0.4089 0.6284 -0.6617
vn -0.4911 0.3568 -0.7947
vn -0.7240 0.1947 -0.6617
vn -0.7240 -0.1947 -0.6617
vn -0.4911 -0.3568 -0.7947
vn -0.4089 -0.6284 -0.6617
vn -0.0385 -0.7488 -0.6617
vn -0.0000 -0.0000 -1.0000
vn 0.4253 -0.3090 -0.8507
vn -0.1624 -0.5000 -0.8507
vn 0.7236 -0.5257 -0.4472
vn 0.8506 -0.0000 -0.5257
vn -0.1624 0.5000 -0.8507
vn 0.4253 0.3090 -0.8507
vn 0.7236 0.5257 -0.4472
vn 0.2629 0.8090 -0.5257
vn 0.2629 -0.8090 -0.5257
usemtl Red
s off
f 8//1 34//1 40//1
f 9//2 35//2 41//2
f 42//3 41//3 12//3
f 42//4 36//4 41//4
f 36//5 9//5 41//5
f 41//6 40//6 12//6
f 41//7 35//7 40//7
f 35//8 8//8 40//8
f 40//9 38//9 12//9
f 40//10 34//10 38//10
f 32//11 29//11 36//11
f 29//12 9//12 36//12
f 30//13 35//13 9//13
f 30//14 27//14 35//14
f 27//15 8//15 35//15
f 28//16 34//16 8//16
f 28//17 25//17 34//17
f 29//18 30//18 9//18
f 27//19 28//19 8//19
s 1
f 7//20 33//21 38//22
f 10//23 36//24 42//25
f 11//26 37//27 39//28
f 39//28 42//25 12//29
f 39//28 37//27 42//25
f 37//27 10//23 42//25
f 34//30 7//20 38//22
f 38//22 39//28 12//29
f 38//22 33//21 39//28
f 33//21 11//26 39//28
f 24//31 37//27 11//26
f 24//31 31//32 37//27
f 31//32 10//23 37//27
f 32//33 36//24 10//23
f 25//34 7//20 34//30
f 26//35 33//21 7//20
f 26//35 23//36 33//21
f 23//36 11//26 33//21
f 31//32 32//33 10//23
f 25//34 26//35 7//20
f 23//36 24//31 11//26
usemtl White
s off
f 1//37 13//37 18//37
f 1//38 18//38 20//38
f 3//39 15//39 25//39
f 4//40 19//40 27//40
f 5//41 21//41 29//41
f 3//42 25//42 28//42
f 4//43 27//43 30//43
f 5//44 29//44 32//44
f 22//45 5//45 32//45
f 29//46 21//46 30//46
f 21//47 4//47 30//47
f 27//48 19//48 28//48
f 19//49 3//49 28//49
f 20//50 5//50 22//50
f 20//51 21//51 5//51
f 20//52 18//52 21//52
f 18//53 4//53 21//53
f 18//54 19//54 4//54
f 18//55 13//55 19//55
f 13//56 3//56 19//56
f 13//57 15//57 3//57
s 1
f 1//58 14//59 13//60
f 2//61 14//59 16//62
f 1//58 20//63 17//64
f 2//61 16//62 23//36
f 6//65 22//66 31//32
f 2//61 23//36 26//35
f 6//65 31//32 24//31
f 31//32 22//66 32//33
f 25//34 15//67 26//35
f 15//67 2//61 26//35
f 23//36 16//62 24//31
f 16//62 6//65 24//31
f 17//64 22//66 6//65
f 17//64 20//63 22//66
f 16//62 17//64 6//65
f 16//62 14//59 17//64
f 14//59 1//58 17//64
f 13//60 14//59 15//67
f 14//59 2//61 15//67

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,25 @@
# ufbx:bad_uvs
# Blender v2.79 (sub 0) OBJ File: ''
# www.blender.org
g Cube
v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 -1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -0.999999
v 0.999999 1.000000 1.000001
v -1.000000 1.000000 1.000000
v -1.000000 1.000000 -1.000000
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 1.0000 0.0000 0.0000
vn -0.0000 -0.0000 1.0000
vn -1.0000 -0.0000 -0.0000
vn 0.0000 0.0000 -1.0000
s off
f 1//1 2//1 3//1 4//1
f 5//2 8//2 7//2 6//2
f 1//3 5//3 6//3 2//3
f 2//4 6//4 7//4 3//4
f 3//5 7//5 8//5 4//5
f 5//6 1//6 4//6 8//6

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,179 @@
# This file uses centimeters as units for non-parametric coordinates.
g default
v -100.000000 -99.999984 100.000016
v -100.000000 100.000016 99.999984
v -100.000000 -100.000016 -99.999984
v -100.000000 99.999984 -100.000016
v 100.000000 -99.999984 100.000016
v 100.000000 100.000016 99.999984
v 100.000000 -100.000016 -99.999984
v 100.000000 99.999984 -100.000016
vn -1.000000 0.000000 -0.000000
vn -1.000000 0.000000 -0.000000
vn -1.000000 0.000000 -0.000000
vn -1.000000 0.000000 -0.000000
vn 0.000000 -0.000000 -1.000000
vn 0.000000 -0.000000 -1.000000
vn 0.000000 -0.000000 -1.000000
vn 0.000000 -0.000000 -1.000000
vn 1.000000 0.000000 0.000000
vn 1.000000 0.000000 0.000000
vn 1.000000 0.000000 0.000000
vn 1.000000 0.000000 0.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 1.000000 -0.000000
vn 0.000000 1.000000 -0.000000
vn 0.000000 1.000000 -0.000000
vn 0.000000 1.000000 -0.000000
s off
g CubeFBXASC046001
f 1//1 2//2 4//3 3//4
f 3//5 4//6 8//7 7//8
f 7//9 8//10 6//11 5//12
f 5//13 6//14 2//15 1//16
f 3//17 7//18 5//19 1//20
f 8//21 4//22 2//23 6//24
g default
v 197.583224 193.951703 -76.118610
v -182.971705 290.435579 -234.286480
v 145.165263 230.906611 9.318881
v 78.463071 194.765819 84.535448
v 130.881032 157.810913 -0.902039
vn 0.319483 0.925323 -0.204226
vn 0.319483 0.925323 -0.204226
vn 0.319483 0.925323 -0.204226
vn -0.098113 0.928177 0.358973
vn -0.098113 0.928177 0.358973
vn -0.098113 0.928177 0.358973
vn -0.452538 -0.885498 0.105368
vn -0.452538 -0.885498 0.105368
vn -0.452538 -0.885498 0.105368
vn -0.034942 -0.888352 -0.457831
vn -0.034942 -0.888352 -0.457831
vn -0.034942 -0.888352 -0.457831
vn 0.780485 -0.233606 0.579890
vn 0.780485 -0.233606 0.579890
vn 0.780485 -0.233606 0.579890
vn 0.780485 -0.233606 0.579890
s off
g CubeFBXASC046001 SpaceFBXASC032Cone
f 9//25 10//26 11//27
f 11//28 10//29 12//30
f 12//31 10//32 13//33
f 13//34 10//35 9//36
f 9//37 11//38 12//39 13//40
g default
v -101.179661 151.211242 190.961505
v 104.427292 179.828822 273.855201
v -163.773779 235.928872 159.201358
v -315.586777 230.941757 45.919290
v -141.204840 171.758585 90.564298
v 118.375546 140.169738 231.435522
v 17.092532 277.246586 180.044197
v -242.487854 308.835433 39.172973
v -228.539600 269.176349 -3.246706
v 39.661471 213.076299 111.407137
v 191.474469 218.063414 224.689205
v -22.932647 297.793929 79.646990
vn -0.380843 0.064412 0.922394
vn -0.380843 0.064412 0.922394
vn -0.380843 0.064412 0.922394
vn -0.156730 -0.746634 0.646509
vn -0.156730 -0.746634 0.646509
vn -0.156730 -0.746634 0.646509
vn -0.589500 -0.137123 0.796045
vn -0.589500 -0.137123 0.796045
vn -0.589500 -0.137123 0.796045
vn -0.303621 -0.949963 -0.073376
vn -0.303621 -0.949963 -0.073376
vn -0.303621 -0.949963 -0.073376
vn -0.013296 -0.980634 -0.195396
vn -0.013296 -0.980634 -0.195396
vn -0.013296 -0.980634 -0.195396
vn 0.581856 -0.489808 0.649255
vn 0.581856 -0.489808 0.649255
vn 0.581856 -0.489808 0.649255
vn -0.220899 0.566484 0.793914
vn -0.220899 0.566484 0.793914
vn -0.220899 0.566484 0.793914
vn -0.514501 0.540487 0.665705
vn -0.514501 0.540487 0.665705
vn -0.514501 0.540487 0.665705
vn -0.069866 -0.723742 -0.686525
vn -0.069866 -0.723742 -0.686525
vn -0.069866 -0.723742 -0.686525
vn 0.242305 -0.750546 -0.614792
vn 0.242305 -0.750546 -0.614792
vn 0.242305 -0.750546 -0.614792
vn 0.069866 0.723742 0.686525
vn 0.069866 0.723742 0.686525
vn 0.069866 0.723742 0.686525
vn -0.242305 0.750546 0.614792
vn -0.242305 0.750546 0.614792
vn -0.242305 0.750546 0.614792
vn -0.581856 0.489808 -0.649255
vn -0.581856 0.489808 -0.649255
vn -0.581856 0.489808 -0.649255
vn 0.220899 -0.566484 -0.793914
vn 0.220899 -0.566484 -0.793914
vn 0.220899 -0.566484 -0.793914
vn 0.514501 -0.540487 -0.665705
vn 0.514501 -0.540487 -0.665705
vn 0.514501 -0.540487 -0.665705
vn 0.303621 0.949963 0.073376
vn 0.303621 0.949963 0.073376
vn 0.303621 0.949963 0.073376
vn 0.013296 0.980634 0.195396
vn 0.013296 0.980634 0.195396
vn 0.013296 0.980634 0.195396
vn 0.156730 0.746634 -0.646509
vn 0.156730 0.746634 -0.646509
vn 0.156730 0.746634 -0.646509
vn 0.380843 -0.064412 -0.922394
vn 0.380843 -0.064412 -0.922394
vn 0.380843 -0.064412 -0.922394
vn 0.589500 0.137123 -0.796045
vn 0.589500 0.137123 -0.796045
vn 0.589500 0.137123 -0.796045
s off
g CubeFBXASC046001 IcoFBXASC046FBXASC032FBXASC046Sphere
f 14//41 15//42 16//43
f 15//44 14//45 19//46
f 14//47 16//48 17//49
f 14//50 17//51 18//52
f 14//53 18//54 19//55
f 15//56 19//57 24//58
f 16//59 15//60 20//61
f 17//62 16//63 21//64
f 18//65 17//66 22//67
f 19//68 18//69 23//70
f 15//71 24//72 20//73
f 16//74 20//75 21//76
f 17//77 21//78 22//79
f 18//80 22//81 23//82
f 19//83 23//84 24//85
f 20//86 24//87 25//88
f 21//89 20//90 25//91
f 22//92 21//93 25//94
f 23//95 22//96 25//97
f 24//98 23//99 25//100
g default
v -152.919693 371.478976 111.425983
v 27.280693 286.450085 89.921433
v -27.280650 454.809441 -89.921519
v 152.919736 369.780550 -111.426068
vn 0.408272 0.724935 0.554782
vn 0.408272 0.724935 0.554782
vn 0.408272 0.724935 0.554782
vn 0.408272 0.724935 0.554782
s off
g CubeFBXASC046001 SpaceFBXASC032Cone DeepFBXASC032Plane
f 26//101 27//102 29//103 28//104

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -0,0 +1,664 @@
# ufbx:bad_uvs
# Blender v2.79 (sub 0) OBJ File: ''
# www.blender.org
g Skin_Cube.001
v -0.937500 5.250000 0.000000
v -0.875000 5.250000 0.375000
v -0.937500 5.625000 0.000000
v -0.875000 5.250000 -0.375000
v -0.937500 4.875000 0.000000
v -0.875000 4.875000 0.375000
v -0.875000 5.625000 0.375000
v -0.875000 5.625000 -0.375000
v -0.875000 4.875000 -0.375000
v 0.031250 5.250000 -0.968750
v -0.375000 5.250000 -0.875000
v 0.031250 5.625000 -0.968750
v 0.500000 5.250000 -1.000000
v 0.031250 4.875000 -0.968750
v -0.375000 4.875000 -0.875000
v -0.375000 5.625000 -0.875000
v 0.500000 5.625000 -1.000000
v 0.500000 4.875000 -1.000000
v 0.968750 5.250000 -0.031250
v 1.000000 5.250000 -0.500000
v 0.968750 5.625000 -0.031250
v 0.875000 5.250000 0.375000
v 0.968750 4.875000 -0.031250
v 1.000000 4.875000 -0.500000
v 1.000000 5.625000 -0.500000
v 0.875000 5.625000 0.375000
v 0.875000 4.875000 0.375000
v 0.000000 5.250000 0.937500
v 0.375000 5.250000 0.875000
v 0.000000 5.625000 0.937500
v -0.375000 5.250000 0.875000
v 0.000000 4.875000 0.937500
v 0.375000 4.875000 0.875000
v 0.375000 5.625000 0.875000
v -0.375000 5.625000 0.875000
v -0.375000 4.875000 0.875000
v 0.000000 0.091146 0.000000
v 0.000000 0.135417 -0.350694
v 0.350694 0.135417 0.000000
v 0.000000 0.135417 0.350694
v -0.350694 0.135417 0.000000
v -0.326389 0.177083 -0.326389
v 0.326389 0.177083 -0.326389
v 0.326389 0.177083 0.326389
v -0.326389 0.177083 0.326389
v 0.003906 6.000000 -0.003906
v 0.015625 6.000000 -0.484375
v -0.468750 6.000000 0.000000
v 0.000000 6.000000 0.468750
v 0.484375 6.000000 -0.015625
v 0.500000 6.000000 -0.500000
v -0.437500 6.000000 -0.437500
v -0.437500 6.000000 0.437500
v 0.437500 6.000000 0.437500
v 0.000000 0.777995 0.907986
v 0.362847 0.782552 0.847222
v 0.000000 1.125000 0.937500
v -0.362847 0.782552 0.847222
v 0.000000 0.486979 0.819444
v 0.326389 0.505208 0.763889
v 0.375000 1.125000 0.875000
v -0.375000 1.125000 0.875000
v -0.326389 0.505208 0.763889
v 0.000000 2.250000 0.937500
v 0.375000 2.250000 0.875000
v 0.000000 2.625000 0.937500
v -0.375000 2.250000 0.875000
v 0.000000 1.875000 0.937500
v 0.375000 1.875000 0.875000
v 0.375000 2.625000 0.875000
v -0.375000 2.625000 0.875000
v -0.375000 1.875000 0.875000
v 0.000000 3.750000 0.937500
v 0.375000 3.750000 0.875000
v 0.000000 4.125000 0.937500
v -0.375000 3.750000 0.875000
v 0.000000 3.375000 0.937500
v 0.375000 3.375000 0.875000
v 0.375000 4.125000 0.875000
v -0.375000 4.125000 0.875000
v -0.375000 3.375000 0.875000
v 0.935330 0.777995 -0.027344
v 0.956597 0.782552 -0.472222
v 0.968750 1.125000 -0.031250
v 0.847222 0.782552 0.362847
v 0.835069 0.486979 -0.015625
v 0.826389 0.505208 -0.388889
v 1.000000 1.125000 -0.500000
v 0.875000 1.125000 0.375000
v 0.763889 0.505208 0.326389
v 0.968750 2.250000 -0.031250
v 1.000000 2.250000 -0.500000
v 0.968750 2.625000 -0.031250
v 0.875000 2.250000 0.375000
v 0.968750 1.875000 -0.031250
v 1.000000 1.875000 -0.500000
v 1.000000 2.625000 -0.500000
v 0.875000 2.625000 0.375000
v 0.875000 1.875000 0.375000
v 0.968750 3.750000 -0.031250
v 1.000000 3.750000 -0.500000
v 0.968750 4.125000 -0.031250
v 0.875000 3.750000 0.375000
v 0.968750 3.375000 -0.031250
v 1.000000 3.375000 -0.500000
v 1.000000 4.125000 -0.500000
v 0.875000 4.125000 0.375000
v 0.875000 3.375000 0.375000
v 0.027344 0.777995 -0.935330
v -0.362847 0.782552 -0.847222
v 0.031250 1.125000 -0.968750
v 0.472222 0.782552 -0.956597
v 0.015625 0.486979 -0.835069
v -0.326389 0.505208 -0.763889
v -0.375000 1.125000 -0.875000
v 0.500000 1.125000 -1.000000
v 0.388889 0.505208 -0.826389
v 0.031250 2.250000 -0.968750
v -0.375000 2.250000 -0.875000
v 0.031250 2.625000 -0.968750
v 0.500000 2.250000 -1.000000
v 0.031250 1.875000 -0.968750
v -0.375000 1.875000 -0.875000
v -0.375000 2.625000 -0.875000
v 0.500000 2.625000 -1.000000
v 0.500000 1.875000 -1.000000
v 0.031250 3.750000 -0.968750
v -0.375000 3.750000 -0.875000
v 0.031250 4.125000 -0.968750
v 0.500000 3.750000 -1.000000
v 0.031250 3.375000 -0.968750
v -0.375000 3.375000 -0.875000
v -0.375000 4.125000 -0.875000
v 0.500000 4.125000 -1.000000
v 0.500000 3.375000 -1.000000
v -0.907986 0.777995 0.000000
v -0.847222 0.782552 0.362847
v -0.937500 1.125000 0.000000
v -0.847222 0.782552 -0.362847
v -0.819444 0.486979 0.000000
v -0.763889 0.505208 0.326389
v -0.875000 1.125000 0.375000
v -0.875000 1.125000 -0.375000
v -0.763889 0.505208 -0.326389
v -0.937500 2.250000 0.000000
v -0.875000 2.250000 0.375000
v -0.937500 2.625000 0.000000
v -0.875000 2.250000 -0.375000
v -0.937500 1.875000 0.000000
v -0.875000 1.875000 0.375000
v -0.875000 2.625000 0.375000
v -0.875000 2.625000 -0.375000
v -0.875000 1.875000 -0.375000
v -0.937500 3.750000 0.000000
v -0.875000 3.750000 0.375000
v -0.937500 4.125000 0.000000
v -0.875000 3.750000 -0.375000
v -0.937500 3.375000 0.000000
v -0.875000 3.375000 0.375000
v -0.875000 4.125000 0.375000
v -0.875000 4.125000 -0.375000
v -0.875000 3.375000 -0.375000
v -0.598958 0.300781 -0.302083
v -0.643229 0.267578 0.000000
v -0.598958 0.300781 0.302083
v -0.687500 4.875000 0.687500
v -0.687500 5.250000 0.687500
v -0.687500 5.625000 0.687500
v -0.875000 6.000000 0.375000
v -0.937500 6.000000 0.000000
v -0.875000 6.000000 -0.375000
v -0.687500 1.125000 -0.687500
v -0.665365 0.787109 -0.665365
v -0.598958 0.523438 -0.598958
v 0.317708 0.300781 -0.614583
v 0.003906 0.267578 -0.647135
v -0.302083 0.300781 -0.598958
v -0.375000 6.000000 -0.875000
v 0.031250 6.000000 -0.968750
v 0.500000 6.000000 -1.000000
v 1.000000 1.125000 -1.000000
v 0.944444 0.791667 -0.944444
v 0.777778 0.541667 -0.777778
v 0.598958 0.300781 0.302083
v 0.647135 0.267578 -0.003906
v 0.614583 0.300781 -0.317708
v 1.000000 6.000000 -0.500000
v 0.968750 6.000000 -0.031250
v 0.875000 6.000000 0.375000
v 0.687500 1.125000 0.687500
v 0.665365 0.787109 0.665365
v 0.598958 0.523438 0.598958
v -0.302083 0.300781 0.598958
v 0.000000 0.267578 0.643229
v 0.302083 0.300781 0.598958
v 0.375000 6.000000 0.875000
v 0.000000 6.000000 0.937500
v -0.375000 6.000000 0.875000
v -0.598958 0.523438 0.598958
v -0.665365 0.787109 0.665365
v -0.687500 1.125000 0.687500
v -0.687500 1.875000 0.687500
v -0.687500 2.250000 0.687500
v -0.687500 2.625000 0.687500
v -0.687500 3.375000 0.687500
v -0.687500 3.750000 0.687500
v -0.687500 4.125000 0.687500
v -0.687500 5.625000 -0.687500
v -0.687500 5.250000 -0.687500
v -0.687500 4.875000 -0.687500
v -0.687500 4.125000 -0.687500
v -0.687500 3.750000 -0.687500
v -0.687500 3.375000 -0.687500
v -0.687500 2.625000 -0.687500
v -0.687500 2.250000 -0.687500
v -0.687500 1.875000 -0.687500
v 1.000000 5.625000 -1.000000
v 1.000000 5.250000 -1.000000
v 1.000000 4.875000 -1.000000
v 1.000000 4.125000 -1.000000
v 1.000000 3.750000 -1.000000
v 1.000000 3.375000 -1.000000
v 1.000000 2.625000 -1.000000
v 1.000000 2.250000 -1.000000
v 1.000000 1.875000 -1.000000
v 0.687500 5.625000 0.687500
v 0.687500 5.250000 0.687500
v 0.687500 4.875000 0.687500
v 0.687500 4.125000 0.687500
v 0.687500 3.750000 0.687500
v 0.687500 3.375000 0.687500
v 0.687500 2.625000 0.687500
v 0.687500 2.250000 0.687500
v 0.687500 1.875000 0.687500
v 0.375000 1.500000 0.875000
v 0.000000 1.500000 0.937500
v -0.375000 1.500000 0.875000
v 0.375000 3.000000 0.875000
v 0.000000 3.000000 0.937500
v -0.375000 3.000000 0.875000
v 0.375000 4.500000 0.875000
v 0.000000 4.500000 0.937500
v -0.375000 4.500000 0.875000
v 1.000000 1.500000 -0.500000
v 0.968750 1.500000 -0.031250
v 0.875000 1.500000 0.375000
v 1.000000 3.000000 -0.500000
v 0.968750 3.000000 -0.031250
v 0.875000 3.000000 0.375000
v 1.000000 4.500000 -0.500000
v 0.968750 4.500000 -0.031250
v 0.875000 4.500000 0.375000
v -0.375000 1.500000 -0.875000
v 0.031250 1.500000 -0.968750
v 0.500000 1.500000 -1.000000
v -0.375000 3.000000 -0.875000
v 0.031250 3.000000 -0.968750
v 0.500000 3.000000 -1.000000
v -0.375000 4.500000 -0.875000
v 0.031250 4.500000 -0.968750
v 0.500000 4.500000 -1.000000
v -0.875000 1.500000 0.375000
v -0.937500 1.500000 0.000000
v -0.875000 1.500000 -0.375000
v -0.875000 3.000000 0.375000
v -0.937500 3.000000 0.000000
v -0.875000 3.000000 -0.375000
v -0.875000 4.500000 0.375000
v -0.937500 4.500000 0.000000
v -0.875000 4.500000 -0.375000
v -0.509259 0.368056 0.509259
v -0.687500 6.000000 0.687500
v -0.509259 0.368056 -0.509259
v -0.687500 6.000000 -0.687500
v 0.509259 0.368056 0.509259
v 0.687500 6.000000 0.687500
v 0.550926 0.368056 -0.550926
v 1.000000 6.000000 -1.000000
v -0.687500 1.500000 0.687500
v -0.687500 3.000000 0.687500
v -0.687500 4.500000 0.687500
v -0.687500 4.500000 -0.687500
v -0.687500 3.000000 -0.687500
v -0.687500 1.500000 -0.687500
v 1.000000 4.500000 -1.000000
v 1.000000 3.000000 -1.000000
v 1.000000 1.500000 -1.000000
v 0.687500 4.500000 0.687500
v 0.687500 3.000000 0.687500
v 0.687500 1.500000 0.687500
vn -0.9864 0.0000 0.1644
vn -0.8575 0.0000 0.5145
vn -0.9864 0.0000 -0.1644
vn -0.8575 0.0000 -0.5145
vn -0.2249 0.0000 -0.9744
vn -0.5145 0.0000 -0.8575
vn -0.0665 0.0000 -0.9978
vn 0.0000 0.0000 -1.0000
vn 0.9978 0.0000 0.0665
vn 1.0000 0.0000 0.0000
vn 0.9744 0.0000 0.2249
vn 0.8575 0.0000 0.5145
vn 0.1644 0.0000 0.9864
vn 0.5145 0.0000 0.8575
vn -0.1644 0.0000 0.9864
vn -0.5145 0.0000 0.8575
vn -0.1294 -0.9831 -0.1294
vn -0.1535 -0.8984 -0.4116
vn -0.4131 -0.8979 -0.1520
vn -0.4200 -0.8044 -0.4200
vn 0.1294 -0.9831 -0.1294
vn 0.3979 -0.9065 -0.1413
vn 0.1413 -0.9065 -0.3979
vn 0.3644 -0.8570 -0.3644
vn 0.1294 -0.9831 0.1294
vn 0.1520 -0.8979 0.4131
vn 0.4116 -0.8984 0.1535
vn 0.4200 -0.8044 0.4200
vn -0.1294 -0.9831 0.1294
vn -0.4131 -0.8979 0.1520
vn -0.1520 -0.8979 0.4131
vn -0.4200 -0.8044 0.4200
vn 0.0000 1.0000 0.0000
vn 0.1685 -0.2952 0.9405
vn 0.4988 -0.3180 0.8063
vn 0.1722 -0.6236 0.7625
vn 0.4545 -0.6060 0.6528
vn 0.1647 -0.0846 0.9827
vn 0.5133 -0.0885 0.8536
vn -0.1647 -0.0846 0.9827
vn -0.5133 -0.0885 0.8536
vn -0.1685 -0.2952 0.9405
vn -0.1722 -0.6236 0.7625
vn -0.4988 -0.3180 0.8063
vn -0.4545 -0.6060 0.6528
vn 0.9269 -0.3752 0.0038
vn 0.8498 -0.5199 -0.0875
vn 0.7149 -0.6928 -0.0948
vn 0.5396 -0.8092 -0.2323
vn 0.9925 -0.1080 0.0565
vn 0.9891 -0.1465 -0.0137
vn 0.9709 -0.0888 0.2222
vn 0.8536 -0.0885 0.5133
vn 0.9274 -0.3088 0.2114
vn 0.7520 -0.6317 0.1886
vn 0.8063 -0.3180 0.4988
vn 0.6528 -0.6060 0.4545
vn -0.2114 -0.3088 -0.9274
vn -0.4988 -0.3180 -0.8063
vn -0.1886 -0.6317 -0.7520
vn -0.4545 -0.6060 -0.6528
vn -0.2222 -0.0888 -0.9709
vn -0.5133 -0.0885 -0.8536
vn -0.0565 -0.1080 -0.9925
vn 0.0137 -0.1465 -0.9891
vn -0.0038 -0.3752 -0.9269
vn 0.0948 -0.6928 -0.7149
vn 0.0875 -0.5199 -0.8498
vn 0.2323 -0.8092 -0.5396
vn -0.9405 -0.2952 0.1685
vn -0.8063 -0.3180 0.4988
vn -0.7625 -0.6236 0.1722
vn -0.6528 -0.6060 0.4545
vn -0.9827 -0.0846 0.1647
vn -0.8536 -0.0885 0.5133
vn -0.9827 -0.0846 -0.1647
vn -0.8536 -0.0885 -0.5133
vn -0.9405 -0.2952 -0.1685
vn -0.7625 -0.6236 -0.1722
vn -0.8063 -0.3180 -0.4988
vn -0.6528 -0.6060 -0.4545
s off
f 1//1 5//1 6//1 2//1
f 2//2 6//2 166//2 167//2
f 5//1 269//1 268//1 6//1
f 6//2 268//2 281//2 166//2
f 1//1 2//1 7//1 3//1
f 3//1 7//1 169//1 170//1
f 2//2 167//2 168//2 7//2
f 7//2 168//2 272//2 169//2
f 1//3 3//3 8//3 4//3
f 4//4 8//4 208//4 209//4
f 3//3 170//3 171//3 8//3
f 8//4 171//4 274//4 208//4
f 1//3 4//3 9//3 5//3
f 5//3 9//3 270//3 269//3
f 4//4 209//4 210//4 9//4
f 9//4 210//4 282//4 270//4
f 10//5 14//5 15//5 11//5
f 11//6 15//6 210//6 209//6
f 14//5 260//5 259//5 15//5
f 15//6 259//6 282//6 210//6
f 10//5 11//5 16//5 12//5
f 12//5 16//5 178//5 179//5
f 11//6 209//6 208//6 16//6
f 16//6 208//6 274//6 178//6
f 10//7 12//7 17//7 13//7
f 13//8 17//8 217//8 218//8
f 12//7 179//7 180//7 17//7
f 17//8 180//8 278//8 217//8
f 10//7 13//7 18//7 14//7
f 14//7 18//7 261//7 260//7
f 13//8 218//8 219//8 18//8
f 18//8 219//8 285//8 261//8
f 19//9 23//9 24//9 20//9
f 20//10 24//10 219//10 218//10
f 23//9 251//9 250//9 24//9
f 24//10 250//10 285//10 219//10
f 19//9 20//9 25//9 21//9
f 21//9 25//9 187//9 188//9
f 20//10 218//10 217//10 25//10
f 25//10 217//10 278//10 187//10
f 19//11 21//11 26//11 22//11
f 22//12 26//12 226//12 227//12
f 21//11 188//11 189//11 26//11
f 26//12 189//12 276//12 226//12
f 19//11 22//11 27//11 23//11
f 23//11 27//11 252//11 251//11
f 22//12 227//12 228//12 27//12
f 27//12 228//12 288//12 252//12
f 28//13 32//13 33//13 29//13
f 29//14 33//14 228//14 227//14
f 32//13 242//13 241//13 33//13
f 33//14 241//14 288//14 228//14
f 28//13 29//13 34//13 30//13
f 30//13 34//13 196//13 197//13
f 29//14 227//14 226//14 34//14
f 34//14 226//14 276//14 196//14
f 28//15 30//15 35//15 31//15
f 31//16 35//16 168//16 167//16
f 30//15 197//15 198//15 35//15
f 35//16 198//16 272//16 168//16
f 28//15 31//15 36//15 32//15
f 32//15 36//15 243//15 242//15
f 31//16 167//16 166//16 36//16
f 36//16 166//16 281//16 243//16
f 37//17 41//17 42//17 38//17
f 38//18 42//18 177//18 176//18
f 41//19 164//19 163//19 42//19
f 42//20 163//20 273//20 177//20
f 37//21 38//21 43//21 39//21
f 39//22 43//22 186//22 185//22
f 38//23 176//23 175//23 43//23
f 43//24 175//24 277//24 186//24
f 37//25 39//25 44//25 40//25
f 40//26 44//26 195//26 194//26
f 39//27 185//27 184//27 44//27
f 44//28 184//28 275//28 195//28
f 37//29 40//29 45//29 41//29
f 41//30 45//30 165//30 164//30
f 40//31 194//31 193//31 45//31
f 45//32 193//32 271//32 165//32
f 46//33 50//33 51//33 47//33
f 47//33 51//33 180//33 179//33
f 50//33 188//33 187//33 51//33
f 51//33 187//33 278//33 180//33
f 46//33 47//33 52//33 48//33
f 48//33 52//33 171//33 170//33
f 47//33 179//33 178//33 52//33
f 52//33 178//33 274//33 171//33
f 46//33 48//33 53//33 49//33
f 49//33 53//33 198//33 197//33
f 48//33 170//33 169//33 53//33
f 53//33 169//33 272//33 198//33
f 46//33 49//33 54//33 50//33
f 50//33 54//33 189//33 188//33
f 49//33 197//33 196//33 54//33
f 54//33 196//33 276//33 189//33
f 55//34 59//34 60//34 56//34
f 56//35 60//35 192//35 191//35
f 59//36 194//36 195//36 60//36
f 60//37 195//37 275//37 192//37
f 55//38 56//38 61//38 57//38
f 57//13 61//13 235//13 236//13
f 56//39 191//39 190//39 61//39
f 61//14 190//14 290//14 235//14
f 55//40 57//40 62//40 58//40
f 58//41 62//41 201//41 200//41
f 57//15 236//15 237//15 62//15
f 62//16 237//16 279//16 201//16
f 55//42 58//42 63//42 59//42
f 59//43 63//43 193//43 194//43
f 58//44 200//44 199//44 63//44
f 63//45 199//45 271//45 193//45
f 64//13 68//13 69//13 65//13
f 65//14 69//14 234//14 233//14
f 68//13 236//13 235//13 69//13
f 69//14 235//14 290//14 234//14
f 64//13 65//13 70//13 66//13
f 66//13 70//13 238//13 239//13
f 65//14 233//14 232//14 70//14
f 70//14 232//14 289//14 238//14
f 64//15 66//15 71//15 67//15
f 67//16 71//16 204//16 203//16
f 66//15 239//15 240//15 71//15
f 71//16 240//16 280//16 204//16
f 64//15 67//15 72//15 68//15
f 68//15 72//15 237//15 236//15
f 67//16 203//16 202//16 72//16
f 72//16 202//16 279//16 237//16
f 73//13 77//13 78//13 74//13
f 74//14 78//14 231//14 230//14
f 77//13 239//13 238//13 78//13
f 78//14 238//14 289//14 231//14
f 73//13 74//13 79//13 75//13
f 75//13 79//13 241//13 242//13
f 74//14 230//14 229//14 79//14
f 79//14 229//14 288//14 241//14
f 73//15 75//15 80//15 76//15
f 76//16 80//16 207//16 206//16
f 75//15 242//15 243//15 80//15
f 80//16 243//16 281//16 207//16
f 73//15 76//15 81//15 77//15
f 77//15 81//15 240//15 239//15
f 76//16 206//16 205//16 81//16
f 81//16 205//16 280//16 240//16
f 82//46 86//46 87//46 83//46
f 83//47 87//47 183//47 182//47
f 86//48 185//48 186//48 87//48
f 87//49 186//49 277//49 183//49
f 82//50 83//50 88//50 84//50
f 84//9 88//9 244//9 245//9
f 83//51 182//51 181//51 88//51
f 88//10 181//10 287//10 244//10
f 82//52 84//52 89//52 85//52
f 85//53 89//53 190//53 191//53
f 84//11 245//11 246//11 89//11
f 89//12 246//12 290//12 190//12
f 82//54 85//54 90//54 86//54
f 86//55 90//55 184//55 185//55
f 85//56 191//56 192//56 90//56
f 90//57 192//57 275//57 184//57
f 91//9 95//9 96//9 92//9
f 92//10 96//10 225//10 224//10
f 95//9 245//9 244//9 96//9
f 96//10 244//10 287//10 225//10
f 91//9 92//9 97//9 93//9
f 93//9 97//9 247//9 248//9
f 92//10 224//10 223//10 97//10
f 97//10 223//10 286//10 247//10
f 91//11 93//11 98//11 94//11
f 94//12 98//12 232//12 233//12
f 93//11 248//11 249//11 98//11
f 98//12 249//12 289//12 232//12
f 91//11 94//11 99//11 95//11
f 95//11 99//11 246//11 245//11
f 94//12 233//12 234//12 99//12
f 99//12 234//12 290//12 246//12
f 100//9 104//9 105//9 101//9
f 101//10 105//10 222//10 221//10
f 104//9 248//9 247//9 105//9
f 105//10 247//10 286//10 222//10
f 100//9 101//9 106//9 102//9
f 102//9 106//9 250//9 251//9
f 101//10 221//10 220//10 106//10
f 106//10 220//10 285//10 250//10
f 100//11 102//11 107//11 103//11
f 103//12 107//12 229//12 230//12
f 102//11 251//11 252//11 107//11
f 107//12 252//12 288//12 229//12
f 100//11 103//11 108//11 104//11
f 104//11 108//11 249//11 248//11
f 103//12 230//12 231//12 108//12
f 108//12 231//12 289//12 249//12
f 109//58 113//58 114//58 110//58
f 110//59 114//59 174//59 173//59
f 113//60 176//60 177//60 114//60
f 114//61 177//61 273//61 174//61
f 109//62 110//62 115//62 111//62
f 111//5 115//5 253//5 254//5
f 110//63 173//63 172//63 115//63
f 115//6 172//6 284//6 253//6
f 109//64 111//64 116//64 112//64
f 112//65 116//65 181//65 182//65
f 111//7 254//7 255//7 116//7
f 116//8 255//8 287//8 181//8
f 109//66 112//66 117//66 113//66
f 113//67 117//67 175//67 176//67
f 112//68 182//68 183//68 117//68
f 117//69 183//69 277//69 175//69
f 118//5 122//5 123//5 119//5
f 119//6 123//6 216//6 215//6
f 122//5 254//5 253//5 123//5
f 123//6 253//6 284//6 216//6
f 118//5 119//5 124//5 120//5
f 120//5 124//5 256//5 257//5
f 119//6 215//6 214//6 124//6
f 124//6 214//6 283//6 256//6
f 118//7 120//7 125//7 121//7
f 121//8 125//8 223//8 224//8
f 120//7 257//7 258//7 125//7
f 125//8 258//8 286//8 223//8
f 118//7 121//7 126//7 122//7
f 122//7 126//7 255//7 254//7
f 121//8 224//8 225//8 126//8
f 126//8 225//8 287//8 255//8
f 127//5 131//5 132//5 128//5
f 128//6 132//6 213//6 212//6
f 131//5 257//5 256//5 132//5
f 132//6 256//6 283//6 213//6
f 127//5 128//5 133//5 129//5
f 129//5 133//5 259//5 260//5
f 128//6 212//6 211//6 133//6
f 133//6 211//6 282//6 259//6
f 127//7 129//7 134//7 130//7
f 130//8 134//8 220//8 221//8
f 129//7 260//7 261//7 134//7
f 134//8 261//8 285//8 220//8
f 127//7 130//7 135//7 131//7
f 131//7 135//7 258//7 257//7
f 130//8 221//8 222//8 135//8
f 135//8 222//8 286//8 258//8
f 136//70 140//70 141//70 137//70
f 137//71 141//71 199//71 200//71
f 140//72 164//72 165//72 141//72
f 141//73 165//73 271//73 199//73
f 136//74 137//74 142//74 138//74
f 138//1 142//1 262//1 263//1
f 137//75 200//75 201//75 142//75
f 142//2 201//2 279//2 262//2
f 136//76 138//76 143//76 139//76
f 139//77 143//77 172//77 173//77
f 138//3 263//3 264//3 143//3
f 143//4 264//4 284//4 172//4
f 136//78 139//78 144//78 140//78
f 140//79 144//79 163//79 164//79
f 139//80 173//80 174//80 144//80
f 144//81 174//81 273//81 163//81
f 145//1 149//1 150//1 146//1
f 146//2 150//2 202//2 203//2
f 149//1 263//1 262//1 150//1
f 150//2 262//2 279//2 202//2
f 145//1 146//1 151//1 147//1
f 147//1 151//1 265//1 266//1
f 146//2 203//2 204//2 151//2
f 151//2 204//2 280//2 265//2
f 145//3 147//3 152//3 148//3
f 148//4 152//4 214//4 215//4
f 147//3 266//3 267//3 152//3
f 152//4 267//4 283//4 214//4
f 145//3 148//3 153//3 149//3
f 149//3 153//3 264//3 263//3
f 148//4 215//4 216//4 153//4
f 153//4 216//4 284//4 264//4
f 154//1 158//1 159//1 155//1
f 155//2 159//2 205//2 206//2
f 158//1 266//1 265//1 159//1
f 159//2 265//2 280//2 205//2
f 154//1 155//1 160//1 156//1
f 156//1 160//1 268//1 269//1
f 155//2 206//2 207//2 160//2
f 160//2 207//2 281//2 268//2
f 154//3 156//3 161//3 157//3
f 157//4 161//4 211//4 212//4
f 156//3 269//3 270//3 161//3
f 161//4 270//4 282//4 211//4
f 154//3 157//3 162//3 158//3
f 158//3 162//3 267//3 266//3
f 157//4 212//4 213//4 162//4
f 162//4 213//4 283//4 267//4

View File

@@ -0,0 +1,856 @@
# ufbx:bad_uvs
# Blender v2.79 (sub 0) OBJ File: ''
# www.blender.org
g Skin_Cube.001
v -0.294501 5.250000 -0.861288
v -0.619363 5.250000 -0.686071
v -0.316787 5.625000 -0.867635
v 0.069632 5.250000 -0.921681
v -0.272291 4.875000 -0.854963
v -0.596100 4.875000 -0.689052
v -0.642710 5.625000 -0.683079
v 0.051377 5.625000 -0.936515
v 0.087828 4.875000 -0.906897
v 0.899814 5.250000 -0.275608
v 0.686066 5.250000 -0.619402
v 0.907115 5.625000 -0.298426
v 1.075758 5.250000 0.145237
v 0.892538 4.875000 -0.252869
v 0.689046 4.875000 -0.596148
v 0.683076 5.625000 -0.642734
v 1.094421 5.625000 0.124842
v 1.057163 4.875000 0.165557
v 0.333027 5.250000 0.880181
v 0.773465 5.250000 0.761644
v 0.356268 5.625000 0.885996
v -0.069632 5.250000 0.921681
v 0.309866 4.875000 0.874385
v 0.746396 4.875000 0.766743
v 0.800631 5.625000 0.756526
v -0.051377 5.625000 0.936515
v -0.087828 4.875000 0.906897
v -0.861288 5.250000 0.294501
v -0.686066 5.250000 0.619402
v -0.867635 5.625000 0.316787
v -0.921656 5.250000 -0.069663
v -0.854963 4.875000 0.272291
v -0.689046 4.875000 0.596148
v -0.683076 5.625000 0.642734
v -0.936500 5.625000 -0.051395
v -0.906866 4.875000 -0.087865
v 0.000000 0.091146 0.000000
v 0.321609 0.135417 -0.139836
v 0.139836 0.135417 0.321609
v -0.321609 0.135417 0.139836
v -0.139836 0.135417 -0.321609
v 0.169175 0.177083 -0.429464
v 0.429464 0.177083 0.169175
v -0.169175 0.177083 0.429464
v -0.429464 0.177083 -0.169175
v 0.005055 6.000000 0.002229
v 0.457221 6.000000 -0.160662
v -0.169576 6.000000 -0.437002
v -0.437002 6.000000 0.169576
v 0.189795 6.000000 0.445916
v 0.647016 6.000000 0.285254
v 0.249598 6.000000 -0.566139
v -0.566139 6.000000 -0.249598
v -0.249598 6.000000 0.566139
v -0.820926 0.777995 0.317405
v -0.639151 0.782552 0.624199
v -0.841574 1.125000 0.304798
v -0.892841 0.782552 -0.031876
v -0.746168 0.486979 0.306563
v -0.573477 0.505208 0.582971
v -0.663554 1.125000 0.621081
v -0.907405 1.125000 -0.052130
v -0.817693 0.505208 -0.011415
v -0.722380 2.250000 -0.151280
v -0.734735 2.250000 0.147743
v -0.666098 2.625000 -0.366719
v -0.613718 2.250000 -0.430135
v -0.778867 1.875000 0.064944
v -0.700968 1.875000 0.372140
v -0.768380 2.625000 -0.075839
v -0.475009 2.625000 -0.608704
v -0.752933 1.875000 -0.250916
v -0.728906 3.750000 -0.167120
v -0.747159 3.750000 0.135596
v -0.788674 4.125000 0.041139
v -0.613456 3.750000 -0.447551
v -0.669355 3.375000 -0.374624
v -0.774581 3.375000 -0.081901
v -0.719637 4.125000 0.353885
v -0.752539 4.125000 -0.277088
v -0.474878 3.375000 -0.617396
v 0.351685 0.777995 0.836089
v 0.761366 0.782552 0.699796
v 0.343010 1.125000 0.859467
v -0.031910 0.782552 0.892816
v 0.326636 0.486979 0.754551
v 0.663287 0.505208 0.607002
v 0.773988 1.125000 0.735114
v -0.052172 1.125000 0.907372
v -0.011432 0.505208 0.817680
v -0.132243 2.250000 0.751502
v 0.223921 2.250000 0.851218
v -0.356739 2.625000 0.700525
v -0.430158 2.250000 0.613701
v 0.093071 1.875000 0.802664
v 0.484694 1.875000 0.796150
v -0.035906 2.625000 0.906086
v -0.608716 2.625000 0.475000
v -0.250949 1.875000 0.752907
v -0.148394 3.750000 0.758774
v 0.210473 3.750000 0.866634
v 0.068800 4.125000 0.813592
v -0.447531 3.750000 0.613472
v -0.364800 3.375000 0.704155
v -0.042617 3.375000 0.913780
v 0.464486 4.125000 0.819315
v -0.277058 4.125000 0.752563
v -0.617386 3.375000 0.474886
v 0.855206 0.777995 -0.302241
v 0.639151 0.782552 -0.624199
v 0.879787 1.125000 -0.286905
v 1.029966 0.782552 0.092528
v 0.766242 0.486979 -0.298181
v 0.573477 0.505208 -0.582971
v 0.663554 1.125000 -0.621081
v 1.060259 1.125000 0.123698
v 0.897987 0.505208 0.044943
v 0.741417 2.250000 0.180402
v 0.734735 2.250000 -0.147743
v 0.676078 2.625000 0.401146
v 0.689867 2.250000 0.546622
v 0.806994 1.875000 -0.041147
v 0.700968 1.875000 -0.372140
v 0.768380 2.625000 0.075839
v 0.514927 2.625000 0.746412
v 0.865445 1.875000 0.346104
v 0.747632 3.750000 0.196988
v 0.747159 3.750000 -0.135596
v 0.816334 4.125000 -0.016222
v 0.688359 3.750000 0.567023
v 0.679180 3.375000 0.409424
v 0.774581 3.375000 0.081901
v 0.719637 4.125000 -0.353885
v 0.863178 4.125000 0.376760
v 0.514174 3.375000 0.756594
v -0.317405 0.777995 -0.820926
v -0.624241 0.782552 -0.639144
v -0.304798 1.125000 -0.841574
v 0.031910 0.782552 -0.892816
v -0.306563 0.486979 -0.746168
v -0.582993 0.505208 -0.573474
v -0.621134 1.125000 -0.663546
v 0.052172 1.125000 -0.907372
v 0.011432 0.505208 -0.817680
v 0.151280 2.250000 -0.722380
v -0.147772 2.250000 -0.734731
v 0.366719 2.625000 -0.666098
v 0.430158 2.250000 -0.613701
v -0.064944 1.875000 -0.778867
v -0.372182 1.875000 -0.700962
v 0.075824 2.625000 -0.768378
v 0.608716 2.625000 -0.475000
v 0.250949 1.875000 -0.752907
v 0.167120 3.750000 -0.728906
v -0.135571 3.750000 -0.747162
v -0.041139 4.125000 -0.788674
v 0.447531 3.750000 -0.613472
v 0.374624 3.375000 -0.669355
v 0.081914 3.375000 -0.774582
v -0.353847 4.125000 -0.719642
v 0.277058 4.125000 -0.752563
v 0.617386 3.375000 -0.474886
v 0.038200 0.300781 -0.669736
v -0.256482 0.267578 -0.589882
v -0.515859 0.300781 -0.428830
v -0.826610 4.875000 -0.427316
v -0.847543 5.250000 -0.415664
v -0.868555 5.625000 -0.403966
v -0.666143 6.000000 -0.680076
v -0.339152 6.000000 -0.874004
v 0.033060 6.000000 -0.951398
v 0.393663 1.125000 -0.840626
v 0.368998 0.787109 -0.834122
v 0.321333 0.523438 -0.769456
v 0.690295 0.300781 0.046299
v 0.595022 0.267578 -0.254457
v 0.428830 0.300781 -0.515859
v 0.680076 6.000000 -0.666143
v 0.914442 6.000000 -0.321323
v 1.113152 6.000000 0.104374
v 1.222865 1.125000 0.572521
v 1.184090 0.791667 0.523708
v 0.999229 0.541667 0.417238
v -0.038200 0.300781 0.669736
v 0.261622 0.267578 0.591907
v 0.536418 0.300781 0.436929
v 0.827897 6.000000 0.751390
v 0.379590 6.000000 0.891832
v -0.033060 6.000000 0.951398
v -0.393663 1.125000 0.840626
v -0.368998 0.787109 0.834122
v -0.321333 0.523438 0.769456
v -0.669736 0.300781 -0.038200
v -0.589882 0.267578 0.256482
v -0.428830 0.300781 0.515859
v -0.680076 6.000000 0.666143
v -0.874004 6.000000 0.339152
v -0.951398 6.000000 -0.033060
v -0.769495 0.523438 -0.321310
v -0.834196 0.787109 -0.368954
v -0.840720 1.125000 -0.393608
v -0.618832 1.875000 -0.523522
v -0.418832 2.250000 -0.640669
v -0.219558 2.625000 -0.757391
v -0.216125 3.375000 -0.765592
v -0.411953 3.750000 -0.657099
v -0.608495 4.125000 -0.548211
v 0.403943 5.625000 -0.868597
v 0.415624 5.250000 -0.847613
v 0.427268 4.875000 -0.826696
v 0.548173 4.125000 -0.608564
v 0.657073 3.750000 -0.411999
v 0.765579 3.375000 -0.216148
v 0.757407 2.625000 -0.219532
v 0.640699 2.250000 -0.418782
v 0.523565 1.875000 -0.618758
v 1.263353 5.625000 0.587587
v 1.232790 5.250000 0.604602
v 1.202341 4.875000 0.621551
v 0.885084 4.125000 0.797398
v 0.599205 3.750000 0.955780
v 0.314363 3.375000 1.113588
v 0.319357 2.625000 1.101660
v 0.609210 2.250000 0.931882
v 0.900119 1.875000 0.761486
v -0.403943 5.625000 0.868597
v -0.415624 5.250000 0.847613
v -0.427268 4.875000 0.826696
v -0.548173 4.125000 0.608564
v -0.657073 3.750000 0.411999
v -0.765579 3.375000 0.216148
v -0.757407 2.625000 0.219532
v -0.640699 2.250000 0.418782
v -0.523565 1.875000 0.618758
v -0.667077 1.500000 0.597357
v -0.835560 1.500000 0.281957
v -0.892656 1.500000 -0.071042
v -0.801903 3.000000 -0.298610
v -0.610020 3.000000 -0.581376
v -0.336802 3.000000 -0.786626
v -0.692016 4.500000 0.572971
v -0.848660 4.500000 0.250159
v -0.892130 4.500000 -0.106002
v 0.746418 1.500000 0.740880
v 0.319208 1.500000 0.854014
v -0.071086 1.500000 0.892622
v -0.294791 3.000000 0.960756
v -0.580422 3.000000 0.649734
v -0.786626 3.000000 0.336802
v 0.719426 4.500000 0.771824
v 0.286786 4.500000 0.868610
v -0.105962 4.500000 0.892162
v 0.667077 1.500000 -0.597357
v 0.872811 1.500000 -0.263504
v 1.041663 1.500000 0.144853
v 0.801903 3.000000 0.298610
v 0.610975 3.000000 0.621090
v 0.340621 3.000000 0.945479
v 0.692016 4.500000 -0.572971
v 0.885287 4.500000 -0.230209
v 1.038635 4.500000 0.185804
v -0.597411 1.500000 -0.667069
v -0.281957 1.500000 -0.835560
v 0.071086 1.500000 -0.892622
v 0.298610 3.000000 -0.801903
v 0.581376 3.000000 -0.610020
v 0.786626 3.000000 -0.336802
v -0.572921 4.500000 -0.692022
v -0.250159 4.500000 -0.848660
v 0.105962 4.500000 -0.892162
v -0.670086 0.368056 -0.263960
v -0.889647 6.000000 -0.392225
v 0.263960 0.368056 -0.670086
v 0.392225 6.000000 -0.889647
v -0.263960 0.368056 0.670086
v -0.392225 6.000000 0.889647
v 0.724911 0.368056 0.285557
v 1.294033 6.000000 0.570509
v -0.819562 1.500000 -0.405947
v -0.021006 3.000000 -0.873691
v -0.805755 4.500000 -0.438925
v 0.438875 4.500000 -0.805845
v 0.873691 3.000000 -0.021005
v 0.406004 1.500000 -0.819464
v 1.172008 4.500000 0.638437
v 0.030554 3.000000 1.270823
v 1.192090 1.500000 0.590468
v -0.438875 4.500000 0.805845
v -0.873691 3.000000 0.021005
v -0.406004 1.500000 0.819464
vn -0.4652 -0.0321 -0.8846
vn -0.7571 -0.0319 -0.6526
vn -0.4462 -0.0309 -0.8944
vn -0.7429 -0.0306 -0.6686
vn -0.4835 -0.0333 -0.8747
vn -0.5012 -0.0345 -0.8646
vn -0.7705 -0.0331 -0.6366
vn -0.7832 -0.0343 -0.6208
vn -0.1737 -0.0372 -0.9841
vn 0.1990 -0.0388 -0.9792
vn -0.1937 -0.0383 -0.9803
vn 0.1791 -0.0399 -0.9830
vn -0.1532 -0.0360 -0.9875
vn -0.1320 -0.0349 -0.9906
vn 0.2194 -0.0377 -0.9749
vn 0.2402 -0.0365 -0.9700
vn 0.8542 -0.0367 -0.5187
vn 0.6526 -0.0319 -0.7571
vn 0.8651 -0.0355 -0.5003
vn 0.6686 -0.0306 -0.7429
vn 0.8431 -0.0379 -0.5364
vn 0.8320 -0.0390 -0.5534
vn 0.6366 -0.0331 -0.7705
vn 0.6208 -0.0342 -0.7832
vn 0.9172 -0.0545 -0.3947
vn 0.9399 -0.0783 -0.3323
vn 0.9089 -0.0555 -0.4133
vn 0.9329 -0.0790 -0.3513
vn 0.9253 -0.0535 -0.3755
vn 0.9332 -0.0524 -0.3556
vn 0.9467 -0.0774 -0.3126
vn 0.9533 -0.0766 -0.2922
vn 0.2497 -0.0176 0.9682
vn 0.3136 0.0039 0.9496
vn 0.2289 -0.0162 0.9733
vn 0.2932 0.0056 0.9560
vn 0.2698 -0.0190 0.9627
vn 0.2894 -0.0204 0.9570
vn 0.3333 0.0022 0.9428
vn 0.3524 0.0005 0.9358
vn 0.1128 -0.0336 0.9931
vn -0.1990 -0.0388 0.9792
vn 0.1329 -0.0347 0.9905
vn -0.1791 -0.0399 0.9830
vn 0.0920 -0.0324 0.9952
vn 0.0707 -0.0312 0.9970
vn -0.2194 -0.0377 0.9749
vn -0.2402 -0.0365 0.9700
vn -0.8846 -0.0321 0.4652
vn -0.6526 -0.0319 0.7571
vn -0.8944 -0.0309 0.4461
vn -0.6686 -0.0306 0.7429
vn -0.8747 -0.0333 0.4835
vn -0.8646 -0.0345 0.5012
vn -0.6366 -0.0331 0.7705
vn -0.6208 -0.0342 0.7832
vn -0.9841 -0.0372 0.1737
vn -0.9792 -0.0389 -0.1991
vn -0.9803 -0.0383 0.1937
vn -0.9830 -0.0400 -0.1791
vn -0.9876 -0.0361 0.1531
vn -0.9906 -0.0349 0.1319
vn -0.9749 -0.0377 -0.2196
vn -0.9700 -0.0365 -0.2404
vn 0.0671 -0.9831 -0.1703
vn 0.3162 -0.8984 -0.3049
vn -0.0253 -0.8979 -0.4394
vn 0.2177 -0.8044 -0.5527
vn 0.1703 -0.9831 0.0671
vn 0.2883 -0.9065 0.3085
vn 0.4212 -0.9065 -0.0290
vn 0.4795 -0.8570 0.1889
vn -0.0671 -0.9831 0.1703
vn -0.3182 -0.8979 0.3041
vn 0.0233 -0.8984 0.4387
vn -0.2177 -0.8044 0.5527
vn -0.1703 -0.9831 -0.0671
vn -0.3041 -0.8979 -0.3182
vn -0.4394 -0.8979 0.0253
vn -0.5527 -0.8044 -0.2177
vn 0.0000 1.0000 0.0000
vn -0.8230 -0.2501 0.5100
vn -0.5743 -0.2715 0.7723
vn -0.6558 -0.5943 0.4655
vn -0.4467 -0.5699 0.6897
vn -0.8650 -0.0451 0.4998
vn -0.8763 0.0328 0.4807
vn -0.6214 -0.0487 0.7820
vn -0.6391 0.0325 0.7684
vn -0.9807 -0.0410 0.1910
vn -0.9824 -0.0424 -0.1817
vn -0.9847 0.0368 0.1705
vn -0.9786 0.0384 -0.2022
vn -0.9491 -0.2470 0.1956
vn -0.7910 -0.5942 0.1456
vn -0.9494 -0.2663 -0.1662
vn -0.8065 -0.5683 -0.1628
vn -0.9899 0.0929 0.1070
vn -0.8825 0.0843 0.4627
vn -0.9031 0.2382 0.3574
vn -0.7100 0.2338 0.6642
vn -0.9783 -0.0818 -0.1901
vn -0.8654 -0.2328 -0.4438
vn -0.9789 -0.0939 0.1815
vn -0.9645 -0.2462 -0.0954
vn -0.8661 -0.0367 -0.4985
vn -0.6234 -0.0268 -0.7815
vn -0.6806 -0.1936 -0.7066
vn -0.3747 -0.1879 -0.9079
vn -0.9662 0.1368 -0.2187
vn -0.9604 0.2752 0.0447
vn -0.8172 0.1497 -0.5565
vn -0.9061 0.2888 -0.3090
vn -0.9766 0.0729 -0.2025
vn -0.9819 0.0846 0.1694
vn -0.8676 0.2159 -0.4479
vn -0.9684 0.2289 -0.0984
vn -0.9926 -0.0893 0.0819
vn -0.9180 -0.2257 0.3260
vn -0.8942 -0.0809 0.4404
vn -0.7354 -0.2213 0.6405
vn -0.9609 -0.1319 -0.2433
vn -0.8035 -0.1444 -0.5776
vn -0.9650 -0.2621 0.0105
vn -0.8982 -0.2753 -0.3426
vn -0.8600 0.0291 -0.5094
vn -0.6808 0.1771 -0.7107
vn -0.6136 0.0194 -0.7894
vn -0.3733 0.1713 -0.9117
vn 0.3431 -0.3426 0.8746
vn 0.3996 -0.5038 0.7659
vn 0.3732 -0.6715 0.6402
vn 0.4325 -0.7964 0.4227
vn 0.2955 -0.0827 0.9517
vn 0.2667 0.0179 0.9636
vn 0.3598 -0.1422 0.9221
vn 0.3303 -0.0042 0.9439
vn 0.1327 -0.0489 0.9899
vn -0.1819 -0.0424 0.9824
vn 0.1094 0.0330 0.9934
vn -0.2024 0.0384 0.9785
vn 0.1499 -0.2639 0.9528
vn 0.1252 -0.6039 0.7871
vn -0.1663 -0.2663 0.9494
vn -0.1628 -0.5683 0.8066
vn -0.1232 -0.0850 0.9887
vn -0.0543 -0.3239 0.9445
vn 0.1440 0.0885 0.9856
vn 0.2081 -0.1385 0.9683
vn -0.3968 -0.2608 0.8800
vn -0.5976 -0.3881 0.7016
vn -0.3079 -0.4730 0.8255
vn -0.4943 -0.5595 0.6653
vn -0.5493 -0.0849 0.8313
vn -0.7815 -0.0268 0.6233
vn -0.7398 -0.2375 0.6295
vn -0.9079 -0.1879 0.3747
vn -0.2793 0.0920 0.9558
vn -0.0147 0.2393 0.9708
vn -0.5566 0.1497 0.8172
vn -0.3092 0.2887 0.9061
vn -0.4094 0.2475 0.8782
vn -0.3214 0.4571 0.8293
vn -0.6044 0.3700 0.7056
vn -0.5028 0.5426 0.6729
vn -0.1483 0.0833 0.9854
vn 0.1089 -0.0786 0.9909
vn -0.0785 0.3159 0.9455
vn 0.1733 0.1430 0.9744
vn -0.3035 -0.0884 0.9487
vn -0.5775 -0.1445 0.8035
vn -0.0494 -0.2268 0.9727
vn -0.3425 -0.2754 0.8982
vn -0.5601 0.0759 0.8250
vn -0.7446 0.2204 0.6301
vn -0.7894 0.0194 0.6136
vn -0.9117 0.1713 0.3733
vn 0.7962 -0.2602 -0.5462
vn 0.5743 -0.2715 -0.7723
vn 0.6401 -0.6019 -0.4774
vn 0.4467 -0.5699 -0.6897
vn 0.8341 -0.0445 -0.5498
vn 0.8449 0.0374 -0.5337
vn 0.6214 -0.0487 -0.7820
vn 0.6391 0.0325 -0.7684
vn 0.9141 -0.0456 -0.4029
vn 0.9396 -0.0561 -0.3376
vn 0.9184 0.0546 -0.3918
vn 0.9409 0.0791 -0.3293
vn 0.8799 -0.3148 -0.3558
vn 0.7196 -0.6647 -0.2006
vn 0.8606 -0.4446 -0.2483
vn 0.6178 -0.7863 -0.0039
vn 0.9759 0.1406 -0.1669
vn 0.8825 0.0843 -0.4627
vn 0.8691 0.2802 -0.4076
vn 0.7100 0.2338 -0.6642
vn 0.9909 -0.0350 0.1298
vn 0.8988 -0.1941 0.3930
vn 0.9789 -0.0939 -0.1815
vn 0.9645 -0.2462 0.0954
vn 0.9480 0.1448 0.2834
vn 0.8674 0.3781 0.3236
vn 0.8401 -0.0343 0.5413
vn 0.7867 0.1988 0.5845
vn 0.9505 0.3105 -0.0087
vn 0.8717 0.4220 -0.2490
vn 0.8589 0.5098 0.0493
vn 0.7954 0.5814 -0.1710
vn 0.9894 0.0274 0.1423
vn 0.9819 0.0846 -0.1694
vn 0.9006 0.1775 0.3967
vn 0.9684 0.2289 0.0984
vn 0.9805 -0.1356 -0.1422
vn 0.8865 -0.2670 -0.3778
vn 0.8942 -0.0809 -0.4404
vn 0.7354 -0.2213 -0.6405
vn 0.9534 -0.3012 0.0155
vn 0.8644 -0.4976 0.0718
vn 0.8865 -0.4074 -0.2194
vn 0.8109 -0.5672 -0.1442
vn 0.9440 -0.1472 0.2952
vn 0.8389 0.0200 0.5439
vn 0.8648 -0.3741 0.3351
vn 0.7836 -0.2076 0.5855
vn -0.5100 -0.2501 -0.8230
vn -0.7723 -0.2715 -0.5743
vn -0.4655 -0.5944 -0.6558
vn -0.6897 -0.5700 -0.4466
vn -0.4998 -0.0451 -0.8650
vn -0.4806 0.0327 -0.8763
vn -0.7819 -0.0487 -0.6214
vn -0.7684 0.0325 -0.6392
vn -0.1909 -0.0410 -0.9807
vn 0.1819 -0.0424 -0.9824
vn -0.1704 0.0367 -0.9847
vn 0.2024 0.0384 -0.9785
vn -0.1955 -0.2470 -0.9491
vn -0.1455 -0.5942 -0.7910
vn 0.1663 -0.2663 -0.9494
vn 0.1628 -0.5683 -0.8066
vn -0.1070 0.0929 -0.9899
vn -0.4628 0.0843 -0.8825
vn -0.3573 0.2382 -0.9031
vn -0.6642 0.2338 -0.7100
vn 0.1901 -0.0818 -0.9784
vn 0.4438 -0.2328 -0.8654
vn -0.1815 -0.0939 -0.9789
vn 0.0954 -0.2462 -0.9645
vn 0.4985 -0.0367 -0.8661
vn 0.7815 -0.0268 -0.6233
vn 0.7066 -0.1935 -0.6806
vn 0.9079 -0.1879 -0.3747
vn 0.2187 0.1368 -0.9662
vn -0.0447 0.2751 -0.9604
vn 0.5566 0.1497 -0.8172
vn 0.3092 0.2887 -0.9061
vn 0.2025 0.0729 -0.9766
vn -0.1693 0.0846 -0.9819
vn 0.4479 0.2159 -0.8676
vn 0.0985 0.2289 -0.9685
vn -0.0819 -0.0893 -0.9926
vn -0.3260 -0.2257 -0.9180
vn -0.4403 -0.0809 -0.8942
vn -0.6405 -0.2213 -0.7354
vn 0.2433 -0.1319 -0.9609
vn 0.5775 -0.1445 -0.8035
vn -0.0106 -0.2622 -0.9650
vn 0.3425 -0.2754 -0.8982
vn 0.5094 0.0291 -0.8600
vn 0.7107 0.1771 -0.6808
vn 0.7894 0.0194 -0.6136
vn 0.9117 0.1713 -0.3733
s off
f 1//1 5//1 6//1 2//1
f 2//2 6//2 166//2 167//2
f 5//3 269//3 268//3 6//3
f 6//4 268//4 281//4 166//4
f 1//5 2//5 7//5 3//5
f 3//6 7//6 169//6 170//6
f 2//7 167//7 168//7 7//7
f 7//8 168//8 272//8 169//8
f 1//9 3//9 8//9 4//9
f 4//10 8//10 208//10 209//10
f 3//11 170//11 171//11 8//11
f 8//12 171//12 274//12 208//12
f 1//13 4//13 9//13 5//13
f 5//14 9//14 270//14 269//14
f 4//15 209//15 210//15 9//15
f 9//16 210//16 282//16 270//16
f 10//17 14//17 15//17 11//17
f 11//18 15//18 210//18 209//18
f 14//19 260//19 259//19 15//19
f 15//20 259//20 282//20 210//20
f 10//21 11//21 16//21 12//21
f 12//22 16//22 178//22 179//22
f 11//23 209//23 208//23 16//23
f 16//24 208//24 274//24 178//24
f 10//25 12//25 17//25 13//25
f 13//26 17//26 217//26 218//26
f 12//27 179//27 180//27 17//27
f 17//28 180//28 278//28 217//28
f 10//29 13//29 18//29 14//29
f 14//30 18//30 261//30 260//30
f 13//31 218//31 219//31 18//31
f 18//32 219//32 285//32 261//32
f 19//33 23//33 24//33 20//33
f 20//34 24//34 219//34 218//34
f 23//35 251//35 250//35 24//35
f 24//36 250//36 285//36 219//36
f 19//37 20//37 25//37 21//37
f 21//38 25//38 187//38 188//38
f 20//39 218//39 217//39 25//39
f 25//40 217//40 278//40 187//40
f 19//41 21//41 26//41 22//41
f 22//42 26//42 226//42 227//42
f 21//43 188//43 189//43 26//43
f 26//44 189//44 276//44 226//44
f 19//45 22//45 27//45 23//45
f 23//46 27//46 252//46 251//46
f 22//47 227//47 228//47 27//47
f 27//48 228//48 288//48 252//48
f 28//49 32//49 33//49 29//49
f 29//50 33//50 228//50 227//50
f 32//51 242//51 241//51 33//51
f 33//52 241//52 288//52 228//52
f 28//53 29//53 34//53 30//53
f 30//54 34//54 196//54 197//54
f 29//55 227//55 226//55 34//55
f 34//56 226//56 276//56 196//56
f 28//57 30//57 35//57 31//57
f 31//58 35//58 168//58 167//58
f 30//59 197//59 198//59 35//59
f 35//60 198//60 272//60 168//60
f 28//61 31//61 36//61 32//61
f 32//62 36//62 243//62 242//62
f 31//63 167//63 166//63 36//63
f 36//64 166//64 281//64 243//64
f 37//65 41//65 42//65 38//65
f 38//66 42//66 177//66 176//66
f 41//67 164//67 163//67 42//67
f 42//68 163//68 273//68 177//68
f 37//69 38//69 43//69 39//69
f 39//70 43//70 186//70 185//70
f 38//71 176//71 175//71 43//71
f 43//72 175//72 277//72 186//72
f 37//73 39//73 44//73 40//73
f 40//74 44//74 195//74 194//74
f 39//75 185//75 184//75 44//75
f 44//76 184//76 275//76 195//76
f 37//77 40//77 45//77 41//77
f 41//78 45//78 165//78 164//78
f 40//79 194//79 193//79 45//79
f 45//80 193//80 271//80 165//80
f 46//81 50//81 51//81 47//81
f 47//81 51//81 180//81 179//81
f 50//81 188//81 187//81 51//81
f 51//81 187//81 278//81 180//81
f 46//81 47//81 52//81 48//81
f 48//81 52//81 171//81 170//81
f 47//81 179//81 178//81 52//81
f 52//81 178//81 274//81 171//81
f 46//81 48//81 53//81 49//81
f 49//81 53//81 198//81 197//81
f 48//81 170//81 169//81 53//81
f 53//81 169//81 272//81 198//81
f 46//81 49//81 54//81 50//81
f 50//81 54//81 189//81 188//81
f 49//81 197//81 196//81 54//81
f 54//81 196//81 276//81 189//81
f 55//82 59//82 60//82 56//82
f 56//83 60//83 192//83 191//83
f 59//84 194//84 195//84 60//84
f 60//85 195//85 275//85 192//85
f 55//86 56//86 61//86 57//86
f 57//87 61//87 235//87 236//87
f 56//88 191//88 190//88 61//88
f 61//89 190//89 290//89 235//89
f 55//90 57//90 62//90 58//90
f 58//91 62//91 201//91 200//91
f 57//92 236//92 237//92 62//92
f 62//93 237//93 279//93 201//93
f 55//94 58//94 63//94 59//94
f 59//95 63//95 193//95 194//95
f 58//96 200//96 199//96 63//96
f 63//97 199//97 271//97 193//97
f 64//98 68//98 69//98 65//98
f 65//99 69//99 234//99 233//99
f 68//100 236//100 235//100 69//100
f 69//101 235//101 290//101 234//101
f 64//102 65//102 70//102 66//102
f 66//103 70//103 238//103 239//103
f 65//104 233//104 232//104 70//104
f 70//105 232//105 289//105 238//105
f 64//106 66//106 71//106 67//106
f 67//107 71//107 204//107 203//107
f 66//108 239//108 240//108 71//108
f 71//109 240//109 280//109 204//109
f 64//110 67//110 72//110 68//110
f 68//111 72//111 237//111 236//111
f 67//112 203//112 202//112 72//112
f 72//113 202//113 279//113 237//113
f 73//114 77//114 78//114 74//114
f 74//115 78//115 231//115 230//115
f 77//116 239//116 238//116 78//116
f 78//117 238//117 289//117 231//117
f 73//118 74//118 79//118 75//118
f 75//119 79//119 241//119 242//119
f 74//120 230//120 229//120 79//120
f 79//121 229//121 288//121 241//121
f 73//122 75//122 80//122 76//122
f 76//123 80//123 207//123 206//123
f 75//124 242//124 243//124 80//124
f 80//125 243//125 281//125 207//125
f 73//126 76//126 81//126 77//126
f 77//127 81//127 240//127 239//127
f 76//128 206//128 205//128 81//128
f 81//129 205//129 280//129 240//129
f 82//130 86//130 87//130 83//130
f 83//131 87//131 183//131 182//131
f 86//132 185//132 186//132 87//132
f 87//133 186//133 277//133 183//133
f 82//134 83//134 88//134 84//134
f 84//135 88//135 244//135 245//135
f 83//136 182//136 181//136 88//136
f 88//137 181//137 287//137 244//137
f 82//138 84//138 89//138 85//138
f 85//139 89//139 190//139 191//139
f 84//140 245//140 246//140 89//140
f 89//141 246//141 290//141 190//141
f 82//142 85//142 90//142 86//142
f 86//143 90//143 184//143 185//143
f 85//144 191//144 192//144 90//144
f 90//145 192//145 275//145 184//145
f 91//146 95//146 96//146 92//146
f 92//147 96//147 225//147 224//147
f 95//148 245//148 244//148 96//148
f 96//149 244//149 287//149 225//149
f 91//150 92//150 97//150 93//150
f 93//151 97//151 247//151 248//151
f 92//152 224//152 223//152 97//152
f 97//153 223//153 286//153 247//153
f 91//154 93//154 98//154 94//154
f 94//155 98//155 232//155 233//155
f 93//156 248//156 249//156 98//156
f 98//157 249//157 289//157 232//157
f 91//158 94//158 99//158 95//158
f 95//159 99//159 246//159 245//159
f 94//160 233//160 234//160 99//160
f 99//161 234//161 290//161 246//161
f 100//162 104//162 105//162 101//162
f 101//163 105//163 222//163 221//163
f 104//164 248//164 247//164 105//164
f 105//165 247//165 286//165 222//165
f 100//166 101//166 106//166 102//166
f 102//167 106//167 250//167 251//167
f 101//168 221//168 220//168 106//168
f 106//169 220//169 285//169 250//169
f 100//170 102//170 107//170 103//170
f 103//171 107//171 229//171 230//171
f 102//172 251//172 252//172 107//172
f 107//173 252//173 288//173 229//173
f 100//174 103//174 108//174 104//174
f 104//175 108//175 249//175 248//175
f 103//176 230//176 231//176 108//176
f 108//177 231//177 289//177 249//177
f 109//178 113//178 114//178 110//178
f 110//179 114//179 174//179 173//179
f 113//180 176//180 177//180 114//180
f 114//181 177//181 273//181 174//181
f 109//182 110//182 115//182 111//182
f 111//183 115//183 253//183 254//183
f 110//184 173//184 172//184 115//184
f 115//185 172//185 284//185 253//185
f 109//186 111//186 116//186 112//186
f 112//187 116//187 181//187 182//187
f 111//188 254//188 255//188 116//188
f 116//189 255//189 287//189 181//189
f 109//190 112//190 117//190 113//190
f 113//191 117//191 175//191 176//191
f 112//192 182//192 183//192 117//192
f 117//193 183//193 277//193 175//193
f 118//194 122//194 123//194 119//194
f 119//195 123//195 216//195 215//195
f 122//196 254//196 253//196 123//196
f 123//197 253//197 284//197 216//197
f 118//198 119//198 124//198 120//198
f 120//199 124//199 256//199 257//199
f 119//200 215//200 214//200 124//200
f 124//201 214//201 283//201 256//201
f 118//202 120//202 125//202 121//202
f 121//203 125//203 223//203 224//203
f 120//204 257//204 258//204 125//204
f 125//205 258//205 286//205 223//205
f 118//206 121//206 126//206 122//206
f 122//207 126//207 255//207 254//207
f 121//208 224//208 225//208 126//208
f 126//209 225//209 287//209 255//209
f 127//210 131//210 132//210 128//210
f 128//211 132//211 213//211 212//211
f 131//212 257//212 256//212 132//212
f 132//213 256//213 283//213 213//213
f 127//214 128//214 133//214 129//214
f 129//215 133//215 259//215 260//215
f 128//216 212//216 211//216 133//216
f 133//217 211//217 282//217 259//217
f 127//218 129//218 134//218 130//218
f 130//219 134//219 220//219 221//219
f 129//220 260//220 261//220 134//220
f 134//221 261//221 285//221 220//221
f 127//222 130//222 135//222 131//222
f 131//223 135//223 258//223 257//223
f 130//224 221//224 222//224 135//224
f 135//225 222//225 286//225 258//225
f 136//226 140//226 141//226 137//226
f 137//227 141//227 199//227 200//227
f 140//228 164//228 165//228 141//228
f 141//229 165//229 271//229 199//229
f 136//230 137//230 142//230 138//230
f 138//231 142//231 262//231 263//231
f 137//232 200//232 201//232 142//232
f 142//233 201//233 279//233 262//233
f 136//234 138//234 143//234 139//234
f 139//235 143//235 172//235 173//235
f 138//236 263//236 264//236 143//236
f 143//237 264//237 284//237 172//237
f 136//238 139//238 144//238 140//238
f 140//239 144//239 163//239 164//239
f 139//240 173//240 174//240 144//240
f 144//241 174//241 273//241 163//241
f 145//242 149//242 150//242 146//242
f 146//243 150//243 202//243 203//243
f 149//244 263//244 262//244 150//244
f 150//245 262//245 279//245 202//245
f 145//246 146//246 151//246 147//246
f 147//247 151//247 265//247 266//247
f 146//248 203//248 204//248 151//248
f 151//249 204//249 280//249 265//249
f 145//250 147//250 152//250 148//250
f 148//251 152//251 214//251 215//251
f 147//252 266//252 267//252 152//252
f 152//253 267//253 283//253 214//253
f 145//254 148//254 153//254 149//254
f 149//255 153//255 264//255 263//255
f 148//256 215//256 216//256 153//256
f 153//257 216//257 284//257 264//257
f 154//258 158//258 159//258 155//258
f 155//259 159//259 205//259 206//259
f 158//260 266//260 265//260 159//260
f 159//261 265//261 280//261 205//261
f 154//262 155//262 160//262 156//262
f 156//263 160//263 268//263 269//263
f 155//264 206//264 207//264 160//264
f 160//265 207//265 281//265 268//265
f 154//266 156//266 161//266 157//266
f 157//267 161//267 211//267 212//267
f 156//268 269//268 270//268 161//268
f 161//269 270//269 282//269 211//269
f 154//270 157//270 162//270 158//270
f 158//271 162//271 267//271 266//271
f 157//272 212//272 213//272 162//272
f 162//273 213//273 283//273 267//273

View File

@@ -0,0 +1,844 @@
# ufbx:bad_uvs
# Blender v2.79 (sub 0) OBJ File: ''
# www.blender.org
g Skin_Cube.001
v -1.091528 4.313337 0.000001
v -1.030064 4.310006 0.375001
v -1.047250 4.709257 0.000001
v -1.030032 4.310046 -0.374999
v -1.123311 3.922210 0.000001
v -1.062235 3.919911 0.375001
v -0.985389 4.704895 0.375001
v -0.985365 4.704921 -0.374999
v -1.062209 3.919955 -0.374999
v -0.138587 4.262017 -0.968749
v -0.538189 4.283551 -0.874999
v -0.088220 4.641850 -0.968749
v 0.322490 4.237185 -0.999999
v -0.176438 3.886921 -0.968749
v -0.573497 3.901733 -0.874999
v -0.490380 4.670126 -0.874999
v 0.375810 4.609233 -0.999999
v 0.281705 3.869848 -0.999999
v 0.783613 4.212353 -0.031249
v 0.814328 4.210704 -0.499999
v 0.839874 4.576618 -0.031249
v 0.691418 4.217315 0.375001
v 0.739890 3.852770 -0.031249
v 0.770410 3.851643 -0.499999
v 0.870792 4.574446 -0.499999
v 0.747082 4.583140 0.375001
v 0.648282 3.856178 0.375001
v -0.169327 4.263672 0.937501
v 0.199575 4.243809 0.875001
v -0.119156 4.644024 0.937501
v -0.538226 4.283525 0.875001
v -0.206982 3.888059 0.937501
v 0.159570 3.874399 0.875001
v 0.252097 4.617934 0.875001
v -0.490408 4.670109 0.875001
v -0.573530 3.901706 0.875001
v 0.054212 0.073271 -0.000000
v 0.080544 0.108859 -0.350694
v 0.362462 -0.099728 -0.000000
v 0.080544 0.108859 0.350694
v -0.201374 0.317447 0.000000
v -0.157052 0.336486 -0.326389
v 0.367706 -0.051777 -0.326389
v 0.367706 -0.051777 0.326389
v -0.157052 0.336486 0.326389
v -0.052512 5.028802 -0.003905
v -0.040837 5.027791 -0.484374
v -0.523407 5.069566 0.000001
v -0.056404 5.029139 0.468751
v 0.426167 4.987364 -0.015624
v 0.441734 4.986016 -0.499999
v -0.492273 5.066871 -0.437499
v -0.492273 5.066871 0.437501
v 0.379466 4.991406 0.437501
v 0.523519 0.630691 0.907986
v 0.815991 0.438183 0.847222
v 0.731992 0.909823 0.937500
v 0.235973 0.830500 0.847222
v 0.327989 0.394801 0.819444
v 0.599968 0.224144 0.763889
v 1.030833 0.717207 0.875000
v 0.433150 1.102461 0.875000
v 0.076706 0.594690 0.763889
v 1.057564 1.770461 0.937500
v 1.341732 1.785480 0.875000
v 0.823501 2.030382 0.937500
v 0.773396 1.755454 0.875000
v 1.095208 1.496883 0.937500
v 1.386255 1.413296 0.875000
v 1.100820 2.143649 0.875000
v 0.546182 1.917122 0.875000
v 0.804160 1.580487 0.875000
v -0.137287 2.803306 0.937500
v 0.179889 2.905541 0.875000
v -0.239594 3.136696 0.937500
v -0.454460 2.701064 0.875000
v 0.074137 2.516732 0.937500
v 0.367932 2.673528 0.875000
v 0.101052 3.184174 0.875000
v -0.580236 3.089208 0.875000
v -0.219655 2.359934 0.875000
v 1.271021 0.125037 -0.027344
v 1.290456 0.117156 -0.472222
v 1.503939 0.412198 -0.031250
v 1.203096 0.176335 0.362847
v 0.997323 -0.079227 -0.015625
v 1.000694 -0.059702 -0.388889
v 1.528820 0.396114 -0.500000
v 1.429255 0.460384 0.375000
v 0.950637 -0.024197 0.326389
v 1.791682 1.809246 -0.031250
v 1.815372 1.810482 -0.500000
v 1.539929 2.322982 -0.031250
v 1.720630 1.805506 0.375000
v 1.847080 1.280929 -0.031250
v 1.871336 1.273939 -0.500000
v 1.563048 2.332413 -0.500000
v 1.470589 2.294673 0.375000
v 1.774317 1.301848 0.375000
v 0.682087 3.067423 -0.031250
v 0.708517 3.075952 -0.500000
v 0.640395 3.259356 -0.031249
v 0.602793 3.041856 0.375000
v 0.833116 2.921794 -0.031250
v 0.857602 2.934865 -0.500000
v 0.668774 3.263324 -0.499999
v 0.555243 3.247476 0.375001
v 0.759664 2.882589 0.375000
v 0.545372 0.615908 -0.935330
v 0.236029 0.830487 -0.847222
v 0.756894 0.893771 -0.968750
v 0.903350 0.379029 -0.956597
v 0.340513 0.385932 -0.835069
v 0.076747 0.594684 -0.763889
v 0.433198 1.102443 -0.875000
v 1.130394 0.652968 -1.000000
v 0.650024 0.188652 -0.826389
v 1.081245 1.771712 -0.968750
v 0.773383 1.755440 -0.875000
v 0.846612 2.039821 -0.968750
v 1.436471 1.790472 -1.000000
v 1.119462 1.489917 -0.968750
v 0.804162 1.580469 -0.875000
v 0.546166 1.917114 -0.875000
v 1.193279 2.181399 -1.000000
v 1.483272 1.385411 -1.000000
v -0.110855 2.811826 -0.968750
v -0.454468 2.701070 -0.875000
v -0.211207 3.140653 -0.968750
v 0.285617 2.939630 -1.000000
v 0.098621 2.529799 -0.968750
v -0.219666 2.359936 -0.875000
v -0.580233 3.089221 -0.875000
v 0.214588 3.200010 -1.000000
v 0.465872 2.725800 -1.000000
v -0.202130 1.121562 0.000000
v -0.151134 1.092372 0.362847
v -0.015053 1.391396 0.000000
v -0.151076 1.092336 -0.362847
v -0.328820 0.859960 0.000000
v -0.273964 0.843044 0.326389
v 0.034724 1.359315 0.375000
v 0.034775 1.359267 -0.375000
v -0.273922 0.843025 -0.326389
v 0.347127 1.732927 -0.000000
v 0.394496 1.735444 0.375000
v 0.130183 1.747222 -0.000000
v 0.394484 1.735414 -0.375000
v 0.367590 1.705870 -0.000000
v 0.416096 1.691959 0.375000
v 0.176412 1.766108 0.375000
v 0.176397 1.766091 -0.375000
v 0.416099 1.691917 -0.375000
v -0.930229 2.547709 0.000000
v -0.877361 2.564741 0.375000
v -1.091196 3.017993 0.000000
v -0.877372 2.564756 -0.375000
v -0.660358 2.124738 0.000000
v -0.611385 2.150869 0.375000
v -1.034421 3.025893 0.375000
v -1.034424 3.025920 -0.375000
v -0.611398 2.150874 -0.375000
v -0.302593 0.598045 -0.302083
v -0.357931 0.597685 0.000000
v -0.302593 0.598045 0.302083
v -0.878984 3.913065 0.687501
v -0.845641 4.300058 0.687501
v -0.799784 4.691838 0.687501
v -0.928143 5.104603 0.375001
v -0.990410 5.109993 0.000001
v -0.928143 5.104603 -0.374999
v 0.184209 1.262939 -0.687500
v -0.003246 0.997653 -0.665365
v -0.131357 0.764009 -0.598958
v 0.434301 0.052825 -0.614583
v 0.162292 0.212779 -0.647135
v -0.063940 0.421468 -0.598958
v -0.430006 5.061481 -0.874999
v -0.025270 5.026443 -0.968749
v 0.441734 4.986017 -0.999999
v 1.528799 0.396082 -1.000000
v 1.285646 0.130986 -0.944444
v 0.982408 -0.002897 -0.777778
v 0.660394 -0.114458 0.302083
v 0.679374 -0.169805 -0.003906
v 0.672954 -0.123752 -0.317708
v 0.939871 4.942894 -0.499999
v 0.908737 4.945589 -0.031249
v 0.815336 4.953675 0.375001
v 1.279868 0.556715 0.687500
v 1.060247 0.278306 0.665365
v 0.828807 0.084045 0.598958
v -0.063940 0.421468 0.598958
v 0.159152 0.215102 0.643229
v 0.421740 0.062119 0.598958
v 0.317199 4.996797 0.875001
v -0.056404 5.029139 0.937501
v -0.430006 5.061481 0.875001
v -0.131439 0.764037 0.598958
v -0.003360 0.997709 0.665365
v 0.184109 1.263013 0.687500
v 0.561619 1.650173 0.687500
v 0.536589 1.742960 0.687500
v 0.315084 1.822745 0.687500
v -0.464481 2.229267 0.687500
v -0.718768 2.615857 0.687500
v -0.864102 3.049625 0.687500
v -0.799732 4.691885 -0.687499
v -0.845575 4.300128 -0.687499
v -0.878928 3.913141 -0.687499
v -0.864103 3.049669 -0.687500
v -0.718788 2.615880 -0.687500
v -0.464505 2.229274 -0.687500
v 0.315052 1.822717 -0.687500
v 0.536565 1.742912 -0.687500
v 0.561624 1.650107 -0.687500
v 0.870774 4.574450 -0.999999
v 0.814302 4.210711 -0.999999
v 0.770385 3.851653 -0.999999
v 0.668765 3.263336 -0.999999
v 0.708516 3.075962 -1.000000
v 0.857605 2.934871 -1.000000
v 1.563057 2.332406 -1.000000
v 1.815380 1.810467 -1.000000
v 1.871338 1.273915 -1.000000
v 0.561480 4.596188 0.687501
v 0.507001 4.227249 0.687501
v 0.465038 3.863006 0.687501
v 0.384928 3.223730 0.687500
v 0.444204 2.990731 0.687500
v 0.612761 2.804187 0.687500
v 1.331917 2.238044 0.687500
v 1.578536 1.798007 0.687500
v 1.628792 1.343657 0.687500
v 1.233314 1.027022 0.875000
v 0.935357 1.209573 0.937500
v 0.637399 1.392147 0.875000
v 0.664587 2.487880 0.875000
v 0.394086 2.276721 0.937500
v 0.123585 2.065563 0.875000
v 0.132020 3.509680 0.875001
v -0.232186 3.517158 0.937501
v -0.596386 3.524623 0.875000
v 1.729868 0.722704 -0.500000
v 1.705049 0.737950 -0.031250
v 1.630572 0.783619 0.375000
v 1.115434 2.839812 -0.500000
v 1.092889 2.822216 -0.031250
v 1.025260 2.769426 0.375000
v 0.738970 3.497235 -0.499999
v 0.708640 3.497845 -0.031249
v 0.617611 3.499703 0.375001
v 0.637426 1.392126 -0.875000
v 0.960186 1.194359 -0.968750
v 1.332606 0.966138 -1.000000
v 0.123579 2.065562 -0.875000
v 0.416628 2.294318 -0.968750
v 0.754762 2.558267 -1.000000
v -0.596366 3.524646 -0.875000
v -0.201836 3.516535 -0.968749
v 0.253386 3.507195 -0.999999
v 0.240138 1.635581 0.375000
v 0.190495 1.665982 0.000000
v 0.240167 1.635529 -0.375000
v -0.237087 1.784019 0.375000
v -0.282174 1.748824 -0.000000
v -0.237094 1.784016 -0.375000
v -1.081970 3.534582 0.375000
v -1.142662 3.535849 0.000000
v -1.081957 3.534623 -0.375000
v -0.190472 0.598774 0.509259
v -0.741342 5.088431 0.687501
v -0.190472 0.598774 -0.509259
v -0.741342 5.088432 -0.687499
v 0.628300 -0.007026 0.509259
v 0.628535 4.969846 0.687501
v 0.661795 -0.031808 -0.550926
v 0.939871 4.942895 -0.999999
v 0.389096 1.544313 0.687500
v -0.101831 1.889599 0.687500
v -0.899884 3.530831 0.687500
v -0.899853 3.530899 -0.687500
v -0.101845 1.889595 -0.687500
v 0.389153 1.544233 -0.687500
v 0.738951 3.497248 -0.999999
v 1.115437 2.839812 -1.000000
v 1.729858 0.722672 -1.000000
v 0.435531 3.503437 0.687501
v 0.890005 2.663846 0.687500
v 1.481611 0.874917 0.687500
vn -0.9836 0.0805 0.1613
vn -0.8588 0.0724 0.5072
vn -0.9858 0.0499 0.1603
vn -0.8621 0.0456 0.5047
vn -0.9805 0.1103 0.1624
vn -0.9767 0.1392 0.1635
vn -0.8547 0.0984 0.5097
vn -0.8499 0.1235 0.5122
vn -0.9805 0.1103 -0.1624
vn -0.8547 0.0983 -0.5097
vn -0.9767 0.1392 -0.1635
vn -0.8499 0.1234 -0.5122
vn -0.9836 0.0805 -0.1614
vn -0.9858 0.0499 -0.1603
vn -0.8588 0.0724 -0.5072
vn -0.8621 0.0457 -0.5047
vn -0.2281 0.0220 -0.9734
vn -0.5199 0.0464 -0.8530
vn -0.2301 0.0149 -0.9731
vn -0.5235 0.0302 -0.8515
vn -0.2259 0.0289 -0.9737
vn -0.2236 0.0355 -0.9740
vn -0.5157 0.0621 -0.8545
vn -0.5111 0.0770 -0.8560
vn -0.0668 0.0092 -0.9977
vn 0.0000 0.0000 -1.0000
vn -0.0661 0.0112 -0.9978
vn -0.0675 0.0072 -0.9977
vn -0.0681 0.0050 -0.9977
vn 0.9905 -0.1208 0.0651
vn 0.9926 -0.1214 -0.0001
vn 0.9940 -0.0879 0.0647
vn 0.9961 -0.0884 -0.0000
vn 0.9861 -0.1527 0.0655
vn 0.9808 -0.1835 0.0659
vn 0.9882 -0.1534 -0.0000
vn 0.9829 -0.1843 -0.0000
vn 0.9639 -0.1478 0.2215
vn 0.8514 -0.1276 0.5087
vn 0.9585 -0.1777 0.2228
vn 0.8457 -0.1538 0.5111
vn 0.9684 -0.1167 0.2203
vn 0.9720 -0.0846 0.2190
vn 0.8564 -0.1005 0.5065
vn 0.8605 -0.0723 0.5042
vn 0.1668 -0.0174 0.9858
vn 0.5191 -0.0580 0.8527
vn 0.1683 -0.0121 0.9857
vn 0.5230 -0.0412 0.8513
vn 0.1651 -0.0225 0.9860
vn 0.1634 -0.0273 0.9862
vn 0.5147 -0.0741 0.8542
vn 0.5099 -0.0895 0.8556
vn -0.1652 0.0211 0.9860
vn -0.5157 0.0621 0.8545
vn -0.1635 0.0259 0.9862
vn -0.5111 0.0771 0.8560
vn -0.1668 0.0161 0.9859
vn -0.1683 0.0108 0.9857
vn -0.5198 0.0464 0.8530
vn -0.5235 0.0302 0.8515
vn -0.6888 -0.7133 -0.1294
vn -0.6578 -0.6309 -0.4116
vn -0.8661 -0.4761 -0.1520
vn -0.8161 -0.3968 -0.4200
vn -0.4807 -0.8673 -0.1294
vn -0.2193 -0.9654 -0.1413
vn -0.4255 -0.8128 -0.3979
vn -0.2167 -0.9057 -0.3644
vn -0.4807 -0.8673 0.1294
vn -0.4118 -0.8122 0.4131
vn -0.2035 -0.9670 0.1535
vn -0.1408 -0.8965 0.4200
vn -0.6888 -0.7133 0.1294
vn -0.8661 -0.4761 0.1520
vn -0.6563 -0.6314 0.4131
vn -0.8161 -0.3968 0.4200
vn 0.0862 0.9963 0.0000
vn -0.0235 -0.3379 0.9409
vn 0.2361 -0.5521 0.7997
vn -0.2040 -0.5801 0.7886
vn 0.0397 -0.7376 0.6741
vn 0.0930 -0.1712 0.9808
vn 0.1454 -0.0968 0.9846
vn 0.3861 -0.3764 0.8422
vn 0.4525 -0.2912 0.8429
vn -0.1841 0.0334 0.9823
vn -0.4677 0.2563 0.8459
vn -0.1437 0.0994 0.9846
vn -0.4379 0.3138 0.8425
vn -0.2956 -0.1228 0.9474
vn -0.4761 -0.3586 0.8029
vn -0.5685 0.0870 0.8181
vn -0.6847 -0.1349 0.7163
vn 0.2154 0.0274 0.9761
vn 0.6199 0.0711 0.7815
vn 0.1722 -0.0800 0.9818
vn 0.5405 -0.1897 0.8197
vn 0.1842 0.1415 0.9726
vn 0.1194 0.1750 0.9773
vn 0.5427 0.3315 0.7717
vn 0.3934 0.4487 0.8024
vn -0.1722 -0.1884 0.9669
vn -0.3624 -0.6736 0.6442
vn -0.0974 -0.2103 0.9728
vn -0.1756 -0.6847 0.7074
vn -0.2160 -0.0329 0.9758
vn -0.1589 0.1091 0.9812
vn -0.6205 -0.1293 0.7735
vn -0.3986 0.4597 0.7936
vn 0.1514 0.1166 0.9816
vn 0.4410 0.3757 0.8151
vn 0.1117 0.1618 0.9805
vn 0.2968 0.5225 0.7993
vn 0.1750 0.0518 0.9832
vn 0.1751 -0.0095 0.9845
vn 0.5360 0.1447 0.8317
vn 0.5396 -0.0727 0.8388
vn -0.1743 -0.0551 0.9832
vn -0.5286 -0.1744 0.8308
vn -0.1745 -0.0019 0.9847
vn -0.5366 -0.0304 0.8433
vn -0.1544 -0.1097 0.9819
vn -0.1202 -0.1491 0.9815
vn -0.4717 -0.3170 0.8228
vn -0.3800 -0.4231 0.8225
vn 0.5607 -0.8280 0.0038
vn 0.4340 -0.8969 -0.0852
vn 0.2205 -0.9709 -0.0936
vn 0.0318 -0.9718 -0.2339
vn 0.7689 -0.6371 0.0540
vn 0.8496 -0.5237 0.0625
vn 0.7478 -0.6638 -0.0131
vn 0.8516 -0.5242 0.0000
vn 0.7601 -0.6140 0.2128
vn 0.6655 -0.5577 0.4961
vn 0.8306 -0.5150 0.2120
vn 0.7375 -0.4634 0.4912
vn 0.5906 -0.7803 0.2058
vn 0.2763 -0.9424 0.1885
vn 0.4868 -0.7240 0.4887
vn 0.2131 -0.8637 0.4567
vn 0.9933 0.1039 0.0502
vn 0.9946 0.1037 0.0000
vn 0.9665 -0.2504 0.0565
vn 0.9686 -0.2486 0.0000
vn 0.8980 0.4371 0.0498
vn 0.7463 0.6633 0.0555
vn 0.9003 0.4352 0.0000
vn 0.7499 0.6615 0.0000
vn 0.8813 0.4410 0.1697
vn 0.8059 0.4307 0.4062
vn 0.7241 0.6635 0.1883
vn 0.6386 0.6291 0.4432
vn 0.9798 0.1036 0.1712
vn 0.9475 -0.2552 0.1926
vn 0.9061 0.0983 0.4116
vn 0.8537 -0.2517 0.4559
vn 0.6898 0.7220 0.0541
vn 0.6874 0.7263 0.0000
vn 0.3516 0.9349 0.0482
vn 0.3459 0.9383 0.0000
vn 0.9760 0.2095 0.0599
vn 0.9580 -0.2807 0.0590
vn 0.9782 0.2075 -0.0000
vn 0.9578 -0.2874 -0.0000
vn 0.9554 0.2145 0.2032
vn 0.8550 0.2082 0.4749
vn 0.9464 -0.2519 0.2021
vn 0.8590 -0.1824 0.4785
vn 0.6914 0.6982 0.1856
vn 0.3700 0.9138 0.1677
vn 0.6519 0.6135 0.4458
vn 0.3847 0.8239 0.4162
vn -0.3375 -0.1049 -0.9355
vn -0.5686 0.0871 -0.8180
vn -0.4946 -0.3535 -0.7940
vn -0.6846 -0.1347 -0.7163
vn -0.2343 0.0662 -0.9699
vn -0.1964 0.1356 -0.9711
vn -0.4678 0.2563 -0.8458
vn -0.4380 0.3139 -0.8424
vn -0.1064 -0.0537 -0.9929
vn -0.0653 -0.1248 -0.9900
vn -0.0590 0.0390 -0.9975
vn -0.2054 -0.2888 -0.9351
vn -0.3053 -0.5839 -0.7522
vn -0.2024 -0.4493 -0.8702
vn -0.2552 -0.7602 -0.5975
vn -0.2927 -0.0442 -0.9552
vn -0.6205 -0.1294 -0.7735
vn -0.2174 0.1465 -0.9650
vn -0.3987 0.4596 -0.7936
vn -0.2326 -0.2500 -0.9399
vn -0.1332 -0.2819 -0.9501
vn -0.3624 -0.6735 -0.6443
vn -0.1756 -0.6846 -0.7074
vn -0.0761 -0.0551 -0.9956
vn -0.0501 -0.0689 -0.9964
vn -0.0879 -0.0109 -0.9961
vn -0.0708 0.0307 -0.9970
vn -0.2102 -0.1498 -0.9661
vn -0.4717 -0.3170 -0.8228
vn -0.1632 -0.2037 -0.9653
vn -0.3800 -0.4231 -0.8225
vn -0.2377 -0.0750 -0.9684
vn -0.2384 -0.0020 -0.9712
vn -0.5286 -0.1743 -0.8308
vn -0.5367 -0.0304 -0.8433
vn -0.0711 -0.0207 -0.9973
vn -0.0710 0.0050 -0.9975
vn -0.0612 -0.0481 -0.9970
vn -0.0446 -0.0671 -0.9968
vn -0.8908 0.4233 0.1651
vn -0.8068 0.3123 0.5016
vn -0.9793 0.1031 0.1744
vn -0.8781 0.0556 0.4752
vn -0.8127 0.5610 0.1576
vn -0.7919 0.5908 0.1542
vn -0.7247 0.4762 0.4980
vn -0.7020 0.5167 0.4902
vn -0.8126 0.5610 -0.1578
vn -0.7246 0.4762 -0.4981
vn -0.7919 0.5908 -0.1544
vn -0.7020 0.5166 -0.4903
vn -0.8908 0.4233 -0.1653
vn -0.9792 0.1032 -0.1745
vn -0.8067 0.3123 -0.5017
vn -0.8781 0.0558 -0.4753
vn -0.8545 -0.5095 0.1015
vn -0.8731 -0.2987 0.3854
vn -0.2620 0.9608 0.0910
vn -0.3930 0.8441 0.3648
vn -0.1027 -0.9939 0.0412
vn -0.0236 -0.9969 0.0748
vn -0.2385 -0.9493 0.2046
vn -0.0972 -0.9522 0.2897
vn -0.1027 -0.9939 -0.0411
vn -0.2386 -0.9493 -0.2046
vn -0.0236 -0.9969 -0.0747
vn -0.0972 -0.9522 -0.2897
vn -0.8544 -0.5096 -0.1014
vn -0.2620 0.9607 -0.0912
vn -0.8730 -0.2989 -0.3853
vn -0.3931 0.8440 -0.3650
vn -0.8334 -0.5336 0.1439
vn -0.7431 -0.4830 0.4633
vn -0.6951 -0.7042 0.1448
vn -0.6128 -0.6391 0.4648
vn -0.9360 -0.3196 0.1475
vn -0.9834 -0.0949 0.1549
vn -0.8347 -0.2820 0.4730
vn -0.8677 -0.0730 0.4916
vn -0.9360 -0.3196 -0.1475
vn -0.8347 -0.2820 -0.4730
vn -0.9834 -0.0948 -0.1549
vn -0.8677 -0.0730 -0.4916
vn -0.8334 -0.5336 -0.1439
vn -0.6951 -0.7042 -0.1447
vn -0.7431 -0.4829 -0.4633
vn -0.6128 -0.6392 -0.4648
s off
f 1//1 5//1 6//1 2//1
f 2//2 6//2 166//2 167//2
f 5//3 269//3 268//3 6//3
f 6//4 268//4 281//4 166//4
f 1//5 2//5 7//5 3//5
f 3//6 7//6 169//6 170//6
f 2//7 167//7 168//7 7//7
f 7//8 168//8 272//8 169//8
f 1//9 3//9 8//9 4//9
f 4//10 8//10 208//10 209//10
f 3//11 170//11 171//11 8//11
f 8//12 171//12 274//12 208//12
f 1//13 4//13 9//13 5//13
f 5//14 9//14 270//14 269//14
f 4//15 209//15 210//15 9//15
f 9//16 210//16 282//16 270//16
f 10//17 14//17 15//17 11//17
f 11//18 15//18 210//18 209//18
f 14//19 260//19 259//19 15//19
f 15//20 259//20 282//20 210//20
f 10//21 11//21 16//21 12//21
f 12//22 16//22 178//22 179//22
f 11//23 209//23 208//23 16//23
f 16//24 208//24 274//24 178//24
f 10//25 12//25 17//25 13//25
f 13//26 17//26 217//26 218//26
f 12//27 179//27 180//27 17//27
f 17//26 180//26 278//26 217//26
f 10//28 13//28 18//28 14//28
f 14//29 18//29 261//29 260//29
f 13//26 218//26 219//26 18//26
f 18//26 219//26 285//26 261//26
f 19//30 23//30 24//30 20//30
f 20//31 24//31 219//31 218//31
f 23//32 251//32 250//32 24//32
f 24//33 250//33 285//33 219//33
f 19//34 20//34 25//34 21//34
f 21//35 25//35 187//35 188//35
f 20//36 218//36 217//36 25//36
f 25//37 217//37 278//37 187//37
f 19//38 21//38 26//38 22//38
f 22//39 26//39 226//39 227//39
f 21//40 188//40 189//40 26//40
f 26//41 189//41 276//41 226//41
f 19//42 22//42 27//42 23//42
f 23//43 27//43 252//43 251//43
f 22//44 227//44 228//44 27//44
f 27//45 228//45 288//45 252//45
f 28//46 32//46 33//46 29//46
f 29//47 33//47 228//47 227//47
f 32//48 242//48 241//48 33//48
f 33//49 241//49 288//49 228//49
f 28//50 29//50 34//50 30//50
f 30//51 34//51 196//51 197//51
f 29//52 227//52 226//52 34//52
f 34//53 226//53 276//53 196//53
f 28//54 30//54 35//54 31//54
f 31//55 35//55 168//55 167//55
f 30//56 197//56 198//56 35//56
f 35//57 198//57 272//57 168//57
f 28//58 31//58 36//58 32//58
f 32//59 36//59 243//59 242//59
f 31//60 167//60 166//60 36//60
f 36//61 166//61 281//61 243//61
f 37//62 41//62 42//62 38//62
f 38//63 42//63 177//63 176//63
f 41//64 164//64 163//64 42//64
f 42//65 163//65 273//65 177//65
f 37//66 38//66 43//66 39//66
f 39//67 43//67 186//67 185//67
f 38//68 176//68 175//68 43//68
f 43//69 175//69 277//69 186//69
f 37//70 39//70 44//70 40//70
f 40//71 44//71 195//71 194//71
f 39//72 185//72 184//72 44//72
f 44//73 184//73 275//73 195//73
f 37//74 40//74 45//74 41//74
f 41//75 45//75 165//75 164//75
f 40//76 194//76 193//76 45//76
f 45//77 193//77 271//77 165//77
f 46//78 50//78 51//78 47//78
f 47//78 51//78 180//78 179//78
f 50//78 188//78 187//78 51//78
f 51//78 187//78 278//78 180//78
f 46//78 47//78 52//78 48//78
f 48//78 52//78 171//78 170//78
f 47//78 179//78 178//78 52//78
f 52//78 178//78 274//78 171//78
f 46//78 48//78 53//78 49//78
f 49//78 53//78 198//78 197//78
f 48//78 170//78 169//78 53//78
f 53//78 169//78 272//78 198//78
f 46//78 49//78 54//78 50//78
f 50//78 54//78 189//78 188//78
f 49//78 197//78 196//78 54//78
f 54//78 196//78 276//78 189//78
f 55//79 59//79 60//79 56//79
f 56//80 60//80 192//80 191//80
f 59//81 194//81 195//81 60//81
f 60//82 195//82 275//82 192//82
f 55//83 56//83 61//83 57//83
f 57//84 61//84 235//84 236//84
f 56//85 191//85 190//85 61//85
f 61//86 190//86 290//86 235//86
f 55//87 57//87 62//87 58//87
f 58//88 62//88 201//88 200//88
f 57//89 236//89 237//89 62//89
f 62//90 237//90 279//90 201//90
f 55//91 58//91 63//91 59//91
f 59//92 63//92 193//92 194//92
f 58//93 200//93 199//93 63//93
f 63//94 199//94 271//94 193//94
f 64//95 68//95 69//95 65//95
f 65//96 69//96 234//96 233//96
f 68//97 236//97 235//97 69//97
f 69//98 235//98 290//98 234//98
f 64//99 65//99 70//99 66//99
f 66//100 70//100 238//100 239//100
f 65//101 233//101 232//101 70//101
f 70//102 232//102 289//102 238//102
f 64//103 66//103 71//103 67//103
f 67//104 71//104 204//104 203//104
f 66//105 239//105 240//105 71//105
f 71//106 240//106 280//106 204//106
f 64//107 67//107 72//107 68//107
f 68//108 72//108 237//108 236//108
f 67//109 203//109 202//109 72//109
f 72//110 202//110 279//110 237//110
f 73//111 77//111 78//111 74//111
f 74//112 78//112 231//112 230//112
f 77//113 239//113 238//113 78//113
f 78//114 238//114 289//114 231//114
f 73//115 74//115 79//115 75//115
f 75//116 79//116 241//116 242//116
f 74//117 230//117 229//117 79//117
f 79//118 229//118 288//118 241//118
f 73//119 75//119 80//119 76//119
f 76//120 80//120 207//120 206//120
f 75//121 242//121 243//121 80//121
f 80//122 243//122 281//122 207//122
f 73//123 76//123 81//123 77//123
f 77//124 81//124 240//124 239//124
f 76//125 206//125 205//125 81//125
f 81//126 205//126 280//126 240//126
f 82//127 86//127 87//127 83//127
f 83//128 87//128 183//128 182//128
f 86//129 185//129 186//129 87//129
f 87//130 186//130 277//130 183//130
f 82//131 83//131 88//131 84//131
f 84//132 88//132 244//132 245//132
f 83//133 182//133 181//133 88//133
f 88//134 181//134 287//134 244//134
f 82//135 84//135 89//135 85//135
f 85//136 89//136 190//136 191//136
f 84//137 245//137 246//137 89//137
f 89//138 246//138 290//138 190//138
f 82//139 85//139 90//139 86//139
f 86//140 90//140 184//140 185//140
f 85//141 191//141 192//141 90//141
f 90//142 192//142 275//142 184//142
f 91//143 95//143 96//143 92//143
f 92//144 96//144 225//144 224//144
f 95//145 245//145 244//145 96//145
f 96//146 244//146 287//146 225//146
f 91//147 92//147 97//147 93//147
f 93//148 97//148 247//148 248//148
f 92//149 224//149 223//149 97//149
f 97//150 223//150 286//150 247//150
f 91//151 93//151 98//151 94//151
f 94//152 98//152 232//152 233//152
f 93//153 248//153 249//153 98//153
f 98//154 249//154 289//154 232//154
f 91//155 94//155 99//155 95//155
f 95//156 99//156 246//156 245//156
f 94//157 233//157 234//157 99//157
f 99//158 234//158 290//158 246//158
f 100//159 104//159 105//159 101//159
f 101//160 105//160 222//160 221//160
f 104//161 248//161 247//161 105//161
f 105//162 247//162 286//162 222//162
f 100//163 101//163 106//163 102//163
f 102//164 106//164 250//164 251//164
f 101//165 221//165 220//165 106//165
f 106//166 220//166 285//166 250//166
f 100//167 102//167 107//167 103//167
f 103//168 107//168 229//168 230//168
f 102//169 251//169 252//169 107//169
f 107//170 252//170 288//170 229//170
f 100//171 103//171 108//171 104//171
f 104//172 108//172 249//172 248//172
f 103//173 230//173 231//173 108//173
f 108//174 231//174 289//174 249//174
f 109//175 113//175 114//175 110//175
f 110//176 114//176 174//176 173//176
f 113//177 176//177 177//177 114//177
f 114//178 177//178 273//178 174//178
f 109//179 110//179 115//179 111//179
f 111//180 115//180 253//180 254//180
f 110//181 173//181 172//181 115//181
f 115//182 172//182 284//182 253//182
f 109//183 111//183 116//183 112//183
f 112//184 116//184 181//184 182//184
f 111//185 254//185 255//185 116//185
f 116//26 255//26 287//26 181//26
f 109//186 112//186 117//186 113//186
f 113//187 117//187 175//187 176//187
f 112//188 182//188 183//188 117//188
f 117//189 183//189 277//189 175//189
f 118//190 122//190 123//190 119//190
f 119//191 123//191 216//191 215//191
f 122//192 254//192 253//192 123//192
f 123//193 253//193 284//193 216//193
f 118//194 119//194 124//194 120//194
f 120//195 124//195 256//195 257//195
f 119//196 215//196 214//196 124//196
f 124//197 214//197 283//197 256//197
f 118//198 120//198 125//198 121//198
f 121//26 125//26 223//26 224//26
f 120//199 257//199 258//199 125//199
f 125//26 258//26 286//26 223//26
f 118//200 121//200 126//200 122//200
f 122//201 126//201 255//201 254//201
f 121//26 224//26 225//26 126//26
f 126//26 225//26 287//26 255//26
f 127//202 131//202 132//202 128//202
f 128//203 132//203 213//203 212//203
f 131//204 257//204 256//204 132//204
f 132//205 256//205 283//205 213//205
f 127//206 128//206 133//206 129//206
f 129//207 133//207 259//207 260//207
f 128//208 212//208 211//208 133//208
f 133//209 211//209 282//209 259//209
f 127//210 129//210 134//210 130//210
f 130//26 134//26 220//26 221//26
f 129//211 260//211 261//211 134//211
f 134//26 261//26 285//26 220//26
f 127//212 130//212 135//212 131//212
f 131//213 135//213 258//213 257//213
f 130//26 221//26 222//26 135//26
f 135//26 222//26 286//26 258//26
f 136//214 140//214 141//214 137//214
f 137//215 141//215 199//215 200//215
f 140//216 164//216 165//216 141//216
f 141//217 165//217 271//217 199//217
f 136//218 137//218 142//218 138//218
f 138//219 142//219 262//219 263//219
f 137//220 200//220 201//220 142//220
f 142//221 201//221 279//221 262//221
f 136//222 138//222 143//222 139//222
f 139//223 143//223 172//223 173//223
f 138//224 263//224 264//224 143//224
f 143//225 264//225 284//225 172//225
f 136//226 139//226 144//226 140//226
f 140//227 144//227 163//227 164//227
f 139//228 173//228 174//228 144//228
f 144//229 174//229 273//229 163//229
f 145//230 149//230 150//230 146//230
f 146//231 150//231 202//231 203//231
f 149//232 263//232 262//232 150//232
f 150//233 262//233 279//233 202//233
f 145//234 146//234 151//234 147//234
f 147//235 151//235 265//235 266//235
f 146//236 203//236 204//236 151//236
f 151//237 204//237 280//237 265//237
f 145//238 147//238 152//238 148//238
f 148//239 152//239 214//239 215//239
f 147//240 266//240 267//240 152//240
f 152//241 267//241 283//241 214//241
f 145//242 148//242 153//242 149//242
f 149//243 153//243 264//243 263//243
f 148//244 215//244 216//244 153//244
f 153//245 216//245 284//245 264//245
f 154//246 158//246 159//246 155//246
f 155//247 159//247 205//247 206//247
f 158//248 266//248 265//248 159//248
f 159//249 265//249 280//249 205//249
f 154//250 155//250 160//250 156//250
f 156//251 160//251 268//251 269//251
f 155//252 206//252 207//252 160//252
f 160//253 207//253 281//253 268//253
f 154//254 156//254 161//254 157//254
f 157//255 161//255 211//255 212//255
f 156//256 269//256 270//256 161//256
f 161//257 270//257 282//257 211//257
f 154//258 157//258 162//258 158//258
f 158//259 162//259 267//259 266//259
f 157//260 212//260 213//260 162//260
f 162//261 213//261 283//261 267//261

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,14 @@
# Blender v2.93.1 OBJ File: ''
# www.blender.org
g Plane
v -1.000000 1.000000 1.000000
v 1.000000 1.000000 1.000000
v -1.000000 0.000000 -1.000000
v 1.000000 0.000000 -1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vn 0.0000 0.8944 -0.4472
s off
f 1/1/1 2/2/1 4/3/1 3/4/1

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,160 @@
# ufbx:bad_normals
# Blender v2.93.1 OBJ File: ''
# www.blender.org
g Plane
v -0.285714 -0.098136 0.413226
v 0.937829 0.000000 0.928330
v -0.460317 -0.158108 -0.469873
v 0.871949 -0.085869 -0.417109
v 0.248437 -0.088936 1.566148
v 1.594936 -0.085869 1.459709
v 0.921956 -0.654242 0.930379
v -0.035714 -0.355744 -0.651303
v 0.863020 -0.582684 -0.415957
v 0.552776 -0.539749 1.585911
v 1.594936 -0.601085 1.459710
v -0.535714 -0.098136 0.192785
v 0.505357 0.000000 1.211489
v 0.838690 0.000000 0.250902
v 0.000000 -0.085869 -0.655912
v -0.285714 -0.098136 0.913226
v 1.029461 -0.085869 1.808282
v 1.360116 0.000000 1.274214
v 1.487795 -0.085869 0.487474
v 0.469642 -0.613352 1.216098
v 0.802976 -0.613352 0.255511
v -0.035714 -0.527482 -0.651303
v 1.029461 -0.601085 1.808282
v 1.360116 -0.686954 1.274214
v 1.487795 -0.601085 0.487474
v -0.535714 -0.355744 -0.651303
v 0.883035 -0.343477 -0.639780
v 0.222321 -0.355744 1.510018
v 1.673209 -0.343477 1.521541
v 0.000000 0.000000 0.376352
v 1.021426 0.000000 1.587841
v 1.354760 0.000000 0.627254
v 1.021426 -0.686954 1.587841
v 1.354760 -0.686954 0.627254
v 0.000000 -0.343477 -1.000000
v -0.142857 -0.392545 0.394789
v 1.532140 -0.343477 0.440881
v 1.032140 -0.343477 1.881762
vt 0.548251 0.350671
vt 0.652271 0.246651
vt 0.717143 0.389820
vt 0.554400 0.448542
vt 0.756292 0.142630
vt 0.860312 0.246651
vt 0.964333 0.350671
vt 0.817434 0.464011
vt 0.757280 0.544790
vt 0.682839 0.529258
vt 0.560550 0.546413
vt 0.765227 0.624696
vt 0.697373 0.622089
vt 0.775277 0.761140
vt 0.667914 0.653777
vt 0.869805 0.555906
vt 0.831967 0.556841
vt 0.327956 0.466981
vt 0.271977 0.447027
vt 0.313610 0.400910
vt 0.356348 0.428637
vt 0.262851 0.391765
vt 0.307700 0.365946
vt 0.379745 0.395769
vt 0.396222 0.596544
vt 0.342146 0.533918
vt 0.383779 0.487801
vt 0.415056 0.493411
vt 0.532234 0.686502
vt 0.382822 0.754318
vt 0.362253 0.711502
vt 0.442877 0.630382
vt 0.233410 0.822134
vt 0.272149 0.695058
vt 0.312973 0.679497
vt 0.319629 0.648915
vt 0.128878 0.675865
vt 0.232895 0.546788
vt 0.024346 0.529595
vt 0.086040 0.413802
vt 0.147735 0.298008
vt 0.224598 0.386338
vt 0.459765 0.257445
vt 0.496000 0.471974
vt 0.453689 0.485958
vt 0.404454 0.357347
vt 0.303750 0.277726
vt 0.304938 0.323666
vn 0.3105 -0.9445 -0.1077
vn 0.1681 -0.9815 0.0919
vn -0.0067 -0.9949 0.1004
vn 0.0000 -1.0000 0.0000
vn 0.1621 -0.9809 -0.1072
vn -0.2024 -0.9395 -0.2764
vn 0.1176 -0.9632 -0.2419
vn -0.1888 -0.9677 0.1669
vn -0.4259 -0.9043 0.0296
vn 0.0799 0.9961 0.0375
vn 0.2878 0.9124 -0.2910
vn -0.2024 0.9395 -0.2764
vn -0.0610 0.9899 0.1277
vn 0.0908 0.9956 0.0223
vn -0.4259 0.9043 0.0296
vn -0.2230 -0.7235 0.6533
vn 0.3714 -0.7275 0.5769
vn 0.3241 0.9437 0.0664
vn -0.1675 0.8005 0.5754
vn 0.8323 0.5302 -0.1618
vn 0.8521 0.4320 -0.2957
vn 0.7373 0.5520 -0.3894
vn 0.5592 0.7971 -0.2281
vn 0.2043 0.9763 0.0709
vn 0.1501 0.9876 -0.0453
vn -0.9669 -0.2267 0.1169
vn -0.7905 -0.3483 0.5037
vn -0.7786 0.3748 0.5033
vn -0.9669 0.2267 0.1169
vn 0.3600 -0.0469 -0.9318
vn -0.4843 -0.2926 -0.8245
vn -0.4843 0.2926 -0.8245
vn 0.4094 0.2992 -0.8619
s off
f 1/1/1 12/2/1 30/3/1 16/4/1
f 3/5/2 15/6/2 30/3/2 12/2/2
f 4/7/3 14/8/3 30/3/3 15/6/3
f 2/9/4 13/10/4 30/3/4 14/8/4
f 5/11/5 16/4/5 30/3/5 13/10/5
f 2/9/4 18/12/4 31/13/4 13/10/4
f 6/14/6 17/15/6 31/13/6 18/12/6
f 5/11/7 13/10/7 31/13/7 17/15/7
f 4/7/8 19/16/8 32/17/8 14/8/8
f 6/14/9 18/12/9 32/17/9 19/16/9
f 2/9/4 14/8/4 32/17/4 18/12/4
f 7/18/10 20/19/10 33/20/10 24/21/10
f 10/22/11 23/23/11 33/20/11 20/19/11
f 11/24/12 24/21/12 33/20/12 23/23/12
f 9/25/13 21/26/13 34/27/13 25/28/13
f 7/18/14 24/21/14 34/27/14 21/26/14
f 11/24/15 25/28/15 34/27/15 24/21/15
f 4/29/16 15/30/16 35/31/16 27/32/16
f 15/30/17 3/33/17 26/34/17 35/31/17
f 35/31/18 26/34/18 8/35/18 22/36/18
f 27/32/19 35/31/19 22/36/19 9/25/19
f 3/33/20 12/37/20 36/38/20 26/34/20
f 1/39/21 16/40/21 36/38/21 12/37/21
f 5/41/22 28/42/22 36/38/22 16/40/22
f 10/22/23 20/19/23 36/38/23 28/42/23
f 7/18/24 21/26/24 36/38/24 20/19/24
f 9/25/25 22/36/25 36/38/25 21/26/25
f 8/35/18 26/34/18 36/38/18 22/36/18
f 6/43/26 19/44/26 37/45/26 29/46/26
f 19/44/27 4/29/27 27/32/27 37/45/27
f 37/45/28 27/32/28 9/25/28 25/28/28
f 29/46/29 37/45/29 25/28/29 11/24/29
f 5/41/30 17/47/30 38/48/30 28/42/30
f 17/47/31 6/43/31 29/46/31 38/48/31
f 38/48/32 29/46/32 11/24/32 23/23/32
f 28/42/33 38/48/33 23/23/33 10/22/33

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More