1*890232f2SAndroid Build Coastguard Worker/* 2*890232f2SAndroid Build Coastguard Worker * Copyright 2018 Dan Field. All rights reserved. 3*890232f2SAndroid Build Coastguard Worker * 4*890232f2SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*890232f2SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*890232f2SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*890232f2SAndroid Build Coastguard Worker * 8*890232f2SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*890232f2SAndroid Build Coastguard Worker * 10*890232f2SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*890232f2SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*890232f2SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*890232f2SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*890232f2SAndroid Build Coastguard Worker * limitations under the License. 15*890232f2SAndroid Build Coastguard Worker */ 16*890232f2SAndroid Build Coastguard Worker 17*890232f2SAndroid Build Coastguard Workerimport 'package:flat_buffers/flat_buffers.dart' as fb; 18*890232f2SAndroid Build Coastguard Workerimport './monster_my_game.sample_generated.dart' as my_game; 19*890232f2SAndroid Build Coastguard Worker 20*890232f2SAndroid Build Coastguard Worker// Example how to use FlatBuffers to create and read binary buffers. 21*890232f2SAndroid Build Coastguard Worker 22*890232f2SAndroid Build Coastguard Workervoid main() { 23*890232f2SAndroid Build Coastguard Worker builderTest(); 24*890232f2SAndroid Build Coastguard Worker objectBuilderTest(); 25*890232f2SAndroid Build Coastguard Worker} 26*890232f2SAndroid Build Coastguard Worker 27*890232f2SAndroid Build Coastguard Workervoid builderTest() { 28*890232f2SAndroid Build Coastguard Worker final builder = fb.Builder(initialSize: 1024); 29*890232f2SAndroid Build Coastguard Worker final int? weaponOneName = builder.writeString("Sword"); 30*890232f2SAndroid Build Coastguard Worker final int weaponOneDamage = 3; 31*890232f2SAndroid Build Coastguard Worker 32*890232f2SAndroid Build Coastguard Worker final int? weaponTwoName = builder.writeString("Axe"); 33*890232f2SAndroid Build Coastguard Worker final int weaponTwoDamage = 5; 34*890232f2SAndroid Build Coastguard Worker 35*890232f2SAndroid Build Coastguard Worker final swordBuilder = my_game.WeaponBuilder(builder) 36*890232f2SAndroid Build Coastguard Worker ..begin() 37*890232f2SAndroid Build Coastguard Worker ..addNameOffset(weaponOneName) 38*890232f2SAndroid Build Coastguard Worker ..addDamage(weaponOneDamage); 39*890232f2SAndroid Build Coastguard Worker final int sword = swordBuilder.finish(); 40*890232f2SAndroid Build Coastguard Worker 41*890232f2SAndroid Build Coastguard Worker final axeBuilder = my_game.WeaponBuilder(builder) 42*890232f2SAndroid Build Coastguard Worker ..begin() 43*890232f2SAndroid Build Coastguard Worker ..addNameOffset(weaponTwoName) 44*890232f2SAndroid Build Coastguard Worker ..addDamage(weaponTwoDamage); 45*890232f2SAndroid Build Coastguard Worker final int axe = axeBuilder.finish(); 46*890232f2SAndroid Build Coastguard Worker 47*890232f2SAndroid Build Coastguard Worker // Serialize a name for our monster, called "Orc". 48*890232f2SAndroid Build Coastguard Worker final int? name = builder.writeString('Orc'); 49*890232f2SAndroid Build Coastguard Worker 50*890232f2SAndroid Build Coastguard Worker // Create a list representing the inventory of the Orc. Each number 51*890232f2SAndroid Build Coastguard Worker // could correspond to an item that can be claimed after he is slain. 52*890232f2SAndroid Build Coastguard Worker final List<int> treasure = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; 53*890232f2SAndroid Build Coastguard Worker final inventory = builder.writeListUint8(treasure); 54*890232f2SAndroid Build Coastguard Worker final weapons = builder.writeList([sword, axe]); 55*890232f2SAndroid Build Coastguard Worker 56*890232f2SAndroid Build Coastguard Worker // Struct builders are very easy to reuse. 57*890232f2SAndroid Build Coastguard Worker final vec3Builder = my_game.Vec3Builder(builder); 58*890232f2SAndroid Build Coastguard Worker 59*890232f2SAndroid Build Coastguard Worker vec3Builder.finish(4.0, 5.0, 6.0); 60*890232f2SAndroid Build Coastguard Worker vec3Builder.finish(1.0, 2.0, 3.0); 61*890232f2SAndroid Build Coastguard Worker // Set his hit points to 300 and his mana to 150. 62*890232f2SAndroid Build Coastguard Worker final int hp = 300; 63*890232f2SAndroid Build Coastguard Worker final int mana = 150; 64*890232f2SAndroid Build Coastguard Worker 65*890232f2SAndroid Build Coastguard Worker final monster = my_game.MonsterBuilder(builder) 66*890232f2SAndroid Build Coastguard Worker ..begin() 67*890232f2SAndroid Build Coastguard Worker ..addNameOffset(name) 68*890232f2SAndroid Build Coastguard Worker ..addInventoryOffset(inventory) 69*890232f2SAndroid Build Coastguard Worker ..addWeaponsOffset(weapons) 70*890232f2SAndroid Build Coastguard Worker ..addEquippedType(my_game.EquipmentTypeId.Weapon) 71*890232f2SAndroid Build Coastguard Worker ..addEquippedOffset(axe) 72*890232f2SAndroid Build Coastguard Worker ..addHp(hp) 73*890232f2SAndroid Build Coastguard Worker ..addMana(mana) 74*890232f2SAndroid Build Coastguard Worker ..addPos(vec3Builder.finish(1.0, 2.0, 3.0)) 75*890232f2SAndroid Build Coastguard Worker ..addColor(my_game.Color.Red); 76*890232f2SAndroid Build Coastguard Worker 77*890232f2SAndroid Build Coastguard Worker final int monsteroff = monster.finish(); 78*890232f2SAndroid Build Coastguard Worker builder.finish(monsteroff); 79*890232f2SAndroid Build Coastguard Worker if (verify(builder.buffer)) { 80*890232f2SAndroid Build Coastguard Worker print( 81*890232f2SAndroid Build Coastguard Worker "The FlatBuffer was successfully created with a builder and verified!"); 82*890232f2SAndroid Build Coastguard Worker } 83*890232f2SAndroid Build Coastguard Worker} 84*890232f2SAndroid Build Coastguard Worker 85*890232f2SAndroid Build Coastguard Workervoid objectBuilderTest() { 86*890232f2SAndroid Build Coastguard Worker // Create the builder here so we can use it for both weapons and equipped 87*890232f2SAndroid Build Coastguard Worker // the actual data will only be written to the buffer once. 88*890232f2SAndroid Build Coastguard Worker var axe = my_game.WeaponObjectBuilder(name: 'Axe', damage: 5); 89*890232f2SAndroid Build Coastguard Worker 90*890232f2SAndroid Build Coastguard Worker var monsterBuilder = my_game.MonsterObjectBuilder( 91*890232f2SAndroid Build Coastguard Worker pos: my_game.Vec3ObjectBuilder(x: 1.0, y: 2.0, z: 3.0), 92*890232f2SAndroid Build Coastguard Worker mana: 150, 93*890232f2SAndroid Build Coastguard Worker hp: 300, 94*890232f2SAndroid Build Coastguard Worker name: 'Orc', 95*890232f2SAndroid Build Coastguard Worker inventory: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 96*890232f2SAndroid Build Coastguard Worker color: my_game.Color.Red, 97*890232f2SAndroid Build Coastguard Worker weapons: [my_game.WeaponObjectBuilder(name: 'Sword', damage: 3), axe], 98*890232f2SAndroid Build Coastguard Worker equippedType: my_game.EquipmentTypeId.Weapon, 99*890232f2SAndroid Build Coastguard Worker equipped: axe, 100*890232f2SAndroid Build Coastguard Worker ); 101*890232f2SAndroid Build Coastguard Worker 102*890232f2SAndroid Build Coastguard Worker var buffer = monsterBuilder.toBytes(); 103*890232f2SAndroid Build Coastguard Worker 104*890232f2SAndroid Build Coastguard Worker // We now have a FlatBuffer we can store on disk or send over a network. 105*890232f2SAndroid Build Coastguard Worker 106*890232f2SAndroid Build Coastguard Worker // ** file/network code goes here :) ** 107*890232f2SAndroid Build Coastguard Worker 108*890232f2SAndroid Build Coastguard Worker // Instead, we're going to access it right away (as if we just received it). 109*890232f2SAndroid Build Coastguard Worker if (verify(buffer)) { 110*890232f2SAndroid Build Coastguard Worker print( 111*890232f2SAndroid Build Coastguard Worker "The FlatBuffer was successfully created with an object builder and verified!"); 112*890232f2SAndroid Build Coastguard Worker } 113*890232f2SAndroid Build Coastguard Worker} 114*890232f2SAndroid Build Coastguard Worker 115*890232f2SAndroid Build Coastguard Workerbool verify(List<int> buffer) { 116*890232f2SAndroid Build Coastguard Worker // Get access to the root: 117*890232f2SAndroid Build Coastguard Worker var monster = my_game.Monster(buffer); 118*890232f2SAndroid Build Coastguard Worker 119*890232f2SAndroid Build Coastguard Worker // Get and test some scalar types from the FlatBuffer. 120*890232f2SAndroid Build Coastguard Worker assert(monster.hp == 80); 121*890232f2SAndroid Build Coastguard Worker assert(monster.mana == 150); // default 122*890232f2SAndroid Build Coastguard Worker assert(monster.name == "MyMonster"); 123*890232f2SAndroid Build Coastguard Worker 124*890232f2SAndroid Build Coastguard Worker // Get and test a field of the FlatBuffer's `struct`. 125*890232f2SAndroid Build Coastguard Worker var pos = monster.pos!; 126*890232f2SAndroid Build Coastguard Worker assert(pos.z == 3.0); 127*890232f2SAndroid Build Coastguard Worker 128*890232f2SAndroid Build Coastguard Worker // Get a test an element from the `inventory` FlatBuffer's `vector`. 129*890232f2SAndroid Build Coastguard Worker var inv = monster.inventory!; 130*890232f2SAndroid Build Coastguard Worker assert(inv.length == 10); 131*890232f2SAndroid Build Coastguard Worker assert(inv[9] == 9); 132*890232f2SAndroid Build Coastguard Worker 133*890232f2SAndroid Build Coastguard Worker // Get and test the `weapons` FlatBuffers's `vector`. 134*890232f2SAndroid Build Coastguard Worker var expectedWeaponNames = ["Sword", "Axe"]; 135*890232f2SAndroid Build Coastguard Worker var expectedWeaponDamages = [3, 5]; 136*890232f2SAndroid Build Coastguard Worker var weps = monster.weapons!; 137*890232f2SAndroid Build Coastguard Worker for (int i = 0; i < weps.length; i++) { 138*890232f2SAndroid Build Coastguard Worker assert(weps[i].name == expectedWeaponNames[i]); 139*890232f2SAndroid Build Coastguard Worker assert(weps[i].damage == expectedWeaponDamages[i]); 140*890232f2SAndroid Build Coastguard Worker } 141*890232f2SAndroid Build Coastguard Worker 142*890232f2SAndroid Build Coastguard Worker // Get and test the `Equipment` union (`equipped` field). 143*890232f2SAndroid Build Coastguard Worker assert(monster.equippedType!.value == my_game.EquipmentTypeId.Weapon.value); 144*890232f2SAndroid Build Coastguard Worker assert(monster.equippedType == my_game.EquipmentTypeId.Weapon); 145*890232f2SAndroid Build Coastguard Worker 146*890232f2SAndroid Build Coastguard Worker assert(monster.equipped is my_game.Weapon); 147*890232f2SAndroid Build Coastguard Worker var equipped = monster.equipped as my_game.Weapon; 148*890232f2SAndroid Build Coastguard Worker assert(equipped.name == "Axe"); 149*890232f2SAndroid Build Coastguard Worker assert(equipped.damage == 5); 150*890232f2SAndroid Build Coastguard Worker 151*890232f2SAndroid Build Coastguard Worker print(monster); 152*890232f2SAndroid Build Coastguard Worker return true; 153*890232f2SAndroid Build Coastguard Worker} 154