// AUTO GENERATED FILE, DO NOT EDIT.
//
// Generated by `package:ffigen`.
// ignore_for_file: type=lint
@ffi.DefaultAsset('package:thermion_dart/thermion_dart.dart')
library;

import 'dart:ffi' as ffi;

@ffi.Native<
    ffi.Pointer<ffi.Void> Function(LoadFilamentResourceFromOwner,
        FreeFilamentResourceFromOwner, ffi.Pointer<ffi.Void>)>()
external ffi.Pointer<ffi.Void> make_resource_loader(
  LoadFilamentResourceFromOwner loadFn,
  FreeFilamentResourceFromOwner freeFn,
  ffi.Pointer<ffi.Void> owner,
);

@ffi.Native<
    ffi.Pointer<ffi.Void> Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>,
        ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>)>()
external ffi.Pointer<ffi.Void> create_filament_viewer(
  ffi.Pointer<ffi.Void> context,
  ffi.Pointer<ffi.Void> loader,
  ffi.Pointer<ffi.Void> platform,
  ffi.Pointer<ffi.Char> uberArchivePath,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>)>()
external void destroy_filament_viewer(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<ffi.Pointer<ffi.Void> Function(ffi.Pointer<ffi.Void>)>()
external ffi.Pointer<ffi.Void> get_scene_manager(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<
    ffi.Void Function(
        ffi.Pointer<ffi.Void>, ffi.IntPtr, ffi.Uint32, ffi.Uint32)>()
external void create_render_target(
  ffi.Pointer<ffi.Void> viewer,
  int texture,
  int width,
  int height,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>)>()
external void clear_background_image(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>, ffi.Bool)>()
external void set_background_image(
  ffi.Pointer<ffi.Void> viewer,
  ffi.Pointer<ffi.Char> path,
  bool fillHeight,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Float, ffi.Float, ffi.Bool)>()
external void set_background_image_position(
  ffi.Pointer<ffi.Void> viewer,
  double x,
  double y,
  bool clamp,
);

@ffi.Native<
    ffi.Void Function(
        ffi.Pointer<ffi.Void>, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>()
external void set_background_color(
  ffi.Pointer<ffi.Void> viewer,
  double r,
  double g,
  double b,
  double a,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int)>()
external void set_tone_mapping(
  ffi.Pointer<ffi.Void> viewer,
  int toneMapping,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Float)>()
external void set_bloom(
  ffi.Pointer<ffi.Void> viewer,
  double strength,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>)>()
external void load_skybox(
  ffi.Pointer<ffi.Void> viewer,
  ffi.Pointer<ffi.Char> skyboxPath,
);

@ffi.Native<
    ffi.Void Function(
        ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>, ffi.Float)>()
external void load_ibl(
  ffi.Pointer<ffi.Void> viewer,
  ffi.Pointer<ffi.Char> iblPath,
  double intensity,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Float>)>()
external void rotate_ibl(
  ffi.Pointer<ffi.Void> viewer,
  ffi.Pointer<ffi.Float> rotationMatrix,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>)>()
external void remove_skybox(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>)>()
external void remove_ibl(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<
    ffi.Int Function(
        ffi.Pointer<ffi.Void>,
        ffi.Uint8,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Bool)>()
external int add_light(
  ffi.Pointer<ffi.Void> viewer,
  int type,
  double colour,
  double intensity,
  double posX,
  double posY,
  double posZ,
  double dirX,
  double dirY,
  double dirZ,
  double falloffRadius,
  double spotLightConeInner,
  double spotLightConeOuter,
  double sunAngularRadius,
  double sunHaloSize,
  double sunHaloFallof,
  bool shadows,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int)>()
external void remove_light(
  ffi.Pointer<ffi.Void> viewer,
  int entityId,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>)>()
external void clear_lights(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<
    ffi.Int Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>, ffi.Int)>()
external int load_glb(
  ffi.Pointer<ffi.Void> sceneManager,
  ffi.Pointer<ffi.Char> assetPath,
  int numInstances,
);

@ffi.Native<
    ffi.Int Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>, ffi.Size)>()
external int load_glb_from_buffer(
  ffi.Pointer<ffi.Void> sceneManager,
  ffi.Pointer<ffi.Void> data,
  int length,
);

@ffi.Native<
    ffi.Int Function(
        ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Char>)>()
external int load_gltf(
  ffi.Pointer<ffi.Void> sceneManager,
  ffi.Pointer<ffi.Char> assetPath,
  ffi.Pointer<ffi.Char> relativePath,
);

@ffi.Native<ffi.Int Function(ffi.Pointer<ffi.Void>, ffi.Int)>()
external int create_instance(
  ffi.Pointer<ffi.Void> sceneManager,
  int id,
);

@ffi.Native<ffi.Int Function(ffi.Pointer<ffi.Void>, ffi.Int)>()
external int get_instance_count(
  ffi.Pointer<ffi.Void> sceneManager,
  int entityId,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Pointer<ffi.Int>)>()
external void get_instances(
  ffi.Pointer<ffi.Void> sceneManager,
  int entityId,
  ffi.Pointer<ffi.Int> out,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>)>()
external void set_main_camera(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<ffi.Int Function(ffi.Pointer<ffi.Void>)>()
external int get_main_camera(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<
    ffi.Bool Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Pointer<ffi.Char>)>()
external bool set_camera(
  ffi.Pointer<ffi.Void> viewer,
  int entity,
  ffi.Pointer<ffi.Char> nodeName,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Bool)>()
external void set_view_frustum_culling(
  ffi.Pointer<ffi.Void> viewer,
  bool enabled,
);

@ffi.Native<
    ffi.Void Function(
        ffi.Pointer<ffi.Void>,
        ffi.Uint64,
        ffi.Pointer<ffi.Void>,
        ffi.Pointer<
            ffi.NativeFunction<
                ffi.Void Function(ffi.Pointer<ffi.Void> buf, ffi.Size size,
                    ffi.Pointer<ffi.Void> data)>>,
        ffi.Pointer<ffi.Void>)>()
external void render(
  ffi.Pointer<ffi.Void> viewer,
  int frameTimeInNanos,
  ffi.Pointer<ffi.Void> pixelBuffer,
  ffi.Pointer<
          ffi.NativeFunction<
              ffi.Void Function(ffi.Pointer<ffi.Void> buf, ffi.Size size,
                  ffi.Pointer<ffi.Void> data)>>
      callback,
  ffi.Pointer<ffi.Void> data,
);

@ffi.Native<
    ffi.Void Function(
        ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>, ffi.Uint32, ffi.Uint32)>()
external void create_swap_chain(
  ffi.Pointer<ffi.Void> viewer,
  ffi.Pointer<ffi.Void> window,
  int width,
  int height,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>)>()
external void destroy_swap_chain(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Float)>()
external void set_frame_interval(
  ffi.Pointer<ffi.Void> viewer,
  double interval,
);

@ffi.Native<
    ffi.Void Function(
        ffi.Pointer<ffi.Void>, ffi.Uint32, ffi.Uint32, ffi.Float)>()
external void update_viewport_and_camera_projection(
  ffi.Pointer<ffi.Void> viewer,
  int width,
  int height,
  double scaleFactor,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>)>()
external void scroll_begin(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Float, ffi.Float, ffi.Float)>()
external void scroll_update(
  ffi.Pointer<ffi.Void> viewer,
  double x,
  double y,
  double z,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>)>()
external void scroll_end(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Float, ffi.Float, ffi.Bool)>()
external void grab_begin(
  ffi.Pointer<ffi.Void> viewer,
  double x,
  double y,
  bool pan,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Float, ffi.Float)>()
external void grab_update(
  ffi.Pointer<ffi.Void> viewer,
  double x,
  double y,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>)>()
external void grab_end(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Pointer<ffi.Char>,
        ffi.Pointer<ffi.Float>, ffi.Int)>()
external void apply_weights(
  ffi.Pointer<ffi.Void> sceneManager,
  int entity,
  ffi.Pointer<ffi.Char> entityName,
  ffi.Pointer<ffi.Float> weights,
  int count,
);

@ffi.Native<
    ffi.Bool Function(
        ffi.Pointer<ffi.Void>, ffi.Int, ffi.Pointer<ffi.Float>, ffi.Int)>()
external bool set_morph_target_weights(
  ffi.Pointer<ffi.Void> sceneManager,
  int entity,
  ffi.Pointer<ffi.Float> morphData,
  int numWeights,
);

@ffi.Native<
    ffi.Bool Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Pointer<ffi.Float>,
        ffi.Pointer<ffi.Int>, ffi.Int, ffi.Int, ffi.Float)>()
external bool set_morph_animation(
  ffi.Pointer<ffi.Void> sceneManager,
  int entity,
  ffi.Pointer<ffi.Float> morphData,
  ffi.Pointer<ffi.Int> morphIndices,
  int numMorphTargets,
  int numFrames,
  double frameLengthInMs,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int)>()
external void clear_morph_animation(
  ffi.Pointer<ffi.Void> sceneManager,
  int entity,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int)>()
external void reset_to_rest_pose(
  ffi.Pointer<ffi.Void> sceneManager,
  int asset,
);

@ffi.Native<
    ffi.Void Function(
        ffi.Pointer<ffi.Void>,
        ffi.Int,
        ffi.Int,
        ffi.Int,
        ffi.Pointer<ffi.Float>,
        ffi.Int,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Float)>()
external void add_bone_animation(
  ffi.Pointer<ffi.Void> sceneManager,
  int entity,
  int skinIndex,
  int boneIndex,
  ffi.Pointer<ffi.Float> frameData,
  int numFrames,
  double frameLengthInMs,
  double fadeOutInSecs,
  double fadeInInSecs,
  double maxDelta,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Pointer<ffi.Float>)>()
external void get_local_transform(
  ffi.Pointer<ffi.Void> sceneManager,
  int entityId,
  ffi.Pointer<ffi.Float> arg2,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Int,
        ffi.Pointer<ffi.Float>, ffi.Int)>()
external void get_rest_local_transforms(
  ffi.Pointer<ffi.Void> sceneManager,
  int entityId,
  int skinIndex,
  ffi.Pointer<ffi.Float> out,
  int numBones,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Pointer<ffi.Float>)>()
external void get_world_transform(
  ffi.Pointer<ffi.Void> sceneManager,
  int entityId,
  ffi.Pointer<ffi.Float> arg2,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Int, ffi.Int,
        ffi.Pointer<ffi.Float>)>()
external void get_inverse_bind_matrix(
  ffi.Pointer<ffi.Void> sceneManager,
  int entityId,
  int skinIndex,
  int boneIndex,
  ffi.Pointer<ffi.Float> arg4,
);

@ffi.Native<
    ffi.Bool Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Int, ffi.Int,
        ffi.Pointer<ffi.Float>)>()
external bool set_bone_transform(
  ffi.Pointer<ffi.Void> sceneManager,
  int entity,
  int skinIndex,
  int boneIndex,
  ffi.Pointer<ffi.Float> transform,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Int, ffi.Bool,
        ffi.Bool, ffi.Bool, ffi.Float)>()
external void play_animation(
  ffi.Pointer<ffi.Void> sceneManager,
  int entity,
  int index,
  bool loop,
  bool reverse,
  bool replaceActive,
  double crossfade,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Int, ffi.Int)>()
external void set_animation_frame(
  ffi.Pointer<ffi.Void> sceneManager,
  int entity,
  int animationIndex,
  int animationFrame,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Int)>()
external void stop_animation(
  ffi.Pointer<ffi.Void> sceneManager,
  int entity,
  int index,
);

@ffi.Native<ffi.Int Function(ffi.Pointer<ffi.Void>, ffi.Int)>()
external int get_animation_count(
  ffi.Pointer<ffi.Void> sceneManager,
  int asset,
);

@ffi.Native<
    ffi.Void Function(
        ffi.Pointer<ffi.Void>, ffi.Int, ffi.Pointer<ffi.Char>, ffi.Int)>()
external void get_animation_name(
  ffi.Pointer<ffi.Void> sceneManager,
  int entity,
  ffi.Pointer<ffi.Char> outPtr,
  int index,
);

@ffi.Native<ffi.Float Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Int)>()
external double get_animation_duration(
  ffi.Pointer<ffi.Void> sceneManager,
  int entity,
  int index,
);

@ffi.Native<ffi.Int Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Int)>()
external int get_bone_count(
  ffi.Pointer<ffi.Void> sceneManager,
  int assetEntity,
  int skinIndex,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int,
        ffi.Pointer<ffi.Pointer<ffi.Char>>, ffi.Int)>()
