flutter_fbx3d_viewer 1.0.0

  • Readme
  • Changelog
  • Example
  • Installing
  • 75

Flutter FBX 3D Viewer #

Flutter package for viewing FBX 3D animated files with textures

Support me: https://www.paypal.me/LaszloKozari

This library is experimental. Some FBX files, particularly older fbx files, may not load correctly. No guarantee is provided as FBX is a closed proprietary format.

This library is based on the dart_fbx library

Pictures #

alt text alt text alt text alt text alt text alt text

Video #

Video

Example #

FBX Viewer Example

Properties #

  Fbx3DViewer({
    @required this.size,
    @required this.fbxPath,                 // "assets/asd.fbx" or sd card path
    @required this.lightPosition,
    @required this.initialZoom,
    @required this.animationSpeed,          // 0-1
    @required this.fbx3DViewerController,
    @required this.refreshMilliseconds,
    @required this.endFrame,                //max frame to play
    this.texturePath,                       // "assets/asd.png" or sd card path
    this.backgroundColor = const Color(0xff353535),
    this.showInfo = false,
    this.showWireframe = false,
    this.wireframeColor = Colors.black,
    this.initialAngles,
    this.panDistanceToActivate = 10,        //pan distance to activate swype
    this.onZoomChangeListener,
    this.onRotationChangeListener,
    this.onHorizontalDragUpdate,
    this.onVerticalDragUpdate,
    this.color = Colors.white,
    this.lightColor = Colors.white,
    this.showWireFrame = true,
    this.showGrids = true,
    this.gridsColor = const Color(0xff4b4b4b),
    this.gridsMaxTile = 10,
    this.gridsTileSize = 1.0,
  });

Convert an FBX binary file to an FBX ASCII file that can this library handle #

1, First step is to download an animated/rigged fbx binary file from the net.

2, Second is to load that modell with AUTODESK MotionBuilder 2020 or AUTODESK 3DS Max!

3, Python Tools -> FBX Export on the MotionBuilder

FBX Version: FBX 2014/2015 -> Export

SAVE -> .fbx (ASCII)

Embed medias checked only

Save options:

Remove: (Settings)

Base Cameras

Camera switchers

Current camera

Global Lighting

Transport

Remove: (Scene)

Cameras (all)

Textures (all)

Video

TRIANGULATE

4, SAVE

Now if everything is went good in the fbx file header you can see this: ; FBX 7.4.0 project file

Limits #

FBX is a closed format, so while this library does it's best to interpret the data in an FBX file, I cannot guarantee that it will read all FBX files, or all data within FBX files. You can play with FBX version 7.4 files ASCII text format

Please don't use this library with a lot of vertices/polygons. Speed will be very low on huge point count.

Normal speed will be on an fbx that is max 3000-5000 vertices

Author #

Kozári László in 2020.01.16

License #

Licensed under the Apache License, Version 2.0 (the "License")

1.0.0 #

  • Textured version update

0.0.2 #

  • Weights FIX

0.0.1 #

  • First release

example/example.dart

import 'dart:async';
import 'dart:math';

import 'package:flutter/material.dart';
import 'package:flutter_fbx3d_viewer/fbx_viewer/flutter_fbx3d_viewer.dart';
import 'package:flutter_fbx3d_viewer/fbx_viewer/utils/screen_utils.dart';
import 'package:flutter_fbx3d_viewer/fbx_viewer/utils/utils.dart';
import 'package:provider/provider.dart';
import 'package:vector_math/vector_math.dart' as Math;

class Example extends StatefulWidget {
  @override
  _ExampleState createState() => _ExampleState();
}

class Object3DDetails {
  String animationPath;
  String animationTexturePath;
  Math.Vector3 rotation;
  double zoom;
  Color color, lightColor;
  double gridTileSize;
  int animationLength;
  double animationSpeed;

  Object3DDetails(this.animationPath, this.animationTexturePath, this.rotation, this.zoom, this.animationLength, this.animationSpeed,
      {this.color = Colors.black, this.lightColor = Colors.white, this.gridTileSize = 0.5});
}

