diff --git a/lib/classes/gsf/header2/collision_struct.dart b/lib/classes/gsf/header2/collision_struct.dart index aa4d080..15c6ecc 100644 --- a/lib/classes/gsf/header2/collision_struct.dart +++ b/lib/classes/gsf/header2/collision_struct.dart @@ -216,19 +216,19 @@ class BlockerCollisionStruct extends CollisionStruct { @override CollisionModel toModel() { - final center = Vector3(positionX.value, positionY.value, positionZ.value); - final distX = sizeX.value / 2; - final distY = sizeY.value / 2; - final distZ = sizeZ.value / 2; + final basePoint = Vector3(positionX.value, positionY.value, positionZ.value); // back bottom left + final distX = sizeX.value; + final distY = sizeY.value; + final distZ = sizeZ.value; final List vertices = [ - ModelVertex(center + Vector3(distX, distY, distZ)), // front top right - ModelVertex(center + Vector3(distX, distY, -distZ)), // front bottom right - ModelVertex(center + Vector3(distX, -distY, distZ)), // back top right - ModelVertex(center + Vector3(distX, -distY, -distZ)), // back bottom right - ModelVertex(center + Vector3(-distX, distY, distZ)), // front top left - ModelVertex(center + Vector3(-distX, distY, -distZ)), // front bottom left - ModelVertex(center + Vector3(-distX, -distY, distZ)), // back top left - ModelVertex(center + Vector3(-distX, -distY, -distZ)), // back bottom left + ModelVertex(basePoint + Vector3(distX, distY, distZ)), // front top right + ModelVertex(basePoint + Vector3(distX, distY, 0)), // front bottom right + ModelVertex(basePoint + Vector3(distX, 0, distZ)), // back top right + ModelVertex(basePoint + Vector3(distX, 0, 0)), // back bottom right + ModelVertex(basePoint + Vector3(0, distY, distZ)), // front top left + ModelVertex(basePoint + Vector3(0, distY, 0)), // front bottom left + ModelVertex(basePoint + Vector3(0, 0, distZ)), // back top left + ModelVertex(basePoint), // back bottom left ]; final List triangles = [ ModelTriangle( diff --git a/lib/widgets/viewer/model_drawer.dart b/lib/widgets/viewer/model_drawer.dart index 7ac8c5c..996fe23 100644 --- a/lib/widgets/viewer/model_drawer.dart +++ b/lib/widgets/viewer/model_drawer.dart @@ -25,6 +25,7 @@ class ModelDrawer extends CustomPainter { required this.showCloth, required this.showSkeleton, required this.showLinks, + required this.showCollisionBoxes, }) : super(repaint: mousePosition); final ValueNotifier mousePosition; @@ -37,6 +38,7 @@ class ModelDrawer extends CustomPainter { final bool showCloth; final bool showSkeleton; final bool showLinks; + final bool showCollisionBoxes; final Transformation transformation = Transformation(); @@ -196,7 +198,9 @@ class ModelDrawer extends CustomPainter { showCloths: showCloth, showTexture: showTexture, ); - model.drawCollisions(transformation, size, canvas, meshColor); + if (showCollisionBoxes) { + model.drawCollisions(transformation, size, canvas, meshColor); + } if (showSkeleton) { model.drawSkeleton( transformation, diff --git a/lib/widgets/viewer/notifier.dart b/lib/widgets/viewer/notifier.dart index f0d1640..d809b87 100644 --- a/lib/widgets/viewer/notifier.dart +++ b/lib/widgets/viewer/notifier.dart @@ -102,6 +102,14 @@ class ModelSelectionStateNotifier extends Notifier { orElse: () => null); } + void updateShowCollisionBoxes(bool showCollisionBoxes) { + state.maybeMap( + withModel: (withModel) { + state = withModel.copyWith(showCollisionBoxes: showCollisionBoxes); + }, + orElse: () => null); + } + void updateFilterAttribute(int indice) { state.maybeMap( withModel: (withModel) { diff --git a/lib/widgets/viewer/state.dart b/lib/widgets/viewer/state.dart index 7630b5f..99e453d 100644 --- a/lib/widgets/viewer/state.dart +++ b/lib/widgets/viewer/state.dart @@ -23,5 +23,6 @@ class ModelViewerSelectionState with _$ModelViewerSelectionState { @Default(false) showPartyColor, @Default(false) showSkeleton, @Default(true) showLinks, + @Default(false) showCollisionBoxes, }) = ModelViewerSelectionStateWithModel; } diff --git a/lib/widgets/viewer/state.freezed.dart b/lib/widgets/viewer/state.freezed.dart index e77c8d5..d714f58 100644 --- a/lib/widgets/viewer/state.freezed.dart +++ b/lib/widgets/viewer/state.freezed.dart @@ -33,7 +33,8 @@ mixin _$ModelViewerSelectionState { dynamic showTexture, dynamic showPartyColor, dynamic showSkeleton, - dynamic showLinks) + dynamic showLinks, + dynamic showCollisionBoxes) withModel, }) => throw _privateConstructorUsedError; @@ -52,7 +53,8 @@ mixin _$ModelViewerSelectionState { dynamic showTexture, dynamic showPartyColor, dynamic showSkeleton, - dynamic showLinks)? + dynamic showLinks, + dynamic showCollisionBoxes)? withModel, }) => throw _privateConstructorUsedError; @@ -70,7 +72,8 @@ mixin _$ModelViewerSelectionState { dynamic showTexture, dynamic showPartyColor, dynamic showSkeleton, - dynamic showLinks)? + dynamic showLinks, + dynamic showCollisionBoxes)? withModel, required TResult orElse(), }) => @@ -236,7 +239,8 @@ class _$EmptyImpl implements _Empty { dynamic showTexture, dynamic showPartyColor, dynamic showSkeleton, - dynamic showLinks) + dynamic showLinks, + dynamic showCollisionBoxes) withModel, }) { return empty(materialsTable, models); @@ -258,7 +262,8 @@ class _$EmptyImpl implements _Empty { dynamic showTexture, dynamic showPartyColor, dynamic showSkeleton, - dynamic showLinks)? + dynamic showLinks, + dynamic showCollisionBoxes)? withModel, }) { return empty?.call(materialsTable, models); @@ -279,7 +284,8 @@ class _$EmptyImpl implements _Empty { dynamic showTexture, dynamic showPartyColor, dynamic showSkeleton, - dynamic showLinks)? + dynamic showLinks, + dynamic showCollisionBoxes)? withModel, required TResult orElse(), }) { @@ -356,7 +362,8 @@ abstract class _$$ModelViewerSelectionStateWithModelImplCopyWith<$Res> dynamic showTexture, dynamic showPartyColor, dynamic showSkeleton, - dynamic showLinks}); + dynamic showLinks, + dynamic showCollisionBoxes}); } /// @nodoc @@ -382,6 +389,7 @@ class __$$ModelViewerSelectionStateWithModelImplCopyWithImpl<$Res> Object? showPartyColor = freezed, Object? showSkeleton = freezed, Object? showLinks = freezed, + Object? showCollisionBoxes = freezed, }) { return _then(_$ModelViewerSelectionStateWithModelImpl( models: null == models @@ -408,6 +416,9 @@ class __$$ModelViewerSelectionStateWithModelImplCopyWithImpl<$Res> showSkeleton: freezed == showSkeleton ? _value.showSkeleton! : showSkeleton, showLinks: freezed == showLinks ? _value.showLinks! : showLinks, + showCollisionBoxes: freezed == showCollisionBoxes + ? _value.showCollisionBoxes! + : showCollisionBoxes, )); } } @@ -426,7 +437,8 @@ class _$ModelViewerSelectionStateWithModelImpl this.showTexture = true, this.showPartyColor = false, this.showSkeleton = false, - this.showLinks = true}) + this.showLinks = true, + this.showCollisionBoxes = false}) : _models = models; final List _models; @@ -461,10 +473,13 @@ class _$ModelViewerSelectionStateWithModelImpl @override @JsonKey() final dynamic showLinks; + @override + @JsonKey() + final dynamic showCollisionBoxes; @override String toString() { - return 'ModelViewerSelectionState.withModel(models: $models, model: $model, filter: $filter, materialsTable: $materialsTable, showCloth: $showCloth, showNormals: $showNormals, showTexture: $showTexture, showPartyColor: $showPartyColor, showSkeleton: $showSkeleton, showLinks: $showLinks)'; + return 'ModelViewerSelectionState.withModel(models: $models, model: $model, filter: $filter, materialsTable: $materialsTable, showCloth: $showCloth, showNormals: $showNormals, showTexture: $showTexture, showPartyColor: $showPartyColor, showSkeleton: $showSkeleton, showLinks: $showLinks, showCollisionBoxes: $showCollisionBoxes)'; } @override @@ -486,7 +501,9 @@ class _$ModelViewerSelectionStateWithModelImpl .equals(other.showPartyColor, showPartyColor) && const DeepCollectionEquality() .equals(other.showSkeleton, showSkeleton) && - const DeepCollectionEquality().equals(other.showLinks, showLinks)); + const DeepCollectionEquality().equals(other.showLinks, showLinks) && + const DeepCollectionEquality() + .equals(other.showCollisionBoxes, showCollisionBoxes)); } @override @@ -501,7 +518,8 @@ class _$ModelViewerSelectionStateWithModelImpl const DeepCollectionEquality().hash(showTexture), const DeepCollectionEquality().hash(showPartyColor), const DeepCollectionEquality().hash(showSkeleton), - const DeepCollectionEquality().hash(showLinks)); + const DeepCollectionEquality().hash(showLinks), + const DeepCollectionEquality().hash(showCollisionBoxes)); @JsonKey(ignore: true) @override @@ -527,11 +545,22 @@ class _$ModelViewerSelectionStateWithModelImpl dynamic showTexture, dynamic showPartyColor, dynamic showSkeleton, - dynamic showLinks) + dynamic showLinks, + dynamic showCollisionBoxes) withModel, }) { - return withModel(models, model, filter, materialsTable, showCloth, - showNormals, showTexture, showPartyColor, showSkeleton, showLinks); + return withModel( + models, + model, + filter, + materialsTable, + showCloth, + showNormals, + showTexture, + showPartyColor, + showSkeleton, + showLinks, + showCollisionBoxes); } @override @@ -550,11 +579,22 @@ class _$ModelViewerSelectionStateWithModelImpl dynamic showTexture, dynamic showPartyColor, dynamic showSkeleton, - dynamic showLinks)? + dynamic showLinks, + dynamic showCollisionBoxes)? withModel, }) { - return withModel?.call(models, model, filter, materialsTable, showCloth, - showNormals, showTexture, showPartyColor, showSkeleton, showLinks); + return withModel?.call( + models, + model, + filter, + materialsTable, + showCloth, + showNormals, + showTexture, + showPartyColor, + showSkeleton, + showLinks, + showCollisionBoxes); } @override @@ -572,13 +612,24 @@ class _$ModelViewerSelectionStateWithModelImpl dynamic showTexture, dynamic showPartyColor, dynamic showSkeleton, - dynamic showLinks)? + dynamic showLinks, + dynamic showCollisionBoxes)? withModel, required TResult orElse(), }) { if (withModel != null) { - return withModel(models, model, filter, materialsTable, showCloth, - showNormals, showTexture, showPartyColor, showSkeleton, showLinks); + return withModel( + models, + model, + filter, + materialsTable, + showCloth, + showNormals, + showTexture, + showPartyColor, + showSkeleton, + showLinks, + showCollisionBoxes); } return orElse(); } @@ -619,16 +670,18 @@ class _$ModelViewerSelectionStateWithModelImpl abstract class ModelViewerSelectionStateWithModel implements ModelViewerSelectionState { const factory ModelViewerSelectionStateWithModel( - {required final List models, - required final ModelSettings model, - required final ChunkAttributes filter, - required final MaterialsTable materialsTable, - final dynamic showCloth, - final dynamic showNormals, - final dynamic showTexture, - final dynamic showPartyColor, - final dynamic showSkeleton, - final dynamic showLinks}) = _$ModelViewerSelectionStateWithModelImpl; + {required final List models, + required final ModelSettings model, + required final ChunkAttributes filter, + required final MaterialsTable materialsTable, + final dynamic showCloth, + final dynamic showNormals, + final dynamic showTexture, + final dynamic showPartyColor, + final dynamic showSkeleton, + final dynamic showLinks, + final dynamic showCollisionBoxes}) = + _$ModelViewerSelectionStateWithModelImpl; @override List get models; @@ -642,6 +695,7 @@ abstract class ModelViewerSelectionStateWithModel dynamic get showPartyColor; dynamic get showSkeleton; dynamic get showLinks; + dynamic get showCollisionBoxes; @override @JsonKey(ignore: true) _$$ModelViewerSelectionStateWithModelImplCopyWith< diff --git a/lib/widgets/viewer/viewer.dart b/lib/widgets/viewer/viewer.dart index 2db88b1..1d8dc36 100644 --- a/lib/widgets/viewer/viewer.dart +++ b/lib/widgets/viewer/viewer.dart @@ -152,6 +152,18 @@ class _ViewerControls extends ConsumerWidget { .updateShowLinks(value); }, ), + _ViewerSwitchsControl( + title: "Show Collision Boxes", + value: state.map( + empty: (_) => false, + withModel: (withModel) => withModel.showCollisionBoxes, + ), + onChanged: (value) { + ref + .read(modelSelectionStateNotifierProvider.notifier) + .updateShowCollisionBoxes(value); + }, + ), _ViewerSwitchsControl( title: "Show Normals", value: state.map( @@ -342,6 +354,7 @@ class Viewer extends StatelessWidget { showTexture, showSkeleton, showLinks, + showCollisionBoxes, controlAttributes, ) => CustomPaint( @@ -358,6 +371,7 @@ class Viewer extends StatelessWidget { showTexture: showTexture, showSkeleton: showSkeleton, showLinks: showLinks, + showCollisionBoxes: showCollisionBoxes, ), child: const SizedBox.expand(), ), @@ -370,7 +384,7 @@ class Viewer extends StatelessWidget { ViewerControlWrapper( overridingAttributes: attributesFilter, builder: (showCloth, showNomrals, showTexture, showSkeleton, - showLinks, attributes) => + showLinks, showCollisionBoxes, attributes) => ConvertToObjCta( model: model!, attributesFilter: attributes ?? defaultAttributes, @@ -381,8 +395,14 @@ class Viewer extends StatelessWidget { } } -typedef ViewerControlBuilder = Widget Function(bool showCloth, bool showNormals, - bool showTexture, bool showSkeleton, bool showLinks, ChunkAttributes?); +typedef ViewerControlBuilder = Widget Function( + bool showCloth, + bool showNormals, + bool showTexture, + bool showSkeleton, + bool showLinks, + bool showCollisionBoxes, + ChunkAttributes?); class ViewerControlWrapper extends ConsumerWidget { const ViewerControlWrapper({ @@ -396,7 +416,8 @@ class ViewerControlWrapper extends ConsumerWidget { @override Widget build(BuildContext context, ref) { if (overridingAttributes != null) { - return builder(false, false, true, false, false, overridingAttributes); + return builder( + false, false, true, false, false, false, overridingAttributes); } final state = ref.watch(modelSelectionStateNotifierProvider); return builder( @@ -420,6 +441,10 @@ class ViewerControlWrapper extends ConsumerWidget { empty: (_) => false, withModel: (withModel) => withModel.showLinks, ), + state.map( + empty: (_) => false, + withModel: (withModel) => withModel.showCollisionBoxes, + ), state.map( empty: (_) => null, withModel: (withModel) => withModel.filter,