external void get_bone_names(
  ffi.Pointer<ffi.Void> sceneManager,
  int assetEntity,
  ffi.Pointer<ffi.Pointer<ffi.Char>> outPtr,
  int skinIndex,
);

@ffi.Native<
    ffi.Int Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Int, ffi.Int)>()
external int get_bone(
  ffi.Pointer<ffi.Void> sceneManager,
  int entityId,
  int skinIndex,
  int boneIndex,
);

@ffi.Native<
    ffi.Bool Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Pointer<ffi.Float>)>()
external bool set_transform(
  ffi.Pointer<ffi.Void> sceneManager,
  int entityId,
  ffi.Pointer<ffi.Float> transform,
);

@ffi.Native<ffi.Bool Function(ffi.Pointer<ffi.Void>, ffi.Int)>()
external bool update_bone_matrices(
  ffi.Pointer<ffi.Void> sceneManager,
  int entityId,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Int,
        ffi.Pointer<ffi.Char>, ffi.Int)>()
external void get_morph_target_name(
  ffi.Pointer<ffi.Void> sceneManager,
  int assetEntity,
  int childEntity,
  ffi.Pointer<ffi.Char> outPtr,
  int index,
);

@ffi.Native<ffi.Int Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Int)>()
external int get_morph_target_name_count(
  ffi.Pointer<ffi.Void> sceneManager,
  int assetEntity,
  int childEntity,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int)>()