List<Object3DDetails> _objects = [
  Object3DDetails(
    "assets/turtle.fbx",
    "assets/turtle.png",
    Math.Vector3(216, 10, 230),
    3,
    25,
    0.4,
    color: Colors.black.withOpacity(0.2),
    lightColor: Colors.white.withOpacity(0.7),
    gridTileSize: 15.0,
  ),
  Object3DDetails(
    "assets/teddy_walk.fbx",
    "assets/teddy.png",
    Math.Vector3(86, 10, 40),
    140,
    32,
    1.0,
    color: Colors.black.withOpacity(0.7),
    lightColor: Colors.white.withOpacity(0.3),
  ),
  Object3DDetails(
    "assets/teddy_idle.fbx",
    "assets/teddy.png",
    Math.Vector3(86, 10, 40),
    140,
    110,
    1.5,
    color: Colors.black.withOpacity(0.7),
    lightColor: Colors.white.withOpacity(0.3),
  ),
  Object3DDetails(
    "assets/knight.fbx",
    "assets/knight.png",
    Math.Vector3(260, 10, 0),
    30,
    16,
    0.7,
    color: Colors.black.withOpacity(0.8),
    lightColor: Colors.white.withOpacity(0.2),
    gridTileSize: 2,
  ),
  Object3DDetails(
    "assets/chipmunk.fbx",
    "assets/chipmunk.png",
    Math.Vector3(86, 10, 40),
    140,
    32,
    1.0,
    color: Colors.black.withOpacity(0.7),
    lightColor: Colors.white.withOpacity(0.3),
  ),
  Object3DDetails(
    "assets/shark.fbx",
    "assets/shark.png",
    Math.Vector3(86, 10, 40),
    140,
    32,
    1.0,
    color: Colors.black.withOpacity(0.7),
    lightColor: Colors.white.withOpacity(0.3),
  ),
];

class ChangeVariants with ChangeNotifier {
  bool _showWireframe = false;
  int _objIndex = 0;
  double _lightAngle = 0.0;
  Math.Vector3 _lightPosition = Math.Vector3(20.0, 20.0, 10.0);
  bool _rndColor = false;

  bool get rndColor => _rndColor;

  int get objIndex => _objIndex;

  double get lightAngle => _lightAngle;

  Math.Vector3 get lightPosition => _lightPosition;

  bool get showWireframe => _showWireframe;

  set rndColor(bool value) {
    _rndColor = value;
  }

  set objIndex(int value) {
    _objIndex = value;
    notifyListeners();
  }

  set showWireframe(bool value) {
    _showWireframe = value;
    notifyListeners();
  }

  set lightAngle(double value) {
    _lightAngle = value;
    notifyListeners();
  }

  set lightPosition(Math.Vector3 value) {
    _lightPosition = value;
    notifyListeners();
  }
}

class _ExampleState extends State<Example> {
  Fbx3DViewerController _fbx3DAnimationController;
  Timer _renderTimer;
  ChangeVariants _changeVariantsSet;

  _ExampleState() {
    _fbx3DAnimationController = Fbx3DViewerController();
  }

  @override
  void initState() {
    super.initState();
    _init();
  }

  _init() async {
    _changeVariantsSet = Provider.of<ChangeVariants>(context, listen: false);
    _fbx3DAnimationController = Fbx3DViewerController();
    _startTimer();
  }

  _startTimer() {
    _renderTimer = Timer.periodic(const Duration(milliseconds: 50), (t) {
      final d = 10.0;
      _changeVariantsSet.lightAngle += 0.8;
      if (_changeVariantsSet.lightAngle > 360) _changeVariantsSet.lightAngle = 0;
      double fx = sin(Math.radians(_changeVariantsSet.lightAngle)) * d;
      double fz = cos(Math.radians(_changeVariantsSet.lightAngle)) * d;
      _changeVariantsSet.lightPosition.setValues(-fx, -fz, 0);
      _fbx3DAnimationController.setLightPosition(_changeVariantsSet.lightPosition);
    });
  }

  _endTimer() => _renderTimer.cancel();

  @override
  void dispose() {
    super.dispose();
    _endTimer();
  }

