├── ios
├── Flutter
│ ├── Debug.xcconfig
│ ├── Release.xcconfig
│ └── AppFrameworkInfo.plist
├── Runner
│ ├── Runner-Bridging-Header.h
│ ├── Assets.xcassets
│ │ ├── LaunchImage.imageset
│ │ │ ├── LaunchImage.png
│ │ │ ├── LaunchImage@2x.png
│ │ │ ├── LaunchImage@3x.png
│ │ │ ├── README.md
│ │ │ └── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ ├── Icon-App-20x20@1x.png
│ │ │ ├── Icon-App-20x20@2x.png
│ │ │ ├── Icon-App-20x20@3x.png
│ │ │ ├── Icon-App-29x29@1x.png
│ │ │ ├── Icon-App-29x29@2x.png
│ │ │ ├── Icon-App-29x29@3x.png
│ │ │ ├── Icon-App-40x40@1x.png
│ │ │ ├── Icon-App-40x40@2x.png
│ │ │ ├── Icon-App-40x40@3x.png
│ │ │ ├── Icon-App-60x60@2x.png
│ │ │ ├── Icon-App-60x60@3x.png
│ │ │ ├── Icon-App-76x76@1x.png
│ │ │ ├── Icon-App-76x76@2x.png
│ │ │ ├── Icon-App-1024x1024@1x.png
│ │ │ ├── Icon-App-83.5x83.5@2x.png
│ │ │ └── Contents.json
│ ├── AppDelegate.swift
│ ├── Base.lproj
│ │ ├── Main.storyboard
│ │ └── LaunchScreen.storyboard
│ └── Info.plist
├── Runner.xcodeproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ ├── WorkspaceSettings.xcsettings
│ │ │ └── IDEWorkspaceChecks.plist
│ ├── xcshareddata
│ │ └── xcschemes
│ │ │ └── Runner.xcscheme
│ └── project.pbxproj
├── Runner.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── WorkspaceSettings.xcsettings
│ │ └── IDEWorkspaceChecks.plist
├── RunnerTests
│ └── RunnerTests.swift
└── .gitignore
├── web
├── favicon.png
├── icons
│ ├── Icon-192.png
│ ├── Icon-512.png
│ ├── Icon-maskable-192.png
│ └── Icon-maskable-512.png
├── manifest.json
└── index.html
├── android
├── gradle.properties
├── app
│ ├── src
│ │ ├── main
│ │ │ ├── res
│ │ │ │ ├── mipmap-hdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-mdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxxhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── drawable
│ │ │ │ │ └── launch_background.xml
│ │ │ │ ├── drawable-v21
│ │ │ │ │ └── launch_background.xml
│ │ │ │ ├── values
│ │ │ │ │ └── styles.xml
│ │ │ │ └── values-night
│ │ │ │ │ └── styles.xml
│ │ │ ├── kotlin
│ │ │ │ └── com
│ │ │ │ │ └── example
│ │ │ │ │ └── flutter_interactive_shader_demo
│ │ │ │ │ └── MainActivity.kt
│ │ │ └── AndroidManifest.xml
│ │ ├── debug
│ │ │ └── AndroidManifest.xml
│ │ └── profile
│ │ │ └── AndroidManifest.xml
│ └── build.gradle
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
├── .gitignore
├── build.gradle
└── settings.gradle
├── lib
├── main.dart
└── ui
│ ├── widgets
│ ├── title_widget.dart
│ ├── shader_painter.dart
│ └── shader_widget.dart
│ └── shader_page.dart
├── pubspec.yaml
├── .gitignore
├── test
└── widget_test.dart
├── analysis_options.yaml
├── .metadata
├── README.md
├── pubspec.lock
└── shaders
└── fireball.frag
/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/web/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/web/favicon.png
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.useAndroidX=true
3 | android.enableJetifier=true
4 |
--------------------------------------------------------------------------------
/web/icons/Icon-192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/web/icons/Icon-192.png
--------------------------------------------------------------------------------
/web/icons/Icon-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/web/icons/Icon-512.png
--------------------------------------------------------------------------------
/web/icons/Icon-maskable-192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/web/icons/Icon-maskable-192.png
--------------------------------------------------------------------------------
/web/icons/Icon-maskable-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/web/icons/Icon-maskable-512.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monster555/flutter_interactive_shader_demo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/example/flutter_interactive_shader_demo/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.example.flutter_interactive_shader_demo
2 |
3 | import io.flutter.embedding.android.FlutterActivity
4 |
5 | class MainActivity: FlutterActivity() {
6 | }
7 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | zipStoreBase=GRADLE_USER_HOME
4 | zipStorePath=wrapper/dists
5 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
6 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
9 | # Remember to never publicly share your keystore.
10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
11 | key.properties
12 | **/*.keystore
13 | **/*.jks
14 |
--------------------------------------------------------------------------------
/ios/RunnerTests/RunnerTests.swift:
--------------------------------------------------------------------------------
1 | import Flutter
2 | import UIKit
3 | import XCTest
4 |
5 | class RunnerTests: XCTestCase {
6 |
7 | func testExample() {
8 | // If you add code to the Runner application, consider adding tests here.
9 | // See https://developer.apple.com/documentation/xctest for more information about using XCTest.
10 | }
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md:
--------------------------------------------------------------------------------
1 | # Launch Screen Assets
2 |
3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4 |
5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import Flutter
3 |
4 | @UIApplicationMain
5 | @objc class AppDelegate: FlutterAppDelegate {
6 | override func application(
7 | _ application: UIApplication,
8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
9 | ) -> Bool {
10 | GeneratedPluginRegistrant.register(with: self)
11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions)
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-v21/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "LaunchImage.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "LaunchImage@2x.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "LaunchImage@3x.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/lib/main.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_interactive_shader_demo/ui/shader_page.dart';
3 |
4 | void main() => runApp(const MyApp());
5 |
6 | class MyApp extends StatelessWidget {
7 | const MyApp({super.key});
8 |
9 | @override
10 | Widget build(BuildContext context) {
11 | return MaterialApp(
12 | title: 'Flutter Interactive Shader Demo',
13 | theme: ThemeData(
14 | colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
15 | useMaterial3: true,
16 | ),
17 | home: const ShaderPage('fireball.frag'),
18 | );
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/ios/.gitignore:
--------------------------------------------------------------------------------
1 | **/dgph
2 | *.mode1v3
3 | *.mode2v3
4 | *.moved-aside
5 | *.pbxuser
6 | *.perspectivev3
7 | **/*sync/
8 | .sconsign.dblite
9 | .tags*
10 | **/.vagrant/
11 | **/DerivedData/
12 | Icon?
13 | **/Pods/
14 | **/.symlinks/
15 | profile
16 | xcuserdata
17 | **/.generated/
18 | Flutter/App.framework
19 | Flutter/Flutter.framework
20 | Flutter/Flutter.podspec
21 | Flutter/Generated.xcconfig
22 | Flutter/ephemeral/
23 | Flutter/app.flx
24 | Flutter/app.zip
25 | Flutter/flutter_assets/
26 | Flutter/flutter_export_environment.sh
27 | ServiceDefinitions.json
28 | Runner/GeneratedPluginRegistrant.*
29 |
30 | # Exceptions to above rules.
31 | !default.mode1v3
32 | !default.mode2v3
33 | !default.pbxuser
34 | !default.perspectivev3
35 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.7.10'
3 | repositories {
4 | google()
5 | mavenCentral()
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:7.3.0'
10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11 | }
12 | }
13 |
14 | allprojects {
15 | repositories {
16 | google()
17 | mavenCentral()
18 | }
19 | }
20 |
21 | rootProject.buildDir = '../build'
22 | subprojects {
23 | project.buildDir = "${rootProject.buildDir}/${project.name}"
24 | }
25 | subprojects {
26 | project.evaluationDependsOn(':app')
27 | }
28 |
29 | tasks.register("clean", Delete) {
30 | delete rootProject.buildDir
31 | }
32 |
--------------------------------------------------------------------------------
/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: flutter_interactive_shader_demo
2 | description: Flutter Interactive Shader Demo
3 |
4 | publish_to: 'none'
5 |
6 | version: 1.0.0+1
7 |
8 | environment:
9 | sdk: '>=3.1.4 <4.0.0'
10 |
11 | dependencies:
12 | flutter:
13 | sdk: flutter
14 |
15 | cupertino_icons: ^1.0.2
16 | vector_math: ^2.1.4
17 |
18 | dev_dependencies:
19 | flutter_test:
20 | sdk: flutter
21 |
22 | flutter_lints: ^3.0.1
23 |
24 | flutter:
25 | uses-material-design: true
26 |
27 | shaders:
28 | - shaders/fireball.frag
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | def flutterSdkPath = {
3 | def properties = new Properties()
4 | file("local.properties").withInputStream { properties.load(it) }
5 | def flutterSdkPath = properties.getProperty("flutter.sdk")
6 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
7 | return flutterSdkPath
8 | }
9 | settings.ext.flutterSdkPath = flutterSdkPath()
10 |
11 | includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle")
12 |
13 | plugins {
14 | id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false
15 | }
16 | }
17 |
18 | include ":app"
19 |
20 | apply from: "${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle/app_plugin_loader.gradle"
21 |
--------------------------------------------------------------------------------
/lib/ui/widgets/title_widget.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | /// The [TitleWidget] is a very simple widget that displays a title with
4 | /// instructions on how to interact with the widget
5 | class TitleWidget extends StatelessWidget {
6 | /// Creates a [TitleWidget]
7 | const TitleWidget({super.key});
8 |
9 | @override
10 | Widget build(BuildContext context) {
11 | return Align(
12 | alignment: Alignment.topCenter,
13 | child: Padding(
14 | padding: const EdgeInsets.only(top: 16.0),
15 | child: Text(
16 | 'Drag to rotate',
17 | style: Theme.of(context).textTheme.titleLarge!.copyWith(
18 | color: Colors.white,
19 | fontWeight: FontWeight.bold,
20 | ),
21 | textAlign: TextAlign.center,
22 | ),
23 | ),
24 | );
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .atom/
8 | .buildlog/
9 | .history
10 | .svn/
11 | migrate_working_dir/
12 |
13 | # IntelliJ related
14 | *.iml
15 | *.ipr
16 | *.iws
17 | .idea/
18 |
19 | # The .vscode folder contains launch configuration and tasks you configure in
20 | # VS Code which you may wish to be included in version control, so this line
21 | # is commented out by default.
22 | #.vscode/
23 |
24 | # Flutter/Dart/Pub related
25 | **/doc/api/
26 | **/ios/Flutter/.last_build_id
27 | .dart_tool/
28 | .flutter-plugins
29 | .flutter-plugins-dependencies
30 | .packages
31 | .pub-cache/
32 | .pub/
33 | /build/
34 |
35 | # Symbolication related
36 | app.*.symbols
37 |
38 | # Obfuscation related
39 | app.*.map.json
40 |
41 | # Android Studio will place build artifacts here
42 | /android/app/debug
43 | /android/app/profile
44 | /android/app/release
45 |
--------------------------------------------------------------------------------
/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | App
9 | CFBundleIdentifier
10 | io.flutter.flutter.app
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | App
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1.0
23 | MinimumOSVersion
24 | 11.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values-night/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/lib/ui/shader_page.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_interactive_shader_demo/ui/widgets/shader_widget.dart';
3 | import 'package:flutter_interactive_shader_demo/ui/widgets/title_widget.dart';
4 |
5 | /// A page for displaying a shader effect using the [ShaderWidget].
6 | ///
7 | /// The [ShaderPage] widget is used to display a shader effect in a full-screen view.
8 | ///
9 | /// Parameters:
10 | ///
11 | /// - [shaderName] The name of the shader to display on this page.
12 | class ShaderPage extends StatelessWidget {
13 | /// Creates a [ShaderPage] widget.
14 | const ShaderPage(this.shaderName, {super.key});
15 |
16 | /// The name of the shader to display on this page.
17 | final String shaderName;
18 |
19 | @override
20 | Widget build(BuildContext context) {
21 | return Scaffold(
22 | body: Stack(
23 | children: [
24 | // Display the shader widget.
25 | ShaderWidget(shaderName),
26 | // Display the title widget.
27 | const TitleWidget()
28 | ],
29 | ),
30 | );
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/lib/ui/widgets/shader_painter.dart:
--------------------------------------------------------------------------------
1 | part of 'shader_widget.dart';
2 |
3 | /// A custom painter that applies a fragment shader to the provided canvas.
4 | class ShaderPainter extends CustomPainter {
5 | /// The fragment shader to be applied to the canvas.
6 | final FragmentShader shader;
7 |
8 | /// Creates a [ShaderPainter] with the specified [shader].
9 | ///
10 | /// The [shader] represents the fragment shader to be applied to the canvas.
11 | ShaderPainter(this.shader);
12 |
13 | @override
14 | void paint(Canvas canvas, Size size) {
15 | canvas
16 | // Translate to the bottom right corner of the canvas.
17 | ..translate(size.width, size.height)
18 | // Rotate the canvas by 180 degrees.
19 | ..rotate(180 * degrees2Radians)
20 | ..drawRect(
21 | // Draw a rectangle.
22 | Rect.fromLTWH(0, 0, size.width, size.height),
23 | // Apply the shader to the rectangle.
24 | Paint()..shader = shader,
25 | );
26 | }
27 |
28 | @override
29 | bool shouldRepaint(covariant CustomPainter oldDelegate) =>
30 | oldDelegate != this;
31 | }
32 |
--------------------------------------------------------------------------------
/web/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "flutter_interactive_shader_demo",
3 | "short_name": "flutter_interactive_shader_demo",
4 | "start_url": ".",
5 | "display": "standalone",
6 | "background_color": "#0175C2",
7 | "theme_color": "#0175C2",
8 | "description": "A new Flutter project.",
9 | "orientation": "portrait-primary",
10 | "prefer_related_applications": false,
11 | "icons": [
12 | {
13 | "src": "icons/Icon-192.png",
14 | "sizes": "192x192",
15 | "type": "image/png"
16 | },
17 | {
18 | "src": "icons/Icon-512.png",
19 | "sizes": "512x512",
20 | "type": "image/png"
21 | },
22 | {
23 | "src": "icons/Icon-maskable-192.png",
24 | "sizes": "192x192",
25 | "type": "image/png",
26 | "purpose": "maskable"
27 | },
28 | {
29 | "src": "icons/Icon-maskable-512.png",
30 | "sizes": "512x512",
31 | "type": "image/png",
32 | "purpose": "maskable"
33 | }
34 | ]
35 | }
36 |
--------------------------------------------------------------------------------
/test/widget_test.dart:
--------------------------------------------------------------------------------
1 | // This is a basic Flutter widget test.
2 | //
3 | // To perform an interaction with a widget in your test, use the WidgetTester
4 | // utility in the flutter_test package. For example, you can send tap and scroll
5 | // gestures. You can also use WidgetTester to find child widgets in the widget
6 | // tree, read text, and verify that the values of widget properties are correct.
7 |
8 | import 'package:flutter/material.dart';
9 | import 'package:flutter_test/flutter_test.dart';
10 |
11 | import 'package:flutter_interactive_shader_demo/main.dart';
12 |
13 | void main() {
14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async {
15 | // Build our app and trigger a frame.
16 | await tester.pumpWidget(const MyApp());
17 |
18 | // Verify that our counter starts at 0.
19 | expect(find.text('0'), findsOneWidget);
20 | expect(find.text('1'), findsNothing);
21 |
22 | // Tap the '+' icon and trigger a frame.
23 | await tester.tap(find.byIcon(Icons.add));
24 | await tester.pump();
25 |
26 | // Verify that our counter has incremented.
27 | expect(find.text('0'), findsNothing);
28 | expect(find.text('1'), findsOneWidget);
29 | });
30 | }
31 |
--------------------------------------------------------------------------------
/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | # This file configures the analyzer, which statically analyzes Dart code to
2 | # check for errors, warnings, and lints.
3 | #
4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled
5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
6 | # invoked from the command line by running `flutter analyze`.
7 |
8 | # The following line activates a set of recommended lints for Flutter apps,
9 | # packages, and plugins designed to encourage good coding practices.
10 | include: package:flutter_lints/flutter.yaml
11 |
12 | linter:
13 | # The lint rules applied to this project can be customized in the
14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml`
15 | # included above or to enable additional rules. A list of all available lints
16 | # and their documentation is published at https://dart.dev/lints.
17 | #
18 | # Instead of disabling a lint rule for the entire project in the
19 | # section below, it can also be suppressed for a single line of code
20 | # or a specific dart file by using the `// ignore: name_of_lint` and
21 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file
22 | # producing the lint.
23 | rules:
24 | # avoid_print: false # Uncomment to disable the `avoid_print` rule
25 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
26 |
27 | # Additional information about this file can be found at
28 | # https://dart.dev/guides/language/analysis-options
29 |
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
14 |
18 |
22 |
23 |
24 |
25 |
26 |
27 |
29 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled and should not be manually edited.
5 |
6 | version:
7 | revision: "6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e"
8 | channel: "stable"
9 |
10 | project_type: app
11 |
12 | # Tracks metadata for the flutter migrate command
13 | migration:
14 | platforms:
15 | - platform: root
16 | create_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
17 | base_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
18 | - platform: android
19 | create_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
20 | base_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
21 | - platform: ios
22 | create_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
23 | base_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
24 | - platform: linux
25 | create_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
26 | base_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
27 | - platform: macos
28 | create_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
29 | base_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
30 | - platform: web
31 | create_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
32 | base_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
33 | - platform: windows
34 | create_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
35 | base_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
36 |
37 | # User provided section
38 |
39 | # List of Local paths (relative to this file) that should be
40 | # ignored by the migrate tool.
41 | #
42 | # Files that are not part of the templates will be ignored by default.
43 | unmanaged_files:
44 | - 'lib/main.dart'
45 | - 'ios/Runner.xcodeproj/project.pbxproj'
46 |
--------------------------------------------------------------------------------
/ios/Runner/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleDisplayName
8 | Flutter Interactive Shader Demo
9 | CFBundleExecutable
10 | $(EXECUTABLE_NAME)
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | flutter_interactive_shader_demo
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | $(FLUTTER_BUILD_NAME)
21 | CFBundleSignature
22 | ????
23 | CFBundleVersion
24 | $(FLUTTER_BUILD_NUMBER)
25 | LSRequiresIPhoneOS
26 |
27 | UILaunchStoryboardName
28 | LaunchScreen
29 | UIMainStoryboardFile
30 | Main
31 | UISupportedInterfaceOrientations
32 |
33 | UIInterfaceOrientationPortrait
34 | UIInterfaceOrientationLandscapeLeft
35 | UIInterfaceOrientationLandscapeRight
36 |
37 | UISupportedInterfaceOrientations~ipad
38 |
39 | UIInterfaceOrientationPortrait
40 | UIInterfaceOrientationPortraitUpsideDown
41 | UIInterfaceOrientationLandscapeLeft
42 | UIInterfaceOrientationLandscapeRight
43 |
44 | CADisableMinimumFrameDurationOnPhone
45 |
46 | UIApplicationSupportsIndirectInputEvents
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/web/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 | Flutter Interactive Shader Demo
33 |
34 |
35 |
39 |
40 |
41 |
42 |
43 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | plugins {
2 | id "com.android.application"
3 | id "kotlin-android"
4 | id "dev.flutter.flutter-gradle-plugin"
5 | }
6 |
7 | def localProperties = new Properties()
8 | def localPropertiesFile = rootProject.file('local.properties')
9 | if (localPropertiesFile.exists()) {
10 | localPropertiesFile.withReader('UTF-8') { reader ->
11 | localProperties.load(reader)
12 | }
13 | }
14 |
15 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
16 | if (flutterVersionCode == null) {
17 | flutterVersionCode = '1'
18 | }
19 |
20 | def flutterVersionName = localProperties.getProperty('flutter.versionName')
21 | if (flutterVersionName == null) {
22 | flutterVersionName = '1.0'
23 | }
24 |
25 | android {
26 | namespace "com.example.flutter_interactive_shader_demo"
27 | compileSdkVersion flutter.compileSdkVersion
28 | ndkVersion flutter.ndkVersion
29 |
30 | compileOptions {
31 | sourceCompatibility JavaVersion.VERSION_1_8
32 | targetCompatibility JavaVersion.VERSION_1_8
33 | }
34 |
35 | kotlinOptions {
36 | jvmTarget = '1.8'
37 | }
38 |
39 | sourceSets {
40 | main.java.srcDirs += 'src/main/kotlin'
41 | }
42 |
43 | defaultConfig {
44 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
45 | applicationId "com.example.flutter_interactive_shader_demo"
46 | // You can update the following values to match your application needs.
47 | // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
48 | minSdkVersion flutter.minSdkVersion
49 | targetSdkVersion flutter.targetSdkVersion
50 | versionCode flutterVersionCode.toInteger()
51 | versionName flutterVersionName
52 | }
53 |
54 | buildTypes {
55 | release {
56 | // TODO: Add your own signing config for the release build.
57 | // Signing with the debug keys for now, so `flutter run --release` works.
58 | signingConfig signingConfigs.debug
59 | }
60 | }
61 | }
62 |
63 | flutter {
64 | source '../..'
65 | }
66 |
67 | dependencies {}
68 |
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Flutter Interactive Shaders Demo
2 |
3 | This demo project showcases the integration of dynamic and interactive fragment shaders in a Flutter application. Fragment shaders, also known as pixel shaders, allow for real-time visual effects, opening up exciting possibilities for interactive user experiences.
4 |
5 |
6 | https://github.com/monster555/flutter_interactive_shader_demo/assets/32662133/a9d85d1c-6884-4a2a-a655-98aac047341e
7 |
8 |
9 | Like this project? Consider supporting its upkeep with a coffee. Your generosity is appreciated! ☕
10 |
11 |
12 |
13 | ## Ready to Integrate Fragment Shaders?
14 |
15 | For a comprehensive guide on integrating Fragment Shaders in a Flutter app, check out [this repository](https://github.com/monster555/flutter_shader_demo). It covers the basics and provides step-by-step instructions to enhance your Flutter project with stunning visual effects.
16 |
17 | ## Benefits of Interactive Fragment Shaders in Flutter
18 |
19 | ### Real-time Visual Feedback
20 |
21 | Integrating dynamic fragment shaders enables real-time visual feedback, allowing users to see changes and interactions immediately. This is particularly powerful for applications where visual responsiveness is crucial.
22 |
23 | ### Creative User Interaction
24 |
25 | With interactive fragment shaders, you can create unique and engaging user interactions. Users can manipulate and control visual elements, providing an immersive and creative experience within your Flutter app.
26 |
27 | ### Seamless Integration with Flutter Widgets
28 |
29 | This demo seamlessly integrates interactive fragment shaders with Flutter widgets, allowing you to apply dynamic visual effects to various UI elements. Whether it's images, text, or custom widgets, the integration is smooth and versatile.
30 |
31 | ### Flutter-Shader Communication
32 |
33 | The communication between Flutter and shader programs adds another layer of flexibility. Parameters can be passed from Flutter to shaders, enabling dynamic adjustments based on user input or app logic. This bidirectional communication enhances the interactive capabilities of your app.
34 |
35 | ## Resources
36 | For more information on writing and using fragment shaders in Flutter, check out the [Flutter documentation on fragment shaders](https://docs.flutter.dev/ui/design/graphics/fragment-shaders).
37 |
38 | ## Acknowledgements
39 | The shader used in this demo wasn’t written by me. It was authored by the following individual:
40 |
41 | - [Pyroclastic fireball](https://www.shadertoy.com/view/MtXSzS): Authored by [Duke](https://www.shadertoy.com/user/Duke)
42 |
43 | All credit for the shader code goes to the author.
44 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "20x20",
5 | "idiom" : "iphone",
6 | "filename" : "Icon-App-20x20@2x.png",
7 | "scale" : "2x"
8 | },
9 | {
10 | "size" : "20x20",
11 | "idiom" : "iphone",
12 | "filename" : "Icon-App-20x20@3x.png",
13 | "scale" : "3x"
14 | },
15 | {
16 | "size" : "29x29",
17 | "idiom" : "iphone",
18 | "filename" : "Icon-App-29x29@1x.png",
19 | "scale" : "1x"
20 | },
21 | {
22 | "size" : "29x29",
23 | "idiom" : "iphone",
24 | "filename" : "Icon-App-29x29@2x.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "29x29",
29 | "idiom" : "iphone",
30 | "filename" : "Icon-App-29x29@3x.png",
31 | "scale" : "3x"
32 | },
33 | {
34 | "size" : "40x40",
35 | "idiom" : "iphone",
36 | "filename" : "Icon-App-40x40@2x.png",
37 | "scale" : "2x"
38 | },
39 | {
40 | "size" : "40x40",
41 | "idiom" : "iphone",
42 | "filename" : "Icon-App-40x40@3x.png",
43 | "scale" : "3x"
44 | },
45 | {
46 | "size" : "60x60",
47 | "idiom" : "iphone",
48 | "filename" : "Icon-App-60x60@2x.png",
49 | "scale" : "2x"
50 | },
51 | {
52 | "size" : "60x60",
53 | "idiom" : "iphone",
54 | "filename" : "Icon-App-60x60@3x.png",
55 | "scale" : "3x"
56 | },
57 | {
58 | "size" : "20x20",
59 | "idiom" : "ipad",
60 | "filename" : "Icon-App-20x20@1x.png",
61 | "scale" : "1x"
62 | },
63 | {
64 | "size" : "20x20",
65 | "idiom" : "ipad",
66 | "filename" : "Icon-App-20x20@2x.png",
67 | "scale" : "2x"
68 | },
69 | {
70 | "size" : "29x29",
71 | "idiom" : "ipad",
72 | "filename" : "Icon-App-29x29@1x.png",
73 | "scale" : "1x"
74 | },
75 | {
76 | "size" : "29x29",
77 | "idiom" : "ipad",
78 | "filename" : "Icon-App-29x29@2x.png",
79 | "scale" : "2x"
80 | },
81 | {
82 | "size" : "40x40",
83 | "idiom" : "ipad",
84 | "filename" : "Icon-App-40x40@1x.png",
85 | "scale" : "1x"
86 | },
87 | {
88 | "size" : "40x40",
89 | "idiom" : "ipad",
90 | "filename" : "Icon-App-40x40@2x.png",
91 | "scale" : "2x"
92 | },
93 | {
94 | "size" : "76x76",
95 | "idiom" : "ipad",
96 | "filename" : "Icon-App-76x76@1x.png",
97 | "scale" : "1x"
98 | },
99 | {
100 | "size" : "76x76",
101 | "idiom" : "ipad",
102 | "filename" : "Icon-App-76x76@2x.png",
103 | "scale" : "2x"
104 | },
105 | {
106 | "size" : "83.5x83.5",
107 | "idiom" : "ipad",
108 | "filename" : "Icon-App-83.5x83.5@2x.png",
109 | "scale" : "2x"
110 | },
111 | {
112 | "size" : "1024x1024",
113 | "idiom" : "ios-marketing",
114 | "filename" : "Icon-App-1024x1024@1x.png",
115 | "scale" : "1x"
116 | }
117 | ],
118 | "info" : {
119 | "version" : 1,
120 | "author" : "xcode"
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
37 |
38 |
39 |
40 |
43 |
49 |
50 |
51 |
52 |
53 |
63 |
65 |
71 |
72 |
73 |
74 |
80 |
82 |
88 |
89 |
90 |
91 |
93 |
94 |
97 |
98 |
99 |
--------------------------------------------------------------------------------
/pubspec.lock:
--------------------------------------------------------------------------------
1 | # Generated by pub
2 | # See https://dart.dev/tools/pub/glossary#lockfile
3 | packages:
4 | async:
5 | dependency: transitive
6 | description:
7 | name: async
8 | sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
9 | url: "https://pub.dev"
10 | source: hosted
11 | version: "2.11.0"
12 | boolean_selector:
13 | dependency: transitive
14 | description:
15 | name: boolean_selector
16 | sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
17 | url: "https://pub.dev"
18 | source: hosted
19 | version: "2.1.1"
20 | characters:
21 | dependency: transitive
22 | description:
23 | name: characters
24 | sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
25 | url: "https://pub.dev"
26 | source: hosted
27 | version: "1.3.0"
28 | clock:
29 | dependency: transitive
30 | description:
31 | name: clock
32 | sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
33 | url: "https://pub.dev"
34 | source: hosted
35 | version: "1.1.1"
36 | collection:
37 | dependency: transitive
38 | description:
39 | name: collection
40 | sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687
41 | url: "https://pub.dev"
42 | source: hosted
43 | version: "1.17.2"
44 | cupertino_icons:
45 | dependency: "direct main"
46 | description:
47 | name: cupertino_icons
48 | sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d
49 | url: "https://pub.dev"
50 | source: hosted
51 | version: "1.0.6"
52 | fake_async:
53 | dependency: transitive
54 | description:
55 | name: fake_async
56 | sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
57 | url: "https://pub.dev"
58 | source: hosted
59 | version: "1.3.1"
60 | flutter:
61 | dependency: "direct main"
62 | description: flutter
63 | source: sdk
64 | version: "0.0.0"
65 | flutter_lints:
66 | dependency: "direct dev"
67 | description:
68 | name: flutter_lints
69 | sha256: e2a421b7e59244faef694ba7b30562e489c2b489866e505074eb005cd7060db7
70 | url: "https://pub.dev"
71 | source: hosted
72 | version: "3.0.1"
73 | flutter_test:
74 | dependency: "direct dev"
75 | description: flutter
76 | source: sdk
77 | version: "0.0.0"
78 | lints:
79 | dependency: transitive
80 | description:
81 | name: lints
82 | sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290
83 | url: "https://pub.dev"
84 | source: hosted
85 | version: "3.0.0"
86 | matcher:
87 | dependency: transitive
88 | description:
89 | name: matcher
90 | sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
91 | url: "https://pub.dev"
92 | source: hosted
93 | version: "0.12.16"
94 | material_color_utilities:
95 | dependency: transitive
96 | description:
97 | name: material_color_utilities
98 | sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
99 | url: "https://pub.dev"
100 | source: hosted
101 | version: "0.5.0"
102 | meta:
103 | dependency: transitive
104 | description:
105 | name: meta
106 | sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
107 | url: "https://pub.dev"
108 | source: hosted
109 | version: "1.9.1"
110 | path:
111 | dependency: transitive
112 | description:
113 | name: path
114 | sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
115 | url: "https://pub.dev"
116 | source: hosted
117 | version: "1.8.3"
118 | sky_engine:
119 | dependency: transitive
120 | description: flutter
121 | source: sdk
122 | version: "0.0.99"
123 | source_span:
124 | dependency: transitive
125 | description:
126 | name: source_span
127 | sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
128 | url: "https://pub.dev"
129 | source: hosted
130 | version: "1.10.0"
131 | stack_trace:
132 | dependency: transitive
133 | description:
134 | name: stack_trace
135 | sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
136 | url: "https://pub.dev"
137 | source: hosted
138 | version: "1.11.0"
139 | stream_channel:
140 | dependency: transitive
141 | description:
142 | name: stream_channel
143 | sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
144 | url: "https://pub.dev"
145 | source: hosted
146 | version: "2.1.1"
147 | string_scanner:
148 | dependency: transitive
149 | description:
150 | name: string_scanner
151 | sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
152 | url: "https://pub.dev"
153 | source: hosted
154 | version: "1.2.0"
155 | term_glyph:
156 | dependency: transitive
157 | description:
158 | name: term_glyph
159 | sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
160 | url: "https://pub.dev"
161 | source: hosted
162 | version: "1.2.1"
163 | test_api:
164 | dependency: transitive
165 | description:
166 | name: test_api
167 | sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8"
168 | url: "https://pub.dev"
169 | source: hosted
170 | version: "0.6.0"
171 | vector_math:
172 | dependency: "direct main"
173 | description:
174 | name: vector_math
175 | sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
176 | url: "https://pub.dev"
177 | source: hosted
178 | version: "2.1.4"
179 | web:
180 | dependency: transitive
181 | description:
182 | name: web
183 | sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10
184 | url: "https://pub.dev"
185 | source: hosted
186 | version: "0.1.4-beta"
187 | sdks:
188 | dart: ">=3.1.4 <4.0.0"
189 |
--------------------------------------------------------------------------------
/shaders/fireball.frag:
--------------------------------------------------------------------------------
1 | // port from http://glslsandbox.com/e#8625.0 by Duke
2 | // Fireball
3 | // Awd
4 | // @AlexWDunn
5 |
6 | uniform float iTime;
7 | uniform vec3 iResolution;
8 | uniform vec4 iMouse;
9 |
10 | out vec4 fragColor;
11 |
12 | #define saturate(oo) clamp(oo, 0.0, 1.0)
13 |
14 | // Quality Settings
15 | #define MarchSteps 8
16 | // Scene Settings
17 | #define ExpPosition vec3(0.0)
18 | #define Radius 2.0
19 | #define Background vec4(0.1, 0.0, 0.0, 1.0)
20 | // Noise Settings
21 | #define NoiseSteps 1
22 | #define NoiseAmplitude 0.06
23 | #define NoiseFrequency 4.0
24 | #define Animation vec3(0.0, -3.0, 0.5)
25 | // Colour Gradient
26 | #define Color1 vec4(1.0, 1.0, 1.0, 1.0)
27 | #define Color2 vec4(1.0, 0.8, 0.2, 1.0)
28 | #define Color3 vec4(1.0, 0.03, 0.0, 1.0)
29 | #define Color4 vec4(0.05, 0.02, 0.02, 1.0)
30 |
31 | // Description : Array and textureless GLSL 2D/3D/4D simplex
32 | // noise functions.
33 | // Author : Ian McEwan, Ashima Arts.
34 | // Maintainer : ijm
35 | // Lastmod : 20110822 (ijm)
36 | // License : Copyright (C) 2011 Ashima Arts. All rights reserved.
37 | // Distributed under the MIT License. See LICENSE file.
38 | // https://github.com/ashima/webgl-noise
39 | //
40 |
41 | vec3 mod289(vec3 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }
42 | vec4 mod289(vec4 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }
43 | vec4 permute(vec4 x) { return mod289(((x*34.0)+1.0)*x); }
44 | vec4 taylorInvSqrt(vec4 r){ return 1.79284291400159 - 0.85373472095314 * r; }
45 |
46 | float snoise(vec3 v)
47 | {
48 | const vec2 C = vec2(1.0/6.0, 1.0/3.0);
49 | const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);
50 | // First corner
51 | vec3 i = floor(v + dot(v, C.yyy));
52 | vec3 x0 = v - i + dot(i, C.xxx);
53 | // Other corners
54 | vec3 g = step(x0.yzx, x0.xyz);
55 | vec3 l = 1.0 - g;
56 | vec3 i1 = min(g.xyz, l.zxy);
57 | vec3 i2 = max(g.xyz, l.zxy);
58 | vec3 x1 = x0 - i1 + C.xxx;
59 | vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y
60 | vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y
61 | // Permutations
62 | i = mod289(i);
63 | vec4 p = permute( permute( permute( i.z + vec4(0.0, i1.z, i2.z, 1.0)) + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));
64 | // Gradients: 7x7 points over a square, mapped onto an octahedron.
65 | // The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)
66 | float n_ = 0.142857142857; // 1.0/7.0
67 | vec3 ns = n_ * D.wyz - D.xzx;
68 | vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7)
69 | vec4 x_ = floor(j * ns.z);
70 | vec4 y_ = floor(j - 7.0 * x_); // mod(j,N)
71 | vec4 x = x_ *ns.x + ns.yyyy;
72 | vec4 y = y_ *ns.x + ns.yyyy;
73 | vec4 h = 1.0 - abs(x) - abs(y);
74 | vec4 b0 = vec4(x.xy, y.xy);
75 | vec4 b1 = vec4(x.zw, y.zw);
76 | vec4 s0 = floor(b0) * 2.0 + 1.0;
77 | vec4 s1 = floor(b1) * 2.0 + 1.0;
78 | vec4 sh = -step(h, vec4(0.0));
79 | vec4 a0 = b0.xzyw + s0.xzyw * sh.xxyy;
80 | vec4 a1 = b1.xzyw + s1.xzyw * sh.zzww;
81 | vec3 p0 = vec3(a0.xy, h.x);
82 | vec3 p1 = vec3(a0.zw, h.y);
83 | vec3 p2 = vec3(a1.xy, h.z);
84 | vec3 p3 = vec3(a1.zw, h.w);
85 | //Normalise gradients
86 | vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));
87 | p0 *= norm.x;
88 | p1 *= norm.y;
89 | p2 *= norm.z;
90 | p3 *= norm.w;
91 | // Mix final noise value
92 | vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);
93 | m = m * m;
94 | return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1), dot(p2,x2), dot(p3,x3)));
95 | }
96 |
97 | float Turbulence(vec3 position, float minFreq, float maxFreq, float qWidth)
98 | {
99 | float value = 0.0;
100 | float cutoff = clamp(0.5/qWidth, 0.0, maxFreq);
101 | float fade;
102 | float fOut = minFreq;
103 | for(int i=NoiseSteps ; i>=0 ; i--)
104 | {
105 | if(fOut >= 0.5 * cutoff) break;
106 | fOut *= 2.0;
107 | value += abs(snoise(position * fOut))/fOut;
108 | }
109 | fade = clamp(2.0 * (cutoff-fOut)/cutoff, 0.0, 1.0);
110 | value += fade * abs(snoise(position * fOut))/fOut;
111 | return 1.0-value;
112 | }
113 |
114 | float SphereDist(vec3 position)
115 | {
116 | return length(position - ExpPosition) - Radius;
117 | }
118 |
119 | vec4 Shade(float distance)
120 | {
121 | float c1 = saturate(distance*5.0 + 0.5);
122 | float c2 = saturate(distance*5.0);
123 | float c3 = saturate(distance*3.4 - 0.5);
124 | vec4 a = mix(Color1,Color2, c1);
125 | vec4 b = mix(a, Color3, c2);
126 | return mix(b, Color4, c3);
127 | }
128 |
129 | // Draws the scene
130 | float RenderScene(vec3 position, out float distance)
131 | {
132 | float noise = Turbulence(position * NoiseFrequency + Animation*iTime, 0.1, 1.5, 0.03) * NoiseAmplitude;
133 | noise = saturate(abs(noise));
134 | distance = SphereDist(position) - noise;
135 | return noise;
136 | }
137 |
138 | // Basic ray marching method.
139 | vec4 March(vec3 rayOrigin, vec3 rayStep)
140 | {
141 | vec3 position = rayOrigin;
142 | float distance;
143 | float displacement;
144 | for(int step = MarchSteps; step >=0 ; --step)
145 | {
146 | displacement = RenderScene(position, distance);
147 | if(distance < 0.05) break;
148 | position += rayStep * distance;
149 | }
150 | return mix(Shade(displacement), Background, float(distance >= 0.5));
151 | }
152 |
153 | bool IntersectSphere(vec3 ro, vec3 rd, vec3 pos, float radius, out vec3 intersectPoint)
154 | {
155 | vec3 relDistance = (ro - pos);
156 | float b = dot(relDistance, rd);
157 | float c = dot(relDistance, relDistance) - radius*radius;
158 | float d = b*b - c;
159 | intersectPoint = ro + rd*(-b - sqrt(d));
160 | return d >= 0.0;
161 | }
162 |
163 | void main()
164 | {
165 | vec2 p = (gl_FragCoord.xy / iResolution.xy) * 2.0 - 1.0;
166 | p.x *= iResolution.x/iResolution.y;
167 | float rotx = iMouse.y * 0.01;
168 | float roty = -iMouse.x * 0.01;
169 | float zoom = 5.0;
170 | // camera
171 | vec3 ro = zoom * normalize(vec3(cos(roty), cos(rotx), sin(roty)));
172 | vec3 ww = normalize(vec3(0.0, 0.0, 0.0) - ro);
173 | vec3 uu = normalize(cross( vec3(0.0, 1.0, 0.0), ww));
174 | vec3 vv = normalize(cross(ww, uu));
175 | vec3 rd = normalize(p.x*uu + p.y*vv + 1.5*ww);
176 | vec4 col = Background;
177 | vec3 origin;
178 | if(IntersectSphere(ro, rd, ExpPosition, Radius + NoiseAmplitude*6.0, origin))
179 | {
180 | col = March(origin, rd);
181 | }
182 | fragColor = col;
183 | }
--------------------------------------------------------------------------------
/lib/ui/widgets/shader_widget.dart:
--------------------------------------------------------------------------------
1 | import 'dart:ui';
2 |
3 | import 'package:flutter/material.dart';
4 | import 'package:vector_math/vector_math_64.dart';
5 |
6 | part 'shader_painter.dart';
7 |
8 | /// A widget that displays a shader with dynamic parameters.
9 | ///
10 | /// This widget uses a [FragmentShader] to render dynamic visual effects. The shader
11 | /// parameters are updated during the widget's build and animation process.
12 | ///
13 | /// Shader parameters are set using the `setFloat` method, and the numbers passed to
14 | /// this method correspond to specific properties of the shader. The correspondence is
15 | /// based on the order in which the variables are declared in the fragment program code:
16 | ///
17 | /// Mapping Shader Parameters to Fragment Program Variables:
18 | /// - `iTime` (0): Elapsed time since widget initialization.
19 | /// - `iResolution` (1, 2): Width and height of the widget.
20 | /// - `iMouse` (4, 5): X and Y Offset for panning gestures.
21 | ///
22 | /// This mapping helps understand how the shader parameters set with `setFloat`
23 | /// correspond to the variables declared in the fragment program code.
24 | ///
25 | /// The `xOffset` and `yOffset` are updated when the user pans on the widget, affecting
26 | /// the visual output of the shader. The elapsed time is automatically calculated
27 | /// to create dynamic effects over time.
28 | ///
29 | /// The `iResolution` variable in the fragment program is a `vec3` (vector of 3
30 | /// floats), hence it's set using indices 1 and 2. Similarly, the `iMouse` variable is
31 | /// a `vec4`, and its X and Y components are set using indices 4 and 5.
32 | class ShaderWidget extends StatefulWidget {
33 | /// A widget that displays a shader with dynamic parameters.
34 | ///
35 | /// This widget uses a [FragmentShader] to render dynamic visual effects. The shader
36 | /// parameters are updated during the widget's build and animation process.
37 | ///
38 | /// Shader parameters are set using the `setFloat` method, and the numbers passed to
39 | /// this method correspond to specific properties of the shader.
40 | ///
41 | /// The `xOffset` and `yOffset` are updated when the user pans on the widget, affecting
42 | /// the visual output of the shader. The elapsed time is automatically calculated
43 | /// to create dynamic effects over time.
44 | ///
45 | /// The [shaderName] parameter is required, specifying the name of the shader to be used.
46 | /// Optional parameters:
47 | /// - [width] The width of the widget, if specified.
48 | /// - [height] The height of the widget, if specified.
49 | const ShaderWidget(
50 | this.shaderName, {
51 | super.key,
52 | this.width,
53 | this.height,
54 | });
55 |
56 | /// The name of the fragment shader to be applied.
57 | final String shaderName;
58 |
59 | /// The width of the shader view. If not specified, it defaults to the width
60 | /// of the parent widget.
61 | final double? width;
62 |
63 | /// The height of the shader view. If not specified, it defaults to the height
64 | /// of the parent widget.
65 | final double? height;
66 |
67 | @override
68 | State createState() => _ShaderWidgetState();
69 | }
70 |
71 | /// The state for the [ShaderWidget] widget.
72 | ///
73 | /// This state class manages the animation controller for the shader and
74 | /// calculates the elapsed time since the widget's initialization.
75 | class _ShaderWidgetState extends State
76 | with SingleTickerProviderStateMixin {
77 | /// The animation controller responsible for animating the shader.
78 | late final AnimationController _controller = AnimationController(
79 | duration: const Duration(milliseconds: 300),
80 | vsync: this,
81 | )..repeat();
82 |
83 | @override
84 | void dispose() {
85 | // Dispose the animation controller when the widget is disposed.
86 | _controller.dispose();
87 | super.dispose();
88 | }
89 |
90 | /// The horizontal offset for user interaction.
91 | double xOffset = 0;
92 |
93 | /// The vertical offset for user interaction.
94 | double yOffset = 0;
95 |
96 | /// The time when the widget was initialized.
97 | int _startTime = 0;
98 |
99 | /// Returns the elapsed time since the widget was initialized.
100 | double get _elapsedTimeInSeconds =>
101 | (DateTime.now().millisecondsSinceEpoch - _startTime) / 1000;
102 |
103 | /// Builds the widget tree for the [ShaderWidget].
104 | @override
105 | Widget build(BuildContext context) {
106 | // Initialize the start time when the widget is first built.
107 | _startTime = DateTime.now().millisecondsSinceEpoch;
108 |
109 | // Use the specified width and height if provided, otherwise use the
110 | // MediaQuery size.
111 | final width = widget.width ?? MediaQuery.sizeOf(context).width;
112 | final height = widget.height ?? MediaQuery.sizeOf(context).height;
113 |
114 | return SizedBox(
115 | width: width,
116 | height: height,
117 | child: FutureBuilder(
118 | // Load the shader from the shaders folder.
119 | future: _loadShader(widget.shaderName),
120 | builder: (context, snapshot) {
121 | if (snapshot.hasData) {
122 | final shader = snapshot.data!;
123 |
124 | // Set the shader's width and height parameters.
125 | shader
126 | // Set width: Corresponds to shader's `iResolution.x`
127 | ..setFloat(1, width)
128 | // Set height: Corresponds to shader's `iResolution.y`
129 | ..setFloat(2, height);
130 |
131 | return GestureDetector(
132 | onPanUpdate: (details) {
133 | // Update the xOffset based on the horizontal movement of the pan gesture.
134 | xOffset += details.delta.dx;
135 |
136 | // Update the yOffset based on the vertical movement of the pan gesture.
137 | yOffset += details.delta.dy;
138 | },
139 | child: AnimatedBuilder(
140 | animation: _controller,
141 | builder: (context, _) {
142 | // Set shader parameters including elapsed time, xOffset, and yOffset.
143 | shader
144 | // Set elapsed time: Corresponds to shader's `iTime`
145 | ..setFloat(0, _elapsedTimeInSeconds)
146 |
147 | // Set X Offset: Corresponds to shader's `iMouse.x`.
148 | // Applying -1 * xOffset to adjust for potential coordinate system differences.
149 | // This inversion is used for demo/educational purposes and may vary from shader to shader.
150 | ..setFloat(4, -1 * xOffset)
151 |
152 | // Set Y Offset: Corresponds to shader's `iMouse.y`.
153 | // Applying -1 * yOffset for potential coordinate system adjustments.
154 | // This inversion is used for demo/educational purposes and may vary from shader to shader.
155 | ..setFloat(5, -1 * yOffset);
156 | return CustomPaint(
157 | painter: ShaderPainter(shader),
158 | );
159 | },
160 | ),
161 | );
162 | } else {
163 | // Display a CircularProgressIndicator while loading the shader.
164 | return const CircularProgressIndicator();
165 | }
166 | },
167 | ),
168 | );
169 | }
170 | }
171 |
172 | /// Loads and returns a [FragmentShader] from an asset using the specified [shaderName].
173 | ///
174 | /// This method loads a shader program from the assets folder with the given [shaderName]
175 | /// and returns the corresponding [FragmentShader].
176 | ///
177 | /// Parameters:
178 | ///
179 | /// - [shaderName] The name of the shader file to load.
180 | Future _loadShader(String shaderName) async {
181 | // Load the shader program from the assets folder.
182 | FragmentProgram program =
183 | await FragmentProgram.fromAsset('shaders/$shaderName');
184 |
185 | // Return the fragment shader from the program.
186 | return program.fragmentShader();
187 | }
188 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 54;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
12 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
13 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
14 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
15 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
16 | 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
17 | /* End PBXBuildFile section */
18 |
19 | /* Begin PBXContainerItemProxy section */
20 | 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {
21 | isa = PBXContainerItemProxy;
22 | containerPortal = 97C146E61CF9000F007C117D /* Project object */;
23 | proxyType = 1;
24 | remoteGlobalIDString = 97C146ED1CF9000F007C117D;
25 | remoteInfo = Runner;
26 | };
27 | /* End PBXContainerItemProxy section */
28 |
29 | /* Begin PBXCopyFilesBuildPhase section */
30 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
31 | isa = PBXCopyFilesBuildPhase;
32 | buildActionMask = 2147483647;
33 | dstPath = "";
34 | dstSubfolderSpec = 10;
35 | files = (
36 | );
37 | name = "Embed Frameworks";
38 | runOnlyForDeploymentPostprocessing = 0;
39 | };
40 | /* End PBXCopyFilesBuildPhase section */
41 |
42 | /* Begin PBXFileReference section */
43 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
44 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
45 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
46 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
47 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
48 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
49 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
50 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
51 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
52 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
53 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
54 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
55 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
56 | 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; };
57 | 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
58 | /* End PBXFileReference section */
59 |
60 | /* Begin PBXFrameworksBuildPhase section */
61 | 97C146EB1CF9000F007C117D /* Frameworks */ = {
62 | isa = PBXFrameworksBuildPhase;
63 | buildActionMask = 2147483647;
64 | files = (
65 | );
66 | runOnlyForDeploymentPostprocessing = 0;
67 | };
68 | /* End PBXFrameworksBuildPhase section */
69 |
70 | /* Begin PBXGroup section */
71 | 9740EEB11CF90186004384FC /* Flutter */ = {
72 | isa = PBXGroup;
73 | children = (
74 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
75 | 9740EEB21CF90195004384FC /* Debug.xcconfig */,
76 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
77 | 9740EEB31CF90195004384FC /* Generated.xcconfig */,
78 | );
79 | name = Flutter;
80 | sourceTree = "";
81 | };
82 | 331C8082294A63A400263BE5 /* RunnerTests */ = {
83 | isa = PBXGroup;
84 | children = (
85 | 331C807B294A618700263BE5 /* RunnerTests.swift */,
86 | );
87 | path = RunnerTests;
88 | sourceTree = "";
89 | };
90 | 97C146E51CF9000F007C117D = {
91 | isa = PBXGroup;
92 | children = (
93 | 9740EEB11CF90186004384FC /* Flutter */,
94 | 97C146F01CF9000F007C117D /* Runner */,
95 | 97C146EF1CF9000F007C117D /* Products */,
96 | 331C8082294A63A400263BE5 /* RunnerTests */,
97 | );
98 | sourceTree = "";
99 | };
100 | 97C146EF1CF9000F007C117D /* Products */ = {
101 | isa = PBXGroup;
102 | children = (
103 | 97C146EE1CF9000F007C117D /* Runner.app */,
104 | 331C8081294A63A400263BE5 /* RunnerTests.xctest */,
105 | );
106 | name = Products;
107 | sourceTree = "";
108 | };
109 | 97C146F01CF9000F007C117D /* Runner */ = {
110 | isa = PBXGroup;
111 | children = (
112 | 97C146FA1CF9000F007C117D /* Main.storyboard */,
113 | 97C146FD1CF9000F007C117D /* Assets.xcassets */,
114 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
115 | 97C147021CF9000F007C117D /* Info.plist */,
116 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
117 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
118 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
119 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
120 | );
121 | path = Runner;
122 | sourceTree = "";
123 | };
124 | /* End PBXGroup section */
125 |
126 | /* Begin PBXNativeTarget section */
127 | 331C8080294A63A400263BE5 /* RunnerTests */ = {
128 | isa = PBXNativeTarget;
129 | buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
130 | buildPhases = (
131 | 331C807D294A63A400263BE5 /* Sources */,
132 | 331C807E294A63A400263BE5 /* Frameworks */,
133 | 331C807F294A63A400263BE5 /* Resources */,
134 | );
135 | buildRules = (
136 | );
137 | dependencies = (
138 | 331C8086294A63A400263BE5 /* PBXTargetDependency */,
139 | );
140 | name = RunnerTests;
141 | productName = RunnerTests;
142 | productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
143 | productType = "com.apple.product-type.bundle.unit-test";
144 | };
145 | 97C146ED1CF9000F007C117D /* Runner */ = {
146 | isa = PBXNativeTarget;
147 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
148 | buildPhases = (
149 | 9740EEB61CF901F6004384FC /* Run Script */,
150 | 97C146EA1CF9000F007C117D /* Sources */,
151 | 97C146EB1CF9000F007C117D /* Frameworks */,
152 | 97C146EC1CF9000F007C117D /* Resources */,
153 | 9705A1C41CF9048500538489 /* Embed Frameworks */,
154 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
155 | );
156 | buildRules = (
157 | );
158 | dependencies = (
159 | );
160 | name = Runner;
161 | productName = Runner;
162 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
163 | productType = "com.apple.product-type.application";
164 | };
165 | /* End PBXNativeTarget section */
166 |
167 | /* Begin PBXProject section */
168 | 97C146E61CF9000F007C117D /* Project object */ = {
169 | isa = PBXProject;
170 | attributes = {
171 | BuildIndependentTargetsInParallel = YES;
172 | LastUpgradeCheck = 1430;
173 | ORGANIZATIONNAME = "";
174 | TargetAttributes = {
175 | 331C8080294A63A400263BE5 = {
176 | CreatedOnToolsVersion = 14.0;
177 | TestTargetID = 97C146ED1CF9000F007C117D;
178 | };
179 | 97C146ED1CF9000F007C117D = {
180 | CreatedOnToolsVersion = 7.3.1;
181 | LastSwiftMigration = 1100;
182 | };
183 | };
184 | };
185 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
186 | compatibilityVersion = "Xcode 9.3";
187 | developmentRegion = en;
188 | hasScannedForEncodings = 0;
189 | knownRegions = (
190 | en,
191 | Base,
192 | );
193 | mainGroup = 97C146E51CF9000F007C117D;
194 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
195 | projectDirPath = "";
196 | projectRoot = "";
197 | targets = (
198 | 97C146ED1CF9000F007C117D /* Runner */,
199 | 331C8080294A63A400263BE5 /* RunnerTests */,
200 | );
201 | };
202 | /* End PBXProject section */
203 |
204 | /* Begin PBXResourcesBuildPhase section */
205 | 331C807F294A63A400263BE5 /* Resources */ = {
206 | isa = PBXResourcesBuildPhase;
207 | buildActionMask = 2147483647;
208 | files = (
209 | );
210 | runOnlyForDeploymentPostprocessing = 0;
211 | };
212 | 97C146EC1CF9000F007C117D /* Resources */ = {
213 | isa = PBXResourcesBuildPhase;
214 | buildActionMask = 2147483647;
215 | files = (
216 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
217 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
218 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
219 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
220 | );
221 | runOnlyForDeploymentPostprocessing = 0;
222 | };
223 | /* End PBXResourcesBuildPhase section */
224 |
225 | /* Begin PBXShellScriptBuildPhase section */
226 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
227 | isa = PBXShellScriptBuildPhase;
228 | alwaysOutOfDate = 1;
229 | buildActionMask = 2147483647;
230 | files = (
231 | );
232 | inputPaths = (
233 | "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
234 | );
235 | name = "Thin Binary";
236 | outputPaths = (
237 | );
238 | runOnlyForDeploymentPostprocessing = 0;
239 | shellPath = /bin/sh;
240 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
241 | };
242 | 9740EEB61CF901F6004384FC /* Run Script */ = {
243 | isa = PBXShellScriptBuildPhase;
244 | alwaysOutOfDate = 1;
245 | buildActionMask = 2147483647;
246 | files = (
247 | );
248 | inputPaths = (
249 | );
250 | name = "Run Script";
251 | outputPaths = (
252 | );
253 | runOnlyForDeploymentPostprocessing = 0;
254 | shellPath = /bin/sh;
255 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
256 | };
257 | /* End PBXShellScriptBuildPhase section */
258 |
259 | /* Begin PBXSourcesBuildPhase section */
260 | 331C807D294A63A400263BE5 /* Sources */ = {
261 | isa = PBXSourcesBuildPhase;
262 | buildActionMask = 2147483647;
263 | files = (
264 | 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
265 | );
266 | runOnlyForDeploymentPostprocessing = 0;
267 | };
268 | 97C146EA1CF9000F007C117D /* Sources */ = {
269 | isa = PBXSourcesBuildPhase;
270 | buildActionMask = 2147483647;
271 | files = (
272 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
273 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
274 | );
275 | runOnlyForDeploymentPostprocessing = 0;
276 | };
277 | /* End PBXSourcesBuildPhase section */
278 |
279 | /* Begin PBXTargetDependency section */
280 | 331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
281 | isa = PBXTargetDependency;
282 | target = 97C146ED1CF9000F007C117D /* Runner */;
283 | targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
284 | };
285 | /* End PBXTargetDependency section */
286 |
287 | /* Begin PBXVariantGroup section */
288 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
289 | isa = PBXVariantGroup;
290 | children = (
291 | 97C146FB1CF9000F007C117D /* Base */,
292 | );
293 | name = Main.storyboard;
294 | sourceTree = "";
295 | };
296 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
297 | isa = PBXVariantGroup;
298 | children = (
299 | 97C147001CF9000F007C117D /* Base */,
300 | );
301 | name = LaunchScreen.storyboard;
302 | sourceTree = "";
303 | };
304 | /* End PBXVariantGroup section */
305 |
306 | /* Begin XCBuildConfiguration section */
307 | 249021D3217E4FDB00AE95B9 /* Profile */ = {
308 | isa = XCBuildConfiguration;
309 | buildSettings = {
310 | ALWAYS_SEARCH_USER_PATHS = NO;
311 | CLANG_ANALYZER_NONNULL = YES;
312 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
313 | CLANG_CXX_LIBRARY = "libc++";
314 | CLANG_ENABLE_MODULES = YES;
315 | CLANG_ENABLE_OBJC_ARC = YES;
316 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
317 | CLANG_WARN_BOOL_CONVERSION = YES;
318 | CLANG_WARN_COMMA = YES;
319 | CLANG_WARN_CONSTANT_CONVERSION = YES;
320 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
321 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
322 | CLANG_WARN_EMPTY_BODY = YES;
323 | CLANG_WARN_ENUM_CONVERSION = YES;
324 | CLANG_WARN_INFINITE_RECURSION = YES;
325 | CLANG_WARN_INT_CONVERSION = YES;
326 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
327 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
328 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
329 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
330 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
331 | CLANG_WARN_STRICT_PROTOTYPES = YES;
332 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
333 | CLANG_WARN_UNREACHABLE_CODE = YES;
334 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
335 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
336 | COPY_PHASE_STRIP = NO;
337 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
338 | ENABLE_NS_ASSERTIONS = NO;
339 | ENABLE_STRICT_OBJC_MSGSEND = YES;
340 | GCC_C_LANGUAGE_STANDARD = gnu99;
341 | GCC_NO_COMMON_BLOCKS = YES;
342 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
343 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
344 | GCC_WARN_UNDECLARED_SELECTOR = YES;
345 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
346 | GCC_WARN_UNUSED_FUNCTION = YES;
347 | GCC_WARN_UNUSED_VARIABLE = YES;
348 | IPHONEOS_DEPLOYMENT_TARGET = 11.0;
349 | MTL_ENABLE_DEBUG_INFO = NO;
350 | SDKROOT = iphoneos;
351 | SUPPORTED_PLATFORMS = iphoneos;
352 | TARGETED_DEVICE_FAMILY = "1,2";
353 | VALIDATE_PRODUCT = YES;
354 | };
355 | name = Profile;
356 | };
357 | 249021D4217E4FDB00AE95B9 /* Profile */ = {
358 | isa = XCBuildConfiguration;
359 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
360 | buildSettings = {
361 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
362 | CLANG_ENABLE_MODULES = YES;
363 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
364 | DEVELOPMENT_TEAM = MQT2MSRHJG;
365 | ENABLE_BITCODE = NO;
366 | INFOPLIST_FILE = Runner/Info.plist;
367 | LD_RUNPATH_SEARCH_PATHS = (
368 | "$(inherited)",
369 | "@executable_path/Frameworks",
370 | );
371 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterInteractiveShaderDemo;
372 | PRODUCT_NAME = "$(TARGET_NAME)";
373 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
374 | SWIFT_VERSION = 5.0;
375 | VERSIONING_SYSTEM = "apple-generic";
376 | };
377 | name = Profile;
378 | };
379 | 331C8088294A63A400263BE5 /* Debug */ = {
380 | isa = XCBuildConfiguration;
381 | baseConfigurationReference = AE0B7B92F70575B8D7E0D07E /* Pods-RunnerTests.debug.xcconfig */;
382 | buildSettings = {
383 | BUNDLE_LOADER = "$(TEST_HOST)";
384 | CODE_SIGN_STYLE = Automatic;
385 | CURRENT_PROJECT_VERSION = 1;
386 | GENERATE_INFOPLIST_FILE = YES;
387 | MARKETING_VERSION = 1.0;
388 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterInteractiveShaderDemo.RunnerTests;
389 | PRODUCT_NAME = "$(TARGET_NAME)";
390 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
391 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
392 | SWIFT_VERSION = 5.0;
393 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
394 | };
395 | name = Debug;
396 | };
397 | 331C8089294A63A400263BE5 /* Release */ = {
398 | isa = XCBuildConfiguration;
399 | baseConfigurationReference = 89B67EB44CE7B6631473024E /* Pods-RunnerTests.release.xcconfig */;
400 | buildSettings = {
401 | BUNDLE_LOADER = "$(TEST_HOST)";
402 | CODE_SIGN_STYLE = Automatic;
403 | CURRENT_PROJECT_VERSION = 1;
404 | GENERATE_INFOPLIST_FILE = YES;
405 | MARKETING_VERSION = 1.0;
406 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterInteractiveShaderDemo.RunnerTests;
407 | PRODUCT_NAME = "$(TARGET_NAME)";
408 | SWIFT_VERSION = 5.0;
409 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
410 | };
411 | name = Release;
412 | };
413 | 331C808A294A63A400263BE5 /* Profile */ = {
414 | isa = XCBuildConfiguration;
415 | baseConfigurationReference = 640959BDD8F10B91D80A66BE /* Pods-RunnerTests.profile.xcconfig */;
416 | buildSettings = {
417 | BUNDLE_LOADER = "$(TEST_HOST)";
418 | CODE_SIGN_STYLE = Automatic;
419 | CURRENT_PROJECT_VERSION = 1;
420 | GENERATE_INFOPLIST_FILE = YES;
421 | MARKETING_VERSION = 1.0;
422 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterInteractiveShaderDemo.RunnerTests;
423 | PRODUCT_NAME = "$(TARGET_NAME)";
424 | SWIFT_VERSION = 5.0;
425 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
426 | };
427 | name = Profile;
428 | };
429 | 97C147031CF9000F007C117D /* Debug */ = {
430 | isa = XCBuildConfiguration;
431 | buildSettings = {
432 | ALWAYS_SEARCH_USER_PATHS = NO;
433 | CLANG_ANALYZER_NONNULL = YES;
434 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
435 | CLANG_CXX_LIBRARY = "libc++";
436 | CLANG_ENABLE_MODULES = YES;
437 | CLANG_ENABLE_OBJC_ARC = YES;
438 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
439 | CLANG_WARN_BOOL_CONVERSION = YES;
440 | CLANG_WARN_COMMA = YES;
441 | CLANG_WARN_CONSTANT_CONVERSION = YES;
442 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
443 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
444 | CLANG_WARN_EMPTY_BODY = YES;
445 | CLANG_WARN_ENUM_CONVERSION = YES;
446 | CLANG_WARN_INFINITE_RECURSION = YES;
447 | CLANG_WARN_INT_CONVERSION = YES;
448 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
449 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
450 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
451 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
452 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
453 | CLANG_WARN_STRICT_PROTOTYPES = YES;
454 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
455 | CLANG_WARN_UNREACHABLE_CODE = YES;
456 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
457 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
458 | COPY_PHASE_STRIP = NO;
459 | DEBUG_INFORMATION_FORMAT = dwarf;
460 | ENABLE_STRICT_OBJC_MSGSEND = YES;
461 | ENABLE_TESTABILITY = YES;
462 | GCC_C_LANGUAGE_STANDARD = gnu99;
463 | GCC_DYNAMIC_NO_PIC = NO;
464 | GCC_NO_COMMON_BLOCKS = YES;
465 | GCC_OPTIMIZATION_LEVEL = 0;
466 | GCC_PREPROCESSOR_DEFINITIONS = (
467 | "DEBUG=1",
468 | "$(inherited)",
469 | );
470 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
471 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
472 | GCC_WARN_UNDECLARED_SELECTOR = YES;
473 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
474 | GCC_WARN_UNUSED_FUNCTION = YES;
475 | GCC_WARN_UNUSED_VARIABLE = YES;
476 | IPHONEOS_DEPLOYMENT_TARGET = 11.0;
477 | MTL_ENABLE_DEBUG_INFO = YES;
478 | ONLY_ACTIVE_ARCH = YES;
479 | SDKROOT = iphoneos;
480 | TARGETED_DEVICE_FAMILY = "1,2";
481 | };
482 | name = Debug;
483 | };
484 | 97C147041CF9000F007C117D /* Release */ = {
485 | isa = XCBuildConfiguration;
486 | buildSettings = {
487 | ALWAYS_SEARCH_USER_PATHS = NO;
488 | CLANG_ANALYZER_NONNULL = YES;
489 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
490 | CLANG_CXX_LIBRARY = "libc++";
491 | CLANG_ENABLE_MODULES = YES;
492 | CLANG_ENABLE_OBJC_ARC = YES;
493 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
494 | CLANG_WARN_BOOL_CONVERSION = YES;
495 | CLANG_WARN_COMMA = YES;
496 | CLANG_WARN_CONSTANT_CONVERSION = YES;
497 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
498 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
499 | CLANG_WARN_EMPTY_BODY = YES;
500 | CLANG_WARN_ENUM_CONVERSION = YES;
501 | CLANG_WARN_INFINITE_RECURSION = YES;
502 | CLANG_WARN_INT_CONVERSION = YES;
503 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
504 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
505 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
506 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
507 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
508 | CLANG_WARN_STRICT_PROTOTYPES = YES;
509 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
510 | CLANG_WARN_UNREACHABLE_CODE = YES;
511 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
512 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
513 | COPY_PHASE_STRIP = NO;
514 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
515 | ENABLE_NS_ASSERTIONS = NO;
516 | ENABLE_STRICT_OBJC_MSGSEND = YES;
517 | GCC_C_LANGUAGE_STANDARD = gnu99;
518 | GCC_NO_COMMON_BLOCKS = YES;
519 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
520 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
521 | GCC_WARN_UNDECLARED_SELECTOR = YES;
522 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
523 | GCC_WARN_UNUSED_FUNCTION = YES;
524 | GCC_WARN_UNUSED_VARIABLE = YES;
525 | IPHONEOS_DEPLOYMENT_TARGET = 11.0;
526 | MTL_ENABLE_DEBUG_INFO = NO;
527 | SDKROOT = iphoneos;
528 | SUPPORTED_PLATFORMS = iphoneos;
529 | SWIFT_COMPILATION_MODE = wholemodule;
530 | SWIFT_OPTIMIZATION_LEVEL = "-O";
531 | TARGETED_DEVICE_FAMILY = "1,2";
532 | VALIDATE_PRODUCT = YES;
533 | };
534 | name = Release;
535 | };
536 | 97C147061CF9000F007C117D /* Debug */ = {
537 | isa = XCBuildConfiguration;
538 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
539 | buildSettings = {
540 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
541 | CLANG_ENABLE_MODULES = YES;
542 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
543 | DEVELOPMENT_TEAM = MQT2MSRHJG;
544 | ENABLE_BITCODE = NO;
545 | INFOPLIST_FILE = Runner/Info.plist;
546 | LD_RUNPATH_SEARCH_PATHS = (
547 | "$(inherited)",
548 | "@executable_path/Frameworks",
549 | );
550 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterInteractiveShaderDemo;
551 | PRODUCT_NAME = "$(TARGET_NAME)";
552 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
553 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
554 | SWIFT_VERSION = 5.0;
555 | VERSIONING_SYSTEM = "apple-generic";
556 | };
557 | name = Debug;
558 | };
559 | 97C147071CF9000F007C117D /* Release */ = {
560 | isa = XCBuildConfiguration;
561 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
562 | buildSettings = {
563 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
564 | CLANG_ENABLE_MODULES = YES;
565 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
566 | DEVELOPMENT_TEAM = MQT2MSRHJG;
567 | ENABLE_BITCODE = NO;
568 | INFOPLIST_FILE = Runner/Info.plist;
569 | LD_RUNPATH_SEARCH_PATHS = (
570 | "$(inherited)",
571 | "@executable_path/Frameworks",
572 | );
573 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterInteractiveShaderDemo;
574 | PRODUCT_NAME = "$(TARGET_NAME)";
575 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
576 | SWIFT_VERSION = 5.0;
577 | VERSIONING_SYSTEM = "apple-generic";
578 | };
579 | name = Release;
580 | };
581 | /* End XCBuildConfiguration section */
582 |
583 | /* Begin XCConfigurationList section */
584 | 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
585 | isa = XCConfigurationList;
586 | buildConfigurations = (
587 | 331C8088294A63A400263BE5 /* Debug */,
588 | 331C8089294A63A400263BE5 /* Release */,
589 | 331C808A294A63A400263BE5 /* Profile */,
590 | );
591 | defaultConfigurationIsVisible = 0;
592 | defaultConfigurationName = Release;
593 | };
594 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
595 | isa = XCConfigurationList;
596 | buildConfigurations = (
597 | 97C147031CF9000F007C117D /* Debug */,
598 | 97C147041CF9000F007C117D /* Release */,
599 | 249021D3217E4FDB00AE95B9 /* Profile */,
600 | );
601 | defaultConfigurationIsVisible = 0;
602 | defaultConfigurationName = Release;
603 | };
604 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
605 | isa = XCConfigurationList;
606 | buildConfigurations = (
607 | 97C147061CF9000F007C117D /* Debug */,
608 | 97C147071CF9000F007C117D /* Release */,
609 | 249021D4217E4FDB00AE95B9 /* Profile */,
610 | );
611 | defaultConfigurationIsVisible = 0;
612 | defaultConfigurationName = Release;
613 | };
614 | /* End XCConfigurationList section */
615 | };
616 | rootObject = 97C146E61CF9000F007C117D /* Project object */;
617 | }
618 |
--------------------------------------------------------------------------------