external void remove_entity(
  ffi.Pointer<ffi.Void> viewer,
  int asset,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>)>()
external void clear_entities(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<
    ffi.Bool Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Pointer<ffi.Char>,
        ffi.Int, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>()
external bool set_material_color(
  ffi.Pointer<ffi.Void> sceneManager,
  int entity,
  ffi.Pointer<ffi.Char> meshName,
  int materialIndex,
  double r,
  double g,
  double b,
  double a,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int)>()
external void transform_to_unit_cube(
  ffi.Pointer<ffi.Void> sceneManager,
  int asset,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Float, ffi.Float,
        ffi.Float, ffi.Bool)>()
external void queue_position_update(
  ffi.Pointer<ffi.Void> sceneManager,
  int entity,
  double x,
  double y,
  double z,
  bool relative,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Float, ffi.Float,
        ffi.Float, ffi.Float, ffi.Float, ffi.Bool)>()
external void queue_rotation_update(
  ffi.Pointer<ffi.Void> sceneManager,
  int entity,
  double rads,
  double x,
  double y,
  double z,
  double w,
  bool relative,
);

@ffi.Native<
    ffi.Void Function(
        ffi.Pointer<ffi.Void>, ffi.Int, ffi.Float, ffi.Float, ffi.Float)>()
external void set_position(
  ffi.Pointer<ffi.Void> sceneManager,
  int entity,
  double x,
  double y,
  double z,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Float, ffi.Float,
        ffi.Float, ffi.Float, ffi.Float)>()
external void set_rotation(
  ffi.Pointer<ffi.Void> sceneManager,
  int entity,
  double rads,
  double x,
  double y,
  double z,
  double w,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Float)>()
external void set_scale(
  ffi.Pointer<ffi.Void> sceneManager,
  int entity,
  double scale,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int)>()
external void move_camera_to_asset(
  ffi.Pointer<ffi.Void> viewer,
  int asset,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Float, ffi.Float, ffi.Float)>()
external void set_camera_exposure(
  ffi.Pointer<ffi.Void> viewer,
  double aperture,
  double shutterSpeed,
  double sensitivity,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Float, ffi.Float, ffi.Float)>()
external void set_camera_position(
  ffi.Pointer<ffi.Void> viewer,
  double x,
  double y,
  double z,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>)>()
external void get_camera_position(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<
    ffi.Void Function(
        ffi.Pointer<ffi.Void>, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>()
external void set_camera_rotation(
  ffi.Pointer<ffi.Void> viewer,
  double w,
  double x,
  double y,
  double z,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Float>)>()
external void set_camera_model_matrix(
  ffi.Pointer<ffi.Void> viewer,
  ffi.Pointer<ffi.Float> matrix,
);

@ffi.Native<ffi.Pointer<ffi.Double> Function(ffi.Pointer<ffi.Void>)>()
external ffi.Pointer<ffi.Double> get_camera_model_matrix(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<ffi.Pointer<ffi.Double> Function(ffi.Pointer<ffi.Void>)>()
external ffi.Pointer<ffi.Double> get_camera_view_matrix(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<ffi.Pointer<ffi.Double> Function(ffi.Pointer<ffi.Void>)>()
external ffi.Pointer<ffi.Double> get_camera_projection_matrix(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Double>,
        ffi.Double, ffi.Double)>()
external void set_camera_projection_matrix(
  ffi.Pointer<ffi.Void> viewer,
  ffi.Pointer<ffi.Double> matrix,
  double near,
  double far,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Double, ffi.Double)>()
external void set_camera_culling(
  ffi.Pointer<ffi.Void> viewer,
  double near,
  double far,
);

@ffi.Native<ffi.Double Function(ffi.Pointer<ffi.Void>)>()
external double get_camera_culling_near(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<ffi.Double Function(ffi.Pointer<ffi.Void>)>()
external double get_camera_culling_far(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<ffi.Pointer<ffi.Double> Function(ffi.Pointer<ffi.Void>)>()
external ffi.Pointer<ffi.Double> get_camera_culling_projection_matrix(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<ffi.Pointer<ffi.Double> Function(ffi.Pointer<ffi.Void>)>()
external ffi.Pointer<ffi.Double> get_camera_frustum(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Float, ffi.Float)>()
external void set_camera_fov(
  ffi.Pointer<ffi.Void> viewer,
  double fovInDegrees,
  double aspect,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Float)>()
external void set_camera_focal_length(
  ffi.Pointer<ffi.Void> viewer,
  double focalLength,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Float)>()
external void set_camera_focus_distance(
  ffi.Pointer<ffi.Void> viewer,
  double focusDistance,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, _ManipulatorMode, ffi.Double,
        ffi.Double, ffi.Double)>()
external void set_camera_manipulator_options(
  ffi.Pointer<ffi.Void> viewer,
  int mode,
  double orbitSpeedX,
  double orbitSpeedY,
  double zoomSpeed,
);

@ffi.Native<
    ffi.Int Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Pointer<ffi.Char>)>()
external int hide_mesh(
  ffi.Pointer<ffi.Void> sceneManager,
  int entity,
  ffi.Pointer<ffi.Char> meshName,
);

@ffi.Native<
    ffi.Int Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Pointer<ffi.Char>)>()
external int reveal_mesh(
  ffi.Pointer<ffi.Void> sceneManager,
  int entity,
  ffi.Pointer<ffi.Char> meshName,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Bool)>()
external void set_post_processing(
  ffi.Pointer<ffi.Void> viewer,
  bool enabled,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Bool)>()
external void set_shadows_enabled(
  ffi.Pointer<ffi.Void> viewer,
  bool enabled,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int)>()
external void set_shadow_type(
  ffi.Pointer<ffi.Void> viewer,
  int shadowType,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Float, ffi.Float)>()
external void set_soft_shadow_options(
  ffi.Pointer<ffi.Void> viewer,
  double penumbraScale,
  double penumbraRatioScale,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Bool, ffi.Bool, ffi.Bool)>()
external void set_antialiasing(
  ffi.Pointer<ffi.Void> viewer,
  bool msaa,
  bool fxaa,
  bool taa,
);

@ffi.Native<
    ffi.Void Function(
        ffi.Pointer<ffi.Void>,
        ffi.Int,
        ffi.Int,
        ffi.Pointer<
            ffi.NativeFunction<
                ffi.Void Function(ffi.Int entityId, ffi.Int x, ffi.Int y)>>)>()
external void filament_pick(
  ffi.Pointer<ffi.Void> viewer,
  int x,
  int y,
  ffi.Pointer<
          ffi.NativeFunction<
              ffi.Void Function(ffi.Int entityId, ffi.Int x, ffi.Int y)>>
      callback,
);

@ffi.Native<ffi.Pointer<ffi.Char> Function(ffi.Pointer<ffi.Void>, ffi.Int)>()
external ffi.Pointer<ffi.Char> get_name_for_entity(
  ffi.Pointer<ffi.Void> sceneManager,
  int entityId,
);

@ffi.Native<
    ffi.Int Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Pointer<ffi.Char>)>()
external int find_child_entity_by_name(
  ffi.Pointer<ffi.Void> sceneManager,
  int parent,
  ffi.Pointer<ffi.Char> name,
);

@ffi.Native<ffi.Int Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Bool)>()
external int get_entity_count(
  ffi.Pointer<ffi.Void> sceneManager,
  int target,
  bool renderableOnly,
);

@ffi.Native<
    ffi.Void Function(
        ffi.Pointer<ffi.Void>, ffi.Int, ffi.Bool, ffi.Pointer<ffi.Int>)>()
external void get_entities(
  ffi.Pointer<ffi.Void> sceneManager,
  int target,
  bool renderableOnly,
  ffi.Pointer<ffi.Int> out,
);

@ffi.Native<
    ffi.Pointer<ffi.Char> Function(
        ffi.Pointer<ffi.Void>, ffi.Int, ffi.Int, ffi.Bool)>()
external ffi.Pointer<ffi.Char> get_entity_name_at(
  ffi.Pointer<ffi.Void> sceneManager,
  int target,
  int index,
  bool renderableOnly,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Bool)>()
external void set_recording(
  ffi.Pointer<ffi.Void> viewer,
  bool recording,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>)>()
external void set_recording_output_directory(
  ffi.Pointer<ffi.Void> viewer,
  ffi.Pointer<ffi.Char> outputDirectory,
);

@ffi.Native<ffi.Void Function()>()
external void ios_dummy();

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>)>()
external void thermion_flutter_free(
  ffi.Pointer<ffi.Void> ptr,
);

@ffi.Native<
    ffi.Void Function(
        ffi.Pointer<ffi.Void>,
        ffi.Int,
        ffi.Pointer<
            ffi.NativeFunction<
                ffi.Void Function(ffi.Int entityId1, ffi.Int entityId2)>>,
        ffi.Bool)>()
external void add_collision_component(
  ffi.Pointer<ffi.Void> sceneManager,
  int entityId,
  ffi.Pointer<
          ffi.NativeFunction<
              ffi.Void Function(ffi.Int entityId1, ffi.Int entityId2)>>
      callback,
  bool affectsCollidingTransform,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int)>()
external void remove_collision_component(
  ffi.Pointer<ffi.Void> sceneManager,
  int entityId,
);

@ffi.Native<ffi.Bool Function(ffi.Pointer<ffi.Void>, ffi.Int)>()
external bool add_animation_component(
  ffi.Pointer<ffi.Void> sceneManager,
  int entityId,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int)>()
external void remove_animation_component(
  ffi.Pointer<ffi.Void> sceneManager,
  int entityId,
);

@ffi.Native<
    ffi.Int Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Float>, ffi.Int,
        ffi.Pointer<ffi.Uint16>, ffi.Int, ffi.Int, ffi.Pointer<ffi.Char>)>()
external int create_geometry(
  ffi.Pointer<ffi.Void> viewer,
  ffi.Pointer<ffi.Float> vertices,
  int numVertices,
  ffi.Pointer<ffi.Uint16> indices,
  int numIndices,
  int primitiveType,
  ffi.Pointer<ffi.Char> materialPath,
);

@ffi.Native<ffi.Int Function(ffi.Pointer<ffi.Void>, ffi.Int)>()
external int get_parent(
  ffi.Pointer<ffi.Void> sceneManager,
  int child,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Int)>()
external void set_parent(
  ffi.Pointer<ffi.Void> sceneManager,
  int child,
  int parent,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int)>()
external void test_collisions(
  ffi.Pointer<ffi.Void> sceneManager,
  int entity,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int, ffi.Int)>()
external void set_priority(
  ffi.Pointer<ffi.Void> sceneManager,
  int entityId,
  int priority,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Int>)>()
external void get_gizmo(
  ffi.Pointer<ffi.Void> sceneManager,
  ffi.Pointer<ffi.Int> out,
);

@ffi.Native<
    ffi.Void Function(
        ffi.Pointer<ffi.Void>,
        ffi.Pointer<ffi.Void>,
        ffi.Pointer<ffi.Char>,
        ffi.Pointer<ffi.Void>,
        ffi.Pointer<
            ffi.NativeFunction<
                ffi.Void Function(ffi.Pointer<ffi.Void> renderCallbackOwner)>>,
        ffi.Pointer<ffi.Void>,
        ffi.Pointer<
            ffi.NativeFunction<
                ffi.Void Function(ffi.Pointer<ffi.Void> viewer)>>)>()
external void create_filament_viewer_ffi(
  ffi.Pointer<ffi.Void> context,
  ffi.Pointer<ffi.Void> platform,
  ffi.Pointer<ffi.Char> uberArchivePath,
  ffi.Pointer<ffi.Void> loader,
  ffi.Pointer<
          ffi.NativeFunction<
              ffi.Void Function(ffi.Pointer<ffi.Void> renderCallbackOwner)>>
      renderCallback,
  ffi.Pointer<ffi.Void> renderCallbackOwner,
  ffi.Pointer<
          ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void> viewer)>>
      callback,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>, ffi.Uint32,
        ffi.Uint32, ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>()
external void create_swap_chain_ffi(
  ffi.Pointer<ffi.Void> viewer,
  ffi.Pointer<ffi.Void> surface,
  int width,
  int height,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> onComplete,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>,
        ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>()
external void destroy_swap_chain_ffi(
  ffi.Pointer<ffi.Void> viewer,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> onComplete,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.IntPtr, ffi.Uint32, ffi.Uint32,
        ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>()
external void create_render_target_ffi(
  ffi.Pointer<ffi.Void> viewer,
  int nativeTextureId,
  int width,
  int height,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> onComplete,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>)>()
external void destroy_filament_viewer_ffi(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>)>()
external void render_ffi(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<FilamentRenderCallback Function(FilamentRenderCallback)>()
external FilamentRenderCallback make_render_callback_fn_pointer(
  FilamentRenderCallback arg0,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Bool,
        ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>()
external void set_rendering_ffi(
  ffi.Pointer<ffi.Void> viewer,
  bool rendering,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> onComplete,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Float)>()
external void set_frame_interval_ffi(
  ffi.Pointer<ffi.Void> viewer,
  double frameInterval,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Uint32, ffi.Uint32, ffi.Float,
        ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>()
external void update_viewport_and_camera_projection_ffi(
  ffi.Pointer<ffi.Void> viewer,
  int width,
  int height,
  double scaleFactor,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> onComplete,
);

@ffi.Native<
    ffi.Void Function(
        ffi.Pointer<ffi.Void>, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>()
external void set_background_color_ffi(
  ffi.Pointer<ffi.Void> viewer,
  double r,
  double g,
  double b,
  double a,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>)>()
external void clear_background_image_ffi(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>, ffi.Bool,
        ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>()
external void set_background_image_ffi(
  ffi.Pointer<ffi.Void> viewer,
  ffi.Pointer<ffi.Char> path,
  bool fillHeight,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> onComplete,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Float, ffi.Float, ffi.Bool)>()
external void set_background_image_position_ffi(
  ffi.Pointer<ffi.Void> viewer,
  double x,
  double y,
  bool clamp,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Int)>()
external void set_tone_mapping_ffi(
  ffi.Pointer<ffi.Void> viewer,
  int toneMapping,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Float)>()
external void set_bloom_ffi(
  ffi.Pointer<ffi.Void> viewer,
  double strength,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>,
        ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>()
external void load_skybox_ffi(
  ffi.Pointer<ffi.Void> viewer,
  ffi.Pointer<ffi.Char> skyboxPath,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> onComplete,
);

@ffi.Native<
    ffi.Void Function(
        ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>, ffi.Float)>()
external void load_ibl_ffi(
  ffi.Pointer<ffi.Void> viewer,
  ffi.Pointer<ffi.Char> iblPath,
  double intensity,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>)>()
external void remove_skybox_ffi(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>)>()
external void remove_ibl_ffi(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<
    ffi.Void Function(
        ffi.Pointer<ffi.Void>,
        ffi.Uint8,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Float,
        ffi.Bool,
        ffi.Pointer<ffi.NativeFunction<ffi.Void Function(EntityId)>>)>()
external void add_light_ffi(
  ffi.Pointer<ffi.Void> viewer,
  int type,
  double colour,
  double intensity,
  double posX,
  double posY,
  double posZ,
  double dirX,
  double dirY,
  double dirZ,
  double falloffRadius,
  double spotLightConeInner,
  double spotLightConeOuter,
  double sunAngularRadius,
  double sunHaloSize,
  double sunHaloFallof,
  bool shadows,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(EntityId)>> callback,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, EntityId)>()
external void remove_light_ffi(
  ffi.Pointer<ffi.Void> viewer,
  int entityId,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>)>()
external void clear_lights_ffi(
  ffi.Pointer<ffi.Void> viewer,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>, ffi.Int,
        ffi.Pointer<ffi.NativeFunction<ffi.Void Function(EntityId)>>)>()
external void load_glb_ffi(
  ffi.Pointer<ffi.Void> sceneManager,
  ffi.Pointer<ffi.Char> assetPath,
  int numInstances,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(EntityId)>> callback,
);

@ffi.Native<
    ffi.Void Function(
        ffi.Pointer<ffi.Void>,
        ffi.Pointer<ffi.Void>,
        ffi.Size,
        ffi.Int,
        ffi.Pointer<ffi.NativeFunction<ffi.Void Function(EntityId)>>)>()
external void load_glb_from_buffer_ffi(
  ffi.Pointer<ffi.Void> sceneManager,
  ffi.Pointer<ffi.Void> data,
  int length,
  int numInstances,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(EntityId)>> callback,
);

@ffi.Native<
    ffi.Void Function(
        ffi.Pointer<ffi.Void>,
        ffi.Pointer<ffi.Char>,
        ffi.Pointer<ffi.Char>,
        ffi.Pointer<ffi.NativeFunction<ffi.Void Function(EntityId)>>)>()
external void load_gltf_ffi(
  ffi.Pointer<ffi.Void> sceneManager,
  ffi.Pointer<ffi.Char> assetPath,
  ffi.Pointer<ffi.Char> relativePath,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(EntityId)>> callback,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, EntityId,
        ffi.Pointer<ffi.NativeFunction<ffi.Void Function(EntityId)>>)>()
external void create_instance_ffi(
  ffi.Pointer<ffi.Void> sceneManager,
  int entityId,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(EntityId)>> callback,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, EntityId,
        ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>()
external void remove_entity_ffi(
  ffi.Pointer<ffi.Void> viewer,
  int asset,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> callback,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>,
        ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>()
external void clear_entities_ffi(
  ffi.Pointer<ffi.Void> viewer,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> callback,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, EntityId, ffi.Pointer<ffi.Char>,
        ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Bool)>>)>()
external void set_camera_ffi(
  ffi.Pointer<ffi.Void> viewer,
  int asset,
  ffi.Pointer<ffi.Char> nodeName,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Bool)>> callback,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, EntityId, ffi.Pointer<ffi.Char>,
        ffi.Pointer<ffi.Float>, ffi.Int)>()
external void apply_weights_ffi(
  ffi.Pointer<ffi.Void> sceneManager,
  int asset,
  ffi.Pointer<ffi.Char> entityName,
  ffi.Pointer<ffi.Float> weights,
  int count,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, EntityId, ffi.Int, ffi.Bool,
        ffi.Bool, ffi.Bool, ffi.Float)>()
external void play_animation_ffi(
  ffi.Pointer<ffi.Void> sceneManager,
  int asset,
  int index,
  bool loop,
  bool reverse,
  bool replaceActive,
  double crossfade,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, EntityId, ffi.Int, ffi.Int)>()
external void set_animation_frame_ffi(
  ffi.Pointer<ffi.Void> sceneManager,
  int asset,
  int animationIndex,
  int animationFrame,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, EntityId, ffi.Int)>()
external void stop_animation_ffi(
  ffi.Pointer<ffi.Void> sceneManager,
  int asset,
  int index,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, EntityId,
        ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Int)>>)>()
external void get_animation_count_ffi(
  ffi.Pointer<ffi.Void> sceneManager,
  int asset,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Int)>> callback,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, EntityId, ffi.Pointer<ffi.Char>,
        ffi.Int, ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>()
external void get_animation_name_ffi(
  ffi.Pointer<ffi.Void> sceneManager,
  int asset,
  ffi.Pointer<ffi.Char> outPtr,
  int index,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> callback,
);

@ffi.Native<
    ffi.Void Function(
        ffi.Pointer<ffi.Void>,
        EntityId,
        EntityId,
        ffi.Pointer<ffi.Char>,
        ffi.Int,
        ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>()
external void get_morph_target_name_ffi(
  ffi.Pointer<ffi.Void> sceneManager,
  int assetEntity,
  int childEntity,
  ffi.Pointer<ffi.Char> outPtr,
  int index,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> callback,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, EntityId, EntityId,
        ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Int32)>>)>()
external void get_morph_target_name_count_ffi(
  ffi.Pointer<ffi.Void> sceneManager,
  int asset,
  int childEntity,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Int32)>> callback,
);

@ffi.Native<
    ffi.Void Function(
        ffi.Pointer<ffi.Void>,
        EntityId,
        ffi.Pointer<ffi.Float>,
        ffi.Int,
        ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Bool)>>)>()
external void set_morph_target_weights_ffi(
  ffi.Pointer<ffi.Void> sceneManager,
  int asset,
  ffi.Pointer<ffi.Float> morphData,
  int numWeights,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Bool)>> callback,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, EntityId,
        ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Bool)>>)>()
external void update_bone_matrices_ffi(
  ffi.Pointer<ffi.Void> sceneManager,
  int asset,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Bool)>> callback,
);

@ffi.Native<
    ffi.Void Function(
        ffi.Pointer<ffi.Void>,
        EntityId,
        ffi.Int,
        ffi.Int,
        ffi.Pointer<ffi.Float>,
        ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Bool)>>)>()
external void set_bone_transform_ffi(
  ffi.Pointer<ffi.Void> sceneManager,
  int asset,
  int skinIndex,
  int boneIndex,
  ffi.Pointer<ffi.Float> transform,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Bool)>> callback,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Bool)>()
external void set_post_processing_ffi(
  ffi.Pointer<ffi.Void> viewer,
  bool enabled,
);

@ffi.Native<
    ffi.Void Function(ffi.Pointer<ffi.Void>, EntityId,
        ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>()
external void reset_to_rest_pose_ffi(
  ffi.Pointer<ffi.Void> sceneManager,
  int entityId,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> callback,
);

@ffi.Native<
    ffi.Void Function(
        ffi.Pointer<ffi.Void>,
        ffi.Pointer<ffi.Float>,
        ffi.Int,
        ffi.Pointer<ffi.Uint16>,
        ffi.Int,
        ffi.Int,
        ffi.Pointer<ffi.Char>,
        ffi.Pointer<ffi.NativeFunction<ffi.Void Function(EntityId)>>)>()
external void create_geometry_ffi(
  ffi.Pointer<ffi.Void> viewer,
  ffi.Pointer<ffi.Float> vertices,
  int numVertices,
  ffi.Pointer<ffi.Uint16> indices,
  int numIndices,
  int primitiveType,
  ffi.Pointer<ffi.Char> materialPath,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(EntityId)>> callback,
);

final class ResourceBuffer extends ffi.Struct {
  external ffi.Pointer<ffi.Void> data;

  @ffi.Int32()
  external int size;

  @ffi.Int32()
  external int id;
}

final class ResourceLoaderWrapper extends ffi.Struct {
  external LoadFilamentResource loadResource;

  external FreeFilamentResource freeResource;

  external LoadFilamentResourceFromOwner loadFromOwner;

  external FreeFilamentResourceFromOwner freeFromOwner;

  external ffi.Pointer<ffi.Void> owner;

  external LoadFilamentResourceIntoOutPointer loadToOut;
}

typedef LoadFilamentResource
    = ffi.Pointer<ffi.NativeFunction<LoadFilamentResourceFunction>>;
typedef LoadFilamentResourceFunction = ResourceBuffer Function(
    ffi.Pointer<ffi.Char> uri);
typedef FreeFilamentResource
    = ffi.Pointer<ffi.NativeFunction<FreeFilamentResourceFunction>>;
typedef FreeFilamentResourceFunction = ffi.Void Function(ResourceBuffer);
typedef DartFreeFilamentResourceFunction = void Function(ResourceBuffer);
typedef LoadFilamentResourceFromOwner
    = ffi.Pointer<ffi.NativeFunction<LoadFilamentResourceFromOwnerFunction>>;
typedef LoadFilamentResourceFromOwnerFunction = ResourceBuffer Function(
    ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Void>);
typedef FreeFilamentResourceFromOwner
    = ffi.Pointer<ffi.NativeFunction<FreeFilamentResourceFromOwnerFunction>>;
typedef FreeFilamentResourceFromOwnerFunction = ffi.Void Function(
    ResourceBuffer, ffi.Pointer<ffi.Void>);
typedef DartFreeFilamentResourceFromOwnerFunction = void Function(
    ResourceBuffer, ffi.Pointer<ffi.Void>);
typedef LoadFilamentResourceIntoOutPointer = ffi
    .Pointer<ffi.NativeFunction<LoadFilamentResourceIntoOutPointerFunction>>;
typedef LoadFilamentResourceIntoOutPointerFunction = ffi.Void Function(
    ffi.Pointer<ffi.Char> uri, ffi.Pointer<ResourceBuffer> out);
typedef DartLoadFilamentResourceIntoOutPointerFunction = void Function(
    ffi.Pointer<ffi.Char> uri, ffi.Pointer<ResourceBuffer> out);
typedef _ManipulatorMode = ffi.Int32;
typedef Dart_ManipulatorMode = int;
typedef FilamentRenderCallback
    = ffi.Pointer<ffi.NativeFunction<FilamentRenderCallbackFunction>>;
typedef FilamentRenderCallbackFunction = ffi.Void Function(
    ffi.Pointer<ffi.Void> owner);
typedef DartFilamentRenderCallbackFunction = void Function(
    ffi.Pointer<ffi.Void> owner);

/// This header replicates most of the methods in ThermionDartApi.h.
/// It represents the interface for:
/// - invoking those methods that must be called on the main Filament engine thread
/// - setting up a render loop
typedef EntityId = ffi.Int32;
typedef DartEntityId = int;

const int __bool_true_false_are_defined = 1;

const int true1 = 1;

const int false1 = 0;