  _nextObj() async {
    _changeVariantsSet.objIndex++;
    if (_changeVariantsSet.objIndex >= _objects.length) _changeVariantsSet.objIndex = 0;
    _fbx3DAnimationController.refresh();

    Future.delayed(Duration(milliseconds: 50), () {
      _fbx3DAnimationController.reload().then((_) {
        Future.delayed(Duration(milliseconds: 100), () {
          _fbx3DAnimationController.refresh();
        });
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    ScreenUtils.init(context);

    final changeVariantsGet = Provider.of<ChangeVariants>(context);
    final object = _objects[changeVariantsGet.objIndex];

    return Scaffold(
        backgroundColor: const Color(0xff353535),
        body: SafeArea(
            child: Stack(
              children: <Widget>[
                Fbx3DViewer(
                  lightPosition: Math.Vector3(20, 10, 10),
                  lightColor: Colors.black.withOpacity(0.2),
                  color: changeVariantsGet._rndColor ? randomColor(opacity: 0.8) : Colors.black.withOpacity(0.8),
                  refreshMilliseconds: 1,
                  size: Size(ScreenUtils.width, ScreenUtils.height),
                  initialZoom: object.zoom,
                  endFrame: object.animationLength,
                  initialAngles: object.rotation,
                  fbxPath: object.animationPath,
                  texturePath: object.animationTexturePath,
                  animationSpeed: object.animationSpeed,
                  fbx3DViewerController: _fbx3DAnimationController,
                  showInfo: true,
                  showWireframe: changeVariantsGet._showWireframe,
                  wireframeColor: changeVariantsGet._rndColor ? randomColor(opacity: 0.5) : Colors.blue.withOpacity(0.5),
                  onHorizontalDragUpdate: (d) {
                    if (object.animationPath.contains("turtle") || object.animationPath.contains("knight"))
                      _fbx3DAnimationController.rotateZ(d);
                    else
                      _fbx3DAnimationController.rotateZ(-d);
                  },
                  onVerticalDragUpdate: (d) => _fbx3DAnimationController.rotateX(d),
                  onZoomChangeListener: (zoom) => object.zoom = zoom,
                  onRotationChangeListener: (Math.Vector3 rotation) => object.rotation.setFrom(rotation),
                  panDistanceToActivate: 50,
                  gridsTileSize: object.gridTileSize,
                ),
                FlatButton(
                  color: Colors.white,
                  child: Text("Change model"),
                  onPressed: () => _nextObj(),
                ),
                Align(
                  child: SizedBox(
                      height: 120,
                      width: ScreenUtils.width / 2,
                      child: Column(
                        children: <Widget>[
                          CheckboxListTile(
                            title: Text("Wireframe"),
                            value: changeVariantsGet._showWireframe,
                            onChanged: (v) {
                              _changeVariantsSet.showWireframe = v;
                              _fbx3DAnimationController.showWireframe(_changeVariantsSet.showWireframe);
                            },
                            controlAffinity: ListTileControlAffinity.leading,
                          ),
                          CheckboxListTile(
                            title: Text("Rnd colors"),
                            value: changeVariantsGet._rndColor,
                            onChanged: (v) {
                              _changeVariantsSet.rndColor = v;
                              _fbx3DAnimationController.setRandomColors(randomColor(opacity: 0.7), randomColor(opacity: 0.3));
                            },
                            controlAffinity: ListTileControlAffinity.leading,
                          )
                        ],
                      )),
                  alignment: Alignment.topRight,
                )
              ],
            )));
  }
}

Use this package as a library

1. Depend on it

Add this to your package's pubspec.yaml file:


dependencies:
  flutter_fbx3d_viewer: ^1.0.0

2. Install it

You can install packages from the command line:

with Flutter:


$ flutter pub get

Alternatively, your editor might support flutter pub get. Check the docs for your editor to learn more.

3. Import it

Now in your Dart code, you can use:


import 'package:flutter_fbx3d_viewer/fbx_parser/fbx.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/bit_operators.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/fbx_ascii_parser.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/fbx_binary_parser.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/fbx_element.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/fbx_loader.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/fbx_parser.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/input_buffer.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/matrix_utils.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_anim_curve.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_anim_curve_node.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_anim_evaluator.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_anim_key.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_anim_layer.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_anim_stack.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_camera.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_camera_switcher.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_cluster.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_deformer.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_display_mesh.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_edge.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_frame_rate.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_geometry.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_global_settings.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_layer.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_layer_element.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_light.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_mapping_mode.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_material.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_mesh.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_node.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_node_attribute.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_null.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_object.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_polygon.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_pose.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_property.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_reference_mode.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_scene.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_skeleton.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_skin_deformer.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_texture.dart';
import 'package:flutter_fbx3d_viewer/fbx_parser/fbx/scene/fbx_video.dart';
import 'package:flutter_fbx3d_viewer/fbx_viewer/fbx3d_model.dart';
import 'package:flutter_fbx3d_viewer/fbx_viewer/fbx3d_object.dart';
import 'package:flutter_fbx3d_viewer/fbx_viewer/fbx3d_viewer.dart';
import 'package:flutter_fbx3d_viewer/fbx_viewer/flutter_fbx3d_viewer.dart';
import 'package:flutter_fbx3d_viewer/fbx_viewer/painter/globals.dart';
import 'package:flutter_fbx3d_viewer/fbx_viewer/painter/texture_data.dart';
import 'package:flutter_fbx3d_viewer/fbx_viewer/painter/vertices_painter.dart';
import 'package:flutter_fbx3d_viewer/fbx_viewer/utils/converter.dart';
import 'package:flutter_fbx3d_viewer/fbx_viewer/utils/logger.dart';
import 'package:flutter_fbx3d_viewer/fbx_viewer/utils/math_utils.dart';
import 'package:flutter_fbx3d_viewer/fbx_viewer/utils/screen_utils.dart';
import 'package:flutter_fbx3d_viewer/fbx_viewer/utils/utils.dart';
import 'package:flutter_fbx3d_viewer/fbx_viewer/widgets/zoom_gesture_detector.dart';
  
Popularity:
Describes how popular the package is relative to other packages. [more]
58
Health:
Code health derived from static analysis. [more]
87
Maintenance:
Reflects how tidy and up-to-date the package is. [more]
98
Overall:
Weighted score of the above. [more]
75
Learn more about scoring.

We analyzed this package on Mar 27, 2020, and provided a score, details, and suggestions below. Analysis was completed with status completed using:

  • Dart: 2.7.1
  • pana: 0.13.6
  • Flutter: 1.12.13+hotfix.8

Health suggestions

Fix lib/fbx_parser/fbx/fbx_ascii_parser.dart. (-11.33 points)

Analysis of lib/fbx_parser/fbx/fbx_ascii_parser.dart reported 24 hints, including:

line 195 col 13: Name non-constant identifiers using lowerCamelCase.

line 196 col 13: Name non-constant identifiers using lowerCamelCase.

line 197 col 13: Name non-constant identifiers using lowerCamelCase.

line 198 col 13: Name non-constant identifiers using lowerCamelCase.

line 199 col 13: Name non-constant identifiers using lowerCamelCase.

Fix lib/fbx_parser/fbx/fbx_loader.dart. (-0.50 points)

Analysis of lib/fbx_parser/fbx/fbx_loader.dart reported 1 hint:

line 241 col 11: Name non-constant identifiers using lowerCamelCase.

Fix lib/fbx_parser/fbx/scene/fbx_mapping_mode.dart. (-0.50 points)

Analysis of lib/fbx_parser/fbx/scene/fbx_mapping_mode.dart reported 1 hint:

line 34 col 36: Avoid using braces in interpolation when not needed.

Fix additional 44 files with analysis or formatting issues. (-1 points)

Additional issues in the following files:

  • lib/fbx_parser/fbx/scene/fbx_property.dart (1 hint)
  • lib/fbx_viewer/flutter_fbx3d_viewer.dart (1 hint)
  • lib/fbx_parser/fbx/bit_operators.dart (Run flutter format to format lib/fbx_parser/fbx/bit_operators.dart.)
  • lib/fbx_parser/fbx/fbx_element.dart (Run flutter format to format lib/fbx_parser/fbx/fbx_element.dart.)
  • lib/fbx_parser/fbx/input_buffer.dart (Run flutter format to format lib/fbx_parser/fbx/input_buffer.dart.)
  • lib/fbx_parser/fbx/scene/fbx_anim_curve.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_anim_curve.dart.)
  • lib/fbx_parser/fbx/scene/fbx_anim_curve_node.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_anim_curve_node.dart.)
  • lib/fbx_parser/fbx/scene/fbx_anim_evaluator.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_anim_evaluator.dart.)
  • lib/fbx_parser/fbx/scene/fbx_anim_key.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_anim_key.dart.)
  • lib/fbx_parser/fbx/scene/fbx_anim_layer.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_anim_layer.dart.)
  • lib/fbx_parser/fbx/scene/fbx_anim_stack.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_anim_stack.dart.)
  • lib/fbx_parser/fbx/scene/fbx_camera.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_camera.dart.)
  • lib/fbx_parser/fbx/scene/fbx_camera_switcher.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_camera_switcher.dart.)
  • lib/fbx_parser/fbx/scene/fbx_cluster.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_cluster.dart.)
  • lib/fbx_parser/fbx/scene/fbx_deformer.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_deformer.dart.)
  • lib/fbx_parser/fbx/scene/fbx_display_mesh.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_display_mesh.dart.)
  • lib/fbx_parser/fbx/scene/fbx_geometry.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_geometry.dart.)
  • lib/fbx_parser/fbx/scene/fbx_global_settings.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_global_settings.dart.)
  • lib/fbx_parser/fbx/scene/fbx_layer.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_layer.dart.)
  • lib/fbx_parser/fbx/scene/fbx_layer_element.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_layer_element.dart.)
  • lib/fbx_parser/fbx/scene/fbx_light.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_light.dart.)
  • lib/fbx_parser/fbx/scene/fbx_material.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_material.dart.)
  • lib/fbx_parser/fbx/scene/fbx_mesh.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_mesh.dart.)
  • lib/fbx_parser/fbx/scene/fbx_node.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_node.dart.)
  • lib/fbx_parser/fbx/scene/fbx_node_attribute.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_node_attribute.dart.)
  • lib/fbx_parser/fbx/scene/fbx_null.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_null.dart.)
  • lib/fbx_parser/fbx/scene/fbx_object.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_object.dart.)
  • lib/fbx_parser/fbx/scene/fbx_polygon.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_polygon.dart.)
  • lib/fbx_parser/fbx/scene/fbx_pose.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_pose.dart.)
  • lib/fbx_parser/fbx/scene/fbx_reference_mode.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_reference_mode.dart.)
  • lib/fbx_parser/fbx/scene/fbx_scene.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_scene.dart.)
  • lib/fbx_parser/fbx/scene/fbx_skeleton.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_skeleton.dart.)
  • lib/fbx_parser/fbx/scene/fbx_skin_deformer.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_skin_deformer.dart.)
  • lib/fbx_parser/fbx/scene/fbx_texture.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_texture.dart.)
  • lib/fbx_parser/fbx/scene/fbx_video.dart (Run flutter format to format lib/fbx_parser/fbx/scene/fbx_video.dart.)
  • lib/fbx_viewer/fbx3d_model.dart (Run flutter format to format lib/fbx_viewer/fbx3d_model.dart.)
  • lib/fbx_viewer/painter/globals.dart (Run flutter format to format lib/fbx_viewer/painter/globals.dart.)
  • lib/fbx_viewer/painter/texture_data.dart (Run flutter format to format lib/fbx_viewer/painter/texture_data.dart.)
  • lib/fbx_viewer/painter/vertices_painter.dart (Run flutter format to format lib/fbx_viewer/painter/vertices_painter.dart.)
  • lib/fbx_viewer/utils/logger.dart (Run flutter format to format lib/fbx_viewer/utils/logger.dart.)
  • lib/fbx_viewer/utils/math_utils.dart (Run flutter format to format lib/fbx_viewer/utils/math_utils.dart.)
  • lib/fbx_viewer/utils/screen_utils.dart (Run flutter format to format lib/fbx_viewer/utils/screen_utils.dart.)
  • lib/fbx_viewer/utils/utils.dart (Run flutter format to format lib/fbx_viewer/utils/utils.dart.)
  • lib/fbx_viewer/widgets/zoom_gesture_detector.dart (Run flutter format to format lib/fbx_viewer/widgets/zoom_gesture_detector.dart.)

Maintenance suggestions

Update README.md. (-2 points)

1 image link is insecure (e.g. http://img.youtube.com/vi/hTnkwEGFu9k/0.jpg), use https URLs instead.

Dependencies

Package Constraint Resolved Available
Direct dependencies
Dart SDK >=2.1.0 <3.0.0
archive >=2.0.0 <3.0.0 2.0.13
flutter 0.0.0
image >=2.0.0 <3.0.0 2.1.12
provider ^4.0.2 4.0.4 4.1.0-dev+2
vector_math ^2.0.8 2.0.8
Transitive dependencies
args 1.6.0
charcode 1.1.3
collection 1.14.11 1.14.12
convert 2.1.1
crypto 2.1.4
meta 1.1.8
nested 0.0.4
path 1.6.4
petitparser 3.0.1
sky_engine 0.0.99
typed_data 1.1.6
xml 3.7.0
Dev dependencies
flutter_test